-\r
- @SuppressWarnings("unused")\r
- private IEventHandler[] sort(IEventHandler[] sort) {\r
- if (DEBUG_HANDLER_SORT)\r
- debug("copy sort " + sort.length + " handlers");\r
- return sortInplace(Arrays.copyOf(sort, sort.length));\r
- }\r
-\r
- private IEventHandler[] sortInplace(IEventHandler[] sort) {\r
- if (DEBUG_HANDLER_SORT)\r
- debug("in-place sort " + sort.length + " handlers");\r
- Arrays.sort(sort, COMPARATOR);\r
- return sort;\r
- }\r
-\r
- public void setRootPane(Component rootPane) {\r
- final DragSourceListener dsl = new DragSourceListener() {\r
- @Override\r
- public void dropActionChanged(DragSourceDragEvent dsde) {\r
- }\r
- @Override\r
- public void dragOver(DragSourceDragEvent dsde) {\r
- }\r
- @Override\r
- public void dragExit(DragSourceEvent dse) {\r
- }\r
- @Override\r
- public void dragEnter(DragSourceDragEvent dsde) {\r
- }\r
- @Override\r
- public void dragDropEnd(DragSourceDropEvent dsde) {\r
- }\r
- };\r
- DragGestureListener dgl = new DragGestureListener() {\r
- @Override\r
- public void dragGestureRecognized(DragGestureEvent dge) {\r
- InputEvent ie = dge.getTriggerEvent();\r
- if (ie instanceof java.awt.event.MouseEvent) {\r
- java.awt.event.MouseEvent e = (java.awt.event.MouseEvent) ie;\r
- Point2D controlPos = AWTMouseEventAdapter.getControlPosition(e);\r
- MouseDragBegin event = new MouseDragBegin(NodeEventHandler.this,\r
- e.getWhen(), 0,\r
- AWTMouseEventAdapter.getButtonStatus(e),\r
- AWTMouseEventAdapter.getStateMask(e),\r
- AWTMouseEventAdapter.getMouseButton(e),\r
- // TODO: fix canvas position if necessary\r
- new Point2D.Double(),\r
- controlPos,\r
- controlPos,\r
- AWTMouseEventAdapter.getScreenPosition(e));\r
-\r
- // Send MouseDragBegin to the scenegraph and see\r
- // if anyone sets event.transferable to start DnD.\r
- handleMouseDragBeginEvent(event, EventTypes.MouseDragBegin);\r
- if (event.transferable != null) {\r
- ds.startDrag(dge, null, event.transferable, dsl);\r
- if (DEBUG_EVENTS)\r
- debug("dragGestureRecognized: startDrag " + event.transferable);\r
- }\r
- }\r
- }\r
- };\r
- ds.createDefaultDragGestureRecognizer(\r
- rootPane,\r
- DnDConstants.ACTION_COPY_OR_MOVE | DnDConstants.ACTION_LINK,\r
- dgl);\r
- ds.addDragSourceListener(dsl);\r
- }\r
-
- public boolean mousePressed(MouseButtonPressedEvent event) {\r
- G2DFocusManager.INSTANCE.clearFocus();\r
- try {\r
-// Point op = event.getPoint();\r
-// for (MouseListener l : mouseListeners.getListeners()) {\r
-// MouseEvent e = (MouseEvent) NodeUtil.transformEvent(event,(IG2DNode) l);\r
-// l.mousePressed(e);\r
-// event.translatePoint((int)(op.getX()-event.getX()), (int)(op.getY()-event.getY()));\r
-// if (e.isConsumed())\r
-// break;\r
-// }\r
- return false;\r
- } finally {\r
- if (sg.getRootPane() != null) {\r
- if (G2DFocusManager.INSTANCE.getFocusOwner() == null) {\r
- sg.getRootPane().requestFocusInWindow();\r
- //sg.getRootPane().repaint(); //TODO : why repaint here? FocusOwner seems to be always null, so this causes unnecessary delays when interacting the canvas.\r
- }\r
- }\r
- }\r
- }\r
-\r
- private boolean handleEvent(Event e, IG2DNode focusNode, IEventHandler[] handlers) {\r
- int typeMask = EventTypes.toTypeMask(e);\r
- if (focusNode instanceof IEventHandler) {\r
- IEventHandler h = (IEventHandler) focusNode;\r
- if (eats(h.getEventMask(), typeMask)) {\r
- if (h.handleEvent(e))\r
- return true;\r
- }\r
- }\r
- for (IEventHandler l : handlers) {\r
- if (eats(l.getEventMask(), typeMask)) {\r
- if (l.handleEvent(e))\r
- return true;\r
- }\r
- }\r
- return false;\r
- }\r
-\r
- private boolean handleMouseEvent(MouseEvent e, int eventType) {\r
- IEventHandler[] sorted = sortedMouseListeners;\r
- if (sorted == null)\r
- sortedMouseListeners = sorted = sortInplace(mouseListeners.toArray(NONE));\r
- return handleEvent(e, sg.getFocusNode(), sorted);\r
- }\r
-\r
- private boolean handleMouseDragBeginEvent(MouseEvent e, int eventType) {\r
- IEventHandler[] sorted = sortedMouseDragBeginListeners;\r
- if (sorted == null)\r
- sortedMouseDragBeginListeners = sorted = sortInplace(mouseDragBeginListeners.toArray(NONE));\r
- // Give null for focusNode because we want to propagate\r
- // this event in scene tree pre-order only.\r
- return handleEvent(e, null, sorted);\r
- }\r
-\r
- private boolean handleFocusEvent(FocusEvent e) {\r
- IEventHandler[] sorted = sortedFocusListeners;\r
- if (sorted == null)\r
- sortedFocusListeners = sorted = sortInplace(focusListeners.toArray(NONE));\r
- return handleEvent(e, null, sorted);\r
- }\r
-\r
- private boolean handleTimeEvent(TimeEvent e) {\r
- IEventHandler[] sorted = sortedTimeListeners;\r
- if (sorted == null)\r
- sortedTimeListeners = sorted = sortInplace(timeListeners.toArray(NONE));\r
- return handleEvent(e, null, sorted);\r
- }\r
-\r
- private boolean handleCommandEvent(CommandEvent e) {\r
- IEventHandler[] sorted = sortedCommandListeners;\r
- if (sorted == null)\r
- sortedCommandListeners = sorted = sortInplace(commandListeners.toArray(NONE));\r
- return handleEvent(e, sg.getFocusNode(), sorted);\r
- }\r
-\r
- private boolean handleKeyEvent(KeyEvent e) {\r
- IEventHandler[] sorted = sortedKeyListeners;\r
- if (sorted == null)\r
- sortedKeyListeners = sorted = sortInplace(keyListeners.toArray(NONE));\r
- return handleEvent(e, sg.getFocusNode(), sorted);\r
- }\r
+
+ @SuppressWarnings("unused")
+ private IEventHandler[] sort(IEventHandler[] sort) {
+ if (DEBUG_HANDLER_SORT)
+ debug("copy sort " + sort.length + " handlers");
+ return sortInplace(Arrays.copyOf(sort, sort.length));
+ }
+
+ private IEventHandler[] sortInplace(IEventHandler[] sort) {
+ if (DEBUG_HANDLER_SORT)
+ debug("in-place sort " + sort.length + " handlers");
+ Arrays.sort(sort, COMPARATOR);
+ return sort;
+ }
+
+ public boolean mousePressed(MouseButtonPressedEvent event) {
+ G2DFocusManager.INSTANCE.clearFocus();
+ try {
+// Point op = event.getPoint();
+// for (MouseListener l : mouseListeners.getListeners()) {
+// MouseEvent e = (MouseEvent) NodeUtil.transformEvent(event,(IG2DNode) l);
+// l.mousePressed(e);
+// event.translatePoint((int)(op.getX()-event.getX()), (int)(op.getY()-event.getY()));
+// if (e.isConsumed())
+// break;
+// }
+ return false;
+ } finally {
+ if (sg.getRootPane() != null) {
+ if (G2DFocusManager.INSTANCE.getFocusOwner() == null) {
+ sg.getRootPane().requestFocusInWindow();
+ //sg.getRootPane().repaint(); //TODO : why repaint here? FocusOwner seems to be always null, so this causes unnecessary delays when interacting the canvas.
+ }
+ }
+ }
+ }
+
+ private boolean handleEvent(Event e, IG2DNode focusNode, IEventHandler[] handlers) {
+ int typeMask = EventTypes.toTypeMask(e);
+ if (focusNode instanceof IEventHandler) {
+ IEventHandler h = (IEventHandler) focusNode;
+ if (eats(h.getEventMask(), typeMask)) {
+ if (h.handleEvent(e))
+ return true;
+ }
+ }
+ for (IEventHandler l : handlers) {
+ if (eats(l.getEventMask(), typeMask)) {
+ if (l.handleEvent(e))
+ return true;
+ }
+ }
+ return false;
+ }
+
+ private boolean handleMouseEvent(MouseEvent e, int eventType) {
+ IEventHandler[] sorted = sortedMouseListeners;
+ if (sorted == null)
+ sortedMouseListeners = sorted = sortInplace(mouseListeners.toArray(NONE));
+ return handleEvent(e, sg.getFocusNode(), sorted);
+ }
+
+ private boolean handleMouseDragBeginEvent(MouseEvent e, int eventType) {
+ IEventHandler[] sorted = sortedMouseDragBeginListeners;
+ if (sorted == null)
+ sortedMouseDragBeginListeners = sorted = sortInplace(mouseDragBeginListeners.toArray(NONE));
+ // Give null for focusNode because we want to propagate
+ // this event in scene tree pre-order only.
+ return handleEvent(e, null, sorted);
+ }
+
+ private boolean handleFocusEvent(FocusEvent e) {
+ IEventHandler[] sorted = sortedFocusListeners;
+ if (sorted == null)
+ sortedFocusListeners = sorted = sortInplace(focusListeners.toArray(NONE));
+ return handleEvent(e, null, sorted);
+ }
+
+ private boolean handleTimeEvent(TimeEvent e) {
+ IEventHandler[] sorted = sortedTimeListeners;
+ if (sorted == null)
+ sortedTimeListeners = sorted = sortInplace(timeListeners.toArray(NONE));
+ return handleEvent(e, null, sorted);
+ }
+
+ private boolean handleCommandEvent(CommandEvent e) {
+ IEventHandler[] sorted = sortedCommandListeners;
+ if (sorted == null)
+ sortedCommandListeners = sorted = sortInplace(commandListeners.toArray(NONE));
+ return handleEvent(e, sg.getFocusNode(), sorted);
+ }
+
+ private boolean handleKeyEvent(KeyEvent e) {
+ IEventHandler[] sorted = sortedKeyListeners;
+ if (sorted == null)
+ sortedKeyListeners = sorted = sortInplace(keyListeners.toArray(NONE));
+ return handleEvent(e, sg.getFocusNode(), sorted);
+ }