重新目標化編輯器動作

重新呼叫 Readme 工具自行定義編輯器,其使用本身的 ReadmeEditorActionBarContributor 提供動作至工作台功能表列。

   <extension
      point = "org.eclipse.ui.editors">
	<editor
         id = "org.eclipse.ui.examples.readmetool.ReadmeEditor"
  	   name="%Editors.ReadmeEditor"
      	   icon="icons/obj16/editor.png"
      	   class="org.eclipse.ui.examples.readmetool.ReadmeEditor"
	   extensions="readme"
           contributorClass="org.eclipse.ui.examples.readmetool.ReadmeEditorActionBarContributor">
	</editor>
   </extension>

讓我們更仔細的看看在建構子類別中發生了什麼事。

public ReadmeEditorActionBarContributor() {	...
	action2 = new RetargetAction(IReadmeConstants.RETARGET2, MessageUtil.getString("Editor_Action2"));
	action2.setToolTipText(MessageUtil.getString("Readme_Editor_Action2")); 
	action2.setDisabledImageDescriptor(ReadmeImages.EDITOR_ACTION2_IMAGE_DISABLE);
	action2.setImageDescriptor(ReadmeImages.EDITOR_ACTION2_IMAGE_ENABLE);
	...
	action3 = new LabelRetargetAction(IReadmeConstants.LABELRETARGET3, MessageUtil.getString("Editor_Action3"));
	action3.setDisabledImageDescriptor(ReadmeImages.EDITOR_ACTION3_IMAGE_DISABLE);
	action3.setImageDescriptor(ReadmeImages.EDITOR_ACTION3_IMAGE_ENABLE);
	...  
	handler2 = new EditorAction(MessageUtil.getString("Editor_Action2")); 
	...
	handler3 = new EditorAction(MessageUtil.getString("Editor_Action3")); 
	...

當建構子建立後,它建立兩個重新目標化的動作(其中一個讓標籤更新,另一個則無)。動作的建立使用與工作台所使用的相同的技術。它也建立了兩個處理常式, 當編輯器為作用中的部分時,可以為動作所使用。

但是哪裡是已登錄動作的處理常式?當編輯器重新目標化動作時, 要完成設定廣域處理常式會有一些不同。為什麼?因為建構子負責追蹤 作用中的視圖,並依不同的視圖或編輯器變為作用中時,連結不同的處理常式。(當您為其中一個廣域動作設定處理常式時,工作台為您處理。)以下是如何設定 ReadmeEditorActionBarContributor

public void init(IActionBars bars, IWorkbenchPage page) {
	super.init(bars, page);
	bars.setGlobalActionHandler(IReadmeConstants.RETARGET2, handler2);
	bars.setGlobalActionHandler(IReadmeConstants.LABELRETARGET3, handler3);
	...

首先,建構子自行為重新目標化的動作登錄處理常式。當編輯器在作用中時,這確保建構子的動作一定會執行。下一步是登錄每一個 RetargetAction 為頁面上的一個部分接聽器。

	...
	// 連結重新目標化動作為頁面接聽器
	page.addPartListener(action2);
	page.addPartListener(action3);
	IWorkbenchPart activePart = page.getActivePart();
	if (activePart != null) {
		action2.partActivated(activePart);
		action3.partActivated(activePart);
	}
}

新增每一個 RetargetAction 為部分接聽器,表示當作用中的部分變更時將會通知它。動作可從新啟動的部分取得正確的廣域處理常式。(請參閱 RetargetAction 的實作以取得詳細資訊。)請注意要開始時,動作是由目前作用中的部分所催化。

當編輯器建構子已刪除,它應該解除連結重新目標化的動作為頁面接聽器。

public void dispose() {
	// 移除如同頁面接聽器重新目標化的動作
	getPage().removePartListener(action2);
	getPage().removePartListener(action3);
}

最後,記得動作列建構子是由相同編輯器類別的實例所共用。為了這個原因,當作用中的編輯器變更時必須通知處理常式,所以他們可以連接至適當的編輯器實例。

public void setActiveEditor(IEditorPart editor) {	...
	handler2.setActiveEditor(editor);
	handler3.setActiveEditor(editor);
	...
}

完成編輯器方面的設定。當編輯器正開啟並在作用中時,處理常式(和他們的標籤)是利用將出現在工作台功能表列中的 ReadmeEditorActionBarContributor 所定義的。

工作台功能表列中的 Readme 項目以及三個編輯器動作

現在編輯器中有構成要素,視圖如何登錄為處理常式?除了動作 ID 是由外掛程式的編輯器所定義的之外,用戶端方面的程式碼近似於登錄工作台動作處理常式,。ReadmeContentOutlinePage 登錄這些動作的處理常式。

public void createControl(Composite parent) {
	super.createControl(parent);
	...
	getSite().getActionBars().setGlobalActionHandler(
		IReadmeConstants.RETARGET2, 
		new OutlineAction(MessageUtil.getString("Outline_Action2")));

	OutlineAction action = new OutlineAction(MessageUtil.getString("Outline_Action3"));
	action.setToolTipText(MessageUtil.getString("Readme_Outline_Action3")); 
	getSite().getActionBars().setGlobalActionHandler(
		IReadmeConstants.LABELRETARGET3, 
		action);
	...

請注意,摘要器設定工具要訣文字和第二動作的標籤,因為它讓您重新標籤。當 Readme 摘要視圖在作用中, 它的處理常式(和標籤)現在將出現在工作台功能表列中。

Readme 功能表以及一個重新命名的編輯器動作

請注意重新標籤的動作顯示新標籤。