Fensteraktualisierung

Werden in einem Fenster Eigenschaften von Modellelementen geändert, so sind die anderen Fenster davon zu benachrichtigen, damit sie ihren Inhalt anpassen können.

Zusammenhang

Die meisten Fenster zeigen Modellelemente nicht nur an, sondern sie ermöglichen auch deren Änderung. Eine solche Änderung wirkt sich aber meistens nicht nur lokal im Fenster aus, in dem geändert wurde, sondern auch in anderen Fenstern. Wird beispielsweise der Name eines geöffneten Diagramms im Modellbaum geändert, dann ist auch der Text der Registerlasche des Diagramms und das Namensfeld im Eigenschaftenfenster anzupassen. Bei einer Änderung an Modellelementen muss also das Fenster, in dem die Änderung stattgefunden hat, die anderen Fenster von der Aktion benachrichtigen. Diesem Zweck dient die Refresh-Nachricht.

WindowMessageType.Refresh

Eine Refresh-Nachricht hat Daten vom Typ RefreshWindowMessage. In den Daten sind Informationen zur Art der Aktualisierung enthalten:

  • Mode vom Typ RefreshMode

    Typ der Aktualisierung

  • ElSet vom Typ ElementSet

    Von der Aktualisierung betroffene Modellelemente

Mode Auslösende Aktion ElSet
Command Der Befehl Inhalt neu laden wurde ausgelöst. Leere Menge
Content1

Veralteter Fensterinhalt wurde sichtbar.

Leere Menge
Create Modellelemente wurden erzeugt. Erzeugte Elemente
AddDiagramGraphic Modellelemente wurden einem Diagramm hinzugefügt. Hinzugefügte Elemente
Delete2 Modellelemente wurden gelöscht. Gelöschte Elemente
ChangeName Änderung eines Namens Betroffenes Element
ChangeStereoM2Attribute Änderung von Merkmalen Betroffene Elemente
ChangeStereoProperty Änderung von Stereotypeigenschaften Betroffene Elemente
ChangeLabel Änderung von Labels Betroffene Elemente
ChangeSpecification Änderung von Spezifikationstexten Betroffenes Element
ChangePicture Änderung eines zugeordneten Bildes Betroffenes Element
ChangeOrder Änderung der Reihenfolge zugeordneter Elemente Betroffenes Element
ChangeImportedProfiles Änderung importierter Profile bei Paketen Betroffene Pakete
ChangeAccess Änderung der Zugriffsrechte Betroffene Elemente
ChangeContainer Änderung des Containers Betroffene Elemente
ChangeLock Änderung des Sperrzustands

Betroffene Elemente; Leere Menge bei Entsperrung aller Elemente

ChangeApplicationConfiguration Änderung einer Anwendungskonfiguration
(data enthält den Purpose)
Betroffenes Element

1 Ein Toolfenster erhält keine Refresh-Nachrichten, wenn es nicht sichtbar ist. Stattdessen wird vermerkt, dass das Fenster nicht aktualisiert wurde und dessen Inhalt daher möglicherweise veraltet ist. Wird das Fenster dann in den Vordergrund geholt, wird eine Refresh-Nachricht mit Modus Content ausgelöst. Das Toolfenster sollte daraufhin seinen Inhalt komplett aktualisieren.

2 Beim Modus RefreshMode.Delete ist zu beachten, dass die gelöschten Elemente zwar in den Daten der Nachricht enthalten sind, diese aber schon gelöscht und damit ungültig sind. Es darf also auf keinen Fall auf Eigenschaften dieser Elemente zugegriffen werden. Die Elementmenge darf nur benutzt werden, um z.B. die betroffenen Elemente im Fenster zu suchen, um zu entscheiden, ob das Fenster von der Löschaktion betroffen ist.

Hinweis

Zur Bearbeitung der Refresh-Nachricht siehe das Sample MID.Innovator.Plugin.Sample.RefreshMessage.

Achtung

Eine falsche Bearbeitung von Refresh-Nachrichten kann die Server-Performance drastisch reduzieren. Bitte beachten Sie unbedingt die Hinweise im Abschnitt Performance.

RefreshModel-Methode

Änderungen an Modellelementen erfordern das Versenden von Refresh-Nachrichten an andere Fenster. In der Regel wird eine Elementänderung daher wie folgt realisiert:

  • In einem Steuerelement im Fenster oder in einem Dialog wird die Änderung vorgenommen und die Übernahme ausgelöst.

  • Bei Auslösen der Übernahme wird die Änderung durch Aufruf einer entsprechenden Methode der Server-API an der Server geschickt.

  • Meldet der Server als Antwort einen Fehler, dann ist dieser in einer Messagebox auszugeben. Das Fenster bzw. der Dialog befindet sich nach Schließen der Messagebox in dem Zustand wie unmittelbar vor dem Auslösen der Übernahme. D.h. das Steuerelement enthält weiterhin die geänderten Daten.

  • Meldet der Server als Antwort die fehlerfreie Übernahme der Änderung, dann ist eine Refresh-Nachricht an alle Fenster zu senden, damit diese ggf. auch ihren Inhalt aktualisieren, indem sie die Refresh-Nachricht in ihrer MessageHandler-Methode bearbeiten.

    Zum Versenden der Nachrichten ist die Methode RefreshModel zu verwenden.

Hinweis

Zum Versenden der Refresh-Nachricht siehe das Sample MID.Innovator.Plugin.Sample.RefreshModel.

Fensteraktualisierungen nach dem Erzeugen von Elementen

Die beschriebene Vorgehensweise zur Fensteraktualisierung ist nicht ausreichend, wenn die Anforderung besteht, bei der Erzeugung von Elementen weitere – meistens abhängige – Elemente zu erzeugen. Dieser Spezialfall wird durch folgendes Verfahren gelöst:

  • Nach dem Erzeugen neuer Elemente wird nicht die Methode RefreshModel zur Aktualisierung der Fenster aufgerufen, sondern stattdessen ExecuteCreateRefresh. Die Methode erhält als Parameter die neu erzeugten Elemente und deren Besitzer (optional).

  • Die Methode sendet eine Nachricht vom Typ ElementsCreated mit Daten vom Typ ElementsCreatedWindowMessage. In diesen sind die neu erzeugten Elemente und deren Besitzer und ein Property für die Rückgabe vom Typ CreatedElementsInfo enthalten.

  • Ein Plug-in kann bei der Bearbeitung dieser Nachricht selbst weitere Elemente erzeugen. Die neuen Elemente müssen dann mit einer CreatedElementsInfo.Add-Methode in das Rückgabe-Property eingehängt werden.

  • Nachdem alle Fenster die Nachricht bearbeitet haben, stehen im Rückgabe-Property evtl. weitere Paare von neu erzeugten Elementen und deren Besitzern. Diese werden durch weitere ElementsCreated-Nachrichten verarbeitet, bis keine neuen Elemente mehr entstehen. Die Erzeugung abhängiger Elemente ist also auch rekursiv möglich.

  • Nach dem Einsammeln der neuen Elemente und deren Besitzern wird eine einzige Fensteraktualisierung mit dem Typ RefreshMode.Create ausgelöst. Die Nachrichtendaten enthalten ein Property vom Typ CreatedElementsRefreshInfo, das alle erzeugten Elemente (als Logiken) und deren Besitzer enthält.

Hinweis

Zum Thema Elementerzeugung und Fensteraktualisierung siehe das Sample MID.Innovator.Plugin.Sample.HandleMessage.