blob: f9fe653872b2e26e0413e559437e3c6556130c6e [file] [log] [blame]
kchong38cbf172006-03-29 03:38:21 +00001/*******************************************************************************
2 * Copyright (c) 2001, 2006 IBM Corporation and others.
3 * All rights reserved. This program and the accompanying materials
4 * are made available under the terms of the Eclipse Public License v1.0
5 * which accompanies this distribution, and is available at
6 * http://www.eclipse.org/legal/epl-v10.html
7 *
8 * Contributors:
9 * IBM Corporation - initial API and implementation
10 *******************************************************************************/
kchong2be71b32006-04-11 16:32:03 +000011package org.eclipse.wst.xsd.ui.internal.adt.design.editparts;
kchong38cbf172006-03-29 03:38:21 +000012
csalterf42b52e2006-05-11 05:20:57 +000013import java.util.Iterator;
14import java.util.List;
kchong38cbf172006-03-29 03:38:21 +000015import org.eclipse.draw2d.ColorConstants;
16import org.eclipse.draw2d.IFigure;
17import org.eclipse.draw2d.Label;
csalterc7926c02006-07-18 16:19:46 +000018import org.eclipse.draw2d.PositionConstants;
kchong38cbf172006-03-29 03:38:21 +000019import org.eclipse.draw2d.geometry.Point;
20import org.eclipse.gef.DragTracker;
21import org.eclipse.gef.EditPart;
22import org.eclipse.gef.EditPolicy;
23import org.eclipse.gef.GraphicalEditPart;
24import org.eclipse.gef.LayerConstants;
25import org.eclipse.gef.Request;
26import org.eclipse.gef.RequestConstants;
27import org.eclipse.gef.commands.Command;
28import org.eclipse.gef.editparts.AbstractGraphicalEditPart;
29import org.eclipse.gef.requests.DirectEditRequest;
30import org.eclipse.gef.requests.LocationRequest;
kchong43dd1cc2006-07-24 16:48:58 +000031import org.eclipse.swt.custom.CCombo;
kchongf9510bf2006-09-05 21:28:47 +000032import org.eclipse.swt.widgets.Display;
kchongbd37beb2006-05-13 18:38:38 +000033import org.eclipse.wst.xsd.ui.internal.adapters.XSDBaseAdapter;
kchong2be71b32006-04-11 16:32:03 +000034import org.eclipse.wst.xsd.ui.internal.adt.design.directedit.ComboBoxCellEditorManager;
35import org.eclipse.wst.xsd.ui.internal.adt.design.directedit.ElementReferenceDirectEditManager;
36import org.eclipse.wst.xsd.ui.internal.adt.design.directedit.LabelCellEditorLocator;
37import org.eclipse.wst.xsd.ui.internal.adt.design.directedit.LabelEditManager;
38import org.eclipse.wst.xsd.ui.internal.adt.design.directedit.TypeReferenceDirectEditManager;
39import org.eclipse.wst.xsd.ui.internal.adt.design.editparts.model.FocusTypeColumn;
40import org.eclipse.wst.xsd.ui.internal.adt.design.editpolicies.ADTDirectEditPolicy;
41import org.eclipse.wst.xsd.ui.internal.adt.design.editpolicies.ADTSelectionFeedbackEditPolicy;
42import org.eclipse.wst.xsd.ui.internal.adt.design.editpolicies.IADTUpdateCommand;
43import org.eclipse.wst.xsd.ui.internal.adt.design.figures.IFieldFigure;
kchong83beb0b2006-04-12 21:55:41 +000044import org.eclipse.wst.xsd.ui.internal.adt.editor.Messages;
kchong1410efb2006-04-27 18:48:05 +000045import org.eclipse.wst.xsd.ui.internal.adt.facade.IADTObject;
kchong2be71b32006-04-11 16:32:03 +000046import org.eclipse.wst.xsd.ui.internal.adt.facade.IField;
47import org.eclipse.wst.xsd.ui.internal.adt.facade.IType;
48import org.eclipse.wst.xsd.ui.internal.design.editpolicies.GraphNodeDragTracker;
kchongbd37beb2006-05-13 18:38:38 +000049import org.eclipse.xsd.XSDNamedComponent;
kchong38cbf172006-03-29 03:38:21 +000050
51public class BaseFieldEditPart extends BaseTypeConnectingEditPart implements INamedEditPart
52{
53 protected TypeReferenceConnection connectionFigure;
54 protected ADTDirectEditPolicy adtDirectEditPolicy = new ADTDirectEditPolicy();
kchong42cdb082006-04-11 21:11:59 +000055 protected TypeUpdateCommand typeUpdateCommand = new TypeUpdateCommand();
56 protected ElementReferenceUpdateCommand elementUpdateCommand = new ElementReferenceUpdateCommand();
57 protected TypeReferenceConnection connectionFeedbackFigure;
kchong38cbf172006-03-29 03:38:21 +000058
59 protected IFigure createFigure()
60 {
61 IFieldFigure figure = getFigureFactory().createFieldFigure(getModel());
62 figure.setForegroundColor(ColorConstants.black);
63 return figure;
64 }
65
66 public IFieldFigure getFieldFigure()
67 {
68 return (IFieldFigure)figure;
69 }
csalterc7926c02006-07-18 16:19:46 +000070
kchong38cbf172006-03-29 03:38:21 +000071
kchong38cbf172006-03-29 03:38:21 +000072 protected boolean shouldDrawConnection()
73 {
74 boolean result = false;
75
76 // For now we only want to produce outbound lines from a Field to a Type
77 // when the field in contained in the 'focus' edit part
78 for (EditPart parent = getParent(); parent != null; parent = parent.getParent())
79 {
80 if (parent.getModel() instanceof FocusTypeColumn)
81 {
82 result = true;
83 break;
84 }
85 }
86 return result;
87 }
88
csalterf42b52e2006-05-11 05:20:57 +000089 private EditPart getTargetEditPart(IType type)
90 {
91 ColumnEditPart columnEditPart = null;
92 for (EditPart editPart = this; editPart != null; editPart = editPart.getParent())
93 {
94 if (editPart instanceof ColumnEditPart)
95 {
96 columnEditPart = (ColumnEditPart)editPart;
97 break;
98 }
99 }
100 if (columnEditPart != null)
101 {
102 // get the next column
103 EditPart parent = columnEditPart.getParent();
104 List columns = parent.getChildren();
105 int index = columns.indexOf(columnEditPart);
csalter92b38ec2006-07-24 17:23:45 +0000106 if (index + 1 < columns.size())
csalterf42b52e2006-05-11 05:20:57 +0000107 {
108 EditPart nextColumn = (EditPart)columns.get(index + 1);
109 for (Iterator i = nextColumn.getChildren().iterator(); i.hasNext(); )
110 {
111 EditPart child = (EditPart)i.next();
112 if (child.getModel() == type)
113 {
114 return child;
115 }
116 }
117 }
118 }
119 return null;
120 }
121
csalterc7926c02006-07-18 16:19:46 +0000122 private EditPart getTargetConnectionEditPart()
kchong38cbf172006-03-29 03:38:21 +0000123 {
csalterc7926c02006-07-18 16:19:46 +0000124 EditPart result = null;
kchong38cbf172006-03-29 03:38:21 +0000125 IField field = (IField)getModel();
126 IType type = field.getType();
csalterf42b52e2006-05-11 05:20:57 +0000127 //System.out.println("createConnectionFigure : " + type);
kchong38cbf172006-03-29 03:38:21 +0000128 if (type != null) // && type.isComplexType())
129 {
csalterc7926c02006-07-18 16:19:46 +0000130 result = getTargetEditPart(type);
131 }
132 return result;
133 }
134
135 public TypeReferenceConnection createConnectionFigure()
136 {
137 connectionFigure = null;
138 AbstractGraphicalEditPart referenceTypePart = (AbstractGraphicalEditPart)getTargetConnectionEditPart();
139 if (referenceTypePart != null)
140 {
141 connectionFigure = new TypeReferenceConnection();
142
143 if (getFigure().getParent() == referenceTypePart.getFigure())
kchong38cbf172006-03-29 03:38:21 +0000144 {
csalterc7926c02006-07-18 16:19:46 +0000145 connectionFigure.setSourceAnchor(new CenteredConnectionAnchor(getFigure(), CenteredConnectionAnchor.LEFT, 1));
kchong38cbf172006-03-29 03:38:21 +0000146 }
csalterc7926c02006-07-18 16:19:46 +0000147 else
148 {
149 connectionFigure.setSourceAnchor(new CenteredConnectionAnchor(getFigure(), CenteredConnectionAnchor.RIGHT, 5));
150 }
151 int targetAnchorYOffset = 8;
152
153 connectionFigure.setTargetAnchor(new CenteredConnectionAnchor(referenceTypePart.getFigure(), CenteredConnectionAnchor.HEADER_LEFT, 0, targetAnchorYOffset));
154 connectionFigure.setHighlight(false);
155 }
156
kchong38cbf172006-03-29 03:38:21 +0000157 return connectionFigure;
158 }
159
kchong38cbf172006-03-29 03:38:21 +0000160 protected void createEditPolicies()
161 {
csalterc7926c02006-07-18 16:19:46 +0000162 super.createEditPolicies();
kchong38cbf172006-03-29 03:38:21 +0000163 installEditPolicy(EditPolicy.DIRECT_EDIT_ROLE, adtDirectEditPolicy);
kchong6360e2a2006-04-03 23:50:23 +0000164 installEditPolicy(EditPolicy.SELECTION_FEEDBACK_ROLE, new ADTSelectionFeedbackEditPolicy());
kchong38cbf172006-03-29 03:38:21 +0000165 }
csalterc7926c02006-07-18 16:19:46 +0000166
167 public EditPart doGetRelativeEditPart(EditPart editPart, int direction)
168 {
169 EditPart result = null;
170 if (direction == PositionConstants.EAST)
171 {
172 result = getTargetConnectionEditPart();
173 }
174 else
175 {
176 result = super.doGetRelativeEditPart(editPart, direction);
177 if (result == null)
178 {
179 result = ((BaseEditPart)getParent()).doGetRelativeEditPart(editPart, direction);
180 }
181 }
182 return result;
183 }
kchongd4f88a72006-04-03 23:02:54 +0000184
kchong38cbf172006-03-29 03:38:21 +0000185 protected void refreshVisuals()
186 {
187 super.refreshVisuals();
188 IFieldFigure figure = getFieldFigure();
189 IField field = (IField) getModel();
190
191 figure.getNameLabel().setText(field.getName());
192 figure.getTypeLabel().setText(field.getTypeName());
193 figure.refreshVisuals(getModel());
194
195 figure.recomputeLayout();
196
197 ((GraphicalEditPart)getRoot()).getFigure().invalidateTree();
198 }
199
200 public DragTracker getDragTracker(Request request)
201 {
kchong3fab7d52006-04-19 19:16:06 +0000202 return new GraphNodeDragTracker(this);
kchong38cbf172006-03-29 03:38:21 +0000203 }
204
205 /*
206 public IAction[] getActions(Object object)
207 {
208 // when a FieldEditPart is selected it provides it's own actions
209 // as well as those of it's parent 'type' edit part
210 List list = new ArrayList();
211 EditPart compartment = getParent();
212 if (compartment != null)
213 {
214 EditPart type = compartment.getParent();
215 if (type != null && type instanceof IActionProvider)
216 {
217 IActionProvider provider = (IActionProvider)type;
218 addActionsToList(list, provider.getActions(object));
219 }
220 }
221 addActionsToList(list, super.getActions(object));
222 IAction[] result = new IAction[list.size()];
223 list.toArray(result);
224 return result;
225 }*/
226
227 public Label getNameLabelFigure()
228 {
229 return getFieldFigure().getNameLabel();
230 }
231
232 public void performDirectEdit(Point cursorLocation)
233 {
234
235 }
236
237 public void performRequest(Request request)
238 {
kchong1410efb2006-04-27 18:48:05 +0000239 if (((IADTObject)getModel()).isReadOnly())
240 {
241 return;
242 }
kchong38cbf172006-03-29 03:38:21 +0000243 if (request.getType() == RequestConstants.REQ_DIRECT_EDIT||
244 request.getType() == RequestConstants.REQ_OPEN)
245 {
246 IFieldFigure fieldFigure = getFieldFigure();
247 Object model = getModel();
248 if (request instanceof LocationRequest)
249 {
250 LocationRequest locationRequest = (LocationRequest)request;
251 Point p = locationRequest.getLocation();
252
253 if (hitTest(fieldFigure.getTypeLabel(), p))
254 {
255 TypeReferenceDirectEditManager manager = new TypeReferenceDirectEditManager((IField)model, this, fieldFigure.getTypeLabel());
256 typeUpdateCommand.setDelegate(manager);
257 adtDirectEditPolicy.setUpdateCommand(typeUpdateCommand);
258 manager.show();
259 }
260 else if (hitTest(fieldFigure.getNameLabel(), p))
261 {
rmaha18ac082006-07-24 17:32:26 +0000262 directEditNameField();
kchong38cbf172006-03-29 03:38:21 +0000263 }
264 }
rmaha18ac082006-07-24 17:32:26 +0000265 else {
266 directEditNameField();
267 }
kchong38cbf172006-03-29 03:38:21 +0000268 }
269 }
270
rmaha18ac082006-07-24 17:32:26 +0000271 private void directEditNameField() {
272 Object model = getModel();
273 IFieldFigure fieldFigure = getFieldFigure();
274 if ( model instanceof IField)
275 {
276 IField field = (IField) model;
277 if (field.isReference())
278 {
279 ElementReferenceDirectEditManager manager = new ElementReferenceDirectEditManager((IField) model, this, fieldFigure.getNameLabel());
280 elementUpdateCommand.setDelegate(manager);
281 adtDirectEditPolicy.setUpdateCommand(elementUpdateCommand);
282 manager.show();
283 }
284 else
285 {
286 LabelEditManager manager = new LabelEditManager(this, new LabelCellEditorLocator(this, null));
287 NameUpdateCommandWrapper wrapper = new NameUpdateCommandWrapper();
288 adtDirectEditPolicy.setUpdateCommand(wrapper);
289 manager.show();
290 }
291 }
292 }
293
kchongbd37beb2006-05-13 18:38:38 +0000294 public void doEditName(boolean addFromDesign)
295 {
296 if (!addFromDesign) return;
297
298// removeFeedback();
299
kchongf9510bf2006-09-05 21:28:47 +0000300 Runnable runnable = new Runnable()
301 {
302 public void run()
303 {
kchongbd37beb2006-05-13 18:38:38 +0000304 Object object = ((XSDBaseAdapter)getModel()).getTarget();
305 if (object instanceof XSDNamedComponent)
306 {
307 Point p = getNameLabelFigure().getLocation();
308 LabelEditManager manager = new LabelEditManager(BaseFieldEditPart.this, new LabelCellEditorLocator(BaseFieldEditPart.this, p));
309 NameUpdateCommandWrapper wrapper = new NameUpdateCommandWrapper();
310 adtDirectEditPolicy.setUpdateCommand(wrapper);
311 manager.show();
312 }
kchongf9510bf2006-09-05 21:28:47 +0000313 }
314 };
315 Display.getCurrent().asyncExec(runnable);
kchongbd37beb2006-05-13 18:38:38 +0000316
317 }
kchong38cbf172006-03-29 03:38:21 +0000318
319 class NameUpdateCommandWrapper extends Command implements IADTUpdateCommand
320 {
321 Command command;
322 protected DirectEditRequest request;
323
324 public NameUpdateCommandWrapper()
325 {
kchong83beb0b2006-04-12 21:55:41 +0000326 super(Messages._UI_ACTION_UPDATE_NAME);
kchong38cbf172006-03-29 03:38:21 +0000327 }
328
329 public void setRequest(DirectEditRequest request)
330 {
331 this.request = request;
332 }
333
334 public void execute()
335 {
336 IField field = (IField)getModel();
337 Object newValue = request.getCellEditor().getValue();
338 if (newValue instanceof String)
339 {
340 command = field.getUpdateNameCommand((String)newValue);
341 }
342 if (command != null)
343 command.execute();
344 }
345 }
346
347 class TypeUpdateCommand extends Command implements IADTUpdateCommand
348 {
349 protected ComboBoxCellEditorManager delegate;
350 protected DirectEditRequest request;
351
352 public TypeUpdateCommand()
353 {
kchong83beb0b2006-04-12 21:55:41 +0000354 super(Messages._UI_ACTION_UPDATE_TYPE);
kchong38cbf172006-03-29 03:38:21 +0000355 }
356
357 public void setDelegate(ComboBoxCellEditorManager delegate)
358 {
359 this.delegate = delegate;
360 }
361
362 public void setRequest(DirectEditRequest request)
363 {
364 this.request = request;
365 }
366
367 public void execute()
368 {
369 if (delegate != null)
370 {
371 delegate.performEdit(request.getCellEditor());
372 }
373 }
374
375 public boolean canExecute()
376 {
kchong43dd1cc2006-07-24 16:48:58 +0000377 IField field = (IField)getModel();
378 Object newValue = ((CCombo)request.getCellEditor().getControl()).getText();
379 if (newValue instanceof String)
380 {
381 return !newValue.equals(field.getTypeName());
382 }
kchong38cbf172006-03-29 03:38:21 +0000383 return true;
384 }
385 }
386
387 class ElementReferenceUpdateCommand extends Command implements IADTUpdateCommand
388 {
389 protected ComboBoxCellEditorManager delegate;
390 protected DirectEditRequest request;
391
392 public ElementReferenceUpdateCommand()
393 {
kchong83beb0b2006-04-12 21:55:41 +0000394 super(Messages._UI_ACTION_UPDATE_ELEMENT_REFERENCE);
kchong38cbf172006-03-29 03:38:21 +0000395 }
396
397 public void setDelegate(ComboBoxCellEditorManager delegate)
398 {
399 this.delegate = delegate;
400 }
401
402 public void setRequest(DirectEditRequest request)
403 {
404 this.request = request;
405 }
406
407 public void execute()
408 {
409 if (delegate != null)
410 {
411 delegate.performEdit(request.getCellEditor());
412 }
413 }
414
415 public boolean canExecute()
416 {
417 return true;
418 }
419 }
420
421
kchong38cbf172006-03-29 03:38:21 +0000422 public void addFeedback()
423 {
424 // Put back connection figure so it won't get overlayed by other non highlighted connections
425 if (connectionFigure != null)
426 {
427 connectionFeedbackFigure = new TypeReferenceConnection();
428 connectionFeedbackFigure.setSourceAnchor(connectionFigure.getSourceAnchor());
429 connectionFeedbackFigure.setTargetAnchor(connectionFigure.getTargetAnchor());
430 connectionFeedbackFigure.setHighlight(true);
431 getLayer(LayerConstants.FEEDBACK_LAYER).add(connectionFeedbackFigure);
432 }
433 super.addFeedback();
434 getFieldFigure().addSelectionFeedback();
435 }
436
437 public void removeFeedback()
438 {
439 if (connectionFeedbackFigure != null)
440 {
441 connectionFeedbackFigure.setHighlight(false);
442 getLayer(LayerConstants.FEEDBACK_LAYER).remove(connectionFeedbackFigure);
443 }
444 connectionFeedbackFigure = null;
445 super.removeFeedback();
446 getFieldFigure().removeSelectionFeedback();
447 }
448}
449