Tuesday, June 24, 2008

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.