麻豆传媒视频在线,国产91精品不卡视频,欧美jizz19性欧美,污视频网站在线观看,91涩漫在线观看,伊人发布在线,九色porny丨首页在线,福利视频一区,久久av网址,久久人人视频

當前位置:首頁 > 網站舊欄目 > 學習園地 > 設計軟件教程 > JFace Text Editor完全掌握之終極指南(1)

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

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

Editor編輯的內容封裝在IDocument這個類中,對于編輯內容的遍歷,定位都是在IDocument的基礎上來實現的,而文檔的分割信息以及其他的元數據信息(比如高亮區域)則由Editor來保存,Document中的定位信息將使用一個Position類來加以封裝.

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

IDocument接口并不關心文本內容的存儲和加載,它的工作就是初始化一個文檔對象實例,而文檔的各種屬性的初始化則交給IDocumentProvider來完成.

在打開一個文檔的時候編輯器將同時進行文檔的分割處理,其結果是得到各種不同類型的互不重疊文本塊

下面我們來講講分割器,分割器的設置是在IDocumentProvider的createDocument()方法中實現的,如下代碼所示:

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. }  

 

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

與分割相關的還有三個概念:Scanner, Token和Rule, Scanner的任務就是將當前編輯的文檔對象進行掃描并得到每一個文本塊所對應的Token,對于Token需要解釋一下,它是IToken的一個實現,被視為內容類型的唯一標識符.比如一個Token可能表示的是某種語言中的關鍵字,xml元素名,空格等.

通過下面的代碼來說明Scanner是如何來查找各個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.   

 

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

使用一個基于規則的Scanner對文檔進行分割的工作原理如下:

  • 1.在RuleBasedPartitionScanner構造器中配置一些規則   
  • 2.分割時調用Rule的evaluate()方法   
  • 3.在evaluate方法中根據配置的各種規則實現類將對得到的一段字符串片段進行匹配,比如用于查找XML注釋的MultiLineRule只去匹配那些以注釋開始并以注釋結尾 結束的字符片段,這種匹配只有兩種結果:成功或失敗,還是拿匹配注釋的MultiLineRule來說,如果匹配的字符串片段為"一般節點"那么它會馬上返回,因為匹配的字符串不是以注釋開頭開始的,如果匹配失敗,掃描器將重新定位到匹配字符串的起始位置,并返回Token.UNDEFINED,接著調用下一個rule的evaluate()方法進行匹配處理,如果找到則返回匹配的Token,而且Scanner將去獲取當前字符串在整個文檔中的位置以及長度,并使用TypedPosition類將這些信息與其內容類型加以封裝保存到IDocument實例中.

    IDocumentPartitioner通過computePartitioning()方法將得到文檔的分割信息,當然了,在得到分割信息之前,必須要將文檔對象與IDocumentPartitioner實例關聯起來,這個是通過IDocumentPartitioner.connect(document)來實現的.

    當使用規則對文檔進行分割,可能主要的工作就是去定義IPredicateRule的各種實現類,該接口的實現包括MultiLineRule, SingleLineRule 和 PatternRule等,理解該接口的難點在于如何配置這些規則,有時候,我們可能需要提供自己的IPredicateRule實現類

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

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

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

    為了更容易的創建一個結構化文檔編輯器,Eclipse在ITextViewer的基礎上又提供了一個ISourceViewer接口,它包括的功能更強大,比如錯誤標記, 語法高亮等,下面我們將一一進行介紹

    JFace Text Editor通過SourceViewerConfiguration類來對Source Viewer進行配置,我們需要做的就是繼承SourceViewerConfiguration類來對SourceViewer進行定制,SourceViewer的很多功能比如文本格式化,語法高亮,雙擊選擇,自動提示等等都是通過對SourceViewerConfiguration配置來實現的,足見其重要性不容忽視.

    下面將通過在一個增強版的XML編輯器來實戰Text Editor的用法

    Eclipse插件開發套件提供一個向導來幫助用戶創建一個簡單的XML Editor,下面我們將在該編輯器的基礎上來進行擴展

    該XML編輯器將實現下面五個功能:語法高亮(Syntax hightlighting),錯誤標識(Error marker),格式化(Formating),內容輔助(Content Assistance), 內容大綱(Content Outline)

    進行擴展的第一步就是增加新的分割模型,我們增加了下面三個分割的內容類型:XML文本, CData內容, XML處理指令.

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

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

     

    然后注冊到分割器中,這個是在構造IDocumentPartitioner實例時作為參數傳遞進去的:
     

    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. }   

     

    接下來是創建用于標識不同類型內容的Token和Rule,由于我們使用的是基于規則的Scaner(RuleBasedPartitionScanner),因此我們需要添加一對Token和Rule,這樣才能讓我們的IPartitionTokenScanner實例能感知我們定義的內容類型

    根據XML定義規范,XML指令必須以結束,因此我們將這樣來定義我們的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能知道我們添加的新的內容類型,我們還需要重載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. }  

