国产精品一区二区精品_久久小视频_天堂va在线观看_99久久夜色精品国产亚洲96_日本手机在线视频_av成人免费

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

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

最后一步就是實(shí)現(xiàn)各種功能

語(yǔ)法高亮

首先我們要實(shí)現(xiàn)的是語(yǔ)法高亮.如下圖所示:

The enhanced XML editor in action 

從本質(zhì)上來(lái)說(shuō),語(yǔ)法高亮就是給分割后的Token指定相應(yīng)的顯示屬性,在語(yǔ)法高亮的處理機(jī)制里面也需要用到Token, Scanner和Rule這些東西.通過(guò)復(fù)寫SourceViewerConfiguration的getPresentationReconciler()方法來(lái)給指定的內(nèi)容類型添加語(yǔ)法高亮的特性:

 

 

java 代碼
 
  1. public IPresentationReconciler getPresentationReconciler(ISourceViewer sourceViewer)   
  2. {   
  3.     PresentationReconciler reconciler = new PresentationReconciler();   
  4.   
  5.     DefaultDamagerRepairer dr = new DefaultDamagerRepairer(getXMLTagScanner());   
  6.     reconciler.setDamager(dr, XMLPartitionScanner.XML_TAG);   
  7.     reconciler.setRepairer(dr, XMLPartitionScanner.XML_TAG);   
  8.   
  9.     dr = new DefaultDamagerRepairer(getXMLScanner());   
  10.     reconciler.setDamager(dr, IDocument.DEFAULT_CONTENT_TYPE);   
  11.     reconciler.setRepairer(dr, IDocument.DEFAULT_CONTENT_TYPE);   
  12.        
  13.     ...   
  14.   
  15.     return reconciler;   
  16. }   
  17.   

在上面的代碼中有一個(gè)IPresentationReconciler實(shí)例,他是用來(lái)監(jiān)聽(tīng)底層的IDocument實(shí)例的變動(dòng),一個(gè)內(nèi)容類型會(huì)跟一個(gè)IPresentationDamager和IPresentationRepairer實(shí)例相關(guān)聯(lián),當(dāng)編輯文檔時(shí),將會(huì)給受影響的文檔區(qū)域?qū)?yīng)內(nèi)容類型的IPresentationDamager實(shí)例發(fā)送消息,接著IPresentationDamager會(huì)返回一個(gè)IRegion實(shí)例,并將這些信息傳遞給IPresentationRepairer實(shí)例,該實(shí)例會(huì)對(duì)發(fā)生改變的區(qū)域重新設(shè)置顯示屬性.

上述過(guò)程聽(tīng)起來(lái)可能比較復(fù)雜,不過(guò)萬(wàn)幸的是我們并不需要自己去實(shí)現(xiàn)這些東西, JFace提供了一個(gè)DefaultDamagerRepairer來(lái)處理IPresentationDamager和IPresentationRepairer要做的事情,同時(shí)還提供了一個(gè)PresentationReconciler類用來(lái)將二者關(guān)聯(lián)起來(lái),而我們要做的就是告訴編輯器在使用給定的內(nèi)容類型對(duì)文檔進(jìn)行分割之后的結(jié)構(gòu)是怎樣的,以及每一種文檔類型的顯示屬性

DefaultDamagerRepairer的構(gòu)造器需要一個(gè)ITokenScanner 參數(shù),該接口跟分割Token Scanner非常類似,兩種Scanner得到的Token都是IToken的一種實(shí)現(xiàn),不同之處在于Token粒度不同,分割Token Scanner得到的Token是一個(gè)具有某種內(nèi)容類型的文檔區(qū)域,而使用語(yǔ)法高亮Scanner得到的Token是一段具有相同文本格式的字符串序列,顯然后者的粒度更細(xì)

