📄 chartcomposite.java
字号:
autoRangeMenuItem.setMenu(autoRangeMenu); this.zoomResetBothMenuItem = new MenuItem(autoRangeMenu, SWT.PUSH); this.zoomResetBothMenuItem.setText(localizationResources.getString( "All_Axes")); this.zoomResetBothMenuItem.setData(ZOOM_RESET_BOTH_COMMAND); this.zoomResetBothMenuItem.addSelectionListener(this); new MenuItem(autoRangeMenu, SWT.SEPARATOR); this.zoomResetDomainMenuItem = new MenuItem(autoRangeMenu, SWT.PUSH); this.zoomResetDomainMenuItem.setText( localizationResources.getString("Domain_Axis")); this.zoomResetDomainMenuItem.setData(ZOOM_RESET_DOMAIN_COMMAND); this.zoomResetDomainMenuItem.addSelectionListener(this); this.zoomResetRangeMenuItem = new MenuItem(autoRangeMenu, SWT.PUSH); this.zoomResetRangeMenuItem.setText( localizationResources.getString("Range_Axis")); this.zoomResetRangeMenuItem.setData(ZOOM_RESET_RANGE_COMMAND); this.zoomResetRangeMenuItem.addSelectionListener(this); } return result; } /** * Handles action events generated by the popup menu. * * @see org.eclipse.swt.events.SelectionListener#widgetDefaultSelected( * org.eclipse.swt.events.SelectionEvent) */ public void widgetDefaultSelected(SelectionEvent e) { widgetSelected(e); } /** * Handles action events generated by the popup menu. * * @see org.eclipse.swt.events.SelectionListener#widgetSelected( * org.eclipse.swt.events.SelectionEvent) */ public void widgetSelected(SelectionEvent e) { String command = (String) ((MenuItem) e.getSource()).getData(); if (command.equals(PROPERTIES_COMMAND)) { attemptEditChartProperties(); } else if (command.equals(SAVE_COMMAND)) { try { doSaveAs(); } catch (IOException ex) { ex.printStackTrace(); } } else if (command.equals(PRINT_COMMAND)) { createChartPrintJob(); } /* in the next zoomPoint.x and y replace by e.x and y for now. * this helps to handle the mouse events and besides, * those values are unused AFAIK. */ else if (command.equals(ZOOM_IN_BOTH_COMMAND)) { zoomInBoth( e.x, e.y ); } else if (command.equals(ZOOM_IN_DOMAIN_COMMAND)) { zoomInDomain( e.x, e.y ); } else if (command.equals(ZOOM_IN_RANGE_COMMAND)) { zoomInRange( e.x, e.y ); } else if (command.equals(ZOOM_OUT_BOTH_COMMAND)) { zoomOutBoth( e.x, e.y ); } else if (command.equals(ZOOM_OUT_DOMAIN_COMMAND)) { zoomOutDomain( e.x, e.y ); } else if (command.equals(ZOOM_OUT_RANGE_COMMAND)) { zoomOutRange( e.x, e.y ); } else if (command.equals(ZOOM_RESET_BOTH_COMMAND)) { restoreAutoBounds(); } else if (command.equals(ZOOM_RESET_DOMAIN_COMMAND)) { restoreAutoDomainBounds(); } else if (command.equals(ZOOM_RESET_RANGE_COMMAND)) { restoreAutoRangeBounds(); } this.forceRedraw(); } public int print(Graphics graphics, PageFormat pageFormat, int pageIndex) throws PrinterException { if (pageIndex != 0) { return NO_SUCH_PAGE; } /* CairoImage image = new CairoImage( this.getBounds().width, this.getBounds().height ); Graphics2D g2 = image.createGraphics2D(); double x = pageFormat.getImageableX(); double y = pageFormat.getImageableY(); double w = pageFormat.getImageableWidth(); double h = pageFormat.getImageableHeight(); this.chart.draw( g2, new Rectangle2D.Double(x, y, w, h), this.anchor, null ); */ return PAGE_EXISTS; } /** * Hook an SWT listener on the canvas where the chart is drawn. * The purpose of this method is to allow some degree of customization. * @param listener The SWT listener to attach to the canvas. */ public void addSWTListener(SWTEventListener listener) { if (listener instanceof ControlListener) { this.canvas.addControlListener((ControlListener) listener); } else if (listener instanceof DisposeListener) { this.canvas.addDisposeListener((DisposeListener) listener);// } else if (listener instanceof DragDetectListener) {// this.canvas.addDragDetectListener((DragDetectListener) listener); } else if (listener instanceof FocusListener) { this.canvas.addFocusListener((FocusListener) listener); } else if (listener instanceof HelpListener) { this.canvas.addHelpListener((HelpListener) listener); } else if (listener instanceof KeyListener) { this.canvas.addKeyListener((KeyListener) listener);// } else if (listener instanceof MenuDetectListener) {// this.canvas.addMenuDetectListener((MenuDetectListener) listener); } else if (listener instanceof MouseListener) { this.canvas.addMouseListener((MouseListener) listener); } else if (listener instanceof MouseMoveListener) { this.canvas.addMouseMoveListener((MouseMoveListener) listener); } else if (listener instanceof MouseTrackListener) { this.canvas.addMouseTrackListener((MouseTrackListener) listener);// } else if (listener instanceof MouseWheelListener) {// this.canvas.addMouseWheelListener((MouseWheelListener) listener); } else if (listener instanceof PaintListener) { this.canvas.addPaintListener((PaintListener) listener); } else if (listener instanceof TraverseListener) { this.canvas.addTraverseListener((TraverseListener) listener); } } /* (non-Javadoc) * @see org.eclipse.swt.events.MouseListener#mouseDoubleClick( * org.eclipse.swt.events.MouseEvent) */ public void mouseDoubleClick(MouseEvent event) { // do nothing, override if necessary } /* (non-Javadoc) * @see org.eclipse.swt.events.MouseListener#mouseDown( * org.eclipse.swt.events.MouseEvent) */ public void mouseDown(MouseEvent event) { Rectangle scaledDataArea = getScreenDataArea(event.x, event.y); if (scaledDataArea == null) return; this.zoomPoint = getPointInRectangle(event.x, event.y, scaledDataArea); int x = (int) ((event.x - getClientArea().x) / this.scaleX); int y = (int) ((event.y - getClientArea().y) / this.scaleY); this.anchor = new Point2D.Double(x, y); this.chart.setNotify(true); // force a redraw this.canvas.redraw(); // new entity code ChartEntity entity = null; if (this.info != null) { EntityCollection entities = this.info.getEntityCollection(); if (entities != null) { entity = entities.getEntity(x, y); } } Object[] listeners = this.chartMouseListeners.getListeners( ChartMouseListener.class); if (listeners.length == 0) { return; } // pass mouse down event if some ChartMouseListener are listening java.awt.event.MouseEvent mouseEvent = SWTUtils.toAwtMouseEvent(event); ChartMouseEvent chartEvent = new ChartMouseEvent(getChart(), mouseEvent, entity); for (int i = listeners.length - 1; i >= 0; i -= 1) { ((ChartMouseListener) listeners[i]).chartMouseClicked(chartEvent); } } /* (non-Javadoc) * @see org.eclipse.swt.events.MouseListener#mouseUp( * org.eclipse.swt.events.MouseEvent) */ public void mouseUp(MouseEvent event) { boolean hZoom, vZoom; if (this.zoomRectangle == null) { Rectangle screenDataArea = getScreenDataArea(event.x, event.y); if (screenDataArea != null) { this.zoomPoint = getPointInRectangle(event.x, event.y, screenDataArea); } if (this.popup != null && event.button == 3) { org.eclipse.swt.graphics.Point pt = this.canvas.toDisplay( event.x, event.y); displayPopupMenu(pt.x, pt.y); } } else { hZoom = false; vZoom = false; if (this.orientation == PlotOrientation.HORIZONTAL) { hZoom = this.rangeZoomable; vZoom = this.domainZoomable; } else { hZoom = this.domainZoomable; vZoom = this.rangeZoomable; } boolean zoomTrigger1 = hZoom && Math.abs(this.zoomRectangle.width) >= this.zoomTriggerDistance; boolean zoomTrigger2 = vZoom && Math.abs(this.zoomRectangle.height) >= this.zoomTriggerDistance; if (zoomTrigger1 || zoomTrigger2) { // if the box has been drawn backwards, restore the auto bounds if ((hZoom && (this.zoomRectangle.x + this.zoomRectangle.width < this.zoomPoint.x)) || (vZoom && (this.zoomRectangle.y + this.zoomRectangle.height < this.zoomPoint.y))) restoreAutoBounds(); else { zoom(this.zoomRectangle); } this.canvas.redraw(); } } this.zoomPoint = null; this.zoomRectangle = null; } /* (non-Javadoc) * @see org.eclipse.swt.events.MouseMoveListener#mouseMove( * org.eclipse.swt.events.MouseEvent) */ public void mouseMove(MouseEvent event) { // handle axis trace if (this.horizontalAxisTrace || this.verticalAxisTrace) { this.horizontalTraceLineY = event.y; this.verticalTraceLineX = event.x; this.canvas.redraw(); } // handle tool tips in a simple way if (this.displayToolTips) { String s = getToolTipText(event); if (s == null && this.canvas.getToolTipText() != null || s!=null && !s.equals(this.canvas.getToolTipText())) this.canvas.setToolTipText(s); } // handle zoom box boolean hZoom, vZoom; if (this.zoomPoint != null) { Rectangle scaledDataArea = getScreenDataArea(this.zoomPoint.x, this.zoomPoint.y); org.eclipse.swt.graphics.Point movingPoint = getPointInRectangle(event.x, event.y, scaledDataArea); if (this.orientation == PlotOrientation.HORIZONTAL) { hZoom = this.rangeZoomable; vZoom = this.domainZoomable; } else { hZoom = this.domainZoomable; vZoom = this.rangeZoomable; } if (hZoom && vZoom) { // selected rectangle shouldn't extend outside the data area... this.zoomRectangle = new Rectangle(this.zoomPoint.x, this.zoomPoint.y, movingPoint.x - this.zoomPoint.x, movingPoint.y - this.zoomPoint.y); } else if (hZoom) { this.zoomRectangle = new Rectangle(this.zoomPoint.x, scaledDataArea.y, movingPoint.x - this.zoomPoint.x, scaledDataArea.height); } else if (vZoom) { int ymax = Math.max(movingPoint.y, scaledDataArea.y); this.zoomRectangle = new Rectangle( scaledDataArea.x, this.zoomPoint.y, scaledDataArea.width, ymax - this.zoomPoint.y); } this.canvas.redraw(); } // new entity code ChartEntity entity = null; int x = (int) ((event.x - getClientArea().x) / this.scaleX); int y = (int) ((event.y - getClientArea().y) / this.scaleY); if (this.info != null) { EntityCollection entities = this.info.getEntityCollection(); if (entities != null) { entity = entities.getEntity(x, y); } } Object[] listeners = this.chartMouseListeners.getListeners( ChartMouseListener.class); if (listeners.length == 0) { return; } // pass mouse move event if some ChartMouseListener are listening java.awt.event.MouseEvent mouseEvent = SWTUtils.toAwtMouseEvent(event); ChartMouseEvent chartEvent = new ChartMouseEvent(getChart(), mouseEvent, entity); for (int i = listeners.length - 1; i >= 0; i -= 1) { ((ChartMouseListener) listeners[i]).chartMouseMoved(chartEvent); } } /* (non-Javadoc) * @see org.eclipse.swt.events.PaintListener#paintComponent( * org.eclipse.swt.events.PaintEvent) */ public void paintControl(PaintEvent e) { // first determine the size of the chart rendering area... // TODO workout insets for SWT Rectangle available = getBounds(); // skip if chart is null if (this.chart == null) { this.canvas.drawBackground(e.gc, available.x, available.y, available.width, available.height); return; } SWTGraphics2D sg2 = new SWTGraphics2D(e.gc); // work out if scaling is required... boolean scale = false; int drawWidth = available.width; int drawHeight = available.height; if ( drawWidth == 0.0 || drawHeight == 0.0 ) return; this.scaleX = 1.0; this.scaleY = 1.0; if (drawWidth < this.minimumDrawWidth) { this.scaleX = (double) drawWidth / this.minimumDrawWidth; dra
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -