View Javadoc

1   // Copyright 2004, FreeHEP.
2   package hep.wired.util;
3   
4   import java.util.*;
5   import javax.swing.tree.*;
6   
7   import hep.wired.util.TristateCheckBox.State;
8   
9   /***
10   *
11   * @author Mark Donszelmann
12   * @version $Id: DefaultTristateTreeNode.java 1860 2005-06-08 23:04:05Z duns $
13   */
14  public class DefaultTristateTreeNode extends DefaultMutableTreeNode implements TristateTreeNode {
15      
16      protected boolean included;
17      protected boolean selected;
18  
19      protected boolean valid;
20      protected State state;
21  
22      public DefaultTristateTreeNode(Object data) {
23          this(data, true);
24      }
25      
26      public DefaultTristateTreeNode(Object data, boolean selected) {
27          this(data, selected, true);    
28      }
29      
30      public DefaultTristateTreeNode(Object data, boolean selected, boolean included) {
31          super(data);
32          this.selected = selected;
33          this.included = included;
34          valid = false;
35      }
36      
37      private void invalidate(boolean setIncluded) {
38          if (!setIncluded && !valid) return;
39          valid = false;
40          if (setIncluded) included = true;
41          DefaultTristateTreeNode parent = (DefaultTristateTreeNode)getParent();
42          if (parent != null) parent.invalidate(setIncluded);
43      }
44  
45      private void validate() {
46          if (!valid) {
47              if (included) {
48                  state = selected ? TristateCheckBox.SELECTED : TristateCheckBox.NOT_SELECTED;
49                  for (int i=0; i<getChildCount(); i++) {
50                      TristateTreeNode node = (TristateTreeNode)getChildAt(i);
51                      State childState = node.getState();
52                      if ((childState == TristateCheckBox.SELECTED) && (state == TristateCheckBox.SELECTED)) {
53                          continue;
54                      } else if ((childState == TristateCheckBox.NOT_SELECTED) && (state == TristateCheckBox.NOT_SELECTED)) {
55                          continue;
56                      }
57                      state = TristateCheckBox.DONT_CARE;
58                      break;
59                  }
60              } else {
61                  state =  TristateCheckBox.NOT_SELECTED;
62              }
63              valid = true;
64          }
65      }
66  
67      public State getState() {
68          validate();
69          return state;
70      }
71  
72      public boolean isIncluded() {
73          return included;
74      }
75  
76      public void include(boolean included) {
77          if (this.included != included) {
78              invalidate(included);
79              this.included = included;
80          }
81          
82          // special case when you try to include and no nodes are shown below, we switch on this node.
83          if (included && (getState() == TristateCheckBox.NOT_SELECTED)) {
84              select(true);
85          }
86      }
87      
88      public void setIncluded(boolean included) {
89          if (this.included == included) return;
90          this.included = included;
91          valid = false;
92      }
93      
94      public boolean isSelected() {
95          return selected;
96      }
97  
98      public void select(boolean selected) {
99          if (this.selected == selected) return;
100         this.selected = selected;
101         invalidate(true);
102     }
103 
104     public void setSelected(boolean selected) {
105         if (this.selected == selected) return;
106         this.selected = selected;
107         valid = false;
108     }
109 
110     public void setUserObject(Object obj) {
111         if(obj == this) return;
112 
113         super.setUserObject(obj);
114     }
115 
116     public String toString() {
117         return getClass().getName()+" i:"+included+" s:"+selected+" v:"+valid+" "+getUserObject();
118     }
119 }
120