Author: mes
Date: 2010-12-06 14:28:46 -0800 (Mon, 06 Dec 2010)
New Revision: 23101

Added:
   
core3/ding-presentation-impl/trunk/src/main/java/org/cytoscape/ding/impl/ButtonDelegator.java
Modified:
   
core3/ding-presentation-impl/trunk/src/main/java/org/cytoscape/ding/impl/InnerCanvas.java
Log:
further mouse handling refactoring

Added: 
core3/ding-presentation-impl/trunk/src/main/java/org/cytoscape/ding/impl/ButtonDelegator.java
===================================================================
--- 
core3/ding-presentation-impl/trunk/src/main/java/org/cytoscape/ding/impl/ButtonDelegator.java
                               (rev 0)
+++ 
core3/ding-presentation-impl/trunk/src/main/java/org/cytoscape/ding/impl/ButtonDelegator.java
       2010-12-06 22:28:46 UTC (rev 23101)
@@ -0,0 +1,121 @@
+/*
+ Copyright (c) 2010, The Cytoscape Consortium (www.cytoscape.org)
+
+ This library is free software; you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 2.1 of the License, or
+ any later version.
+
+ This library is distributed in the hope that it will be useful, but
+ WITHOUT ANY WARRANTY, WITHOUT EVEN THE IMPLIED WARRANTY OF
+ MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.  The software and
+ documentation provided hereunder is on an "as is" basis, and the
+ Institute for Systems Biology and the Whitehead Institute
+ have no obligations to provide maintenance, support,
+ updates, enhancements or modifications.  In no event shall the
+ Institute for Systems Biology and the Whitehead Institute
+ be liable to any party for direct, indirect, special,
+ incidental or consequential damages, including lost profits, arising
+ out of the use of this software and its documentation, even if the
+ Institute for Systems Biology and the Whitehead Institute
+ have been advised of the possibility of such damage.  See
+ the GNU Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this library; if not, write to the Free Software Foundation,
+ Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+*/
+package org.cytoscape.ding.impl;
+
+
+import java.awt.event.MouseEvent;
+
+/**
+ * The purpose of this class is to capture the button processing logic in a 
single
+ * place so that it can be used consistently for different mouse events. This
+ * class also captures the logic for converting one-button Mac MouseEvents 
into 
+ * expected method calls.  To handle a particular type of button click, just 
+ * extend this class and implement the method that best describes the click 
you're 
+ * interested in.
+ */
+class ButtonDelegator {
+
+       private static final String MAC_OS_ID = "mac";
+       private final boolean isMacPlatform;
+
+       ButtonDelegator() {
+               String os = System.getProperty("os.name");
+               isMacPlatform = os.regionMatches(true, 0, MAC_OS_ID, 0, 
MAC_OS_ID.length());
+       }
+
+       final void delegateMouseEvent(MouseEvent e) {
+               //System.out.println("delegating mouse event: " + 
getMouseEventString(e));
+               // single click or release (i.e. no clicks)
+               if ( e.getClickCount() <= 1 ) {
+                       if ( isLeftClick(e) ) {
+                               if ( e.isControlDown() ) {
+                                       singleLeftControlClick(e);
+                               } else {
+                                       singleLeftClick(e);
+                               }
+                       } else if ( isMiddleClick(e) ) {
+                               singleMiddleClick(e);
+                       } else if ( isRightClick(e) ) {
+                               singleRightClick(e);
+                       }
+               // double click
+               } else if ( e.getClickCount() == 2 ) {
+                       if ( isLeftClick(e) ) {
+                               doubleLeftClick(e);
+                       }
+               }
+       }
+
+       void singleLeftClick(MouseEvent e) {}; 
+       void singleLeftControlClick(MouseEvent e) {};
+       void singleMiddleClick(MouseEvent e) {};
+       void singleRightClick(MouseEvent e) {}; 
+       void doubleLeftClick(MouseEvent e) {}; 
+
+       private boolean isLeftClick(MouseEvent e) {
+               boolean b1 = (e.getButton() == MouseEvent.BUTTON1);
+               if ( isMacPlatform ) {
+                       return (!e.isMetaDown() && !e.isAltDown() && b1);
+               }
+               return b1;
+       }
+
+       private boolean isRightClick(MouseEvent e) {
+               boolean b3 = (e.getButton() == MouseEvent.BUTTON3); 
+               if ( !b3 && isMacPlatform ) {
+                       // meta - left click
+                       return (e.isMetaDown() && !e.isAltDown() && 
(e.getButton() == MouseEvent.BUTTON1));
+               }
+               return b3;
+       }
+
+       private boolean isMiddleClick(MouseEvent e) {
+               boolean b2 = (e.getButton() == MouseEvent.BUTTON2); 
+               if ( !b2 && isMacPlatform ) {
+                       // alt - left click
+                       return (!e.isMetaDown() && e.isAltDown() && 
(e.getButton() == MouseEvent.BUTTON1));
+               }
+               return b2;
+       }
+
+    private String getMouseEventString(MouseEvent e) {
+        return "button (x " + e.getClickCount() + "): " + e.getButton() + " ["
+        + (e.isControlDown() ? "ctrl " : "")
+        + (e.isShiftDown() ? "shft " : "")
+        + (e.isAltDown() ? "alt " : "")
+        + (e.isMetaDown() ? "meta " : "")
+        + (e.isAltGraphDown() ? "grph " : "")
+        + "{"
+        + MouseEvent.getMouseModifiersText(e.getModifiers())
+        + "}"
+        + (Integer.toBinaryString(e.getModifiers()) )
+        + " "
+        + (Integer.toBinaryString(e.getModifiersEx()) )
+        + "]";
+    }
+}

