View Javadoc

1   // Copyright 2005, FreeHEP.
2   package hep.wired.heprep.tree;
3   
4   import java.awt.*;
5   import java.awt.event.*;
6   import java.util.*;
7   import java.util.List;
8   import javax.swing.*;
9   import javax.swing.event.*;
10  import javax.swing.tree.*;
11  
12  import hep.graphics.heprep.HepRep;
13  import hep.graphics.heprep.HepRepType;
14  
15  import hep.wired.util.TristateTreeNode;
16  
17  import hep.wired.heprep.util.WiredHepRepUtil;
18  
19  /***
20   * TreePanelModel.
21   *
22   * @author Mark Donszelmann
23   * @version $Id: TreePanelModel.java 2115 2005-07-25 05:33:47Z duns $
24   */
25  public class TreePanelModel {
26  
27      private TypeTristateTreeModel typeTreeModel;
28      private TreeModelListener typeTreeModelListener;
29      private ButtonModel applyModel;
30      private ButtonModel applyImmediatelyModel;
31      private ButtonModel hideModel;
32      private SpinnerNumberModel hideLevelModel;
33  
34      private List/*<List<String>>*/ expandedTypeNames;
35  
36      private List listeners;
37  
38      public TreePanelModel() {
39          
40          applyImmediatelyModel = new JToggleButton.ToggleButtonModel();
41          applyImmediatelyModel.addActionListener(new ActionListener() {
42              public void actionPerformed(ActionEvent event) {
43                  fireChangeEvent(false);
44              }
45          });
46          applyImmediatelyModel.setSelected(true);
47  
48          applyModel = new DefaultButtonModel();
49          applyModel.addActionListener(new ActionListener() {
50              public void actionPerformed(ActionEvent event) {
51                  fireChangeEvent(true);
52              }
53          });
54          applyModel.setEnabled(false);
55  
56          hideModel = new JToggleButton.ToggleButtonModel();
57          hideModel.addActionListener(new ActionListener() {
58              public void actionPerformed(ActionEvent event) {
59                  updateTypeTreeDepth();
60                  fireChangeEvent(false);
61              }
62          });
63          hideModel.setSelected(false);
64         
65          hideLevelModel = new SpinnerNumberModel(1, 1, 1, 1);
66          hideLevelModel.addChangeListener(new ChangeListener() {
67              public void stateChanged(ChangeEvent event) {
68                  updateTypeTreeDepth();
69                  fireChangeEvent(false);
70              }
71          });
72  
73          typeTreeModelListener = new TreeModelListener() {
74              public void treeNodesChanged(TreeModelEvent e) {
75                  fireChangeEvent(false);
76              }
77              
78              public void treeNodesInserted(TreeModelEvent e) {}
79              public void treeNodesRemoved(TreeModelEvent e) {} 
80              public void treeStructureChanged(TreeModelEvent e) {}
81          };
82          
83          expandedTypeNames = new ArrayList(100);
84          
85          listeners = new ArrayList(5);
86      }
87      
88      public void addChangeListener(ChangeListener listener) {
89          listeners.add(listener);
90      }
91      
92      public void removeChangeListener(ChangeListener listener) {
93          listeners.remove(listener);
94      }
95       
96      public void setHepRep(HepRep heprep) {
97          // remove listener
98          if (typeTreeModel != null) {
99              typeTreeModel.removeTreeModelListener(typeTreeModelListener);
100         }
101 
102         // Create the new typeTreeModel from the old one
103         typeTreeModel = WiredHepRepUtil.copyTypeTree(typeTreeModel, heprep);
104                    
105         // add new listener
106         typeTreeModel.addTreeModelListener(typeTreeModelListener);
107         
108         // set other GUI parts
109         int maxDepth = typeTreeModel.getMaximumDepth();
110         hideLevelModel.setMaximum(new Integer(maxDepth));
111         hideLevelModel.setValue(new Integer(maxDepth));
112     }
113 
114     private void updateTypeTreeDepth() {
115         if (typeTreeModel == null) return;
116         typeTreeModel.setMaximumDepth(hideModel.isSelected() ? hideLevelModel.getNumber().intValue() 
117                                                              : Integer.MAX_VALUE);
118     }
119     
120     public void fireChangeEvent(boolean force) {
121         if (applyImmediatelyModel.isSelected() || force) {
122             for (Iterator i=listeners.iterator(); i.hasNext(); ) {
123                 ChangeEvent event = new ChangeEvent(this);
124                 ((ChangeListener)i.next()).stateChanged(event);
125             }     
126         }
127     }   
128 
129     public TypeTristateTreeModel getTypeTreeModel() {
130         return typeTreeModel;
131     }
132     
133     public ButtonModel getApplyModel() {
134         return applyModel;
135     }
136     
137     public ButtonModel getApplyImmediatelyModel() {
138         return applyImmediatelyModel;
139     }
140     
141     public ButtonModel getHideModel() {
142         return hideModel;
143     }
144     
145     public SpinnerNumberModel getHideLevelModel() {
146         return hideLevelModel;
147     }
148     
149     public int getMaxDepth() {
150         return hideModel.isSelected() ? hideLevelModel.getNumber().intValue() : Integer.MAX_VALUE;
151     }
152 
153     public Set/*<HepRepType>*/ getSelectedTypes() {
154         return typeTreeModel.getSelectedSet(HepRepType.class, getMaxDepth());
155     }
156     
157     public void setExpandedTypeNames(List/*<List<String>>*/ expandedTypeNames) {
158         this.expandedTypeNames = expandedTypeNames;
159     }
160     
161     public List/*<List<String>>*/ getExpandedTypeNames() {
162         return expandedTypeNames;
163     }
164 }