package org.eclipse.xtext.example.fowlerdsl.diagram.properties; import java.beans.PropertyChangeEvent; import org.eclipse.core.runtime.IAdaptable; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.OperationCanceledException; import org.eclipse.emf.ecore.EObject; import org.eclipse.emf.eef.runtime.api.adapters.SemanticAdapter; import org.eclipse.emf.eef.runtime.api.notify.IPropertiesEditionEvent; import org.eclipse.emf.eef.runtime.ui.properties.sections.PropertiesEditionSection; import org.eclipse.gef.EditPart; import org.eclipse.graphiti.dt.IDiagramTypeProvider; import org.eclipse.graphiti.features.IFeature; import org.eclipse.graphiti.features.context.IContext; import org.eclipse.graphiti.features.context.impl.UpdateContext; import org.eclipse.graphiti.internal.command.CommandExec; import org.eclipse.graphiti.mm.pictograms.Diagram; import org.eclipse.graphiti.mm.pictograms.PictogramElement; import org.eclipse.graphiti.mm.pictograms.PictogramLink; import org.eclipse.graphiti.platform.IDiagramEditor; import org.eclipse.graphiti.ui.internal.T; import org.eclipse.graphiti.ui.internal.editor.DiagramEditorInternal; import org.eclipse.graphiti.ui.internal.parts.FreeFormConnectionEditPart; import org.eclipse.graphiti.ui.internal.parts.IContainerShapeEditPart; import org.eclipse.jface.viewers.StructuredSelection; import org.eclipse.ui.IWorkbenchPart; import org.eclipse.ui.part.IContributedContentsView; import org.eclipse.xtext.example.fowlerdsl.statemachine.State; import org.eclipse.xtext.example.fowlerdsl.statemachine.Transition; public class FowlerDslPropertiesEditionSection extends PropertiesEditionSection { private PictogramElement pe = null; private FowlerDslElementFilter filter = new FowlerDslElementFilter(); /** * @return the selected pictogram element. */ protected PictogramElement getSelectedPictogramElement() { if (getSelection() instanceof StructuredSelection) { StructuredSelection structuredSelection = (StructuredSelection) getSelection(); Object firstElement = structuredSelection.getFirstElement(); if (firstElement instanceof PictogramElement) { return (PictogramElement) firstElement; } EditPart editPart = null; if (firstElement instanceof EditPart) { editPart = (EditPart) firstElement; } else if (firstElement instanceof IAdaptable) { editPart = (EditPart) ((IAdaptable) firstElement) .getAdapter(EditPart.class); } if (editPart != null && editPart.getModel() instanceof PictogramElement) { return (PictogramElement) editPart.getModel(); } } return null; } /** * Executes the feature and adds it to the command stack. * * @param feature * the feature * @param context * the context */ public void execute(IFeature feature, IContext context) { try { CommandExec.executeFeatureWithContext(feature, context); } catch (Exception e) { if (e instanceof OperationCanceledException) { // Just log it as info (operation was cancelled on purpose) T.racer().log(IStatus.INFO, "GFCommandStack.execute(Command) " + e, e); //$NON-NLS-1$ } else { // Just log it as an error T.racer().error("GFCommandStack.execute(Command) " + e, e); //$NON-NLS-1$ } } } public void propertyChange(PropertyChangeEvent evt) { refresh(); } /** * @return the {@link IDiagramEditor} diagram editor. */ protected IDiagramEditor getDiagramEditor() { IWorkbenchPart part = getPart(); if (part instanceof DiagramEditorInternal) { return (DiagramEditorInternal) part; } IContributedContentsView contributedView = (IContributedContentsView) part .getAdapter(IContributedContentsView.class); if (contributedView != null) { part = contributedView.getContributingPart(); } if (part instanceof DiagramEditorInternal) { return (DiagramEditorInternal) part; } return null; } /** * @return the diagram. */ protected Diagram getDiagram() { IDiagramTypeProvider diagramTypeProvider = getDiagramTypeProvider(); if (diagramTypeProvider == null) { return null; } return diagramTypeProvider.getDiagram(); } /** * @return the diagram type provider. */ protected IDiagramTypeProvider getDiagramTypeProvider() { IDiagramEditor diagramEditor = getDiagramEditor(); if (diagramEditor == null) { return null; } return diagramEditor.getDiagramTypeProvider(); } protected EObject resolveSemanticObject(Object object) { if (object instanceof EObject) { return (EObject) object; } else if (object instanceof IContainerShapeEditPart) { pe = ((IContainerShapeEditPart) object).getPictogramElement(); PictogramLink link = pe.getLink(); if (link != null) { for (EObject bo : link.getBusinessObjects()) { if (filter.accept(bo)) { return bo; } } } } else if (object instanceof FreeFormConnectionEditPart) { pe = ((FreeFormConnectionEditPart) object).getPictogramElement(); PictogramLink link = pe.getLink(); if (link != null) { for (EObject bo : link.getBusinessObjects()) { if (filter.accept(bo)) { return bo; } } } } else if (object instanceof IAdaptable) { IAdaptable adaptable = (IAdaptable) object; if (adaptable.getAdapter(SemanticAdapter.class) != null) { SemanticAdapter semanticAdapter = (SemanticAdapter) adaptable .getAdapter(SemanticAdapter.class); return semanticAdapter.getEObject(); } else if (adaptable.getAdapter(EObject.class) != null) { return (EObject) adaptable.getAdapter(EObject.class); } } return null; } @Override public void firePropertiesChanged(IPropertiesEditionEvent event) { super.firePropertiesChanged(event); if (pe != null) { UpdateContext context = new UpdateContext(pe); if (getDiagramEditor() != null && getDiagramEditor().getDiagramTypeProvider() != null && getDiagramEditor().getDiagramTypeProvider() .getFeatureProvider() != null) { getDiagramEditor().getDiagramTypeProvider() .getFeatureProvider().updateIfPossible(context); } } } }