1 19 20 package org.netbeans.modules.xml.wsdl.ui.view.grapheditor.widget; 21 22 import java.awt.EventQueue ; 23 import java.awt.Font ; 24 import java.awt.Point ; 25 import java.awt.Rectangle ; 26 import java.util.Collections ; 27 import java.util.HashSet ; 28 import java.util.Set ; 29 30 import javax.swing.JLabel ; 31 32 import org.netbeans.api.visual.action.ActionFactory; 33 import org.netbeans.api.visual.action.SelectProvider; 34 import org.netbeans.api.visual.action.WidgetAction; 35 import org.netbeans.api.visual.model.ObjectScene; 36 import org.netbeans.api.visual.widget.Widget; 37 import org.netbeans.modules.xml.wsdl.model.Definitions; 38 import org.netbeans.modules.xml.wsdl.model.WSDLComponent; 39 import org.netbeans.modules.xml.wsdl.model.WSDLModel; 40 import org.netbeans.modules.xml.wsdl.ui.view.grapheditor.DragOverSceneLayer; 41 import org.netbeans.modules.xml.xam.ComponentEvent; 42 import org.netbeans.modules.xml.xam.ComponentListener; 43 44 48 public class PartnerScene extends ObjectScene implements ComponentListener { 49 private ButtonAction buttonAction; 50 private WidgetAction selectAction; 51 private DnDAction dndAction; 52 53 private WSDLModel model; 54 private MessagesWidget messagesWidget; 55 private CollaborationsWidget collaborationsWidget; 56 private DragOverSceneLayer dragOverLayer; 57 private Font defaultFont = new JLabel ().getFont(); 58 private SelectProvider selectProvider; 59 60 public PartnerScene(WSDLModel model) { 61 super(); 62 63 this.model = model; 64 model.addComponentListener(this); 65 66 buttonAction = new ButtonAction(); 67 selectProvider = new ObjectSelectProvider(); 68 selectAction = ActionFactory.createSelectAction(selectProvider); 69 dndAction = new DnDAction(); 70 71 getActions().addAction(selectAction); 72 getActions().addAction(buttonAction); 73 getActions().addAction(dndAction); 74 } 75 76 public WSDLModel getModel() { 77 return model; 78 } 79 80 81 86 public SelectProvider getSelectProvider() { 87 return selectProvider; 88 } 89 90 public ButtonAction getButtonAction() { 91 return buttonAction; 92 } 93 94 public WidgetAction getSelectAction() { 95 return selectAction; 96 } 97 98 99 public WidgetAction getDnDAction() { 100 return dndAction; 101 } 102 103 104 public MessagesWidget getMessagesWidget() { 105 if (messagesWidget == null) { 106 messagesWidget = new MessagesWidget(this, model); 107 } 108 109 return messagesWidget; 110 } 111 112 113 public CollaborationsWidget getCollaborationsWidget() { 114 if (collaborationsWidget == null) { 115 collaborationsWidget = new CollaborationsWidget(this, model); 116 } 117 118 return collaborationsWidget; 119 } 120 121 public DragOverSceneLayer getDragOverLayer() { 122 if (dragOverLayer == null) { 123 dragOverLayer = new DragOverSceneLayer(this); 124 } 125 return dragOverLayer; 126 } 127 128 132 private void pruneStaleBindings() { 133 Set <Object > objects = new HashSet <Object >(getObjects()); 135 for (Object object : objects) { 136 if (object instanceof WSDLComponent && 137 !isInModel((WSDLComponent) object)) { 138 removeObject(object); 139 } 140 } 141 } 142 143 149 private boolean isInModel(WSDLComponent component) { 150 WSDLComponent root = model.getRootComponent(); 151 for (WSDLComponent c = component; c != null; c = c.getParent()) { 152 if (c == root) { 153 return true; 154 } 155 } 156 return false; 157 } 158 159 public void valueChanged(ComponentEvent componentEvent) { 160 updateContent(componentEvent); 161 } 162 163 public void childrenAdded(ComponentEvent componentEvent) { 164 updateContent(componentEvent); 165 } 166 167 public void childrenDeleted(ComponentEvent componentEvent) { 168 updateContent(componentEvent); 169 if (EventQueue.isDispatchThread()) { 172 pruneStaleBindings(); 173 } else { 174 EventQueue.invokeLater(new Runnable () { 175 public void run() { 176 pruneStaleBindings(); 177 } 178 }); 179 } 180 } 181 182 186 private void updateContent(ComponentEvent componentEvent) { 187 if (componentEvent.getSource() instanceof Definitions) { 188 Runnable updater = new Runnable () { 189 public void run() { 190 getMessagesWidget().updateContent(); 191 getCollaborationsWidget().updateContent(); 192 validate(); 194 } 195 }; 196 if (EventQueue.isDispatchThread()) { 197 updater.run(); 198 } else { 199 EventQueue.invokeLater(updater); 200 } 201 } 202 } 203 204 public Font getDefaultFont() { 205 return defaultFont; 206 } 207 208 private class ObjectSelectProvider implements SelectProvider { 209 public boolean isAimingAllowed(Widget widget, Point localLocation, 210 boolean invertSelection) 211 { 212 return false; 213 } 214 215 public boolean isSelectionAllowed(Widget widget, Point localLocation, 216 boolean invertSelection) 217 { 218 return true; 219 } 223 224 225 public void select(Widget widget, Point localLocation, 226 boolean invertSelection) 227 { 228 if (widget instanceof ButtonWidget) { 229 if (!((ButtonWidget) widget).isParenSelectionAllowed()) { 230 return; 232 } 233 } 234 235 Object object = findObject(widget); 236 237 240 if (object != null) { 242 if (getSelectedObjects().contains(object)) { 243 return; 244 } 245 userSelectionSuggested(Collections.singleton(object), 246 invertSelection); 247 Rectangle bounds = widget.getClientArea(); 249 if (bounds != null) { 250 bounds = widget.convertLocalToScene(bounds); 251 getView().scrollRectToVisible(bounds); 252 } 253 } else { 254 userSelectionSuggested(Collections.emptySet(), 255 invertSelection); 256 } 257 } 258 } 259 } 260 | Popular Tags |