1
28 package demo.layout.tree;
29
30 import y.base.Node;
31 import y.base.NodeCursor;
32 import y.base.NodeMap;
33 import y.layout.tree.ARNodePlacer;
34 import y.layout.tree.AbstractRotatableNodePlacer.Matrix;
35 import y.layout.tree.AbstractRotatableNodePlacer.RootAlignment;
36 import y.layout.tree.AssistantPlacer;
37 import y.layout.tree.DoubleLinePlacer;
38 import y.layout.tree.LeftRightPlacer;
39 import y.layout.tree.NodePlacer;
40 import y.layout.tree.SimpleNodePlacer;
41 import y.view.Arrow;
42 import y.view.EdgeRealizer;
43 import y.view.Graph2D;
44 import y.view.LineType;
45 import y.view.PolyLineEdgeRealizer;
46 import y.view.PopupMode;
47
48 import javax.swing.JCheckBoxMenuItem;
49 import javax.swing.JMenu;
50 import javax.swing.JPopupMenu;
51 import java.awt.EventQueue;
52 import java.awt.event.ActionEvent;
53 import java.awt.event.ActionListener;
54 import java.util.Locale;
55
56
78 public class AssistantPlacerDemo extends AbstractTreeDemo {
79 public static void main(String[] args) {
80 EventQueue.invokeLater(new Runnable() {
81 public void run() {
82 Locale.setDefault(Locale.ENGLISH);
83 initLnF();
84 (new AssistantPlacerDemo()).start("Assistant Placer Demo");
85 }
86 });
87 }
88
89 private NodeMap isAssistantNodeMap;
90
91 public AssistantPlacerDemo() {
92 Graph2D graph = view.getGraph2D();
93
94 isAssistantNodeMap = graph.createNodeMap();
95 graph.addDataProvider( AssistantPlacer.ASSISTANT_DPKEY, isAssistantNodeMap );
96 graph.addDataProvider(LeftRightPlacer.LEFT_RIGHT_DPKEY, new LeftRightPlacer.LeftRightDataProvider(nodePlacerMap));
97
98 EdgeRealizer defaultER = graph.getDefaultEdgeRealizer();
100 defaultER.setArrow( Arrow.STANDARD );
101 ( ( PolyLineEdgeRealizer ) defaultER ).setSmoothedBends( true );
102 defaultER.setLineType( LineType.LINE_2 );
103
104 createSampleGraph( view.getGraph2D() );
105 calcLayout();
106 }
107
108 protected NodePlacer createDefaultNodePlacer() {
109 return new AssistantPlacer();
110 }
111
112 protected boolean isDeletionEnabled() {
113 return false;
114 }
115
116 protected boolean isClipboardEnabled() {
117 return false;
118 }
119
120 private void createSampleGraph( Graph2D graph ) {
121 graph.clear();
122 Node root = graph.createNode();
123 graph.getRealizer( root ).setFillColor( layerColors[ 0 ] );
124 nodePlacerMap.set( root, new AssistantPlacer() );
125 createChildren( graph, root, 6, 1, 1 );
126 calcLayout();
127 view.fitContent();
128 }
129
130 private void createChildren( Graph2D graph, Node root, int children, int layer, int layers ) {
131 for ( int i = 0; i < children; i++ ) {
132 Node child = graph.createNode();
133 graph.createEdge( root, child );
134 graph.getRealizer( child ).setFillColor( layerColors[ layer % layerColors.length ] );
135
136 if ( i % 3 == 0 ) {
137 isAssistantNodeMap.setBool(child, true);
138 }
139 NodePlacer nodePlacer = new AssistantPlacer();
140 nodePlacerMap.set( child, nodePlacer );
141 if ( layers > 0 ) {
142 createChildren( graph, child, children, layer + 1, layers - 1 );
143 }
144 }
145 }
146
147 protected PopupMode createTreePopupMode() {
148 return new TreeLayouterPopupMode();
149 }
150
151 private final class TreeLayouterPopupMode extends PopupMode {
152 private JPopupMenu nodePlacementMenu;
153 private JCheckBoxMenuItem checkbox;
154
155 TreeLayouterPopupMode() {
156 nodePlacementMenu = new JPopupMenu();
157
158 checkbox = new JCheckBoxMenuItem( "Assistant" );
159 nodePlacementMenu.add( checkbox );
160
161 checkbox.addActionListener( new ActionListener() {
162 public void actionPerformed( ActionEvent e ) {
163 for ( NodeCursor nodeCursor = getGraph2D().selectedNodes(); nodeCursor.ok(); nodeCursor.next() ) {
164 Node node = nodeCursor.node();
165 isAssistantNodeMap.setBool( node, checkbox.isSelected() );
166 }
167 calcLayout();
168 }
169 } );
170
171 nodePlacementMenu.addSeparator();
172
173 JMenu childPlacer = new JMenu( "Child NodePlacers" );
174 nodePlacementMenu.add( childPlacer );
175
176 childPlacer.add( new SetNodePlacerAction( "Default" ) {
177 protected NodePlacer createNodePlacer() {
178 AssistantPlacer assistantPlacer = new AssistantPlacer();
179 assistantPlacer.setChildNodePlacer( new SimpleNodePlacer( Matrix.DEFAULT, RootAlignment.CENTER ) );
180 return assistantPlacer;
181 }
182 } );
183
184 childPlacer.add( new SetNodePlacerAction( "Double Line" ) {
185 protected NodePlacer createNodePlacer() {
186 AssistantPlacer assistantPlacer = new AssistantPlacer();
187 assistantPlacer.setChildNodePlacer( new DoubleLinePlacer( Matrix.DEFAULT ) );
188 return assistantPlacer;
189 }
190 } );
191
192 childPlacer.add( new SetNodePlacerAction( "ARNodePlacer" ) {
193 protected NodePlacer createNodePlacer() {
194 AssistantPlacer assistantPlacer = new AssistantPlacer();
195 assistantPlacer.setChildNodePlacer( new ARNodePlacer());
196 return assistantPlacer;
197 }
198 } );
199 }
200
201 public JPopupMenu getNodePopup( final Node v ) {
202 checkbox.setSelected( isAssistantNodeMap.getBool( v ) );
203 return nodePlacementMenu;
204 }
205
206 private void updateSelectionState() {
207 checkbox.setSelected( false );
209 for ( NodeCursor nodeCursor = getGraph2D().selectedNodes(); nodeCursor.ok(); nodeCursor.next() ) {
210 Node node = nodeCursor.node();
211 if ( isAssistantNodeMap.getBool( node ) ) {
212 checkbox.setSelected( true );
213 break;
214 }
215 }
216 }
217
218 public JPopupMenu getSelectionPopup( double x, double y ) {
219 if ( getGraph2D().selectedNodes().ok() ) {
220 updateSelectionState();
221 return nodePlacementMenu;
222 } else {
223 return null;
224 }
225 }
226 }
227 }
228