平台文字組織架構會定義文字的文件模型, 以及提供一個使用這個模型來顯示文字的檢視器。我們將以查看 Java 編輯器範例,以及它如何使用這個模型作為開始。我們將不會著重於登錄編輯器延伸的基本機制, 因為我們已在討論 org.eclipse.ui.editors 的這一節中, 看到這個機制。相反地,我們將查看在範例中如何實作編輯器類別的細節。
在工作台中,通常當使用者選取一個網域元素(如檔案或儲存在保存檔內的元素)並開啟它時, 就會開啟編輯器。當建立編輯器時,它會與說明正要編輯之物件的編輯器輸入 (IEditorInput) 建立關聯性。
當使用者開啟副檔名為 "*.jav" 的檔案時,就會開啟 Java 編輯器範例就會開啟。在這種情況下,編輯器的輸入是 IFileEditorInput。 平台文字組織架構假設不甚瞭解編輯器輸入本身。 它會使用稱為 IDocument 的呈現模型作為輸入, 以便它可以有效率地顯示和操作文字。
這表示必須有一個從預期的網域模型(編輯器輸入)對映至呈現模型的方法。 這個對映定義在 IDocumentProvider中。如果有編輯器輸入,文件提供者便會傳回適當的 IDocument。
Java 編輯器範例繼承外掛程式 org.eclipse.ui.editors 所定義的 TextFileDocumentProvider。org.eclipse.ui.editors.documentProviders 延伸用來定義編輯器輸入類型(或副檔名)與文件提供者之間的對映。 編輯器外掛程式定義其文件提供者,如下所示:
<extension point="org.eclipse.ui.editors.documentProviders"> <provider class="org.eclipse.ui.editors.text.TextFileDocumentProvider" inputTypes="org.eclipse.ui.IStorageEditorInput" id="org.eclipse.ui.editors.text.StorageDocumentProvider"> </provider> </extension>
延伸點可讓外掛程式登錄文件提供者,以及建立它們與副檔名或編輯器輸入類別的關聯性。 既然 Java 編輯器範例未定義其本身的文件提供者延伸, 則它將繼承 IStorageEditorInput 的所有輸入類型指定的通用文件提供者。 當使用者開啟檔案進行編輯時,平台便會管理建立適當文件提供者實例的詳細資料。 如果副檔名登錄了特定的文件提供者,則會使用該文件提供者。如果副檔名沒有特定的文件提供者,將會使用編輯器輸入類型來尋找適當的提供者。
使用通用平台文件提供者,Java 編輯器範例可以利用文件提供者的所有特性,如檔案緩衝和其他最佳化功能。
既然 Java 編輯器使用平台文字文件提供者,它又是如何提供處理 Java 檔案的特殊行為呢?
org.eclipse.core.filebuffers.documentSetup 延伸用來定義副檔名與 IDocumentSetupParticipant 之間的對映。只要文件已提供給編輯器設定參與者將設定具有任何特定特性的文件。
<extension id="ExampleJavaDocumentSetupParticipant" name="%documentSetupParticipantName" point="org.eclipse.core.filebuffers.documentSetup"> <participant extensions="jav" class="org.eclipse.ui.examples.javaeditor.JavaDocumentSetupParticipant"> </participant> </extension>
這個延伸定義是提供機會讓範例設定 Java 特定作業的文件。JavaDocumentSetupParticipant 的作用為何?我們將探討簡化版本的 setup 方法。
public void setup(IDocument document) { ... IDocumentPartitioner partitioner= new FastPartitioner(JavaEditorExamplePlugin.getDefault().getJavaPartitionScanner(), JavaPartitionScanner.JAVA_PARTITION_TYPES); partitioner.connect(document); ... }
設定程式碼會配置名為分割器的物件。
分割器 (IDocumentPartitioner) 負責將文件分成數個非重疊的區域,稱為分割區。 如同語法強調顯示或格式化的特性一樣,分割區(以 ITypedRegion 呈現)有助於以不同方式處理不同的文件區段。
在 Java 編輯器範例的情況下,文件將分成數個分割區, 來代表 Javadoc 註解、多行註解,以及其他等等。每一個區域都有指定一個內容類型, 以及其在文件中的位置。當使用者編輯文字時,位置就會更新。
文件分割器的適當實作是由每一個編輯器自行決定。 org.eclipse.jface.text.rules 中提供規則型文件掃描的支援。 使用規則型掃描器可讓編輯器使用組織架構所提供的 FastPartitioner。
IDocumentPartitioner partitioner= new FastPartitioner(JavaEditorExamplePlugin.getDefault().getJavaPartitionScanner(), JavaPartitionScanner.JAVA_PARTITION_TYPES);
RuleBasedPartitionScanner是規則型掃描器的 Super 類別。子類別負責列舉和實作應該用來在掃描文件時區分如下記號的規則: 行定界字元、空格,以及通用型樣。範例的 JavaPartitionScanner 定義區分單行註解、字元常數、Javadoc、多行註解和字組的規則。這是在掃描器的建構子中進行:
public JavaPartitionScanner() { super(); IToken javaDoc= new Token(JAVA_DOC); IToken comment= new Token(JAVA_MULTILINE_COMMENT); List rules= new ArrayList(); // 新增單行註解的規則。 rules.add(new EndOfLineRule("//", Token.UNDEFINED)); // 新增字串和字元常數的規則。 rules.add(new SingleLineRule("\"", "\"", Token.UNDEFINED, '\\')); rules.add(new SingleLineRule("'", "'", Token.UNDEFINED, '\\')); // 新增特殊字體的字組規則。 rules.add(new WordPredicateRule(comment)); // 新增多行註解和 Javadoc 的規則。 rules.add(new MultiLineRule("/**", "*/", javaDoc, (char) 0, true)); rules.add(new MultiLineRule("/*", "*/", comment, (char) 0, true)); IPredicateRule[] result= new IPredicateRule[rules.size()]; rules.toArray(result); setPredicateRules(result); }
如果需要定義規則和可用的規則類型的詳細資料,請參閱 org.eclipse.jface.text.rules 中的類別。當我們查看語法著色時,將再次查看掃描器。