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.