處理常式延伸點是一個定義於 Eclipse 3.0 中的實驗性質 handlerSubmission
元素的詳細闡述。處理常式是指令在特定時間點的行為。每個指令可以有零個或多個處理常式與其相關聯。在任何時間點,指令可能會沒有任何作用中的處理常式,或有一個作用中的處理常式。作用中的處理常式是一個目前負責執行指令行為的處理常式。這類似於動作處理常式以及可重新定位動作的概念。
處理常式延伸點在某些條件下,允許外掛程式開發人員指定應成為作用中及/或已啟用的處理常式。如果處理常式為非作用中,則指令不會將其行為委派給處理常式。如果處理常式已停用,則不會要求執行處理常式;將暫停執行處理常式。條件是使用 3.0 期間所新增的表示式語言機能定義的。使用 activeWhen
與 enabledWhen
子句表示。
工作台提供部分這些表示式可以作為根據的變數。變數支援為:作用中的環境定義、作用中的編輯器、作用中的組件與目前所選的項目。雖然在此起始設計不支援,但很容易可以新增其他變數或甚至允許外掛程式開發人員提供其他變數。
未指定任何條件的處理常式為預設處理常式。如果沒有其他處理常式能滿足所有條件,則預設處理常式會是唯一作用中的處理常式。如果有兩個處理常式能滿足條件,則會進行條件比較。這是為了要選取條件較為特定或較本端的處理常式。若要這麼做,會查看條件所參照的變數。參照至最特定變數的條件會「勝出」。明確程度的順序(從最不特定至最特定)在 org.eclipse.ui.ISources
中定義。
如果這仍然無法解決衝突,則沒有處理常式會成為作用中。如果開啟了特定追蹤選項,則這個狀況會在日誌中產生一個訊息。如果有兩個預設處理常式,也會產生衝突。外掛程式開發人員及整合測試人員應負責確保這樣的情況不會發生。這些條件是為了避免不必要的外掛程式載入。這些處理常式定義覆蓋在 Proxy 中。若要 Proxy 載入其下的處理常式,必需有兩個條件:必須符合 Proxy 的條件,使其變成作用中,且必須要求指令進行委派(例如,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>
這個特定處理常式相關的說明環境定義的 ID。雖然指令可提供指令行為的一般說明,但有時由處理常式對實作方式提供更具體的說明會更好。
自從: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)*>
一般的根元素。這個元素可用於延伸點內定義其 enablement 表示式。enablement 表示式的子項是使用 and 運算子來組合。
<!ELEMENT not (not | and | or | instanceof | test | systemTest | equals | count | with | resolve | adapt | iterate)>
這個元素代表對其子元素表示式的求值結果執行的 NOT 運算。
<!ELEMENT and (not , and , or , instanceof , test , systemTest , equals , count , with , resolve , adapt , iterate)*>
這個元素代表對其所有子元素表示式的求值結果執行的 AND 運算。
<!ELEMENT or (not , and , or , instanceof , test , systemTest , equals , count , with , resolve , adapt , iterate)*>
這個元素代表對其所有子元素表示式的求值結果執行的 OR 運算。
<!ELEMENT instanceof EMPTY>
<!ATTLIST instanceof
value CDATA #REQUIRED>
這個元素是用來執行焦點物件的 instanceof 檢查。如果物件類型是屬性值指定的類型的子類型, 則這個表示式傳回 EvaluationResult.TRUE。否則傳回 EvaluationResult.FALSE。
<!ELEMENT test EMPTY>
<!ATTLIST test
property CDATA #REQUIRED
args CDATA #IMPLIED
value CDATA #IMPLIED>
這個元素是用來評估焦點物件的內容狀態。testable 內容集可使用內容測試程式延伸點加以延伸。如果尚未載入要執行實際測試的內容測試程式, 則 test 表示式傳回 EvaluationResult.NOT_LOADED。
<!ELEMENT systemTest EMPTY>
<!ATTLIST systemTest
property CDATA #REQUIRED
value CDATA #REQUIRED>
呼叫 System.getProperty 方法來測試系統內容,並比較其結果與透過 value 屬性指定的值。
<!ELEMENT equals EMPTY>
<!ATTLIST equals
value CDATA #REQUIRED>
這個元素是用來執行焦點物件的相等檢查。如果物件等於屬性值提供的值, 則表示式傳回 EvaluationResult.TRUE。否則傳回 EvaluationResult.FALSE。
<!ELEMENT count EMPTY>
<!ATTLIST count
value CDATA #REQUIRED>
這個元素是用來測試集合中的元素數目。
<!ELEMENT with (not , and , or , instanceof , test , systemTest , equals , count , with , resolve , adapt , iterate)*>
<!ATTLIST with
variable CDATA #REQUIRED>
這個元素將要視察其所有子元素的物件變更為給定的變數所參照的物件。如果無法解析變數,則表示式在求值時會擲出 ExpressionException。with 表示式的子項是使用 and 運算子來組合。
<!ELEMENT resolve (not , and , or , instanceof , test , systemTest , equals , count , with , resolve , adapt , iterate)*>
<!ATTLIST resolve
variable CDATA #REQUIRED
args CDATA #IMPLIED>
這個元素將要視察其所有子元素的物件變更為給定的變數所參照的物件。如果無法解析變數,則表示式在求值時會擲出 ExpressionException。with 表示式的子項是使用 and 運算子來組合。
<!ELEMENT adapt (not , and , or , instanceof , test , systemTest , equals , count , with , resolve , adapt , iterate)*>
<!ATTLIST adapt
type CDATA #REQUIRED>
這個元素是用來調整焦點物件,使它成為屬性類型指定的類型。如果配接器或參照的類型尚未載入,則表示式傳回未載入。如果類型名稱根本不存在,它會在評估期間擲出 ExpressionException。adapt 表示式的子項是使用 and 運算子來組合。
<!ELEMENT iterate (not , and , or , instanceof , test , systemTest , equals , count , with , resolve , adapt , iterate)*>
<!ATTLIST iterate
operator (or|and) >
這個元素是用於 java.util.Collection 類型變數的疊代。如果焦點物件不是 java.util.Collection 類型, 則在評估表示式時,將擲出 ExpressionException。
<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>
若要進一步避免外掛程式載入,可以在啟用處理常式時指定。如果 Proxy 尚未載入處理常式,則只有表示式語法可以用來決定處理常式是否啟用。如果 Proxy 已載入處理常式,則會優先參考表示式語法。如果表示式語法評估為 true,則會要求處理常式(如果已啟用的話)。(這是一個短路 Boolean "and" 運算,介於表示式語法與處理常式的已啟用狀態之間。)
<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>
所有處理常式實作 org.eclipse.core.commands.IHandler
。在工作台中,可以使用 org.eclipse.ui.handlers.IHandlerService
介面啟動及取消啟動處理常式。此介面可以從支援工作台物件,例如 IWorkbench
本身擷取。若要擷取此服務,您需要進行類似於 IWorkbench.getAdapter(IHandlerService.class)
的呼叫。
也可以使用工作台中的舊版程式碼啟動及取消啟動處理常式。可以在以下所示的舊版機制中完成此動作。這個機制對使用動作來提出功能表或工具列的用戶端來說是很有用的。
IWorkbenchPartSite mySite; IAction myAction; myAction.setActionDefinitionId(commandId); IKeyBindingService service = mySite.getKeyBindingService(); service.registerAction(myAction);
Copyright (c) 2005 IBM Corporation and others.
All
rights reserved. 本程式與隨附的資料依照 Elipse Public License 1.0 版此次發行所隨附的條款而提供,
可以在以下網址取得:http://www.eclipse.org/legal/epl-v10.html