KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > mondrian > gui > JTreeUpdater


1 /*
2 // $Id: //open/mondrian/src/main/mondrian/gui/JTreeUpdater.java#5 $
3 // This software is subject to the terms of the Common Public License
4 // Agreement, available at the following URL:
5 // http://www.opensource.org/licenses/cpl.html.
6 // Copyright (C) 2006-2007 Julian Hyde and others
7 // All Rights Reserved.
8 // You must accept the terms of that agreement to use this software.
9 */

10 package mondrian.gui;
11
12 import javax.swing.*;
13 import javax.swing.event.TreeExpansionEvent JavaDoc;
14 import javax.swing.event.TreeExpansionListener JavaDoc;
15 import javax.swing.event.TreeSelectionEvent JavaDoc;
16 import javax.swing.event.TreeSelectionListener JavaDoc;
17 import javax.swing.tree.DefaultTreeModel JavaDoc;
18 import javax.swing.tree.TreePath JavaDoc;
19 import java.util.HashSet JavaDoc;
20 import java.util.Iterator JavaDoc;
21 import java.util.Set JavaDoc;
22
23 /**
24  * Helper to enable update the tree and keep expanded nodes expanded after
25  * reloading the tree.
26  *
27  * @author erik
28  * @version $Id: //open/mondrian/src/main/mondrian/gui/JTreeUpdater.java#5 $
29  */

30 public class JTreeUpdater implements TreeExpansionListener JavaDoc, TreeSelectionListener JavaDoc {
31
32     private JTree tree = null;
33     private Set JavaDoc expandedTreePaths = new HashSet JavaDoc();
34     private TreePath JavaDoc[] selectedTreePaths = new TreePath JavaDoc[0];
35
36     /**
37      * Constructor
38      *
39      * @param tree The tree to track
40      */

41     public JTreeUpdater(JTree tree) {
42         this.tree = tree;
43         this.tree.addTreeExpansionListener(this);
44         this.tree.addTreeSelectionListener(this);
45     }
46
47     /**
48      * Call this method whenever you update the tree and needs it reloaded
49      */

50     public synchronized void update() {
51         synchronized(this.tree) {
52             this.tree.removeTreeExpansionListener(this);
53             this.tree.removeTreeSelectionListener(this);
54
55             ((DefaultTreeModel JavaDoc) this.tree.getModel()).reload();
56             Iterator JavaDoc keys = expandedTreePaths.iterator();
57             while (keys.hasNext()) {
58                 TreePath JavaDoc path = (TreePath JavaDoc) keys.next();
59                 this.tree.expandPath(path);
60             }
61             this.tree.getSelectionModel().setSelectionPaths(selectedTreePaths);
62             this.tree.addTreeExpansionListener(this);
63             this.tree.addTreeSelectionListener(this);
64         }
65     }
66
67 /**
68    * Copyright (C) 2006, 2007 CINCOM SYSTEMS, INC.
69    * All Rights Reserved
70    */

71     public void treeExpanded(TreeExpansionEvent JavaDoc treeExpansionEvent) {
72         TreePath JavaDoc expandedPath = treeExpansionEvent.getPath();
73
74         //System.out.println("expended ="+expandedTreePaths.size());
75

76         // remove all ancestors of eventpath from expandedpaths set.
77
Object JavaDoc[] paths = expandedTreePaths.toArray();
78         for (int i=0; i<paths.length; i++) {
79             TreePath JavaDoc path = (TreePath JavaDoc) paths[i];
80
81             // path is a descendant of event path if path contains all componennts that make eventpath
82
// eventpath = [a,b] path=[a,b,c] then path is descendant of eventpath
83
if (path.isDescendant(expandedPath)) {
84                 expandedTreePaths.remove(path);
85             }
86         }
87         //System.out.println("ancestor expended ="+expandedTreePaths.size());
88
expandedTreePaths.add(expandedPath);
89
90         //System.out.println("added expended ="+expandedTreePaths.size());
91
}
92
93 /**
94    * Copyright (C) 2006, 2007 CINCOM SYSTEMS, INC.
95    * All Rights Reserved
96    */

97     public void treeCollapsed(TreeExpansionEvent JavaDoc treeExpansionEvent) {
98         TreePath JavaDoc collapsedPath = treeExpansionEvent.getPath();
99         expandedTreePaths.remove(collapsedPath);
100         //System.out.println("collapsed ="+expandedTreePaths.size());
101

102         // remove all descendants from expandedpaths set.
103
Object JavaDoc[] paths = expandedTreePaths.toArray();
104         for (int i=0; i<paths.length; i++) {
105             TreePath JavaDoc path = (TreePath JavaDoc) paths[i];
106
107             // path is a descendant of event path if path contains all componennts that make eventpath
108
// eventpath = [a,b] path=[a,b,c] then path is descendant of eventpath
109
if (collapsedPath.isDescendant(path)) {
110                 expandedTreePaths.remove(path);
111             }
112         }
113         //System.out.println("subtree collapsed ="+expandedTreePaths.size());
114

115     }
116
117     public void valueChanged(TreeSelectionEvent JavaDoc treeSelectionEvent) {
118         if (this.tree.getSelectionPaths() != null && this.tree.getSelectionPaths().length > 0) {
119             selectedTreePaths = this.tree.getSelectionModel().getSelectionPaths();
120         }
121     }
122 }
123
124 // End JTreeUpdater.java
125
Popular Tags