1
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
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