/*****************************************************************************
* Copyright (c) 2010 Atos Origin.
*
*
* 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:
* Mathieu Velten (Atos Origin) mathieu.velten@atosorigin.com - Initial API and implementation
*
*****************************************************************************/
package org.eclipse.papyrus.views.documentation.view.papyrus;
import java.util.List;
import org.eclipse.core.runtime.IAdaptable;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.emf.common.command.Command;
import org.eclipse.emf.common.util.URI;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.edit.domain.EditingDomain;
import org.eclipse.emf.transaction.TransactionalEditingDomain;
import org.eclipse.gmf.runtime.diagram.ui.parts.IDiagramWorkbenchPart;
import org.eclipse.gmf.runtime.notation.Diagram;
import org.eclipse.papyrus.infra.core.editor.CoreMultiDiagramEditor;
import org.eclipse.papyrus.infra.core.sasheditor.contentprovider.IPageMngr;
import org.eclipse.papyrus.infra.emf.providers.MoDiscoContentProvider;
import org.eclipse.papyrus.infra.gmfdiag.common.DiagramsUtil;
import org.eclipse.papyrus.views.documentation.DocumentationManager;
import org.eclipse.papyrus.views.documentation.IDocumentationManager;
import org.eclipse.papyrus.views.documentation.view.IDocumentationPartHandler;
import org.eclipse.papyrus.views.documentation.view.SelectResourceDialog;
import org.eclipse.papyrus.views.modelexplorer.MoDiscoLabelProvider;
import org.eclipse.papyrus.views.modelexplorer.ModelExplorerPageBookView;
import org.eclipse.ui.IEditorPart;
import org.eclipse.ui.IWorkbenchPart;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.dialogs.ISelectionStatusValidator;
public class PapyrusDocumentationPartHandler implements IDocumentationPartHandler {
public boolean canHandlePart(IWorkbenchPart part) {
return part instanceof CoreMultiDiagramEditor || part instanceof ModelExplorerPageBookView;
}
public IDocumentationManager getDocumentationManager() {
return DocumentationManager.getInstance();
}
public void executeCommand(IWorkbenchPart part, Command cmd) {
CoreMultiDiagramEditor editor = getPapyrusEditor(part);
if(editor != null && cmd != null) {
TransactionalEditingDomain domain = (TransactionalEditingDomain)editor.getEditingDomain();
domain.getCommandStack().execute(cmd);
}
}
public EObject getAssociatedDiagram(IWorkbenchPart part, EObject eObject) {
if(eObject instanceof Diagram) {
return null;
}
if(eObject != null) {
if(part instanceof IDiagramWorkbenchPart) {
Diagram currentDiagram = ((IDiagramWorkbenchPart)part).getDiagram();
if(currentDiagram != null && eObject.equals(currentDiagram.getElement())) {
return currentDiagram;
}
}
}
return null;
}
public void openElement(IWorkbenchPart part, URI elementUri) {
try {
CoreMultiDiagramEditor editor = getPapyrusEditor(part);
if(editor != null) {
EditingDomain ed = editor.getEditingDomain();
if(ed != null) {
EObject eObject = ed.getResourceSet().getEObject(elementUri, false);
Diagram diagram = null;
if(eObject instanceof Diagram) {
diagram = (Diagram)eObject;
} else {
List<Diagram> diagrams = DiagramsUtil.getAssociatedDiagrams(eObject, null);
if(!diagrams.isEmpty()) {
diagram = diagrams.get(0);
}
}
if(diagram != null) {
IPageMngr pageMngr = (IPageMngr)editor.getAdapter(IPageMngr.class);
if(pageMngr != null) {
if(pageMngr.isOpen(diagram)) {
pageMngr.closePage(diagram);
}
pageMngr.openPage(diagram);
}
}
}
}
} catch (Exception e) {
}
}
public EObject openElementSelectionDialog(IWorkbenchPart part) {
Object selectedElement = null;
CoreMultiDiagramEditor editor = getPapyrusEditor(part);
if(editor != null) {
ISelectionStatusValidator validator = new ISelectionStatusValidator() {
public IStatus validate(Object[] selectedElements) {
boolean enableOK = false;
if(selectedElements.length == 1) {
Object selectedElement = selectedElements[0];
if(adapt(selectedElement) != null) {
enableOK = true;
}
}
String msg = "";
if(enableOK == false) {
msg = "Only one EObject can be selected";
}
return enableOK ? new Status(IStatus.OK, "org.eclipse.emf.common.ui", 0, msg, null) : new Status(IStatus.ERROR, "org.eclipse.emf.common.ui", 0, msg, null);
}
};
selectedElement = SelectResourceDialog.openElementSelection(editor.getServicesRegistry(), new MoDiscoLabelProvider(), new MoDiscoContentProvider(), validator, null, true);
}
return adapt(selectedElement);
}
public boolean isReadOnly(IWorkbenchPart part, EObject eObject) {
CoreMultiDiagramEditor editor = getPapyrusEditor(part);
if(editor != null && eObject != null) {
TransactionalEditingDomain domain = (TransactionalEditingDomain)editor.getEditingDomain();
return domain.isReadOnly(eObject.eResource());
}
return false;
}
private static EObject adapt(Object obj) {
if(obj instanceof EObject) {
return (EObject)obj;
} else if(obj instanceof IAdaptable) {
EObject adapted = (EObject)((IAdaptable)obj).getAdapter(EObject.class);
return adapted;
}
return null;
}
private static CoreMultiDiagramEditor getPapyrusEditor(IWorkbenchPart part) {
if(part instanceof CoreMultiDiagramEditor) {
return (CoreMultiDiagramEditor)part;
}
IEditorPart activeEditor = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage().getActiveEditor();
if(activeEditor instanceof CoreMultiDiagramEditor) {
return (CoreMultiDiagramEditor)activeEditor;
}
return null;
}
}