package org.eclipse.uml2.diagram.common.part; import java.util.ArrayList; import java.util.List; import org.eclipse.core.commands.AbstractHandler; import org.eclipse.core.commands.ExecutionEvent; import org.eclipse.core.commands.ExecutionException; import org.eclipse.emf.common.util.URI; import org.eclipse.emf.transaction.TransactionalEditingDomain; import org.eclipse.gmf.runtime.diagram.ui.editparts.IGraphicalEditPart; import org.eclipse.gmf.runtime.diagram.ui.parts.DiagramEditor; import org.eclipse.gmf.runtime.emf.core.GMFEditingDomainFactory; import org.eclipse.jface.viewers.ISelection; import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.jface.wizard.Wizard; import org.eclipse.swt.widgets.Shell; import org.eclipse.ui.IEditorPart; import org.eclipse.ui.IWorkbenchPart; import org.eclipse.ui.handlers.HandlerUtil; import org.eclipse.uml2.diagram.common.Messages; import org.eclipse.uml2.uml.Package; import org.eclipse.uml2.uml.Element; public abstract class NewDiagramHandlerBase extends AbstractHandler { private final TransactionalEditingDomain myEditingDomain = GMFEditingDomainFactory.INSTANCE.createEditingDomain(); protected abstract Wizard getNewDiagramWizard(Package diagramRoot); protected abstract Wizard getNewSemiSyncDiagramWizard(Package diagramRoot, List<Element> selectedElements); protected abstract void runWizard(Wizard w, Shell s); public Object execute(ExecutionEvent event) throws ExecutionException { IWorkbenchPart part = HandlerUtil.getActivePartChecked(event); List<Element> selectedElements = getSelectedElements(getStructuredSelection(event)); Package diagramRoot = getDiagramRoot(selectedElements); Wizard wizard = null; if (selectedElements.size() == 1 && diagramRoot.equals(selectedElements.get(0))) { wizard = getNewDiagramWizard(diagramRoot); } else { wizard = getNewSemiSyncDiagramWizard(diagramRoot, selectedElements); } if (wizard == null) { return null; } wizard.setWindowTitle(Messages.NewDiagramHandlerBase_wizard_initialize_new_diagram); runWizard(wizard, part.getSite().getShell()); return null; } protected TransactionalEditingDomain getEditingDomain() { return myEditingDomain; } private IStructuredSelection getStructuredSelection(ExecutionEvent event) throws ExecutionException { IEditorPart diagramEditor = HandlerUtil.getActiveEditorChecked(event); assert diagramEditor instanceof DiagramEditor; ISelection selection = HandlerUtil.getCurrentSelectionChecked(event); if (selection instanceof IStructuredSelection) { return (IStructuredSelection) selection; } return null; } private List<Element> getSelectedElements(IStructuredSelection ss) throws ExecutionException { List<Element> selectedElements = new ArrayList<Element>(); for (Object next : ss.toArray()) { Element pe = getValidElement(next); if (pe != null) { selectedElements.add(pe); } } return selectedElements; } protected Element getValidElement(Object object) { if (object instanceof IGraphicalEditPart) { object = ((IGraphicalEditPart) object).resolveSemanticElement(); } if (object instanceof Element) { return (Element) object; } return null; } private Package getDiagramRoot(List<Element> selected) { if (selected == null || selected.size() == 0) { return null; } for (Element next : selected) { Package pakkage = next.getNearestPackage(); if (pakkage != null) { return pakkage; } } return null; } protected URI getDiagramFileURI(org.eclipse.uml2.uml.Package diagramRoot) { return diagramRoot.eResource().getURI(); } }