# GMF Editor mit einem zur Laufzeit erstellten Modell



## SEA (14. Mrz 2011)

Hallo Java-Freunde,

ich habe mit EMF und GMF einen Diagramm-Editor erstellt, um damit bestimmte Zustände zu visualisieren. Ich kann nun ein Modell erstellen, laden, ansehen und bearbeiten.

Allerdings möchte ich nun das Diagramm zur Laufzeit anpassen. (z.B. beim Klick in einem anderen View)
(Eine eigene Perspektive und ein View mit verschiedenen Eigenschaften habe ich bereits)

Mir ist aber unklar, wie ich auf das im Editor dargestellte Modell zugreife, um es zu verändern.

Wie kann ich das dargestellte Modell dynamisch zur Laufzeit erstellen ohne eine Datei zu laden?
Kann mir jemand ein Tutorial empfehlen oder ein paar Ansatzpunkte schreiben?

Danke!

Viele Grüße
SEA


----------



## Wildcard (15. Mrz 2011)

Wie ist die andere View mit dem Diagramm verbunden? Über eine Selection? Wenn ja, dann kannst du das Modell aus der Selection holen.


----------



## SteffenHH (18. Mrz 2011)

Hallo,

um ein Modell zur Laufzeit zu erstellen würde ich folgendes versuchen:

// Retrieve the default factory singleton
MyModelFactory factory = MyModelFactory.eINSTANCE;

in der Factory sollten dann Methoden zur Erstellung von weiteren Modellelementen verfügbar sein, z.B.
Product newProduct = factory.createProduct();

Tutorial: Eclipse Modeling Framework (EMF) - Tutorial ?

Hoffe konnte helfen?

Steffen


----------



## SEA (29. Mrz 2011)

Vielen dank für eure Antworten! Ich habe inzwischen schon ein paar Dinge herausgefunden, allerdings funktioniert mein Anwendungsfall leider noch nicht. Ihr könnt mir dabei sicher weiterhelfen ... ;-)

Zum Testen habe ich das folgende Plug-In geschrieben. Es öffnet beim Start der Eclipse-Instanz ein ECore-Diagramm und versucht anschließend eine EClass hinzuzufügen ... was nur noch nicht funktioniert :-/

Wie kann ich den Editor aktualisieren, so dass das eingefügte Element zu sehen ist?

StartUp.java

```
package testecorediagrameditor;

import java.io.File;
import java.util.Collections;

import org.eclipse.emf.common.ui.URIEditorInput;
import org.eclipse.emf.common.util.URI;
import org.eclipse.emf.ecore.*;
import org.eclipse.emf.ecore.resource.*;
import org.eclipse.emf.ecore.resource.impl.ResourceSetImpl;
import org.eclipse.emf.edit.command.AddCommand;
import org.eclipse.emf.transaction.TransactionalEditingDomain;
import org.eclipse.gmf.ecore.edit.parts.EPackageEditPart;
import org.eclipse.gmf.ecore.part.*;
import org.eclipse.gmf.runtime.diagram.core.services.ViewService;
import org.eclipse.gmf.runtime.diagram.ui.resources.editor.parts.DiagramDocumentEditor;
import org.eclipse.gmf.runtime.notation.Diagram;
import org.eclipse.ui.*;
import org.eclipse.ui.ide.IDE;

public class StartUp implements IStartup {

	ResourceSet resourceSet = new ResourceSetImpl();

	@Override
	public void earlyStartup() {
		final IWorkbench workbench = PlatformUI.getWorkbench();
		workbench.getDisplay().asyncExec(new TestECoreDiagramEditor());
	}

	private class TestECoreDiagramEditor implements Runnable {

		@Override
		public void run() {
			try {
				// create an EPackage
				URI ePackageURI = URI.createFileURI("temp_model.ecore");
				EPackage ePackage = EcoreFactory.eINSTANCE.createEPackage();
				ePackage.setName("main package");
				Resource ePackageResource = resourceSet.createResource(ePackageURI);
				ePackageResource.getContents().add(ePackage);
				ePackageResource.save(Collections.EMPTY_MAP);
				new File(ePackageURI.toFileString()).deleteOnExit();

				// create an EPackage diagram
				URI ePackageDiagramURI = URI.createFileURI("temp_model.ecore_diagram");
				Diagram diagram = ViewService.createDiagram(ePackage, EPackageEditPart.MODEL_ID,
						EcoreDiagramEditorPlugin.DIAGRAM_PREFERENCES_HINT);
				Resource ePackageDiagramResource = resourceSet.createResource(ePackageDiagramURI);
				ePackageDiagramResource.getContents().add(diagram);
				ePackageDiagramResource.save(Collections.EMPTY_MAP);
				ePackageDiagramResource.save(Collections.EMPTY_MAP);
				new File(ePackageDiagramURI.toFileString()).deleteOnExit();

				// start the editor
				IWorkbenchPage page = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage();
				String editorId = EcoreDiagramEditor.ID;
				IEditorPart editorPart = IDE.openEditor(page, new URIEditorInput(ePackageDiagramURI), editorId);

				// try to add an element to the diagram
				DiagramDocumentEditor editor = (DiagramDocumentEditor) editorPart;
				TransactionalEditingDomain domain = editor.getEditingDomain();
				AddCommand.create(domain, ePackage, EcorePackage.eINSTANCE.getEPackage_EClassifiers(),
						EcoreFactory.eINSTANCE.createEClass()).execute();
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
	}
}
```