這里我們拿XMLTagScanner來(lái)說(shuō),該Scanner主要針對(duì)XML_TAG內(nèi)容類型, 因此它得到的Token表示的是位于XML標(biāo)識(shí)符之間的文本內(nèi)容

 
  1. public class XMLTagScanner extends RuleBasedScanner   
  2. {   
  3.     public XMLTagScanner(ColorManager manager)   
  4.     {   
  5.         Color color = manager.getColor(IXMLColorConstants.STRING);   
  6.         TextAttribute textAttribute = new TextAttribute(color);   
  7.         IToken string = new Token(textAttribute);   
  8.        
  9.         IRule[] rules = new IRule[3];   
  10.        
  11.         // Add rule for double quotes   
  12.         rules[0] = new SingleLineRule("\"""\"", string, '\\');   
  13.         // Add a rule for single quotes   
  14.         rules[1] = new SingleLineRule("'""'", string, '\\');   
  15.         // Add generic whitespace rule.   
  16.         rules[2] = new WhitespaceRule(new XMLWhitespaceDetector());   
  17.        
  18.         setRules(rules);   
  19.     }   
  20. }  

XMLTagScanner繼承了RuleBasedScanner,因此和我們?cè)赗uleBasedPartitionScanner中看到的一樣,它也是使用某種規(guī)則處理機(jī)制來(lái)識(shí)別Token的

這里我們定義了三個(gè)規(guī)則:一個(gè)用于匹配雙引號(hào)中的字符,一個(gè)用于匹配單引號(hào)中的字符,還有一個(gè)則用來(lái)匹配空格

為了給XML的標(biāo)簽名顯示為藍(lán)色,我們使用以下的代碼,即給Token設(shè)置一個(gè)默認(rèn)的顏色值:

java 代碼
 
  1. protected XMLTagScanner getXMLTagScanner()   
  2. {   
  3.     if (tagScanner == null)   
  4.     {   
  5.         tagScanner = new XMLTagScanner(colorManager);   
  6.         Color color = colorManager.getColor(IXMLColorConstants.TAG);   
  7.         TextAttribute textAttribute = new TextAttribute(color);   
  8.         Token token = new Token(textAttribute);   
  9.         tagScanner.setDefaultReturnToken(token);   
  10.     }   
  11.     return tagScanner;   
  12. }   

內(nèi)容格式化

格式化就是通過(guò)使用縮進(jìn)和空格使文檔結(jié)構(gòu)化,從而更具有可讀性, 格式化處理包括兩個(gè)步驟:
第一步,為即將格式化的內(nèi)容定義格式化策略,這些策略可以是全局性的,也可以是針對(duì)某個(gè)分割區(qū)域的.通過(guò)IFormattingStrategy接口來(lái)實(shí)現(xiàn).
第二步,通過(guò)SourceViewerConfiguration實(shí)現(xiàn)類給ISourceViewer添加這些策略

格式化也會(huì)使用到分割處理,這讓我們?cè)僖淮误w會(huì)到了掌握以及正確使用文檔分割的重要性.下面我們就以最簡(jiǎn)單的TextFormattingStrategy來(lái)進(jìn)行說(shuō)明,該格式化策略用于處理嵌套在XML元素中的文本內(nèi)容

java 代碼
 
  1. public class TextFormattingStrategy extends DefaultFormattingStrategy   
  2. {   
  3.     private static final String lineSeparator = System.getProperty("line.separator");   
  4.   
  5.     public String format(String content,    
  6.         boolean isLineStart,    
  7.         String indentation,    
  8.         int[] positions)   
  9.     {   
  10.         if (indentation.length() == 0)   
  11.             return content;   
  12.         return lineSeparator + content.trim() + lineSeparator + indentation;   
  13.     }   
  14. }   
  15.   

這里我們通過(guò)繼承DefaultFormattingStrategy并復(fù)寫format方法來(lái)實(shí)現(xiàn), 其具體做法是對(duì)文本內(nèi)容進(jìn)行trim處理,然后在文本前后加上換行符

上面的介紹可能太簡(jiǎn)單,在我們的實(shí)現(xiàn)類XMLFormattingStrategy中包含了更復(fù)雜的格式化處理代碼,這里我們對(duì)其細(xì)節(jié)不再一一展開(kāi),有興趣的讀者可以自己去加以體會(huì),可以說(shuō)格式化處理是一項(xiàng)非常有挑戰(zhàn)性的活兒,因?yàn)樗涉及到對(duì)選擇的文本進(jìn)行智能識(shí)別的處理,這個(gè)需要反復(fù)的實(shí)驗(yàn)才能得到理想的結(jié)果

通過(guò)重載SourceViewerConfiguration.getContentFormatter()方法可以非常容易的將格式化操作添加到編輯器中

