KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > netbeans > modules > xml > wsdl > ui > view > grapheditor > widget > CollaborationsWidget


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 package org.netbeans.modules.xml.wsdl.ui.view.grapheditor.widget;
20
21 import java.awt.BasicStroke JavaDoc;
22 import java.awt.Color JavaDoc;
23 import java.awt.Dimension JavaDoc;
24 import java.awt.Graphics2D JavaDoc;
25 import java.awt.Image JavaDoc;
26 import java.awt.Insets JavaDoc;
27 import java.awt.Paint JavaDoc;
28 import java.awt.Point JavaDoc;
29 import java.awt.Rectangle JavaDoc;
30 import java.awt.RenderingHints JavaDoc;
31 import java.awt.Stroke JavaDoc;
32 import java.awt.datatransfer.DataFlavor JavaDoc;
33 import java.awt.datatransfer.Transferable JavaDoc;
34 import java.awt.event.ActionEvent JavaDoc;
35 import java.awt.event.ActionListener JavaDoc;
36 import java.util.ArrayList JavaDoc;
37 import java.util.Collection JavaDoc;
38 import java.util.HashSet JavaDoc;
39 import java.util.List JavaDoc;
40 import java.util.Set JavaDoc;
41
42 import javax.swing.Action JavaDoc;
43 import javax.swing.JPopupMenu JavaDoc;
44 import javax.swing.SwingUtilities JavaDoc;
45 import javax.xml.namespace.QName JavaDoc;
46
47 import org.netbeans.api.visual.action.ActionFactory;
48 import org.netbeans.api.visual.action.PopupMenuProvider;
49 import org.netbeans.api.visual.action.WidgetAction.WidgetDropTargetDragEvent;
50 import org.netbeans.api.visual.action.WidgetAction.WidgetDropTargetDropEvent;
51 import org.netbeans.api.visual.border.Border;
52 import org.netbeans.api.visual.layout.LayoutFactory;
53 import org.netbeans.api.visual.layout.LayoutFactory.SerialAlignment;
54 import org.netbeans.api.visual.widget.LabelWidget;
55 import org.netbeans.api.visual.widget.Scene;
56 import org.netbeans.api.visual.widget.Widget;
57 import org.netbeans.modules.xml.wsdl.model.Definitions;
58 import org.netbeans.modules.xml.wsdl.model.Import;
59 import org.netbeans.modules.xml.wsdl.model.PortType;
60 import org.netbeans.modules.xml.wsdl.model.WSDLComponentFactory;
61 import org.netbeans.modules.xml.wsdl.model.WSDLModel;
62 import org.netbeans.modules.xml.wsdl.model.extensions.bpel.BPELQName;
63 import org.netbeans.modules.xml.wsdl.model.extensions.bpel.PartnerLinkType;
64 import org.netbeans.modules.xml.wsdl.model.extensions.bpel.Role;
65 import org.netbeans.modules.xml.wsdl.ui.actions.ActionHelper;
66 import org.netbeans.modules.xml.wsdl.ui.actions.NameGenerator;
67 import org.netbeans.modules.xml.wsdl.ui.netbeans.module.Utility;
68 import org.netbeans.modules.xml.wsdl.ui.view.grapheditor.border.ButtonBorder;
69 import org.netbeans.modules.xml.wsdl.ui.view.grapheditor.border.FilledBorder;
70 import org.netbeans.modules.xml.wsdl.ui.view.grapheditor.layout.LeftRightLayout;
71 import org.netbeans.modules.xml.wsdl.ui.view.treeeditor.ExtensibilityElementsFolderNode;
72 import org.netbeans.modules.xml.wsdl.ui.view.treeeditor.NodesFactory;
73 import org.netbeans.modules.xml.xam.dom.NamedComponentReference;
74 import org.netbeans.modules.xml.xam.locator.CatalogModelException;
75 import org.openide.ErrorManager;
76 import org.openide.nodes.Node;
77 import org.openide.util.Lookup;
78 import org.openide.util.NbBundle;
79 import org.openide.util.Utilities;
80 import org.openide.windows.TopComponent;
81
82 public class CollaborationsWidget extends Widget
83         implements ExpandableWidget, DnDHandler, PopupMenuProvider {
84
85     private WSDLModel mModel;
86     private Widget mCollaborationContentWidget;
87     private Image JavaDoc IMAGE = Utilities.loadImage("org/netbeans/modules/xml/wsdl/ui/view/grapheditor/palette/resources/partnerlinkTypesFolder.png");
88     public static final Border MAIN_BORDER = new FilledBorder(1, 1, 8, 8, new Color JavaDoc(0x888888), Color.WHITE);
89     private static final int GAP = 10;
90     private Widget mLabelWidget;
91     private Widget mHeaderWidget;
92     private ButtonWidget createButtonWidget;
93     private ButtonWidget removeButtonWidget;
94     private ExpanderWidget expanderWidget;
95     private PartnerLinkTypeHitPointWidget partnerLinkTypeHitPoint;
96     private Object JavaDoc draggedObject = null;
97     private int partnerLinkTypesHitPointIndex = -1;
98     private Widget stubWidget;
99     /** The Node for the WSDLComponent, if it has been created. */
100     private Node componentNode;
101     
102     public CollaborationsWidget(Scene scene, WSDLModel model) {
103         super(scene);
104         mModel = model;
105         partnerLinkTypeHitPoint = new PartnerLinkTypeHitPointWidget(scene);
106         stubWidget = new StubWidget(scene, NbBundle.getMessage(
107                 CollaborationsWidget.class,
108                 "LBL_CollaborationsWidget_ThereAreNoPartnerLinkTypes"));
109
110         setOpaque(true);
111         setLayout(LayoutFactory.createVerticalLayout(SerialAlignment.JUSTIFY, 8));
112         setBorder(MAIN_BORDER);
113         
114         boolean expanded = ExpanderWidget.isExpanded(this, true);
115         expanderWidget = new ExpanderWidget(scene, this, expanded);
116         
117         mHeaderWidget = new HeaderWidget(scene, expanderWidget);
118         mHeaderWidget.setMinimumSize(new Dimension JavaDoc(
119                 WidgetConstants.MINIMUM_WIDTH, 0));
120         mHeaderWidget.setLayout(new LeftRightLayout(32));
121         addChild(mHeaderWidget);
122         
123         mHeaderWidget.addChild(createActionWidget(scene));
124         
125         mCollaborationContentWidget = new Widget(scene);
126         if (expanded) {
127             addChild(mCollaborationContentWidget);
128         }
129         mCollaborationContentWidget.setLayout(LayoutFactory.createVerticalLayout(
130                 SerialAlignment.JUSTIFY, GAP));
131         getActions().addAction(((PartnerScene) scene).getDnDAction());
132         getActions().addAction(ActionFactory.createPopupMenuAction(this));
133         createContent();
134         //initially all plt widgets should be collapsed
135
collapsePartnerLinkTypeWidgets();
136     }
137
138     private Widget createActionWidget(Scene scene) {
139         Widget actionWidget = new Widget(scene);
140         actionWidget.setLayout(LayoutFactory.createHorizontalLayout(
141                 SerialAlignment.JUSTIFY, 8));
142
143         // Auto-create button.
144
createButtonWidget = new ButtonWidget(scene,
145                 NbBundle.getMessage(CollaborationsWidget.class,
146                 "LBL_CollaborationsWidget_AutoCreate"));
147         createButtonWidget.setActionListener(new ActionListener JavaDoc() {
148             public void actionPerformed(ActionEvent JavaDoc e) {
149                 // For each port type, create a role and partnerLinkType.
150
WSDLComponentFactory factory = mModel.getFactory();
151                 QName JavaDoc qname = BPELQName.PARTNER_LINK_TYPE.getQName();
152                 try {
153                     if (mModel.startTransaction()) {
154                         Definitions definitions = mModel.getDefinitions();
155                         Collection JavaDoc<PortType> ports = getUnusedPortTypes();
156                         for (PortType pt : ports) {
157                             PartnerLinkType plt = (PartnerLinkType) factory.create(
158                                     definitions, qname);
159                             String JavaDoc name = pt.getName();
160                             int idx = name.toLowerCase().indexOf("porttype");
161                             if (idx > 0) {
162                                 name = name.substring(0, idx);
163                             }
164                             plt.setName(NameGenerator.generateUniquePartnerLinkType(
165                                     name, qname, mModel));
166                             Role role = (Role) factory.create(
167                                     plt, BPELQName.ROLE.getQName());
168                             role.setName("role1");
169                             NamedComponentReference<PortType> ptref =
170                                     role.createReferenceTo(pt, PortType.class);
171                             role.setPortType(ptref);
172                             plt.setRole1(role);
173                             definitions.addExtensibilityElement(plt);
174                         }
175                     }
176                 } finally {
177                     mModel.endTransaction();
178                 }
179             }
180         });
181         actionWidget.addChild(createButtonWidget);
182
183         // Add partnerLinkType button.
184
ButtonWidget addButtonWidget = new ButtonWidget(scene,
185                 NbBundle.getMessage(CollaborationsWidget.class,
186                 "LBL_CollaborationsWidget_AddPartnerLinkType"));
187         addButtonWidget.setActionListener(new ActionListener JavaDoc() {
188             public void actionPerformed(ActionEvent JavaDoc e) {
189                 PartnerLinkType plt = null;
190                 try {
191                     if (mModel.startTransaction()) {
192                         plt = (PartnerLinkType) mModel.
193                                 getFactory().create(mModel.getDefinitions(),
194                                 BPELQName.PARTNER_LINK_TYPE.getQName());
195                         plt.setName(NameGenerator.generateUniquePartnerLinkType(
196                                 "partnerlinktype",
197                                 BPELQName.PARTNER_LINK_TYPE.getQName(), mModel));
198                         Role role = (Role) mModel.getFactory().create(
199                                 plt, BPELQName.ROLE.getQName());
200                         role.setName("role1");
201                         plt.setRole1(role);
202                         mModel.getDefinitions().addExtensibilityElement(plt);
203                     }
204                 } finally {
205                     mModel.endTransaction();
206                 }
207                 if (plt != null) {
208                     ActionHelper.selectNode(plt);
209                 }
210             }
211         });
212         actionWidget.addChild(addButtonWidget);
213
214         // Remove partnerLinkType button.
215
removeButtonWidget = new ButtonWidget(scene,
216                 NbBundle.getMessage(CollaborationsWidget.class,
217                 "LBL_CollaborationsWidget_RemovePartnerLinkType"));
218         removeButtonWidget.setActionListener(new ActionListener JavaDoc() {
219             public void actionPerformed(ActionEvent JavaDoc e) {
220                 // Create a copy of the list to avoid comodification.
221
List JavaDoc<Widget> children = new ArrayList JavaDoc<Widget>(
222                         mCollaborationContentWidget.getChildren());
223                 for (Widget child : children) {
224                     if (child instanceof PartnerLinkTypeWidget && child.getState().isSelected()) {
225                         ((PartnerLinkTypeWidget) child).deleteComponent();
226                     }
227                 }
228             }
229         });
230         removeButtonWidget.setButtonEnabled(false);
231         actionWidget.addChild(removeButtonWidget);
232         
233         // Expand button.
234
actionWidget.addChild(expanderWidget);
235         return actionWidget;
236     }
237
238     public Widget createTextButton(Scene scene, String JavaDoc text) {
239         LabelWidget result = new LabelWidget(scene, text);
240         result.setFont(scene.getDefaultFont());
241         result.setBorder(new ButtonBorder(2, 8, 2, 8));
242         result.setAlignment(LabelWidget.Alignment.LEFT);
243         result.setVerticalAlignment(LabelWidget.VerticalAlignment.CENTER);
244         return result;
245     }
246
247     public void collapseWidget(ExpanderWidget expander) {
248         if (mCollaborationContentWidget.getParentWidget() != null)
249             removeChild(mCollaborationContentWidget);
250     }
251
252     public void expandWidget(ExpanderWidget expander) {
253         if (mCollaborationContentWidget.getParentWidget() == null)
254             addChild(mCollaborationContentWidget);
255     }
256
257     public Object JavaDoc hashKey() {
258         return mModel.getDefinitions().getName();
259     }
260
261     public void updateContent() {
262         mHeaderWidget.removeChild(mLabelWidget);
263         mCollaborationContentWidget.removeChildren();
264         createContent();
265     }
266
267     private void createContent() {
268         mLabelWidget = new ImageLabelWidget(getScene(), IMAGE, "PartnerLinkTypes",
269                 "(" + mModel.getDefinitions().getExtensibilityElements(PartnerLinkType.class).size() + ")");
270         mHeaderWidget.addChild(0, mLabelWidget);
271         
272         if (stubWidget.getParentWidget() != null) {
273             stubWidget.getParentWidget().removeChild(stubWidget);
274         }
275         
276         List JavaDoc<PartnerLinkType> partnerLinkTypes = mModel.getDefinitions().getExtensibilityElements(PartnerLinkType.class);
277         if (partnerLinkTypes == null || partnerLinkTypes.isEmpty()) {
278             mCollaborationContentWidget.addChild(stubWidget);
279         } else {
280             Scene scene = getScene();
281             WidgetFactory factory = WidgetFactory.getInstance();
282             for (PartnerLinkType plType : partnerLinkTypes) {
283                 Widget widget = factory.createWidget(scene, plType, true);
284                 mCollaborationContentWidget.addChild(widget);
285             }
286         }
287
288         // Disable/hide buttons based on current widget availability.
289
removeButtonWidget.setButtonEnabled(false);
290         Collection JavaDoc<PortType> ports = getUnusedPortTypes();
291         createButtonWidget.setVisible(ports.size() > 0);
292     }
293
294     private boolean hasPartnerLinkTypes() {
295         List JavaDoc<PartnerLinkType> partnerLinkTypes = mModel.getDefinitions().getExtensibilityElements(PartnerLinkType.class);
296         return partnerLinkTypes == null || !partnerLinkTypes.isEmpty();
297     }
298     
299     //first time createContent is called all partnerlinktype widgets are in collapsed state.
300
private void collapsePartnerLinkTypeWidgets() {
301         for (Widget w : mCollaborationContentWidget.getChildren()) {
302             if (w instanceof PartnerLinkTypeWidget) {
303                 ((PartnerLinkTypeWidget) w).collapseWidget();
304             }
305         }
306     }
307     
308     public void childPartnerLinkTypeSelected(PartnerLinkTypeWidget partnerLinkTypeWidget) {
309         updateButtonState();
310     }
311     
312     
313     public void childPartnerLinkTypeUnSelected(PartnerLinkTypeWidget partnerLinkTypeWidget) {
314         updateButtonState();
315     }
316     
317     private void updateButtonState() {
318         boolean enabled = false;
319         List JavaDoc<Widget> children = mCollaborationContentWidget.getChildren();
320         if (children != null) {
321             for (Widget w : children) {
322                 if (w instanceof PartnerLinkTypeWidget) {
323                     enabled |= w.getState().isSelected();
324                 }
325             }
326         }
327         
328         if (enabled != removeButtonWidget.isButtonEnabled()) {
329             removeButtonWidget.setButtonEnabled(enabled);
330         }
331     }
332
333     public void dragExit() {
334         hideHitPoint();
335     }
336
337     public boolean dragOver(Point JavaDoc scenePoint, WidgetDropTargetDragEvent event) {
338         try {
339             Transferable JavaDoc t = event.getTransferable();
340             if (t != null) {
341                 for (DataFlavor JavaDoc flavor : t.getTransferDataFlavors()) {
342                     Class JavaDoc repClass = flavor.getRepresentationClass();
343                     if (Node.class.isAssignableFrom(repClass)) {
344                         Node node = (Node) t.getTransferData(flavor);
345                         if (node.getName().startsWith("PartnerLinkType")) {
346                             showHitPoint(scenePoint, node);
347                             return true;
348                         }
349                     }
350                 }
351             }
352         } catch (Exception JavaDoc ex) {
353             //do nothing
354
}
355         return false;
356     }
357
358     public boolean drop(Point JavaDoc scenePoint, WidgetDropTargetDropEvent event) {
359         Node node = (Node) draggedObject;
360         int index = partnerLinkTypesHitPointIndex;
361         hideHitPoint();
362         if (node != null && index >= 0) {
363             try {
364                 if (mModel.startTransaction()) {
365                     PartnerLinkType[] plts = mModel.getDefinitions().
366                             getExtensibilityElements(PartnerLinkType.class).
367                             toArray(new PartnerLinkType[0]);
368                     PartnerLinkType plt = (PartnerLinkType) mModel.
369                             getFactory().create(mModel.getDefinitions(),
370                             BPELQName.PARTNER_LINK_TYPE.getQName());
371                     String JavaDoc pltName = NameGenerator.generateUniquePartnerLinkType(
372                             "partnerlinktype", BPELQName.PARTNER_LINK_TYPE.getQName(), mModel);
373                     plt.setName(pltName);
374                     Role role = (Role) mModel.getFactory().create(
375                             plt, BPELQName.ROLE.getQName());
376                     role.setName("role1");
377                     plt.setRole1(role);
378                     
379                     if (index == plts.length) {
380                         mModel.getDefinitions().addExtensibilityElement(plt);
381                     } else {
382                         Utility.insertIntoDefinitionsAtIndex(index, mModel, plt,
383                                 Definitions.EXTENSIBILITY_ELEMENT_PROPERTY);
384                     }
385                 }
386             } finally {
387                 mModel.endTransaction();
388             }
389             return true;
390         }
391         return false;
392     }
393
394     public void expandForDragAndDrop() {
395         expanderWidget.setExpanded(true);
396     }
397
398     public boolean isCollapsed() {
399         return mCollaborationContentWidget.getParentWidget() == null;
400     }
401     
402     
403     private void showHitPoint(Point JavaDoc point, Object JavaDoc draggedObj) {
404         this.draggedObject = draggedObj;
405         List JavaDoc<PartnerLinkTypeWidget> partnerLinkTypeWidgets = getPartnerLinkTypeWidgets();
406         
407         if (partnerLinkTypeWidgets == null) return;
408         
409         int index = placeHolderIndex(point);
410         
411         if (index < 0) return;
412         
413         partnerLinkTypesHitPointIndex = index;
414         
415         if (partnerLinkTypeHitPoint.getParentWidget() != null) {
416             partnerLinkTypeHitPoint.getParentWidget().removeChild(partnerLinkTypeHitPoint);
417         }
418         
419         if (stubWidget.getParentWidget() != null) {
420             stubWidget.getParentWidget().removeChild(stubWidget);
421         }
422         mCollaborationContentWidget.addChild(partnerLinkTypesHitPointIndex, partnerLinkTypeHitPoint);
423     }
424     
425     private void hideHitPoint() {
426         if (partnerLinkTypeHitPoint.getParentWidget() != null) {
427             partnerLinkTypeHitPoint.getParentWidget().removeChild(partnerLinkTypeHitPoint);
428         }
429         
430         if (!hasPartnerLinkTypes() && stubWidget.getParentWidget() == null) {
431             mCollaborationContentWidget.addChild(stubWidget);
432         }
433         partnerLinkTypesHitPointIndex = -1;
434         draggedObject = null;
435     }
436
437     /**
438      * Return a collection of the PortTypes which are not referenced by
439      * any Role in our WSDL model. This includes PortTypes in the imported
440      * WSDL documents.
441      *
442      * @return collection of unused port types, or the empty list.
443      */

444     private Collection JavaDoc<PortType> getUnusedPortTypes() {
445         // Make a list that we can modify (and is our non-null return value).
446
List JavaDoc<PortType> allPorts = new ArrayList JavaDoc<PortType>();
447         Definitions defs = mModel.getDefinitions();
448         Collection JavaDoc<PortType> ports = defs.getPortTypes();
449         if (ports != null) {
450             allPorts.addAll(ports);
451         }
452         Collection JavaDoc<Import> imports = defs.getImports();
453         for (Import imp : imports) {
454             try {
455                 WSDLModel importedModel = imp.getImportedWSDLModel();
456                 Definitions importedDefs = importedModel.getDefinitions();
457                 ports = importedDefs.getPortTypes();
458                 if (ports != null) {
459                     allPorts.addAll(ports);
460                 }
461             } catch (CatalogModelException cme) {
462                 ErrorManager.getDefault().notify(cme);
463             }
464         }
465         List JavaDoc<PartnerLinkType> partners = defs.getExtensibilityElements(
466                 PartnerLinkType.class);
467         if ((partners != null && partners.size() > 0) &&
468                 (allPorts != null && allPorts.size() > 0)) {
469             for (PartnerLinkType partner : partners) {
470                 PortType pt1 = getPortType(partner.getRole1());
471                 if (pt1 != null) {
472                     allPorts.remove(pt1);
473                 }
474                 PortType pt2 = getPortType(partner.getRole2());
475                 if (pt2 != null) {
476                     allPorts.remove(pt2);
477                 }
478             }
479         }
480         return allPorts;
481     }
482
483     /**
484      * Retrieve the PortType from the given Role, if possible.
485      *
486      * @param role the Role from which to get the PortType.
487      * @return PortType from Role, or null if none.
488      */

489     private PortType getPortType(Role role) {
490         if (role != null) {
491             NamedComponentReference<PortType> ref = role.getPortType();
492             if (ref != null) {
493                 return ref.get();
494             }
495         }
496         return null;
497     }
498
499     private List JavaDoc<PartnerLinkTypeWidget> getPartnerLinkTypeWidgets() {
500         if (mCollaborationContentWidget.getParentWidget() == null) return null;
501         
502         List JavaDoc<PartnerLinkTypeWidget> result = new ArrayList JavaDoc<PartnerLinkTypeWidget>();
503         
504         for (Widget widget : mCollaborationContentWidget.getChildren()) {
505             if (widget instanceof PartnerLinkTypeWidget) {
506                 result.add((PartnerLinkTypeWidget) widget);
507             }
508         }
509         
510         return result;
511     }
512     
513     private int placeHolderIndex(Point JavaDoc scenePoint) {
514         List JavaDoc<PartnerLinkTypeWidget> partnerLinkTypeWidgets = getPartnerLinkTypeWidgets();
515         
516         if (partnerLinkTypeWidgets.size() == 0) return 0;
517         
518         if (partnerLinkTypeHitPoint.getParentWidget() != null) {
519             if (partnerLinkTypeHitPoint.isHitAt(partnerLinkTypeHitPoint.convertSceneToLocal(scenePoint))) {
520                 return -1;
521             }
522         }
523         
524         for (int i = 0; i < partnerLinkTypeWidgets.size(); i++) {
525             PartnerLinkTypeWidget partnerLinkTypeWidget = partnerLinkTypeWidgets.get(i);
526             Point JavaDoc partnerLinkTypePoint = partnerLinkTypeWidget.convertSceneToLocal(scenePoint);
527             Rectangle JavaDoc partnerLinkTypeBounds = partnerLinkTypeWidget.getBounds();
528             
529             
530             if (partnerLinkTypePoint.y < partnerLinkTypeBounds.getCenterY()) {
531                 return i;
532             }
533         }
534         
535         return partnerLinkTypeWidgets.size();
536     }
537
538     /**
539      * Locates the TopComponent parent of the view containing the Scene
540      * that owns this widget, if possible.
541      *
542      * @return the parent TopComponent, or null if not found.
543      */

544     protected TopComponent findTopComponent() {
545         return (TopComponent) SwingUtilities.getAncestorOfClass(
546                 TopComponent.class, getScene().getView());
547     }
548
549     /**
550      * Returns a Node for the WSDL component that this widget represents.
551      * If this widget does not have an assigned WSDL component, then this
552      * returns an AbstractNode with no interesting properties.
553      */

554     private synchronized Node getNode() {
555         if (componentNode == null) {
556             //Show only partnerlinktype in add action.
557
Set JavaDoc<String JavaDoc> tnsSet = new HashSet JavaDoc<String JavaDoc>();
558             tnsSet.add(BPELQName.PLNK_NS);
559             componentNode = new ExtensibilityElementsFolderNode(mModel.getDefinitions(), tnsSet);
560             componentNode = new WidgetFilterNode(componentNode);
561         }
562         return componentNode;
563     }
564
565     public JPopupMenu JavaDoc getPopupMenu(Widget widget, Point JavaDoc point) {
566         Node node = getNode();
567         if (node != null) {
568             // Using Node.getContextMenu() appears to bypass our FilterNode,
569
// so we must build out the context menu as follows.
570
TopComponent tc = findTopComponent();
571             Lookup lookup;
572             if (tc != null) {
573                 // Activate the node just as any explorer view would do.
574
tc.setActivatedNodes(new Node[] { node });
575                 // To get the explorer actions enabled, must have the
576
// lookup from the parent TopComponent.
577
lookup = tc.getLookup();
578             } else {
579                 lookup = Lookup.EMPTY;
580             }
581             // Remove the actions that we do not want to support in this view.
582
Action JavaDoc[] actions = node.getActions(true);
583             return Utilities.actionsToPopup(actions, lookup);
584         }
585         return null;
586     }
587     
588     private class PartnerLinkTypeHitPointWidget extends LabelWidget {
589         public PartnerLinkTypeHitPointWidget(Scene scene) {
590             super(scene, " ");
591             setBorder(new PartnerLinkTypeHitPointBorder());
592             setFont(scene.getDefaultFont());
593         }
594     }
595     
596     
597     private static class PartnerLinkTypeHitPointBorder implements Border {
598    
599         public Insets JavaDoc getInsets() {
600             return new Insets JavaDoc(8, 8, 8, 8);
601         }
602
603         
604         public void paint(Graphics2D JavaDoc g2, Rectangle JavaDoc rectangle) {
605             Paint JavaDoc oldPaint = g2.getPaint();
606             Stroke JavaDoc oldStroke = g2.getStroke();
607             
608             Object JavaDoc oldStrokeControl = g2.getRenderingHint(
609                     RenderingHints.KEY_STROKE_CONTROL);
610             
611             g2.setPaint(Color.WHITE);
612             g2.fill(rectangle);
613             
614             g2.setRenderingHint(RenderingHints.KEY_STROKE_CONTROL,
615                     RenderingHints.VALUE_STROKE_PURE);
616             g2.setPaint(WidgetConstants.HIT_POINT_BORDER);
617             g2.setStroke(new BasicStroke JavaDoc(2));
618             g2.drawRoundRect(rectangle.x + 1, rectangle.y + 1,
619                     rectangle.width - 2, rectangle.height - 2, 6, 6);
620             
621             g2.setPaint(oldPaint);
622             g2.setStroke(oldStroke);
623             g2.setRenderingHint(RenderingHints.KEY_STROKE_CONTROL,
624                     oldStrokeControl);
625         }
626         
627
628         public boolean isOpaque() {
629             return true;
630         }
631     }
632 }
633
Popular Tags