KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > netbeans > modules > xml > schema > ui > basic > SchemaColumn


1 /*
2  * The contents of this file are subject to the terms of the Common Development
3  * and Distribution License (the License). You may not use this file except in
4  * compliance with the License.
5  *
6  * You can obtain a copy of the License at http://www.netbeans.org/cddl.html
7  * or http://www.netbeans.org/cddl.txt.
8  *
9  * When distributing Covered Code, include this CDDL Header Notice in each file
10  * and include the License file at http://www.netbeans.org/cddl.txt.
11  * If applicable, add the following below the CDDL Header, with the fields
12  * enclosed by brackets [] replaced by your own identifying information:
13  * "Portions Copyrighted [year] [name of copyright owner]"
14  *
15  * The Original Software is NetBeans. The Initial Developer of the Original
16  * Software is Sun Microsystems, Inc. Portions Copyright 1997-2007 Sun
17  * Microsystems, Inc. All Rights Reserved.
18  */

19
20 package org.netbeans.modules.xml.schema.ui.basic;
21
22 import java.awt.BorderLayout JavaDoc;
23 import java.awt.Color JavaDoc;
24 import java.awt.Dimension JavaDoc;
25 import java.awt.EventQueue JavaDoc;
26 import java.awt.event.FocusEvent JavaDoc;
27 import java.awt.event.FocusListener JavaDoc;
28 import java.beans.PropertyChangeEvent JavaDoc;
29 import java.util.EventListener JavaDoc;
30 import javax.swing.ActionMap JavaDoc;
31 import javax.swing.JComponent JavaDoc;
32 import javax.swing.JLabel JavaDoc;
33 import javax.swing.JList JavaDoc;
34 import javax.swing.JPanel JavaDoc;
35 import javax.swing.JScrollPane JavaDoc;
36 import javax.swing.ListSelectionModel JavaDoc;
37 import javax.swing.SwingConstants JavaDoc;
38 import javax.swing.SwingUtilities JavaDoc;
39 import javax.swing.UIManager JavaDoc;
40 import javax.swing.text.DefaultEditorKit JavaDoc;
41 import org.netbeans.modules.xml.schema.ui.nodes.categorized.CategoryNode;
42 import org.netbeans.modules.xml.xam.ui.column.ColumnListCellRenderer;
43 import org.openide.explorer.ExplorerManager;
44 import org.openide.explorer.ExplorerUtils;
45 import org.openide.explorer.view.Visualizer;
46 import org.openide.nodes.Children;
47 import org.openide.nodes.Node;
48 import org.openide.nodes.NodeEvent;
49 import org.openide.nodes.NodeMemberEvent;
50 import org.openide.nodes.NodeReorderEvent;
51 import org.openide.util.Lookup;
52 import org.openide.windows.TopComponent;
53 import org.netbeans.modules.xml.schema.ui.nodes.SchemaComponentNode;
54 import org.netbeans.modules.xml.schema.ui.nodes.categorized.DummySchemaNode;
55 import org.netbeans.modules.xml.schema.ui.nodes.categorized.ReadOnlySchemaComponentNode;
56 import org.netbeans.modules.xml.schema.ui.nodes.schema.SchemaNode;
57 import org.netbeans.modules.xml.xam.ui.column.Column;
58 import org.netbeans.modules.xml.xam.ui.column.ColumnListView;
59 import org.netbeans.modules.xml.xam.ui.column.ColumnProvider;
60 import org.openide.explorer.view.ListView;
61 import org.openide.nodes.NodeListener;
62 import org.openide.util.NbBundle;
63
64 /**
65  * Represents a column in the SchemaColumnsView, displaying the details of
66  * a SchemaComponentNode.
67  *
68  * @author Todd Fast, todd.fast@sun.com
69  * @author Nathan Fiedler
70  * @author Jeri Lockhart
71  */

