From 341b47692a28fae23d7d524efc374c5408832c7e Mon Sep 17 00:00:00 2001 From: Ansgar Radermacher Date: Thu, 13 Mar 2014 10:41:04 +0100 Subject: [Bug 427025] [OCL For Papyrus] Cannot create OCL constraints in Luna Show wait cursor before editing starts Re-activate selection of compartment edit part => enable edit on 2nd click Activate context link tool after constraint creation Enable xtext editor in UML tab of property view (currently for OCL only) --- .../edit/part/CustomConstraintBodyEditPart.java | 38 +++ .../edit/part/CustomConstraintBodyEditPartCN.java | 38 +++ .../custom/edit/part/CustomConstraintEditPart.java | 22 +- .../custom/factory/CustomUMLeditPartFactory.java | 8 + .../clazz/edit/parts/ConstraintBodyEditPart.java | 17 +- .../clazz/edit/parts/ConstraintBodyEditPartCN.java | 15 +- .../editparts/AbstractConstraintEditPart.java | 5 +- .../org.eclipse.papyrus.uml.diagram.dnd/plugin.xml | 3 + .../ClassifierToConstraintDropStrategy.java | 107 +++++++++ .../edit/parts/CustomConstraintBodyEditPart.java | 38 +++ .../edit/parts/CustomConstraintBodyEditPartCN.java | 38 +++ .../edit/parts/CustomConstraintEditPart.java | 22 +- .../custom/factory/CustomUMLeditPartFactory.java | 8 + .../profile/edit/parts/ConstraintBodyEditPart.java | 20 +- .../edit/parts/ConstraintBodyEditPartCN.java | 9 +- .../META-INF/MANIFEST.MF | 4 +- .../plugin.xml | 7 + .../uml/properties/xtext/UndoRedoStack.java | 49 ++++ .../uml/properties/xtext/XtextLanguageEditor.java | 264 +++++++++++++++++++++ .../sheet/AdvancedEditingPropertySection.java | 1 + .../uml/properties/xtext/sheet/UndoRedoStack.java | 49 ---- .../Model/UML/ui/SingleConstraint.xwt | 32 +-- .../org.eclipse.papyrus.uml.properties/plugin.xml | 4 - .../uml/properties/widgets/ExpressionEditor.java | 26 +- .../plugin.xml | 12 +- .../xtext/EssentialOCLEditorConfiguration.java | 28 ++- .../constraintwithessentialocl/xtext/Messages.java | 16 ++ .../xtext/OCLLanguageEditorFactory.java | 5 + .../xtext/messages.properties | 2 + .../DefaultXtextDirectEditorConfiguration.java | 22 +- 30 files changed, 784 insertions(+), 125 deletions(-) create mode 100644 plugins/uml/diagram/org.eclipse.papyrus.uml.diagram.clazz/custom-src/org/eclipse/papyrus/uml/diagram/clazz/custom/edit/part/CustomConstraintBodyEditPart.java create mode 100644 plugins/uml/diagram/org.eclipse.papyrus.uml.diagram.clazz/custom-src/org/eclipse/papyrus/uml/diagram/clazz/custom/edit/part/CustomConstraintBodyEditPartCN.java create mode 100644 plugins/uml/diagram/org.eclipse.papyrus.uml.diagram.dnd/src/org/eclipse/papyrus/uml/diagram/dnd/strategy/constraint/ClassifierToConstraintDropStrategy.java create mode 100644 plugins/uml/diagram/org.eclipse.papyrus.uml.diagram.profile/custom-src/org/eclipse/papyrus/uml/diagram/profile/custom/edit/parts/CustomConstraintBodyEditPart.java create mode 100644 plugins/uml/diagram/org.eclipse.papyrus.uml.diagram.profile/custom-src/org/eclipse/papyrus/uml/diagram/profile/custom/edit/parts/CustomConstraintBodyEditPartCN.java create mode 100644 plugins/uml/properties/org.eclipse.papyrus.uml.properties.xtext/src/org/eclipse/papyrus/uml/properties/xtext/UndoRedoStack.java create mode 100644 plugins/uml/properties/org.eclipse.papyrus.uml.properties.xtext/src/org/eclipse/papyrus/uml/properties/xtext/XtextLanguageEditor.java delete mode 100644 plugins/uml/properties/org.eclipse.papyrus.uml.properties.xtext/src/org/eclipse/papyrus/uml/properties/xtext/sheet/UndoRedoStack.java create mode 100644 plugins/uml/textedit/org.eclipse.papyrus.uml.textedit.constraintwithessentialocl.xtext/src/org/eclipse/papyrus/uml/textedit/constraintwithessentialocl/xtext/Messages.java create mode 100644 plugins/uml/textedit/org.eclipse.papyrus.uml.textedit.constraintwithessentialocl.xtext/src/org/eclipse/papyrus/uml/textedit/constraintwithessentialocl/xtext/OCLLanguageEditorFactory.java create mode 100644 plugins/uml/textedit/org.eclipse.papyrus.uml.textedit.constraintwithessentialocl.xtext/src/org/eclipse/papyrus/uml/textedit/constraintwithessentialocl/xtext/messages.properties (limited to 'plugins/uml') diff --git a/plugins/uml/diagram/org.eclipse.papyrus.uml.diagram.clazz/custom-src/org/eclipse/papyrus/uml/diagram/clazz/custom/edit/part/CustomConstraintBodyEditPart.java b/plugins/uml/diagram/org.eclipse.papyrus.uml.diagram.clazz/custom-src/org/eclipse/papyrus/uml/diagram/clazz/custom/edit/part/CustomConstraintBodyEditPart.java new file mode 100644 index 00000000000..a0938b3fe9f --- /dev/null +++ b/plugins/uml/diagram/org.eclipse.papyrus.uml.diagram.clazz/custom-src/org/eclipse/papyrus/uml/diagram/clazz/custom/edit/part/CustomConstraintBodyEditPart.java @@ -0,0 +1,38 @@ +/***************************************************************************** + * Copyright (c) 2010 CEA LIST. + * + * + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Vincent Lorenzo (CEA LIST) vincent.lorenzo@cea.fr - Initial API and implementation + * + *****************************************************************************/ +package org.eclipse.papyrus.uml.diagram.clazz.custom.edit.part; + +import org.eclipse.gmf.runtime.notation.View; +import org.eclipse.papyrus.uml.diagram.clazz.edit.parts.ConstraintBodyEditPart; + +/** + * Custom variant. Automatically changes to context link tool. + */ +public class CustomConstraintBodyEditPart extends ConstraintBodyEditPart { + + protected boolean first = true; + + public CustomConstraintBodyEditPart(View view) { + super(view); + } + + /** + * don't use isSelectable from @see PapyrusCompartmentEditPart (which returns always false) + * @return whether selectable + */ + @Override + public boolean isSelectable() { + return super.isSelectableOrig(); + } +} diff --git a/plugins/uml/diagram/org.eclipse.papyrus.uml.diagram.clazz/custom-src/org/eclipse/papyrus/uml/diagram/clazz/custom/edit/part/CustomConstraintBodyEditPartCN.java b/plugins/uml/diagram/org.eclipse.papyrus.uml.diagram.clazz/custom-src/org/eclipse/papyrus/uml/diagram/clazz/custom/edit/part/CustomConstraintBodyEditPartCN.java new file mode 100644 index 00000000000..c30100d3e98 --- /dev/null +++ b/plugins/uml/diagram/org.eclipse.papyrus.uml.diagram.clazz/custom-src/org/eclipse/papyrus/uml/diagram/clazz/custom/edit/part/CustomConstraintBodyEditPartCN.java @@ -0,0 +1,38 @@ +/***************************************************************************** + * Copyright (c) 2010 CEA LIST. + * + * + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Vincent Lorenzo (CEA LIST) vincent.lorenzo@cea.fr - Initial API and implementation + * + *****************************************************************************/ +package org.eclipse.papyrus.uml.diagram.clazz.custom.edit.part; + +import org.eclipse.gmf.runtime.notation.View; +import org.eclipse.papyrus.uml.diagram.clazz.edit.parts.ConstraintBodyEditPartCN; + +/** + * Custom variant. Automatically changes to context link tool. + */ +public class CustomConstraintBodyEditPartCN extends ConstraintBodyEditPartCN { + + protected boolean first = true; + + public CustomConstraintBodyEditPartCN(View view) { + super(view); + } + + /** + * don't use isSelectable from @see PapyrusCompartmentEditPart (which returns always false) + * @return whether selectable + */ + @Override + public boolean isSelectable() { + return super.isSelectableOrig(); + } +} diff --git a/plugins/uml/diagram/org.eclipse.papyrus.uml.diagram.clazz/custom-src/org/eclipse/papyrus/uml/diagram/clazz/custom/edit/part/CustomConstraintEditPart.java b/plugins/uml/diagram/org.eclipse.papyrus.uml.diagram.clazz/custom-src/org/eclipse/papyrus/uml/diagram/clazz/custom/edit/part/CustomConstraintEditPart.java index b062c1fe0b7..6481f02fb01 100644 --- a/plugins/uml/diagram/org.eclipse.papyrus.uml.diagram.clazz/custom-src/org/eclipse/papyrus/uml/diagram/clazz/custom/edit/part/CustomConstraintEditPart.java +++ b/plugins/uml/diagram/org.eclipse.papyrus.uml.diagram.clazz/custom-src/org/eclipse/papyrus/uml/diagram/clazz/custom/edit/part/CustomConstraintEditPart.java @@ -13,6 +13,9 @@ *****************************************************************************/ package org.eclipse.papyrus.uml.diagram.clazz.custom.edit.part; +import java.util.ArrayList; +import java.util.List; + import org.eclipse.draw2d.IFigure; import org.eclipse.draw2d.geometry.Point; import org.eclipse.emf.transaction.RunnableWithResult; @@ -24,15 +27,21 @@ import org.eclipse.gmf.runtime.common.core.util.Trace; import org.eclipse.gmf.runtime.diagram.ui.internal.DiagramUIDebugOptions; import org.eclipse.gmf.runtime.diagram.ui.internal.DiagramUIPlugin; import org.eclipse.gmf.runtime.diagram.ui.internal.DiagramUIStatusCodes; +import org.eclipse.gmf.runtime.emf.type.core.IElementType; import org.eclipse.gmf.runtime.notation.View; import org.eclipse.papyrus.uml.diagram.clazz.edit.parts.ConstraintEditPart; +import org.eclipse.papyrus.uml.diagram.clazz.providers.UMLElementTypes; +import org.eclipse.papyrus.uml.diagram.common.service.AspectUnspecifiedTypeConnectionTool; +import org.eclipse.uml2.uml.Constraint; /** - * @generated + * Custom variant. Automatically changes to context link tool. */ @SuppressWarnings("restriction") public class CustomConstraintEditPart extends ConstraintEditPart { + protected boolean first = true; + public CustomConstraintEditPart(View view) { super(view); } @@ -42,6 +51,17 @@ public class CustomConstraintEditPart extends ConstraintEditPart { */ @Override protected void performDirectEditRequest(Request request) { + if (resolveSemanticElement() instanceof Constraint) { + Constraint constraint = (Constraint) resolveSemanticElement(); + if (first && constraint.getContext() == null) { + first = false; + // instead of editing, open link element tool + List elementTypes = new ArrayList(); + elementTypes.add(UMLElementTypes.ConstraintContext_8500); + getEditDomain().setActiveTool(new AspectUnspecifiedTypeConnectionTool(elementTypes)); + return; + } + } EditPart editPart = this; if (request instanceof DirectEditRequest){ Point p = new Point(((DirectEditRequest)request).getLocation()); diff --git a/plugins/uml/diagram/org.eclipse.papyrus.uml.diagram.clazz/custom-src/org/eclipse/papyrus/uml/diagram/clazz/custom/factory/CustomUMLeditPartFactory.java b/plugins/uml/diagram/org.eclipse.papyrus.uml.diagram.clazz/custom-src/org/eclipse/papyrus/uml/diagram/clazz/custom/factory/CustomUMLeditPartFactory.java index 0d7f69c7ab8..9c6ef4b16d8 100644 --- a/plugins/uml/diagram/org.eclipse.papyrus.uml.diagram.clazz/custom-src/org/eclipse/papyrus/uml/diagram/clazz/custom/factory/CustomUMLeditPartFactory.java +++ b/plugins/uml/diagram/org.eclipse.papyrus.uml.diagram.clazz/custom-src/org/eclipse/papyrus/uml/diagram/clazz/custom/factory/CustomUMLeditPartFactory.java @@ -28,6 +28,8 @@ import org.eclipse.papyrus.uml.diagram.clazz.custom.edit.part.CModelEditPartCN; import org.eclipse.papyrus.uml.diagram.clazz.custom.edit.part.CPackageEditPart; import org.eclipse.papyrus.uml.diagram.clazz.custom.edit.part.CPackageEditPartCN; import org.eclipse.papyrus.uml.diagram.clazz.custom.edit.part.CShapeNamedElementEditPart; +import org.eclipse.papyrus.uml.diagram.clazz.custom.edit.part.CustomConstraintBodyEditPart; +import org.eclipse.papyrus.uml.diagram.clazz.custom.edit.part.CustomConstraintBodyEditPartCN; import org.eclipse.papyrus.uml.diagram.clazz.custom.edit.part.CustomConstraintEditPart; import org.eclipse.papyrus.uml.diagram.clazz.custom.edit.part.CustomConstraintEditPartCN; import org.eclipse.papyrus.uml.diagram.clazz.edit.parts.AssociationClassRoleSourceEditPart; @@ -35,6 +37,8 @@ import org.eclipse.papyrus.uml.diagram.clazz.edit.parts.AssociationClassRoleTarg import org.eclipse.papyrus.uml.diagram.clazz.edit.parts.AssociationNodeEditPart; import org.eclipse.papyrus.uml.diagram.clazz.edit.parts.AssociationSourceNameEditPart; import org.eclipse.papyrus.uml.diagram.clazz.edit.parts.AssociationTargetNameEditPart; +import org.eclipse.papyrus.uml.diagram.clazz.edit.parts.ConstraintBodyEditPart; +import org.eclipse.papyrus.uml.diagram.clazz.edit.parts.ConstraintBodyEditPartCN; import org.eclipse.papyrus.uml.diagram.clazz.edit.parts.ConstraintEditPart; import org.eclipse.papyrus.uml.diagram.clazz.edit.parts.ConstraintEditPartCN; import org.eclipse.papyrus.uml.diagram.clazz.edit.parts.ContainmentCircleEditPart; @@ -88,6 +92,10 @@ public class CustomUMLeditPartFactory extends UMLEditPartFactory { return new CustomConstraintEditPart(view); case ConstraintEditPartCN.VISUAL_ID: return new CustomConstraintEditPartCN(view); + case ConstraintBodyEditPart.VISUAL_ID: + return new CustomConstraintBodyEditPart(view); + case ConstraintBodyEditPartCN.VISUAL_ID: + return new CustomConstraintBodyEditPartCN(view); } } return super.createEditPart(context, model); diff --git a/plugins/uml/diagram/org.eclipse.papyrus.uml.diagram.clazz/src/org/eclipse/papyrus/uml/diagram/clazz/edit/parts/ConstraintBodyEditPart.java b/plugins/uml/diagram/org.eclipse.papyrus.uml.diagram.clazz/src/org/eclipse/papyrus/uml/diagram/clazz/edit/parts/ConstraintBodyEditPart.java index 0ad0b9bfbbd..372c99762d1 100644 --- a/plugins/uml/diagram/org.eclipse.papyrus.uml.diagram.clazz/src/org/eclipse/papyrus/uml/diagram/clazz/edit/parts/ConstraintBodyEditPart.java +++ b/plugins/uml/diagram/org.eclipse.papyrus.uml.diagram.clazz/src/org/eclipse/papyrus/uml/diagram/clazz/edit/parts/ConstraintBodyEditPart.java @@ -72,9 +72,11 @@ import org.eclipse.papyrus.uml.diagram.common.figure.node.ConstraintFigure; import org.eclipse.papyrus.uml.diagram.common.figure.node.ILabelFigure; import org.eclipse.swt.SWT; import org.eclipse.swt.accessibility.AccessibleEvent; +import org.eclipse.swt.custom.BusyIndicator; import org.eclipse.swt.graphics.Color; import org.eclipse.swt.graphics.FontData; import org.eclipse.swt.graphics.Image; +import org.eclipse.swt.widgets.Display; import org.eclipse.ui.PlatformUI; import org.eclipse.uml2.uml.Feature; @@ -360,7 +362,14 @@ public class ConstraintBodyEditPart extends PapyrusCompartmentEditPart implement * @generated */ protected void performDirectEdit() { - getManager().show(); + // CursorUtils.setCursor(SWT.CURSOR_WAIT); + BusyIndicator.showWhile(Display.getDefault(), new Runnable() { + + public void run() { + getManager().show(); + } + }); + // CursorUtils.setCursor(SWT.CURSOR_ARROW); } /** @@ -454,10 +463,8 @@ public class ConstraintBodyEditPart extends PapyrusCompartmentEditPart implement if(request.getExtendedData().get(RequestConstants.REQ_DIRECTEDIT_EXTENDEDDATA_INITIAL_CHAR) instanceof Character) { Character initialChar = (Character)request.getExtendedData().get(RequestConstants.REQ_DIRECTEDIT_EXTENDEDDATA_INITIAL_CHAR); performDirectEdit(initialChar.charValue()); - } else if((request instanceof DirectEditRequest) && (getEditText().equals(getLabelText()))) { - DirectEditRequest editRequest = (DirectEditRequest)request; - performDirectEdit(editRequest.getLocation()); - } else { + } + else { performDirectEdit(); } } diff --git a/plugins/uml/diagram/org.eclipse.papyrus.uml.diagram.clazz/src/org/eclipse/papyrus/uml/diagram/clazz/edit/parts/ConstraintBodyEditPartCN.java b/plugins/uml/diagram/org.eclipse.papyrus.uml.diagram.clazz/src/org/eclipse/papyrus/uml/diagram/clazz/edit/parts/ConstraintBodyEditPartCN.java index 6325b0aa446..b1a115a1d90 100644 --- a/plugins/uml/diagram/org.eclipse.papyrus.uml.diagram.clazz/src/org/eclipse/papyrus/uml/diagram/clazz/edit/parts/ConstraintBodyEditPartCN.java +++ b/plugins/uml/diagram/org.eclipse.papyrus.uml.diagram.clazz/src/org/eclipse/papyrus/uml/diagram/clazz/edit/parts/ConstraintBodyEditPartCN.java @@ -72,9 +72,11 @@ import org.eclipse.papyrus.uml.diagram.common.figure.node.ConstraintFigure; import org.eclipse.papyrus.uml.diagram.common.figure.node.ILabelFigure; import org.eclipse.swt.SWT; import org.eclipse.swt.accessibility.AccessibleEvent; +import org.eclipse.swt.custom.BusyIndicator; import org.eclipse.swt.graphics.Color; import org.eclipse.swt.graphics.FontData; import org.eclipse.swt.graphics.Image; +import org.eclipse.swt.widgets.Display; import org.eclipse.ui.PlatformUI; import org.eclipse.uml2.uml.Feature; @@ -360,7 +362,12 @@ public class ConstraintBodyEditPartCN extends PapyrusCompartmentEditPart impleme * @generated */ protected void performDirectEdit() { - getManager().show(); + BusyIndicator.showWhile(Display.getDefault(), new Runnable() { + + public void run() { + getManager().show(); + } + }); } /** @@ -454,10 +461,8 @@ public class ConstraintBodyEditPartCN extends PapyrusCompartmentEditPart impleme if(request.getExtendedData().get(RequestConstants.REQ_DIRECTEDIT_EXTENDEDDATA_INITIAL_CHAR) instanceof Character) { Character initialChar = (Character)request.getExtendedData().get(RequestConstants.REQ_DIRECTEDIT_EXTENDEDDATA_INITIAL_CHAR); performDirectEdit(initialChar.charValue()); - } else if((request instanceof DirectEditRequest) && (getEditText().equals(getLabelText()))) { - DirectEditRequest editRequest = (DirectEditRequest)request; - performDirectEdit(editRequest.getLocation()); - } else { + } + else { performDirectEdit(); } } diff --git a/plugins/uml/diagram/org.eclipse.papyrus.uml.diagram.common/src/org/eclipse/papyrus/uml/diagram/common/editparts/AbstractConstraintEditPart.java b/plugins/uml/diagram/org.eclipse.papyrus.uml.diagram.common/src/org/eclipse/papyrus/uml/diagram/common/editparts/AbstractConstraintEditPart.java index 17305bcfeb0..b6c60b1c479 100644 --- a/plugins/uml/diagram/org.eclipse.papyrus.uml.diagram.common/src/org/eclipse/papyrus/uml/diagram/common/editparts/AbstractConstraintEditPart.java +++ b/plugins/uml/diagram/org.eclipse.papyrus.uml.diagram.common/src/org/eclipse/papyrus/uml/diagram/common/editparts/AbstractConstraintEditPart.java @@ -28,13 +28,12 @@ import org.eclipse.swt.graphics.Font; */ public abstract class AbstractConstraintEditPart extends NamedElementEditPart { - protected static final String CONSTRAINT_VALUE_SPECIFICATION_LISTENER = "Constraint_valueSpecification_Listener"; + protected static final String CONSTRAINT_VALUE_SPECIFICATION_LISTENER = "Constraint_valueSpecification_Listener"; //$NON-NLS-1$ public AbstractConstraintEditPart(View view) { super(view); - // TODO Auto-generated constructor stub } - + /** * this methods add listeners on targets and sources */ diff --git a/plugins/uml/diagram/org.eclipse.papyrus.uml.diagram.dnd/plugin.xml b/plugins/uml/diagram/org.eclipse.papyrus.uml.diagram.dnd/plugin.xml index 1b34c61399d..df7c7e4bcc8 100644 --- a/plugins/uml/diagram/org.eclipse.papyrus.uml.diagram.dnd/plugin.xml +++ b/plugins/uml/diagram/org.eclipse.papyrus.uml.diagram.dnd/plugin.xml @@ -15,5 +15,8 @@ + + diff --git a/plugins/uml/diagram/org.eclipse.papyrus.uml.diagram.dnd/src/org/eclipse/papyrus/uml/diagram/dnd/strategy/constraint/ClassifierToConstraintDropStrategy.java b/plugins/uml/diagram/org.eclipse.papyrus.uml.diagram.dnd/src/org/eclipse/papyrus/uml/diagram/dnd/strategy/constraint/ClassifierToConstraintDropStrategy.java new file mode 100644 index 00000000000..905e977bfa4 --- /dev/null +++ b/plugins/uml/diagram/org.eclipse.papyrus.uml.diagram.dnd/src/org/eclipse/papyrus/uml/diagram/dnd/strategy/constraint/ClassifierToConstraintDropStrategy.java @@ -0,0 +1,107 @@ +/***************************************************************************** + * Copyright (c) 2012 CEA LIST. + * + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Camille Letavernier (CEA LIST) camille.letavernier@cea.fr - Initial API and implementation + *****************************************************************************/ +package org.eclipse.papyrus.uml.diagram.dnd.strategy.constraint; + +import java.util.List; +import java.util.Map; + +import org.eclipse.emf.ecore.EObject; +import org.eclipse.emf.ecore.EStructuralFeature; +import org.eclipse.gef.EditPart; +import org.eclipse.gef.Request; +import org.eclipse.gef.commands.Command; +import org.eclipse.gmf.runtime.common.core.command.CompositeCommand; +import org.eclipse.gmf.runtime.diagram.ui.commands.ICommandProxy; +import org.eclipse.gmf.runtime.emf.type.core.commands.SetValueCommand; +import org.eclipse.gmf.runtime.emf.type.core.requests.SetRequest; +import org.eclipse.papyrus.infra.gmfdiag.dnd.strategy.TransactionalDropStrategy; +import org.eclipse.papyrus.uml.diagram.common.service.AspectUnspecifiedTypeConnectionTool.CreateAspectUnspecifiedTypeConnectionRequest; +import org.eclipse.papyrus.uml.diagram.dnd.Activator; +import org.eclipse.swt.graphics.Image; +import org.eclipse.uml2.uml.Constraint; +import org.eclipse.uml2.uml.UMLPackage; + +/** + * A strategy to drop a Classifier on an InstanceSpecification. The instance + * specification will be typed by the dropped classifiers, and a dialog will + * be opened for the user to select the slots to create in the + * InstanceSpecification. + * + * The slots will correspond to the classifier's property. + * + * @author Camille Letavernier + * + */ +public class ClassifierToConstraintDropStrategy extends TransactionalDropStrategy { + + protected static final EStructuralFeature constraintContext_feature = UMLPackage.eINSTANCE.getConstraint_Context(); + + public String getLabel() { + return "Set constraint context"; + } + + public String getID() { + return Activator.PLUGIN_ID + ".constraintContext"; + } + + public String getCategoryID() { + return getID(); + } + + public String getCategoryLabel() { + return "Sets the dropped classifier as context of the target constraint."; + } + + public String getDescription() { + return getCategoryLabel(); + } + + public Image getImage() { + return null; + } + + public int getPriority() { + return 0; + } + + public void setOptions(Map options) { + //Nothing + } + + @Override + public Command doGetCommand(Request request, EditPart targetEditPart) { + + if( request instanceof CreateAspectUnspecifiedTypeConnectionRequest){ + return null; + } + CompositeCommand cc = new CompositeCommand(getLabel()); + + EObject semanticElement = getTargetSemanticElement(targetEditPart); + + List sourceElements = getSourceEObjects(request); + if (sourceElements.size() != 1) { + return null; + } + if(!(semanticElement instanceof Constraint)) { + return null; + } + + Object sourceElement = sourceElements.get(0); + + SetRequest setClassifiersRequest = new SetRequest(semanticElement, constraintContext_feature, sourceElement); + SetValueCommand setClassifiersCommand = new SetValueCommand(setClassifiersRequest); + + cc.add(setClassifiersCommand); + + return cc.canExecute() ? new ICommandProxy(cc.reduce()) : null; + } +} diff --git a/plugins/uml/diagram/org.eclipse.papyrus.uml.diagram.profile/custom-src/org/eclipse/papyrus/uml/diagram/profile/custom/edit/parts/CustomConstraintBodyEditPart.java b/plugins/uml/diagram/org.eclipse.papyrus.uml.diagram.profile/custom-src/org/eclipse/papyrus/uml/diagram/profile/custom/edit/parts/CustomConstraintBodyEditPart.java new file mode 100644 index 00000000000..ccfa8a2d5c3 --- /dev/null +++ b/plugins/uml/diagram/org.eclipse.papyrus.uml.diagram.profile/custom-src/org/eclipse/papyrus/uml/diagram/profile/custom/edit/parts/CustomConstraintBodyEditPart.java @@ -0,0 +1,38 @@ +/***************************************************************************** + * Copyright (c) 2010 CEA LIST. + * + * + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Vincent Lorenzo (CEA LIST) vincent.lorenzo@cea.fr - Initial API and implementation + * + *****************************************************************************/ +package org.eclipse.papyrus.uml.diagram.profile.custom.edit.parts; + +import org.eclipse.gmf.runtime.notation.View; +import org.eclipse.papyrus.uml.diagram.profile.edit.parts.ConstraintBodyEditPart; + +/** + * Custom variant. Automatically changes to context link tool. + */ +public class CustomConstraintBodyEditPart extends ConstraintBodyEditPart { + + protected boolean first = true; + + public CustomConstraintBodyEditPart(View view) { + super(view); + } + + /** + * don't use isSelectable from @see PapyrusCompartmentEditPart (which returns always false) + * @return whether selectable + */ + @Override + public boolean isSelectable() { + return super.isSelectableOrig(); + } +} diff --git a/plugins/uml/diagram/org.eclipse.papyrus.uml.diagram.profile/custom-src/org/eclipse/papyrus/uml/diagram/profile/custom/edit/parts/CustomConstraintBodyEditPartCN.java b/plugins/uml/diagram/org.eclipse.papyrus.uml.diagram.profile/custom-src/org/eclipse/papyrus/uml/diagram/profile/custom/edit/parts/CustomConstraintBodyEditPartCN.java new file mode 100644 index 00000000000..cc11e9bac69 --- /dev/null +++ b/plugins/uml/diagram/org.eclipse.papyrus.uml.diagram.profile/custom-src/org/eclipse/papyrus/uml/diagram/profile/custom/edit/parts/CustomConstraintBodyEditPartCN.java @@ -0,0 +1,38 @@ +/***************************************************************************** + * Copyright (c) 2010 CEA LIST. + * + * + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Vincent Lorenzo (CEA LIST) vincent.lorenzo@cea.fr - Initial API and implementation + * + *****************************************************************************/ +package org.eclipse.papyrus.uml.diagram.profile.custom.edit.parts; + +import org.eclipse.gmf.runtime.notation.View; +import org.eclipse.papyrus.uml.diagram.profile.edit.parts.ConstraintBodyEditPartCN; + +/** + * Custom variant. Automatically changes to context link tool. + */ +public class CustomConstraintBodyEditPartCN extends ConstraintBodyEditPartCN { + + protected boolean first = true; + + public CustomConstraintBodyEditPartCN(View view) { + super(view); + } + + /** + * don't use isSelectable from @see PapyrusCompartmentEditPart (which returns always false) + * @return whether selectable + */ + @Override + public boolean isSelectable() { + return super.isSelectableOrig(); + } +} diff --git a/plugins/uml/diagram/org.eclipse.papyrus.uml.diagram.profile/custom-src/org/eclipse/papyrus/uml/diagram/profile/custom/edit/parts/CustomConstraintEditPart.java b/plugins/uml/diagram/org.eclipse.papyrus.uml.diagram.profile/custom-src/org/eclipse/papyrus/uml/diagram/profile/custom/edit/parts/CustomConstraintEditPart.java index fac5ad9a0ba..4584fe59187 100644 --- a/plugins/uml/diagram/org.eclipse.papyrus.uml.diagram.profile/custom-src/org/eclipse/papyrus/uml/diagram/profile/custom/edit/parts/CustomConstraintEditPart.java +++ b/plugins/uml/diagram/org.eclipse.papyrus.uml.diagram.profile/custom-src/org/eclipse/papyrus/uml/diagram/profile/custom/edit/parts/CustomConstraintEditPart.java @@ -13,6 +13,9 @@ *****************************************************************************/ package org.eclipse.papyrus.uml.diagram.profile.custom.edit.parts; +import java.util.ArrayList; +import java.util.List; + import org.eclipse.draw2d.IFigure; import org.eclipse.draw2d.geometry.Point; import org.eclipse.emf.transaction.RunnableWithResult; @@ -24,15 +27,21 @@ import org.eclipse.gmf.runtime.common.core.util.Trace; import org.eclipse.gmf.runtime.diagram.ui.internal.DiagramUIDebugOptions; import org.eclipse.gmf.runtime.diagram.ui.internal.DiagramUIPlugin; import org.eclipse.gmf.runtime.diagram.ui.internal.DiagramUIStatusCodes; +import org.eclipse.gmf.runtime.emf.type.core.IElementType; import org.eclipse.gmf.runtime.notation.View; +import org.eclipse.papyrus.uml.diagram.common.service.AspectUnspecifiedTypeConnectionTool; import org.eclipse.papyrus.uml.diagram.profile.edit.parts.ConstraintEditPart; +import org.eclipse.papyrus.uml.diagram.profile.providers.UMLElementTypes; +import org.eclipse.uml2.uml.Constraint; /** - * @generated + * Custom variant. Automatically changes to context link tool. */ @SuppressWarnings("restriction") public class CustomConstraintEditPart extends ConstraintEditPart { + protected boolean first = true; + public CustomConstraintEditPart(View view) { super(view); } @@ -42,6 +51,17 @@ public class CustomConstraintEditPart extends ConstraintEditPart { */ @Override protected void performDirectEditRequest(Request request) { + if (resolveSemanticElement() instanceof Constraint) { + Constraint constraint = (Constraint) resolveSemanticElement(); + if (first && constraint.getContext() == null) { + first = false; + // instead of editing, open link element tool + List elementTypes = new ArrayList(); + elementTypes.add(UMLElementTypes.ConstraintContext_8500); + getEditDomain().setActiveTool(new AspectUnspecifiedTypeConnectionTool(elementTypes)); + return; + } + } EditPart editPart = this; if (request instanceof DirectEditRequest){ Point p = new Point(((DirectEditRequest)request).getLocation()); diff --git a/plugins/uml/diagram/org.eclipse.papyrus.uml.diagram.profile/custom-src/org/eclipse/papyrus/uml/diagram/profile/custom/factory/CustomUMLeditPartFactory.java b/plugins/uml/diagram/org.eclipse.papyrus.uml.diagram.profile/custom-src/org/eclipse/papyrus/uml/diagram/profile/custom/factory/CustomUMLeditPartFactory.java index ab030f00145..ae172ae1305 100644 --- a/plugins/uml/diagram/org.eclipse.papyrus.uml.diagram.profile/custom-src/org/eclipse/papyrus/uml/diagram/profile/custom/factory/CustomUMLeditPartFactory.java +++ b/plugins/uml/diagram/org.eclipse.papyrus.uml.diagram.profile/custom-src/org/eclipse/papyrus/uml/diagram/profile/custom/factory/CustomUMLeditPartFactory.java @@ -18,6 +18,8 @@ import org.eclipse.gmf.runtime.notation.View; import org.eclipse.papyrus.uml.diagram.profile.custom.edit.parts.AssociationEndSourceEditPart; import org.eclipse.papyrus.uml.diagram.profile.custom.edit.parts.AssociationEndTargetEditPart; import org.eclipse.papyrus.uml.diagram.profile.custom.edit.parts.CustomAssociationNodeEditPart; +import org.eclipse.papyrus.uml.diagram.profile.custom.edit.parts.CustomConstraintBodyEditPart; +import org.eclipse.papyrus.uml.diagram.profile.custom.edit.parts.CustomConstraintBodyEditPartCN; import org.eclipse.papyrus.uml.diagram.profile.custom.edit.parts.CustomConstraintEditPart; import org.eclipse.papyrus.uml.diagram.profile.custom.edit.parts.CustomConstraintEditPartCN; import org.eclipse.papyrus.uml.diagram.profile.custom.edit.parts.CustomDependencyBranchEditPart; @@ -31,6 +33,8 @@ import org.eclipse.papyrus.uml.diagram.profile.custom.edit.parts.CustomProfileEd import org.eclipse.papyrus.uml.diagram.profile.edit.parts.AssociationNodeEditPart; import org.eclipse.papyrus.uml.diagram.profile.edit.parts.AssociationRoleSourceEditPart; import org.eclipse.papyrus.uml.diagram.profile.edit.parts.AssociationRoleTargetEditPart; +import org.eclipse.papyrus.uml.diagram.profile.edit.parts.ConstraintBodyEditPart; +import org.eclipse.papyrus.uml.diagram.profile.edit.parts.ConstraintBodyEditPartCN; import org.eclipse.papyrus.uml.diagram.profile.edit.parts.ConstraintEditPart; import org.eclipse.papyrus.uml.diagram.profile.edit.parts.ConstraintEditPartCN; import org.eclipse.papyrus.uml.diagram.profile.edit.parts.DependencyBranchEditPart; @@ -92,6 +96,10 @@ public class CustomUMLeditPartFactory extends UMLEditPartFactory { return new CustomConstraintEditPart(view); case ConstraintEditPartCN.VISUAL_ID: return new CustomConstraintEditPartCN(view); + case ConstraintBodyEditPart.VISUAL_ID: + return new CustomConstraintBodyEditPart(view); + case ConstraintBodyEditPartCN.VISUAL_ID: + return new CustomConstraintBodyEditPartCN(view); } } return super.createEditPart(context, model); diff --git a/plugins/uml/diagram/org.eclipse.papyrus.uml.diagram.profile/src/org/eclipse/papyrus/uml/diagram/profile/edit/parts/ConstraintBodyEditPart.java b/plugins/uml/diagram/org.eclipse.papyrus.uml.diagram.profile/src/org/eclipse/papyrus/uml/diagram/profile/edit/parts/ConstraintBodyEditPart.java index 6f4a4411ff7..fcb854e84ce 100644 --- a/plugins/uml/diagram/org.eclipse.papyrus.uml.diagram.profile/src/org/eclipse/papyrus/uml/diagram/profile/edit/parts/ConstraintBodyEditPart.java +++ b/plugins/uml/diagram/org.eclipse.papyrus.uml.diagram.profile/src/org/eclipse/papyrus/uml/diagram/profile/edit/parts/ConstraintBodyEditPart.java @@ -73,9 +73,11 @@ import org.eclipse.papyrus.uml.diagram.profile.providers.UMLElementTypes; import org.eclipse.papyrus.uml.diagram.profile.providers.UMLParserProvider; import org.eclipse.swt.SWT; import org.eclipse.swt.accessibility.AccessibleEvent; +import org.eclipse.swt.custom.BusyIndicator; import org.eclipse.swt.graphics.Color; import org.eclipse.swt.graphics.FontData; import org.eclipse.swt.graphics.Image; +import org.eclipse.swt.widgets.Display; import org.eclipse.ui.PlatformUI; import org.eclipse.uml2.uml.Feature; @@ -130,6 +132,14 @@ public class ConstraintBodyEditPart extends PapyrusCompartmentEditPart implement super(view); } + @Override + public void performRequest(Request req) { + if(req.getType() == RequestConstants.REQ_DIRECT_EDIT) { + System.err.println("Request: got direct edit"); //$NON-NLS-1$ + } + super.performRequest(req); + } + /** * @generated */ @@ -354,7 +364,12 @@ public class ConstraintBodyEditPart extends PapyrusCompartmentEditPart implement * @generated */ protected void performDirectEdit() { - getManager().show(); + BusyIndicator.showWhile(Display.getDefault(), new Runnable() { + + public void run() { + getManager().show(); + } + }); } /** @@ -473,9 +488,6 @@ public class ConstraintBodyEditPart extends PapyrusCompartmentEditPart implement if(request.getExtendedData().get(RequestConstants.REQ_DIRECTEDIT_EXTENDEDDATA_INITIAL_CHAR) instanceof Character) { Character initialChar = (Character)request.getExtendedData().get(RequestConstants.REQ_DIRECTEDIT_EXTENDEDDATA_INITIAL_CHAR); performDirectEdit(initialChar.charValue()); - } else if((request instanceof DirectEditRequest) && (getEditText().equals(getLabelText()))) { - DirectEditRequest editRequest = (DirectEditRequest)request; - performDirectEdit(editRequest.getLocation()); } else { performDirectEdit(); } diff --git a/plugins/uml/diagram/org.eclipse.papyrus.uml.diagram.profile/src/org/eclipse/papyrus/uml/diagram/profile/edit/parts/ConstraintBodyEditPartCN.java b/plugins/uml/diagram/org.eclipse.papyrus.uml.diagram.profile/src/org/eclipse/papyrus/uml/diagram/profile/edit/parts/ConstraintBodyEditPartCN.java index 1344069840e..565252bb187 100644 --- a/plugins/uml/diagram/org.eclipse.papyrus.uml.diagram.profile/src/org/eclipse/papyrus/uml/diagram/profile/edit/parts/ConstraintBodyEditPartCN.java +++ b/plugins/uml/diagram/org.eclipse.papyrus.uml.diagram.profile/src/org/eclipse/papyrus/uml/diagram/profile/edit/parts/ConstraintBodyEditPartCN.java @@ -73,9 +73,11 @@ import org.eclipse.papyrus.uml.diagram.profile.providers.UMLElementTypes; import org.eclipse.papyrus.uml.diagram.profile.providers.UMLParserProvider; import org.eclipse.swt.SWT; import org.eclipse.swt.accessibility.AccessibleEvent; +import org.eclipse.swt.custom.BusyIndicator; import org.eclipse.swt.graphics.Color; import org.eclipse.swt.graphics.FontData; import org.eclipse.swt.graphics.Image; +import org.eclipse.swt.widgets.Display; import org.eclipse.ui.PlatformUI; import org.eclipse.uml2.uml.Feature; @@ -354,7 +356,12 @@ public class ConstraintBodyEditPartCN extends PapyrusCompartmentEditPart impleme * @generated */ protected void performDirectEdit() { - getManager().show(); + BusyIndicator.showWhile(Display.getDefault(), new Runnable() { + + public void run() { + getManager().show(); + } + }); } /** diff --git a/plugins/uml/properties/org.eclipse.papyrus.uml.properties.xtext/META-INF/MANIFEST.MF b/plugins/uml/properties/org.eclipse.papyrus.uml.properties.xtext/META-INF/MANIFEST.MF index 9f48270c45c..40a38b43b30 100644 --- a/plugins/uml/properties/org.eclipse.papyrus.uml.properties.xtext/META-INF/MANIFEST.MF +++ b/plugins/uml/properties/org.eclipse.papyrus.uml.properties.xtext/META-INF/MANIFEST.MF @@ -12,7 +12,9 @@ Require-Bundle: org.eclipse.ui;bundle-version="3.105.0", org.eclipse.papyrus.extensionpoints.editors;bundle-version="1.0.0", org.eclipse.papyrus.uml.xtext.integration.ui;bundle-version="1.0.0", org.eclipse.xtext;bundle-version="2.4.2", - org.eclipse.papyrus.infra.emf;bundle-version="1.0.0" + org.eclipse.papyrus.infra.emf;bundle-version="1.0.0", + org.eclipse.papyrus.uml.properties;bundle-version="1.0.0", + org.eclipse.papyrus.views.properties;bundle-version="1.0.0" Bundle-Vendor: %providerName Bundle-ActivationPolicy: lazy Bundle-Version: 1.0.0.qualifier diff --git a/plugins/uml/properties/org.eclipse.papyrus.uml.properties.xtext/plugin.xml b/plugins/uml/properties/org.eclipse.papyrus.uml.properties.xtext/plugin.xml index 6e74c9f1437..dd9d632f564 100644 --- a/plugins/uml/properties/org.eclipse.papyrus.uml.properties.xtext/plugin.xml +++ b/plugins/uml/properties/org.eclipse.papyrus.uml.properties.xtext/plugin.xml @@ -32,4 +32,11 @@ realization="org.eclipse.papyrus.uml.properties.xtext.sheet.ModelListener"> + + + + diff --git a/plugins/uml/properties/org.eclipse.papyrus.uml.properties.xtext/src/org/eclipse/papyrus/uml/properties/xtext/UndoRedoStack.java b/plugins/uml/properties/org.eclipse.papyrus.uml.properties.xtext/src/org/eclipse/papyrus/uml/properties/xtext/UndoRedoStack.java new file mode 100644 index 00000000000..d5638ac69e1 --- /dev/null +++ b/plugins/uml/properties/org.eclipse.papyrus.uml.properties.xtext/src/org/eclipse/papyrus/uml/properties/xtext/UndoRedoStack.java @@ -0,0 +1,49 @@ + +package org.eclipse.papyrus.uml.properties.xtext; + +import java.util.Stack; + +/** + * Encapsulation of the Undo and Redo stack(s) + * @author Petr Bodnar + */ +public class UndoRedoStack { + + private Stack undo; + private Stack redo; + + public UndoRedoStack() { + undo = new Stack(); + redo = new Stack(); + } + + public void pushUndo(T delta) { + undo.add(delta); + } + + public void pushRedo(T delta) { + redo.add(delta); + } + + public T popUndo() { + T res = undo.pop(); + return res; + } + + public T popRedo() { + T res = redo.pop(); + return res; + } + + public void clearRedo() { + redo.clear(); + } + + public boolean hasUndo() { + return !undo.isEmpty(); + } + + public boolean hasRedo() { + return !redo.isEmpty(); + } +} diff --git a/plugins/uml/properties/org.eclipse.papyrus.uml.properties.xtext/src/org/eclipse/papyrus/uml/properties/xtext/XtextLanguageEditor.java b/plugins/uml/properties/org.eclipse.papyrus.uml.properties.xtext/src/org/eclipse/papyrus/uml/properties/xtext/XtextLanguageEditor.java new file mode 100644 index 00000000000..b6e8e0bb746 --- /dev/null +++ b/plugins/uml/properties/org.eclipse.papyrus.uml.properties.xtext/src/org/eclipse/papyrus/uml/properties/xtext/XtextLanguageEditor.java @@ -0,0 +1,264 @@ +package org.eclipse.papyrus.uml.properties.xtext; + +import org.eclipse.emf.ecore.EObject; +import org.eclipse.emf.transaction.util.TransactionUtil; +import org.eclipse.gmf.runtime.common.core.command.ICommand; +import org.eclipse.gmf.runtime.common.ui.services.parser.IParser; +import org.eclipse.gmf.runtime.emf.core.util.EObjectAdapter; +import org.eclipse.jface.preference.IPreferenceStore; +import org.eclipse.papyrus.commands.wrappers.GMFtoEMFCommandWrapper; +import org.eclipse.papyrus.extensionpoints.editors.Activator; +import org.eclipse.papyrus.extensionpoints.editors.configuration.IDirectEditorConfiguration; +import org.eclipse.papyrus.extensionpoints.editors.utils.DirectEditorsUtil; +import org.eclipse.papyrus.extensionpoints.editors.utils.IDirectEditorsIds; +import org.eclipse.papyrus.uml.properties.modelelement.UMLModelElement; +import org.eclipse.papyrus.uml.properties.widgets.BodyEditor; +import org.eclipse.papyrus.uml.xtext.integration.DefaultXtextDirectEditorConfiguration; +import org.eclipse.papyrus.uml.xtext.integration.StyledTextXtextAdapter; +import org.eclipse.papyrus.uml.xtext.integration.core.ContextElementAdapter; +import org.eclipse.papyrus.uml.xtext.integration.core.ContextElementAdapter.IContextElementProvider; +import org.eclipse.papyrus.uml.xtext.integration.core.ContextElementAdapter.IContextElementProviderWithInit; +import org.eclipse.papyrus.views.properties.modelelement.ModelElement; +import org.eclipse.swt.SWT; +import org.eclipse.swt.custom.ExtendedModifyEvent; +import org.eclipse.swt.custom.ExtendedModifyListener; +import org.eclipse.swt.custom.StyledText; +import org.eclipse.swt.events.FocusEvent; +import org.eclipse.swt.events.FocusListener; +import org.eclipse.swt.events.KeyAdapter; +import org.eclipse.swt.events.KeyEvent; +import org.eclipse.swt.layout.GridLayout; +import org.eclipse.swt.widgets.Composite; +import org.eclipse.swt.widgets.Control; +import org.eclipse.swt.widgets.Listener; + +public class XtextLanguageEditor implements BodyEditor, IContextElementProvider { + + protected StyledText textControl; + + UndoRedoStack undoRedoStack; + + protected boolean isUndo; + + protected boolean isRedo; + + private DefaultXtextDirectEditorConfiguration configuration; + + private StyledTextXtextAdapter xtextAdapter; + + protected EObject currentEObj; + + final private ContextElementAdapter contextElementAdapter = new ContextElementAdapter( + this); + + public void createWidget(Composite parent, int style) { + undoRedoStack = new UndoRedoStack(); + createTextControl(parent); + } + + protected void createTextControl(final Composite parent) { + + textControl = new StyledText(parent, SWT.MULTI | SWT.BORDER + | SWT.V_SCROLL | SWT.WRAP); + + textControl.addFocusListener(new FocusListener() { + + public void focusLost(FocusEvent e) { + IParser parser = getParser(); + if (xtextAdapter.getCompletionProposalAdapter().delayedIsPopupOpen()) { + // ignore focus lost + return; + } + if ((parser != null) && !parser.getEditString(null, 0).equals(textControl.getText())) { + ICommand command = parser.getParseCommand( + new EObjectAdapter(getEObject()), + textControl.getText(), 0); + + TransactionUtil.getEditingDomain(getEObject()).getCommandStack().execute( + new GMFtoEMFCommandWrapper(command)); + } + } + + public void focusGained(FocusEvent e) { + } + }); + + textControl.setAlwaysShowScrollBars(false); + textControl.setLayout(new GridLayout()); + + // GridDataFactory.fillDefaults().grab(true, true).hint(parent.getSize()).applyTo(textControl); + textControl.addExtendedModifyListener(new ExtendedModifyListener() { + + public void modifyText(ExtendedModifyEvent event) { + if (isUndo) { + undoRedoStack.pushRedo(event); + } else { // is Redo or a normal user action + undoRedoStack.pushUndo(event); + if (!isRedo) { + undoRedoStack.clearRedo(); + // TODO Switch to treat consecutive characters as one event? + } + } + } + }); + + textControl.addKeyListener(new KeyAdapter() { + public void keyPressed(KeyEvent e) { + boolean isCtrl = (e.stateMask & SWT.CTRL) > 0; + boolean isAlt = (e.stateMask & SWT.ALT) > 0; + if (isCtrl && !isAlt) { + boolean isShift = (e.stateMask & SWT.SHIFT) > 0; + if (e.keyCode == 'z') { + if (isShift) { + redo(); + } + else { + undo(); + } + } + } + } + }); + } + + protected void undo() { + if (undoRedoStack.hasUndo()) { + isUndo = true; + revertEvent(undoRedoStack.popUndo()); + isUndo = false; + } + } + + protected void redo() { + if (undoRedoStack.hasRedo()) { + isRedo = true; + revertEvent(undoRedoStack.popRedo()); + isRedo = false; + } + } + + /** + * Reverts the given modify event, in the way as the Eclipse text editor + * does it. + * + * @param event + */ + protected void revertEvent(ExtendedModifyEvent event) { + textControl.replaceTextRange(event.start, event.length, event.replacedText); + // (causes the modifyText() listener method to be called) + + textControl.setSelectionRange(event.start, event.replacedText.length()); + } + + protected IParser getParser() { + final EObject semanticElement = getEObject(); + if (configuration != null && semanticElement != null) { + return configuration.createParser(semanticElement); + } + return null; + } + + protected void updateXtextAdapters(Control styledText) { + final Object oldObjectToEdit = configuration != null ? configuration.getObjectToEdit() : null; + + final DefaultXtextDirectEditorConfiguration newConfiguration = getConfigurationFromSelection(); + // Check if configuration has changed and update adapters + if (newConfiguration != null && newConfiguration != configuration) { + if (xtextAdapter != null) { + xtextAdapter.getFakeResourceContext().getFakeResource() + .eAdapters().remove(contextElementAdapter); + } + configuration = newConfiguration; + xtextAdapter = new StyledTextXtextAdapter( + configuration.getInjector()); + + EObject semanticElement = getEObject(); + if (semanticElement != null) { + newConfiguration.preEditAction(semanticElement); + } + + xtextAdapter.getFakeResourceContext().getFakeResource().eAdapters() + .add(contextElementAdapter); + xtextAdapter.adapt((StyledText) styledText); + } + + if (configuration != null && configuration.getObjectToEdit() != oldObjectToEdit) { + IContextElementProvider provider = configuration.getContextProvider(); + if (provider instanceof IContextElementProviderWithInit) { + // update resource, if required by text editor + if (xtextAdapter != null) { + ((IContextElementProviderWithInit) provider).initResource( + xtextAdapter.getFakeResourceContext().getFakeResource()); + } + } + Object semanticObject = configuration.getObjectToEdit(); + if (semanticObject instanceof EObject) { + currentEObj = (EObject) semanticObject; + } + } + } + + protected DefaultXtextDirectEditorConfiguration getConfigurationFromSelection() { + EObject semanticElement = getEObject(); + if (semanticElement != null) { + IPreferenceStore store = Activator.getDefault() + .getPreferenceStore(); + String semanticClassName = semanticElement.eClass() + .getInstanceClassName(); + String key = IDirectEditorsIds.EDITOR_FOR_ELEMENT + + semanticClassName; + String languagePreferred = store.getString(key); + + if (languagePreferred != null && !languagePreferred.equals("")) { //$NON-NLS-1$ + IDirectEditorConfiguration configuration = DirectEditorsUtil + .findEditorConfiguration(languagePreferred, + semanticClassName); + if (configuration instanceof DefaultXtextDirectEditorConfiguration) { + + DefaultXtextDirectEditorConfiguration xtextConfiguration = (DefaultXtextDirectEditorConfiguration) configuration; + xtextConfiguration.preEditAction(semanticElement); + return xtextConfiguration; + } + } + } + return null; + } + + public EObject getContextObject() { + return getEObject(); + } + + public void setInput(String value) { + textControl.setText(value); + } + + public void dispose() { + } + + public void addChangeListener(Listener listener) { + } + + public void removeChangeListener(Listener listener) { + } + + public String getValue() { + return null; + } + + public void setReadOnly(boolean readOnly) { + } + + public void setContext(ModelElement context) { + if (context instanceof UMLModelElement) { + currentEObj = ((UMLModelElement) context).getSource(); + updateXtextAdapters(textControl); + } + } + + /** + * @return Returns the eObject. + */ + protected EObject getEObject() { + return currentEObj; + } +} diff --git a/plugins/uml/properties/org.eclipse.papyrus.uml.properties.xtext/src/org/eclipse/papyrus/uml/properties/xtext/sheet/AdvancedEditingPropertySection.java b/plugins/uml/properties/org.eclipse.papyrus.uml.properties.xtext/src/org/eclipse/papyrus/uml/properties/xtext/sheet/AdvancedEditingPropertySection.java index f67c4a0f95e..ba18d78538a 100644 --- a/plugins/uml/properties/org.eclipse.papyrus.uml.properties.xtext/src/org/eclipse/papyrus/uml/properties/xtext/sheet/AdvancedEditingPropertySection.java +++ b/plugins/uml/properties/org.eclipse.papyrus.uml.properties.xtext/src/org/eclipse/papyrus/uml/properties/xtext/sheet/AdvancedEditingPropertySection.java @@ -30,6 +30,7 @@ import org.eclipse.papyrus.extensionpoints.editors.configuration.IDirectEditorCo import org.eclipse.papyrus.extensionpoints.editors.utils.DirectEditorsUtil; import org.eclipse.papyrus.extensionpoints.editors.utils.IDirectEditorsIds; import org.eclipse.papyrus.infra.emf.utils.EMFHelper; +import org.eclipse.papyrus.uml.properties.xtext.UndoRedoStack; import org.eclipse.papyrus.uml.xtext.integration.DefaultXtextDirectEditorConfiguration; import org.eclipse.papyrus.uml.xtext.integration.StyledTextXtextAdapter; import org.eclipse.papyrus.uml.xtext.integration.core.ContextElementAdapter; diff --git a/plugins/uml/properties/org.eclipse.papyrus.uml.properties.xtext/src/org/eclipse/papyrus/uml/properties/xtext/sheet/UndoRedoStack.java b/plugins/uml/properties/org.eclipse.papyrus.uml.properties.xtext/src/org/eclipse/papyrus/uml/properties/xtext/sheet/UndoRedoStack.java deleted file mode 100644 index f660024c95b..00000000000 --- a/plugins/uml/properties/org.eclipse.papyrus.uml.properties.xtext/src/org/eclipse/papyrus/uml/properties/xtext/sheet/UndoRedoStack.java +++ /dev/null @@ -1,49 +0,0 @@ - -package org.eclipse.papyrus.uml.properties.xtext.sheet; - -import java.util.Stack; - -/** - * Encapsulation of the Undo and Redo stack(s) - * @author Petr Bodnar - */ -public class UndoRedoStack { - - private Stack undo; - private Stack redo; - - public UndoRedoStack() { - undo = new Stack(); - redo = new Stack(); - } - - public void pushUndo(T delta) { - undo.add(delta); - } - - public void pushRedo(T delta) { - redo.add(delta); - } - - public T popUndo() { - T res = undo.pop(); - return res; - } - - public T popRedo() { - T res = redo.pop(); - return res; - } - - public void clearRedo() { - redo.clear(); - } - - public boolean hasUndo() { - return !undo.isEmpty(); - } - - public boolean hasRedo() { - return !redo.isEmpty(); - } -} diff --git a/plugins/uml/properties/org.eclipse.papyrus.uml.properties/Model/UML/ui/SingleConstraint.xwt b/plugins/uml/properties/org.eclipse.papyrus.uml.properties/Model/UML/ui/SingleConstraint.xwt index 2bbedb0a653..b12376d0c68 100644 --- a/plugins/uml/properties/org.eclipse.papyrus.uml.properties/Model/UML/ui/SingleConstraint.xwt +++ b/plugins/uml/properties/org.eclipse.papyrus.uml.properties/Model/UML/ui/SingleConstraint.xwt @@ -1,37 +1,39 @@ - - + - + + + + + + + + + - - + - - - - - - - \ No newline at end of file diff --git a/plugins/uml/properties/org.eclipse.papyrus.uml.properties/plugin.xml b/plugins/uml/properties/org.eclipse.papyrus.uml.properties/plugin.xml index ef8b8ba9f0e..d0f158c26d5 100644 --- a/plugins/uml/properties/org.eclipse.papyrus.uml.properties/plugin.xml +++ b/plugins/uml/properties/org.eclipse.papyrus.uml.properties/plugin.xml @@ -37,10 +37,6 @@ - - diff --git a/plugins/uml/properties/org.eclipse.papyrus.uml.properties/src/org/eclipse/papyrus/uml/properties/widgets/ExpressionEditor.java b/plugins/uml/properties/org.eclipse.papyrus.uml.properties/src/org/eclipse/papyrus/uml/properties/widgets/ExpressionEditor.java index a9c475f679e..cc011786593 100644 --- a/plugins/uml/properties/org.eclipse.papyrus.uml.properties/src/org/eclipse/papyrus/uml/properties/widgets/ExpressionEditor.java +++ b/plugins/uml/properties/org.eclipse.papyrus.uml.properties/src/org/eclipse/papyrus/uml/properties/widgets/ExpressionEditor.java @@ -21,11 +21,11 @@ import org.eclipse.papyrus.infra.widgets.editors.AbstractEditor; import org.eclipse.papyrus.infra.widgets.editors.ICommitListener; import org.eclipse.papyrus.uml.properties.expression.ExpressionList; import org.eclipse.papyrus.uml.properties.expression.ExpressionList.Expression; -import org.eclipse.papyrus.uml.properties.messages.Messages; import org.eclipse.papyrus.views.properties.modelelement.DataSource; import org.eclipse.papyrus.views.properties.widgets.AbstractPropertyEditor; import org.eclipse.swt.SWT; -import org.eclipse.swt.layout.FillLayout; +import org.eclipse.swt.layout.GridData; +import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Event; import org.eclipse.swt.widgets.Listener; @@ -48,8 +48,6 @@ public class ExpressionEditor extends AbstractPropertyEditor implements Listener private final ExpressionLanguageEditor languageEditor; - private final Composite bodyEditorContainer; - private IObservableList bodies; private Expression currentExpression = null; @@ -67,12 +65,18 @@ public class ExpressionEditor extends AbstractPropertyEditor implements Listener public ExpressionEditor(Composite parent, int style) { languageEditor = new ExpressionLanguageEditor(parent, SWT.NONE); - - bodyEditorContainer = new Composite(parent, SWT.NONE); - bodyEditorContainer.setLayout(new FillLayout()); - - bodyEditor = new DynamicBodyEditor(bodyEditorContainer, style); - bodyEditor.setLabel(Messages.ExpressionEditor_BodyLabel); + + GridLayout l = new GridLayout(2, false); + parent.setLayout(l); + + GridData gridData = new GridData(SWT.LEFT, SWT.TOP, true, true); + gridData.grabExcessHorizontalSpace = true; + gridData.horizontalAlignment = GridData.FILL; + gridData.verticalAlignment = GridData.FILL; + + bodyEditor = new DynamicBodyEditor(parent, style); + bodyEditor.setLayoutData(gridData); + bodyEditor.addChangeListener(this); languageEditor.getViewer().addSelectionChangedListener(this); @@ -136,7 +140,7 @@ public class ExpressionEditor extends AbstractPropertyEditor implements Listener } //Force the layout of the widget after the new widget has been displayed - bodyEditorContainer.getParent().layout(); + bodyEditor.getParent().layout(); } @Override diff --git a/plugins/uml/textedit/org.eclipse.papyrus.uml.textedit.constraintwithessentialocl.xtext/plugin.xml b/plugins/uml/textedit/org.eclipse.papyrus.uml.textedit.constraintwithessentialocl.xtext/plugin.xml index 778d157689d..2b8a6d1e6b7 100644 --- a/plugins/uml/textedit/org.eclipse.papyrus.uml.textedit.constraintwithessentialocl.xtext/plugin.xml +++ b/plugins/uml/textedit/org.eclipse.papyrus.uml.textedit.constraintwithessentialocl.xtext/plugin.xml @@ -12,6 +12,14 @@ editorConfiguration="org.eclipse.papyrus.uml.textedit.constraintwithessentialocl.xtext.EssentialOCLEditorConfiguration"> - s - + + + + + diff --git a/plugins/uml/textedit/org.eclipse.papyrus.uml.textedit.constraintwithessentialocl.xtext/src/org/eclipse/papyrus/uml/textedit/constraintwithessentialocl/xtext/EssentialOCLEditorConfiguration.java b/plugins/uml/textedit/org.eclipse.papyrus.uml.textedit.constraintwithessentialocl.xtext/src/org/eclipse/papyrus/uml/textedit/constraintwithessentialocl/xtext/EssentialOCLEditorConfiguration.java index 7793c52791f..40f06d06849 100644 --- a/plugins/uml/textedit/org.eclipse.papyrus.uml.textedit.constraintwithessentialocl.xtext/src/org/eclipse/papyrus/uml/textedit/constraintwithessentialocl/xtext/EssentialOCLEditorConfiguration.java +++ b/plugins/uml/textedit/org.eclipse.papyrus.uml.textedit.constraintwithessentialocl.xtext/src/org/eclipse/papyrus/uml/textedit/constraintwithessentialocl/xtext/EssentialOCLEditorConfiguration.java @@ -29,6 +29,7 @@ import org.eclipse.gmf.runtime.common.core.command.UnexecutableCommand; import org.eclipse.gmf.runtime.common.ui.services.parser.IParser; import org.eclipse.gmf.runtime.common.ui.services.parser.IParserEditStatus; import org.eclipse.gmf.runtime.emf.commands.core.command.AbstractTransactionalCommand; +import org.eclipse.jface.dialogs.MessageDialog; import org.eclipse.jface.text.contentassist.IContentAssistProcessor; import org.eclipse.ocl.examples.pivot.ParserException; import org.eclipse.ocl.examples.pivot.utilities.BaseResource; @@ -41,8 +42,10 @@ import org.eclipse.papyrus.uml.xtext.integration.DefaultXtextDirectEditorConfigu import org.eclipse.papyrus.uml.xtext.integration.core.ContextElementAdapter.IContextElementProvider; import org.eclipse.papyrus.uml.xtext.integration.core.ContextElementAdapter.IContextElementProviderWithInit; import org.eclipse.swt.SWT; +import org.eclipse.swt.widgets.Shell; import org.eclipse.uml2.uml.Constraint; import org.eclipse.uml2.uml.LiteralString; +import org.eclipse.uml2.uml.OpaqueExpression; import org.eclipse.uml2.uml.UMLFactory; import org.eclipse.xtext.resource.XtextResource; @@ -70,17 +73,35 @@ public class EssentialOCLEditorConfiguration extends DefaultXtextDirectEditorCon return SWT.MULTI | SWT.WRAP; } + @Override + public Object preEditAction(Object editedObject) { + if (editedObject instanceof OpaqueExpression) { + editedObject = ((OpaqueExpression) editedObject).getOwner(); + } + else if (editedObject instanceof Constraint) { + Constraint constraint = (Constraint) editedObject; + if (!(constraint.getSpecification() instanceof OpaqueExpression)) { + if (constraint.getSpecification().stringValue().length() > 0) { + MessageDialog.openWarning(new Shell(), + Messages.EssentialOCLEditorConfiguration_ExistingSpecification, + Messages.EssentialOCLEditorConfiguration_AlreadyContainsNonEmpty); + } + } + } + return super.preEditAction(editedObject); + } + /** * the command to save the content of the OCL constraint into the body of the UML constraint element * */ protected class UpdateConstraintCommand extends AbstractTransactionalCommand { - protected final org.eclipse.uml2.uml.Constraint constraint; + protected final Constraint constraint; protected final String newTextualRepresentation; - public UpdateConstraintCommand(TransactionalEditingDomain editingDomain, org.eclipse.uml2.uml.Constraint constraint, String newTextualRepresentation) { + public UpdateConstraintCommand(TransactionalEditingDomain editingDomain, Constraint constraint, String newTextualRepresentation) { super(editingDomain, "Constraint Update", getWorkspaceFiles(constraint)); //$NON-NLS-1$ this.constraint = constraint; this.newTextualRepresentation = newTextualRepresentation; @@ -104,8 +125,7 @@ public class EssentialOCLEditorConfiguration extends DefaultXtextDirectEditorCon opaqueExpression.getLanguages().add(OCL); opaqueExpression.getBodies().add(newTextualRepresentation); } else { - opaqueExpression.getBodies().remove(indexOfOCLBody); - opaqueExpression.getBodies().add(indexOfOCLBody, newTextualRepresentation); + opaqueExpression.getBodies().set(indexOfOCLBody, newTextualRepresentation); } constraint.setSpecification(opaqueExpression); diff --git a/plugins/uml/textedit/org.eclipse.papyrus.uml.textedit.constraintwithessentialocl.xtext/src/org/eclipse/papyrus/uml/textedit/constraintwithessentialocl/xtext/Messages.java b/plugins/uml/textedit/org.eclipse.papyrus.uml.textedit.constraintwithessentialocl.xtext/src/org/eclipse/papyrus/uml/textedit/constraintwithessentialocl/xtext/Messages.java new file mode 100644 index 00000000000..e78f0f75306 --- /dev/null +++ b/plugins/uml/textedit/org.eclipse.papyrus.uml.textedit.constraintwithessentialocl.xtext/src/org/eclipse/papyrus/uml/textedit/constraintwithessentialocl/xtext/Messages.java @@ -0,0 +1,16 @@ +package org.eclipse.papyrus.uml.textedit.constraintwithessentialocl.xtext; + +import org.eclipse.osgi.util.NLS; + +public class Messages extends NLS { + private static final String BUNDLE_NAME = "org.eclipse.papyrus.uml.textedit.constraintwithessentialocl.xtext.messages"; //$NON-NLS-1$ + public static String EssentialOCLEditorConfiguration_AlreadyContainsNonEmpty; + public static String EssentialOCLEditorConfiguration_ExistingSpecification; + static { + // initialize resource bundle + NLS.initializeMessages(BUNDLE_NAME, Messages.class); + } + + private Messages() { + } +} diff --git a/plugins/uml/textedit/org.eclipse.papyrus.uml.textedit.constraintwithessentialocl.xtext/src/org/eclipse/papyrus/uml/textedit/constraintwithessentialocl/xtext/OCLLanguageEditorFactory.java b/plugins/uml/textedit/org.eclipse.papyrus.uml.textedit.constraintwithessentialocl.xtext/src/org/eclipse/papyrus/uml/textedit/constraintwithessentialocl/xtext/OCLLanguageEditorFactory.java new file mode 100644 index 00000000000..050701e7e62 --- /dev/null +++ b/plugins/uml/textedit/org.eclipse.papyrus.uml.textedit.constraintwithessentialocl.xtext/src/org/eclipse/papyrus/uml/textedit/constraintwithessentialocl/xtext/OCLLanguageEditorFactory.java @@ -0,0 +1,5 @@ +package org.eclipse.papyrus.uml.textedit.constraintwithessentialocl.xtext; + +public class OCLLanguageEditorFactory { + +} diff --git a/plugins/uml/textedit/org.eclipse.papyrus.uml.textedit.constraintwithessentialocl.xtext/src/org/eclipse/papyrus/uml/textedit/constraintwithessentialocl/xtext/messages.properties b/plugins/uml/textedit/org.eclipse.papyrus.uml.textedit.constraintwithessentialocl.xtext/src/org/eclipse/papyrus/uml/textedit/constraintwithessentialocl/xtext/messages.properties new file mode 100644 index 00000000000..6275974a6c7 --- /dev/null +++ b/plugins/uml/textedit/org.eclipse.papyrus.uml.textedit.constraintwithessentialocl.xtext/src/org/eclipse/papyrus/uml/textedit/constraintwithessentialocl/xtext/messages.properties @@ -0,0 +1,2 @@ +EssentialOCLEditorConfiguration_AlreadyContainsNonEmpty=The constraint already contains a non-empty specification that would be overwritten, if you edit the OCL constraint +EssentialOCLEditorConfiguration_ExistingSpecification=Existing specification diff --git a/plugins/uml/xtext/org.eclipse.papyrus.uml.xtext.integration.ui/src/org/eclipse/papyrus/uml/xtext/integration/DefaultXtextDirectEditorConfiguration.java b/plugins/uml/xtext/org.eclipse.papyrus.uml.xtext.integration.ui/src/org/eclipse/papyrus/uml/xtext/integration/DefaultXtextDirectEditorConfiguration.java index e94d70bf73b..c1dea8cc31f 100644 --- a/plugins/uml/xtext/org.eclipse.papyrus.uml.xtext.integration.ui/src/org/eclipse/papyrus/uml/xtext/integration/DefaultXtextDirectEditorConfiguration.java +++ b/plugins/uml/xtext/org.eclipse.papyrus.uml.xtext.integration.ui/src/org/eclipse/papyrus/uml/xtext/integration/DefaultXtextDirectEditorConfiguration.java @@ -28,7 +28,6 @@ import org.eclipse.gmf.runtime.common.core.command.ICommand; import org.eclipse.gmf.runtime.common.core.command.UnexecutableCommand; import org.eclipse.gmf.runtime.common.ui.services.parser.IParser; import org.eclipse.gmf.runtime.common.ui.services.parser.IParserEditStatus; -import org.eclipse.gmf.runtime.diagram.ui.editparts.IGraphicalEditPart; import org.eclipse.gmf.runtime.diagram.ui.editparts.ITextAwareEditPart; import org.eclipse.gmf.runtime.emf.commands.core.command.AbstractTransactionalCommand; import org.eclipse.jface.text.contentassist.IContentAssistProcessor; @@ -68,9 +67,9 @@ import com.google.inject.name.Names; */ public abstract class DefaultXtextDirectEditorConfiguration extends DefaultDirectEditorConfiguration implements ICustomDirectEditorConfiguration { - public static final String ANNOTATION_SOURCE = "expression_source"; + public static final String ANNOTATION_SOURCE = "expression_source"; //$NON-NLS-1$ - public static final String ANNOTATION_DETAIL = "expression"; + public static final String ANNOTATION_DETAIL = "expression"; //$NON-NLS-1$ /** * returns the UI Injector for the Xtext language @@ -112,21 +111,6 @@ public abstract class DefaultXtextDirectEditorConfiguration extends DefaultDirec } public DirectEditManager createDirectEditManager(final ITextAwareEditPart host) { - IContextElementProvider provider; - if (objectToEdit != null) { - provider = getContextProvider(); - } - else { - provider = new IContextElementProvider() { - - public EObject getContextObject() { - if(host instanceof IGraphicalEditPart) { - return ((IGraphicalEditPart)host).resolveSemanticElement(); - } - return null; - } - }; - } return new XtextDirectEditManager(host, getInjector(), getStyle(), this); } @@ -204,7 +188,7 @@ public abstract class DefaultXtextDirectEditorConfiguration extends DefaultDirec if(semanticElement instanceof Element) { registerInvalidStringAdapter(semanticElement); final Element element = (Element)semanticElement; - return new AbstractTransactionalCommand(TransactionUtil.getEditingDomain(semanticElement), "", Collections.emptyList()) { + return new AbstractTransactionalCommand(TransactionUtil.getEditingDomain(semanticElement), "", Collections.emptyList()) { //$NON-NLS-1$ @Override protected CommandResult doExecuteWithResult(IProgressMonitor monitor, IAdaptable info) throws ExecutionException { -- cgit v1.2.3