KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > netbeans > modules > xml > wsdl > ui > netbeans > module > WSDLColumn


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.wsdl.ui.netbeans.module;
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.beans.PropertyChangeListener JavaDoc;
30 import java.util.EventListener JavaDoc;
31 import javax.swing.ActionMap JavaDoc;
32 import javax.swing.JComponent JavaDoc;
33 import javax.swing.JLabel JavaDoc;
34 import javax.swing.JList JavaDoc;
35 import javax.swing.JPanel JavaDoc;
36 import javax.swing.JScrollPane JavaDoc;
37 import javax.swing.ListSelectionModel JavaDoc;
38 import javax.swing.SwingConstants JavaDoc;
39 import javax.swing.SwingUtilities JavaDoc;
40 import javax.swing.UIManager JavaDoc;
41 import javax.swing.text.DefaultEditorKit JavaDoc;
42 import org.netbeans.modules.xml.wsdl.ui.view.treeeditor.DefinitionsNode;
43 import org.netbeans.modules.xml.wsdl.ui.view.treeeditor.DummyDefinitionsNode;
44 import org.netbeans.modules.xml.wsdl.ui.view.treeeditor.FolderNode;
45 import org.openide.explorer.ExplorerManager;
46 import org.openide.explorer.ExplorerUtils;
47 import org.openide.explorer.view.Visualizer;
48 import org.openide.nodes.Node;
49 import org.openide.util.Lookup;
50 import org.openide.windows.TopComponent;
51 import org.netbeans.modules.xml.xam.ui.column.Column;
52 import org.netbeans.modules.xml.xam.ui.column.ColumnListCellRenderer;
53 import org.netbeans.modules.xml.xam.ui.column.ColumnListView;
54 import org.netbeans.modules.xml.xam.ui.column.ColumnProvider;
55 import org.openide.explorer.view.ListView;
56 import org.openide.nodes.Children;
57 import org.openide.nodes.NodeEvent;
58 import org.openide.nodes.NodeListener;
59 import org.openide.nodes.NodeMemberEvent;
60 import org.openide.nodes.NodeReorderEvent;
61 import org.openide.util.NbBundle;
62
63 /**
64  * Represents a column in the WSDLColumnsView, displaying the details of
65  * a WSDLElementNode.
66  *
67  * @author Todd Fast, todd.fast@sun.com
68  * @author Nathan Fiedler
69  * @author Jeri Lockhart
70  */