Modified: 
core3/ding-presentation-impl/trunk/src/main/java/org/cytoscape/ding/impl/InnerCanvas.java
===================================================================
--- 
core3/ding-presentation-impl/trunk/src/main/java/org/cytoscape/ding/impl/InnerCanvas.java
   2010-12-06 21:58:48 UTC (rev 23100)
+++ 
core3/ding-presentation-impl/trunk/src/main/java/org/cytoscape/ding/impl/InnerCanvas.java
   2010-12-06 22:28:46 UTC (rev 23101)
@@ -138,7 +138,9 @@
        private int m_lastYMousePos = 0;
        private boolean m_button1NodeDrag = false;
 
-       private final boolean isMacPlatform;
+       private final MousePressedDelegator mousePressedDelegator;
+       private final MouseReleasedDelegator mouseReleasedDelegator;
+       private final MouseDraggedDelegator mouseDraggedDelegator;
 
        InnerCanvas(Object lock, DGraphView view, UndoSupport undo) {
                super();
@@ -161,8 +163,9 @@
                dropTarget = new DropTarget(this, DnDConstants.ACTION_COPY, 
this); 
                popup = new PopupMenuHelper(m_view, this);
 
-               String os = System.getProperty("os.name");
-               isMacPlatform = os.regionMatches(true, 0, MAC_OS_ID, 0, 
MAC_OS_ID.length());
+               mousePressedDelegator = new MousePressedDelegator();
+               mouseReleasedDelegator = new MouseReleasedDelegator();
+               mouseDraggedDelegator = new MouseDraggedDelegator();
        }
 
        /**
@@ -302,30 +305,8 @@
        // MouseMotionListener
        //
 
-       private String getMouseEventString(MouseEvent e) {
-               return "MouseEvent: button (x " + e.getClickCount() + "): " + 
e.getButton() + " [" 
-               + (e.isControlDown() ? "ctrl " : "")
-               + (e.isShiftDown() ? "shft " : "")
-               + (e.isAltDown() ? "alt " : "")
-               + (e.isMetaDown() ? "meta " : "")
-               + (e.isAltGraphDown() ? "grph " : "")
-               + "{"
-               + MouseEvent.getMouseModifiersText(e.getModifiers())
-               + "}"
-               + (Integer.toBinaryString(e.getModifiers()) )
-               + " "
-               + (Integer.toBinaryString(e.getModifiersEx()) )
-               + "]";
-       }
        public void mouseDragged(MouseEvent e) {
-               System.out.println("mouseDragged: " + getMouseEventString(e));
-               if (m_currMouseButton == 1) {
-                       processLeftDrag(e);
-               } else if (m_currMouseButton == 2) {
-                       processMiddleDrag(e);
-               } else if (m_currMouseButton == 3) {
-                       processRightDrag(e);
-               }
+               mouseDraggedDelegator.delegateMouseEvent(e);
        }
 
        public void mouseMoved(MouseEvent e) {
@@ -343,69 +324,15 @@
        public void mouseExited(MouseEvent e) { }
 
        public void mouseReleased(MouseEvent e) {
-               System.out.println("mouseReleased: " + getMouseEventString(e));
-               if (e.getButton() == MouseEvent.BUTTON1) {
-                       finishLeftClick(e);
-               } else if (e.getButton() == MouseEvent.BUTTON2) {
-                       finishMiddleClick(e);
-               } else if (e.getButton() == MouseEvent.BUTTON3) {
-                       finishRightClick(e);
-               }
+               mouseReleasedDelegator.delegateMouseEvent(e);
        }
 
        public void mousePressed(MouseEvent e) {
-               System.out.println("mousePressed: " + getMouseEventString(e));
-               // single-click
-               if ( e.getClickCount() == 1 ) {
-                       if ( isLeftClick(e) ) {
-                               if ( e.isControlDown() ) {
-                                       startSingleControlClick(e);
-                               } else {
-                                       startSingleLeftClick(e);
-                               }
-                       } else if ( isMiddleClick(e) ) {
-                               startSingleMiddleClick(e);
-                       } else if ( isRightClick(e) ) {
-                               startSingleRightClick(e);
-                       } 
-
-               // double click
-               } else if ( e.getClickCount() == 2 ) {
-                       if ( isLeftClick(e) ) {
-                               startDoubleLeftClick(e);
-                       }
-               }
-
+               mousePressedDelegator.delegateMouseEvent(e);
                requestFocusInWindow();
        }
 
-       private boolean isLeftClick(MouseEvent e) {
-               boolean b1 = (e.getButton() == MouseEvent.BUTTON1);
-               if ( isMacPlatform ) {
-                       return (!e.isMetaDown() && !e.isAltDown() && b1);
-               }
-               return b1;
-       }
 
-       private boolean isRightClick(MouseEvent e) {
-               boolean b3 = (e.getButton() == MouseEvent.BUTTON3); 
-               if ( !b3 && isMacPlatform ) {
-                       // meta - left click
-                       return (e.isMetaDown() && !e.isAltDown() && 
(e.getButton() == MouseEvent.BUTTON1));
-               }
-               return b3;
-       }
-
-       private boolean isMiddleClick(MouseEvent e) {
-               boolean b2 = (e.getButton() == MouseEvent.BUTTON2); 
-               if ( !b2 && isMacPlatform ) {
-                       // alt - left click
-                       return (!e.isMetaDown() && e.isAltDown() && 
(e.getButton() == MouseEvent.BUTTON1));
-               }
-               return b2;
-       }
-
-
        // KeyListener
 
        /**
@@ -1028,323 +955,6 @@
                }
        }
 
-       private void startSingleLeftClick(MouseEvent e) {
-               System.out.println("----> startSingleLeftClick");
-               m_undoable_edit = null;
-       
-               m_currMouseButton = 1;
-               m_lastXMousePos = e.getX();
-               m_lastYMousePos = e.getY();
-       
-               int[] unselectedNodes = null;
-               int[] unselectedEdges = null;
-               int chosenNode = 0;
-               int chosenEdge = 0;
-               int chosenAnchor = -1;
-               int chosenNodeSelected = 0;
-               int chosenEdgeSelected = 0;
-
-               synchronized (m_lock) {
-                       if (m_view.m_nodeSelection) {
-                               chosenNode = getChosenNode();
-                       }
-
-                       if (m_view.m_edgeSelection && (chosenNode == 0)
-                           && ((m_lastRenderDetail & 
GraphRenderer.LOD_EDGE_ANCHORS) != 0)) {
-                               chosenAnchor = getChosenAnchor();
-                       }
-
-                       if (m_view.m_edgeSelection && (chosenNode == 0) && 
(chosenAnchor < 0)) {
-                               chosenEdge = getChosenEdge();
-                       }
-
-                       if ((!e.isShiftDown()) // If shift is down never 
unselect.
-                           && (((chosenNode == 0) && (chosenEdge == 0) && 
(chosenAnchor < 0)) // Mouse missed all.
-                              // Not [we hit something but it was already 
selected].
-                              || !( ((chosenNode != 0) && 
m_view.getNodeView(chosenNode).isSelected())
-                                    || (chosenAnchor >= 0) 
-                                    || ((chosenEdge != 0) && 
m_view.getEdgeView(chosenEdge).isSelected()) ))) {
-                       
-                                       unselectedNodes = getUnselectedNodes();
-                                       unselectedEdges = getUnselectedEdges();
-
-                               if ((unselectedNodes.length > 0) || 
(unselectedEdges.length > 0))
-                                       m_view.m_contentChanged = true;
-                       }
-                       
-
-                       if (chosenNode != 0) {
-                           chosenNodeSelected = toggleSelectedNode(chosenNode, 
e);
-                       }
-
-                       if (chosenAnchor >= 0) {
-                               toggleChosenAnchor(chosenAnchor, e);
-                       }
-
-                       if (chosenEdge != 0) {
-                               chosenEdgeSelected = 
toggleSelectedEdge(chosenEdge, e);
-                       }
-
-                       if ((chosenNode == 0) && (chosenEdge == 0) && 
(chosenAnchor < 0)) {
-                               m_selectionRect = new 
Rectangle(m_lastXMousePos, m_lastYMousePos, 0, 0);
-                               m_button1NodeDrag = false;
-                       }
-               }
-
-               final GraphViewChangeListener listener = m_view.m_lis[0];
-
-               // delegating to listeners
-               if (listener != null) {
-                       if ((unselectedNodes != null) && 
(unselectedNodes.length > 0))
-                               listener.graphViewChanged(new 
GraphViewNodesUnselectedEvent(m_view,
-                                          
DGraphView.makeNodeList(unselectedNodes,m_view)));
-
-                       if ((unselectedEdges != null) && 
(unselectedEdges.length > 0))
-                               listener.graphViewChanged(new 
GraphViewEdgesUnselectedEvent(m_view,
-                                          
DGraphView.makeEdgeList(unselectedEdges,m_view)));
-
-                       if (chosenNode != 0) {
-                               if (chosenNodeSelected > 0)
-                                       listener.graphViewChanged(new 
GraphViewNodesSelectedEvent(m_view,
-                                               
DGraphView.makeList(m_view.getNodeView(chosenNode).getNode())));
-                               else if (chosenNodeSelected < 0)
-                                       listener.graphViewChanged(new 
GraphViewNodesUnselectedEvent(m_view,
-                                               
DGraphView.makeList(m_view.getNodeView(chosenNode).getNode())));
-                       }
-
-                       if (chosenEdge != 0) {
-                               if (chosenEdgeSelected > 0)
-                                       listener.graphViewChanged(new 
GraphViewEdgesSelectedEvent(m_view,
-                                               
DGraphView.makeList(m_view.getEdgeView(chosenEdge).getEdge())));
-                               else if (chosenEdgeSelected < 0)
-                                       listener.graphViewChanged(new 
GraphViewEdgesUnselectedEvent(m_view,
-                                               
DGraphView.makeList(m_view.getEdgeView(chosenEdge).getEdge())));
-                       }
-               }
-
-               // Repaint after listener events are fired because listeners 
may change
-               // something in the graph view.
-               repaint();
-       }
-
-       private void startSingleControlClick(MouseEvent e) {
-               System.out.println("----> startSingleControlClick");
-               // clicking on empty space
-               if ((getChosenNode() == 0) && (getChosenEdge() == 0) && 
(getChosenAnchor() < 0)) {
-                       popup.createEmptySpaceMenu(e.getX(), e.getY(),"NEW"); 
-               }
-       }
-
-       private void startSingleMiddleClick(MouseEvent e) {
-               System.out.println("----> startSingleMiddleClick");
-               // Save all node positions
-               m_undoable_edit = new 
ViewChangeEdit(m_view,ViewChangeEdit.SavedObjs.NODES,"Move",m_undo);
-               m_currMouseButton = 2;
-               m_lastXMousePos = e.getX();
-               m_lastYMousePos = e.getY();
-       }
-
-
-       private void startSingleRightClick(MouseEvent e) {
-               System.out.println("----> startSingleRightClick");
-               // Save all node positions
-               m_undoable_edit = new 
ViewChangeEdit(m_view,ViewChangeEdit.SavedObjs.NODES,"Move",m_undo);
-               m_currMouseButton = 3;
-               m_lastXMousePos = e.getX();
-               m_lastYMousePos = e.getY();
-       
-               NodeView nview = m_view.getPickedNodeView(e.getPoint());
-               popup.createNodeViewMenu(nview,e.getX(),e.getY(),null);
-       
-               EdgeView edgeView = m_view.getPickedEdgeView(e.getPoint());
-               popup.createEdgeViewMenu(edgeView,e.getX(),e.getY(),null);
-       }
-
-       private void startDoubleLeftClick(MouseEvent e) {
-               System.out.println("----> startDoubleLeftClick");
-               NodeView nview = m_view.getPickedNodeView(e.getPoint());
-               if ( nview != null )
-                       
popup.createNodeViewMenu(nview,e.getX(),e.getY(),"OPEN");
-               else 
-                       popup.createEmptySpaceMenu(e.getX(), e.getY(),"OPEN"); 
-       }
-
-       private void finishLeftClick(MouseEvent e) {
-               System.out.println("----> finishLeftClick");
-               if (m_currMouseButton == 1) {
-                       m_currMouseButton = 0;
-
-                       if (m_selectionRect != null) {
-                               int[] selectedNodes = null;
-                               int[] selectedEdges = null;
-
-                               synchronized (m_lock) {
-                                       if (m_view.m_nodeSelection || 
m_view.m_edgeSelection) {
-                                               if (m_view.m_nodeSelection) {
-                                                       selectedNodes = 
setSelectedNodes();
-                                               }
-
-                                               if (m_view.m_edgeSelection) {
-                                                       selectedEdges = 
setSelectedEdges ();
-                                               }                               
                                
-                                       }
-                               }
-
-                               m_selectionRect = null;
-
-                               final GraphViewChangeListener listener = 
m_view.m_lis[0];
-
-                               if (listener != null) {
-                                       if ((selectedNodes != null) && 
(selectedNodes.length > 0))
-                                               listener.graphViewChanged(new 
GraphViewNodesSelectedEvent(m_view,
-                                                               
DGraphView.makeNodeList(selectedNodes,m_view)));
-
-                                       if ((selectedEdges != null) && 
(selectedEdges.length > 0))
-                                               listener.graphViewChanged(new 
GraphViewEdgesSelectedEvent(m_view,
-                                                              
DGraphView.makeEdgeList(selectedEdges,m_view)));
-                               }
-
-                               // Repaint after listener events are fired 
because listeners may
-                               // change something in the graph view.
-                               repaint();
-                       }
-               }
-
-               if (m_undoable_edit != null)
-                       m_undoable_edit.post();
-       }
-
-       private void finishMiddleClick(MouseEvent e) {
-               System.out.println("----> finishMiddleClick");
-               if (m_currMouseButton == 2)
-                       m_currMouseButton = 0;
-
-               if (m_undoable_edit != null)
-                       m_undoable_edit.post();
-       }
-
-       private void finishRightClick(MouseEvent e) {
-               System.out.println("----> finishRightClick");
-               if (m_currMouseButton == 3)
-                       m_currMouseButton = 0;
-
-               if (m_undoable_edit != null)
-                       m_undoable_edit.post();
-       }
-
-       private void processLeftDrag(MouseEvent e) {
-               System.out.println("----> processLeftDrag");
-               if (m_button1NodeDrag) {
-                       // save selected node and edge positions
-                       if (m_undoable_edit == null) {
-                               m_undoable_edit = new ViewChangeEdit(m_view, 
ViewChangeEdit.SavedObjs.SELECTED, "Move",m_undo);
-                       }
-                       synchronized (m_lock) {
-                               m_ptBuff[0] = m_lastXMousePos;
-                               m_ptBuff[1] = m_lastYMousePos;
-                               m_view.xformComponentToNodeCoords(m_ptBuff);
-
-                               final double oldX = m_ptBuff[0];
-                               final double oldY = m_ptBuff[1];
-                               m_lastXMousePos = e.getX();
-                               m_lastYMousePos = e.getY();
-                               m_ptBuff[0] = m_lastXMousePos;
-                               m_ptBuff[1] = m_lastYMousePos;
-                               m_view.xformComponentToNodeCoords(m_ptBuff);
-
-                               final double newX = m_ptBuff[0];
-                               final double newY = m_ptBuff[1];
-                               double deltaX = newX - oldX;
-                               double deltaY = newY - oldY;
-
-                               // If the shift key is down, then only move 
horizontally,
-                               // vertically, or diagonally, depending on the 
slope.
-                               if (e.isShiftDown()) {
-                                       final double slope = deltaY / deltaX;
-
-                                       // slope of 2.41 ~ 67.5 degrees 
(halfway between 45 and 90)
-                                       // slope of 0.41 ~ 22.5 degrees 
(halfway between 0 and 45)
-                                       if ((slope > 2.41) || (slope < -2.41)) {
-                                               deltaX = 0.0; // just move 
vertical
-                                       } else if ((slope < 0.41) && (slope > 
-0.41)) {
-                                               deltaY = 0.0; // just move 
horizontal
-                                       } else {
-                                               final double avg = 
(Math.abs(deltaX) + Math.abs(deltaY)) / 2.0;
-                                               deltaX = (deltaX < 0) ? (-avg) 
: avg;
-                                               deltaY = (deltaY < 0) ? (-avg) 
: avg;
-                                       }
-                               }
-
-                               // TODO: Optimize to not instantiate new array 
on every call.
-                               final int[] selectedNodes = 
m_view.getSelectedNodeIndices();
-
-                               for (int i = 0; i < selectedNodes.length; i++) {
-                                       final NodeView nv = 
m_view.getNodeView(selectedNodes[i]);
-                                       final double oldXPos = 
nv.getXPosition();
-                                       final double oldYPos = 
nv.getYPosition();
-                                       nv.setOffset(oldXPos + deltaX, oldYPos 
+ deltaY);
-                               }
-
-                               final IntEnumerator anchorsToMove = 
m_view.m_selectedAnchors.searchRange(Integer.MIN_VALUE,
-                                                                               
                         Integer.MAX_VALUE,
-                                                                               
                         false);
-
-                               while (anchorsToMove.numRemaining() > 0) {
-                                       final int edgeAndAnchor = 
anchorsToMove.nextInt();
-                                       final int edge = edgeAndAnchor >>> 6;
-                                       final int anchorInx = edgeAndAnchor & 
0x0000003f;
-                                       final DEdgeView ev = (DEdgeView) 
m_view.getEdgeView(edge);
-                                       ev.getHandleInternal(anchorInx, 
m_floatBuff1);
-                                       ev.moveHandleInternal(anchorInx, 
m_floatBuff1[0] + deltaX,
-                                                             m_floatBuff1[1] + 
deltaY);
-                               }
-
-                               if ((selectedNodes.length > 0) || 
(m_view.m_selectedAnchors.size() > 0))
-                                       m_view.m_contentChanged = true;
-                       }
-               }
-
-               if (m_selectionRect != null) {
-                       final int x = Math.min(m_lastXMousePos, e.getX());
-                       final int y = Math.min(m_lastYMousePos, e.getY());
-                       final int w = Math.abs(m_lastXMousePos - e.getX());
-                       final int h = Math.abs(m_lastYMousePos - e.getY());
-                       m_selectionRect.setBounds(x, y, w, h);
-               }
-
-               repaint();
-       }
-
-       private void processMiddleDrag(MouseEvent e) {
-               System.out.println("----> processMiddleDrag");
-               double deltaX = e.getX() - m_lastXMousePos;
-               double deltaY = e.getY() - m_lastYMousePos;
-               m_lastXMousePos = e.getX();
-               m_lastYMousePos = e.getY();
-
-               synchronized (m_lock) {
-                       m_xCenter -= (deltaX / m_scaleFactor);
-                       m_yCenter -= (deltaY / m_scaleFactor);
-               }
-
-               m_view.m_viewportChanged = true;
-               repaint();
-       }
-
-       private void processRightDrag(MouseEvent e) {
-               System.out.println("----> processRightDrag");
-               double deltaY = e.getY() - m_lastYMousePos;
-
-               synchronized (m_lock) {
-                       m_lastXMousePos = e.getX();
-                       m_lastYMousePos = e.getY();
-                       m_scaleFactor *= Math.pow(2, -deltaY / 300.0d);
-               }
-
-               m_view.m_viewportChanged = true;
-               repaint();
-       }
-
        private void handleArrowKeys(KeyEvent k) {
                final int code = k.getKeyCode();
                double move = 1.0;
@@ -1400,4 +1010,341 @@
                        repaint();
                }
        }
+
+       private class MousePressedDelegator extends ButtonDelegator {
+
+               @Override
+               void singleLeftClick(MouseEvent e) {
+                       //System.out.println("MousePressed ----> 
singleLeftClick");
+                       m_undoable_edit = null;
+               
+                       m_currMouseButton = 1;
+                       m_lastXMousePos = e.getX();
+                       m_lastYMousePos = e.getY();
+               
+                       int[] unselectedNodes = null;
+                       int[] unselectedEdges = null;
+                       int chosenNode = 0;
+                       int chosenEdge = 0;
+                       int chosenAnchor = -1;
+                       int chosenNodeSelected = 0;
+                       int chosenEdgeSelected = 0;
+       
+                       synchronized (m_lock) {
+                               if (m_view.m_nodeSelection) {
+                                       chosenNode = getChosenNode();
+                               }
+       
+                               if (m_view.m_edgeSelection && (chosenNode == 0)
+                                   && ((m_lastRenderDetail & 
GraphRenderer.LOD_EDGE_ANCHORS) != 0)) {
+                                       chosenAnchor = getChosenAnchor();
+                               }
+       
+                               if (m_view.m_edgeSelection && (chosenNode == 0) 
&& (chosenAnchor < 0)) {
+                                       chosenEdge = getChosenEdge();
+                               }
+       
+                               if ((!e.isShiftDown()) // If shift is down 
never unselect.
+                                   && (((chosenNode == 0) && (chosenEdge == 0) 
&& (chosenAnchor < 0)) // Mouse missed all.
+                                      // Not [we hit something but it was 
already selected].
+                                      || !( ((chosenNode != 0) && 
m_view.getNodeView(chosenNode).isSelected())
+                                            || (chosenAnchor >= 0) 
+                                            || ((chosenEdge != 0) && 
m_view.getEdgeView(chosenEdge).isSelected()) ))) {
+                               
+                                               unselectedNodes = 
getUnselectedNodes();
+                                               unselectedEdges = 
getUnselectedEdges();
+       
+                                       if ((unselectedNodes.length > 0) || 
(unselectedEdges.length > 0))
+                                               m_view.m_contentChanged = true;
+                               }
+                               
+       
+                               if (chosenNode != 0) {
+                                   chosenNodeSelected = 
toggleSelectedNode(chosenNode, e);
+                               }
+       
+                               if (chosenAnchor >= 0) {
+                                       toggleChosenAnchor(chosenAnchor, e);
+                               }
+       
+                               if (chosenEdge != 0) {
+                                       chosenEdgeSelected = 
toggleSelectedEdge(chosenEdge, e);
+                               }
+       
+                               if ((chosenNode == 0) && (chosenEdge == 0) && 
(chosenAnchor < 0)) {
+                                       m_selectionRect = new 
Rectangle(m_lastXMousePos, m_lastYMousePos, 0, 0);
+                                       m_button1NodeDrag = false;
+                               }
+                       }
+       
+                       final GraphViewChangeListener listener = 
m_view.m_lis[0];
+       
+                       // delegating to listeners
+                       if (listener != null) {
+                               if ((unselectedNodes != null) && 
(unselectedNodes.length > 0))
+                                       listener.graphViewChanged(new 
GraphViewNodesUnselectedEvent(m_view,
+                                              
DGraphView.makeNodeList(unselectedNodes,m_view)));
+       
+                               if ((unselectedEdges != null) && 
(unselectedEdges.length > 0))
+                                       listener.graphViewChanged(new 
GraphViewEdgesUnselectedEvent(m_view,
+                                              
DGraphView.makeEdgeList(unselectedEdges,m_view)));
+       
+                               if (chosenNode != 0) {
+                                       if (chosenNodeSelected > 0)
+                                               listener.graphViewChanged(new 
GraphViewNodesSelectedEvent(m_view,
+                                                       
DGraphView.makeList(m_view.getNodeView(chosenNode).getNode())));
+                                       else if (chosenNodeSelected < 0)
+                                               listener.graphViewChanged(new 
GraphViewNodesUnselectedEvent(m_view,
+                                                       
DGraphView.makeList(m_view.getNodeView(chosenNode).getNode())));
+                               }
+       
+                               if (chosenEdge != 0) {
+                                       if (chosenEdgeSelected > 0)
+                                               listener.graphViewChanged(new 
GraphViewEdgesSelectedEvent(m_view,
+                                                       
DGraphView.makeList(m_view.getEdgeView(chosenEdge).getEdge())));
+                                       else if (chosenEdgeSelected < 0)
+                                               listener.graphViewChanged(new 
GraphViewEdgesUnselectedEvent(m_view,
+                                                       
DGraphView.makeList(m_view.getEdgeView(chosenEdge).getEdge())));
+                               }
+                       }
+       
+                       // Repaint after listener events are fired because 
listeners may change
+                       // something in the graph view.
+                       repaint();
+               }
+       
+               @Override
+               void singleLeftControlClick(MouseEvent e) {
+                       //System.out.println("MousePressed ----> 
singleLeftControlClick");
+                       // clicking on empty space
+                       if ((getChosenNode() == 0) && (getChosenEdge() == 0) && 
(getChosenAnchor() < 0)) {
+                               popup.createEmptySpaceMenu(e.getX(), 
e.getY(),"NEW"); 
+                       }
+               }
+       
+               @Override
+               void singleMiddleClick(MouseEvent e) {
+                       //System.out.println("MousePressed ----> 
singleMiddleClick");
+                       // Save all node positions
+                       m_undoable_edit = new 
ViewChangeEdit(m_view,ViewChangeEdit.SavedObjs.NODES,"Move",m_undo);
+                       m_currMouseButton = 2;
+                       m_lastXMousePos = e.getX();
+                       m_lastYMousePos = e.getY();
+               }
+       
+       
+               @Override
+               void singleRightClick(MouseEvent e) {
+                       //System.out.println("MousePressed ----> 
singleRightClick");
+                       // Save all node positions
+                       m_undoable_edit = new 
ViewChangeEdit(m_view,ViewChangeEdit.SavedObjs.NODES,"Move",m_undo);
+                       m_currMouseButton = 3;
+                       m_lastXMousePos = e.getX();
+                       m_lastYMousePos = e.getY();
+               
+                       NodeView nview = m_view.getPickedNodeView(e.getPoint());
+                       popup.createNodeViewMenu(nview,e.getX(),e.getY(),null);
+               
+                       EdgeView edgeView = 
m_view.getPickedEdgeView(e.getPoint());
+                       
popup.createEdgeViewMenu(edgeView,e.getX(),e.getY(),null);
+               }
+       
+               @Override
+               void doubleLeftClick(MouseEvent e) {
+                       //System.out.println("MousePressed ----> 
doubleLeftClick");
+                       NodeView nview = m_view.getPickedNodeView(e.getPoint());
+                       if ( nview != null )
+                               
popup.createNodeViewMenu(nview,e.getX(),e.getY(),"OPEN");
+                       else 
+                               popup.createEmptySpaceMenu(e.getX(), 
e.getY(),"OPEN"); 
+               }
+       }
+
+       private class MouseReleasedDelegator extends ButtonDelegator {
+
+               @Override
+               void singleLeftClick(MouseEvent e) {
+                       //System.out.println("MouseReleased ----> 
singleLeftClick");
+                       if (m_currMouseButton == 1) {
+                               m_currMouseButton = 0;
+       
+                               if (m_selectionRect != null) {
+                                       int[] selectedNodes = null;
+                                       int[] selectedEdges = null;
+       
+                                       synchronized (m_lock) {
+                                               if (m_view.m_nodeSelection || 
m_view.m_edgeSelection) {
+                                                       if 
(m_view.m_nodeSelection) {
+                                                               selectedNodes = 
setSelectedNodes();
+                                                       }
+       
+                                                       if 
(m_view.m_edgeSelection) {
+                                                               selectedEdges = 
setSelectedEdges ();
+                                                       }                       
                                        
+                                               }
+                                       }
+       
+                                       m_selectionRect = null;
+       
+                                       final GraphViewChangeListener listener 
= m_view.m_lis[0];
+       
+                                       if (listener != null) {
+                                               if ((selectedNodes != null) && 
(selectedNodes.length > 0))
+                                                       
listener.graphViewChanged(new GraphViewNodesSelectedEvent(m_view,
+                                                                       
DGraphView.makeNodeList(selectedNodes,m_view)));
+       
+                                               if ((selectedEdges != null) && 
(selectedEdges.length > 0))
+                                                       
listener.graphViewChanged(new GraphViewEdgesSelectedEvent(m_view,
+                                                                      
DGraphView.makeEdgeList(selectedEdges,m_view)));
+                                       }
+       
+                                       // Repaint after listener events are 
fired because listeners may
+                                       // change something in the graph view.
+                                       repaint();
+                               }
+                       }
+       
+                       if (m_undoable_edit != null)
+                               m_undoable_edit.post();
+               }
+       
+               @Override
+               void singleMiddleClick(MouseEvent e) {
+                       //System.out.println("MouseReleased ----> 
singleMiddleClick");
+                       if (m_currMouseButton == 2)
+                               m_currMouseButton = 0;
+       
+                       if (m_undoable_edit != null)
+                               m_undoable_edit.post();
+               }
+       
+               @Override
+               void singleRightClick(MouseEvent e) {
+                       //System.out.println("MouseReleased ----> 
singleRightClick");
+                       if (m_currMouseButton == 3)
+                               m_currMouseButton = 0;
+       
+                       if (m_undoable_edit != null)
+                               m_undoable_edit.post();
+               }
+       }
+
+       private class MouseDraggedDelegator extends ButtonDelegator {
+
+               @Override
+               void singleLeftClick(MouseEvent e) {
+                       //System.out.println("MouseDragged ----> 
singleLeftClick");
+                       if (m_button1NodeDrag) {
+                               // save selected node and edge positions
+                               if (m_undoable_edit == null) {
+                                       m_undoable_edit = new 
ViewChangeEdit(m_view, ViewChangeEdit.SavedObjs.SELECTED, "Move",m_undo);
+                               }
+                               synchronized (m_lock) {
+                                       m_ptBuff[0] = m_lastXMousePos;
+                                       m_ptBuff[1] = m_lastYMousePos;
+                                       
m_view.xformComponentToNodeCoords(m_ptBuff);
+       
+                                       final double oldX = m_ptBuff[0];
+                                       final double oldY = m_ptBuff[1];
+                                       m_lastXMousePos = e.getX();
+                                       m_lastYMousePos = e.getY();
+                                       m_ptBuff[0] = m_lastXMousePos;
+                                       m_ptBuff[1] = m_lastYMousePos;
+                                       
m_view.xformComponentToNodeCoords(m_ptBuff);
+       
+                                       final double newX = m_ptBuff[0];
+                                       final double newY = m_ptBuff[1];
+                                       double deltaX = newX - oldX;
+                                       double deltaY = newY - oldY;
+       
+                                       // If the shift key is down, then only 
move horizontally,
+                                       // vertically, or diagonally, depending 
on the slope.
+                                       if (e.isShiftDown()) {
+                                               final double slope = deltaY / 
deltaX;
+       
+                                               // slope of 2.41 ~ 67.5 degrees 
(halfway between 45 and 90)
+                                               // slope of 0.41 ~ 22.5 degrees 
(halfway between 0 and 45)
+                                               if ((slope > 2.41) || (slope < 
-2.41)) {
+                                                       deltaX = 0.0; // just 
move vertical
+                                               } else if ((slope < 0.41) && 
(slope > -0.41)) {
+                                                       deltaY = 0.0; // just 
move horizontal
+                                               } else {
+                                                       final double avg = 
(Math.abs(deltaX) + Math.abs(deltaY)) / 2.0;
+                                                       deltaX = (deltaX < 0) ? 
(-avg) : avg;
+                                                       deltaY = (deltaY < 0) ? 
(-avg) : avg;
+                                               }
+                                       }
+       
+                                       // TODO: Optimize to not instantiate 
new array on every call.
+                                       final int[] selectedNodes = 
m_view.getSelectedNodeIndices();
+       
+                                       for (int i = 0; i < 
selectedNodes.length; i++) {
+                                               final NodeView nv = 
m_view.getNodeView(selectedNodes[i]);
+                                               final double oldXPos = 
nv.getXPosition();
+                                               final double oldYPos = 
nv.getYPosition();
+                                               nv.setOffset(oldXPos + deltaX, 
oldYPos + deltaY);
+                                       }
+       
+                                       final IntEnumerator anchorsToMove = 
m_view.m_selectedAnchors.searchRange(Integer.MIN_VALUE,
+                                                                               
                                 Integer.MAX_VALUE,
+                                                                               
                                 false);
+       
+                                       while (anchorsToMove.numRemaining() > 
0) {
+                                               final int edgeAndAnchor = 
anchorsToMove.nextInt();
+                                               final int edge = edgeAndAnchor 
>>> 6;
+                                               final int anchorInx = 
edgeAndAnchor & 0x0000003f;
+                                               final DEdgeView ev = 
(DEdgeView) m_view.getEdgeView(edge);
+                                               ev.getHandleInternal(anchorInx, 
m_floatBuff1);
+                                               
ev.moveHandleInternal(anchorInx, m_floatBuff1[0] + deltaX,
+                                                                     
m_floatBuff1[1] + deltaY);
+                                       }
+       
+                                       if ((selectedNodes.length > 0) || 
(m_view.m_selectedAnchors.size() > 0))
+                                               m_view.m_contentChanged = true;
+                               }
+                       }
+       
+                       if (m_selectionRect != null) {
+                               final int x = Math.min(m_lastXMousePos, 
e.getX());
+                               final int y = Math.min(m_lastYMousePos, 
e.getY());
+                               final int w = Math.abs(m_lastXMousePos - 
e.getX());
+                               final int h = Math.abs(m_lastYMousePos - 
e.getY());
+                               m_selectionRect.setBounds(x, y, w, h);
+                       }
+       
+                       repaint();
+               }
+
+               @Override
+               void singleMiddleClick(MouseEvent e) {
+                       //System.out.println("MouseDragged ----> 
singleMiddleClick");
+                       double deltaX = e.getX() - m_lastXMousePos;
+                       double deltaY = e.getY() - m_lastYMousePos;
+                       m_lastXMousePos = e.getX();
+                       m_lastYMousePos = e.getY();
+       
+                       synchronized (m_lock) {
+                               m_xCenter -= (deltaX / m_scaleFactor);
+                               m_yCenter -= (deltaY / m_scaleFactor);
+                       }
+       
+                       m_view.m_viewportChanged = true;
+                       repaint();
+               }
+
+               @Override
+               void singleRightClick(MouseEvent e) {
+                       //System.out.println("MouseDragged ----> 
singleRightClick");
+                       double deltaY = e.getY() - m_lastYMousePos;
+       
+                       synchronized (m_lock) {
+                               m_lastXMousePos = e.getX();
+                               m_lastYMousePos = e.getY();
+                               m_scaleFactor *= Math.pow(2, -deltaY / 300.0d);
+                       }
+       
+                       m_view.m_viewportChanged = true;
+                       repaint();
+               }
+       }
 }

-- 
You received this message because you are subscribed to the Google Groups 
"cytoscape-cvs" group.
To post to this group, send email to [email protected].
To unsubscribe from this group, send email to 
[email protected].
For more options, visit this group at 
http://groups.google.com/group/cytoscape-cvs?hl=en.

Reply via email to