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.layout.tree;
15  
16  import java.awt.Dimension;
17  import java.awt.event.ItemEvent;
18  import java.util.Hashtable;
19  import javax.swing.JLabel;
20  import javax.swing.event.ChangeEvent;
21  import y.base.Node;
22  import y.layout.DefaultLayoutGraph;
23  import y.layout.tree.DefaultNodePlacer;
24  import y.layout.tree.GenericTreeLayouter;
25  import y.layout.tree.NodePlacer;
26  import y.util.DataProviders;
27  
28  /**
29   * Property editor panel used by
30   * {@link demo.view.layout.tree.IncrementalTreeLayouterDemo} 
31   * to provide means for configuring the generic tree layouter.
32   * 
33   */
34  class DefaultNodePlacerConfigPanel extends javax.swing.JPanel
35  {
36    
37    private DefaultNodePlacer placer;
38    
39    /** Creates new form DefaultNodePlacerConfigPanel */
40    public DefaultNodePlacerConfigPanel()
41    {
42      initComponents();
43      DefaultLayoutGraph graph = new DefaultLayoutGraph();
44      Node root = graph.createNode();
45      graph.getNodeLayout(root).setSize(30,30);
46      for (int i = 0; i < 3; i++){
47        Node child = graph.createNode();
48        graph.getNodeLayout(child).setSize(50 - i * 10 ,30);
49        graph.createEdge(root, child);
50      }
51      placer = new DefaultNodePlacer(DefaultNodePlacer.PLACEMENT_HORIZONTAL_DOWNWARD, 40, 40);
52      layoutPreviewPanel.setGraph(graph);
53      layoutPreviewPanel.setPreferredSize(new Dimension(160,160));
54      graph.addDataProvider(GenericTreeLayouter.NODE_PLACER_DPKEY, DataProviders.createConstantDataProvider(placer));
55      layoutPreviewPanel.setLayouter(new GenericTreeLayouter());
56      updateFromPlacer();
57      layoutPreviewPanel.update();
58    }
59    
60    /** This method is called from within the constructor to
61     * initialize the form.
62     * WARNING: Do NOT modify this code. The content of this method is
63     * always regenerated by the Form Editor.
64     */
65    private void initComponents()//GEN-BEGIN:initComponents
66    {
67      java.awt.GridBagConstraints gridBagConstraints;
68  
69      childPlacementLabel = new javax.swing.JLabel();
70      rootAlignmentLabel = new javax.swing.JLabel();
71      alignmentSlider = new javax.swing.JSlider();
72      horizontalSlider = new javax.swing.JSlider();
73      hSpacingLabel = new javax.swing.JLabel();
74      placementComboBox = new javax.swing.JComboBox();
75      verticalSlider = new javax.swing.JSlider();
76      vSpacingLabel = new javax.swing.JLabel();
77      previewPanel = new javax.swing.JPanel();
78      layoutPreviewPanel = new demo.layout.LayoutPreviewPanel();
79      routingStyleLabel = new javax.swing.JLabel();
80      routingStyleComboBox = new javax.swing.JComboBox();
81  
82      setLayout(new java.awt.GridBagLayout());
83  
84      setBorder(new javax.swing.border.EmptyBorder(new java.awt.Insets(6, 6, 6, 6)));
85      childPlacementLabel.setText("Child Placement");
86      gridBagConstraints = new java.awt.GridBagConstraints();
87      gridBagConstraints.anchor = java.awt.GridBagConstraints.SOUTHWEST;
88      add(childPlacementLabel, gridBagConstraints);
89  
90      rootAlignmentLabel.setText("Root Alignment");
91      gridBagConstraints = new java.awt.GridBagConstraints();
92      gridBagConstraints.gridx = 0;
93      gridBagConstraints.gridy = 8;
94      gridBagConstraints.anchor = java.awt.GridBagConstraints.SOUTHWEST;
95      gridBagConstraints.insets = new java.awt.Insets(7, 0, 0, 0);
96      add(rootAlignmentLabel, gridBagConstraints);
97  
98      alignmentSlider.setMaximum(5);
99      alignmentSlider.setMinorTickSpacing(1);
100     alignmentSlider.setPaintLabels(true);
101     alignmentSlider.setPaintTicks(true);
102     alignmentSlider.setSnapToTicks(true);
103     //Create the label table
104     Hashtable labelTable = new Hashtable();
105     labelTable.put( new Integer( 0 ), new JLabel("Leading") );
106     labelTable.put( new Integer( 3 ), new JLabel("Median") );
107     labelTable.put( new Integer( 5 ), new JLabel("Trailing") );
108     alignmentSlider.setLabelTable( labelTable );
109     alignmentSlider.addChangeListener(new javax.swing.event.ChangeListener()
110     {
111       public void stateChanged(javax.swing.event.ChangeEvent evt)
112       {
113         alignmentSliderStateChanged(evt);
114       }
115     });
116 
117     gridBagConstraints = new java.awt.GridBagConstraints();
118     gridBagConstraints.gridx = 0;
119     gridBagConstraints.gridy = 9;
120     gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
121     add(alignmentSlider, gridBagConstraints);
122 
123     horizontalSlider.setMinorTickSpacing(5);
124     horizontalSlider.setPaintTicks(true);
125     horizontalSlider.addChangeListener(new javax.swing.event.ChangeListener()
126     {
127       public void stateChanged(javax.swing.event.ChangeEvent evt)
128       {
129         horizontalSliderStateChanged(evt);
130       }
131     });
132 
133     gridBagConstraints = new java.awt.GridBagConstraints();
134     gridBagConstraints.gridx = 0;
135     gridBagConstraints.gridy = 5;
136     gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
137     add(horizontalSlider, gridBagConstraints);
138 
139     hSpacingLabel.setText("Horizontal Spacing");
140     gridBagConstraints = new java.awt.GridBagConstraints();
141     gridBagConstraints.gridx = 0;
142     gridBagConstraints.gridy = 4;
143     gridBagConstraints.anchor = java.awt.GridBagConstraints.SOUTHWEST;
144     gridBagConstraints.insets = new java.awt.Insets(6, 0, 0, 0);
145     add(hSpacingLabel, gridBagConstraints);
146 
147     placementComboBox.setModel(new javax.swing.DefaultComboBoxModel(new String[] { "Horizontally Downwards", "Horizontally Upwards", "Vertically to Left", "Vertically to Right" }));
148     placementComboBox.addItemListener(new java.awt.event.ItemListener()
149     {
150       public void itemStateChanged(java.awt.event.ItemEvent evt)
151       {
152         placementComboBoxItemStateChanged(evt);
153       }
154     });
155 
156     gridBagConstraints = new java.awt.GridBagConstraints();
157     gridBagConstraints.gridx = 0;
158     gridBagConstraints.gridy = 1;
159     gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
160     gridBagConstraints.insets = new java.awt.Insets(0, 4, 0, 4);
161     add(placementComboBox, gridBagConstraints);
162 
163     verticalSlider.setMinorTickSpacing(5);
164     verticalSlider.setPaintTicks(true);
165     verticalSlider.addChangeListener(new javax.swing.event.ChangeListener()
166     {
167       public void stateChanged(javax.swing.event.ChangeEvent evt)
168       {
169         verticalSliderStateChanged(evt);
170       }
171     });
172 
173     gridBagConstraints = new java.awt.GridBagConstraints();
174     gridBagConstraints.gridx = 0;
175     gridBagConstraints.gridy = 7;
176     gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
177     add(verticalSlider, gridBagConstraints);
178 
179     vSpacingLabel.setText("Vertical Spacing");
180     gridBagConstraints = new java.awt.GridBagConstraints();
181     gridBagConstraints.gridx = 0;
182     gridBagConstraints.gridy = 6;
183     gridBagConstraints.anchor = java.awt.GridBagConstraints.SOUTHWEST;
184     gridBagConstraints.insets = new java.awt.Insets(6, 0, 0, 0);
185     add(vSpacingLabel, gridBagConstraints);
186 
187     previewPanel.setLayout(new java.awt.BorderLayout());
188 
189     previewPanel.setBorder(new javax.swing.border.TitledBorder("Preview"));
190     layoutPreviewPanel.setBackground(new java.awt.Color(255, 255, 255));
191     previewPanel.add(layoutPreviewPanel, java.awt.BorderLayout.CENTER);
192 
193     gridBagConstraints = new java.awt.GridBagConstraints();
194     gridBagConstraints.gridx = 0;
195     gridBagConstraints.gridy = 10;
196     gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH;
197     gridBagConstraints.weightx = 1.0;
198     gridBagConstraints.weighty = 1.0;
199     add(previewPanel, gridBagConstraints);
200 
201     routingStyleLabel.setText("Routing Style");
202     gridBagConstraints = new java.awt.GridBagConstraints();
203     gridBagConstraints.gridx = 0;
204     gridBagConstraints.gridy = 2;
205     gridBagConstraints.anchor = java.awt.GridBagConstraints.SOUTHWEST;
206     gridBagConstraints.insets = new java.awt.Insets(6, 0, 0, 0);
207     add(routingStyleLabel, gridBagConstraints);
208 
209     routingStyleComboBox.setModel(new javax.swing.DefaultComboBoxModel(new String[] { "Fork", "Fork at Root", "Straight Connect", "Poly Line Connect" }));
210     routingStyleComboBox.addItemListener(new java.awt.event.ItemListener()
211     {
212       public void itemStateChanged(java.awt.event.ItemEvent evt)
213       {
214         routingStyleComboBoxItemStateChanged(evt);
215       }
216     });
217 
218     gridBagConstraints = new java.awt.GridBagConstraints();
219     gridBagConstraints.gridx = 0;
220     gridBagConstraints.gridy = 3;
221     gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
222     gridBagConstraints.insets = new java.awt.Insets(0, 4, 0, 5);
223     add(routingStyleComboBox, gridBagConstraints);
224 
225   }//GEN-END:initComponents
226 
227   private void routingStyleComboBoxItemStateChanged(java.awt.event.ItemEvent evt)//GEN-FIRST:event_routingStyleComboBoxItemStateChanged
228   {//GEN-HEADEREND:event_routingStyleComboBoxItemStateChanged
229     if (evt.getStateChange() == ItemEvent.SELECTED){
230       switch (routingStyleComboBox.getSelectedIndex()){
231         case 0:
232           placer.setRoutingStyle(DefaultNodePlacer.ROUTING_FORK);
233           break;
234         case 1:
235           placer.setRoutingStyle(DefaultNodePlacer.ROUTING_FORK_AT_ROOT);
236           break;
237         case 2:
238           placer.setRoutingStyle(DefaultNodePlacer.ROUTING_STRAIGHT);
239           break;
240         case 3:
241           placer.setRoutingStyle(DefaultNodePlacer.ROUTING_POLY_LINE);
242           break;
243       }
244       layoutPreviewPanel.update();
245       fireChangeListenerStateChanged(new ChangeEvent(this));
246     }
247   }//GEN-LAST:event_routingStyleComboBoxItemStateChanged
248 
249   private void verticalSliderStateChanged(javax.swing.event.ChangeEvent evt)//GEN-FIRST:event_verticalSliderStateChanged
250   {//GEN-HEADEREND:event_verticalSliderStateChanged
251     placer.setVerticalDistance(verticalSlider.getValue());
252     layoutPreviewPanel.update();
253     fireChangeListenerStateChanged(new ChangeEvent(this));
254   }//GEN-LAST:event_verticalSliderStateChanged
255 
256   private void horizontalSliderStateChanged(javax.swing.event.ChangeEvent evt)//GEN-FIRST:event_horizontalSliderStateChanged
257   {//GEN-HEADEREND:event_horizontalSliderStateChanged
258     placer.setHorizontalDistance(horizontalSlider.getValue());
259     layoutPreviewPanel.update();
260     fireChangeListenerStateChanged(new ChangeEvent(this));
261   }//GEN-LAST:event_horizontalSliderStateChanged
262 
263   private void alignmentSliderStateChanged(javax.swing.event.ChangeEvent evt)//GEN-FIRST:event_alignmentSliderStateChanged
264   {//GEN-HEADEREND:event_alignmentSliderStateChanged
265     placer.setRootAlignment((byte) alignmentSlider.getValue());
266     layoutPreviewPanel.update();
267     fireChangeListenerStateChanged(new ChangeEvent(this));
268   }//GEN-LAST:event_alignmentSliderStateChanged
269 
270   private void placementComboBoxItemStateChanged(java.awt.event.ItemEvent evt)//GEN-FIRST:event_placementComboBoxItemStateChanged
271   {//GEN-HEADEREND:event_placementComboBoxItemStateChanged
272     if (evt.getStateChange() == ItemEvent.SELECTED){
273       switch (placementComboBox.getSelectedIndex()){
274         case 0:
275           placer.setChildPlacement(DefaultNodePlacer.PLACEMENT_HORIZONTAL_DOWNWARD);
276           break;
277         case 1:
278           placer.setChildPlacement(DefaultNodePlacer.PLACEMENT_HORIZONTAL_UPWARD);
279           break;
280         case 2:
281           placer.setChildPlacement(DefaultNodePlacer.PLACEMENT_VERTICAL_TO_LEFT);
282           break;
283         case 3:
284           placer.setChildPlacement(DefaultNodePlacer.PLACEMENT_VERTICAL_TO_RIGHT);
285           break;
286       }
287       layoutPreviewPanel.update();
288       fireChangeListenerStateChanged(new ChangeEvent(this));
289     }
290   }//GEN-LAST:event_placementComboBoxItemStateChanged
291   
292   public void updateFromPlacer(){
293     switch (placer.getChildPlacement()){
294       case DefaultNodePlacer.PLACEMENT_HORIZONTAL_DOWNWARD:
295         placementComboBox.setSelectedIndex(0);
296         break;
297       case DefaultNodePlacer.PLACEMENT_HORIZONTAL_UPWARD:
298         placementComboBox.setSelectedIndex(1);
299         break;
300       case DefaultNodePlacer.PLACEMENT_VERTICAL_TO_LEFT:
301         placementComboBox.setSelectedIndex(2);
302         break;
303       case DefaultNodePlacer.PLACEMENT_VERTICAL_TO_RIGHT:
304         placementComboBox.setSelectedIndex(3);
305         break;
306     }
307     switch (placer.getRoutingStyle()){
308       case DefaultNodePlacer.ROUTING_FORK:
309         routingStyleComboBox.setSelectedIndex(0);
310         break;
311       case DefaultNodePlacer.ROUTING_FORK_AT_ROOT:
312         routingStyleComboBox.setSelectedIndex(1);
313         break;
314       case DefaultNodePlacer.ROUTING_STRAIGHT:
315         routingStyleComboBox.setSelectedIndex(2);
316         break;
317       case DefaultNodePlacer.ROUTING_POLY_LINE:
318         routingStyleComboBox.setSelectedIndex(3);
319         break;
320     }
321     alignmentSlider.setValue(placer.getRootAlignment());
322     horizontalSlider.setValue((int)placer.getHorizontalDistance());
323     verticalSlider.setValue((int)placer.getVerticalDistance());
324   }
325   
326   public void adoptPlacerValues(NodePlacer fromPlacer){
327     if (fromPlacer instanceof DefaultNodePlacer){
328       DefaultNodePlacer p = (DefaultNodePlacer) fromPlacer;
329       this.placer.setRoutingStyle(p.getRoutingStyle());
330       this.placer.setChildPlacement(p.getChildPlacement());
331       this.placer.setVerticalDistance(p.getVerticalDistance());
332       this.placer.setHorizontalDistance(p.getHorizontalDistance());
333       this.placer.setRootAlignment(p.getRootAlignment());
334       updateFromPlacer();
335     }
336   }
337   
338   public NodePlacer createPlacerCopy(){
339     return (NodePlacer) placer.clone();
340   }
341   
342   /**
343    * Registers ChangeListener to receive events.
344    * @param listener The listener to register.
345    */
346   public synchronized void addChangeListener(javax.swing.event.ChangeListener listener)
347   {
348     if (changeListenerList == null )
349     {
350       changeListenerList = new java.util.ArrayList();
351     }
352     changeListenerList.add(listener);
353   }
354   
355   /**
356    * Removes ChangeListener from the list of listeners.
357    * @param listener The listener to remove.
358    */
359   public synchronized void removeChangeListener(javax.swing.event.ChangeListener listener)
360   {
361     if (changeListenerList != null )
362     {
363       changeListenerList.remove(listener);
364     }
365   }
366   
367   /**
368    * Notifies all registered listeners about the event.
369    *
370    * @param event The event to be fired
371    */
372   private void fireChangeListenerStateChanged(javax.swing.event.ChangeEvent event)
373   {
374     java.util.ArrayList list;
375     synchronized (this)
376     {
377       if (changeListenerList == null) return;
378       list = (java.util.ArrayList)changeListenerList.clone();
379     }
380     for (int i = 0; i < list.size(); i++)
381     {
382       ((javax.swing.event.ChangeListener)list.get(i)).stateChanged(event);
383     }
384   }
385   
386   // Variables declaration - do not modify//GEN-BEGIN:variables
387   private javax.swing.JSlider alignmentSlider;
388   private javax.swing.JLabel childPlacementLabel;
389   private javax.swing.JLabel hSpacingLabel;
390   private javax.swing.JSlider horizontalSlider;
391   private demo.layout.LayoutPreviewPanel layoutPreviewPanel;
392   private javax.swing.JComboBox placementComboBox;
393   private javax.swing.JPanel previewPanel;
394   private javax.swing.JLabel rootAlignmentLabel;
395   private javax.swing.JComboBox routingStyleComboBox;
396   private javax.swing.JLabel routingStyleLabel;
397   private javax.swing.JLabel vSpacingLabel;
398   private javax.swing.JSlider verticalSlider;
399   // End of variables declaration//GEN-END:variables
400 
401   /**
402    * Utility field holding list of ChangeListeners.
403    */
404   private transient java.util.ArrayList changeListenerList;  
405    
406 }
407