AbstractTextEditor是Eclipse中文字編輯器的基類,了類化它,實現對應的抽象方法就能得到具有一般文字編輯器功能的文字編輯器,但是它遠不止於此。
先看看它都實現了什麼介面,下面是申明部分的原始碼:
public abstract class AbstractTextEditor extends EditorPart implements ITextEditor, IReusableEditor, ITextEditorExtension, ITextEditorExtension2, ITextEditorExtension3, ITextEditorExtension4, ITextEditorExtension5, INavigationLocationProvider, ISaveablesSource, IPersistableEditor 
哇,好長啊,一個一個看吧。
ITextEditor
 ITextEditor定義了編輯器的一般介面,包括開啟儲存,選擇、高亮文字等。
 
IReusableEditor
這個介面是用於編輯器響應輸入發生變化的,舉個例子,你在編輯一個Java檔案,但中途又用其它編輯器把這個檔案的內容更改並儲存了,這時你的編輯器裡的檔案就和檔案系統中的不一樣了,一般的編輯器不會有反應。但在Eclipse裡這種變化可以通過檔案系統監聽器通知IReusableEditor,進而進行處理。
 
ITextEditorExtension
主要提供尺規操作功能表管理。
 
ITextEditorExtension2
查詢文字編輯器狀態,是否可編輯,是否有效。
 
ITextEditorExtension3
插入模式及覆蓋模式的狀態管理,以及Smart Insert功能狀態。
 
ITextEditorExtension4
提供注釋間的快速跳轉
 
ITextEditorExtension5
塊選擇支援狀態管理
 
INavigationLocationProvider、
提供導航功能,即可以記住編輯器經過的位置(在工具列上用向前,向後閱讀代碼的功能)
 
ISaveablesSource
管理可儲存的源(檔案或URL或其它)
 
IPersistableEditor
表示該編輯器可以儲存狀態,以至於下一次開啟可以恢複關閉時的狀態。
 
Eclipse為了使編輯器(不一定是文字編輯器)適用於多種輸入(例如檔案,FTP,HTTP,資料庫……),將輸入抽象為IEditorInput
 
其具體的資源類型可以實現不同的IEditorInput,這樣就能使同一個編輯器編輯不同類型的資源。IEditorInput並不含有資源的內容,而僅僅是對資源的一種描述,當調用AbstractTextEditor中setInput()設定Input時,編輯器要先用這個所謂的Input建立一個DocumentProvider
DocumentProvider負責具體的資源載入和儲存。
 
當一個資源被載入之後(或者建立了一個文檔,記憶體中實際是由一個IDocument對象來表示文檔的)
 
IDocuent提供了很多方便訪問文檔的方法,看起來似乎都是基於文本的,但是我們知道如果沒有特殊限制,二進位檔案也可以轉換為文本進行處理。
 
有了上面的知識,現在可以具體分析一下TextEditor是怎麼工作的了。
Step1 編輯器建立時需要指定一個Input(這裡我覺得可以譯為位置),如果沒有,則編輯器自動關閉,也就是說Eclipse的編輯器是不允許開啟沒有位置的檔案,注意,並不是要求檔案存在,而是要有位置。
Step2 編輯器用這個Input建立對應的DocumentProvider,調用DocumentProvider的connect等方法使之與資源相關,然後調用DocumentProvider的getDocument方法得到一個編輯器可以操作的Document。
Step3 編輯器從此一直操作Document,直到響應使用者儲存或者關閉檔案,此時調用DocumentProvider的saveDocument方法儲存檔案。
 
AbstractTextEditor中的操作
編輯器中的操作在初始化編輯器時由setAction添加,添加的Action就能在編輯器初始化後使用,比如我們常用的Ctrl+C。
 
其它
AbstractTextEditor中還有其它功能,比如判斷是否可儲存等。可以參考原始碼。
 
在下一篇中,我將研究一下JDT或CDT中和具體語言相關的編輯器的原始碼。