71 public class WSDLColumn extends JPanel JavaDoc
72         implements ExplorerManager.Provider, Lookup.Provider, NodeListener,
73         PropertyChangeListener JavaDoc, Column, FocusListener JavaDoc {
74     private static final long serialVersionUID = 1L;
75     private WSDLColumnsView columnView;
76     private ExplorerManager explorerManager;
77     private transient Lookup lookup;
78     private ListView nodeView;
79     public static final String JavaDoc WSDL_COLUMN_NODE_SELECTED = "wsdl-column-node-selected"; //NOI18N
80
private JLabel JavaDoc noChildrenLabel;
81
82     /**
83      * Creates a new instance of WSDLColumn, initialized for the given
84      * root node.
85      *
86      * @param columnView our parent.
87      * @param rootNode Node to be displayed here.
88      * @param showRoot true to show root node.
89      */

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

173     protected TopComponent findParentTopComponent() {
174         return (TopComponent) SwingUtilities.getAncestorOfClass(
175                 TopComponent.class, this);
176     }
177
178     public JComponent JavaDoc getComponent() {
179         return this;
180     }
181
182     public String JavaDoc getTitle() {
183         Node node = getExplorerManager().getRootContext();
184         Column col = columnView.getFirstColumn();
185         if (col == this && (node.getCookie(DummyDefinitionsNode.class) != null ||
186                 node.getCookie(DefinitionsNode.class) != null)) {
187             return NbBundle.getMessage(WSDLColumn.class,
188                     "LBL_DefinitionsNode_Title");
189         } else {
190             return node.getDisplayName();
191         }
192     }
193
194     public String JavaDoc getDescription() {
195         StringBuilder JavaDoc sb = new StringBuilder JavaDoc();
196         Node node = getExplorerManager().getRootContext();
197         sb.append(node.getDisplayName());
198         node = node.getParentNode();
199         while (node != null) {
200             sb.insert(0, '/');
201             sb.insert(0, node.getDisplayName());
202             node = node.getParentNode();
203         }
204         return sb.toString();
205     }
206
207     public void propertyChange(PropertyChangeEvent JavaDoc event) {
208         String JavaDoc pname = event.getPropertyName();
209         Object JavaDoc src = event.getSource();
210         if (ExplorerManager.PROP_SELECTED_NODES.equals(pname)) {
211             Node[] filteredNodes = (Node[])event.getNewValue();
212             if (filteredNodes != null && filteredNodes.length >= 1) {
213                 // Set the active nodes for the parent TopComponent.
214
TopComponent tc = findParentTopComponent();
215                 if (tc != null) {
216                     tc.setActivatedNodes(filteredNodes);
217                 }
218                 addDetailColumn(filteredNodes[0]);
219                 EventListener JavaDoc listener = getColumnView().getColumnListener();
220                 if (listener != null) {
221                     firePropertyChange(WSDLColumn.WSDL_COLUMN_NODE_SELECTED,
222                             null, filteredNodes[0]);
223                 }
224             }
225         } else if (Node.PROP_DISPLAY_NAME.equals(pname) && src instanceof Node) {
226             // The root node display name has changed, need to inform
227
// our listeners that our title has effectively changed.
228
firePropertyChange(PROP_TITLE, null, null);
229         }
230     }
231
232     /**
233      * Adds a column to the right of this column, showing the details
234      * of the given node.
235      *
236      * @param node a Node instance.
237      */

238     protected void addDetailColumn(final Node node) {
239         EventQueue.invokeLater(new Runnable JavaDoc() {
240             public void run() {
241                 Column column = null;
242                 // Give the node a chance to return its own column component
243
ColumnProvider provider = (ColumnProvider) node.getLookup().lookup(
244                         ColumnProvider.class);
245                 WSDLColumnsView view = getColumnView();
246                 if (provider != null) {
247                     column = provider.getColumn();
248                     if (column instanceof WSDLColumn) {
249                         WSDLColumn sc = (WSDLColumn) column;
250                         if (sc.getColumnView() == null) {
251                             sc.setColumnView(view);
252                         }
253                     }
254                 }
255                 // Create the default column if one wasn't specified by the node.
256
if (column == null && node != getExplorerManager().getRootContext() &&
257                         node.getChildren() != Children.LEAF) {
258                     column = view.createColumnComponent(node, false);
259                 }
260                 // Check if this column is in the view and remove columns after.
261
if (view.getColumnIndex(WSDLColumn.this) != -1) {
262                     view.removeColumnsAfter(WSDLColumn.this);
263                 }
264                 if (column != null) {
265                     view.appendColumn(column);
266                 }
267                 requestFocusInWindow();
268             }
269         });
270     }
271
272     public void focusLost(FocusEvent JavaDoc e) {
273     }
274
275     public void focusGained(FocusEvent JavaDoc e) {
276         TopComponent tc = findParentTopComponent();
277         if (tc != null) {
278             // Find the selected node in this column and activate it.
279
JList JavaDoc list = (JList JavaDoc) nodeView.getViewport().getView();
280             Object JavaDoc comp = list.getSelectedValue();
281             if (comp != null) {
282                 Node node = Visualizer.findNode(comp);
283                 if (node != null) {
284                     tc.setActivatedNodes(new Node[] { node });
285                 }
286             }
287         }
288     }
289     
290     @Override JavaDoc
291     public void addNotify() {
292         super.addNotify();
293         getColumnView().addColumnListener(this);
294         // hide list view and show nochildren label if needed
295
Node rootNode = getExplorerManager().getRootContext();
296         if (rootNode != null && rootNode.getChildren().getNodesCount() == 0) {
297             remove(nodeView);
298             noChildrenLabel.setVisible(true);
299             add(noChildrenLabel,BorderLayout.CENTER);
300         }
301     }
302
303     public void childrenAdded(NodeMemberEvent event) {
304         // show list view and hide nochildren label if needed
305
Node node = event.getNode();
306         if (node != null && node == getExplorerManager().getRootContext() &&
307                 noChildrenLabel.isVisible()) {
308             noChildrenLabel.setVisible(false);
309             remove(noChildrenLabel);
310             add(nodeView, BorderLayout.CENTER);
311         }
312     }
313
314     public void childrenRemoved(NodeMemberEvent event) {
315         // hide list view and show nochildren label if needed
316
final Node node = event.getNode();
317         if (node != null && node == getExplorerManager().getRootContext() &&
318                 !noChildrenLabel.isVisible()) {
319             EventQueue.invokeLater(new Runnable JavaDoc() {
320                 public void run() {
321                     if (node.getChildren().getNodesCount() == 0) {
322                         noChildrenLabel.setVisible(true);
323                         remove(nodeView);
324                         add(noChildrenLabel, BorderLayout.CENTER);
325                     }
326                 }
327             });
328         }
329     }
330
331     public void childrenReordered(NodeReorderEvent event) {
332     }
333
334     public void nodeDestroyed(NodeEvent event) {
335         // delete this column and columns after this.
336
Node node = event.getNode();
337         if (node != null && node == getExplorerManager().getRootContext()) {
338             final WSDLColumnsView view = getColumnView();
339             int idx = view.getColumnIndex(this);
340             if (idx <= 0) {
341                 return;
342             }
343             Column c = view.getFirstColumn();
344             for (int ii = 1; ii < idx; ii++) {
345                 c = view.getNextColumn(c);
346             }
347             final Column currentColumn = c;
348             EventQueue.invokeLater(new Runnable JavaDoc() {
349                 public void run() {
350                     view.removeColumnsAfter(currentColumn);
351                 }
352             });
353         }
354     }
355
356     protected WSDLColumnsView getColumnView() {
357         return columnView;
358     }
359
360     protected void setColumnView(WSDLColumnsView columnView) {
361         this.columnView = columnView;
362     }
363 }
364
Popular Tags