1
14 package demo.view.layout.organic;
15
16 import y.algo.Bfs;
17 import y.anim.AnimationFactory;
18 import y.anim.AnimationObject;
19 import y.base.Edge;
20 import y.base.EdgeCursor;
21 import y.base.EdgeList;
22 import y.base.EdgeMap;
23 import y.base.ListCell;
24 import y.base.Node;
25 import y.base.NodeCursor;
26 import y.base.NodeList;
27 import y.base.NodeMap;
28 import y.base.YList;
29 import y.geom.YPoint;
30 import y.util.DefaultMutableValue2D;
31 import y.util.Maps;
32 import y.view.Drawable;
33 import y.view.EdgeRealizer;
34 import y.view.Graph2D;
35 import y.view.NodeRealizer;
36 import y.view.ViewAnimationFactory;
37
38 import javax.swing.SwingUtilities;
39
40
48 public class AnimatedNavigationDemo extends NavigationDemo {
49 private NodeMap hiddenNodesMap;
50 private EdgeMap hiddenEdgesMap;
51
52 public static void main( String[] args ) {
53 initLnF();
54 SwingUtilities.invokeLater( new Runnable() {
55 public void run() {
56 final AnimatedNavigationDemo navigationDemo = new AnimatedNavigationDemo();
57 navigationDemo.start( "Animated Navigation Demo" );
58 navigationDemo.moveFirstNodeToCenter();
59 }
60 } );
61 }
62
63 public AnimatedNavigationDemo() {
64 hiddenNodesMap = view.getGraph2D().createNodeMap();
66 hiddenEdgesMap = view.getGraph2D().createEdgeMap();
67 }
68
69
72 private YList history = new YList();
73
74 protected void moveToCenter( final Node newCenterNode, boolean animated ) {
75 if ( ! SwingUtilities.isEventDispatchThread() ) {
76 throw new IllegalStateException( "not in dispatch thread" );
77 }
78 this.centerNode = newCenterNode;
79
80 layouter.setInertia(newCenterNode, 1);
82 if (history.size() < 4) {
83 history.addFirst( newCenterNode );
84 } else {
85 ListCell lastCell = history.lastCell();
86 layouter.setInertia( ( Node ) lastCell.getInfo(), 0);
88 history.removeCell(lastCell);
89 lastCell.setInfo(newCenterNode);
90 history.addFirstCell(lastCell);
91 }
92
93 NodeList fadeInNodes = new NodeList();
95 NodeList fadeOutNodes = new NodeList();
96 EdgeList fadeInEdges = new EdgeList();
97 EdgeList fadeOutEdges = new EdgeList();
98
99 final EdgeList hiddenEdges = new EdgeList();
101 final NodeList hiddenNodes = new NodeList();
102
103 final Graph2D graph = view.getGraph2D();
104
105 graphHider.unhideAll();
107
108 final int[] data = new int[graph.N()];
111 NodeMap layerMap = Maps.createIndexNodeMap(data);
112 NodeList[] layerLists = Bfs.getLayers(graph, new NodeList(newCenterNode), false, layerMap, 4);
114
115 for (int i = 0; i < Math.min(layerLists.length, 3); i++){
117 for (NodeCursor nc = layerLists[i].nodes(); nc.ok(); nc.next()){
118 final Node node = nc.node();
119 final boolean wasHidden = hiddenNodesMap.getBool(node);
120 if (wasHidden) {
121 fadeInNodes.add(node);
122 }
123 }
124 }
125
126 for (NodeCursor nc = graph.nodes(); nc.ok(); nc.next()){
128 final Node node = nc.node();
129 final boolean wasHidden = hiddenNodesMap.getBool(node);
130 final int layer = layerMap.getInt(node);
131 if (layer >= 0 && layer < 3) {
132 if (wasHidden) {
134 hiddenNodesMap.setBool(node, false);
135 }
136 } else {
137 hiddenNodes.add(node);
138 if (!wasHidden) {
140 fadeOutNodes.add(node);
141 hiddenNodesMap.setBool(node, true);
142 }
143 }
144 }
145
146 for (EdgeCursor ec = graph.edges(); ec.ok(); ec.next()) {
148 final Edge edge = ec.edge();
149 final boolean wasHidden = hiddenEdgesMap.getBool(edge);
150 final boolean shouldBeHidden = hiddenNodesMap.getBool(edge.source()) || hiddenNodesMap.getBool(edge.target());
151 if (shouldBeHidden) {
152 hiddenEdges.add(edge);
153 if (!wasHidden) {
154 fadeOutEdges.add(edge);
155 hiddenEdgesMap.setBool(edge, true);
156 }
157 } else {
158 if (wasHidden) {
159 fadeInEdges.add(edge);
160 hiddenEdgesMap.setBool(edge, false);
161 }
162 }
163 }
164
165
166
167 double x;
169 double y;
170
171 YPoint location = layouter.getCenter( newCenterNode );
173 if ( location != null ) {
174 x = location.getX();
175 y = location.getY();
176 } else { NodeRealizer realizer = view.getGraph2D().getRealizer( newCenterNode );
178 x = realizer.getX();
179 y = realizer.getY();
180 }
181
182 if (animated ) {
183 animateCamera(x, y);
186
187 fadeOutEdges(fadeOutEdges);
189 fadeOutNodes(fadeOutNodes);
190
191 fadeInEdges(fadeInEdges);
193 fadeInNodes(graph, layerMap, fadeInNodes);
194 } else {
195 view.setCenter(x, y);
196 }
197
198 graphHider.hide( hiddenEdges );
200
201 graphHider.hide( hiddenNodes );
203
204 ( ( NavigationDemo )this ).layouter.syncStructure();
206 ( ( NavigationDemo )this ).layouter.wakeUp();
207 }
208
209 private void animateCamera(double x, double y) {
210 AnimationObject animationObject = factory.moveCamera( DefaultMutableValue2D.create( x, y ), PREFERRED_DURATION );
212 AnimationObject easedAnimation = AnimationFactory.createEasedAnimation( animationObject, 0.15, 0.25 );
214 animationPlayer.animate( easedAnimation );
215 }
216
217 private void fadeOutNodes(NodeList fadeOutNodes) {
218 for (NodeCursor nc = fadeOutNodes.nodes(); nc.ok(); nc.next()) {
219 final Node node = nc.node();
220 NodeRealizer realizer = view.getGraph2D().getRealizer( node );
222 final Drawable nodeDrawable = ViewAnimationFactory.createDrawable( realizer );
223 animationPlayer.animate( factory.fadeOut( nodeDrawable, PREFERRED_DURATION ) ); }
225 }
226
227 private void fadeInNodes(Graph2D graph, NodeMap layerMap, NodeList fadeInNodes) {
228 for (NodeCursor nc = fadeInNodes.nodes(); nc.ok(); nc.next()) {
229 final Node node = nc.node();
230
231 final int myLayer = layerMap.getInt(node);
233 double posX = 0;
234 double posY = 0;
235
236 int count = 0;
238 for (NodeCursor nc2 = node.neighbors(); nc2.ok(); nc2.next()) {
239 final Node neighbour = nc2.node();
240 if (layerMap.getInt(neighbour) < myLayer){
241 count++;
242 posX += graph.getCenterX(neighbour);
243 posY += graph.getCenterY(neighbour);
244 }
245 }
246
247 NodeRealizer nodeRealizer = view.getGraph2D().getRealizer( node );
249
250 if (count > 0) {
252 posX /= count;
253 posY /= count;
254 nodeRealizer.setCenter( posX, posY);
257 layouter.setCenter( node, posX, posY );
259 }
260
261 animationPlayer.animate( factory.fadeIn( nodeRealizer, PREFERRED_DURATION ) ); }
264 }
265
266 private void fadeOutEdges(EdgeList fadeOutEdges) {
267 for (EdgeCursor ec = fadeOutEdges.edges(); ec.ok(); ec.next()){
268 final Edge edge = ec.edge();
269 EdgeRealizer realizer = view.getGraph2D().getRealizer( edge );
270 final Drawable edgeDrawable = ViewAnimationFactory.createDrawable( realizer );
271 animationPlayer.animate( factory.fadeOut( edgeDrawable, PREFERRED_DURATION ) ); }
273 }
274
275 private void fadeInEdges(EdgeList fadeInEdges) {
276 for (EdgeCursor ec = fadeInEdges.edges(); ec.ok(); ec.next()){
277 final Edge edge = ec.edge();
278 EdgeRealizer edgeRealizer = view.getGraph2D().getRealizer( edge );
279 animationPlayer.animate( factory.fadeIn( edgeRealizer, PREFERRED_DURATION ) ); }
281 }
282 }
283