72 public class SchemaColumn extends JPanel JavaDoc
73     implements ExplorerManager.Provider, Lookup.Provider,
74         NodeListener, Column, FocusListener JavaDoc {
75     private static final long serialVersionUID = 1L;
76     private SchemaColumnsView columnView;
77     private ExplorerManager explorerManager;
78     private transient Lookup lookup;
79     private ListView nodeView;
80     private JLabel JavaDoc noChildrenLabel;
81     public static final String JavaDoc SCHEMA_COLUMN_NODE_SELECTED = "schema-column-node-selected"; //NOI18N
82

83     /**
84      * Creates a new instance of SchemaColumn, initialized for the given
85      * root node.
86      *
87      * @param columnView the containing column view (may be null).
88      * @param rootNode Node to be displayed here (may be null).
89      * @param showRoot true to show root node.
90      */

91     public SchemaColumn(SchemaColumnsView columnView, Node rootNode,
92             boolean showRoot) {
93         super();
94         this.columnView = columnView;
95         explorerManager = new ExplorerManager();
96         explorerManager.addPropertyChangeListener(this);
97         Color JavaDoc usualWindowBkg = UIManager.getColor("window"); //NOI18N
98
setBackground(usualWindowBkg != null ? usualWindowBkg :Color.white);
99         setLayout(new BorderLayout JavaDoc());
100         setPreferredSize(new Dimension JavaDoc(200, 200));
101         nodeView = new ColumnListView(explorerManager);
102         nodeView.getAccessibleContext().setAccessibleName(NbBundle.getMessage(SchemaColumn.class,
103                 "LBL_SchemaCategory_Categorized"));
104         nodeView.getAccessibleContext().setAccessibleDescription(NbBundle.getMessage(SchemaColumn.class,
105                 "HINT_SchemaCategory_Categorized"));
106         nodeView.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);
107         // Traversal is a bad thing for our columns view, and allows the
108
// user to cause all of the columns to be completely blank.
109
nodeView.setTraversalAllowed(false);
110         nodeView.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
111         add(nodeView, BorderLayout.CENTER);
112         JList JavaDoc list = (JList JavaDoc) nodeView.getViewport().getView();
113         list.addFocusListener(this);
114         list.setCellRenderer(new ColumnListCellRenderer());
115         if (rootNode != null) {
116             if (rootNode.getCookie(DummySchemaNode.class) == null &&
117                     rootNode.getCookie(SchemaNode.class) != null) {
118                 rootNode = new DummySchemaNode(rootNode);
119             }
120             getExplorerManager().setRootContext(rootNode);
121             rootNode.addNodeListener(this);
122             // nochildren label initialization
123
noChildrenLabel = new JLabel JavaDoc(NbBundle.getMessage(SchemaColumn.class,
124                     "LBL_NoChildren"));
125             noChildrenLabel.setBackground(getBackground());
126             noChildrenLabel.setHorizontalTextPosition(SwingConstants.CENTER);
127             noChildrenLabel.setHorizontalAlignment(javax.swing.SwingConstants.CENTER);
128             noChildrenLabel.setVisible(false);
129             noChildrenLabel.setEnabled(false);
130             if (rootNode.getCookie(CategoryNode.class) != null) {
131                 noChildrenLabel.setText(NbBundle.getMessage(SchemaColumn.class,
132                         "LBL_NoCateroryChildren",rootNode.getDisplayName()));
133             }
134         }
135
136         // Set up the map of standard actions.
137
ActionMap JavaDoc map = getActionMap();
138         map.put(DefaultEditorKit.copyAction,
139                 ExplorerUtils.actionCopy(explorerManager));
140         map.put(DefaultEditorKit.cutAction,
141                 ExplorerUtils.actionCut(explorerManager));
142         map.put(DefaultEditorKit.pasteAction,
143                 ExplorerUtils.actionPaste(explorerManager));
144         map.put("delete", ExplorerUtils.actionDelete(explorerManager, false));
145         lookup = ExplorerUtils.createLookup(explorerManager, map);
146         // Do _not_ define the keyboard shortcuts for the actions, as
147
// they are in the lookup of our containing TopComponent, and
148
// those are activated by the standard keyboard bindings. If we
149
// define our own here, we get exceptions in OwnPaste (IZ#80500).
150
}
151
152     public ExplorerManager getExplorerManager() {
153         return explorerManager;
154     }
155
156     public Lookup getLookup() {
157         return lookup;
158     }
159
160     @Override JavaDoc
161     public void requestFocus() {
162         super.requestFocus();
163         nodeView.requestFocus();
164     }
165
166     @Override JavaDoc
167     public boolean requestFocusInWindow() {
168         super.requestFocusInWindow();
169         return nodeView.requestFocusInWindow();
170     }
171
172     /**
173      * Finds the TopComponent that contains us.
174      *
175      * @return the parent TopComponent.
176      */

