package org.eclipse.xtext.example.fowlerdsl.diagram.properties;
import java.beans.PropertyChangeEvent;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
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.widgets.ReferencesTable;
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.IDiagramContainer;
import org.eclipse.graphiti.ui.editor.DiagramEditor;
import org.eclipse.graphiti.ui.internal.T;
import org.eclipse.graphiti.ui.internal.parts.FreeFormConnectionEditPart;
import org.eclipse.graphiti.ui.internal.parts.IContainerShapeEditPart;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.ISelectionProvider;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.ui.IWorkbenchPart;
import org.eclipse.ui.part.IContributedContentsView;
@SuppressWarnings("restriction")
public class FowlerDslPropertiesEditionPartFormUtils {
public static ISelection createSelection(final IWorkbenchPart part,
final FowlerDslElementFilter filter) {
IDiagramContainer diagramEditor = getDiagramEditor(part);
if (diagramEditor != null) {
ISelectionProvider selectionProvider = part.getSite()
.getSelectionProvider();
Object selectedDiagramElement = null;
if (selectionProvider != null) {
ISelection selection = selectionProvider.getSelection();
if (selection instanceof IStructuredSelection) {
IStructuredSelection structuredSelection = (IStructuredSelection) selection;
selectedDiagramElement = structuredSelection
.getFirstElement();
}
}
List<EObject> selectedEObjects = new ArrayList<EObject>();
EObject semanticObject = null;
if (selectedDiagramElement == null) {
List<PictogramElement> pes = Arrays.asList(diagramEditor
.getSelectedPictogramElements());
if (pes.size() > 0) {
semanticObject = resolveSemanticObject(pes.get(0), filter);
}
} else {
semanticObject = resolveSemanticObject(selectedDiagramElement,
filter);
}
if (semanticObject != null) {
selectedEObjects.add(semanticObject);
}
return new StructuredSelection(selectedEObjects);
}
return null;
}
/**
* @return the selected pictogram element.
*/
public static PictogramElement getSelectedPictogramElement(
ISelection selection) {
if (selection instanceof StructuredSelection) {
StructuredSelection structuredSelection = (StructuredSelection) selection;
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 static 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 static void propertyChange(PropertyChangeEvent evt) {
// refresh();
}
/**
* @return the {@link IDiagramContainer} diagram editor.
*/
public static IDiagramContainer getDiagramEditor(IWorkbenchPart part) {
if (part instanceof DiagramEditor) {
return (DiagramEditor) part;
}
IContributedContentsView contributedView = (IContributedContentsView) part
.getAdapter(IContributedContentsView.class);
if (contributedView != null) {
part = contributedView.getContributingPart();
}
if (part instanceof DiagramEditor) {
return (DiagramEditor) part;
}
return null;
}
/**
* @return the diagram.
*/
public static Diagram getDiagram(IWorkbenchPart part) {
IDiagramTypeProvider diagramTypeProvider = getDiagramTypeProvider(part);
if (diagramTypeProvider == null) {
return null;
}
return diagramTypeProvider.getDiagram();
}
/**
* @return the diagram type provider.
*/
public static IDiagramTypeProvider getDiagramTypeProvider(
IWorkbenchPart part) {
IDiagramContainer diagramEditor = getDiagramEditor(part);
if (diagramEditor == null) {
return null;
}
return diagramEditor.getDiagramTypeProvider();
}
public static void disableReferencesTable(ReferencesTable table) {
DummyReferencesTableListener dummy = new DummyReferencesTableListener();
table.setEnabled(false);
table.addTableReferenceListener(dummy);
}
public static EObject resolveSemanticObject(Object object,
FowlerDslElementFilter filter) {
PictogramElement pe = null;
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;
}
public static void firePropertiesChanged(IPropertiesEditionEvent event,
PictogramElement pe, IWorkbenchPart part) {
if (pe != null) {
UpdateContext context = new UpdateContext(pe);
IDiagramContainer diagramEditor = getDiagramEditor(part);
if (diagramEditor != null
&& diagramEditor.getDiagramTypeProvider() != null
&& diagramEditor.getDiagramTypeProvider()
.getFeatureProvider() != null) {
diagramEditor.getDiagramTypeProvider().getFeatureProvider()
.updateIfPossible(context);
}
}
}
}