1   /****************************************************************************
2    **
3    ** This file is part of yFiles-2.6. 
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-2008 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 y.base.Edge;
18  import y.base.Node;
19  import y.view.ArcEdgeRealizer;
20  import y.view.Arrow;
21  import y.view.AutoRotationSliderEdgeLabelModel;
22  import y.view.BridgeCalculator;
23  import y.view.DefaultGraph2DRenderer;
24  import y.view.Drawable;
25  import y.view.EdgeLabel;
26  import y.view.EdgeRealizer;
27  import y.view.Graph2D;
28  import y.view.ImageNodeRealizer;
29  import y.view.InterfacePort;
30  import y.view.LineType;
31  import y.view.NodeLabel;
32  import y.view.NodeRealizer;
33  import y.view.PolyLineEdgeRealizer;
34  import y.view.ShapeNodeRealizer;
35  import y.view.YLabel;
36  
37  import javax.swing.Icon;
38  import javax.swing.ImageIcon;
39  import java.awt.Color;
40  import java.awt.Graphics2D;
41  import java.awt.Rectangle;
42  import java.awt.geom.Ellipse2D;
43  import java.util.Set;
44  
45  /**
46   * Demonstrates visual features and editor behaviour
47   * <ol>
48   *
49   * <li>EdgeLabels that display icons and text
50   *
51   * <li>Rotated Labels
52   *
53   * <li>Auto rotating EdgeLabels
54   *
55   * <li>Transparent colors
56   *
57   * <li>Gradients
58   *
59   * <li>Bridges for crossing PolyLine Edges
60   *
61   * <li>InterfacePorts that display icons. (A port defines the logical
62   * and visual endpoint of and edge path)
63   *
64   * <li>In edit mode you can reposition an edge label by pressing
65   * on it with the left mouse button and then by dragging the label around.
66   * Possible label candidate boxes will appear along the edge. If you release
67   * the mouse button again, the label will snap to the closest of the candidate boxes.
68   *
69   * <li>In edit mode you can interactively change the offsets of edge ports.
70   * Select the edge that should have different ports. A little black dot will
71   * appear at the point where the port has it's logical location.
72   * You can drag the black dot around. By doing so, port candidate boxes
73   * will appear around the connected node. If you release the mouse again the 
74   * port will snap to the closest available port candidate position.
75   *
76   * <li>In edit mode you can create an edge that has non-zero port offsets by
77   * starting edge creation with the shift key pressed down. The point where you press
78   * will become the source port location of the edge. If you have the shift key down
79   * when you finish edge creation (by releasing the mouse over a node) 
80   * that the release point will become the offset of the target port of the edge.
81   *
82   * </ol>
83   */
84  
85  public class VisualFeatureDemo extends DemoBase
86  {
87    public VisualFeatureDemo()
88    {
89      //setup default edge realizer
90  
91      final Graph2D graph = view.getGraph2D();
92      EdgeRealizer er = graph.getDefaultEdgeRealizer();
93  
94      // show bridges
95      ((DefaultGraph2DRenderer) view.getGraph2DRenderer()).setBridgeCalculator(new BridgeCalculator());
96  
97      //setup source arrow drawable
98      Drawable drawable = new Drawable() {
99        public void paint(Graphics2D g) {
100         Color color = g.getColor();
101         g.setColor(Color.yellow);
102         Ellipse2D.Double ellipse = new Ellipse2D.Double(-20, -10, 20, 20);
103         g.fill(ellipse);
104         g.setColor(Color.orange);
105         g.draw(ellipse);
106         g.setColor(Color.black);
107         g.drawString("A", -13, 5);
108         g.setColor(color);
109       }
110 
111       public Rectangle getBounds() {
112         return new Rectangle(-20, -20, 20, 20);
113       }
114     };
115 
116 
117     // and register it
118     er.setSourceArrow(Arrow.addCustomArrow("coolArrow", drawable, 20, 3));
119 
120     //setup target arrow type
121     er.setTargetArrow(Arrow.STANDARD);
122 
123     // choose smooth bends
124     ((PolyLineEdgeRealizer) er).setSmoothedBends(true);
125 
126     // choose a thicker line
127     er.setLineType(LineType.LINE_2);
128 
129     Icon icon;
130     //setup edge label
131     EdgeLabel label = er.getLabel();
132     label.setText("What should I say?");
133     icon = new ImageIcon(getClass().getResource("resource/about24.gif"));
134     label.setIcon(icon);
135 
136     //setup visual source port 
137     icon = new ImageIcon(getClass().getResource("resource/info24.gif"));
138     InterfacePort p = new InterfacePort();
139     p.setIcon(icon);
140     er.setSourcePort(p);
141 
142     //setup visual target port
143     icon = new ImageIcon(getClass().getResource("resource/home16.gif"));
144     p = new InterfacePort();
145     p.setIcon(icon);
146     er.setTargetPort(p);
147 
148     //setup default node
149     ShapeNodeRealizer nodeRealizer = new ShapeNodeRealizer();
150     nodeRealizer.setShapeType(ShapeNodeRealizer.OCTAGON);
151     // configure a drop shadow
152     nodeRealizer.setDropShadowColor(new Color(0,0,0,64));
153     nodeRealizer.setDropShadowOffsetX((byte)5);
154     nodeRealizer.setDropShadowOffsetY((byte)5);
155     // and default size
156     nodeRealizer.setSize(80,80);
157     graph.setDefaultNodeRealizer(nodeRealizer);
158 
159     // display an ImageNodeRealizer
160     ImageNodeRealizer imageNodeRealizer = new ImageNodeRealizer();
161     imageNodeRealizer.setImageURL(getClass().getResource("/demo/view/ports/resource/4pkt.gif"));
162     // clip on the visual bounds
163     imageNodeRealizer.setAlphaImageUsed(true);
164     imageNodeRealizer.setCenter(300, 340);
165     imageNodeRealizer.setToImageSize();
166 
167     // create sample nodes
168     final Node node1 = graph.createNode(imageNodeRealizer);
169     final Node node2 = graph.createNode(50, 50);
170 
171     // and a sample edge
172     final Edge edge = graph.createEdge(node1, node2);
173     graph.getRealizer(edge).appendBend(200, 70);
174 
175     // reconfigure the default NodeRealizer
176     nodeRealizer.setShapeType(ShapeNodeRealizer.ELLIPSE);
177     final NodeLabel nodeLabel = nodeRealizer.createNodeLabel();
178     nodeLabel.setText("<html>Hello <b>world</b>!</html>");
179     nodeRealizer.addLabel(nodeLabel);
180     nodeLabel.setModel(NodeLabel.SANDWICH);
181     nodeLabel.setPosition(NodeLabel.S);
182     final Node node3 = graph.createNode(350, 50);
183     nodeRealizer.setFillColor(Color.yellow);
184     final Node node4 = graph.createNode(50, 200);
185 
186     final NodeRealizer node4Realizer = graph.getRealizer(node4);
187     node4Realizer.setSize(100, 100);
188     node4Realizer.setFillColor2(Color.red);
189     final NodeLabel node4Label = node4Realizer.getLabel();
190     node4Label.setText("Whoohoo! Transparency! and automatically cropped text for custom label size!.");
191 
192     Set configurations = NodeLabel.getFactory().getAvailableConfigurations();
193     // set a custom configuration for the label
194     if (configurations.contains("CroppingLabel")){
195       node4Label.setConfiguration("CroppingLabel");
196       node4Label.setAutoSizePolicy(YLabel.AUTOSIZE_NONE);
197       node4Label.setContentSize(85, 60);
198     }
199 
200     node4Label.setRotationAngle(45);
201     node4Label.setBackgroundColor(new Color(255, 255, 255, 128));
202     node4Label.setLineColor(Color.GRAY);
203 
204     // add an edge
205     final ArcEdgeRealizer arcEdgeRealizer = new ArcEdgeRealizer();
206     arcEdgeRealizer.setTargetArrow(Arrow.STANDARD);
207     arcEdgeRealizer.setLineType(LineType.DOTTED_2);
208     graph.createEdge(node3, node4, arcEdgeRealizer);
209 
210     // add another edge
211     final PolyLineEdgeRealizer polyLineEdgeRealizer = new PolyLineEdgeRealizer();
212     // set a custom target arrow - clip the edge at the target side by 10 pixels
213     polyLineEdgeRealizer.setTargetArrow(Arrow.addCustomArrow("offsetArrow", Arrow.WHITE_DELTA, 10));
214     polyLineEdgeRealizer.setLineType(LineType.DASHED_1);
215     // add an auto rotating label
216     final EdgeLabel polyLineLabel = polyLineEdgeRealizer.getLabel();
217     final AutoRotationSliderEdgeLabelModel labelModel = new AutoRotationSliderEdgeLabelModel();
218     labelModel.setDistance(-15);
219     polyLineLabel.setText("PolyLine Label");
220 
221     polyLineLabel.setLabelModel(labelModel);
222     polyLineLabel.setModelParameter(labelModel.getDefaultParameter());
223 
224     graph.createEdge(node4, node3, polyLineEdgeRealizer);
225   }
226 
227   public static void main(String args[])
228   {
229     initLnF();
230     VisualFeatureDemo demo = new VisualFeatureDemo();
231     demo.start("Visual  Feature Demo");
232   }
233 }
234 
235 
236       
237