177     protected TopComponent findParentTopComponent() {
178         return (TopComponent)SwingUtilities.getAncestorOfClass(TopComponent.class,this);
179     }
180
181     public JComponent JavaDoc getComponent() {
182         return this;
183     }
184
185     public String JavaDoc getTitle() {
186         Node node = getExplorerManager().getRootContext();
187         Column col = columnView.getFirstColumn();
188         if (col == this && (node.getCookie(DummySchemaNode.class) != null ||
189                 node.getCookie(SchemaNode.class) != null)) {
190             return NbBundle.getMessage(SchemaColumn.class,
191                     "LBL_SchemaNode_Title");
192         } else {
193             return getDefaultDisplayName(node);
194         }
195     }
196
197      private String JavaDoc getDefaultDisplayName(Node n) {
198     String JavaDoc displayName = null;
199     ReadOnlySchemaComponentNode roNode = (ReadOnlySchemaComponentNode)
200         n.getLookup().lookup(ReadOnlySchemaComponentNode.class);
201         
202     if (roNode != null) {
203         displayName = roNode.getDefaultDisplayName();
204     } else {
205         SchemaComponentNode scn = (SchemaComponentNode)
206         n.getLookup().lookup(SchemaComponentNode.class);
207         if (scn != null) {
208         displayName = scn.getDefaultDisplayName();
209         } else {
210         displayName = n.getDisplayName();
211         }
212     }
213     
214     return displayName;
215     }
216     
217     public String JavaDoc getDescription() {
218         StringBuilder JavaDoc sb = new StringBuilder JavaDoc();
219         Node node = getExplorerManager().getRootContext();
220         sb.append(getDefaultDisplayName(node));
221         node = node.getParentNode();
222         while (node != null) {
223             sb.insert(0, '/');
224             sb.insert(0, getDefaultDisplayName(node));
225             node = node.getParentNode();
226         }
227         return sb.toString();
228     }
229
230     public void propertyChange(PropertyChangeEvent JavaDoc event) {
231         String JavaDoc pname = event.getPropertyName();
232         Object JavaDoc src = event.getSource();
233         if (ExplorerManager.PROP_SELECTED_NODES.equals(pname)) {
234             Node[] filteredNodes = (Node[])event.getNewValue();
235             if (filteredNodes != null && filteredNodes.length >= 1) {
236                 // Set the active nodes for the parent TopComponent.
237
TopComponent tc = findParentTopComponent();
238                 if (tc != null) {
239                     tc.setActivatedNodes(filteredNodes);
240                 }
241                 addDetailColumn(filteredNodes[0]);
242                 EventListener JavaDoc listener = getColumnView().getColumnListener();
243                 if (listener != null) {
244                     firePropertyChange(SchemaColumn.SCHEMA_COLUMN_NODE_SELECTED,
245                             null, filteredNodes[0]);
246                 }
247             }
248         } else if (Node.PROP_DISPLAY_NAME.equals(pname) && src instanceof Node) {
249             // The root node display name has changed, need to inform
250
// our listeners that our title has effectively changed.
251
firePropertyChange(PROP_TITLE, null, null);
252         }
253     }
254
255     /**
256      * Adds a column to the right of this column, showing the details
257      * of the given schema node.
258      *
259      * @param node a SchemaNode instance.
260      */

