好男人天堂网,久久精品国产这里是免费,国产精品成人一区二区,男人天堂网2021,男人的天堂在线观看,丁香六月综合激情

當(dāng)前位置:首頁(yè) > 網(wǎng)站舊欄目 > 學(xué)習(xí)園地 > 設(shè)計(jì)軟件教程 > JFace Text Editor完全掌握之終極指南(1)

JFace Text Editor完全掌握之終極指南(1)
2010-01-14 23:07:34  作者:  來(lái)源:

JFace Text Editor是JFace里面一個(gè)功能強(qiáng)大,結(jié)構(gòu)復(fù)雜而且非常重要的組件,要掌握它還需要花不少的功夫,下面我們將通過(guò)"Building an Eclipse Text Editor with JFace Text"的翻譯來(lái)掌握它的用法
提到Text Editor,就不得不提到與之密切相關(guān)的SourceViewerConfiguration類,Text Editor的許多功能都是通過(guò)該類配置上去的,還有一個(gè)是IDocumentProvider接口,Text Editor所要編輯的文件對(duì)象就是通過(guò)該接口提供的.

Editor編輯的內(nèi)容封裝在IDocument這個(gè)類中,對(duì)于編輯內(nèi)容的遍歷,定位都是在IDocument的基礎(chǔ)上來(lái)實(shí)現(xiàn)的,而文檔的分割信息以及其他的元數(shù)據(jù)信息(比如高亮區(qū)域)則由Editor來(lái)保存,Document中的定位信息將使用一個(gè)Position類來(lái)加以封裝.

雖然IDocument有不同的實(shí)現(xiàn),但是他們都一個(gè)共同點(diǎn),那就是這些內(nèi)容都是可分割的,即能被分割成一塊一塊的互不重疊的文本塊.分割(Partition)在Text Editor中是一個(gè)非常非常重要的概念,基本上Text Editor的所有功能都是建立在文檔分割的基礎(chǔ)上的.

IDocument接口并不關(guān)心文本內(nèi)容的存儲(chǔ)和加載,它的工作就是初始化一個(gè)文檔對(duì)象實(shí)例,而文檔的各種屬性的初始化則交給IDocumentProvider來(lái)完成.

在打開(kāi)一個(gè)文檔的時(shí)候編輯器將同時(shí)進(jìn)行文檔的分割處理,其結(jié)果是得到各種不同類型的互不重疊文本塊

下面我們來(lái)講講分割器,分割器的設(shè)置是在IDocumentProvider的createDocument()方法中實(shí)現(xiàn)的,如下代碼所示:

java 代碼
 
  1. protected IDocument createDocument(Object element) throws CoreException   
  2. {   
  3.     IDocument document = super.createDocument(element);   
  4.     if (document != null)   
  5.     {   
  6.         IDocumentPartitioner partitioner = new XMLPartitioner(   
  7.         new XMLPartitionScanner(), new String[]                               
  8.           {   
  9.                   XMLPartitionScanner.XML_TAG, XMLPartitionScanner.XML_COMMENT   
  10.           });   
  11.         partitioner.connect(document);   
  12.         document.setDocumentPartitioner(partitioner);   
  13.     }   
  14.     return document;   
  15. }  

 

從上面的代碼我們可以看到,初始化一個(gè)IDocumentPartitioner我們需要兩個(gè)參數(shù),一個(gè)是必須指定一個(gè)IPartitionTokenScanner實(shí)例,另一個(gè)是所支持的內(nèi)容類型(content type)數(shù)組.

與分割相關(guān)的還有三個(gè)概念:Scanner, Token和Rule, Scanner的任務(wù)就是將當(dāng)前編輯的文檔對(duì)象進(jìn)行掃描并得到每一個(gè)文本塊所對(duì)應(yīng)的Token,對(duì)于Token需要解釋一下,它是IToken的一個(gè)實(shí)現(xiàn),被視為內(nèi)容類型的唯一標(biāo)識(shí)符.比如一個(gè)Token可能表示的是某種語(yǔ)言中的關(guān)鍵字,xml元素名,空格等.

通過(guò)下面的代碼來(lái)說(shuō)明Scanner是如何來(lái)查找各個(gè)Token的.

