replaced <code></code> with more concise {@code}
[idea/community.git] / platform / platform-impl / src / com / intellij / ui / TreeList.java
1 /*
2  * Copyright 2000-2009 JetBrains s.r.o.
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 package com.intellij.ui;
17
18 import com.intellij.ui.components.JBList;
19 import org.jetbrains.annotations.NotNull;
20
21 import javax.swing.*;
22 import javax.swing.event.TreeModelEvent;
23 import javax.swing.event.TreeModelListener;
24 import javax.swing.tree.DefaultMutableTreeNode;
25 import javax.swing.tree.DefaultTreeModel;
26 import javax.swing.tree.TreeModel;
27 import javax.swing.tree.TreeNode;
28 import java.awt.*;
29 import java.awt.event.WindowAdapter;
30 import java.awt.event.WindowEvent;
31 import java.util.Enumeration;
32
33 /**
34  * @author Eugene Belyaev
35  */
36 public class TreeList extends JBList implements TreeModelListener {
37   private final TreeModel myTreeModel;
38   private boolean myRootVisible = false;
39   private final DefaultListModel myListModel = new DefaultListModel();
40
41   /**
42    * Constructs a {@code JList} with an empty model.
43    */
44   public TreeList(TreeModel treeModel) {
45     super.setModel(myListModel);
46     myTreeModel = treeModel;
47     myTreeModel.addTreeModelListener(this);
48     Object root = myTreeModel.getRoot();
49     if (root instanceof TreeNode) {
50       TreeNode node = (TreeNode) root;
51       myListModel.addElement(node);
52       if (myTreeModel instanceof DefaultTreeModel && ((DefaultTreeModel)myTreeModel).asksAllowsChildren() && node.getAllowsChildren()) {
53         Enumeration enumeration = node.children();
54         while (enumeration.hasMoreElements()) {
55           Object object = enumeration.nextElement();
56           myListModel.addElement(object);
57         }
58       }
59     }
60   }
61
62   public boolean isRootVisible() {
63     return myRootVisible;
64   }
65
66   public void setRootVisible(boolean rootVisible) {
67     myRootVisible = rootVisible;
68   }
69
70   /**
71    * Sets the model that represents the contents or "value" of the
72    * list and clears the list selection after notifying
73    * {@code PropertyChangeListeners}.
74    * <p>
75    * This is a JavaBeans bound property.
76    *
77    * @param model  the {@code ListModel} that provides the
78    *                                            list of items for display
79    * @exception IllegalArgumentException  if {@code model} is
80    *                                            {@code null}
81    * @see #getModel
82    * @beaninfo
83    *       bound: true
84    *   attribute: visualUpdate true
85    * description: The object that contains the data to be drawn by this JList.
86    */
87   public void setModel(@NotNull ListModel model) {
88     throw new UnsupportedOperationException("TreeList accepts only TreeModel as a model");
89   }
90
91   /**
92    * <p>Invoked after a node (or a set of siblings) has changed in some
93    * way. The node(s) have not changed locations in the tree or
94    * altered their children arrays, but other attributes have
95    * changed and may affect presentation. Example: the name of a
96    * file has changed, but it is in the same location in the file
97    * system.</p>
98    * <p>To indicate the root has changed, childIndices and children
99    * will be null. </p>
100    *
101    * <p>Use {@code e.getPath()}
102    * to get the parent of the changed node(s).
103    * {@code e.getChildIndices()}
104    * returns the index(es) of the changed node(s).</p>
105    */
106   public void treeNodesChanged(TreeModelEvent e) {
107     //To change body of implemented methods use Options | File Templates.
108   }
109
110   /**
111    * <p>Invoked after nodes have been inserted into the tree.</p>
112    *
113    * <p>Use {@code e.getPath()}
114    * to get the parent of the new node(s).
115    * {@code e.getChildIndices()}
116    * returns the index(es) of the new node(s)
117    * in ascending order.</p>
118    */
119   public void treeNodesInserted(TreeModelEvent e) {
120     //To change body of implemented methods use Options | File Templates.
121   }
122
123   /**
124    * <p>Invoked after nodes have been removed from the tree.  Note that
125    * if a subtree is removed from the tree, this method may only be
126    * invoked once for the root of the removed subtree, not once for
127    * each individual set of siblings removed.</p>
128    *
129    * <p>Use {@code e.getPath()}
130    * to get the former parent of the deleted node(s).
131    * {@code e.getChildIndices()}
132    * returns, in ascending order, the index(es)
133    * the node(s) had before being deleted.</p>
134    */
135   public void treeNodesRemoved(TreeModelEvent e) {
136     //To change body of implemented methods use Options | File Templates.
137   }
138
139   /**
140    * <p>Invoked after the tree has drastically changed structure from a
141    * given node down.  If the path returned by e.getPath() is of length
142    * one and the first element does not identify the current root node
143    * the first element should become the new root of the tree.<p>
144    *
145    * <p>Use {@code e.getPath()}
146    * to get the path to the node.
147    * {@code e.getChildIndices()}
148    * returns null.</p>
149    */
150   public void treeStructureChanged(TreeModelEvent e) {
151     //To change body of implemented methods use Options | File Templates.
152   }
153
154
155
156   @SuppressWarnings({"HardCodedStringLiteral"})
157   public static void main(String[] args) {
158     JFrame frame = new JFrame("TreeList Showcase");
159     frame.setLocation(0, 0);
160     frame.setSize(800, 600);
161     frame.addWindowListener(
162         new WindowAdapter() {
163           /**
164            * Invoked when a window is in the process of being closed.
165            * The close operation can be overridden at this point.
166            */
167           public void windowClosing(WindowEvent e) {
168             System.exit(0);
169           }
170         }
171     );
172     Container contentPane = frame.getContentPane();
173     contentPane.setLayout(new BorderLayout());
174     DefaultMutableTreeNode rootNode = new DefaultMutableTreeNode("Sample root node");
175     for (int i = 0; i < 5; i++) {
176       DefaultMutableTreeNode node = new DefaultMutableTreeNode("Node #" + (i + 1));
177       rootNode.add(node);
178     }
179     DefaultTreeModel treeModel = new DefaultTreeModel(rootNode, true);
180     TreeList treeList = new TreeList(treeModel);
181     contentPane.add(treeList);
182     frame.setVisible(true);
183   }
184 }