# GEF Tutorial mit Fehler(?), Fehler finden.



## Mappenz (9. Sep 2011)

Hi,

ich habe mich noch einmal am diesem Tutorial versucht: http://www.eclipsecon.org/2008/sub/...h_the_Eclipse_Graphical_Editing_Framework.zip von der Seite EclipseCon 2008. Obwohl nur wenig erklärt wird hatte ich das Gefühl einigermaßen zu verstehen was gemacht wird.
Bei meinem ersten Versuch habe ich kapituliert, da glaube dass ein entscheidender Teil des Quellcodes fehlt. Wahrscheinlich nur ein Methodenaufruf. Nun wollte ich selbst die Lösung finden, komme aber nicht vorwärts.

Ich habe den Quellcode bis Folie 75 Kopiert, an dieser Stelle sollte man in der Lage sein, Knoten (nicht aber Kanten) von Hand einzufügen. Geht aber nicht.

Meine Erkenntnisse bisher:
- Es gibt eine Klasse Contentprovider darin wird ein Beispielgraph mit einigen Knoten und Kanten erstellt. Es werden auch die Parts erzeugt und der Graph wird angezeigt. Für die Parts gibt es eine factory, ich finde nicht wo die factory explizit verwendet wird.

-Versucht man Knoten von Hand einzufügen werden diese Knoten zwar erzeugt, in den Graphen (Model im MVC) eingefügt, aber es werden keine Parts erzeugt und der Knoten wird nicht angezeigt.

-Für mich sieht es im Code so aus, als würden die gleichen Schritte bei beiden Möglichkeiten der Knotenerzeugung ausgeführt. Im Debugger unterscheidet sich das verwalten.

Ich habe das Projekt exportiert. Es ist ein Pluginprojekt.


----------



## Mappenz (12. Sep 2011)

Ich bin nicht sehr viel weiter gekommen. Allerdings habe ich nun Durchschaut, warum mit dem Contentprovider Editparts erzeugt werden.

Aus der Klasse public class GraphEditor extends EditorPart


```
private void createGraphViewer(Composite parent) {
		ScrollingGraphicalViewer viewer = new ScrollingGraphicalViewer();
		viewer.setRootEditPart(new ScalableFreeformRootEditPart());
		viewer.createControl(parent);
		viewer.getControl().setBackground(ColorConstants.white);
		viewer.setEditPartFactory(new GraphEditPartFactory());
		viewer.setContents(ContentProvider.INSTANCE.newSampleGraph());
		editDomain.addViewer(viewer);
	}
```

viewer.setContents() erzeugt die Parts für jedes Element im Graphen.


In der Klasse public class Graph extends Observable wird  
	
	
	
	





```
public void addNode(Node node) {
		getNodes().add(node);
		setChanged();
		notifyObservers();
	}
```
erreicht. Eine Updatefunktion wird aber nicht aufgerufen. Das wundert mich mittlerweile auch nicht mehr, denn zum neuen Knoten gibt es gar keinen Editpart. public class NodeEditPart extends AbstractGraphicalEditPart implements Observer ist auch neben ConectionEditPart die einzige Implementierung von Observer im Beispiel. Observer schreibt update() vor.

addNode() wird nur im (provisorischen) Contentprovider und in public class NodeCreateCommand extends Command 
	
	
	
	





```
public void execute() {
		setNodeConstraint();
		setNodeName();
		parent.addNode(node);
	}
```
aufgerufen. 

In diesem Beispiel gibt es im Gegensatz zu anderen Beispielen keine Fabrik für Commands und keine Command zur Erzeugung von Parts. Ich kann mir vorstellen, dass NodeCreateCommand auch die EditParts für Nodes erzeugen sollte. Ist das richtig/sinnvoll? Wie werden die Editparts erzeugt, mit den Nodes, dem View und den anderen Parts richtig verknüpft?


----------



## Mappenz (12. Sep 2011)

Ich habe noch etwas gefunden. Das Command wird mit 
	
	
	
	





```
@Override
	protected Command getCreateCommand(CreateRequest request) {
		if (request.getNewObjectType().equals(Node.class)) {
			NodeCreateCommand result = new NodeCreateCommand();
			result.setLocation(request.getLocation());
			result.setNode((Node)request.getNewObject());
			result.setParent((Graph)getHost().getModel());
			return result;
		}
		return null;
	}
```
aus public class GraphXYLayoutEditPolicy extends XYLayoutEditPolicy erzeugt. Ich weis aber noch nicht wie ich das einordnen soll. Diese Methode wird vom Framework aufgerufen. Ich glaube dass der Aufrufer sich dann auch gleich darum kümmert, dass das Command in den CommandStack kommt.


----------



## Mappenz (12. Sep 2011)

Es gibt doch eine Fabrik für die EditParts.


----------

