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;
15  
16  import y.base.Node;
17  import y.view.Arrow;
18  import y.view.EdgeLabel;
19  import y.view.EditMode;
20  import y.view.EdgeRealizer;
21  import y.view.Graph2D;
22  import y.view.Graph2DView;
23  import y.view.ImageNodeRealizer;
24  import y.view.NodeLabel;
25  import y.view.NodeRealizer;
26  import y.view.ShapeNodeRealizer;
27  import y.view.SmartEdgeLabelModel;
28  import y.view.SmartNodeLabelModel;
29  
30  import java.awt.BorderLayout;
31  import java.awt.EventQueue;
32  import javax.swing.JFrame;
33  import javax.swing.JPanel;
34  import javax.swing.JRootPane;
35  
36  /**
37   * <p>
38   *  Demonstrates simple usage of {@link Graph2DView}, {@link Graph2D}
39   *  and {@link EditMode}.
40   * </p>
41   * <p>
42   *  This demo creates an initial graph by adding nodes and edges
43   *  to the {@link Graph2D} displayed by the main {@link Graph2DView}
44   *  view using API calls. It further shows how some graphical node
45   *  and edge properties can be set (see {@link #buildGraph()}).
46   * </p>
47   * <p>
48   *  Additionally it is shown how the appearance of the default nodes
49   *  and edges can be set (see {@link #configureDefaultRealizers()}).
50   *  This applies to new nodes and edges added to the initial graph.
51   *  Editing the initial graph is possible due to the {@link EditMode}
52   *  added to the view.
53   * </p>
54   *
55   * @see <a href="http://docs.yworks.com/yfiles/doc/developers-guide/base.html#Creating%20Graphs%20and%20Graph%20Elements">Section Creating Graphs and Graph Elements</a> in the yFiles for Java Developer's Guide
56   * @see <a href="http://docs.yworks.com/yfiles/doc/developers-guide/mvc_view.html">Section View Implementations</a> in the yFiles for Java Developer's Guide
57   * @see <a href="http://docs.yworks.com/yfiles/doc/developers-guide/realizer_related.html">Section Realizer-Related Features</a> in the yFiles for Java Developer's Guide
58   * @see <a href="http://docs.yworks.com/yfiles/doc/developers-guide/realizers.html">Section Bringing Graph Elements to Life: The Realizer Concept</a> in the yFiles for Java Developer's Guide
59   */
60  public class BuildGraphDemo extends JPanel 
61  {
62    Graph2DView view;
63    
64    public BuildGraphDemo()
65    {
66      setLayout(new BorderLayout());  
67      view = new Graph2DView();
68      EditMode mode = new EditMode();
69      view.addViewMode(mode);
70      add(view);
71  
72      configureDefaultRealizers();
73      buildGraph();
74    }
75    
76    protected void configureDefaultRealizers()
77    {
78      Graph2D graph = view.getGraph2D();
79  
80      //change the looks of the default edge 
81      EdgeRealizer er = graph.getDefaultEdgeRealizer();
82      //a standard (target) arrow
83      er.setArrow(Arrow.STANDARD); 
84  
85      //change the looks (and type) of the default node
86      ShapeNodeRealizer snr = new ShapeNodeRealizer(ShapeNodeRealizer.ROUND_RECT);
87      snr.setSize(80, 30);
88      snr.setFillColor(DemoDefaults.DEFAULT_NODE_COLOR);
89      NodeLabel label = snr.getLabel();
90      SmartNodeLabelModel model = new SmartNodeLabelModel();
91      label.setLabelModel(model);
92      label.setModelParameter(model.getDefaultParameter());
93  
94      //use it as default node realizer
95      graph.setDefaultNodeRealizer(snr);
96    }
97  
98    void buildGraph()
99    {
100     Graph2D graph = view.getGraph2D();
101     
102     //register an image with ImageNodeRealizer.
103     //must be a path name relative to your java CLASSPATH.
104     ImageNodeRealizer inr = new ImageNodeRealizer();
105     //set the image
106     inr.setImageURL(getClass().getResource("resource/yicon.png"));
107     //set node size equals to half of original image size
108     inr.setToImageSize();
109     inr.setSize(inr.getWidth()/2, inr.getHeight()/2);
110     inr.setLocation(60, 200);
111     //set a label text
112     inr.setLabelText("yFiles");
113 
114     // set the label model to be a SmartNodeLabelModel
115     // (free label placement with snapping to significant positions)
116     // with an initial position south of the node
117     SmartNodeLabelModel labelModel = new SmartNodeLabelModel();
118     NodeLabel nodeLabel = inr.getLabel();
119     nodeLabel.setLabelModel(labelModel);
120     nodeLabel.setModelParameter(labelModel.createDiscreteModelParameter(SmartNodeLabelModel.POSITION_SOUTH));
121 
122     //create a node that displays the image
123     Node v = graph.createNode(inr);
124 
125 
126 
127     //create some edges and new nodes
128     for (int i = 0; i < 5; i++) {
129       Node w = graph.createNode();
130 
131       //customize position and label of the created node
132       NodeRealizer nr = graph.getRealizer(w);
133       nr.setLocation(300, 100 + i*50);
134       nr.setLabelText("Node " + (i+1));
135 
136       graph.createEdge(v, w);
137 
138       //decorations for the created edge
139       EdgeRealizer er = graph.getRealizer(graph.lastEdge());
140       if (i % 2 == 0) {
141         //set diamond source arrow
142         er.setSourceArrow(Arrow.WHITE_DIAMOND);
143       } else {
144         //a label for the edge
145         EdgeLabel edgeLabel = er.getLabel();
146         edgeLabel.setText("Edge " + (i + 1));
147         SmartEdgeLabelModel model = new SmartEdgeLabelModel();
148         model.setDefaultDistance(2);
149         model.setAutoRotationEnabled(true);
150         edgeLabel.setLabelModel(model);
151         int pos = ((i+1) % 4) == 0
152                   ? SmartEdgeLabelModel.POSITION_RIGHT
153                   : SmartEdgeLabelModel.POSITION_LEFT;
154         edgeLabel.setModelParameter(model.createDiscreteModelParameter(pos));
155       }
156     }
157   }
158 
159   public void start()
160   {
161     JFrame frame = new JFrame(getClass().getName());
162     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
163     addContentTo(frame.getRootPane());
164     frame.pack();
165     frame.setLocationRelativeTo(null);
166     frame.setVisible(true);
167   }
168 
169   public final void addContentTo( final JRootPane rootPane )
170   {
171     rootPane.setContentPane(this);
172   }
173 
174   public static void main(String[] args) {
175     EventQueue.invokeLater(new Runnable() {
176       public void run() {
177         (new BuildGraphDemo()).start();
178       }
179     });
180   }
181 }
182