java 代碼
 
  1. public IContentFormatter getContentFormatter(ISourceViewer sourceViewer)   
  2. {   
  3.     ContentFormatter formatter = new ContentFormatter();   
  4.     XMLFormattingStrategy formattingStrategy = new XMLFormattingStrategy();   
  5.     DefaultFormattingStrategy defaultStrategy = new DefaultFormattingStrategy();   
  6.     TextFormattingStrategy textStrategy = new TextFormattingStrategy();   
  7.     DocTypeFormattingStrategy doctypeStrategy = new DocTypeFormattingStrategy();   
  8.     PIFormattingStrategy piStrategy = new PIFormattingStrategy();   
  9.     formatter.setFormattingStrategy(defaultStrategy, IDocument.DEFAULT_CONTENT_TYPE);   
  10.     formatter.setFormattingStrategy(textStrategy, XMLPartitionScanner.XML_TEXT);   
  11.     formatter.setFormattingStrategy(doctypeStrategy, XMLPartitionScanner.XML_DOCTYPE);   
  12.     formatter.setFormattingStrategy(piStrategy, XMLPartitionScanner.XML_PI);   
  13.     formatter.setFormattingStrategy(textStrategy, XMLPartitionScanner.XML_CDATA);   
  14.     formatter.setFormattingStrategy(formattingStrategy, XMLPartitionScanner.XML_START_TAG);   
  15.     formatter.setFormattingStrategy(formattingStrategy, XMLPartitionScanner.XML_END_TAG);   
  16.   
  17.     return formatter;   
  18. }   
  19.   

上述代碼首選創(chuàng)建了一個(gè)formatter,然后通過(guò)formatter的setFormattingStrategy()方法給我們的每一個(gè)內(nèi)容類型指定一個(gè)個(gè)格式化策略即可.


