重新目標化動作

對外掛程式的視圖和編輯器來說,實作與現有工作台動作語意相似的動作是非常普通的, 如剪貼簿的剪下/複製/貼上、重新整理視圖或內容。如果每一個視圖或編輯器必須定義專屬的動作給這些作業並併入至功能表中, 視圖和編輯器的蹦現功能表會變的十分雜亂。

要解決這個問題,工作台定義可由任何視圖或編輯器所處理的重新目標化(也稱為廣域)動作。當視圖或編輯器在作用中時,當使用者從工作台功能表或工具列中選取動作時會執行處理常式。這讓視圖和編輯器共用工作台功能表空間中語意相似的動作。

IWorkbenchActionConstants 記錄了工作台所有的動作以及表示重新目標化動作為廣域的。例如,以下是內容動作的定義。

public static final String PROPERTIES = "properties"; // Global action. 

下列表格彙總了利用視圖和編輯器所實作的通用重新目標化動作:

  「檔案」功能表 「編輯」功能表 「導覽」功能表 「專案」功能表
視圖 移動
重新命名
重新整理
內容
  進入
移至資源
與編輯器同步
上一步
下一步
向上
下一個
上一個
開啟
關閉
建置
重新建置
編輯器 回復
列印
尋找    
視圖和編輯器   剪下
複製
貼上
刪除
全選
復原
重做
   

使用 RetargetAction 建立重新目標化的動作。下列片段是從 WorkbenchActionBuilder 中擷取的。

 propertiesAction = createGlobalAction(IWorkbenchActionConstants.PROPERTIES, "file", false); 

createGlobalAction 方法為我們顯示實際上如何製作 RetargetAction

private RetargetAction createGlobalAction(String id, String actionDefPrefix, boolean labelRetarget) {
	RetargetAction action;
	if (labelRetarget) {
		action = new LabelRetargetAction(id, WorkbenchMessages.getString("Workbench." + id)); 
	}
	else {
		action = new RetargetAction(id, WorkbenchMessages.getString("Workbench." + id)); 
	}
	...
	return action;
}

建立重新目標化動作時,工作台指派 ID 給動作和預設標籤。請注意,重新目標化的動作有兩個樣式。RetargetAction 只讓視圖或編輯器重新實作動作。LabelRetargetAction 也容許視圖和編輯器重設動作標籤。 這對使功能表標籤更特定有用,例如重新標示復原動作為復原輸入

現在我們知道工作台如何定義重新目標化動作。接下來讓我們看一下,視圖或編輯器如何 提供實作給重新目標化的動作。利用設定廣域動作處理常式以完成這項工作。