Tuesday, June 24, 2008

GMF Read only

In manchen Projekten lohnt es sich auch auf GMF zu setzen selbst wenn das Diagram read only ist und somit die Editierfunktionen von dem Framework nicht gefragt sind. GMF kommt schon mit einigen Features out of the box daher die man für solche Einsätze erstmal abstellen muss. Im folgenden Bild kann man zum Beispiel ein Popup Feature sehen welches nicht mehr hochkommen soll und somit dem Anwender das Erstellen eines neuen Element untersagt:


In den EditParts findet man die Methode createDefaultEditPolicies. Hier ist der richtige Platz um die nicht gewünschten Feature zu unterdrücken oder besser gesagt zu removen. Im folgenden Code Snippet kann man sehen wie dies funktioniert:

/**

* @generated

*/

protected void createDefaultEditPolicies() {

super.createDefaultEditPolicies();

installEditPolicy(EditPolicyRoles.SEMANTIC_ROLE,

new TopicSubtopicsItemSemanticEditPolicy());

removeEditPolicy(EditPolicyRoles.POPUPBAR_ROLE);

}


Diese Methode sollte man allerdings auch am besten in einem CustomXXXEditPart überschreiben damit man die Generierung von GMF immer verwenden kann ohne großes Bauchweh zu haben.
Die Klasse EditPolicyRoles hat noch einige andere Rollen die je nach Nutzen removed oder geadded werden können.

Dann mal wieder viel Spaß beim testen. 

Tooltip GMF

Um in GMF einen Tooltip an eine IFigure zu bekommen gibt es zwei Möglichkeiten die man wählen kann. Der erste Weg ist der einfache in dem man einfach an eine Figure mittels der Methode setToolTip eine IFigure übergibt welche den ToolTip enthält.

Im folgenden Beispiel wird direkt in der ToolTip-Methode ein Label mit dem Text der angezeigt werden soll angelegt.

















protected NodeFigure createNodeFigure() {
NodeFigure figure = createNodePlate();
figure.setLayoutManager(new StackLayout());
figure.setToolTip(new Label("Tooltip"));
IFigure shape = createNodeShape();
figure.add(shape);
contentPane = setupContentPane(shape);
return figure; }

Der zweite und wohl der häufigere Weg ist etwas komplizierter. Wenn man weiterhin die Generierung der EditParts in GMF nutzen will, sollte man die generierten EditParts überschreiben. Wenn man diesen Ansatz verfolgt erspart man sich einiges an Arbeit bei Änderungen an den Modellen und erneutem Generieren. Leider kommt es bei GMF ab und zu vor, das sich der Generator verschluckt und der Entwickler manuell alle Packages löschen muss um dann die Generierung erneut zu starten. Natürlich kann man auch die Fehler per Hand lösen.
Soll ein Name von einem Element im Diagramm den Namen des jeweiligen Elements anzeigen sollte man in der inneren Klasse Figure des EditParts eine Methode anlegen die sich das semantische Modellelemente holt um das Feature zu auszulesen. Mit dem folgenden Code kommt man an das Modellelement ran.

ownedElement = (OwnedElement) ((org.eclipse.gmf.runtime.notation.Node) CustomOwnedElementEditPart.this.getModel()).getElement();

Wenn man das gewünschte Element hat kann man dann wieder mittels eines Labels den ToolTip über die Figure Methode setzen.

Folgender Code zeigt das Setzen des ToolTips durch die semantische Information im Modellelement:

if (ownedElement.getName() != null && ownedElement.getName().length()> 0) {
tooltipText = ownedElement.getName();
} else {
tooltipText = "Owned-Element";
}

if (getToolTip() == null) {
setToolTip(new Label(tooltipText));
} else if (getToolTip() instanceof Label) {
((Label) getToolTip()).setText(tooltipText);
}

Einfach mal austesten und feststellen das es doch nicht so schwer ist wie es auf den ersten Blick ausschaut.