001: /*
002: * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
003: *
004: * Copyright 1997-2007 Sun Microsystems, Inc. All rights reserved.
005: *
006: * The contents of this file are subject to the terms of either the GNU
007: * General Public License Version 2 only ("GPL") or the Common
008: * Development and Distribution License("CDDL") (collectively, the
009: * "License"). You may not use this file except in compliance with the
010: * License. You can obtain a copy of the License at
011: * http://www.netbeans.org/cddl-gplv2.html
012: * or nbbuild/licenses/CDDL-GPL-2-CP. See the License for the
013: * specific language governing permissions and limitations under the
014: * License. When distributing the software, include this License Header
015: * Notice in each file and include the License file at
016: * nbbuild/licenses/CDDL-GPL-2-CP. Sun designates this
017: * particular file as subject to the "Classpath" exception as provided
018: * by Sun in the GPL Version 2 section of the License file that
019: * accompanied this code. If applicable, add the following below the
020: * License Header, with the fields enclosed by brackets [] replaced by
021: * your own identifying information:
022: * "Portions Copyrighted [year] [name of copyright owner]"
023: *
024: * Contributor(s):
025: *
026: * The Original Software is NetBeans. The Initial Developer of the Original
027: * Software is Sun Microsystems, Inc. Portions Copyright 1997-2007 Sun
028: * Microsystems, Inc. All Rights Reserved.
029: *
030: * If you wish your version of this file to be governed by only the CDDL
031: * or only the GPL Version 2, indicate your decision by adding
032: * "[Contributor] elects to include this software in this distribution
033: * under the [CDDL or GPL Version 2] license." If you do not indicate a
034: * single choice of license, a recipient has the option to distribute
035: * your version of this file under either the CDDL, the GPL Version 2 or
036: * to extend the choice of license to its licensees as provided above.
037: * However, if you add GPL Version 2 code and therefore, elected the GPL
038: * Version 2 license, then the option applies only if the new code is
039: * made subject to such option by the copyright holder.
040: */
041:
042: /*
043: * Created on May 16, 2005
044: *
045: * To change the template for this generated file go to
046: * Window - Preferences - Java - Code Generation - Code and Comments
047: */
048: package org.netbeans.modules.xml.wsdl.ui.api.property;
049:
050: import java.awt.BorderLayout;
051: import java.beans.PropertyChangeEvent;
052: import java.beans.PropertyChangeListener;
053: import java.beans.PropertyChangeSupport;
054: import java.beans.PropertyVetoException;
055:
056: import javax.swing.JPanel;
057: import javax.swing.SwingUtilities;
058:
059: import org.netbeans.modules.xml.schema.model.GlobalElement;
060: import org.netbeans.modules.xml.schema.model.GlobalType;
061: import org.netbeans.modules.xml.schema.model.SchemaComponent;
062: import org.netbeans.modules.xml.schema.model.SchemaComponentReference;
063: import org.netbeans.modules.xml.wsdl.model.Part;
064: import org.netbeans.modules.xml.wsdl.model.WSDLComponent;
065: import org.netbeans.modules.xml.wsdl.model.WSDLModel;
066: import org.netbeans.modules.xml.wsdl.ui.api.property.ElementOrTypeOrMessagePartProvider.ParameterType;
067: import org.netbeans.modules.xml.wsdl.ui.netbeans.module.Utility;
068: import org.netbeans.modules.xml.wsdl.ui.view.ElementOrTypeChooserPanel;
069: import org.netbeans.modules.xml.xam.Component;
070: import org.netbeans.modules.xml.xam.ui.customizer.FolderNode;
071: import org.openide.explorer.ExplorerManager;
072: import org.openide.explorer.propertysheet.PropertyEnv;
073: import org.openide.explorer.view.BeanTreeView;
074: import org.openide.nodes.AbstractNode;
075: import org.openide.nodes.Children;
076: import org.openide.nodes.Node;
077: import org.openide.util.NbBundle;
078:
079: /**
080: * @author radval
081: *
082: * To change the template for this generated type comment go to
083: * Window - Preferences - Java - Code Generation - Code and Comments
084: */
085: public class ElementOrTypeOrMessagePartPropertyPanel extends JPanel {
086:
087: private PropertyEnv mEnv;
088:
089: private WsdlPartnerLinkTypeTreeView mTreeView;
090:
091: private Node mSelectedNode;
092:
093: private WSDLModel mModel;
094:
095: private ElementOrTypeOrMessagePartProvider mProv;
096:
097: public ElementOrTypeOrMessagePartPropertyPanel(
098: ElementOrTypeOrMessagePartProvider prov, PropertyEnv env) {
099: this .mProv = prov;
100: this .mEnv = env;
101: this .mEnv.setState(PropertyEnv.STATE_INVALID);
102:
103: this .mModel = mProv.getModel();
104:
105: initGUI();
106: }
107:
108: private void initGUI() {
109: this .setLayout(new BorderLayout());
110: ElementOrTypeOrMessagePart elementOrTypeOrMessagePart = mProv
111: .getValue();
112:
113: this .mTreeView = new WsdlPartnerLinkTypeTreeView(
114: elementOrTypeOrMessagePart);
115: this .add(BorderLayout.CENTER, this .mTreeView);
116: }
117:
118: public Component getSelectedElementOrTypeOrMessagePart() {
119: if (mSelectedNode != null) {
120: WSDLComponent comp = mSelectedNode.getLookup().lookup(
121: WSDLComponent.class);
122: if (comp != null) {
123: if (comp instanceof Part) {
124: return comp;
125: }
126: } else {
127: SchemaComponent sc = null;
128: SchemaComponentReference reference = mSelectedNode
129: .getLookup().lookup(
130: SchemaComponentReference.class);
131: if (reference != null) {
132: sc = reference.get();
133: }
134: if (sc == null) {
135: sc = mSelectedNode.getLookup().lookup(
136: SchemaComponent.class);
137: }
138:
139: if (sc != null) {
140: return sc;
141: }
142: }
143: }
144: return null;
145: }
146:
147: private ElementOrTypeOrMessagePart createElement(
148: GlobalElement element) {
149: return new ElementOrTypeOrMessagePart(element, mProv.getModel());
150: }
151:
152: private ElementOrTypeOrMessagePart createType(GlobalType type) {
153: return new ElementOrTypeOrMessagePart(type, mProv.getModel());
154: }
155:
156: private class WsdlPartnerLinkTypeTreeView extends JPanel implements
157: ExplorerManager.Provider {
158:
159: private BeanTreeView btv;
160:
161: private ExplorerManager manager;
162:
163: public static final String PROP_VALID_NODE_SELECTED = "PROP_VALID_NODE_SELECTED";//NOI18N
164:
165: public static final String PROP_DUPLICATE_NODE_SELECTED = "PROP_DUPLICATE_NODE_SELECTED"; //NOI18N
166:
167: public PropertyChangeSupport pChangeSupport = new PropertyChangeSupport(
168: this );
169:
170: private Node mRootNode;
171:
172: private ElementOrTypeOrMessagePart previousSelection;
173:
174: public WsdlPartnerLinkTypeTreeView(
175: ElementOrTypeOrMessagePart elementOrType) {
176: previousSelection = elementOrType;
177: initGUI();
178: }
179:
180: @Override
181: public void addPropertyChangeListener(
182: PropertyChangeListener listener) {
183: pChangeSupport.addPropertyChangeListener(listener);
184: }
185:
186: @Override
187: public void removePropertyChangeListener(
188: PropertyChangeListener listener) {
189: pChangeSupport.removePropertyChangeListener(listener);
190: }
191:
192: private void initGUI() {
193: this .setLayout(new BorderLayout());
194:
195: manager = new ExplorerManager();
196: manager
197: .addPropertyChangeListener(new ExplorerPropertyChangeListener());
198:
199: mRootNode = new AbstractNode(new Children.Array());
200: populateRootNode();
201: manager.setRootContext(mRootNode);
202:
203: // Create the templates view
204: btv = new BeanTreeView();
205: btv.setRootVisible(false);
206: btv
207: .setSelectionMode(javax.swing.tree.TreeSelectionModel.SINGLE_TREE_SELECTION);
208: btv.setPopupAllowed(false);
209: btv.expandNode(mRootNode);
210: btv.setDefaultActionAllowed(false);
211: btv.setFocusable(false);
212: btv.setAutoscrolls(true);
213: btv.setDragSource(false);
214: btv.setDropTarget(false);
215: btv.setName("beanTreeView1"); // NOI18N
216:
217: Utility.expandNodes(btv, 2, mRootNode);
218: manager.setExploredContext(mRootNode);
219: this .add(btv, BorderLayout.CENTER);
220: btv
221: .setName(NbBundle
222: .getMessage(
223: ElementOrTypeOrMessagePartPropertyPanel.class,
224: "ElementOrTypeOrMessagePartPropertyPanel.btv.name")); // NOI18N
225: btv
226: .getAccessibleContext()
227: .setAccessibleName(
228: NbBundle
229: .getMessage(
230: ElementOrTypeOrMessagePartPropertyPanel.class,
231: "ElementOrTypeOrMessagePartPropertyPanel.btv.AccessibleContext.accessibleName")); // NOI18N
232: btv
233: .getAccessibleContext()
234: .setAccessibleDescription(
235: NbBundle
236: .getMessage(
237: ElementOrTypeOrMessagePartPropertyPanel.class,
238: "ElementOrTypeOrMessagePartPropertyPanel.btv.AccessibleContext.accessibleDescription")); // NOI18N
239: }
240:
241: public ExplorerManager getExplorerManager() {
242: return manager;
243: }
244:
245: BeanTreeView getTreeView() {
246: return this .btv;
247: }
248:
249: private void populateRootNode() {
250: MessagePartChooserHelper wsdlHelper = new MessagePartChooserHelper(
251: mModel);
252: wsdlHelper.populateNodes(mRootNode);
253:
254: Node elementOrTypeFolderNode = new FolderNode(
255: new Children.Array());
256: elementOrTypeFolderNode.setDisplayName(NbBundle.getMessage(
257: ElementOrTypeOrMessagePartPropertyPanel.class,
258: "LBL_ElementOrType_DisplayName"));
259: ElementOrTypeChooserHelper schemaHelper = new ElementOrTypeChooserHelper(
260: mModel);
261: schemaHelper.populateNodes(elementOrTypeFolderNode);
262: mRootNode.getChildren().add(
263: new Node[] { elementOrTypeFolderNode });
264:
265: if (previousSelection != null) {
266: ParameterType type = previousSelection
267: .getParameterType();
268: Node selected = null;
269: switch (type) {
270: case ELEMENT:
271: selected = schemaHelper
272: .selectNode(previousSelection.getElement());
273: break;
274: case TYPE:
275: selected = schemaHelper
276: .selectNode(previousSelection.getType());
277: break;
278: case MESSAGEPART:
279: selected = wsdlHelper.selectNode(previousSelection
280: .getMessagePart());
281: break;
282: case NONE:
283:
284: }
285: if (selected != null) {
286: selectNode(selected);
287: firePropertyChange(
288: ElementOrTypeChooserPanel.PROP_ACTION_APPLY,
289: false, true);
290: }
291: } else {
292: selectNode(mRootNode);
293: }
294:
295: }
296:
297: private void selectNode(Node node) {
298: final Node finalNode = node;
299: Runnable run = new Runnable() {
300: public void run() {
301: if (manager != null) {
302: try {
303: manager
304: .setExploredContextAndSelection(
305: finalNode,
306: new Node[] { finalNode });
307: btv.expandNode(finalNode);
308: } catch (PropertyVetoException ex) {
309: //ignore this
310: }
311:
312: }
313: }
314: };
315: SwingUtilities.invokeLater(run);
316: }
317:
318: class ExplorerPropertyChangeListener implements
319: PropertyChangeListener {
320:
321: public void propertyChange(PropertyChangeEvent evt) {
322: if (evt.getPropertyName().equals(
323: ExplorerManager.PROP_SELECTED_NODES)) {
324: Node[] nodes = (Node[]) evt.getNewValue();
325: if (nodes.length > 0) {
326: Node node = nodes[0];
327: //set the selected node to null and state as invalid by default
328: mSelectedNode = null;
329: mEnv.setState(PropertyEnv.STATE_INVALID);
330:
331: WSDLComponent comp = node.getLookup().lookup(
332: WSDLComponent.class);
333: if (comp != null && comp instanceof Part) {
334: mSelectedNode = node;
335: mEnv
336: .setState(PropertyEnv.STATE_NEEDS_VALIDATION);
337: return;
338: }
339: SchemaComponent sc = null;
340: SchemaComponentReference reference = node
341: .getLookup().lookup(
342: SchemaComponentReference.class);
343: if (reference != null) {
344: sc = reference.get();
345: }
346: if (sc == null) {
347: sc = node.getLookup().lookup(
348: SchemaComponent.class);
349: }
350:
351: if (sc != null
352: && (sc instanceof GlobalType || sc instanceof GlobalElement)) {
353: mSelectedNode = node;
354: mEnv
355: .setState(PropertyEnv.STATE_NEEDS_VALIDATION);
356: }
357: }
358: }
359: }
360: }
361: }
362:
363: }
|