安徽新華電腦學(xué)校專業(yè)職業(yè)規(guī)劃師為你提供更多幫助【在線咨詢
国产精品一区二区精品_久久小视频_天堂va在线观看_99久久夜色精品国产亚洲96_日本手机在线视频_av成人免费
<button id="0mgmq"><pre id="0mgmq"></pre></button>
  • <tr id="0mgmq"></tr>
  • <abbr id="0mgmq"><source id="0mgmq"></source></abbr> <button id="0mgmq"></button>
  • 一道本一区二区| 蜜桃导航-精品导航| 午夜激情一区| 欧美高清性xxxxhd| 久久国产日韩欧美| 在线精品一区| 欧美在线91| 色噜噜一区二区| 狼狼综合久久久久综合网| 久久最新视频| 999视频在线观看| 国产美女诱惑一区二区| 影音欧美亚洲| 亚洲人成在线影院| 伊人久久大香线蕉综合热线| 欧美一区1区三区3区公司| 天堂一区二区三区| 日韩精品久久久毛片一区二区| 国产精品日韩欧美一区二区| 波多野结衣成人在线| 久久久水蜜桃av免费网站| 国产亚洲在线| 久久久久久久久久久一区| 久久国产高清| 岛国视频一区| av在线亚洲男人的天堂| 国产精品久久久久久久免费大片| 国产一区91| 91香蕉视频在线下载| 久久在线精品| 精品日韩欧美| 四虎影院一区二区三区| 亚洲狠狠婷婷综合久久久| 一区二区精品国产| 在线观看亚洲| 久久久水蜜桃| 欧美精品免费观看二区| 亚洲欧洲一区二区福利| 国产综合激情| 久久久久久网| 欧美成人第一区| 欧美激情四色| 国产亚洲精品久久飘花| 久久综合九色综合网站| 精品久久久久久中文字幕动漫| 国内精品久久国产| 视频一区视频二区视频三区视频四区国产| 亚洲精品无人区| 在线看片成人| 国产精品久久久久久久久久久久冷 | 1卡2卡3卡精品视频| 狠狠色噜噜狠狠色综合久| 水蜜桃一区二区三区| 在线观看欧美一区| www.成人av.com| 亚洲人一区二区| 国产精品嫩草99av在线| 精品一区二区三区视频日产| 四虎永久国产精品| 国产亚洲一区在线| 欧美国产综合视频| 在线观看成人av| 国产v亚洲v天堂无码| 欧美成人首页| 99九九视频| 在线观看欧美一区| 久久综合狠狠综合久久综青草| 日韩精品一区二区三区丰满 | 亚洲欧美日韩精品久久久 | 欧美二区在线| 日韩午夜精品| 久久日韩精品| 亚洲在线一区| 欧美一区免费| 精品国产免费人成电影在线观... 精品国产免费久久久久久尖叫 | 国产精品三区在线| 亚洲国产91| 日韩av电影在线观看| 亚洲一区二区三区高清| 亚洲欧洲精品一区| 国产一区再线| 国产一区二区三区高清| 亚洲伊人婷婷| 精品综合久久久| 香蕉久久夜色| 国产一区二区中文| 欧洲精品亚洲精品| 99re视频在线观看| 亚洲视频大全| 欧美另类亚洲| 品久久久久久久久久96高清| 久久九九免费| 在线观看成人av电影| 亚洲精品久久区二区三区蜜桃臀| 久久精品综合一区| 国产欧美激情| 亚洲天堂黄色| 欧美88av| 亚洲精品成人久久久998| 久久99精品国产99久久| 1区1区3区4区产品乱码芒果精品| 在线电影一区| 黄色一区二区三区四区| 一区二区免费在线观看| 日韩欧美精品久久| 精品人伦一区二区三区| 国产精品久久久久久久久婷婷| 国产一区二区三区久久| 最新成人av网站| 极品中文字幕一区| 国内精品国语自产拍在线观看| 亚洲制服中文| 欧美在线观看天堂一区二区三区| 欧美精品一区在线发布| 久久精品99久久| 精品一区二区三区视频日产| 国产精品香蕉视屏| 国产欧美丝袜| 国产精品国产三级国产专区53| 波多野结衣精品久久| 国产伦精品一区二区三区免 | 九9re精品视频在线观看re6| 亚洲欧洲视频| 日本一区二区不卡高清更新| 美女国产一区| 日韩资源av在线| 国产精品视频免费一区| 99在线精品免费视频九九视| 日本一区二区免费看| 国产另类自拍| 99久久精品久久久久久ai换脸| 欧美96在线丨欧| 久久综合中文色婷婷| 亚洲青涩在线| 亚洲国产日韩美| 粉嫩av四季av绯色av第一区| av一区二区三区四区电影| 国产精品国产三级欧美二区| 精品日本一区二区三区在线观看| 豆国产97在线| 欧美日韩综合网| 亚洲少妇诱惑| 高清国产在线一区| 久久伦理网站| 中文字幕日韩精品久久| 亚洲亚洲精品三区日韩精品在线视频| 亚洲精品综合| 成人综合色站| 日韩免费电影一区二区| 欧美日韩福利| 免费中文日韩| 欧美精品三区| 久久久久国产精品一区三寸| 国内一区二区三区在线视频| 亚洲最大免费| 午夜影院日韩| 日韩一本精品| 国产日韩一区二区三区在线播放| 99视频在线播放| 水蜜桃亚洲精品| 国产精品人人爽人人做我的可爱| 国产一区二区免费电影| 欧美日韩理论| av一区和二区| 国产主播一区| 国产欧美一区二区三区不卡高清| 亚洲精品一区二区三区蜜桃久| 极品中文字幕一区| 久久亚洲一区二区| 亚洲精品乱码视频| 欧美日韩精品不卡| 国产亚洲在线| 亚洲在线色站| 国产精品9999久久久久仙踪林| 中文字幕久久综合| 国产一区二区不卡视频| 激情综合在线| 日韩精品欧美专区| 久久精品欧美| 黑丝一区二区三区| 精品欧美一区二区三区久久久| 日韩午夜av在线| 亚洲国产午夜伦理片大全在线观看网站 | 亚洲欧美影院| 激情伦成人综合小说| 日韩电影在线播放| 成人在线看片| 国产午夜久久| 午夜精品视频| 欧美国产二区| 国产精品v欧美精品∨日韩| 亚洲国产欧美不卡在线观看| 亚洲精品国产精品国自产观看| 国产成人精品福利一区二区三区| 国内精品久久久久久久影视麻豆| 欧美日韩综合精品| 国产欧美日韩一区| 久久久精品日韩| 一本色道久久综合一区| 欧美精品大片|