Der Erweiterungspunkt "Steuerroutinen" ist eine Weiterentwicklung des in Eclipse 3.0 definierten experimentellen Elements handlerSubmission
. Eine Steuerroutine ist das Verhalten eines Befehls zu einem bestimmten Zeitpunkt. Einem Befehl können null oder mehr Steuerroutinen zugeordnet sein. ZU jedem Zeitpunkt jedoch hat ein Befehl keine aktive Steuerroutine oder eine aktive Steuerroutine. Die aktive Steuerroutine ist die, die gegenwärtig für die Ausführung des Verhaltens des Befehls verantwortlich ist. Dies ist dem Konzept einer Aktionssteuerroutine und einer neuabzielbaren Aktion sehr ähnlich.
Der Erweiterungspunkt "Steuerroutinen" ermöglicht einem Plug-in-Entwickler die Angabe einer Steuerroutine, die unter bestimmten Bedingungen aktiviert und/oder deaktiviert werden soll. Wenn eine Steuerroutine inaktiv ist, dann wird kein Befehl sein Verhalten an die Steuerroutine delegieren. Wenn eine Steuerroutine deaktiviert ist, dann wird die Steuerroutine nicht darum gebeten zu arbeiten; die Ausführung der Steuerroutine wird geblockt. Die Bedingungen werden mit Hilfe der in 3.0 hinzugefügten
Ausdruckssprachfunktion definiert. Sie werden mit Hilfe der Klauseln activeWhen
und enabledWhen
ausgedrückt.
Die Workbench stellt einige Variablen zur Verfügung, auf die diese Ausdrücke sich verlassen können. Die unterstützten Variablen sind: Die aktiven Kontexte, der aktive Editor, der aktive Abschnitt und die aktuelle Auswahl. Obwohl dies in diesem anfänglichen Entwurf nicht unterstützt wird, ist leicht zu erkennen, wie es möglich wäre, andere Variablen hinzuzufügen oder Plug-in-Entwicklern zu gestatten andere Variablen beizusteuern.
Eine Steuerroutine, die keine Bedingungen angibt, ist eine Standardsteuerroutine. Eine Standardsteuerroutine ist nur aktiv, wenn nicht alle Bedingungen einer anderen Steuerroutine erfüllt worden sind. Wenn zwei Steuerroutinen noch Bedingungen haben, die erfüllt sind, werden die Bedingungen verglichen. Die Idee ist es, eine Steuerroutine auszuwählen, deren Bedingung
spezifischer oder lokaler ist. Dazu werden die Variablen betrachtet, auf die durch die Bedingung verwiesen wird. Die Bedingung, die sich auf die spezifischste Variable bezieht, "gewinnt". Die Reihenfolge der Spezifizität (von "am unspezifischsten" bis "am spezifischsten") wird in org.eclipse.ui.ISources
definiert.
Sollte dies den Konflikt immer noch nicht lösen, dann ist keine Steuerroutine aktiviert. Wenn eine besondere Tracefunktionsangabe eingeschaltet ist, dann führt dies zu einer Nachricht im Protokoll. Ein Konflikt kann auch auftreten, wenn es zwei Standardsteuerroutinen gibt. Es liegt in der Verantwortung der Plug-in-Entwickler und Integrationstester sicherzustellen, dass dies nicht passiert. Diese Bedingungen werden verwendet, um unnötiges Laden von Plug-ins zu vermeiden. Diese Steuerroutinedefinitionen werden in ein Proxy eingeschlossen. Damit ein Proxy seine zu Grunde liegende Steuerroutine lädt, müssen zwei Dinge geschehen: Die Bedingungen für den Proxy müssen erfüllt sein, so dass er aktiv wird und der Befehl muss aufgefordert werden, etwas zu tun, das er delegieren muss (z.B. execute()).
<!ELEMENT extension (handler*)>
<!ATTLIST extension
point CDATA #REQUIRED
id CDATA #IMPLIED
name CDATA #IMPLIED>
<!ELEMENT handler (activeWhen? , class? , enabledWhen?)>
<!ATTLIST handler
commandId CDATA #REQUIRED
class CDATA #IMPLIED
helpContextId CDATA #IMPLIED>
Die Kennung des Hilfekontextes, der mit speziellen Handler verbunden ist. Während ein Befehl eine allgemeine Beschreibung für das Befehlsverhalten bereitstellen kann, ist es bei einem Handler manchmal besser, eine speziellere Hilfe für seine Implementierung zur Verfügung zu stellen.
Ab: 3.2
<!ELEMENT activeWhen (not | and | or | instanceof | test | systemTest | equals | count | with | resolve | adapt | iterate)>
<!ELEMENT enabledWhen (not | and | or | instanceof | test | systemTest | equals | count | with | resolve | adapt | iterate)>
<!ATTLIST class
class CDATA #IMPLIED>
<!ELEMENT parameter EMPTY>
<!ATTLIST parameter
name CDATA #REQUIRED
value CDATA #REQUIRED>
<!ELEMENT enablement (not , and , or , instanceof , test , systemTest , equals , count , with , resolve , adapt , iterate)*>
Ein generisches Stammelement. Das Element kann in einem Erweiterungspunkt zum Definieren seines Ausdrucks "enablement" eingesetzt werden. Die untergeordneten Elemente eines Ausdrucks "enablement" werden durch den Einsatz des Operators "and" kombiniert.
<!ELEMENT not (not | and | or | instanceof | test | systemTest | equals | count | with | resolve | adapt | iterate)>
Dieses Element stellt eine Operation NOT für das Ergebnis der Auswertung seiner Unterelementausdrücke dar.
<!ELEMENT and (not , and , or , instanceof , test , systemTest , equals , count , with , resolve , adapt , iterate)*>
Dieses Element stellt eine Operation AND für das Auswertungsergebnis aller seiner Unterelementausdrücke dar.
<!ELEMENT or (not , and , or , instanceof , test , systemTest , equals , count , with , resolve , adapt , iterate)*>
Dieses Element stellt eine Operation OR für das Auswertungsergebnis aller seiner Unterelementausdrücke dar.
<!ELEMENT instanceof EMPTY>
<!ATTLIST instanceof
value CDATA #REQUIRED>
Dieses Element wird zur Durchführung einer Prüfung des Typs "instanceof" für das Objekt im Fokus eingesetzt. Der Ausdruck gibt "EvaluationResult.TRUE" zurück, wenn es sich bei dem Objekttyp um einen Untertyp des im Attribut "value" angegebenen Typs handelt. Andernfalls wird "EvaluationResult.FALSE" zurückgegeben.
<!ELEMENT test EMPTY>
<!ATTLIST test
property CDATA #REQUIRED
args CDATA #IMPLIED
value CDATA #IMPLIED>
Dieses Element wird verwendet, um den Eigenschaftsstatus des Objekts im Fokus zu auszuwerten. Die Gruppe der Eigenschaften, die getestet werden können, kann mit Hilfe des Erweiterungspunktes "propertyTesters" für Testfunktionen für Eigenschaften erweitert werden. Der Ausdruck "test" gibt "EvaluationResult.NOT_LOADED" zurück, wenn die Testfunktion für Eigenschaften, die den Test durchführt, noch nicht geladen ist.
<!ELEMENT systemTest EMPTY>
<!ATTLIST systemTest
property CDATA #REQUIRED
value CDATA #REQUIRED>
Testet eine Systemeigenschaft, indem die Methode "System.getProperty" aufgerufen wird und das Ergebnis mit dem im Attribut "value" angegebenen Wert verglichen wird.
<!ELEMENT equals EMPTY>
<!ATTLIST equals
value CDATA #REQUIRED>
Dieses Element wird zur Durchführung einer Prüfung des Typs "equals" für das Objekt im Fokus eingesetzt. Der Ausdruck gibt "EvaluationResult.TRUE" zurück, wenn das Objekt mit dem Wert übereinstimmt, der von dem Attributwert zur Verfügung gestellt wird. Andernfalls wird "EvaluationResult.FALSE" zurückgegeben.
<!ELEMENT count EMPTY>
<!ATTLIST count
value CDATA #REQUIRED>
Dieses Element wird verwendet, um die Anzahl der Elemente in einer Gruppe zu testen.
<!ELEMENT with (not , and , or , instanceof , test , systemTest , equals , count , with , resolve , adapt , iterate)*>
<!ATTLIST with
variable CDATA #REQUIRED>
Dieses Element ändert das zu untersuchende Objekt für alle seine untergeordneten Elemente in das Objekt, auf das mit der betreffenden Variablen verwiesen wird. Kann die Variable nicht aufgelöst werden, löst der Ausdruck bei der Auswertung der Variablen die Ausnahmebedingung "ExpressionException" aus. Die untergeordneten Elemente des Ausdrucks "with" werden durch Verwendung des Operators "and" kombiniert.
<!ELEMENT resolve (not , and , or , instanceof , test , systemTest , equals , count , with , resolve , adapt , iterate)*>
<!ATTLIST resolve
variable CDATA #REQUIRED
args CDATA #IMPLIED>
Dieses Element ändert das zu untersuchende Objekt für alle seine untergeordneten Elemente in das Objekt, auf das mit der betreffenden Variablen verwiesen wird. Kann die Variable nicht aufgelöst werden, löst der Ausdruck bei der Auswertung der Variablen die Ausnahmebedingung "ExpressionException" aus. Die untergeordneten Elemente des Ausdrucks "with" werden durch Verwendung des Operators "and" kombiniert.
<!ELEMENT adapt (not , and , or , instanceof , test , systemTest , equals , count , with , resolve , adapt , iterate)*>
<!ATTLIST adapt
type CDATA #REQUIRED>
Dieses Element wird verwendet, um das Objekt im Fokus an den Typ anzupassen, der im Attribut "type" angegeben ist. Der Ausdruck gibt "not loaded" zurück, wenn entweder der Adapter oder der verwiesene Typ noch nicht geladen ist. Während der Auswertung wird die Ausnahmebedingung "ExpressionException" ausgelöst, wenn der Typname überhaupt nicht existiert. Die untergeordneten Elemente eines Ausdrucks "adapt" werden mit Hilfe des Operators "and" kombiniert.
<!ELEMENT iterate (not , and , or , instanceof , test , systemTest , equals , count , with , resolve , adapt , iterate)*>
<!ATTLIST iterate
operator (or|and) >
Dieses Element wird zur Iteration einer Variablen des Typs "java.util.Collection" eingesetzt. Wenn das Objekt im Fokus nicht den Typ "java.util.Collection" hat, wird während der Auswertung des Ausdrucks die Ausnahmebedingung "ExpressionException" ausgelöst.
<extension point=
"org.eclipse.ui.handlers"
>
<handler commandId=
"commandId"
class=
"org.eclipse.compare.Command"
>
<activeWhen>
<with variable=
"selection"
>
<count value=
"1"
/>
<iterate operator=
"and"
>
<adapt type=
"IResource"
/>
</iterate>
</with>
</activeWhen>
</handler>
</extension>
Um das Laden von Plug-ins weiterhin zu vermeiden, ist es möglich anzugeben, wann die Steuerroutine aktiviert ist. Wenn der Proxy die Steuerroutine noch nicht geladen hat, wird nur die Ausdrucksyntax verwendet, um zu entscheiden, ob die Steuerroutine aktiviert ist. Wenn der Proxy die Steuerroutine geladen hat, wird die Ausdrucksyntax zuerst konsultiert. Wenn die Auswertung der Ausdrucksyntax "true" ergibt, wird die Steuerroutine gefragt, ob sie aktiviert ist. (Dies ist eine Boolesche Kurzschluss-"und"-Operation zwischen der Syntax des Ausdrücke und dem Aktivierungsstatus der Steuerroutine.)
<extension point=
"org.eclipse.ui.handlers"
>
<handler commandId=
"commandId"
class=
"org.eclipse.Handler"
>
<enabledWhen>
<with variable=
"context"
>
<property id=
"id":
value=
"debugging"
/>
</with>
</enabledWhen>
</handler>
</extension>
Alle Steuerroutinen implementieren org.eclipse.core.commands.IHandler
. Innerhalb der Workbench ist es möglich, Steuerroutinen mit Hilfe der Schnittstelle org.eclipse.ui.handlers.IHandlerService
zu aktivieren und zu deaktivieren. Diese Schnittstelle kann von unterstützenden Workbench-Objekten abgerufen werden, wie z.B. IWorkbench
selbst. Um den Service abzurufen, würden Sie einen Aufruf wie IWorkbench.getAdapter(IHandlerService.class)
vornehmen.
Es ist auch möglich, Steuerroutinen mit Hilfe von Codes aus früheren Versionen in der Workbench zu aktivieren und zu deaktivieren. Dies kann durch den folgenden traditionellen Produktmechanismus geschehen. Dieser Mechanismus ist nützlich für Clients, die Aktionen verwenden, um Hinzufügungen zu Menüs oder Symbolleisten durchzuführen.
IWorkbenchPartSite mySite; IAction myAction; myAction.setActionDefinitionId(commandId); IKeyBindingService service = mySite.getKeyBindingService(); service.registerAction(myAction);
Copyright (c) 2005 IBM Corporation und Andere.
Alle Rechte vorbehalten. Dieses Programm und sein Begleitmaterial werden gemäß den Bedingungen der "Eclipse Public License v1.0" zur Verfügung gestellt, die dieser Lieferung beiliegt und unter
http://www.eclipse.org/legal/epl-v10.html abgerufen werden kann.