文件和分割區

平台文字組織架構會定義文字的文件模型, 以及提供一個使用這個模型來顯示文字的檢視器。我們將以查看 Java 編輯器範例,以及它如何使用這個模型作為開始。我們將不會著重於登錄編輯器延伸項目的基本機制, 因為我們已在討論 org.eclipse.ui.editors 的這一節中, 看到這個機制。相反地,我們將查看在範例中如何實作編輯器類別的細節。

文件提供者和文件

在工作台中,通常當使用者選取一個網域元素(如檔案或儲存在保存檔內的元素)並開啟它時, 就會開啟編輯器。當建立編輯器時,它會與說明正要編輯之物件的編輯器輸入 (IEditorInput) 建立關聯性。

當使用者開啟副檔名為 "*.jav" 的檔案時,就會開啟 Java 編輯器範例就會開啟。在這種情況中,編輯器的輸入是 IFileEditorInput。 平台文字組織架構假設不甚瞭解編輯器輸入本身。 它會使用稱為 IDocument 的呈現模型作為輸入, 以便它可以有效率地顯示和操作文字。

這表示必須有一個從預期的網域模型(編輯器輸入)對映至呈現模型的方法。 這個對映定義在 IDocumentProvider 中。 如果有編輯器輸入,文件提供者便會傳回適當的 IDocument

Java 編輯器範例會定義一個用以傳回適當文件的 JavaDocumentProvider。 如何在適當的文件提供者與 "*.jav" 副檔名之間建立關係?它是在 org.eclipse.ui.documentProviders 延伸項目中進行。這個延伸項目是用來定義檔案類型與文件提供者之間的對映。 範例定義它的文件提供者,如下所示:

<extension
      point="org.eclipse.ui.documentProviders">
<provider 
         extensions="jav"
         class="org.eclipse.ui.examples.javaeditor.JavaDocumentProvider"
         id="org.eclipse.ui.examples.javaeditor.JavaDocumentProvider">
   </provider>
</extension>

當使用者開啟一個具有指定之副檔名的檔案時, 工作台便會管理建立文件提供者實例的詳細資料。 工作台僅會建立一次文件提供者實例,然後在不同編輯器之間共用這個實例。

您的外掛程式不一定要使用這個延伸點,來登錄它的文件提供者。 另一種建立文件提供者與編輯器的關聯性的方法就是讓您的外掛程式本身管理文件提供者。 這通常是在您的外掛程式類別中進行。 當您設定輸入元素並放入編輯器中時, 編輯器會要求它的外掛程式類別提供適當的文件提供者。 外掛程式可以管理如何建立和參照文件提供者。 當文件提供者附有一個特殊的起始設定或其他處理程序時, 可能更適合採用這種技術。如需範例,請參閱 JDT 工具開發中的 ClassFileEditor。 

一旦適當的文件提供者與編輯器建立關聯性,它的主要作業就是從編輯器輸入來建立文件, 並且配置將文件分成數個分割區的適當物件。  

分割區

讓我們查看 JavaDocumentProvider 中的文件和分割區。 當建立文件時,就會建立並設定 IDocumentPartitioner, 然後放入文件中。  

protected IDocument createDocument(Object element) throws CoreException {
	IDocument document= super.createDocument(element);
	if (document != null) {
		IDocumentPartitioner partitioner= createJavaPartitioner();
		document.setDocumentPartitioner(partitioner);
		partitioner.connect(document);
	}
	return document;
}

分割器負責將文件分成數個非重疊的區域,稱之為分割區。 就如語法強調顯示或格式化的功能而言,分割區(以 ITypedRegion 呈現) 有助於以不同方式處理不同的文件區段。

在 Java 編輯器範例的情況中,文件將分成數個分割區, 來代表 Javadoc 註解、多行註解,以及其他等等。每一個區域都有指定一個內容類型, 以及其在文件中的位置。當使用者編輯文字時,位置就會更新。   

規則型文件分割

文件分割器的適當實作方式是由每一個編輯器自行決定。 org.eclipse.jface.text.rules 中提供規則型文件掃描的支援。使用規則型掃描器可讓編輯器使用組織架構所提供的 DefaultPartitioner

private IDocumentPartitioner createJavaPartitioner() {
	return new DefaultPartitioner(getJavaPartitionScanner(), TYPES);
}

RuleBasedPartitionScanner 是規則型掃描器的超類別。子類別負責列舉和實作應該用來在掃描文件時區分如下記號的規則: 字行定界符號、空格,以及通用型樣。範例的 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 中的類別。當我們查看語法著色時,將再次查看掃描器。

附註模型

除了提供適當的文件作為編輯器輸入之外,文件提供者另一項重要作業就是提供要與編輯器輸入一起使用的適當 IAnnotationModel。 這個模型是用來管理已附加至文件的附註。 藉由讓文件提供者提供模型,您的編輯器可以使用適合於內容類型的模型。 在下一節中,我們將查看附註,以及它們如何更緊密地呈現。

Copyright IBM Corporation and others 2000, 2003.