1
2 package hep.wired.util;
3
4 import java.awt.*;
5 import java.awt.event.*;
6 import java.util.*;
7 import javax.swing.*;
8 import javax.swing.event.*;
9 import javax.swing.tree.*;
10
11 import hep.wired.util.TristateCheckBox.State;
12
13 /***
14 *
15 * @author Mark Donszelmann
16 * @version $Id: TristateTreeCellEditor.java 1860 2005-06-08 23:04:05Z duns $
17 */
18 public class TristateTreeCellEditor extends TristateTreeCellRenderer implements TreeCellEditor {
19
20 private boolean select;
21 private boolean local;
22 protected CellEditorListener list;
23
24 public TristateTreeCellEditor(JTree tree) {
25 this(tree, new NoIconTreeCellRenderer());
26 }
27
28 public TristateTreeCellEditor(JTree tree, TreeCellRenderer renderer) {
29
30 super(tree, renderer);
31
32 tristate.addActionListener(new ActionListener() {
33 public void actionPerformed(ActionEvent event) {
34 local = false;
35 select = false;
36 fireEditingStopped();
37 }
38 });
39
40 check.addActionListener(new ActionListener() {
41 public void actionPerformed(ActionEvent event) {
42 local = true;
43 select = false;
44 fireEditingStopped();
45 }
46 });
47 }
48
49 public Component getTreeCellEditorComponent(JTree tree, Object value,
50 boolean selected,
51 boolean expanded,
52 boolean leaf, int row) {
53 return getTreeCellRendererComponent(tree, value, true, expanded,
54 leaf, row, true);
55 }
56
57 public boolean stopCellEditing() {
58 return true;
59 }
60
61 public Object getCellEditorValue() {
62 if (!select && (node instanceof TristateTreeNode)) {
63 TristateTreeNode treeNode = (TristateTreeNode)node;
64 if (local) {
65 treeNode.select(check.isSelected());
66 } else {
67 treeNode.include(treeNode.getState() == TristateCheckBox.NOT_SELECTED);
68 }
69 }
70 select = true;
71 return node;
72 }
73
74 public boolean isCellEditable(EventObject event) {
75 return true;
76 }
77
78 public boolean shouldSelectCell(EventObject event) {
79 return true;
80 }
81
82 public void cancelCellEditing() {
83 fireEditingCanceled();
84 }
85
86 public void addCellEditorListener(CellEditorListener listener) {
87 list = SwingEventMulticaster.add(list, listener);
88 }
89
90 public void removeCellEditorListener(CellEditorListener listener) {
91 list = SwingEventMulticaster.remove(list, listener);
92 }
93
94 protected void fireEditingStopped() {
95 if(list != null) {
96 list.editingStopped(new ChangeEvent(this));
97 }
98 }
99
100 protected void fireEditingCanceled() {
101 if(list != null) {
102 list.editingCanceled(new ChangeEvent(this));
103 }
104 }
105
106 }