1   /****************************************************************************
2    * This demo file is part of yFiles for Java 2.14.
3    * Copyright (c) 2000-2017 by yWorks GmbH, Vor dem Kreuzberg 28,
4    * 72070 Tuebingen, Germany. All rights reserved.
5    * 
6    * yFiles demo files exhibit yFiles for Java functionalities. Any redistribution
7    * of demo files in source code or binary form, with or without
8    * modification, is not permitted.
9    * 
10   * Owners of a valid software license for a yFiles for Java version that this
11   * demo is shipped with are allowed to use the demo source code as basis
12   * for their own yFiles for Java powered applications. Use of such programs is
13   * governed by the rights and conditions as set out in the yFiles for Java
14   * license agreement.
15   * 
16   * THIS SOFTWARE IS PROVIDED ''AS IS'' AND ANY EXPRESS OR IMPLIED
17   * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
18   * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN
19   * NO EVENT SHALL yWorks BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
20   * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
21   * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
22   * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
23   * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
24   * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
25   * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26   *
27   ***************************************************************************/
28  package demo.view.realizer;
29  
30  import demo.view.DemoBase;
31  import demo.view.DemoDefaults;
32  
33  import y.base.GraphEvent;
34  import y.base.GraphListener;
35  import y.base.Node;
36  import y.view.Graph2D;
37  import y.view.NodeRealizer;
38  import y.view.ShapeNodeRealizer;
39  import y.view.ViewMode;
40  import y.io.GraphMLIOHandler;
41  
42  import java.awt.EventQueue;
43  import java.awt.event.MouseEvent;
44  import java.util.Locale;
45  
46  /**
47   * This demo shows how the custom node realizer {@link StateNodeRealizer}
48   * can be used within an application.
49   * The demo allows to create nodes that have different state. 
50   * Additionally it is possible to change the state of a node by either right clicking
51   * or left double clicking on it.
52   * A graph with its custom node realizers can be saved and loaded using the GraphML
53   * format.
54   * @see <a href="http://docs.yworks.com/yfiles/doc/api/index.html#/dguide/mvc_controller#custom_edit_mode" target="_blank">Section User Interaction</a> in the yFiles for Java Developer's Guide
55   */
56  public class StateNodeRealizerDemo extends DemoBase
57  {
58  
59    public StateNodeRealizerDemo()
60    {
61      Graph2D graph = view.getGraph2D();
62  
63      view.addViewMode(new StateChangeViewMode());
64  
65      StateNodeRealizer svr = new StateNodeRealizer();
66      svr.setSize(70,70);
67      svr.setState(StateNodeRealizer.FINAL_STATE);
68      svr.setFillColor(DemoDefaults.DEFAULT_NODE_COLOR);
69      
70      graph.setDefaultNodeRealizer(svr);
71  
72      //for each node that will be created use a reconfigured
73      //default node realizer. 
74      graph.addGraphListener(new GraphListener() {
75        public void onGraphEvent(GraphEvent ev)
76        {
77          if(ev.getType() == GraphEvent.NODE_CREATION)
78          {
79            applyNextState(((Graph2D)ev.getGraph()).getDefaultNodeRealizer());
80          }
81        }
82      });
83  
84      loadGraph( "resource/stateNodeRealizer.graphml" );
85      DemoDefaults.applyFillColor(graph, DemoDefaults.DEFAULT_NODE_COLOR);
86    }
87  
88  
89    protected GraphMLIOHandler createGraphMLIOHandler() {
90      GraphMLIOHandler ioHandler = super.createGraphMLIOHandler();
91      ioHandler.addNodeRealizerSerializer(new StateNodeRealizer.StateNodeRealizerSerializer());
92      return ioHandler;
93    }
94  
95    /**
96     * This method changes state and shape of a StateNodeRealizer.
97     */
98    private void applyNextState(NodeRealizer vr)
99    {
100     if(vr instanceof StateNodeRealizer)
101     {
102       StateNodeRealizer svr = (StateNodeRealizer)vr;
103       switch(svr.getState()) {
104         case StateNodeRealizer.INITIAL_STATE:
105          svr.setState(StateNodeRealizer.TRANSITION_STATE);
106          break;
107         case StateNodeRealizer.TRANSITION_STATE:
108          svr.setState(StateNodeRealizer.FINAL_STATE);
109          break;
110         case StateNodeRealizer.FINAL_STATE:
111          svr.setState(StateNodeRealizer.INITIAL_STATE);
112          break;
113       }
114       if(svr.getShapeType() == ShapeNodeRealizer.ELLIPSE)
115       {
116         svr.setShapeType(StateNodeRealizer.CUSTOM_SHAPE);
117       }
118       else
119       {
120         svr.setShapeType(ShapeNodeRealizer.ELLIPSE);
121       }
122     }
123   }
124 
125   /**
126    * ViewMode that changes state and shape of a node when it
127    * gets right-clicked or double-clicked.
128    */
129   private class StateChangeViewMode extends ViewMode
130   {
131 
132     public void mousePressedRight(double x, double y)
133     {
134       Node hitNode = getHitInfo(x,y).getHitNode();
135       if(hitNode != null)
136       {
137         applyNextState(getGraph2D().getRealizer(hitNode));
138         getGraph2D().updateViews();
139       }
140     }
141 
142     public void mouseClicked(MouseEvent ev)
143     {
144       if(ev.getClickCount() == 2)
145       {
146         double x = translateX(ev.getX());
147         double y = translateY(ev.getY());
148         Node hitNode = getHitInfo(x,y).getHitNode();
149         if(hitNode != null)
150         {
151           applyNextState(getGraph2D().getRealizer(hitNode));
152           getGraph2D().updateViews();
153         }
154       }
155     }
156   }
157 
158 
159   public static void main(String[] args)
160   {
161     EventQueue.invokeLater(new Runnable() {
162       public void run() {
163         Locale.setDefault(Locale.ENGLISH);
164         initLnF();
165         (new StateNodeRealizerDemo()).start();
166       }
167     });
168   }
169 
170 }
171