blob: af3688bb366ccd86f5c4c6b313a90fe3319eb3f2 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2014 Obeo
* 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:
* Obeo - initial API and implementation
*******************************************************************************/
package org.eclipse.emf.ecoretools.design.ui.parts;
import org.eclipse.emf.ecore.EClass;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.EReference;
import org.eclipse.emf.ecore.EcorePackage;
import org.eclipse.emf.ecoretools.design.service.EReferenceServices;
import org.eclipse.emf.transaction.RecordingCommand;
import org.eclipse.emf.transaction.TransactionalEditingDomain;
import org.eclipse.emf.transaction.util.TransactionUtil;
import org.eclipse.gmf.runtime.common.core.service.IOperation;
import org.eclipse.gmf.runtime.diagram.ui.commands.ICommandProxy;
import org.eclipse.gmf.runtime.diagram.ui.editparts.IGraphicalEditPart;
import org.eclipse.gmf.runtime.diagram.ui.editpolicies.LabelDirectEditPolicy;
import org.eclipse.gmf.runtime.diagram.ui.services.editpart.AbstractEditPartProvider;
import org.eclipse.gmf.runtime.diagram.ui.services.editpart.CreateGraphicEditPartOperation;
import org.eclipse.gmf.runtime.diagram.ui.services.editpart.IEditPartOperation;
import org.eclipse.gmf.runtime.notation.View;
import org.eclipse.sirius.diagram.DDiagramElement;
import org.eclipse.sirius.diagram.business.api.query.DDiagramElementQuery;
import org.eclipse.sirius.diagram.ui.internal.edit.parts.DEdgeBeginNameEditPart;
import org.eclipse.sirius.diagram.ui.internal.edit.parts.DEdgeEndNameEditPart;
import org.eclipse.sirius.diagram.ui.internal.edit.parts.DNodeListEditPart;
import org.eclipse.sirius.diagram.ui.part.SiriusVisualIDRegistry;
import org.eclipse.sirius.diagram.ui.tools.api.command.GMFCommandWrapper;
import org.eclipse.sirius.ext.base.Option;
import org.eclipse.sirius.viewpoint.DSemanticDecorator;
import org.eclipse.sirius.viewpoint.description.RepresentationElementMapping;
public class EcoreToolsSpecificEditPartProvider extends
AbstractEditPartProvider {
public synchronized IGraphicalEditPart createGraphicEditPart(View view) {
switch (SiriusVisualIDRegistry.getVisualID(view)) {
case DEdgeBeginNameEditPart.VISUAL_ID:
DEdgeBeginNameEditPart dEdgePart = new DEdgeBeginNameEditPart(view) {
@Override
protected boolean isDirectEditEnabled() {
return true;
}
};
dEdgePart.installEditPolicy(
org.eclipse.gef.RequestConstants.REQ_DIRECT_EDIT,
new EcoreToolsDirectEditForEndRole());
return dEdgePart;
case DEdgeEndNameEditPart.VISUAL_ID:
DEdgeEndNameEditPart dEdgeEndPart = new DEdgeEndNameEditPart(view) {
@Override
protected boolean isDirectEditEnabled() {
return true;
}
};
dEdgeEndPart.installEditPolicy(
org.eclipse.gef.RequestConstants.REQ_DIRECT_EDIT,
new EcoreToolsDirectEditForBeginRole());
return dEdgeEndPart;
case DNodeListEditPart.VISUAL_ID:
return new DNodeListEditPartWithAlpha(view);
}
return null;
}
@Override
public boolean provides(IOperation operation) {
if (operation instanceof CreateGraphicEditPartOperation) {
View view = ((IEditPartOperation) operation).getView();
if (view.getElement() instanceof DSemanticDecorator) {
EObject semanticTarget = ((DSemanticDecorator) view
.getElement()).getTarget();
if (isFromEcoreToolsDesign((DSemanticDecorator) view
.getElement()))
if (semanticTarget instanceof EReference
&& ((EReference) semanticTarget).getEOpposite() != null) {
switch (SiriusVisualIDRegistry.getVisualID(view)) {
case DEdgeBeginNameEditPart.VISUAL_ID:
return true;
case DEdgeEndNameEditPart.VISUAL_ID:
return true;
}
} else if (semanticTarget instanceof EClass) {
switch (SiriusVisualIDRegistry.getVisualID(view)) {
case DNodeListEditPart.VISUAL_ID:
return true;
}
}
}
}
return false;
}
private boolean isFromEcoreToolsDesign(DSemanticDecorator element) {
/*
* At least only provide our editparts if the semantic element is from Ecore.ecore
*/
if (element.getTarget() instanceof EObject
&& element.getTarget().eClass() != null
&& element.getTarget().eClass().getEPackage() == EcorePackage.eINSTANCE) {
return true;
}
return false;
}
class EcoreToolsDirectEditForBeginRole extends LabelDirectEditPolicy {
protected org.eclipse.gef.commands.Command getDirectEditCommand(
org.eclipse.gef.requests.DirectEditRequest edit) {
final EObject element = ((org.eclipse.gmf.runtime.diagram.ui.editparts.GraphicalEditPart) getHost())
.resolveSemanticElement();
final TransactionalEditingDomain domain = TransactionUtil
.getEditingDomain(element);
final String labelText = (String) edit.getCellEditor().getValue();
RecordingCommand cmd = new RecordingCommand(domain) {
@Override
protected void doExecute() {
if (element instanceof DSemanticDecorator) {
EObject target = ((DSemanticDecorator) element)
.getTarget();
if (target instanceof EReference) {
new EReferenceServices().performEdit(
(EReference) target, labelText);
}
}
}
};
return new ICommandProxy(new GMFCommandWrapper(domain, cmd));
};
}
class EcoreToolsDirectEditForEndRole extends LabelDirectEditPolicy {
protected org.eclipse.gef.commands.Command getDirectEditCommand(
org.eclipse.gef.requests.DirectEditRequest edit) {
final EObject element = ((org.eclipse.gmf.runtime.diagram.ui.editparts.GraphicalEditPart) getHost())
.resolveSemanticElement();
final TransactionalEditingDomain domain = TransactionUtil
.getEditingDomain(element);
final String labelText = (String) edit.getCellEditor().getValue();
RecordingCommand cmd = new RecordingCommand(domain) {
@Override
protected void doExecute() {
if (element instanceof DSemanticDecorator) {
EObject target = ((DSemanticDecorator) element)
.getTarget();
if (target instanceof EReference
&& ((EReference) target).getEOpposite() != null) {
new EReferenceServices().performEdit(
((EReference) target).getEOpposite(),
labelText);
}
}
}
};
return new ICommandProxy(new GMFCommandWrapper(domain, cmd));
};
}
}