java 代碼
 
  1. public class XMLPartitionScanner extends RuleBasedPartitionScanner   
  2. {   
  3.     public final static String XML_DEFAULT = "__xml_default";   
  4.     public final static String XML_COMMENT = "__xml_comment";   
  5.     public final static String XML_TAG = "__xml_tag";   
  6.   
  7.     public XMLPartitionScanner()   
  8.     {   
  9.   
  10.         IToken xmlComment = new Token(XML_COMMENT);   
  11.         IToken tag = new Token(XML_TAG);   
  12.   
  13.         IPredicateRule[] rules = new IPredicateRule[2];   
  14.   
  15.         rules[0] = new MultiLineRule("", xmlComment);   
  16.         rules[1] = new TagRule(tag);   
  17.   
  18.         setPredicateRules(rules);   
  19.     }   
  20. }   
  21.   

 

在一個(gè)編輯器中每一種內(nèi)容類型(content type)都表示為一個(gè)字符串常量.在上面的代碼中,定義了三個(gè)內(nèi)容類型:默認(rèn),xml標(biāo)簽和xml注釋.為了簡(jiǎn)化,這里我們沒(méi)有對(duì)xml中的節(jié)點(diǎn)文本內(nèi)容以及xml指令定義類型, 在XMLPartitionScanner中,每一個(gè)內(nèi)容類型都和一個(gè)IToken實(shí)例相關(guān)聯(lián)的,而IToken實(shí)例非常簡(jiǎn)單,僅僅只是一個(gè)內(nèi)容類型標(biāo)識(shí)符,用來(lái)在XMLPartitionScanner對(duì)文檔進(jìn)行掃描的時(shí)候,對(duì)各種Token進(jìn)行識(shí)別, 由于我們的Scanner是繼承RuleBasedPartitionScanner的,因此它的Token將與一系列規(guī)則對(duì)應(yīng),而分割器通過(guò)這些規(guī)則來(lái)將文檔分割成所需要的結(jié)構(gòu),在XMLPartitionScanner中,我們使用了兩條規(guī)則來(lái)將內(nèi)容類型進(jìn)行配置:一個(gè)是MultiLineRule,對(duì)應(yīng)注釋內(nèi)容類型,一個(gè)是TagRule對(duì)應(yīng)xml標(biāo)簽類型,在根據(jù)內(nèi)容類型進(jìn)行分割時(shí),當(dāng)找到一個(gè)匹配的分割片段之后將返回一個(gè)唯一的Token,這樣就在內(nèi)容類型,Rule 以及Token之間做到了一一對(duì)應(yīng).

