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