1   /****************************************************************************
2    **
3    ** This file is part of yFiles-2.6. 
4    ** 
5    ** yWorks proprietary/confidential. Use is subject to license terms.
6    **
7    ** Redistribution of this file or of an unauthorized byte-code version
8    ** of this file is strictly forbidden.
9    **
10   ** Copyright (c) 2000-2008 by yWorks GmbH, Vor dem Kreuzberg 28, 
11   ** 72070 Tuebingen, Germany. All rights reserved.
12   **
13   ***************************************************************************/
14  package demo.view.layout.organic;
15  
16  import y.base.Node;
17  import y.base.NodeCursor;
18  import y.view.Graph2DView;
19  import y.view.MoveSelectionMode;
20  import y.view.NodeRealizer;
21  import y.layout.organic.InteractiveOrganicLayouter;
22  
23  /**
24   * This moveSelection mode allows the user to easily drag nodes around.
25   */
26  public class InteractiveMoveSelectionMode extends MoveSelectionMode {
27    private InteractiveOrganicLayouter layouter;
28  
29    public InteractiveMoveSelectionMode( InteractiveOrganicLayouter layouter ) {
30      if ( layouter == null ) throw new IllegalArgumentException( "layouter must not be null" );
31      this.layouter = layouter;
32    }
33  
34    /**
35     * Is called when the dragging has startet.
36     * The node is locked and the position is updated.
37     */
38    protected void selectionMoveStarted( double x, double y ) {
39      view.setDrawingMode( Graph2DView.NORMAL_MODE );
40  
41      for ( NodeCursor nodeCursor = getGraph2D().selectedNodes(); nodeCursor.ok(); nodeCursor.next() ) {
42        Node node = nodeCursor.node();
43        NodeRealizer realizer = getGraph2D().getRealizer( node );
44        layouter.setCenter( node, realizer.getCenterX(), realizer.getCenterY() );
45  
46        layouter.setInertia( node, 1 );
47        increaseNeighborsHeat( node );
48      }
49      layouter.wakeUp();
50    }
51  
52    /**
53     * Is called while the node is dragged.
54     */
55    protected void selectionOnMove( double dx, double dy, double x, double y ) {
56      for ( NodeCursor nodeCursor = getGraph2D().selectedNodes(); nodeCursor.ok(); nodeCursor.next() ) {
57        Node node = nodeCursor.node();
58        NodeRealizer realizer = getGraph2D().getRealizer( node );
59        layouter.setCenter( node, realizer.getCenterX(), realizer.getCenterY() );
60        increaseNeighborsHeat( node );
61      }
62      layouter.wakeUp();
63    }
64  
65    /**
66     * When the dragging ends.
67     * The lock on the node is removed
68     */
69    protected void selectionMovedAction( double dx, double dy, double x, double y ) {
70      for ( NodeCursor nodeCursor = getGraph2D().selectedNodes(); nodeCursor.ok(); nodeCursor.next() ) {
71        Node node = nodeCursor.node();
72        NodeRealizer realizer = getGraph2D().getRealizer( node );
73        layouter.setCenter( node, realizer.getCenterX(), realizer.getCenterY() );
74  
75        layouter.setInertia( node, 0 );
76        increaseNeighborsHeat( node );
77      }
78      layouter.wakeUp();
79    }
80  
81    /**
82     * Increases the neighbors heat
83     * @param originalNode
84     */
85    protected void increaseNeighborsHeat( Node originalNode ) {
86      //Increase Heat of neighbors
87      for ( NodeCursor cursor = originalNode.neighbors(); cursor.ok(); cursor.next() ) {
88        Node neighbor = cursor.node();
89  
90        double oldStress = layouter.getStress( neighbor );
91        layouter.setStress( neighbor, Math.min( 1, oldStress + 0.5 ) );
92      }
93    }
94  }
95