使用一個(gè)基于規(guī)則的Scanner對(duì)文檔進(jìn)行分割的工作原理如下:

  • 1.在RuleBasedPartitionScanner構(gòu)造器中配置一些規(guī)則   
  • 2.分割時(shí)調(diào)用Rule的evaluate()方法   
  • 3.在evaluate方法中根據(jù)配置的各種規(guī)則實(shí)現(xiàn)類將對(duì)得到的一段字符串片段進(jìn)行匹配,比如用于查找XML注釋的MultiLineRule只去匹配那些以注釋開(kāi)始并以注釋結(jié)尾 結(jié)束的字符片段,這種匹配只有兩種結(jié)果:成功或失敗,還是拿匹配注釋的MultiLineRule來(lái)說(shuō),如果匹配的字符串片段為"一般節(jié)點(diǎn)"那么它會(huì)馬上返回,因?yàn)槠ヅ涞淖址皇且宰⑨岄_(kāi)頭開(kāi)始的,如果匹配失敗,掃描器將重新定位到匹配字符串的起始位置,并返回Token.UNDEFINED,接著調(diào)用下一個(gè)rule的evaluate()方法進(jìn)行匹配處理,如果找到則返回匹配的Token,而且Scanner將去獲取當(dāng)前字符串在整個(gè)文檔中的位置以及長(zhǎng)度,并使用TypedPosition類將這些信息與其內(nèi)容類型加以封裝保存到IDocument實(shí)例中.

    IDocumentPartitioner通過(guò)computePartitioning()方法將得到文檔的分割信息,當(dāng)然了,在得到分割信息之前,必須要將文檔對(duì)象與IDocumentPartitioner實(shí)例關(guān)聯(lián)起來(lái),這個(gè)是通過(guò)IDocumentPartitioner.connect(document)來(lái)實(shí)現(xiàn)的.

    當(dāng)使用規(guī)則對(duì)文檔進(jìn)行分割,可能主要的工作就是去定義IPredicateRule的各種實(shí)現(xiàn)類,該接口的實(shí)現(xiàn)包括MultiLineRule, SingleLineRule 和 PatternRule等,理解該接口的難點(diǎn)在于如何配置這些規(guī)則,有時(shí)候,我們可能需要提供自己的IPredicateRule實(shí)現(xiàn)類

    除了自定義規(guī)則之外,我們也可以提供自己的ITokenScanner實(shí)現(xiàn).比如在JDT中,就實(shí)現(xiàn)了自己的ITokenScanner類FastJavaPartitionScanner,顯然這個(gè)工作是巨大的,一般我們不這樣做,除非有必要.

    對(duì)文檔進(jìn)行分割之后,接下來(lái)將要介紹如何顯示,Text Editor的底層采用StyledText控件來(lái)顯示編輯的文本內(nèi)容, ITextViewer提供了一套API來(lái)封裝StyledText處理IDocument模型的細(xì)節(jié),這樣Text Editor的使用者就不用再與底層的StyledText打交道了.

    ITextViewer除了對(duì)StyledText進(jìn)行封裝之外還提供了其他如Undo Management這樣的功能,要了解更多細(xì)節(jié)可以去看看JavaDoc文檔.

    為了更容易的創(chuàng)建一個(gè)結(jié)構(gòu)化文檔編輯器,Eclipse在ITextViewer的基礎(chǔ)上又提供了一個(gè)ISourceViewer接口,它包括的功能更強(qiáng)大,比如錯(cuò)誤標(biāo)記, 語(yǔ)法高亮等,下面我們將一一進(jìn)行介紹

    JFace Text Editor通過(guò)SourceViewerConfiguration類來(lái)對(duì)Source Viewer進(jìn)行配置,我們需要做的就是繼承SourceViewerConfiguration類來(lái)對(duì)SourceViewer進(jìn)行定制,SourceViewer的很多功能比如文本格式化,語(yǔ)法高亮,雙擊選擇,自動(dòng)提示等等都是通過(guò)對(duì)SourceViewerConfiguration配置來(lái)實(shí)現(xiàn)的,足見(jiàn)其重要性不容忽視.

    下面將通過(guò)在一個(gè)增強(qiáng)版的XML編輯器來(lái)實(shí)戰(zhàn)Text Editor的用法

    Eclipse插件開(kāi)發(fā)套件提供一個(gè)向?qū)?lái)幫助用戶創(chuàng)建一個(gè)簡(jiǎn)單的XML Editor,下面我們將在該編輯器的基礎(chǔ)上來(lái)進(jìn)行擴(kuò)展

    該XML編輯器將實(shí)現(xiàn)下面五個(gè)功能:語(yǔ)法高亮(Syntax hightlighting),錯(cuò)誤標(biāo)識(shí)(Error marker),格式化(Formating),內(nèi)容輔助(Content Assistance), 內(nèi)容大綱(Content Outline)

    進(jìn)行擴(kuò)展的第一步就是增加新的分割模型,我們?cè)黾恿讼旅嫒齻(gè)分割的內(nèi)容類型:XML文本, CData內(nèi)容, XML處理指令.

    為了在我們的XMLPartionScanner中處理指令類型定義, 先:

    java 代碼
     
    1. public final static String XML_PI = "__xml_pi";   

     

    然后注冊(cè)到分割器中,這個(gè)是在構(gòu)造IDocumentPartitioner實(shí)例時(shí)作為參數(shù)傳遞進(jìn)去的:
     

    java 代碼
     
    1. protected IDocument createDocument(Object element) throws CoreException   
    2. {   
    3.     IDocument document = super.createDocument(element);   
    4.     if (document != null)   
    5.     {   
    6.         IDocumentPartitioner partitioner = new XMLPartitioner(   
    7.          new XMLPartitionScanner(), new String[]   
    8.         {   
    9.                 XMLPartitionScanner.XML_START_TAG,   
    10.                 XMLPartitionScanner.XML_PI,   
    11.                 XMLPartitionScanner.XML_DOCTYPE,   
    12.                 XMLPartitionScanner.XML_END_TAG,   
    13.                 XMLPartitionScanner.XML_TEXT,   
    14.                 XMLPartitionScanner.XML_CDATA,   
    15.                 XMLPartitionScanner.XML_COMMENT   
    16.         });   
    17.         partitioner.connect(document);   
    18.         document.setDocumentPartitioner(partitioner);   
    19.     }   
    20.     return document;   
    21. }   

     

    接下來(lái)是創(chuàng)建用于標(biāo)識(shí)不同類型內(nèi)容的Token和Rule,由于我們使用的是基于規(guī)則的Scaner(RuleBasedPartitionScanner),因此我們需要添加一對(duì)Token和Rule,這樣才能讓我們的IPartitionTokenScanner實(shí)例能感知我們定義的內(nèi)容類型

    根據(jù)XML定義規(guī)范,XML指令必須以結(jié)束,因此我們將這樣來(lái)定義我們的Token和Rule:

    java 代碼
     
    1. public XMLPartitionScanner()   
    2. {   
    3.   
    4.     IToken xmlComment = new Token(XML_COMMENT);   
    5.     IToken xmlPI = new Token(XML_PI);   
    6.     IToken startTag = new Token(XML_START_TAG);   
    7.     IToken endTag = new Token(XML_END_TAG);   
    8.     IToken docType = new Token(XML_DOCTYPE);   
    9.     IToken text = new Token(XML_TEXT);   
    10.   
    11.     IPredicateRule[] rules = new IPredicateRule[7];   
    12.   
    13.     rules[0] = new NonMatchingRule();   
    14.     rules[1] = new MultiLineRule("", xmlComment);   
    15.     rules[2] = new MultiLineRule(""?>", xmlPI);   
    16.     rules[3] = new MultiLineRule("">", endTag);   
    17.     rules[4] = new StartTagRule(startTag);   
    18.     rules[5] = new MultiLineRule("">", docType);   
    19.     rules[6] = new XMLTextPredicateRule(text);   
    20.   
    21.     setPredicateRules(rules);   
    22. }   
    23.   

     

    為了讓SourceViewerConfiguration能知道我們添加的新的內(nèi)容類型,我們還需要重載getConfiguredContentTypes方法:
     

    java 代碼
     
    1. public String[] getConfiguredContentTypes(ISourceViewer sourceViewer)   
    2. {   
    3.     return new String[]   
    4.     {   
    5.             IDocument.DEFAULT_CONTENT_TYPE,   
    6.             XMLPartitionScanner.XML_COMMENT,   
    7.             XMLPartitionScanner.XML_PI,   
    8.             XMLPartitionScanner.XML_DOCTYPE,   
    9.             XMLPartitionScanner.XML_START_TAG,   
    10.             XMLPartitionScanner.XML_END_TAG,   
    11.             XMLPartitionScanner.XML_TEXT   
    12.     };   
    13. }  

安徽新華電腦學(xué)校專業(yè)職業(yè)規(guī)劃師為你提供更多幫助【在線咨詢
欧美一级视频免费| 国产精品自拍在线| 午夜欧美成人久久久久久| 四虎影视库| 国产91素人搭讪系列天堂| 中文字幕97| 一本高清在线| 免费毛片播放| 97视频免费在线| 免费一级片在线| 国产一区二区精品| 天天色成人| 九九精品在线播放| 日本乱中文字幕系列 | 久久精品人人做人人爽97| 日本乱中文字幕系列 | 97视频免费在线| 国产91视频网| 久久国产精品只做精品| 亚洲第一页色| 99久久精品国产麻豆| 国产一区国产二区国产三区| 国产一区国产二区国产三区| 国产极品白嫩美女在线观看看| 午夜欧美成人久久久久久| 欧美大片一区| 日韩综合| 欧美激情影院| 成人免费观看网欧美片| 欧美激情一区二区三区在线 | 日本伦理片网站| 午夜家庭影院| 国产一区精品| 日韩中文字幕在线播放| 深夜做爰性大片中文| 台湾毛片| 亚洲精品影院| 99久久精品国产高清一区二区| 亚欧乱色一区二区三区| 中文字幕一区二区三区精彩视频| 日韩专区在线播放| 国产亚洲精品成人a在线| 黄色免费三级| 日日夜夜婷婷| 沈樵在线观看福利| 欧美国产日韩久久久| 久久国产精品自由自在| 黄视频网站在线看| 久久精品成人一区二区三区| 国产伦久视频免费观看 视频| a级毛片免费观看网站| 国产成人欧美一区二区三区的| 精品久久久久久免费影院| 亚洲爆爽| 国产网站免费观看| 欧美日本韩国| 国产成人啪精品| 91麻豆精品国产片在线观看| 亚洲 欧美 91| 欧美爱色| 欧美18性精品| 黄视频网站在线看| 精品视频一区二区三区免费| 99久久视频| 国产一区二区高清视频| 亚洲天堂免费| 日韩一级黄色| 国产不卡在线看| 韩国三级香港三级日本三级la| 国产一区二区精品在线观看| 日韩欧美一及在线播放| 日韩在线观看免费完整版视频| 国产伦精品一区二区三区在线观看| 国产伦精品一区三区视频| 台湾毛片| 日韩中文字幕在线亚洲一区| 四虎精品在线观看| a级毛片免费全部播放| 99色播| 沈樵在线观看福利| 毛片成人永久免费视频| 韩国三级一区| 欧美夜夜骑 青草视频在线观看完整版 久久精品99无色码中文字幕 欧美日韩一区二区在线观看视频 欧美中文字幕在线视频 www.99精品 香蕉视频久久 | 久久精品人人做人人爽97| 一级毛片视频在线观看| 九九九网站| 欧美爱爱网| 欧美夜夜骑 青草视频在线观看完整版 久久精品99无色码中文字幕 欧美日韩一区二区在线观看视频 欧美中文字幕在线视频 www.99精品 香蕉视频久久 | 欧美夜夜骑 青草视频在线观看完整版 久久精品99无色码中文字幕 欧美日韩一区二区在线观看视频 欧美中文字幕在线视频 www.99精品 香蕉视频久久 | 日本伦理片网站| 欧美国产日韩久久久| 欧美激情一区二区三区视频高清| 91麻豆精品国产综合久久久| 黄视频网站在线看| a级黄色毛片免费播放视频| 日韩免费在线观看视频| 欧美爱爱网| 亚洲女初尝黑人巨高清在线观看| 人人干人人草| 你懂的国产精品| 精品视频一区二区三区| 亚欧视频在线| 国产一级生活片| 一级女性全黄久久生活片| 青青久在线视频| 欧美国产日韩久久久| 欧美电影免费看大全| 精品视频免费看| 99久久网站| 久久国产影院| 精品国产亚洲人成在线| 午夜在线亚洲| 成人高清免费| 美女被草网站| 高清一级淫片a级中文字幕| 国产麻豆精品免费视频| 一级毛片视频在线观看| 九九干| 日日夜人人澡人人澡人人看免| 日韩在线观看免费| 国产美女在线一区二区三区| 日韩中文字幕一区| 欧美国产日韩久久久| 天天做人人爱夜夜爽2020毛片| 精品在线视频播放| 四虎影视久久久| 免费的黄色小视频| 成人高清视频在线观看| 欧美大片毛片aaa免费看| 国产高清视频免费| 免费国产一级特黄aa大片在线| 日日夜人人澡人人澡人人看免| 97视频免费在线| a级精品九九九大片免费看| 九九热国产视频| 日日夜夜婷婷| 色综合久久天天综合观看| 国产伦久视频免费观看 视频| 久久精品成人一区二区三区| 精品国产三级a| 99久久精品国产麻豆| 国产精品123| 欧美另类videosbestsex视频| 999久久狠狠免费精品| 成人免费观看的视频黄页| 你懂的在线观看视频| 久久国产精品自由自在| 999精品视频在线| 欧美日本二区| 在线观看成人网| 久久国产影院| 国产高清在线精品一区二区| 国产一区二区精品久久91| 久久成人综合网| 国产成+人+综合+亚洲不卡| 亚洲天堂免费观看| 精品视频在线观看免费| 精品国产三级a| 国产网站在线| 国产伦理精品| 午夜欧美成人久久久久久| 国产成人啪精品| 你懂的在线观看视频| 中文字幕97| 久久成人亚洲| 一级片片| 欧美另类videosbestsex| 999精品在线| 国产精品1024在线永久免费| 成人高清护士在线播放| 久久国产精品只做精品| 成人免费观看网欧美片| 亚洲第一色在线| 你懂的在线观看视频| 欧美激情在线精品video| 天天做日日爱夜夜爽| 亚洲精品久久玖玖玖玖| 国产一区二区精品久久91| 国产精品自拍亚洲| 天天做人人爱夜夜爽2020 | 黄色福利| 欧美1卡一卡二卡三新区| 九九精品在线| 午夜激情视频在线观看| 欧美另类videosbestsex高清| 亚洲天堂免费观看| 四虎论坛| 美国一区二区三区| 久久成人综合网| 亚洲天堂一区二区三区四区| 亚洲 欧美 91| 日韩专区一区| 日本伦理片网站| 国产欧美精品午夜在线播放| 成人免费观看视频| 精品国产亚一区二区三区| 美女免费毛片| 国产一级生活片| 亚洲精品中文一区不卡| 国产a视频|