1   /****************************************************************************
2    **
3    ** This file is part of yFiles-2.9. 
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-2011 by yWorks GmbH, Vor dem Kreuzberg 28, 
11   ** 72070 Tuebingen, Germany. All rights reserved.
12   **
13   ***************************************************************************/
14  package demo.view.realizer;
15  
16  import demo.view.DemoBase;
17  import demo.view.DemoDefaults;
18  
19  import y.base.GraphEvent;
20  import y.base.GraphListener;
21  import y.base.Node;
22  import y.view.Graph2D;
23  import y.view.NodeRealizer;
24  import y.view.ShapeNodeRealizer;
25  import y.view.ViewMode;
26  import y.io.GraphMLIOHandler;
27  
28  import java.awt.EventQueue;
29  import java.awt.event.MouseEvent;
30  import java.util.Locale;
31  
32  /**
33   * This demo shows how the custom node realizer {@link StateNodeRealizer}
34   * can be used within an application.
35   * The demo allows to create nodes that have different state. 
36   * Additionally it is possible to change the state of a node by either right clicking
37   * or left double clicking on it.
38   * A graph with its custom node realizers can be saved and loaded using the GraphML
39   * format.
40   * @see <a href="http://docs.yworks.com/yfiles/doc/developers-guide/mvc_controller.html#custom_edit_mode">Section User Interaction</a> in the yFiles for Java Developer's Guide
41   */
42  public class StateNodeRealizerDemo extends DemoBase
43  {
44  
45    public StateNodeRealizerDemo()
46    {
47      Graph2D graph = view.getGraph2D();
48  
49      view.addViewMode(new StateChangeViewMode());
50  
51      StateNodeRealizer svr = new StateNodeRealizer();
52      svr.setSize(70,70);
53      svr.setState(StateNodeRealizer.FINAL_STATE);
54      svr.setFillColor(DemoDefaults.DEFAULT_NODE_COLOR);
55      
56      graph.setDefaultNodeRealizer(svr);
57  
58      //for each node that will be created use a reconfigured
59      //default node realizer. 
60      graph.addGraphListener(new GraphListener() {
61        public void onGraphEvent(GraphEvent ev)
62        {
63          if(ev.getType() == GraphEvent.NODE_CREATION)
64          {
65            applyNextState(((Graph2D)ev.getGraph()).getDefaultNodeRealizer());
66          }
67        }
68      });
69  
70      loadGraph( "resource/stateNodeRealizer.graphml" );
71      DemoDefaults.applyFillColor(graph, DemoDefaults.DEFAULT_NODE_COLOR);
72    }
73  
74  
75    protected GraphMLIOHandler createGraphMLIOHandler() {
76      GraphMLIOHandler ioHandler = super.createGraphMLIOHandler();
77      ioHandler.addNodeRealizerSerializer(new StateNodeRealizer.StateNodeRealizerSerializer());
78      return ioHandler;
79    }
80  
81    /**
82     * This method changes state and shape of a StateNodeRealizer.
83     */
84    private void applyNextState(NodeRealizer vr)
85    {
86      if(vr instanceof StateNodeRealizer)
87      {
88        StateNodeRealizer svr = (StateNodeRealizer)vr;
89        switch(svr.getState()) {
90          case StateNodeRealizer.INITIAL_STATE:
91           svr.setState(StateNodeRealizer.TRANSITION_STATE);
92           break;
93          case StateNodeRealizer.TRANSITION_STATE:
94           svr.setState(StateNodeRealizer.FINAL_STATE);
95           break;
96          case StateNodeRealizer.FINAL_STATE:
97           svr.setState(StateNodeRealizer.INITIAL_STATE);
98           break;
99        }
100       if(svr.getShapeType() == ShapeNodeRealizer.ELLIPSE)
101       {
102         svr.setShapeType(StateNodeRealizer.CUSTOM_SHAPE);
103       }
104       else
105       {
106         svr.setShapeType(ShapeNodeRealizer.ELLIPSE);
107       }
108     }
109   }
110 
111   /**
112    * ViewMode that changes state and shape of a node when it
113    * gets right-clicked or double-clicked.
114    */
115   private class StateChangeViewMode extends ViewMode
116   {
117 
118     public void mousePressedRight(double x, double y)
119     {
120       Node hitNode = getHitInfo(x,y).getHitNode();
121       if(hitNode != null)
122       {
123         applyNextState(getGraph2D().getRealizer(hitNode));
124         getGraph2D().updateViews();
125       }
126     }
127 
128     public void mouseClicked(MouseEvent ev)
129     {
130       if(ev.getClickCount() == 2)
131       {
132         double x = translateX(ev.getX());
133         double y = translateY(ev.getY());
134         Node hitNode = getHitInfo(x,y).getHitNode();
135         if(hitNode != null)
136         {
137           applyNextState(getGraph2D().getRealizer(hitNode));
138           getGraph2D().updateViews();
139         }
140       }
141     }
142   }
143 
144 
145   public static void main(String[] args)
146   {
147     EventQueue.invokeLater(new Runnable() {
148       public void run() {
149         Locale.setDefault(Locale.ENGLISH);
150         initLnF();
151         (new StateNodeRealizerDemo()).start();
152       }
153     });
154   }
155 
156 }
157