在平台文字組織架構中,使用損壞、修護和調解的模型來提供語法著色。 對於每一個套用至文件的變更,呈現調解器會判定應該作廢哪一個區域的視覺化呈現, 以及如何修復它。文件中的不同內容類型可以使用不同策略。
實作語法著色(做法是使用呈現調解器)是選用的。依預設,SourceViewerConfiguration 不會安裝呈現調解器,因為它不知道特殊編輯器所用的文件模型,而且語法強調顯示沒有通用的行為。
為了能夠使用調解類別來實作語法強調顯示,您必須配置編輯器的程式檔檢視器配置, 才能定義呈現調解器。我們再次從 JavaSourceViewerConfiguration 開始, 以查看如何為編輯器定義呈現調解器。
public IPresentationReconciler getPresentationReconciler(ISourceViewer sourceViewer) { PresentationReconciler reconciler= new PresentationReconciler(); ... return reconciler; }
如果要瞭解呈現調解器的作用,首先我們必須查看損壞、修復和調解的概念。
當使用者修改編輯器中的文字時,編輯器的某些部分必須重新顯示,才能顯示變更。 計算必須重新顯示的文字稱為計算損壞。當包括語法著色時, 編輯作業所導致的損壞數量將變得更密集,因為單一字元的出現或不見都可能變更圍繞它的文字著色。
損壞器 (IPresentationDamager) 會判定文件的哪一個呈現區域因為文件變更而必須重建。 假設呈現損壞器為特殊文件內容類型(或區域)所特有的。 它必須能夠傳回一個損壞區域,而且這個區域必須是呈現修護器 (IPresentationRepairer) 的有效輸入。 修護器必須能夠從損壞區域衍生它所需的全部資訊,以便可以順利地說明特殊內容類型所需的修護。
調解說明當在編輯器中進行變更時,維護文件呈現方式的整體程序。 呈現調解器 (IPresentationReconciler) 會透過其相關聯的檢視器來監視文字的變更。它會使用文件的區域來判定受到變更影響的內容類型, 並且通知適合於受影響之內容類型的損壞器。一旦算出損壞, 它將傳遞至將建構修復說明的適當修護器,這些說明會套用至檢視器, 以便將它放回與基礎內容同步的狀態。
org.eclipse.jface.text.reconciler 中的類別會定義其他支援類別,來同步處理文件模型與文件的外部操作。
對於每一個在文件中找到的內容類型,應該提供呈現調解器, 以及修護器和損壞器配對。呈現調解器的適當實作是由每一個編輯器自行決定。然而,平台會在org.eclipse.jface.text.rules 中提供使用規則型文件掃描器來計算和修護損壞的支援。預設損壞器和修護器定義在這個套件中。它們可以在 org.eclipse.jface.text.presentation 與標準調解器一起使用,藉由定義文件的掃描規則來實作語法著色。
現在我們具有足夠的背景,來仔細查看如何建立範例呈現調解器。 回想 Java 編輯器範例如何實作 JavaPartitionScanner, 其將文件分成數個代表 Javadoc、多行註解和其他等等的內容類型。
對於這些內容類型的每一個,必須指定損壞器/修護器配對。 底下的做法是使用 PresentationReconciler 和 DefaultDamagerRepairer。
JavaColorProvider provider= JavaEditorEnvironment.getJavaColorProvider(); PresentationReconciler reconciler= new PresentationReconciler(); DefaultDamagerRepairer dr= new DefaultDamagerRepairer(JavaEditorEnvironment.getJavaCodeScanner()); reconciler.setDamager(dr, IDocument.DEFAULT_CONTENT_TYPE); reconciler.setRepairer(dr, IDocument.DEFAULT_CONTENT_TYPE); dr= new DefaultDamagerRepairer(new SingleTokenScanner(new TextAttribute(provider.getColor(JavaColorProvider.JAVADOC_DEFAULT)))); reconciler.setDamager(dr, JavaPartitionScanner.JAVA_DOC); reconciler.setRepairer(dr, JavaPartitionScanner.JAVA_DOC); dr= new DefaultDamagerRepairer(new SingleTokenScanner(new TextAttribute(provider.getColor(JavaColorProvider.MULTI_LINE_COMMENT)))); reconciler.setDamager(dr, JavaPartitionScanner.JAVA_MULTILINE_COMMENT); reconciler.setRepairer(dr, JavaPartitionScanner.JAVA_MULTILINE_COMMENT); return reconciler;
請注意,範例會提供每一個內容類型的掃描器。
預設內容類型是以 JavaCodeScanner 設定,以便可以偵測到關鍵字並著色。 JavaCodeScanner 建置用以偵測不同種類之記號的規則, 如單行註解、空格和字組。它說明應該對不同記號類型的字組使用的顏色。
其他內容類型是以 SingleTokenScanner 設定,並給與要對這些內容類型中的記號使用的顏色。
根據掃描規則損壞和修護適當部分文件的所有詳細資料是由 DefaultDamagerRepairer 處理。 外掛程式碼通常不需要瞭解這些詳細資料。您的外掛程式應該著重於建置一組適合於分割及掃描其編輯器內容的規則。
Java 編輯器範例提供一個 SourceViewerConfiguration 子類別,來安裝先前看過的呈現調解器。您也可以使用 IPresentationReconciler 通訊協定,以動態方式將呈現調解器安裝在文字檢視器上。以任一種方法執行它, 並沒有任何特殊執行時期好處,但是將所有可外掛的行為置換放在 SourceViewerConfiguration 子類別,將提供在一個地方合併所有行為置換的優點。 當不同的呈現調解器在編輯器使用期間附加至檢視器時,動態通訊協定可能很有用。