以下內容都是通過閱讀《The Definitive Guide to SWT and JFace》寫的。只涉及到語法著色部分,還有內容自動完成,編輯器的Vertical Ruler等內容這里不介紹,Eclipse的插件開發幫助里面介紹的很詳細。
TextViewer的輸入叫Document, TextViewer在顯示文檔之前,將對其分割(Partition)成各種類型的區塊(Region),每個區塊將具有以下屬性:區塊所使用的字體,字體風格(粗體、斜體、帶下劃線等等)、區塊所在的位置、區塊的內容是數字還是括號,區塊上下的空格數等,不過TextViewer卻無法對不同的區塊使用不同的字體大小(這是因為TextViewer的底層是StyleText控件的緣故,一個文檔只能使用一種字體大小)
與一般的文字處理器不同,TextViewer沒法直接定義各個區塊(而文字處理器則可以選中的文字指定為區塊從而給其指定各種屬性),它是根據內部定義的規則隱式的將文檔分割成不同的區塊。比如Java Editor,當我們把一段注釋添加到文檔中之后,編輯器就能將其判斷成注釋區塊,編輯器能做出這種判斷就是基于其內部指定的分割規則。在TextViewer中由IDocumentPartitioner 來負責對Document進行解析和分割,一個IDocumentPartitioner 將跟一個Document關聯起來,其默認實現是DefaultPartitioner,不同類型的文檔需要使用不同的分割規則,顯然DefaultPartitioner 無法滿足要求,這就需要我們對DefaultPartitioner 的行為進行定制,不過我們一般不這樣做,而是通過使用一種所謂的分割掃描器和分割類型來構造DefaultPartitioner 從而達到定制的目的。經過分割掃描器分割后得到的僅僅只是一個很原始的區塊,它將是實現語法高亮這樣的功能的基礎。
Token和分割后得到的各種類型的區塊相關聯,但是它本身并不包含文本內容,也不具有區塊的位置信息,而對于不同類型區塊在顯示的時候將使用何種顏色這種信息則由Token來提供,從而在整個文檔中Token能被重用。
IPartitionTokenScanner 也是一種分割掃描器,當文檔被修改時,DefaultPartitioner 將使用自帶的IPartitionTokenScanner實現去掃描指定的文檔區域來得到相關的Token和Partition信息
一般我們都通過繼承RuleBasedPartitionScanner 來實現自己的分割掃描器,通過給掃描器添加各種Rule就可以控制掃描器的分割行為,而每一種分割類型都會有對應的一個Rule, JFace提供了多種Rule,在創建一個rule實例時,需要指定該rule使用的token,對應的字符序列特征,在掃描的時候,當rule找到匹配的文檔的時候, 將使用該rule所附帶的token對匹配文字進行標識。
要對文檔進行分割,需要先創建一個分割掃描器,然后再將分割掃描器作為參數創建文檔分割器,接著將文檔的分割器設置為前面創建的文檔分割器(此時將對文檔進行分割操作),最后將分割器與文檔關聯。
經過分割后的文檔將提供豐富的描述信息,不過為了將模型和視圖分離,分割后得到的所有區塊并不附帶視圖信息,為了告訴TextViewer如何顯示分割后的文檔,必須通過給TextViewer指定SourceViewerConfiguration ,而且必須在給TextViewer指定Document之前做這件事。
TextViewer的一個重要功能就是語法著色,要實現這個功能需要三個條件:一個就是表現協調器(Reconciler);一個是與需要著色的分割類型關聯的破壞器(Damager)和修復器(Repairer);還有一個就是需要著色的分割類型關聯的規則掃描器(RuleBasedScanner,不是分割掃描器)。破壞器用來響應文檔的修改,修復器則對改動文檔的顯示進行調整,因此破壞器和修復器成對出現并與一個表現協調器關聯,而協調器可以和多個破壞修復器關聯,而每一組破壞修復器都和一個分割類型相關聯,破壞修復器只會在他們配置類型的分割區發生變化起作用,破壞修復器包含一個掃描器,它被用來掃描所有相應類型的分區,掃描器中包含的規則將被修復器用來對文本進行著色。
Reconciler,Damager/Repairer, RuleBasedScanner三者之間的關系:給Reconciler設置Damager和Requirer并指定分割類型,當然還要給破壞修復器設置Scanner,而Scanner中也包含一些類,分別是TextAttribute(用來設置著色文本的前景色,背景色以及字體信息),Token(包含一系列TextAttribute),Rule又包含Token和相關字符序列信息,為了將Reconciler與TextViewer關聯起來,必須從TextViewer所配置的SourceViewerConfiguration 中來取得Reconciler.
安徽新華電腦學校專業職業規劃師為你提供更多幫助【在線咨詢】