261     protected void addDetailColumn(final Node node) {
262         Column column = null;
263         // Give the node a chance to return its own column component
264
ColumnProvider provider = (ColumnProvider) node.getLookup().lookup(
265                 ColumnProvider.class);
266         final SchemaColumnsView view = getColumnView();
267         if (provider != null) {
268             column = provider.getColumn();
269             if (column instanceof SchemaColumn) {
270                 SchemaColumn sc = (SchemaColumn) column;
271                 if (sc.getColumnView() == null) {
272                     sc.setColumnView(view);
273                 }
274             }
275         }
276         // Create the default column if one wasn't specified by the node
277
// check for right clicks
278
if (column == null && (node != getExplorerManager().getRootContext()) &&
279                 node.getChildren() != Children.LEAF) {
280             column = getColumnView().createColumnComponent(node, false);
281         }
282         // check to see if this column is in columns view and then remove columns after
283
if (view.getColumnIndex(this) != -1) {
284             view.removeColumnsAfter(this);
285         }
286         if (column != null) {
287             view.appendColumn(column);
288         }
289         requestFocusInWindow();
290     }
291
292     public void focusLost(FocusEvent JavaDoc e) {
293     }
294
295     public void focusGained(FocusEvent JavaDoc e) {
296         TopComponent tc = findParentTopComponent();
297         if (tc != null) {
298             // Find the selected node in this column and activate it.
299
JList JavaDoc list = (JList JavaDoc) nodeView.getViewport().getView();
300             Object JavaDoc comp = list.getSelectedValue();
301             if (comp != null) {
302                 Node node = Visualizer.findNode(comp);
303                 if (node != null) {
304                     tc.setActivatedNodes(new Node[] { node });
305                 }
306             }
307             getColumnView().scrollToColumn(this,true);
308         }
309     }
310
311     @Override JavaDoc
312     public void addNotify() {
313         super.addNotify();
314         getColumnView().addColumnListener(this);
315         // hide list view and show nochildren label if needed
316
Node rootNode = getExplorerManager().getRootContext();
317         if (rootNode != null && rootNode.getChildren().getNodesCount() == 0) {
318             remove(nodeView);
319             noChildrenLabel.setVisible(true);
320             add(noChildrenLabel,BorderLayout.CENTER);
321         }
322     }
323     
324     protected SchemaColumnsView getColumnView() {
325         return columnView;
326     }
327
328     protected void setColumnView(SchemaColumnsView columnView) {
329         this.columnView = columnView;
330     }
331
332     public void childrenAdded(NodeMemberEvent event) {
333         // show list view and hide nochildren label if needed
334
final Node node = event.getNode();
335         // Avoid deadlock by running this on the EDT (see issue 83708).
336
EventQueue.invokeLater(new Runnable JavaDoc() {
337             public void run() {
338                 if (noChildrenLabel.isVisible() && node != null &&
339                         node == getExplorerManager().getRootContext()) {
340                     noChildrenLabel.setVisible(false);
341                     remove(noChildrenLabel);
342                     add(nodeView,BorderLayout.CENTER);
343                 }
344             }
345         });
346     }
347
348     public void childrenRemoved(NodeMemberEvent event) {
349         // hide list view and show nochildren label if needed
350
final Node node = event.getNode();
351         // Avoid deadlock by running this on the EDT (see issue 83708).
352
EventQueue.invokeLater(new Runnable JavaDoc() {
353             public void run() {
354                 if (!noChildrenLabel.isVisible() && node != null &&
355                         node == getExplorerManager().getRootContext() &&
356                         node.getChildren().getNodesCount() == 0) {
357                     noChildrenLabel.setVisible(true);
358                     remove(nodeView);
359                     add(noChildrenLabel,BorderLayout.CENTER);
360                     repaint();
361                 }
362             }
363         });
364     }
365
366     public void childrenReordered(NodeReorderEvent event) {
367     }
368
369     public void nodeDestroyed(NodeEvent event)
370     {
371         // delete this column and columns after this.
372
final Node node = event.getNode();
373         if(node!=null && node==getExplorerManager().getRootContext())
374         {
375             final SchemaColumnsView view = getColumnView();
376             int idx = view.getColumnIndex(this);
377             if(idx<=0) return;
378             Column c = view.getFirstColumn();
379             for(int i=1;i<idx;i++)
380             {
381                 c = view.getNextColumn(c);
382             }
383             final Column currentColumn = c;
384             EventQueue.invokeLater(new Runnable JavaDoc()
385             {
386                 public void run()
387                 {
388                     view.removeColumnsAfter(currentColumn);
389                 }
390             });
391         }
392     }
393 }
394
Popular Tags