From: Henry P. <ne...@us...> - 2006-11-30 21:09:17
|
Update of /cvsroot/jfreechart/jfreechart/swt/org/jfree/experimental/chart/swt In directory sc8-pr-cvs6.sourceforge.net:/tmp/cvs-serv6127/swt/org/jfree/experimental/chart/swt Modified Files: Tag: STABLE_1-0-0 ChartComposite.java Log Message: improved zoom box handling (got rid of Tracker and draw directly the rectangle on the canvas). Index: ChartComposite.java =================================================================== RCS file: /cvsroot/jfreechart/jfreechart/swt/org/jfree/experimental/chart/swt/Attic/ChartComposite.java,v retrieving revision 1.1.2.4 retrieving revision 1.1.2.5 diff -C2 -d -r1.1.2.4 -r1.1.2.5 *** ChartComposite.java 28 Nov 2006 14:58:09 -0000 1.1.2.4 --- ChartComposite.java 30 Nov 2006 21:09:12 -0000 1.1.2.5 *************** *** 37,41 **** * 19-Jun-2006 : New class (HP); * 06-Nov-2006 : Added accessor methods for zoomInFactor and zoomOutFactor (DG); ! * */ --- 37,42 ---- * 19-Jun-2006 : New class (HP); * 06-Nov-2006 : Added accessor methods for zoomInFactor and zoomOutFactor (DG); ! * 28-Nov-2006 : Added support for trace lines (HP); ! * 30-Nov-2006 : Improved zoom box handling (HP); */ *************** *** 72,76 **** import org.eclipse.swt.widgets.MenuItem; import org.eclipse.swt.widgets.MessageBox; - import org.eclipse.swt.widgets.Tracker; import org.jfree.chart.ChartMouseEvent; import org.jfree.chart.ChartMouseListener; --- 73,76 ---- *************** *** 91,94 **** --- 91,95 ---- import org.jfree.experimental.chart.swt.editor.SWTChartEditor; import org.jfree.experimental.swt.SWTGraphics2D; + import org.jfree.experimental.swt.SWTUtils; /** *************** *** 241,251 **** * been scaled up or down to fit the panel). */ ! private Point zoomPoint = null; /** The zoom rectangle (selected by the user with the mouse). */ ! private transient Rectangle2D zoomRectangle = null; /** Controls if the zoom rectangle is drawn as an outline or filled. */ ! //TODO private boolean fillZoomRectangle = false; /** The minimum distance required to drag the mouse to trigger a zoom. */ --- 242,252 ---- * been scaled up or down to fit the panel). */ ! private org.eclipse.swt.graphics.Point zoomPoint = null; /** The zoom rectangle (selected by the user with the mouse). */ ! private transient Rectangle zoomRectangle = null; /** Controls if the zoom rectangle is drawn as an outline or filled. */ ! //TODO private boolean fillZoomRectangle = true; /** The minimum distance required to drag the mouse to trigger a zoom. */ *************** *** 253,260 **** /** A flag that controls whether or not horizontal tracing is enabled. */ ! private boolean horizontalAxisTrace = true; /** A flag that controls whether or not vertical tracing is enabled. */ ! private boolean verticalAxisTrace = true; /** A vertical trace line. */ --- 254,261 ---- /** A flag that controls whether or not horizontal tracing is enabled. */ ! private boolean horizontalAxisTrace = false; /** A flag that controls whether or not vertical tracing is enabled. */ ! private boolean verticalAxisTrace = false; /** A vertical trace line. */ *************** *** 562,578 **** getBounds().width, getBounds().height), info); } ! //TODO Rectangle area = SWTUtils.toSWTRectangle(getScreenDataArea()); ! Rectangle2D area = getScreenDataArea(); //TODO see if we need to apply some line color and style for the cross hair ! if (verticalAxisTrace && area.getMinX() < verticalTraceLineX ! && area.getMaxX() > verticalTraceLineX) ! sg2.drawLine(verticalTraceLineX, (int) Math.round(area.getMinY()), ! verticalTraceLineX, (int) Math.round(area.getMaxY())); ! if (horizontalAxisTrace && area.getMinY() < horizontalTraceLineY ! && area.getMaxY() > horizontalTraceLineY) ! sg2.drawLine((int) Math.round(area.getMinX()), horizontalTraceLineY, ! (int) Math.round(area.getMaxX()), horizontalTraceLineY); verticalTraceLineX = 0; horizontalTraceLineY = 0; } } ); --- 563,577 ---- getBounds().width, getBounds().height), info); } ! Rectangle area = getScreenDataArea(); //TODO see if we need to apply some line color and style for the cross hair ! if (verticalAxisTrace && area.x < verticalTraceLineX ! && area.width > verticalTraceLineX) ! e.gc.drawLine(verticalTraceLineX, area.y, verticalTraceLineX, area.height); ! if (horizontalAxisTrace && area.y < horizontalTraceLineY ! && area.height > horizontalTraceLineY) ! e.gc.drawLine(area.x, horizontalTraceLineY, area.width, horizontalTraceLineY); verticalTraceLineX = 0; horizontalTraceLineY = 0; + if (zoomRectangle != null) e.gc.drawRectangle(zoomRectangle); } } ); *************** *** 600,604 **** switch (event.type) { case SWT.MouseDown: ! zoomPoint = new Point(event.x, event.y); Rectangle insets = getClientArea(); int x = (int) ((event.x - insets.x) / scaleX); --- 599,604 ---- switch (event.type) { case SWT.MouseDown: ! Rectangle scaledDataArea = getScreenDataArea(event.x, event.y); ! zoomPoint = getPointInRectangle(event.x, event.y, scaledDataArea); Rectangle insets = getClientArea(); int x = (int) ((event.x - insets.x) / scaleX); *************** *** 642,652 **** return; } ! Tracker tracker = new Tracker(canvas, SWT.RESIZE); ! Rectangle rect = new Rectangle(zoomPoint.x, ! zoomPoint.y, zoomPoint.x - event.x, zoomPoint.y ! - event.y); ! tracker.setRectangles(new Rectangle [] {rect}); ! tracker.open(); ! Rectangle trect = tracker.getRectangles()[0]; // handle zoom boolean hZoom = false; --- 642,648 ---- return; } ! scaledDataArea = getScreenDataArea(zoomPoint.x, zoomPoint.y); ! org.eclipse.swt.graphics.Point movingPoint ! = getPointInRectangle(event.x, event.y, scaledDataArea); // handle zoom boolean hZoom = false; *************** *** 660,702 **** vZoom = rangeZoomable; } - Rectangle2D scaledDataArea = getScreenDataArea( - zoomPoint.x, zoomPoint.y); if (hZoom && vZoom) { ! // selected rectangle shouldn't extend outside the ! // data area... ! //double wmax = Math.min(w, ! // scaledDataArea.getMaxX() - zoomPoint.x); ! //double hmax = Math.min(h, ! // scaledDataArea.getMaxY() - zoomPoint.y); ! zoomRectangle = new Rectangle2D.Double(trect.x, ! trect.y, trect.width, trect.height); ! Rectangle2D.intersect(zoomRectangle, ! scaledDataArea, zoomRectangle); } else if (hZoom) { ! zoomRectangle = new Rectangle2D.Double( ! trect.x, scaledDataArea.getMinY(), ! trect.width, scaledDataArea.getHeight()); ! Rectangle2D.intersect(zoomRectangle, scaledDataArea, ! zoomRectangle); } else if (vZoom) { ! zoomRectangle = new Rectangle2D.Double( ! scaledDataArea.getMinX(), trect.y, ! scaledDataArea.getWidth(), trect.height); ! Rectangle2D.intersect(zoomRectangle, ! scaledDataArea, zoomRectangle); } ! // no break here cause we want to catch mouse up event case SWT.MouseUp: if (zoomRectangle == null) { ! Rectangle2D screenDataArea ! = getScreenDataArea(event.x, event.y); if (screenDataArea != null) { ! zoomPoint = getPointInRectangle( ! event.x, event.y, screenDataArea); } if (popup != null && event.button == 3) { --- 656,683 ---- vZoom = rangeZoomable; } if (hZoom && vZoom) { ! // selected rectangle shouldn't extend outside the data area... ! zoomRectangle = new Rectangle(zoomPoint.x, zoomPoint.y, ! movingPoint.x - zoomPoint.x, movingPoint.y - zoomPoint.y); } else if (hZoom) { ! zoomRectangle = new Rectangle(zoomPoint.x, scaledDataArea.y, ! movingPoint.x - zoomPoint.x, scaledDataArea.height); } else if (vZoom) { ! zoomRectangle = new Rectangle( ! scaledDataArea.x, zoomPoint.y, ! scaledDataArea.width, event.y - zoomPoint.y); } ! canvas.redraw(); ! break; case SWT.MouseUp: if (zoomRectangle == null) { ! Rectangle screenDataArea = getScreenDataArea(event.x, event.y); if (screenDataArea != null) { ! zoomPoint = getPointInRectangle(event.x, event.y, screenDataArea); } if (popup != null && event.button == 3) { *************** *** 723,737 **** } boolean zoomTrigger1 = hZoom ! && zoomRectangle.getWidth() >= zoomTriggerDistance; boolean zoomTrigger2 = vZoom ! && zoomRectangle.getHeight() >= zoomTriggerDistance; if (zoomTrigger1 || zoomTrigger2) { // if the box has been drawn backwards, restore the auto bounds ! if ((hZoom && (zoomRectangle.getX() ! < zoomPoint.x)) ! || (vZoom && (zoomRectangle.getY() ! < zoomPoint.y))) restoreAutoBounds(); else zoom(zoomRectangle); --- 704,716 ---- } boolean zoomTrigger1 = hZoom ! && Math.abs(zoomRectangle.width) >= zoomTriggerDistance; boolean zoomTrigger2 = vZoom ! && Math.abs(zoomRectangle.height) >= zoomTriggerDistance; if (zoomTrigger1 || zoomTrigger2) { // if the box has been drawn backwards, restore the auto bounds ! if ((hZoom && (zoomRectangle.x + zoomRectangle.width < zoomPoint.x)) ! || (vZoom && (zoomRectangle.y + zoomRectangle.height < zoomPoint.y))) restoreAutoBounds(); else zoom(zoomRectangle); *************** *** 742,745 **** --- 721,727 ---- zoomRectangle = null; break; + default: + zoomPoint = null; + zoomRectangle = null; } } *************** *** 751,755 **** this.enforceFileExtensions = true; } ! /** * Returns the X scale factor for the chart. This will be 1.0 if no --- 733,737 ---- this.enforceFileExtensions = true; } ! /** * Returns the X scale factor for the chart. This will be 1.0 if no *************** *** 944,953 **** * @return A point within the rectangle. */ ! private Point getPointInRectangle(int x, int y, Rectangle2D area) { ! x = (int) Math.max(Math.ceil(area.getMinX()), Math.min(x, ! Math.floor(area.getMaxX()))); ! y = (int) Math.max(Math.ceil(area.getMinY()), Math.min(y, ! Math.floor(area.getMaxY()))); ! return new Point(x, y); } --- 926,933 ---- * @return A point within the rectangle. */ ! private org.eclipse.swt.graphics.Point getPointInRectangle(int x, int y, Rectangle area) { ! x = (int) Math.max(area.x, Math.min(x, area.x + area.width)); ! y = (int) Math.max(area.y, Math.min(y, area.y + area.height)); ! return new org.eclipse.swt.graphics.Point(x, y); } *************** *** 1048,1072 **** * @param selection the selected region. */ ! public void zoom(Rectangle2D selection) { // get the origin of the zoom selection in the Java2D space used for // drawing the chart (that is, before any scaling to fit the panel) ! Point2D selectOrigin = translateScreenToJava2D(new Point( ! (int) Math.ceil(selection.getX()), ! (int) Math.ceil(selection.getY()))); PlotRenderingInfo plotInfo = this.info.getPlotInfo(); ! Rectangle2D scaledDataArea = getScreenDataArea( ! (int) selection.getCenterX(), (int) selection.getCenterY()); ! if ((selection.getHeight() > 0) && (selection.getWidth() > 0)) { ! ! double hLower = (selection.getMinX() - scaledDataArea.getMinX()) ! / scaledDataArea.getWidth(); ! double hUpper = (selection.getMaxX() - scaledDataArea.getMinX()) ! / scaledDataArea.getWidth(); ! double vLower = (scaledDataArea.getMaxY() - selection.getMaxY()) ! / scaledDataArea.getHeight(); ! double vUpper = (scaledDataArea.getMaxY() - selection.getMinY()) ! / scaledDataArea.getHeight(); Plot p = this.chart.getPlot(); if (p instanceof Zoomable) { --- 1028,1052 ---- * @param selection the selected region. */ ! public void zoom(Rectangle selection) { // get the origin of the zoom selection in the Java2D space used for // drawing the chart (that is, before any scaling to fit the panel) ! Point2D selectOrigin = translateScreenToJava2D( ! new Point(selection.x, selection.y)); ! System.out.println(selectOrigin); PlotRenderingInfo plotInfo = this.info.getPlotInfo(); ! Rectangle scaledDataArea = getScreenDataArea( ! (int) (selection.x + selection.width)/2, ! (int) (selection.y + selection.height)/2); ! if ((selection.height > 0) && (selection.width > 0)) { + double hLower = (selection.x - scaledDataArea.x) + / (double) scaledDataArea.width; + double hUpper = (selection.x + selection.width - scaledDataArea.x) + / (double) scaledDataArea.width; + double vLower = (scaledDataArea.y + scaledDataArea.height - selection.y - selection.height) + / (double) scaledDataArea.height; + double vUpper = (scaledDataArea.y + scaledDataArea.height - selection.y) + / (double) scaledDataArea.height; Plot p = this.chart.getPlot(); if (p instanceof Zoomable) { *************** *** 1141,1145 **** { Zoomable z = (Zoomable) p; ! z.zoomDomainAxes(0.0, this.info.getPlotInfo(), this.zoomPoint); } } --- 1121,1125 ---- { Zoomable z = (Zoomable) p; ! z.zoomDomainAxes(0.0, this.info.getPlotInfo(), SWTUtils.toAwtPoint(this.zoomPoint)); } } *************** *** 1153,1157 **** { Zoomable z = (Zoomable) p; ! z.zoomRangeAxes(0.0, this.info.getPlotInfo(), this.zoomPoint); } } --- 1133,1137 ---- { Zoomable z = (Zoomable) p; ! z.zoomRangeAxes(0.0, this.info.getPlotInfo(), SWTUtils.toAwtPoint(this.zoomPoint)); } } *************** *** 1165,1175 **** * @return A new scaled rectangle. */ ! public Rectangle2D scale(Rectangle2D rect) { Rectangle insets = this.getClientArea(); ! double x = rect.getX() * getScaleX() + insets.x; ! double y = rect.getY() * this.getScaleY() + insets.y; ! double w = rect.getWidth() * this.getScaleX(); ! double h = rect.getHeight() * this.getScaleY(); ! return new Rectangle2D.Double(x, y, w, h); } --- 1145,1155 ---- * @return A new scaled rectangle. */ ! public Rectangle scale(Rectangle2D rect) { Rectangle insets = this.getClientArea(); ! int x = (int) Math.round(rect.getX() * getScaleX()) + insets.x; ! int y = (int) Math.round(rect.getY() * this.getScaleY()) + insets.y; ! int w = (int) Math.round(rect.getWidth() * this.getScaleX()); ! int h = (int) Math.round(rect.getHeight() * this.getScaleY()); ! return new Rectangle(x, y, w, h); } *************** *** 1180,1184 **** * @return The scaled data area. */ ! public Rectangle2D getScreenDataArea() { Rectangle2D dataArea = this.info.getPlotInfo().getDataArea(); Rectangle clientArea = this.getClientArea(); --- 1160,1164 ---- * @return The scaled data area. */ ! public Rectangle getScreenDataArea() { Rectangle2D dataArea = this.info.getPlotInfo().getDataArea(); Rectangle clientArea = this.getClientArea(); *************** *** 1187,1191 **** int w = (int) (dataArea.getWidth() * this.scaleX); int h = (int) (dataArea.getHeight() * this.scaleY); ! return new Rectangle2D.Double(x, y, w, h); } --- 1167,1171 ---- int w = (int) (dataArea.getWidth() * this.scaleX); int h = (int) (dataArea.getHeight() * this.scaleY); ! return new Rectangle(x, y, w, h); } *************** *** 1199,1205 **** * @return The scaled data area. */ ! public Rectangle2D getScreenDataArea(int x, int y) { PlotRenderingInfo plotInfo = this.info.getPlotInfo(); ! Rectangle2D result; if (plotInfo.getSubplotCount() == 0) result = getScreenDataArea(); --- 1179,1185 ---- * @return The scaled data area. */ ! public Rectangle getScreenDataArea(int x, int y) { PlotRenderingInfo plotInfo = this.info.getPlotInfo(); ! Rectangle result; if (plotInfo.getSubplotCount() == 0) result = getScreenDataArea(); |