blob: b551b061583884b1efcb02e7cb542bd9b86612a8 [file] [log] [blame]
/*
* Copyright (c) 2006, 2007 Borland Software Corporation.
* 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:
* Richard Gronback (Borland) - initial API and implementation
*/
package org.eclipse.gmf.examples.mindmap.rcp.part;
import java.io.File;
import java.text.MessageFormat;
import java.util.HashMap;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import org.eclipse.draw2d.geometry.Rectangle;
import org.eclipse.emf.common.ui.URIEditorInput;
import org.eclipse.emf.common.util.URI;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.xmi.XMLResource;
import org.eclipse.emf.transaction.TransactionalEditingDomain;
import org.eclipse.emf.transaction.util.TransactionUtil;
import org.eclipse.gmf.examples.mindmap.Map;
import org.eclipse.gmf.examples.mindmap.Relationship;
import org.eclipse.gmf.examples.mindmap.Resource;
import org.eclipse.gmf.examples.mindmap.Thread;
import org.eclipse.gmf.examples.mindmap.ThreadItem;
import org.eclipse.gmf.examples.mindmap.Topic;
import org.eclipse.gmf.examples.mindmap.rcp.edit.parts.MapEditPart;
import org.eclipse.gmf.examples.mindmap.rcp.edit.parts.Relationship2EditPart;
import org.eclipse.gmf.examples.mindmap.rcp.edit.parts.Relationship3EditPart;
import org.eclipse.gmf.examples.mindmap.rcp.edit.parts.RelationshipEditPart;
import org.eclipse.gmf.examples.mindmap.rcp.edit.parts.ResourceEditPart;
import org.eclipse.gmf.examples.mindmap.rcp.edit.parts.ThreadEditPart;
import org.eclipse.gmf.examples.mindmap.rcp.edit.parts.ThreadItemEditPart;
import org.eclipse.gmf.examples.mindmap.rcp.edit.parts.ThreadThreadItemCompartmentEditPart;
import org.eclipse.gmf.examples.mindmap.rcp.edit.parts.TopicEditPart;
import org.eclipse.gmf.examples.mindmap.rcp.edit.parts.TopicSubtopicsEditPart;
import org.eclipse.gmf.examples.mindmap.rcp.edit.parts.TopicThreadCompartmentEditPart;
import org.eclipse.gmf.examples.mindmap.rcp.view.factories.MapViewFactory;
import org.eclipse.gmf.examples.mindmap.rcp.view.factories.Relationship2ViewFactory;
import org.eclipse.gmf.examples.mindmap.rcp.view.factories.Relationship3ViewFactory;
import org.eclipse.gmf.examples.mindmap.rcp.view.factories.RelationshipViewFactory;
import org.eclipse.gmf.examples.mindmap.rcp.view.factories.ResourceViewFactory;
import org.eclipse.gmf.examples.mindmap.rcp.view.factories.ThreadItemViewFactory;
import org.eclipse.gmf.examples.mindmap.rcp.view.factories.ThreadViewFactory;
import org.eclipse.gmf.examples.mindmap.rcp.view.factories.TopicSubtopicsViewFactory;
import org.eclipse.gmf.examples.mindmap.rcp.view.factories.TopicViewFactory;
import org.eclipse.gmf.runtime.lite.commands.CreateNotationalEdgeCommand;
import org.eclipse.gmf.runtime.lite.commands.CreateNotationalElementCommand;
import org.eclipse.gmf.runtime.lite.commands.CreateNotationalNodeCommand;
import org.eclipse.gmf.runtime.lite.edit.parts.update.canonical.ElementDescriptor;
import org.eclipse.gmf.runtime.lite.edit.parts.update.canonical.IViewService;
import org.eclipse.gmf.runtime.lite.edit.parts.update.canonical.LinkDescriptor;
import org.eclipse.gmf.runtime.lite.edit.parts.update.canonical.NaiveViewService;
import org.eclipse.gmf.runtime.lite.services.IViewDecorator;
import org.eclipse.gmf.runtime.notation.Diagram;
import org.eclipse.gmf.runtime.notation.NotationFactory;
import org.eclipse.gmf.runtime.notation.View;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.swt.widgets.FileDialog;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.ui.IEditorDescriptor;
import org.eclipse.ui.IEditorPart;
import org.eclipse.ui.IWorkbench;
import org.eclipse.ui.IWorkbenchPage;
import org.eclipse.ui.IWorkbenchWindow;
import org.eclipse.ui.PartInitException;
import org.eclipse.ui.PlatformUI;
/**
* @generated
*/
public class MindmapDiagramEditorUtil {
/**
* @generated
*/
public static String openFilePathDialog(Shell shell,
String fileExtensionFilter, int style) {
FileDialog fileDialog = new FileDialog(shell, style);
fileDialog.setFilterExtensions(new String[] { fileExtensionFilter });
fileDialog.open();
if (fileDialog.getFileName() != null
&& fileDialog.getFileName().length() > 0) {
return fileDialog.getFilterPath() + File.separator
+ fileDialog.getFileName();
} else {
return null;
}
}
/**
* @generated
*/
public static IEditorPart openEditor(URI fileURI) {
IWorkbench workbench = PlatformUI.getWorkbench();
IWorkbenchWindow workbenchWindow = workbench.getActiveWorkbenchWindow();
IWorkbenchPage page = workbenchWindow.getActivePage();
IEditorDescriptor editorDescriptor = workbench.getEditorRegistry()
.getDefaultEditor(fileURI.lastSegment());
if (editorDescriptor == null) {
MessageDialog
.openError(
workbenchWindow.getShell(),
Messages.MindmapDiagramEditorUtil_ErrorNoDescriptorTitle,
MessageFormat
.format(
Messages.MindmapDiagramEditorUtil_ErrorNoDescriptorMessage,
new Object[] { fileURI
.toFileString() }));
return null;
} else {
try {
return page.openEditor(new URIEditorInput(fileURI),
editorDescriptor.getId());
} catch (PartInitException exception) {
MessageDialog.openError(workbenchWindow.getShell(),
Messages.MindmapDiagramEditorUtil_ErrorOpeningEditor,
exception.getMessage());
return null;
}
}
}
/**
* @generated
*/
public static Diagram createDiagramFor(EObject diagramRoot) {
if (MapEditPart.VISUAL_ID != MindmapVisualIDRegistry
.getDiagramVisualID(diagramRoot)) {
return null;
}
Diagram result = NotationFactory.eINSTANCE.createDiagram();
result.setElement(diagramRoot);
MapViewFactory.INSTANCE.decorateView(result);
new DiagramInitializer().initDiagramContents(result);
return result;
}
/**
* @generated
*/
private static class DiagramInitializer {
/**
* @generated
*/
private void initDiagramContents(Diagram diagram) {
createMap_1000Children(diagram);
myViewService = new NaiveViewService(diagram);
createMap_1000ChildLinks(diagram);
}
/**
* @generated
*/
private void createTopicThreadCompartment_7001Children(View viewObject) {
List semanticChildren = getTopicThreadCompartment_7001SemanticChildNodes(viewObject);
for (Iterator it = semanticChildren.iterator(); it.hasNext();) {
ElementDescriptor nextDescriptor = (ElementDescriptor) it
.next();
CreateNotationalElementCommand createCommand = getCreateTopicThreadCompartment_7001NotationalChildNodeCommand(
viewObject, nextDescriptor);
if (createCommand != null && createCommand.canExecute()) {
createCommand.execute();
View nextChild = createCommand.getCreatedView();
int childVisualID = nextDescriptor.getVisualID();
switch (childVisualID) {
case ThreadEditPart.VISUAL_ID:
createThread_3001Children(nextChild);
break;
}
}
}
}
/**
* @generated
*/
private List getTopicThreadCompartment_7001SemanticChildNodes(
View parentView) {
List result = new LinkedList();
View viewObject = parentView;
EObject modelObject = viewObject.getElement();
EObject nextValue;
int nodeVID;
for (Iterator it = ((Topic) modelObject).getComments().iterator(); it
.hasNext();) {
nextValue = (EObject) it.next();
nodeVID = MindmapVisualIDRegistry.getNodeVisualID(viewObject,
nextValue);
if (ThreadEditPart.VISUAL_ID == nodeVID) {
result.add(new ElementDescriptor(nextValue, nodeVID));
}
}
return result;
}
/**
* @generated
*/
protected CreateNotationalElementCommand getCreateTopicThreadCompartment_7001NotationalChildNodeCommand(
View parentView, ElementDescriptor descriptor) {
EObject domainElement = descriptor.getElement();
int nodeVisualID = descriptor.getVisualID();
switch (nodeVisualID) {
case ThreadEditPart.VISUAL_ID:
if (domainElement instanceof Thread) {
return new CreateNotationalNodeCommand(parentView,
domainElement, new Rectangle(0, 0, 40, 40),
ThreadViewFactory.INSTANCE, false);
}
return null;
default:
return null;
}
}
/**
* @generated
*/
private void createThreadThreadItemCompartment_7002Children(
View viewObject) {
List semanticChildren = getThreadThreadItemCompartment_7002SemanticChildNodes(viewObject);
for (Iterator it = semanticChildren.iterator(); it.hasNext();) {
ElementDescriptor nextDescriptor = (ElementDescriptor) it
.next();
CreateNotationalElementCommand createCommand = getCreateThreadThreadItemCompartment_7002NotationalChildNodeCommand(
viewObject, nextDescriptor);
if (createCommand != null && createCommand.canExecute()) {
createCommand.execute();
}
}
}
/**
* @generated
*/
private List getThreadThreadItemCompartment_7002SemanticChildNodes(
View parentView) {
List result = new LinkedList();
View viewObject = parentView;
EObject modelObject = viewObject.getElement();
EObject nextValue;
int nodeVID;
for (Iterator it = ((Thread) modelObject).getItems().iterator(); it
.hasNext();) {
nextValue = (EObject) it.next();
nodeVID = MindmapVisualIDRegistry.getNodeVisualID(viewObject,
nextValue);
if (ThreadItemEditPart.VISUAL_ID == nodeVID) {
result.add(new ElementDescriptor(nextValue, nodeVID));
}
}
return result;
}
/**
* @generated
*/
protected CreateNotationalElementCommand getCreateThreadThreadItemCompartment_7002NotationalChildNodeCommand(
View parentView, ElementDescriptor descriptor) {
EObject domainElement = descriptor.getElement();
int nodeVisualID = descriptor.getVisualID();
switch (nodeVisualID) {
case ThreadItemEditPart.VISUAL_ID:
if (domainElement instanceof ThreadItem) {
return new CreateNotationalNodeCommand(parentView,
domainElement, null,
ThreadItemViewFactory.INSTANCE, false);
}
return null;
default:
return null;
}
}
/**
* @generated
*/
private void createMap_1000Children(View viewObject) {
List semanticChildren = getMap_1000SemanticChildNodes(viewObject);
for (Iterator it = semanticChildren.iterator(); it.hasNext();) {
ElementDescriptor nextDescriptor = (ElementDescriptor) it
.next();
CreateNotationalElementCommand createCommand = getCreateMap_1000NotationalChildNodeCommand(
viewObject, nextDescriptor);
if (createCommand != null && createCommand.canExecute()) {
createCommand.execute();
View nextChild = createCommand.getCreatedView();
int childVisualID = nextDescriptor.getVisualID();
switch (childVisualID) {
case TopicEditPart.VISUAL_ID:
createTopic_2001Children(nextChild);
break;
}
}
}
}
/**
* @generated
*/
private List getMap_1000SemanticChildNodes(View parentView) {
List result = new LinkedList();
View viewObject = parentView;
EObject modelObject = viewObject.getElement();
EObject nextValue;
int nodeVID;
for (Iterator it = ((Map) modelObject).getRootTopics().iterator(); it
.hasNext();) {
nextValue = (EObject) it.next();
nodeVID = MindmapVisualIDRegistry.getNodeVisualID(viewObject,
nextValue);
if (TopicEditPart.VISUAL_ID == nodeVID) {
result.add(new ElementDescriptor(nextValue, nodeVID));
}
}
for (Iterator it = ((Map) modelObject).getResources().iterator(); it
.hasNext();) {
nextValue = (EObject) it.next();
nodeVID = MindmapVisualIDRegistry.getNodeVisualID(viewObject,
nextValue);
if (ResourceEditPart.VISUAL_ID == nodeVID) {
result.add(new ElementDescriptor(nextValue, nodeVID));
}
}
return result;
}
/**
* @generated
*/
protected CreateNotationalElementCommand getCreateMap_1000NotationalChildNodeCommand(
View parentView, ElementDescriptor descriptor) {
EObject domainElement = descriptor.getElement();
int nodeVisualID = descriptor.getVisualID();
switch (nodeVisualID) {
case TopicEditPart.VISUAL_ID:
if (domainElement instanceof Topic) {
return new CreateNotationalNodeCommand(parentView,
domainElement, new Rectangle(0, 0, 40, 40),
TopicViewFactory.INSTANCE, false);
}
return null;
case ResourceEditPart.VISUAL_ID:
if (domainElement instanceof Resource) {
return new CreateNotationalNodeCommand(parentView,
domainElement, new Rectangle(0, 0, 40, 60),
ResourceViewFactory.INSTANCE, false);
}
return null;
default:
return null;
}
}
/**
* @generated
*/
private void createTopic_2001Children(View viewObject) {
for (Iterator it = viewObject.getChildren().iterator(); it
.hasNext();) {
View next = (View) it.next();
int visualID = MindmapVisualIDRegistry.getVisualID(next);
switch (visualID) {
case TopicThreadCompartmentEditPart.VISUAL_ID:
createTopicThreadCompartment_7001Children(next);
break;
}
}
}
/**
* @generated
*/
private void createThread_3001Children(View viewObject) {
for (Iterator it = viewObject.getChildren().iterator(); it
.hasNext();) {
View next = (View) it.next();
int visualID = MindmapVisualIDRegistry.getVisualID(next);
switch (visualID) {
case ThreadThreadItemCompartmentEditPart.VISUAL_ID:
createThreadThreadItemCompartment_7002Children(next);
break;
}
}
}
/**
* @generated
*/
private void createTopic_2001ChildLinks(View viewObject) {
List semanticChildLinks = getTopic_2001SemanticChildLinks(viewObject);
for (Iterator it = semanticChildLinks.iterator(); it.hasNext();) {
LinkDescriptor nextDescriptor = (LinkDescriptor) it.next();
CreateNotationalElementCommand createCommand = getCreateTopic_2001NotationalChildLinkCommand(
viewObject, nextDescriptor);
if (createCommand != null && createCommand.canExecute()) {
createCommand.execute();
}
}
}
/**
* @generated
*/
private List getTopic_2001SemanticChildLinks(View parentView) {
List result = new LinkedList();
EObject modelObject = parentView.getElement();
EObject nextValue;
for (Iterator it = ((Topic) modelObject).getSubtopics().iterator(); it
.hasNext();) {
nextValue = (EObject) it.next();
if (nextValue != null) {
result.add(new LinkDescriptor(modelObject, nextValue, null,
TopicSubtopicsEditPart.VISUAL_ID));
}
}
return result;
}
/**
* @generated
*/
protected CreateNotationalElementCommand getCreateTopic_2001NotationalChildLinkCommand(
View parentView, LinkDescriptor linkDescriptor) {
View sourceView = getViewService().findView(
linkDescriptor.getSource());
View targetView = getViewService().findView(
linkDescriptor.getDestination());
IViewDecorator decorator = null;
if (sourceView == null || targetView == null) {
return null;
}
String sourceModelID = MindmapVisualIDRegistry
.getModelID(sourceView);
if (!MapEditPart.MODEL_ID.equals(sourceModelID)) {
return null;
}
String targetModelID = MindmapVisualIDRegistry
.getModelID(targetView);
if (!MapEditPart.MODEL_ID.equals(targetModelID)) {
return null;
}
switch (linkDescriptor.getVisualID()) {
case TopicSubtopicsEditPart.VISUAL_ID:
if (linkDescriptor.getElement() == null) {
decorator = TopicSubtopicsViewFactory.INSTANCE;
}
break;
}
if (decorator == null) {
return null;
}
return new CreateNotationalEdgeCommand(parentView.getDiagram(),
linkDescriptor.getElement(), sourceView, targetView,
decorator);
}
/**
* @generated
*/
private void createMap_1000ChildLinks(View viewObject) {
List semanticChildLinks = getMap_1000SemanticChildLinks(viewObject);
for (Iterator it = semanticChildLinks.iterator(); it.hasNext();) {
LinkDescriptor nextDescriptor = (LinkDescriptor) it.next();
CreateNotationalElementCommand createCommand = getCreateMap_1000NotationalChildLinkCommand(
viewObject, nextDescriptor);
if (createCommand != null && createCommand.canExecute()) {
createCommand.execute();
}
}
for (Iterator it = viewObject.getChildren().iterator(); it
.hasNext();) {
View next = (View) it.next();
int visualID = MindmapVisualIDRegistry.getVisualID(next);
switch (visualID) {
case TopicEditPart.VISUAL_ID:
createTopic_2001ChildLinks(next);
break;
}
}
}
/**
* @generated
*/
private List getMap_1000SemanticChildLinks(View parentView) {
List result = new LinkedList();
EObject modelObject = parentView.getElement();
EObject nextValue;
int linkVID;
for (Iterator it = ((Map) modelObject).getRelations().iterator(); it
.hasNext();) {
nextValue = (EObject) it.next();
linkVID = MindmapVisualIDRegistry
.getLinkWithClassVisualID(nextValue);
switch (linkVID) {
case RelationshipEditPart.VISUAL_ID: {
EObject source = (EObject) ((Relationship) nextValue)
.getSource();
EObject target = (EObject) ((Relationship) nextValue)
.getTarget();
if (source != null && target != null) {
result.add(new LinkDescriptor(source, target,
nextValue, linkVID));
}
break;
}
case Relationship2EditPart.VISUAL_ID: {
EObject source = (EObject) ((Relationship) nextValue)
.getSource();
EObject target = (EObject) ((Relationship) nextValue)
.getTarget();
if (source != null && target != null) {
result.add(new LinkDescriptor(source, target,
nextValue, linkVID));
}
break;
}
case Relationship3EditPart.VISUAL_ID: {
EObject source = (EObject) ((Relationship) nextValue)
.getSource();
EObject target = (EObject) ((Relationship) nextValue)
.getTarget();
if (source != null && target != null) {
result.add(new LinkDescriptor(source, target,
nextValue, linkVID));
}
break;
}
}
}
return result;
}
/**
* @generated
*/
protected CreateNotationalElementCommand getCreateMap_1000NotationalChildLinkCommand(
View parentView, LinkDescriptor linkDescriptor) {
View sourceView = getViewService().findView(
linkDescriptor.getSource());
View targetView = getViewService().findView(
linkDescriptor.getDestination());
IViewDecorator decorator = null;
if (sourceView == null || targetView == null) {
return null;
}
String sourceModelID = MindmapVisualIDRegistry
.getModelID(sourceView);
if (!MapEditPart.MODEL_ID.equals(sourceModelID)) {
return null;
}
String targetModelID = MindmapVisualIDRegistry
.getModelID(targetView);
if (!MapEditPart.MODEL_ID.equals(targetModelID)) {
return null;
}
switch (linkDescriptor.getVisualID()) {
case RelationshipEditPart.VISUAL_ID:
if (linkDescriptor.getElement() instanceof Relationship) {
decorator = RelationshipViewFactory.INSTANCE;
}
break;
case Relationship2EditPart.VISUAL_ID:
if (linkDescriptor.getElement() instanceof Relationship) {
decorator = Relationship2ViewFactory.INSTANCE;
}
break;
case Relationship3EditPart.VISUAL_ID:
if (linkDescriptor.getElement() instanceof Relationship) {
decorator = Relationship3ViewFactory.INSTANCE;
}
break;
}
if (decorator == null) {
return null;
}
return new CreateNotationalEdgeCommand(parentView.getDiagram(),
linkDescriptor.getElement(), sourceView, targetView,
decorator);
}
/**
* @generated
*/
private IViewService myViewService;
/**
* @generated
*/
private IViewService getViewService() {
return myViewService;
}
}
/**
* Returns whether the given element is read only in its editing domain.
* @generated
*/
public static boolean isReadOnly(EObject element) {
if (element == null) {
return true;
}
org.eclipse.emf.ecore.resource.Resource resource = element.eResource();
if (resource == null) {
return false;
}
return isReadOnly(resource);
}
/**
* @generated
*/
public static boolean isReadOnly(
org.eclipse.emf.ecore.resource.Resource resource) {
TransactionalEditingDomain editingDomain = TransactionUtil
.getEditingDomain(resource);
if (editingDomain == null) {
return false;
}
return editingDomain.isReadOnly(resource);
}
/**
* @generated
*/
public static java.util.Map getSaveOptions() {
java.util.Map saveOptions = new HashMap();
saveOptions.put(XMLResource.OPTION_ENCODING, "UTF-8"); //$NON-NLS-1$
saveOptions
.put(XMLResource.OPTION_RECORD_UNKNOWN_FEATURE, Boolean.TRUE);
saveOptions
.put(
org.eclipse.emf.ecore.resource.Resource.OPTION_SAVE_ONLY_IF_CHANGED,
org.eclipse.emf.ecore.resource.Resource.OPTION_SAVE_ONLY_IF_CHANGED_MEMORY_BUFFER);
return saveOptions;
}
}