Befehle
Ein Befehl ist ein Objekt, das die Semantik einer Aktivität repräsentiert. Befehle können Steuerelementen zugewiesen werden, deren Aktivierung den Befehl auslöst. Die Verarbeitung erfolgt kontextabhängig.
Definition eines Befehls
Ein Befehl ist ein Objekt, das die Semantik einer Aktivität repräsentiert. "Kopieren" und "Speichern" sind Beispiele für Befehle.
Befehle können Steuerelementen zugewiesen werden, wie z.B. einer Menüband-Schaltfläche. Bei Aktivierung des Steuerelements wird der Befehl ausgelöst. Nach Auslösung muss der Befehl verarbeitet werden. Diese Verarbeitung erfolgt kontextabhängig. So wird beispielsweise der Speichern-Befehl in einem Textfenster anders verarbeitet als in einem Fenster, das ein Bild enthält.
Ein Befehl wird durch ein Objekt vom Typ ExtCommand mittels folgender Eigenschaften beschrieben.
Eigenschaft | Funktion | obligatorisch |
---|---|---|
Identifier | Eindeutiger, stringwertiger Identifikator |
![]() |
LabelTitel | Text des Befehls |
![]() |
SmallImageSource | Symbol in der Größe 16x16 | |
LargeImageSource | Symbol in der Größe 32x32 | |
ToolTipText | Text des Tooltipps | |
ToolTipImageSource | Symbol im Tooltipp |
Achtung
Der Befehl wird bei seiner Verarbeitung über seinen Identifikator erkannt. Es ist daher unerlässlich, dass dieser eindeutig gewählt wird. Bei Plug-ins empfiehlt sich daher, den Plug-in-Namen als Präfix des Identifikators zu verwenden.
Zur Definition eigener Befehle sind Objekte vom Typ ExtCommand zu erzeugen und diese als Liste bei Bearbeitung der OpenModel-Nachricht mittels der Methode GUIRegistration.AddCommands zu registrieren.
Hinweis
Zur Definition eigener Befehle siehe das Sample MID.Innovator.Plugin.Sample.Command.
Zuweisung zu Steuerelementen
Werden zur Erzeugung eines Steuerelements die Create-Methoden der Klasse RibbonManager verwendet, dann wird der zugehörige Befehl als Argument an die Create-Methode übergeben. Die Daten des Befehls wie Text, Symbole und Tooltipp werden vom Steuerelement übernommen.
Verarbeitung eines Befehls
Plug-ins können Befehle von der Klasse verarbeiten lassen, die IApplicationComponent realisiert. Dazu muss die Klasse zusätzlich die Schnittstelle ICommandDispatchable realisieren, indem sie zwei Dispatcher-Methoden zur Verfügung stellt:
-
CanExeCmd
Prüfung des Befehls auf Ausführbarkeit. -
ExecuteCmd
Ausführung des Befehls.
Bei der Verarbeitung eines Befehls werden vom Framework nacheinander eine Reihe von Dispatcher-Methoden aufgerufen:
-
Dispatcher des Frameworks für modellunabhängige Befehle
-
Dispatcher des Frameworks für modellabhängige Befehle
-
Dispatcher des aktuellen Fensters
-
Dispatcher aller Komponenten, die ICommandDispatchable realisieren
Verarbeitet ein Dispatcher einen Befehl, dann liefert er true als Ergebnis zurück und die Reihe bricht ab. D.h. es wird niemals ein Befehl von mehreren Dispatcher-Methoden gleichzeitig verarbeitet. Ein Plug-in muss also in seinen Dispatcher-Methoden dann und nur dann true als Ergebnis liefern, wenn es den Befehl verarbeitet. Verarbeitung ist nicht zu verwechseln mit Ausführbarkeit. Verarbeitung ist dann gegeben, wenn ein Befehl auf Ausführbarkeit geprüft und unter gewissen Umständen ausgeführt wird. Das ist eine feste Eigenschaft, die sich niemals ändert. Ausführbarkeit dagegen ist eine temporäre Eigenschaft, die vom aktuellen Zustand der Daten in der Anwendung abhängt.
Undo und Redo
Innovator bietet Funktionalitäten zum Rückgängigmachen und Wiederherstellen. Diese Befehle beziehen sich in der Regel auf einzelne ändernde Serverzugriffe. Eine Aktion in der Oberfläche durch den Benutzer kann unter Umständen durch mehrere ändernde Serverzugriffe realisiert sein. Ein Rückgängigmachen wirkt dann nur auf den letzten dieser Zugriffe.
Plug-ins untersuchen oftmals eine große Menge von Elementen und nehmen an diesen bei Erfüllung gewisser Bedingungen Änderungen vor. Die Abarbeitung erfolgt häufig in einer Schleife, woraus möglicherweise eine Vielzahl ändernder Serverzugriffe resultiert. Für diesen Fall besteht die Möglichkeit einer Klammerung. Die geklammerten Änderungen werden dann mit einem einzigen Rückgängigmachen aufgehoben.
Ino.Model.BeginCommandSequence(commandName);
// Ausführung der Aktion ...
Ino.Model.EndCommandSequence();
Der Parameter ist vom Typ string und ist eine frei zu wählende Bezeichnung für die ausgeführte Aktion. Zukünftig könnte dieser Text der Beschreibung dienen, welche Aktion durch ein Rückgängigmachen aufgehoben wird. Aktuell ist der Parameter ohne Bedeutung.
Nicht alle ändernden Serverzugriffe lassen sich aufheben. Sind solche Änderungen in der geklammerten Aktion, dann wird das Rückgängigmachen misslingen. In diesen Fällen ist es sinnvoll, Undo- und Redo-Puffer zu löschen und damit ein Rückgängigmachen zu unterbinden:
// Undo-/Redo-Puffer löschen
try
{
Ino.Site.Model.Login.AsExcellence.LoginId.CommandLoggingClearBuffer();
}
catch (Exception ex)
{
Logger.ExceptionOut(ex);
}