編輯器是工作台中可讓使用者編輯物件(通常是檔案)的部份。 編輯器運作的方式類似於檔案系統編輯工具,不過,它們緊密整合在平台工作台 UI 中。 編輯器永遠會關聯於一個輸入物件(IEditorInput)。 您可以將輸入物件想成編輯的文件或檔案。 編輯器所進行的變更必須在使用者加以儲存時才會確定。
工作台頁面中的任何特定編輯器輸入都只能開啟一個編輯器。 比方說,如果使用者在工作台中編輯 readme.txt,在相同視景中重新開啟它會啟動相同的編輯器。 (您可以從不同的工作台視窗或視景開啟另一個編輯器來處理相同的檔案)。 不過,這不像檢視畫面,在相同工作台頁面中,不同的輸入可以重複開啟相同的編輯器類型(如文字編輯器)。
外掛程式會利用工作台延伸點 org.eclipse.ui.editors 來新增編輯器到工作台中。 提供編輯器的外掛程式必須附隨編輯器的配置資訊,在其 plugin.xml 檔中登錄編輯器延伸項目。 部份編輯器資訊(如工作台功能表和標籤中所用的實作類別和名稱以及圖示)類似於檢視畫面資訊。 另外,編輯器延伸項目也會指定編輯器所瞭解之檔案類型的副檔名或檔案名稱型樣。 編輯器也可以定義 contributorClass,也就是在編輯器作用時,將動作新增到工作台功能表和工具列的類別。
編輯器的介面定義在 IEditorPart 中,但外掛程式可以選擇繼承 EditorPart 類別,而不重新實作 IEditorPart。
附註:編輯器延伸項目可配置為啟動外部程式或呼叫先前存在的 Java 程式碼。 在這個討論中,焦點要放在實際緊密整合在工作台中且是利用 IEditorPart 來實作的編輯器。
Readme 工具有一個自訂編輯器,主要用來將自己的內容概要畫面頁面提供到工作台概要檢視畫面。
編輯器延伸項目的配置定義如下。
<extension point = "org.eclipse.ui.editors"> <editor id = "org.eclipse.ui.examples.readmetool.ReadmeEditor" name="%Editors.ReadmeEditor" icon="icons/obj16/editor.gif" class="org.eclipse.ui.examples.readmetool.ReadmeEditor" extensions="readme" contributorClass="org.eclipse.ui.examples.readmetool.ReadmeEditorActionBarContributor"> </editor> </extension>
在 id、name、icon 和 class 上,我們見到類似的配置標記。 extensions 屬性說明編輯器瞭解的檔案類型。 (如果您需要更特定的檔案名稱,您也可以指定 filenames。)class 實作編輯器,而 contributorClass 負責提供編輯器相關的動作。讓我們更仔細的看一下 contributor。
contributor 類別會新增編輯器相關動作到工作台功能表和工具列中。 它必須實作 IEditorActionBarContributor 介面。 contributor 有別於編輯器本身,因為任何給定的工作台頁面都可以對相同類型的多個編輯器。 單一 contributor 特定類型的所有編輯器共用,而不是編輯器的每個實例建立動作和影像。
在 ReadmeEditorActionBarContributor 中,我們提供三個動作,"Editor Action1"、"Editor Action2" 和 "Editor Action3" 。 這些都是在建構子中設定的。
public ReadmeEditorActionBarContributor() { ... action1 = new EditorAction(MessageUtil.getString("Editor_Action1")); action1.setToolTipText(MessageUtil.getString("Readme_Editor_Action1")); action1.setDisabledImageDescriptor(ReadmeImages.EDITOR_ACTION1_IMAGE_DISABLE); action1.setImageDescriptor(ReadmeImages.EDITOR_ACTION1_IMAGE_ENABLE); ... 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); ... }
動作的名稱和圖示是設定在程式碼中,而不是在 plugin.xml 中。(現在我們會暫時忽略動作類別中的差異,直到看見 retargetable actions。)
請注意,這個資訊與我們在檢視畫面動作的標記中見到的 viewActions 資訊有多類似。 動作是設定在程式碼中,因為我們必須管理相同編輯器的不同實例之間的動作共用。 當動作被建立在建構子中,對任何編輯器的特定實例來說都是獨立的。
當編輯器成為作用中,且動作必須安裝在工作台功能表和工具列時,會將 setActiveEditor 訊息傳送給建構子。 建構子會將編輯器動作連接到特定編輯器上。
public void setActiveEditor(IEditorPart editor) { ... action1.setActiveEditor(editor); ... }
如您所能見到,當 Readme 編輯器在作用中,動作就會出現在工作台功能表和工具列中。
編輯器必須在作用中,才會顯示這些功能表和工具列項目。 功能表和工具列項目的位置可以依照功能表和工具列路徑中的說明來指定。
Readme 編輯器本身 ReadmeEditor 並不十分複雜。 它繼承 TextEditor 類別,因此,在編輯 Readme 檔時,它可以提供自訂內容概要畫面頁面到概要檢視畫面中。 它不會在文字編輯器中改變任何行為。
編輯器通常有對應的內容概要畫面,它提供編輯器內容的結構化檢視畫面並協助使用者導覽編輯器的內容。 請參閱內容概要畫面,以取得詳細資料。
我們將在文字編輯器和平台文字中查看文字編輯器的實作方式。