1
28 package demo.layout.organic;
29
30 import y.base.Node;
31 import y.base.NodeCursor;
32 import y.view.Graph2DView;
33 import y.view.MoveSelectionMode;
34 import y.view.NodeRealizer;
35 import y.layout.organic.InteractiveOrganicLayouter;
36
37
40 public class InteractiveMoveSelectionMode extends MoveSelectionMode {
41 private InteractiveOrganicLayouter layouter;
42
43 public InteractiveMoveSelectionMode( InteractiveOrganicLayouter layouter ) {
44 if ( layouter == null ) throw new IllegalArgumentException( "layouter must not be null" );
45 this.layouter = layouter;
46 }
47
48
52 protected void selectionMoveStarted( double x, double y ) {
53 view.setDrawingMode( Graph2DView.NORMAL_MODE );
54
55 for ( NodeCursor nodeCursor = getGraph2D().selectedNodes(); nodeCursor.ok(); nodeCursor.next() ) {
56 Node node = nodeCursor.node();
57 NodeRealizer realizer = getGraph2D().getRealizer( node );
58 layouter.setCenter( node, realizer.getCenterX(), realizer.getCenterY() );
59
60 layouter.setInertia( node, 1 );
61 increaseNeighborsHeat( node );
62 }
63 layouter.wakeUp();
64 }
65
66
69 protected void selectionOnMove( 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 increaseNeighborsHeat( node );
75 }
76 layouter.wakeUp();
77 }
78
79
83 protected void selectionMovedAction( double dx, double dy, double x, double y ) {
84 for ( NodeCursor nodeCursor = getGraph2D().selectedNodes(); nodeCursor.ok(); nodeCursor.next() ) {
85 Node node = nodeCursor.node();
86 NodeRealizer realizer = getGraph2D().getRealizer( node );
87 layouter.setCenter( node, realizer.getCenterX(), realizer.getCenterY() );
88
89 layouter.setInertia( node, 0 );
90 increaseNeighborsHeat( node );
91 }
92 layouter.wakeUp();
93 }
94
95
99 protected void increaseNeighborsHeat( Node originalNode ) {
100 for ( NodeCursor cursor = originalNode.neighbors(); cursor.ok(); cursor.next() ) {
102 Node neighbor = cursor.node();
103
104 double oldStress = layouter.getStress( neighbor );
105 layouter.setStress( neighbor, Math.min( 1, oldStress + 0.5 ) );
106 }
107 }
108 }
109