KickJava   Java API By Example, From Geeks To Geeks.

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


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.beans.PropertyChangeEvent JavaDoc;
24 import java.beans.PropertyChangeListener JavaDoc;
25 import java.beans.PropertyVetoException JavaDoc;
26 import java.lang.reflect.Method JavaDoc;
27 import java.util.ArrayList JavaDoc;
28 import java.util.EventListener JavaDoc;
29 import java.util.List JavaDoc;
30 import javax.swing.JPanel JavaDoc;
31 import org.netbeans.modules.xml.schema.model.SchemaComponent;
32 import org.netbeans.modules.xml.wsdl.model.Definitions;
33 import org.netbeans.modules.xml.wsdl.model.WSDLComponent;
34 import org.netbeans.modules.xml.wsdl.model.WSDLModel;
35 import org.netbeans.modules.xml.wsdl.ui.view.treeeditor.NodesFactory;
36 import org.netbeans.modules.xml.xam.ui.column.BasicColumnView;
37 import org.netbeans.modules.xml.xam.ui.column.Column;
38 import org.netbeans.modules.xml.xam.ui.column.ColumnView;
39 import org.netbeans.modules.xml.xam.ui.column.LinkPanel;
40 import org.openide.ErrorManager;
41 import org.openide.explorer.ExplorerManager;
42 import org.openide.nodes.Node;
43 import org.openide.util.Lookup;
44
45 /**
46  * Displays the WSDL document in a series of columns, each containing a tree
47  * representing a subset of the WSDL model.
48  *
49  * <p><em>Note: WSDLColumnsView, like all NbColumnView subclasses, has its
50  * own JScrollPane, you do not need to place it in a JScrollPane.</em></p>
51  *
52  * @author Todd Fast, todd.fast@sun.com
53  * @author Nathan Fiedler
54  * @author Jeri Lockhart
55  */