MANIFEST.FM:

```
Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Name: TestECoreDiagramEditor
Bundle-SymbolicName: TestECoreDiagramEditor;singleton:=true
Bundle-Version: 1.0.0.qualifier
Bundle-Activator: testecorediagrameditor.Activator
Require-Bundle: org.eclipse.core.runtime,
 org.eclipse.emf.ecore;bundle-version="2.6.1",
 org.eclipse.ui;bundle-version="3.6.1",
 org.eclipse.gmf.runtime.diagram.core;bundle-version="1.4.0",
 org.eclipse.gmf.ecore.editor;bundle-version="2.2.0",
 org.eclipse.ui.ide;bundle-version="3.6.1",
 org.eclipse.emf.common.ui;bundle-version="2.6.0",
 org.eclipse.gmf.runtime.diagram.ui.resources.editor;bundle-version="1.4.1",
 org.eclipse.gmf.runtime.diagram.ui;bundle-version="1.4.1"
Bundle-ActivationPolicy: lazy
Bundle-RequiredExecutionEnvironment: JavaSE-1.6
```

plugin.xml

```
<?xml version="1.0" encoding="UTF-8"?>
<?eclipse version="3.4"?>
<plugin>
   <extension
         point="org.eclipse.ui.startup">
      <startup
            class="testecorediagrameditor.StartUp">
      </startup>
   </extension>
</plugin>
```


----------



## SEA (29. Mrz 2011)

Ich habs nun herausgefunden ... der folgenden Quelltext läuft nun 


```
package testecorediagrameditor;

import java.io.*;
import java.util.*;

import org.eclipse.emf.common.ui.URIEditorInput;
import org.eclipse.emf.common.util.URI;
import org.eclipse.emf.ecore.*;
import org.eclipse.emf.ecore.resource.*;
import org.eclipse.emf.ecore.resource.impl.ResourceSetImpl;
import org.eclipse.emf.transaction.TransactionalEditingDomain;
import org.eclipse.gmf.ecore.edit.parts.EPackageEditPart;
import org.eclipse.gmf.ecore.part.*;
import org.eclipse.gmf.runtime.diagram.core.services.ViewService;
import org.eclipse.gmf.runtime.diagram.ui.resources.editor.parts.DiagramDocumentEditor;
import org.eclipse.gmf.runtime.emf.type.core.commands.SetValueCommand;
import org.eclipse.gmf.runtime.emf.type.core.requests.SetRequest;
import org.eclipse.gmf.runtime.notation.Diagram;
import org.eclipse.ui.*;
import org.eclipse.ui.ide.IDE;

public class StartUp implements IStartup {

	@Override
	public void earlyStartup() {
		final IWorkbench workbench = PlatformUI.getWorkbench();
		workbench.getDisplay().asyncExec(new TestECoreDiagramEditor());
	}

	private class TestECoreDiagramEditor extends TimerTask implements Runnable {

		private IEditorPart editorPart = null;
		private Timer timer = new Timer();

		@Override
		public void run() {
			try {
				URI ePackageURI = URI.createFileURI("temp_model.ecore");
				URI ePackageDiagramURI = URI.createFileURI("temp_model.ecore_diagram");

				if (this.editorPart == null) {
					createTempECoreModelWithDiagram(ePackageURI, ePackageDiagramURI);

					// start the editor
					IWorkbenchPage page = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage();
					page.closeAllEditors(false);
					String editorId = EcoreDiagramEditor.ID;
					this.editorPart = IDE.openEditor(page, new URIEditorInput(ePackageDiagramURI), editorId);

					this.timer.scheduleAtFixedRate(this, 1000, 1000);
				}

				// try to add an element to the diagram
				DiagramDocumentEditor editor = (DiagramDocumentEditor) this.editorPart;
				TransactionalEditingDomain domain = editor.getEditingDomain();

				EPackage ePackage = (EPackage) editor.getDiagram().getElement();

				SetRequest setReq = new SetRequest(domain, ePackage, EcorePackage.eINSTANCE.getEPackage_EClassifiers(),
						EcoreFactory.eINSTANCE.createEClass());

				new SetValueCommand(setReq).execute(null, editor);

			} catch (Exception e) {
				e.printStackTrace();
			}
		}

		private void createTempECoreModelWithDiagram(URI ePackageURI, URI ePackageDiagramURI) throws IOException {
			ResourceSet resourceSet = new ResourceSetImpl();

			// create an EPackage
			EPackage ePackage = EcoreFactory.eINSTANCE.createEPackage();
			ePackage.setName("main package");
			Resource ePackageResource = resourceSet.createResource(ePackageURI);
			ePackageResource.getContents().add(ePackage);
			ePackageResource.save(Collections.EMPTY_MAP);
			new File(ePackageURI.toFileString()).deleteOnExit();

			// create an EPackage diagram
			Diagram diagram = ViewService.createDiagram(ePackage, EPackageEditPart.MODEL_ID,
					EcoreDiagramEditorPlugin.DIAGRAM_PREFERENCES_HINT);
			Resource ePackageDiagramResource = resourceSet.createResource(ePackageDiagramURI);
			ePackageDiagramResource.getContents().add(diagram);
			ePackageDiagramResource.save(Collections.EMPTY_MAP);
			new File(ePackageDiagramURI.toFileString()).deleteOnExit();
		}
	}
}
```


----------