安徽新華電腦學校專業職業規劃師為你提供更多幫助【在線咨詢
色资源在线观看| 男人的天堂在线视频免费观看 | 亚洲综合图片| 亚洲品质自拍视频网站| 欧美r级电影| 国产在线69| 热99在线视频| 亚洲精品第一页| 美女性感视频久久| 8x8ⅹ拨牐拨牐拨牐在线观看| 日韩在线欧美在线国产在线| 亚洲影院理伦片| 国产一区中文字幕| 国产麻豆精品久久| 98色花堂精品视频在线观看| 成色在线视频| 久久在线视频在线| 欧美精品国产精品| 亚洲欧美中日韩| 麻豆成人久久精品二区三区小说| 国产精品一区二区中文字幕| 亚洲1卡2卡3卡4卡乱码精品| 久久成人精品电影| 欧美性猛交xxxx富婆| 白白色在线观看| 国产日韩欧美精品电影三级在线| 乡村艳史在线观看| 精品福利在线观看| 国产欧美日韩精品一区二区三区| 国产丝袜精品视频| 日本vs亚洲vs韩国一区三区二区 | 色综合久久综合网| 久本草在线中文字幕亚洲| 亚洲黄页视频免费观看| 欧美视频导航| 一二三中文字幕在线 | 国产精品**亚洲精品| 综合激情国产一区| 国产婷婷精品av在线| 亚洲精选在线| 欧美精品videosex极品1| 久久精品一区蜜桃臀影院| 欧美视频一区| 黄色aa久久| 69av成人| 幼a在线观看| 91精品国产免费久久久久久| 亚洲午夜久久久久久尤物| 日韩成人亚洲| 成人免费视频视频在线观看免费| 免费在线亚洲| 深夜福利视频一区| 奇米在线7777在线精品| 国产丝袜精品丝袜| 成人福利av| 九九热r在线视频精品| 久久婷婷国产| 91日韩免费| 成午夜精品一区二区三区软件| 欧美激情videos| 欧美亚洲国产日韩| 日韩一区二区三区精品视频第3页| 国偷自产av一区二区三区| 哺乳一区二区三区中文视频 | 91在线网址| 在线观看一级片| 超碰在线网址| sis001欧美| sm久久捆绑调教精品一区| 久久bbxx| 日本精品另类| 亚洲欧洲日韩| 国产精品av一区二区| 成人美女视频在线观看| 久久99热99| 亚洲成在人线在线播放| 日韩精品中文字幕视频在线| 久久久久久网| 日韩精品中文字幕在线一区| 日韩亚洲第一页| 欧美另类在线播放| 热re91久久精品国99热蜜臀| 91爱爱小视频k| 久久久久中文字幕2018| 国产不卡人人| 成人高清在线视频| 粉嫩一区二区| 欧美日韩网站| 国产盗摄一区二区三区| 欧美午夜视频一区二区| 国产精品夜间视频香蕉| 欧美家庭影院| 国产乱理伦片a级在线观看| 国内av一区二区三区| 美女一区网站| 欧美在线免费看视频| 久久视频一区| 欧美视频一区二区| 一区二区三区回区在观看免费视频| 91精品久久久久久| 国产精品久久久久久久久久99| 在线成人激情视频| 在线观看a级片| 欧美一级二级三级乱码| av2020不卡| 欧美白人做受xxxx视频| 91亚洲男人天堂| 国产精品一二| 制服丝袜中文字幕一区| 亚洲天堂久久av| 免费在线国产视频| 极品美女销魂一区二区三区| 欧美福利视频一区| 麻豆最新免费在线视频| 另类av一区二区| 欧美一区二区三区在线观看视频| 国产成人在线一区二区| 国产精品毛片aⅴ一区二区三区| 欧美日韩国内| 精品福利二区三区| 免费成人av电影| 免费一级欧美片在线播放| 亚洲精品美女在线观看| 国产亚洲成av人片在线观看 | 国产成人亚洲综合91精品| 免费污视频在线| 成人免费精品视频| 精品美女在线播放| 伊人影院在线视频| 日韩电影免费一区| 日韩精品在线视频| 第四色中文综合网| 色婷婷一区二区三区四区| 国产一级黄色片免费| 日韩电影免费在线观看网站| 久久国产精品影视| 亚洲成人一区| 国产一区二区三区在线观看网站| 亚洲精品黑牛一区二区三区| 亚洲国产成人精品视频| 国产淫片在线观看| 久久精品亚洲麻豆av一区二区| 视频二区在线| 国产精品剧情在线亚洲| 婷婷成人激情| 粉嫩一区二区三区性色av| 国产91色在线播放| 国产一区二区三区日韩 | 日本成人小视频| 欧美亚洲综合另类| 国产一二三在线观看| 久久一留热品黄| 一级在线观看| 久久色视频免费观看| 国产成人精品在线| 91九色精品| 亚洲视屏在线播放| 国产一区99| 日韩av男人的天堂| 99久久精品国产毛片| av片在线观看| 欧美性猛交丰臀xxxxx网站| 欧美激情网站| 日韩欧美在线字幕| 成人va天堂| 欧美系列日韩一区| 北条麻妃一区二区三区在线| 午夜精品福利在线观看| 91美女片黄在线观看91美女| 国产不卡网站| 欧美成人精品福利| 国产手机视频一区二区 | 成人影院免费观看| 在线视频欧美精品| 成人a'v在线播放| 久久久久久久一| 99精品欧美一区二区蜜桃免费| ****av在线网毛片| 久久久久九九九九| 精品国产一区二区三区| 国产对白叫床清晰在线播放| 揄拍成人国产精品视频| 三级精品在线观看| 日本免费久久高清视频| 精品国产一区二区三区久久久樱花| 国产日韩中文字幕| 97久久超碰国产精品电影| 日日av拍夜夜添久久免费| 正在播放亚洲一区| 懂色av色香蕉一区二区蜜桃| 777久久久精品| 国产成人综合自拍| 先锋影音一区二区| 国产精品综合网站| 99精品视频在线观看免费| 亚洲尤物av| 欧美日夜夜逼| 亚洲精品一二区| 久久精品人人做人人综合| 国产精品成人自拍|