56 public class WSDLColumnsView extends JPanel JavaDoc implements ColumnView,
57         /*HelpCtx.Provider,*/ PropertyChangeListener JavaDoc {
58     /** silence compiler warnings */
59     static final long serialVersionUID = 1L;
60     /** Where the columns are shown. */
61     private transient BasicColumnView columnView;
62     /** Where the bread crumbs live. */
63     private transient LinkPanel breadCrumbs;
64     private transient WSDLModel wsdlModel;
65     private transient Lookup lookup;
66     private Class JavaDoc<? extends EventListener JavaDoc> columnListenerClass;
67     private transient EventListener JavaDoc columnListener;
68     public static final String JavaDoc PROP_COLUMN_ADDED = "column_added";
69
70     /**
71      * Constructs a new instance of WSDLColumnsView.
72      *
73      * @param model document model being displayed.
74      * @param viewType type of column view.
75      * @param lookup from whence services are found.
76      */

77     public WSDLColumnsView(WSDLModel model, Lookup lookup) {
78         super(new BorderLayout JavaDoc());
79         breadCrumbs = new LinkPanel(this);
80         add(breadCrumbs, BorderLayout.NORTH);
81         columnView = new BasicColumnView();
82         add(columnView, BorderLayout.CENTER);
83         this.wsdlModel = model;
84         this.lookup = lookup;
85         clearColumns();
86         Node rootNode = NodesFactory.getInstance().create(model.getDefinitions());
87         WSDLColumn column = createColumnComponent(rootNode, true);
88         appendColumn(column);
89     }
90
91     /**
92      * Construct a default column component for the given component.
93      *
94      * @param node root node of the component.
95      * @param showRoot true to show the root of the tree.
96      */

97     protected WSDLColumn createColumnComponent(Node node, boolean showRoot) {
98         WSDLColumn panel = new WSDLColumn(this, node, showRoot);
99         addColumnListener(panel);
100         return panel;
101     }
102
103     /**
104      * Add the pre-defined column listener to the given column.
105      *
106      * @param column WSDLColumn to which the listener is added.
107      */

108     public void addColumnListener(WSDLColumn column){
109         if (!(columnListener == null && columnListenerClass == null)) {
110             try {
111                 // Look for the method, e.g. addPropertyChangeListener.
112
Method JavaDoc addListenerMethod = WSDLColumn.class.getMethod(
113                         "add" + columnListenerClass.getSimpleName(),
114                         columnListenerClass); // NOI18N
115
addListenerMethod.invoke(column, columnListener);
116             } catch (Exception JavaDoc e) {
117                 // This is not expected to happen, but log it if it does.
118
ErrorManager.getDefault().notify(ErrorManager.WARNING, e);
119             }
120         }
121     }
122
123     /**
124      * Set the column listener for this column view. The listener will
125      * be added to each column instance that has a corresponding "add"
126      * method (e.g. "addPropertyChangeListener()").
127      *
128      * @param listenerClass class of the listener.
129      * @param listener listener to be added.
130      */

131     public <L extends EventListener JavaDoc> void setColumnListener(
132             Class JavaDoc<L> listenerClass, L listener) {
133         columnListenerClass = listenerClass;
134         columnListener = listener;
135     }
136
137     /**
138      * Retrieve the column listener, if one is defined.
139      *
140      * @return the column listener, or null if none.
141      */

142     public EventListener JavaDoc getColumnListener() {
143         return columnListener;
144     }
145
146     public void propertyChange(PropertyChangeEvent JavaDoc event) {
147         Object JavaDoc src = event.getSource();
148         if (event.getPropertyName().equals(Column.PROP_TITLE) &&
149                 src instanceof Column) {
150             // Update the link title to reflect the change.
151
breadCrumbs.updateLink((Column) src);
152         }
153     }
154
155     public void showComponent(WSDLComponent wc) {
156         Node rootNode = null;
157         Column currentColumn = getFirstColumn();
158         ExplorerManager currentExplorer = null;
159         if (currentColumn instanceof ExplorerManager.Provider) {
160             currentExplorer = ((ExplorerManager.Provider)currentColumn).
161                     getExplorerManager();
162         }
163         if (currentExplorer != null) {
164             rootNode = currentExplorer.getRootContext();
165         } else {
166             NodesFactory factory = NodesFactory.getInstance();
167             Definitions defs = wsdlModel.getDefinitions();
168             rootNode = factory.create(defs);
169             clearColumns();
170             currentColumn = createColumnComponent(rootNode,false);
171             appendColumn(currentColumn);
172             currentExplorer = ExplorerManager.find(currentColumn.getComponent());
173         }
174         List JavaDoc<Node> path = UIUtilities.findPathFromRoot(rootNode, wc);
175         if (path.isEmpty()) {
176             return;
177         }
178         // retain existing columns if appropriate
179
int idx = 0;
180         Column tmpColumn = currentColumn;
181         ExplorerManager tmpExplorer = currentExplorer;
182         for (Node node:path) {
183             boolean found = false;
184             while (tmpExplorer != null && tmpExplorer.getRootContext() == node) {
185                 found = true;
186                 currentColumn = tmpColumn;
187                 currentExplorer = tmpExplorer;
188                 tmpColumn = getNextColumn(tmpColumn);
189                 if (!(tmpColumn instanceof ExplorerManager.Provider)) {
190                     break;
191                 }
192                 tmpExplorer = ((ExplorerManager.Provider)tmpColumn).
193                         getExplorerManager();
194             }
195             if (found) {
196                 idx++;
197             } else {
198                 // remove columns if needed
199
removeColumnsAfter(currentColumn);
200                 try {
201                     currentExplorer.setSelectedNodes(new Node[]{});
202                 } catch (PropertyVetoException JavaDoc ex) {
203                 }
204                 break;
205             }
206         }
207         // add necessary columns
208
if (idx < path.size() - 1) {
209             List JavaDoc<Column> columns = new ArrayList JavaDoc<Column>();
210             for (Node node : path.subList(idx, path.size() - 1)) {
211                 currentColumn = createColumnComponent(node, true);
212                 columns.add(currentColumn);
213             }
214             Column[] arr = columns.toArray(new Column[columns.size()]);
215             appendColumns(arr);
216         }
217         // select node representing component
218
if (currentColumn instanceof ExplorerManager.Provider) {
219             currentExplorer = ((ExplorerManager.Provider)currentColumn).
220                     getExplorerManager();
221         }
222         try {
223             if (currentExplorer != null) {
224                 if (path.size() <= 1) {
225                     currentExplorer.setSelectedNodes(
226                             new Node[] { });
227                 } else {
228                     currentExplorer.setSelectedNodes(
229                             new Node[] { path.get(path.size() - 1) });
230                 }
231             }
232         } catch (PropertyVetoException JavaDoc ex) {
233         }
234     }
235
236     public void showComponent(SchemaComponent sc) {
237         Node rootNode = null;
238         Column currentColumn = getFirstColumn();
239         ExplorerManager currentExplorer = null;
240         if(currentColumn instanceof ExplorerManager.Provider)
241             currentExplorer = ((ExplorerManager.Provider)currentColumn).
242                     getExplorerManager();
243         if(currentExplorer!=null) {
244             rootNode = currentExplorer.getRootContext();
245         } else {
246             NodesFactory factory = NodesFactory.getInstance();
247             Definitions defs = wsdlModel.getDefinitions();
248             rootNode = factory.create(defs);
249             clearColumns();
250             currentColumn = createColumnComponent(rootNode,false);
251             appendColumn(currentColumn);
252             currentExplorer = ExplorerManager.find(currentColumn.getComponent());
253         }
254         List JavaDoc<Node> path = UIUtilities.findPathFromRoot(rootNode, sc, wsdlModel);
255         if(path.isEmpty()) return;
256         // retain existing columns if appropriate
257
int idx = 0;
258         Column tmpColumn = currentColumn;
259         ExplorerManager tmpExplorer = currentExplorer;
260         for(Node node:path.subList(0,path.size()-1)) {
261             boolean found = false;
262             while(tmpExplorer!=null&&tmpExplorer.getRootContext()==node) {
263                 found = true;
264                 currentColumn = tmpColumn;
265                 currentExplorer = tmpExplorer;
266                 tmpColumn = getNextColumn(tmpColumn);
267                 if(!(tmpColumn instanceof ExplorerManager.Provider)) break;
268                 tmpExplorer = ((ExplorerManager.Provider)tmpColumn).
269                         getExplorerManager();
270             }
271             if(found) idx++;
272             else // remove columns if needed
273
{
274                 removeColumnsAfter(currentColumn);
275                 try {
276                     currentExplorer.setSelectedNodes(new Node[]{});
277                 } catch (PropertyVetoException JavaDoc ex) {
278                 }
279                 break;
280             }
281         }
282         // add necessary columns
283
if (idx < path.size() - 1) {
284             List JavaDoc<Column> columns = new ArrayList JavaDoc<Column>();
285             for (Node node : path.subList(idx, path.size() - 1)) {
286                 currentColumn = createColumnComponent(node, true);
287                 columns.add(currentColumn);
288             }
289             Column[] arr = columns.toArray(new Column[columns.size()]);
290             appendColumns(arr);
291         }
292         // select node representing component
293
if(currentColumn instanceof ExplorerManager.Provider)
294             currentExplorer = ((ExplorerManager.Provider)currentColumn).
295                     getExplorerManager();
296         try {
297             if(currentExplorer!=null)
298                 currentExplorer.setSelectedNodes(
299                         new Node[]{path.get(path.size()-1)});
300         } catch (PropertyVetoException JavaDoc ex) {
301         }
302     }
303
304     @Override JavaDoc
305     public void requestFocus() {
306         super.requestFocus();
307         columnView.requestFocus();
308     }
309
310     @Override JavaDoc
311     public boolean requestFocusInWindow() {
312         super.requestFocusInWindow();
313         return columnView.requestFocusInWindow();
314     }
315     
316     //
317
// ColumnView implementation
318
//
319

320     public void appendColumn(Column column) {
321         column.addPropertyChangeListener(this);
322         columnView.appendColumn(column);
323         breadCrumbs.appendLink(column);
324         firePropertyChange(PROP_COLUMN_ADDED, null, column);
325     }
326
327     public void appendColumns(Column[] columns) {
328         for (Column column : columns) {
329             column.addPropertyChangeListener(this);
330             breadCrumbs.appendLink(column);
331             firePropertyChange(PROP_COLUMN_ADDED, null, column);
332         }
333         columnView.appendColumns(columns);
334     }
335
336     public void clearColumns() {
337         columnView.clearColumns();
338         breadCrumbs.clearLinks();
339     }
340
341     public int getColumnCount() {
342         return columnView.getColumnCount();
343     }
344
345     public int getColumnIndex(Column column) {
346         return columnView.getColumnIndex(column);
347     }
348
349     public Column getFirstColumn() {
350         return columnView.getFirstColumn();
351     }
352
353     public Column getNextColumn(Column column) {
354         return columnView.getNextColumn(column);
355     }
356
357     public void removeColumnsAfter(Column column) {
358         int index = columnView.getColumnIndex(column);
359         columnView.removeColumnsAfter(column);
360         // Remove the links after this column.
361
breadCrumbs.truncateLinks(index + 1);
362     }
363
364     public void scrollToColumn(Column column, boolean synchronous) {
365         columnView.scrollToColumn(column, synchronous);
366     }
367
368 // IZ 96828: suppress help for nodes, just use WSDL view help topic.
369
// public HelpCtx getHelpCtx() {
370
// return new HelpCtx(WSDLColumnsView.class);
371
// }
372
}
373
Popular Tags