1 19 package org.netbeans.modules.xml.wsdl.ui.view.grapheditor.widget; 20 21 import java.awt.BasicStroke ; 22 import java.awt.Color ; 23 import java.awt.Dimension ; 24 import java.awt.Graphics2D ; 25 import java.awt.Image ; 26 import java.awt.Insets ; 27 import java.awt.Paint ; 28 import java.awt.Point ; 29 import java.awt.Rectangle ; 30 import java.awt.RenderingHints ; 31 import java.awt.Stroke ; 32 import java.awt.datatransfer.DataFlavor ; 33 import java.awt.datatransfer.Transferable ; 34 import java.awt.event.ActionEvent ; 35 import java.awt.event.ActionListener ; 36 import java.util.ArrayList ; 37 import java.util.Collection ; 38 import java.util.HashSet ; 39 import java.util.List ; 40 import java.util.Set ; 41 42 import javax.swing.Action ; 43 import javax.swing.JPopupMenu ; 44 import javax.swing.SwingUtilities ; 45 import javax.xml.namespace.QName ; 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 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 (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 draggedObject = null; 97 private int partnerLinkTypesHitPointIndex = -1; 98 private Widget stubWidget; 99 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 ( 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 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 createButtonWidget = new ButtonWidget(scene, 145 NbBundle.getMessage(CollaborationsWidget.class, 146 "LBL_CollaborationsWidget_AutoCreate")); 147 createButtonWidget.setActionListener(new ActionListener () { 148 public void actionPerformed(ActionEvent e) { 149 WSDLComponentFactory factory = mModel.getFactory(); 151 QName qname = BPELQName.PARTNER_LINK_TYPE.getQName(); 152 try { 153 if (mModel.startTransaction()) { 154 Definitions definitions = mModel.getDefinitions(); 155 Collection <PortType> ports = getUnusedPortTypes(); 156 for (PortType pt : ports) { 157 PartnerLinkType plt = (PartnerLinkType) factory.create( 158 definitions, qname); 159 String 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 ButtonWidget addButtonWidget = new ButtonWidget(scene, 185 NbBundle.getMessage(CollaborationsWidget.class, 186 "LBL_CollaborationsWidget_AddPartnerLinkType")); 187 addButtonWidget.setActionListener(new ActionListener () { 188 public void actionPerformed(ActionEvent 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 removeButtonWidget = new ButtonWidget(scene, 216 NbBundle.getMessage(CollaborationsWidget.class, 217 "LBL_CollaborationsWidget_RemovePartnerLinkType")); 218 removeButtonWidget.setActionListener(new ActionListener () { 219 public void actionPerformed(ActionEvent e) { 220 List <Widget> children = new ArrayList <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 actionWidget.addChild(expanderWidget); 235 return actionWidget; 236 } 237 238 public Widget createTextButton(Scene scene, String 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 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 <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 removeButtonWidget.setButtonEnabled(false); 290 Collection <PortType> ports = getUnusedPortTypes(); 291 createButtonWidget.setVisible(ports.size() > 0); 292 } 293 294 private boolean hasPartnerLinkTypes() { 295 List <PartnerLinkType> partnerLinkTypes = mModel.getDefinitions().getExtensibilityElements(PartnerLinkType.class); 296 return partnerLinkTypes == null || !partnerLinkTypes.isEmpty(); 297 } 298 299 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 <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 scenePoint, WidgetDropTargetDragEvent event) { 338 try { 339 Transferable t = event.getTransferable(); 340 if (t != null) { 341 for (DataFlavor flavor : t.getTransferDataFlavors()) { 342 Class 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 ex) { 353 } 355 return false; 356 } 357 358 public boolean drop(Point 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 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 point, Object draggedObj) { 404 this.draggedObject = draggedObj; 405 List <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 444 private Collection <PortType> getUnusedPortTypes() { 445 List <PortType> allPorts = new ArrayList <PortType>(); 447 Definitions defs = mModel.getDefinitions(); 448 Collection <PortType> ports = defs.getPortTypes(); 449 if (ports != null) { 450 allPorts.addAll(ports); 451 } 452 Collection <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 <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 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 <PartnerLinkTypeWidget> getPartnerLinkTypeWidgets() { 500 if (mCollaborationContentWidget.getParentWidget() == null) return null; 501 502 List <PartnerLinkTypeWidget> result = new ArrayList <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 scenePoint) { 514 List <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 partnerLinkTypePoint = partnerLinkTypeWidget.convertSceneToLocal(scenePoint); 527 Rectangle partnerLinkTypeBounds = partnerLinkTypeWidget.getBounds(); 528 529 530 if (partnerLinkTypePoint.y < partnerLinkTypeBounds.getCenterY()) { 531 return i; 532 } 533 } 534 535 return partnerLinkTypeWidgets.size(); 536 } 537 538 544 protected TopComponent findTopComponent() { 545 return (TopComponent) SwingUtilities.getAncestorOfClass( 546 TopComponent.class, getScene().getView()); 547 } 548 549 554 private synchronized Node getNode() { 555 if (componentNode == null) { 556 Set <String > tnsSet = new HashSet <String >(); 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 getPopupMenu(Widget widget, Point point) { 566 Node node = getNode(); 567 if (node != null) { 568 TopComponent tc = findTopComponent(); 571 Lookup lookup; 572 if (tc != null) { 573 tc.setActivatedNodes(new Node[] { node }); 575 lookup = tc.getLookup(); 578 } else { 579 lookup = Lookup.EMPTY; 580 } 581 Action [] 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 getInsets() { 600 return new Insets (8, 8, 8, 8); 601 } 602 603 604 public void paint(Graphics2D g2, Rectangle rectangle) { 605 Paint oldPaint = g2.getPaint(); 606 Stroke oldStroke = g2.getStroke(); 607 608 Object 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 (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 |