1 19 27 28 package org.netbeans.modules.xml.wsdl.ui.view.grapheditor.widget; 29 30 import java.awt.EventQueue ; 31 import java.awt.Graphics2D ; 32 import java.awt.Paint ; 33 import java.awt.Point ; 34 import java.awt.Rectangle ; 35 import java.awt.RenderingHints ; 36 import java.awt.Shape ; 37 import java.awt.geom.Rectangle2D ; 38 import java.util.ArrayList ; 39 import java.util.Collections ; 40 import java.util.HashSet ; 41 import java.util.List ; 42 import java.util.ListIterator ; 43 import java.util.Set ; 44 45 import javax.swing.Action ; 46 import javax.swing.JPopupMenu ; 47 import javax.swing.SwingUtilities ; 48 49 import org.netbeans.api.visual.action.ActionFactory; 50 import org.netbeans.api.visual.action.PopupMenuProvider; 51 import org.netbeans.api.visual.model.ObjectState; 52 import org.netbeans.api.visual.widget.Scene; 53 import org.netbeans.api.visual.widget.Widget; 54 import org.netbeans.modules.xml.wsdl.model.WSDLComponent; 55 import org.netbeans.modules.xml.wsdl.model.WSDLModel; 56 import org.netbeans.modules.xml.wsdl.ui.view.treeeditor.NodesFactory; 57 import org.netbeans.modules.xml.xam.ComponentEvent; 58 import org.netbeans.modules.xml.xam.ComponentListener; 59 import org.netbeans.modules.xml.xam.Model; 60 import org.openide.actions.ReorderAction; 61 import org.openide.nodes.AbstractNode; 62 import org.openide.nodes.Children; 63 import org.openide.nodes.Node; 64 import org.openide.util.Lookup; 65 import org.openide.util.Utilities; 66 import org.openide.util.WeakListeners; 67 import org.openide.util.lookup.AbstractLookup; 68 import org.openide.util.lookup.InstanceContent; 69 import org.openide.util.lookup.ProxyLookup; 70 import org.openide.windows.TopComponent; 71 72 79 public abstract class AbstractWidget<T extends WSDLComponent> extends Widget 80 implements ComponentListener, PopupMenuProvider { 81 82 83 private T wsdlComponent; 84 85 private Lookup widgetLookup; 86 87 private InstanceContent lookupContent; 88 89 private Node componentNode; 90 91 private ComponentListener weakComponentListener; 92 93 private WSDLModel model; 94 95 96 103 public AbstractWidget(Scene scene, T component, Lookup lookup) { 104 super(scene); 105 model = ((PartnerScene)scene).getModel(); 106 lookupContent = new InstanceContent(); 107 widgetLookup = new ProxyLookup(new Lookup[] { 108 new AbstractLookup(lookupContent), 109 lookup 110 }); 111 if (component != null) { 112 lookupContent.add(component); 113 } 114 setWSDLComponent(component); 115 getActions().addAction(ActionFactory.createPopupMenuAction(this)); 116 } 117 118 126 protected void deleteComponent() { 127 if (wsdlComponent == null) { 128 return; 129 } 130 registerListener(null); 132 try { 133 if (model.startTransaction()) { 134 model.removeChildComponent(wsdlComponent); 135 postDeleteComponent(model); 136 } 137 } finally { 138 model.endTransaction(); 139 } 140 model = null; 141 } 142 143 public WSDLModel getModel() { 144 return model; 145 } 146 147 154 protected void postDeleteComponent(@SuppressWarnings ("unused") 155 Model model) { 156 } 158 159 165 protected TopComponent findTopComponent() { 166 return (TopComponent) SwingUtilities.getAncestorOfClass( 167 TopComponent.class, getScene().getView()); 168 } 169 170 @Override 171 public Lookup getLookup() { 172 return widgetLookup; 173 } 174 175 182 protected InstanceContent getLookupContent() { 183 return lookupContent; 184 } 185 186 191 public synchronized Node getNode() { 192 if (componentNode == null) { 193 if (wsdlComponent == null) { 194 componentNode = new AbstractNode(Children.LEAF); 196 } else { 197 NodesFactory factory = NodesFactory.getInstance(); 199 componentNode = factory.create(wsdlComponent); 200 } 201 componentNode = getNodeFilter(componentNode); 202 } 203 return componentNode; 204 } 205 206 215 protected Node getNodeFilter(Node original) { 216 return new WidgetFilterNode(original, this); 217 } 218 219 public JPopupMenu getPopupMenu(Widget widget, Point point) { 220 Node node = getNode(); 221 if (node != null && wsdlComponent != null) { 222 Set <WSDLComponent> set = new HashSet <WSDLComponent>(); 223 set.add(getWSDLComponent()); 224 ((PartnerScene) getScene()).setSelectedObjects(set); 225 TopComponent tc = findTopComponent(); 226 Lookup lookup; 227 if (tc != null) { 228 tc.setActivatedNodes(new Node[] { node }); 230 lookup = tc.getLookup(); 233 } else { 234 lookup = Lookup.EMPTY; 235 } 236 Action [] actions = node.getActions(true); 238 List <Action > list = new ArrayList <Action >(); 239 Collections.addAll(list, actions); 240 updateActions(list); 241 actions = list.toArray(new Action [list.size()]); 242 return Utilities.actionsToPopup(actions, lookup); 243 } 244 return null; 245 } 246 247 252 public T getWSDLComponent() { 253 return wsdlComponent; 254 } 255 256 @Override 257 protected void notifyStateChanged(ObjectState previousState, ObjectState state) { 258 super.notifyStateChanged(previousState, state); 259 if (state.isSelected()) { 261 TopComponent tc = findTopComponent(); 262 if (tc != null) { 263 Node node = getNode(); 264 tc.setActivatedNodes(new Node[] { node }); 265 } 266 267 } 268 repaint(); 269 } 270 271 279 protected void registerListener(T component) { 280 if (wsdlComponent != null) { 281 wsdlComponent.getModel().removeComponentListener(weakComponentListener); 282 weakComponentListener = null; 283 } 284 if (component != null) { 285 weakComponentListener = (ComponentListener) WeakListeners.create( 286 ComponentListener.class, this, model); 287 model.addComponentListener(weakComponentListener); 288 } 289 } 290 291 298 protected void setWSDLComponent(T component) { 299 registerListener(component); 300 wsdlComponent = component; 301 } 302 303 @Override 304 protected void paintChildren() { 305 super.paintChildren(); 306 307 if (getState().isSelected()) { 308 Graphics2D g2 = getGraphics(); 309 310 Object oldStrokeControl = g2.getRenderingHint(RenderingHints 311 .KEY_STROKE_CONTROL); 312 Paint oldPaint = g2.getPaint(); 313 314 g2.setRenderingHint(RenderingHints.KEY_STROKE_CONTROL, 315 RenderingHints.VALUE_STROKE_PURE); 316 317 g2.setPaint(WidgetConstants.SELECTION_COLOR); 318 319 g2.draw(createSelectionShape()); 320 321 g2.setPaint(oldPaint); 322 323 g2.setRenderingHint(RenderingHints.KEY_STROKE_CONTROL, 324 oldStrokeControl); 325 } 326 } 327 328 333 protected Shape createSelectionShape() { 334 Rectangle rect = getBounds(); 335 return new Rectangle2D.Double (rect.x + 1, rect.y + 1, rect.width - 2, 336 rect.height - 2); 337 } 338 339 348 protected void updateActions(List <Action > actions) { 349 ListIterator <Action > liter = actions.listIterator(); 350 while (liter.hasNext()) { 351 Action action = liter.next(); 352 if (action instanceof ReorderAction) { 353 liter.remove(); 354 } 355 } 356 } 357 358 363 protected void updateContent() { 364 } 365 366 373 private void checkUpdate(ComponentEvent event) { 374 Object src = event.getSource(); 375 if (src.equals(wsdlComponent)) { 376 Runnable updater = new Runnable () { 377 public void run() { 378 updateContent(); 379 getScene().validate(); 380 } 381 }; 382 if (EventQueue.isDispatchThread()) { 383 updater.run(); 384 } else { 385 EventQueue.invokeLater(updater); 386 } 387 } 388 } 389 390 public void childrenAdded(ComponentEvent event) { 391 checkUpdate(event); 392 } 393 394 public void childrenDeleted(ComponentEvent event) { 395 checkUpdate(event); 396 } 397 398 public void valueChanged(ComponentEvent event) { 399 checkUpdate(event); 400 } 401 } 402 | Popular Tags |