Author: mes
Date: 2010-12-06 11:38:23 -0800 (Mon, 06 Dec 2010)
New Revision: 23096
Modified:
core3/ding-presentation-impl/trunk/src/main/java/org/cytoscape/ding/impl/InnerCanvas.java
Log:
cleaned up mouse handling code, but didn't change any behavior
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 17:50:21 UTC (rev 23095)
+++
core3/ding-presentation-impl/trunk/src/main/java/org/cytoscape/ding/impl/InnerCanvas.java
2010-12-06 19:38:23 UTC (rev 23096)
@@ -125,18 +125,19 @@
*/
static final String MAC_OS_ID = "mac";
- //AJK: 04/02/06 BEGIN
private DropTarget dropTarget;
private String CANVAS_DROP = "CanvasDrop";
- // AJK: 1/14/2007 BEGIN
// for turning selection rectangle on and off
private boolean selecting = true;
- // AJK: 1/14/2007 END
-
private UndoSupport m_undo;
+ private int m_currMouseButton = 0;
+ private int m_lastXMousePos = 0;
+ private int m_lastYMousePos = 0;
+ private boolean m_button1NodeDrag = false;
+
InnerCanvas(Object lock, DGraphView view, UndoSupport undo) {
super();
m_lock = lock;
@@ -278,46 +279,128 @@
/**
* Return true if this view is curerntly being printed (as opposed to
painted on the screen)
- *
* @return true if we're currently being printed, false otherwise
*/
- public boolean isPrinting() { return isPrinting; }
+ public boolean isPrinting() {
+ return isPrinting;
+ }
- private int m_currMouseButton = 0;
- private int m_lastXMousePos = 0;
- private int m_lastYMousePos = 0;
- private boolean m_button1NodeDrag = false;
+ //
+ // MouseWheelListener
+ //
- /**
- * DOCUMENT ME!
- *
- * @param e DOCUMENT ME!
- */
- public void mouseClicked(MouseEvent e) {
+ public void mouseWheelMoved(MouseWheelEvent e) {
+ adjustZoom( e.getWheelRotation() );
}
+ //
+ // MouseMotionListener
+ //
+
+ public void mouseDragged(MouseEvent e) {
+ if (m_currMouseButton == 1) {
+ processLeftDrag(e);
+ } else if (m_currMouseButton == 2) {
+ processMiddleDrag(e);
+ } else if (m_currMouseButton == 3) {
+ processRightDrag(e);
+ }
+ }
+
+ public void mouseMoved(MouseEvent e) {
+ setToolTipText( getToolTipText( e.getPoint() ) );
+ }
+
+ //
+ // MouseListener
+ //
+
+ public void mouseClicked(MouseEvent e) { }
+
+ public void mouseEntered(MouseEvent e) { }
+
+ public void mouseExited(MouseEvent e) { }
+
+ public void mouseReleased(MouseEvent e) {
+ if (e.getButton() == MouseEvent.BUTTON1) {
+ finishLeftClick(e);
+ } else if (e.getButton() == MouseEvent.BUTTON2) {
+ finishMiddleClick(e);
+ } else if (e.getButton() == MouseEvent.BUTTON3) {
+ finishRightClick(e);
+ }
+ }
+
+ public void mousePressed(MouseEvent e) {
+ // single-click
+ if ( e.getClickCount() == 1 ) {
+
+ // normal single click (i.e. left click without control
and not on a mac)
+ if ((e.getButton() == MouseEvent.BUTTON1) &&
!e.isControlDown()) {
+
+ if (e.isShiftDown() && isAnchorKeyDown(e))
+ return;
+
+ startSingleLeftClick(e);
+
+ // we have control + single-click
+ } else if ((e.getButton() == MouseEvent.BUTTON1) &&
!isMacPlatform() && e.isControlDown()) {
+ // on mac, mouse button1 click and control is
simulate button 3 press
+ // It's too complicated to correctly handle
both control and shift
+ // simultaneously.
+ startSingleControlClick(e);
+
+ // middle click
+ } else if (e.getButton() == MouseEvent.BUTTON2) {
+ startSingleMiddleClick(e);
+
+ // right click
+ } else if ((e.getButton() == MouseEvent.BUTTON3) ||
(isMacPlatform() && e.isControlDown())) {
+ startSingleRightClick(e);
+ }
+
+ // double click
+ } else if ( e.getClickCount() == 2 ) {
+
+ // normal (left) double click
+ if (e.getButton() == MouseEvent.BUTTON1) {
+ startDoubleLeftClick(e);
+ }
+ }
+
+ requestFocusInWindow();
+ }
+
+ // KeyListener
+
/**
- * DOCUMENT ME!
- *
- * @param e DOCUMENT ME!
+ * Handles key press events. Currently used with the up/down,
left/right arrow
+ * keys. Pressing any of the listed keys will move the selected nodes
one pixel
+ * in that direction.
+ * @param k The key event that we're listening for.
*/
- public void mouseEntered(MouseEvent e) {
+ public void keyPressed(KeyEvent k) {
+ final int code = k.getKeyCode();
+ if ( (code == KeyEvent.VK_UP) || (code == KeyEvent.VK_DOWN) ||
+ (code == KeyEvent.VK_LEFT) || (code == KeyEvent.VK_RIGHT))
{
+ handleArrowKeys(k);
+ }
}
/**
- * DOCUMENT ME!
- *
- * @param e DOCUMENT ME!
+ * Currently not used.
+ * @param k The key event that we're listening for.
*/
- public void mouseExited(MouseEvent e) {
- }
-
+ public void keyReleased(KeyEvent k) { }
+
/**
- *
- * @return
+ * Currently not used.
+ * @param k The key event that we're listening for.
*/
- private int getChosenNode()
- {
+ public void keyTyped(KeyEvent k) { }
+
+
+ private int getChosenNode() {
m_ptBuff[0] = m_lastXMousePos;
m_ptBuff[1] = m_lastYMousePos;
m_view.xformComponentToNodeCoords(m_ptBuff);
@@ -331,12 +414,7 @@
return chosenNode;
}
- /**
- *
- * @return
- */
- private int getChosenAnchor ()
- {
+ private int getChosenAnchor() {
m_ptBuff[0] = m_lastXMousePos;
m_ptBuff[1] = m_lastYMousePos;
m_view.xformComponentToNodeCoords(m_ptBuff);
@@ -350,12 +428,7 @@
return chosenAnchor;
}
- /**
- *
- */
- private int getChosenEdge()
- {
-
+ private int getChosenEdge() {
computeEdgesIntersecting(m_lastXMousePos - 1, m_lastYMousePos -
1,
m_lastXMousePos + 1, m_lastYMousePos + 1, m_stack2);
int chosenEdge = (m_stack2.size() > 0) ? m_stack2.peek() : 0;
@@ -363,11 +436,9 @@
}
/**
- *
* @return an array of indices of unselected nodes
*/
- private int[] getUnselectedNodes()
- {
+ private int[] getUnselectedNodes() {
int [] unselectedNodes;
if (m_view.m_nodeSelection) { // Unselect all selected nodes.
unselectedNodes = m_view.getSelectedNodeIndices();
@@ -384,8 +455,7 @@
}
- private int[] getUnselectedEdges()
- {
+ private int[] getUnselectedEdges() {
int[] unselectedEdges;
if (m_view.m_edgeSelection) { // Unselect all selected edges.
unselectedEdges = m_view.getSelectedEdgeIndices();
@@ -400,8 +470,7 @@
return unselectedEdges;
}
- private int toggleSelectedNode(int chosenNode, MouseEvent e)
- {
+ private int toggleSelectedNode(int chosenNode, MouseEvent e) {
int chosenNodeSelected = 0;
final boolean wasSelected =
m_view.getNodeView(chosenNode).isSelected();
@@ -419,15 +488,11 @@
}
- /**
- *
- */
- private void toggleChosenAnchor (int chosenAnchor, MouseEvent e)
- {
+ private void toggleChosenAnchor (int chosenAnchor, MouseEvent e) {
if (isAnchorKeyDown(e)) {
final int edge = chosenAnchor >>> 6;
final int anchorInx = chosenAnchor & 0x0000003f;
- //****** Save remove handle
+ // Save remove handle
m_undoable_edit = new
ViewChangeEdit(m_view,ViewChangeEdit.SavedObjs.SELECTED_EDGES,"Remove Edge
Handle",m_undo);
((DEdgeView)
m_view.getEdgeView(edge)).removeHandle(anchorInx);
m_button1NodeDrag = false;
@@ -449,11 +514,7 @@
m_view.m_contentChanged = true;
}
-
-
-
- private int toggleSelectedEdge (int chosenEdge, MouseEvent e)
- {
+ private int toggleSelectedEdge(int chosenEdge, MouseEvent e) {
int chosenEdgeSelected = 0;
if (isAnchorKeyDown(e)
&& ((m_lastRenderDetail &
GraphRenderer.LOD_EDGE_ANCHORS) != 0)) {
@@ -461,7 +522,7 @@
m_ptBuff[0] = m_lastXMousePos;
m_ptBuff[1] = m_lastYMousePos;
m_view.xformComponentToNodeCoords(m_ptBuff);
- //******* Store current handle list *********
+ // Store current handle list
m_undoable_edit = new
ViewChangeEdit(m_view,ViewChangeEdit.SavedObjs.SELECTED_EDGES,"Add Edge
Handle",m_undo);
final int chosenInx = ((DEdgeView)
m_view.getEdgeView(chosenEdge))
.addHandleFoo(new Point2D.Float((float) m_ptBuff[0],
@@ -503,183 +564,8 @@
return chosenEdgeSelected;
}
- /**
- * DOCUMENT ME!
- *
- * @param e DOCUMENT ME!
- */
- public void mousePressed(MouseEvent e) {
- // single-click
- if ( e.getClickCount() == 1 ) {
-
- System.out.println ("SINGLE click -------");
-
- // normal single click (i.e. left click without control
and not on a mac)
- if ((e.getButton() == MouseEvent.BUTTON1) &&
!e.isControlDown()) {
- System.out.println ("left click -------");
-
- if (e.isShiftDown() && isAnchorKeyDown(e))
- return;
-
- // m_undoable_edit = new ViewChangeEdit(m_view,
"Move");
- 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();
-
- // we have control + single-click
- } else if ((e.getButton() == MouseEvent.BUTTON1) &&
!isMacPlatform() && e.isControlDown()) {
-
- // on mac, mouse button1 click and control is
simulate button 3 press
- // It's too complicated to correctly handle
both control and shift
- // simultaneously.
-
- System.out.println("left control click
----------");
- // clicking on empty space
- if ((getChosenNode() == 0) && (getChosenEdge()
== 0) && (getChosenAnchor() < 0)) {
- popup.createEmptySpaceMenu(e.getX(),
e.getY(),"NEW");
- }
- }
-
- // middle click
- else if (e.getButton() == MouseEvent.BUTTON2) {
- System.out.println("middle click -----------");
- //******** 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();
-
- // right click
- } else if ((e.getButton() == MouseEvent.BUTTON3) ||
(isMacPlatform() && e.isControlDown())) {
- System.out.println("right click -----------");
- //******** Save all node positions
- // TODO figure out if we should actually be
saving anything for the edit
- //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);
- }
-
- // double click
- } else if ( e.getClickCount() == 2 ) {
- System.out.println("DOUBLE click -----------");
-
- // normal (left) double click
- if (e.getButton() == MouseEvent.BUTTON1) {
- System.out.println("left click -----------");
-
- 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");
- }
- }
-
- requestFocusInWindow();
- }
-
- private int[] setSelectedNodes ()
- {
+ private int[] setSelectedNodes() {
int [] selectedNodes = null;
m_ptBuff[0] = m_selectionRect.x;
m_ptBuff[1] = m_selectionRect.y;
@@ -726,8 +612,7 @@
}
- private int [] setSelectedEdges ()
- {
+ private int [] setSelectedEdges() {
int [] selectedEdges = null;
if ((m_lastRenderDetail & GraphRenderer.LOD_EDGE_ANCHORS) != 0)
{
m_ptBuff[0] = m_selectionRect.x;
@@ -792,296 +677,25 @@
}
/**
- * DOCUMENT ME!
- *
- * @param e DOCUMENT ME!
+ * Returns the tool tip text for the specified location if any exists
first
+ * checking nodes, then edges, and then returns null if it's empty
space.
*/
- public void mouseReleased(MouseEvent e) {
- if (e.getButton() == MouseEvent.BUTTON1) {
- if (m_currMouseButton == 1) {
- m_currMouseButton = 0;
+ private String getToolTipText(Point p) {
+ // display tips for nodes before edges
+ NodeView nv = m_view.getPickedNodeView(p);
+ if (nv != null)
+ return ((DNodeView) nv).getToolTip();
- 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();
- } else if (e.getButton() == MouseEvent.BUTTON2) {
- if (m_currMouseButton == 2)
- m_currMouseButton = 0;
-
- if (m_undoable_edit != null)
- m_undoable_edit.post();
- } else if (e.getButton() == MouseEvent.BUTTON3) {
- if (m_currMouseButton == 3)
- m_currMouseButton = 0;
-
- if (m_undoable_edit != null)
- m_undoable_edit.post();
+ // only display edge tool tips if the LOD is sufficient
+ if ((m_lastRenderDetail & GraphRenderer.LOD_HIGH_DETAIL) != 0) {
+ EdgeView ev = m_view.getPickedEdgeView(p);
+ if (ev != null)
+ return ((DEdgeView) ev).getToolTip();
}
- }
- /**
- * DOCUMENT ME!
- *
- * @param e DOCUMENT ME!
- */
- public void mouseDragged(MouseEvent e) {
- if (m_currMouseButton == 1) {
- if (m_button1NodeDrag) {
- //*****SAVE SELECTED NODE & 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();
- } else if (m_currMouseButton == 2) {
- 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();
- } else if (m_currMouseButton == 3) {
- 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();
- }
+ return null;
}
- // AJK: 05/02/06 BEGIN
- /**
- * DOCUMENT ME!
- *
- * @param e DOCUMENT ME!
- */
- public void mouseMoved(MouseEvent e) {
- NodeView nv = m_view.getPickedNodeView(e.getPoint());
- boolean toolTipSet = false;
-
- if (nv != null) {
- setToolTipText(((DNodeView) nv).getToolTip());
- toolTipSet = true;
- } else {
- if ((m_lastRenderDetail &
GraphRenderer.LOD_HIGH_DETAIL) != 0) {
- EdgeView ev =
m_view.getPickedEdgeView(e.getPoint());
-
- if (ev != null) {
- setToolTipText(((DEdgeView)
ev).getToolTip());
- toolTipSet = true;
- }
- }
- }
-
- if (!toolTipSet)
- setToolTipText(null);
- }
-
- /**
- * Handles key press events. Currently used with the up/down,
left/right arrow
- * keys. Pressing any of the listed keys will move the selected nodes
one pixel
- * in that direction.
- *
- * @param k The key event that we're listening for.
- */
- public void keyPressed(KeyEvent k) {
- int code = k.getKeyCode();
-
- if ((code == KeyEvent.VK_UP) || (code == KeyEvent.VK_DOWN) ||
(code == KeyEvent.VK_LEFT)
- || (code == KeyEvent.VK_RIGHT)) {
- double move = 1.0;
-
- if (k.isShiftDown())
- move = 10.0;
-
- if (m_view.m_nodeSelection) {
- // move nodes
- int[] selectedNodes =
m_view.getSelectedNodeIndices();
-
- for (int i = 0; i < selectedNodes.length; i++) {
- DNodeView nv = ((DNodeView)
m_view.getNodeView(selectedNodes[i]));
- double xPos = nv.getXPosition();
- double yPos = nv.getYPosition();
-
- if (code == KeyEvent.VK_UP) {
- yPos -= move;
- } else if (code == KeyEvent.VK_DOWN) {
- yPos += move;
- } else if (code == KeyEvent.VK_LEFT) {
- xPos -= move;
- } else if (code == KeyEvent.VK_RIGHT) {
- xPos += move;
- }
-
- nv.setOffset(xPos, yPos);
- }
-
- // move edge anchors
- 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);
-
- if (code == KeyEvent.VK_UP) {
-
ev.moveHandleInternal(anchorInx, m_floatBuff1[0], m_floatBuff1[1] - move);
- } else if (code == KeyEvent.VK_DOWN) {
-
ev.moveHandleInternal(anchorInx, m_floatBuff1[0], m_floatBuff1[1] + move);
- } else if (code == KeyEvent.VK_LEFT) {
-
ev.moveHandleInternal(anchorInx, m_floatBuff1[0] - move, m_floatBuff1[1]);
- } else if (code == KeyEvent.VK_RIGHT) {
-
ev.moveHandleInternal(anchorInx, m_floatBuff1[0] + move, m_floatBuff1[1]);
- }
- }
-
- repaint();
- }
- }
- }
-
- /**
- * Currently not used.
- *
- * @param k The key event that we're listening for.
- */
- public void keyReleased(KeyEvent k) {
- }
-
- /**
- * Currently not used.
- *
- * @param k The key event that we're listening for.
- */
- public void keyTyped(KeyEvent k) {
- }
-
- // AJK: 05/02/06 END
// Puts [last drawn] edges intersecting onto stack; as RootGraph
indices.
// Depends on the state of several member variables, such as m_hash.
// Clobbers m_stack and m_ptBuff.
@@ -1287,9 +901,8 @@
}
- public void mouseWheelMoved(MouseWheelEvent e) {
- int notches = e.getWheelRotation();
- double factor = 1.0;
+ private void adjustZoom(int notches) {
+ double factor;
// scroll up, zoom in
if (notches < 0) {
@@ -1405,4 +1018,377 @@
m_lastRenderDetail = lastRenderDetail;
}
}
+
+ 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;
+
+ if (k.isShiftDown())
+ move = 10.0;
+
+ if (m_view.m_nodeSelection) {
+ // move nodes
+ int[] selectedNodes = m_view.getSelectedNodeIndices();
+
+ for (int i = 0; i < selectedNodes.length; i++) {
+ DNodeView nv = ((DNodeView)
m_view.getNodeView(selectedNodes[i]));
+ double xPos = nv.getXPosition();
+ double yPos = nv.getYPosition();
+
+ if (code == KeyEvent.VK_UP) {
+ yPos -= move;
+ } else if (code == KeyEvent.VK_DOWN) {
+ yPos += move;
+ } else if (code == KeyEvent.VK_LEFT) {
+ xPos -= move;
+ } else if (code == KeyEvent.VK_RIGHT) {
+ xPos += move;
+ }
+
+ nv.setOffset(xPos, yPos);
+ }
+
+ // move edge anchors
+ 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);
+
+ if (code == KeyEvent.VK_UP) {
+ ev.moveHandleInternal(anchorInx,
m_floatBuff1[0], m_floatBuff1[1] - move);
+ } else if (code == KeyEvent.VK_DOWN) {
+ ev.moveHandleInternal(anchorInx,
m_floatBuff1[0], m_floatBuff1[1] + move);
+ } else if (code == KeyEvent.VK_LEFT) {
+ ev.moveHandleInternal(anchorInx,
m_floatBuff1[0] - move, m_floatBuff1[1]);
+ } else if (code == KeyEvent.VK_RIGHT) {
+ ev.moveHandleInternal(anchorInx,
m_floatBuff1[0] + move, m_floatBuff1[1]);
+ }
+ }
+
+ 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.