- }\r
-\r
- @Override\r
- public boolean mouseWheelMoved(MouseWheelMovedEvent me) {\r
- if (navigationEnabled && zoomEnabled) {\r
- double scroll = Math.min(0.9, -me.wheelRotation / 20.0);\r
- double z = 1 - scroll;\r
- double dx = (me.controlPosition.getX() - transform.getTranslateX()) / transform.getScaleX();\r
- double dy = (me.controlPosition.getY() - transform.getTranslateY()) / transform.getScaleY();\r
- dx = dx * (1 - z);\r
- dy = dy * (1 - z);\r
- double limitedScale = limitScaleFactor(z);\r
- if (limitedScale != 1.0) {\r
- translate(dx, dy);\r
- scale(z, z);\r
- transformChanged();\r
- dropQuality();\r
- repaint();\r
- }\r
- }\r
- return false;\r
- }\r
-\r
- @Override\r
- public boolean mouseButtonPressed(MouseButtonPressedEvent e) {\r
- if (navigationEnabled) {\r
- if (isPanState(e)) {\r
- dragDelta = new Point2D.Double(e.controlPosition.getX(), e.controlPosition.getY());\r
- // TODO : why to repaint here? Mouse has not been dragged, so it is not necessary, an causes unnecessary delay in start of panning movement.\r
- //repaint();\r
- //return true; // hmm.. why?\r
- }\r
- }\r
- return false;\r
- }\r
-\r
- @Override\r
- public boolean mouseMoved(MouseMovedEvent e) {\r
- if (navigationEnabled && dragDelta != null) {\r
- if (isPanState(e)) {\r
- double x = (e.controlPosition.getX() - dragDelta.getX()) / transform.getScaleX();\r
- double y = (e.controlPosition.getY() - dragDelta.getY()) / transform.getScaleY();\r
- translate(x, y);\r
- transformChanged();\r
- dragDelta = new Point2D.Double(e.controlPosition.getX(), e.controlPosition.getY());\r
- dropQuality();\r
- repaint();\r
- return true;\r
- }\r
- }\r
- return false;\r
- }\r
-\r
- protected boolean isPanState(MouseEvent e) {\r
- boolean anyPanButton = e.hasAnyButton(MouseEvent.MIDDLE_MASK | MouseEvent.RIGHT_MASK);\r
- boolean middle = e.hasAnyButton(MouseEvent.MIDDLE_MASK);\r
- boolean shift = e.hasAnyModifier(MouseEvent.SHIFT_MASK);\r
- return middle || (anyPanButton && shift);\r
- }\r
-\r
- /**\r
- * Utility method for dropping the paint quality and scheduling repaint with good quality.\r
- * This can be used to speed up rendering while navigating.\r
- */\r
- private void dropQuality() {\r
- if (!dynamicQuality) return;\r
- //System.out.println("dropQuality: " + qualityPaint);\r
- if (pendingTask!=null) {\r
- //System.out.println("cancel quality task");\r
- pendingTask.cancel(false);\r
- pendingTask = null;\r
- }\r
- // Render with better quality soon.\r
- qualityPaint = false;\r
- scheduleRepaint();\r
- }\r
-\r
- private void scheduleRepaint() {\r
- //System.out.println("schedule quality improvement");\r
- Executable exe = new Executable(AWTThread.getThreadAccess(), new Runnable() {\r
- @Override\r
- public void run() {\r
- //System.out.println("run: " + qualityPaint);\r
- // we have waited for [delay], now its time to render with good quality\r
- // Render next time with good quality\r
- qualityPaint = true;\r
- repaint();\r
- }\r
- });\r
- // Render with good quality later\r
- pendingTask = ExecutorWorker.getInstance().timerExec(exe, REPAINT_DELAY);\r
- }\r
-\r
- @Override\r
- public int getEventMask() {\r
- return EventTypes.MouseMovedMask | EventTypes.MouseButtonPressedMask | EventTypes.MouseWheelMask;\r
- }\r
+ }
+
+ @Override
+ public boolean mouseWheelMoved(MouseWheelMovedEvent me) {
+ if (navigationEnabled && zoomEnabled) {
+ double scroll = Math.min(0.9, -me.wheelRotation / 20.0);
+ double z = 1 - scroll;
+ double dx = (me.controlPosition.getX() - transform.getTranslateX()) / transform.getScaleX();
+ double dy = (me.controlPosition.getY() - transform.getTranslateY()) / transform.getScaleY();
+ dx = dx * (1 - z);
+ dy = dy * (1 - z);
+ double limitedScale = limitScaleFactor(z);
+ if (limitedScale != 1.0) {
+ translate(dx, dy);
+ scale(z, z);
+ transformChanged();
+ dropQuality();
+ repaint();
+ }
+ }
+ return false;
+ }
+
+ @Override
+ public boolean mouseButtonPressed(MouseButtonPressedEvent e) {
+ if (navigationEnabled) {
+ if (isPanState(e)) {
+ dragDelta = new Point2D.Double(e.controlPosition.getX(), e.controlPosition.getY());
+ // TODO : why to repaint here? Mouse has not been dragged, so it is not necessary, an causes unnecessary delay in start of panning movement.
+ //repaint();
+ //return true; // hmm.. why?
+ }
+ }
+ return false;
+ }
+
+ @Override
+ public boolean mouseMoved(MouseMovedEvent e) {
+ if (navigationEnabled && dragDelta != null) {
+ if (isPanState(e)) {
+ double x = (e.controlPosition.getX() - dragDelta.getX()) / transform.getScaleX();
+ double y = (e.controlPosition.getY() - dragDelta.getY()) / transform.getScaleY();
+ translate(x, y);
+ transformChanged();
+ dragDelta = new Point2D.Double(e.controlPosition.getX(), e.controlPosition.getY());
+ dropQuality();
+ repaint();
+ return true;
+ }
+ }
+ return false;
+ }
+
+ protected boolean isPanState(MouseEvent e) {
+ boolean anyPanButton = e.hasAnyButton(MouseEvent.MIDDLE_MASK | MouseEvent.RIGHT_MASK);
+ boolean middle = e.hasAnyButton(MouseEvent.MIDDLE_MASK);
+ boolean shift = e.hasAnyModifier(MouseEvent.SHIFT_MASK);
+ return middle || (anyPanButton && shift);
+ }
+
+ /**
+ * Utility method for dropping the paint quality and scheduling repaint with good quality.
+ * This can be used to speed up rendering while navigating.
+ */
+ private void dropQuality() {
+ if (!dynamicQuality) return;
+ //System.out.println("dropQuality: " + qualityPaint);
+ if (pendingTask!=null) {
+ //System.out.println("cancel quality task");
+ pendingTask.cancel(false);
+ pendingTask = null;
+ }
+ // Render with better quality soon.
+ qualityPaint = false;
+ scheduleRepaint();
+ }
+
+ private void scheduleRepaint() {
+ //System.out.println("schedule quality improvement");
+ Executable exe = new Executable(AWTThread.getThreadAccess(), new Runnable() {
+ @Override
+ public void run() {
+ //System.out.println("run: " + qualityPaint);
+ // we have waited for [delay], now its time to render with good quality
+ // Render next time with good quality
+ qualityPaint = true;
+ repaint();
+ }
+ });
+ // Render with good quality later
+ pendingTask = ExecutorWorker.getInstance().timerExec(exe, REPAINT_DELAY);
+ }
+
+ @Override
+ public int getEventMask() {
+ return EventTypes.MouseMovedMask | EventTypes.MouseButtonPressedMask | EventTypes.MouseWheelMask;
+ }