1 19 27 28 package org.netbeans.modules.xml.wsdl.ui.view.grapheditor.widget; 29 30 import java.awt.Color ; 31 import java.awt.Font ; 32 import java.awt.Point ; 33 import java.awt.Rectangle ; 34 import java.awt.datatransfer.DataFlavor ; 35 import java.awt.datatransfer.Transferable ; 36 import java.util.ArrayList ; 37 import java.util.EnumSet ; 38 import java.util.List ; 39 import java.util.ListIterator ; 40 import java.util.Vector ; 41 import javax.swing.Action ; 42 import javax.swing.BorderFactory ; 43 import javax.swing.ComboBoxModel ; 44 import javax.swing.DefaultComboBoxModel ; 45 import org.netbeans.api.visual.action.ActionFactory; 46 import org.netbeans.api.visual.action.InplaceEditorProvider; 47 import org.netbeans.api.visual.action.TextFieldInplaceEditor; 48 import org.netbeans.api.visual.action.WidgetAction.WidgetDropTargetDragEvent; 49 import org.netbeans.api.visual.action.WidgetAction.WidgetDropTargetDropEvent; 50 import org.netbeans.api.visual.layout.Layout; 51 import org.netbeans.api.visual.layout.LayoutFactory; 52 import org.netbeans.api.visual.layout.LayoutFactory.SerialAlignment; 53 import org.netbeans.api.visual.widget.LabelWidget; 54 import org.netbeans.api.visual.widget.Scene; 55 import org.netbeans.api.visual.widget.Widget; 56 import org.netbeans.api.visual.widget.LabelWidget.Alignment; 57 import org.netbeans.api.visual.widget.LabelWidget.VerticalAlignment; 58 import org.netbeans.modules.xml.refactoring.ui.util.AnalysisUtilities; 59 import org.netbeans.modules.xml.wsdl.model.Definitions; 60 import org.netbeans.modules.xml.wsdl.model.Fault; 61 import org.netbeans.modules.xml.wsdl.model.Message; 62 import org.netbeans.modules.xml.wsdl.model.OperationParameter; 63 import org.netbeans.modules.xml.wsdl.model.WSDLModel; 64 import org.netbeans.modules.xml.wsdl.ui.netbeans.module.Utility; 65 import org.netbeans.modules.xml.wsdl.ui.view.grapheditor.actions.ComboBoxInplaceEditor; 66 import org.netbeans.modules.xml.wsdl.ui.view.grapheditor.actions.ComboBoxInplaceEditorProvider; 67 import org.netbeans.modules.xml.wsdl.ui.view.grapheditor.actions.HoverActionProvider; 68 import org.netbeans.modules.xml.wsdl.ui.view.treeeditor.MessageNode; 69 import org.netbeans.modules.xml.wsdl.ui.wsdl.util.DisplayObject; 70 import org.netbeans.modules.xml.xam.ui.XAMUtils; 71 import org.openide.actions.NewAction; 72 import org.openide.nodes.Node; 73 import org.openide.util.Lookup; 74 import org.openide.util.NbBundle; 75 76 80 public class OperationParameterWidget extends AbstractWidget<OperationParameter> 81 implements DnDHandler { 82 83 private LabelWidget mParameterMessage; 84 private OperationParameter mParameter; 85 86 87 94 public OperationParameterWidget(Scene scene, OperationParameter parameter, 95 Lookup lookup) { 96 super(scene, parameter, lookup); 97 98 mParameter = parameter; 99 setLayout(LayoutFactory.createVerticalLayout(SerialAlignment.JUSTIFY, 1)); 100 mParameterMessage = new LabelWidget (scene); 101 mParameterMessage.setBackground (Color.WHITE); 102 if (parameter.getMessage() != null && 103 parameter.getMessage().get() != null) { 104 mParameterMessage.setLabel(parameter.getMessage().get().getName()); 105 } else { 106 mParameterMessage.setLabel(NbBundle.getMessage(OperationParameterWidget.class, 107 "LBL_OperationParamterWidget_NoMessageSelected")); 108 } 109 mParameterMessage.setVerticalAlignment(VerticalAlignment.CENTER); 110 mParameterMessage.setAlignment(Alignment.CENTER); 111 112 mParameterMessage.getActions().addAction(ActionFactory.createInplaceEditorAction(new ComboBoxInplaceEditorProvider(new ComboBoxInplaceEditor() { 113 public boolean isEnabled(Widget widget) { 114 if (getWSDLComponent() != null) { 115 return !isImported() && XAMUtils.isWritable(getWSDLComponent().getModel()); 116 } 117 return false; 118 } 119 120 121 public boolean getEditable() { 122 return false; 123 } 124 125 public ComboBoxModel getModel() { 126 Vector <DisplayObject> list = getAllMessages(mParameter.getModel()); 127 DefaultComboBoxModel model = new DefaultComboBoxModel (list); 128 if (getSelectedItem() != null) { 129 if (getSelectedItem() != null) { 130 DisplayObject selectedObject = null; 131 for (DisplayObject dispObj : list) { 132 if (dispObj.getValue().equals(getSelectedItem())) { 133 selectedObject = dispObj; 134 break; 135 } 136 } 137 if (selectedObject != null) 138 model.setSelectedItem(selectedObject); 139 } 140 } 141 return model; 142 } 143 144 public Object getSelectedItem() { 145 if (mParameter.getMessage() != null) { 146 return mParameter.getMessage().get(); 147 } 148 return null; 149 } 150 151 public void setSelectedItem(Object selectedItem) { 152 WSDLModel model = mParameter.getModel(); 153 try { 154 if (model.startTransaction()) { 155 Message message = null; 156 if (selectedItem instanceof DisplayObject) { 157 DisplayObject dispObj = (DisplayObject) selectedItem; 158 Object obj = dispObj.getValue(); 159 if (obj instanceof Message) { 160 message = (Message) obj; 161 } 162 } else if (selectedItem instanceof String ) { 163 message = model.getFactory().createMessage(); 164 message.setName((String ) selectedItem); 165 model.getDefinitions().addMessage(message); 166 } 167 if (message != null) { 168 mParameter.setMessage(mParameter.createReferenceTo( 169 message, Message.class)); 170 } 171 } 172 } finally { 173 model.endTransaction(); 174 } 175 } 176 177 }, EnumSet.<InplaceEditorProvider.ExpansionDirection>of (InplaceEditorProvider.ExpansionDirection.RIGHT)))); 178 179 if (parameter instanceof Fault) { 180 Widget widget = new Widget(scene); 181 widget.setLayout(new OperationParameterLayout(10)); 182 addChild(widget); 183 184 mParameter = parameter; 185 LabelWidget mLabel = new LabelWidget (scene); 186 mLabel.setBackground (Color.WHITE); 187 if (mParameter != null) { 188 mLabel.setLabel (mParameter.getName()); 189 mLabel.getActions().addAction(ActionFactory.createInplaceEditorAction(new TextFieldInplaceEditor() { 190 191 public void setText(Widget widget, String text) { 192 if (getWSDLComponent() != null) 193 AnalysisUtilities.locallyRenameRefactor(getWSDLComponent(), text); 194 } 195 196 public boolean isEnabled(Widget widget) { 197 if (getWSDLComponent() != null) { 198 return !isImported() && XAMUtils.isWritable(getWSDLComponent().getModel()); 199 } 200 return false; 201 } 202 203 public String getText(Widget widget) { 204 return mParameter.getName(); 205 } 206 207 }, 208 EnumSet.<InplaceEditorProvider.ExpansionDirection>of (InplaceEditorProvider.ExpansionDirection.LEFT, 209 InplaceEditorProvider.ExpansionDirection.RIGHT))); 210 } 211 mLabel.getActions().addAction(HoverActionProvider.getDefault(getScene()).getHoverAction()); 212 Font font = scene.getDefaultFont ().deriveFont (Font.BOLD); 213 mLabel.setFont (font); 214 mLabel.setAlignment(Alignment.CENTER); 215 widget.addChild (mLabel); 216 widget.addChild(mParameterMessage); 217 } else { 218 addChild(mParameterMessage); 219 } 220 getActions().addAction(((PartnerScene) getScene()).getDnDAction()); 221 } 222 223 public void setText(String text) { 224 mParameterMessage.setLabel(text); 225 } 226 227 public String getText() { 228 return this.mParameterMessage.getLabel(); 229 } 230 231 protected boolean isImported() { 232 if (getWSDLComponent() != null) { 233 return getModel() != getWSDLComponent().getModel(); 234 } 235 return false; 236 } 237 238 @Override 239 protected Node getNodeFilter(Node original) { 240 if (isImported()) return new ReadOnlyWidgetFilterNode(original); 241 242 return super.getNodeFilter(original); 243 } 244 245 private Vector <DisplayObject> getAllMessages(WSDLModel model) { 246 Vector <DisplayObject> list = new Vector <DisplayObject>(); 247 248 list.addAll(getAllAvailableMessages(model, model)); 249 250 for (WSDLModel imported : Utility.getImportedDocuments(model)) { 251 list.addAll(getAllAvailableMessages(model, imported)); 252 } 253 254 return list; 255 256 } 257 258 private static List <DisplayObject> getAllAvailableMessages(WSDLModel source, WSDLModel document) { 259 ArrayList <DisplayObject> portTypesList = new ArrayList <DisplayObject>(); 260 261 Definitions definition = document.getDefinitions(); 262 263 for (Message message : definition.getMessages()) { 264 String name = message.getName(); 265 String targetNamespace = document.getDefinitions().getTargetNamespace(); 266 String prefix = Utility.getNamespacePrefix(targetNamespace, source); 267 if(name != null) { 268 if(prefix != null) { 269 String messageQNameStr = prefix + ":" + name; 270 portTypesList.add(new DisplayObject(messageQNameStr, message)); 271 } else { 272 portTypesList.add(new DisplayObject(name, message)); 273 } 274 } 275 } 276 277 return portTypesList; 278 } 279 280 @Override 281 public void updateContent() { 282 String msg = null; 283 if (mParameter.getMessage() != null && mParameter.getMessage().get() != null) { 284 msg = mParameter.getMessage().get().getName(); 285 } 286 if (msg != null && !msg.equals(getText())) { 287 setText(msg); 288 } 289 } 290 291 public class OperationParameterLayout implements Layout { 292 293 int mGap; 294 295 public OperationParameterLayout(int gap) { 296 mGap = gap; 297 } 298 299 public void justify(Widget widget) { 300 Rectangle parentBounds = widget.getClientArea(); 301 302 List <Widget> children = widget.getChildren(); 303 304 Widget first = children.get(0); 305 Widget second = children.get(1); 306 307 Point fPt = first.getLocation(); 308 Point sPt = second.getLocation(); 309 310 311 312 int centerOfWidget = parentBounds.width / 2; 313 fPt.x = centerOfWidget - (mGap / 2) - first.getBounds().width; 314 315 sPt.x = centerOfWidget + (mGap / 2); 316 317 first.resolveBounds(fPt, first.getBounds()); 318 second.resolveBounds(sPt, second.getBounds()); 319 } 320 321 public void layout(Widget widget) { 322 List <Widget> children = widget.getChildren(); 323 324 Widget first = children.get(0); 325 Widget second = children.get(1); 326 327 Point sPt = new Point (0, 0); 328 sPt.x = first.getPreferredBounds().width + mGap; 329 330 331 first.resolveBounds(new Point (), first.getPreferredBounds()); 332 second.resolveBounds(sPt, second.getPreferredBounds()); 333 } 334 335 public boolean requiresJustification(Widget widget) { 336 return true; 337 } 338 339 } 340 341 public void dragExit() { 342 setBorder(BorderFactory.createEmptyBorder()); 343 } 344 345 public boolean dragOver(Point scenePoint, WidgetDropTargetDragEvent event) { 346 if (isImported()) return false; 347 Transferable transferable = event.getTransferable(); 348 349 try { 350 if (transferable != null) { 351 for (DataFlavor flavor : transferable.getTransferDataFlavors()) { 352 Class repClass = flavor.getRepresentationClass(); 353 if (Node.class.isAssignableFrom(repClass)) { 354 Node node = Node.class.cast(transferable.getTransferData(flavor)); 355 if (node instanceof MessageNode) { 356 setBorder(BorderFactory.createLineBorder(WidgetConstants.HIT_POINT_BORDER, 2)); 357 event.acceptDrag(event.getDropAction()); 358 return true; 359 } 360 } 361 } 362 } 363 } catch (Exception ex) { 364 } 366 367 return false; 368 } 369 370 public boolean drop(Point scenePoint, WidgetDropTargetDropEvent event) { 371 if (isImported()) return false; 372 Transferable transferable = event.getTransferable(); 373 try { 374 if (transferable != null) { 375 for (DataFlavor flavor : transferable.getTransferDataFlavors()) { 376 Class repClass = flavor.getRepresentationClass(); 377 Object data = transferable.getTransferData(flavor); 378 if (Node.class.isAssignableFrom(repClass)) { 379 Node node = (Node) data; 380 if (node instanceof MessageNode) { 381 setBorder(BorderFactory.createEmptyBorder()); 382 setMessage((MessageNode)node); 383 } 384 return true; 385 } 386 } 387 } 388 } catch (Exception ex) { 389 } 391 return false; 392 } 393 394 private void setMessage(MessageNode node) { 395 Message message = (Message) node.getWSDLComponent(); 396 if (getModel().startTransaction()) { 397 try { 398 getWSDLComponent().setMessage(getWSDLComponent().createReferenceTo(message, Message.class)); 399 } finally { 400 getModel().endTransaction(); 401 } 402 } 403 404 } 405 406 public void expandForDragAndDrop() {} 407 408 public boolean isCollapsed() { 409 return false; 410 } 411 412 @Override 413 protected void updateActions(List <Action > actions) { 414 super.updateActions(actions); 415 ListIterator <Action > liter = actions.listIterator(); 416 while (liter.hasNext()) { 417 Action action = liter.next(); 418 if (action instanceof NewAction) { 419 liter.remove(); 420 } 421 } 422 } 423 } 424 | Popular Tags |