专注于互联网--专注于架构

最新标签
网站地图
文章索引
Rss订阅

首页 »Java教程 » jface:JFace Text Editor完全掌握的终极指南 »正文

jface:JFace Text Editor完全掌握的终极指南

来源: 发布时间:星期四, 2008年12月18日 浏览:2次 评论:0
Ku4Lg#mK*GsJFace Text Editor是JFace里面个功能强大,结构复杂而且非常重要组件,要掌握它还需要花不少功夫,下面我们将通过"Building an Eclipse Text Editor with JFace Text"翻译来掌握它使用方法
^ W(uZw6I提到Text Editor,就不得不提到和的密切相关SourceViewerConfiguration类,Text Editor许多功能都是通过该类配置上去,还有个是IDocumentProvider接口,Text Editor所要编辑文件对象就是通过该接口提供.JAVA中文站社区门户$p8|'`{ O-W@

JAVA中文站社区门户Kv&r,r$T2W/REditor编辑内容封装在IDocument这个类中,对于编辑内容遍历,定位都是在IDocument基础上来实现,而文档分割信息以及其他元数据信息(比如高亮区域)则由Editor来保存,Document中定位信息将使用个Position类来加以封装.JAVA中文站社区门户 jE-\} \&V M

P"N;w \)Xa虽然IDocument有区别实现,但是他们都个共同点,那就是这些内容都是可分割,即能被分割成互不重叠文本块.分割(Partition)在Text Editor中是个非常非常重要概念,基本上Text Editor所有功能都是建立在文档分割基础上.JAVA中文站社区门户#WhZ.o u#vs-xk{ f i

s-zk F;\IDocument接口并不关心文本内容存储和加载,它工作就是个文档对象例子,而文档各种属性化则交给IDocumentProvider来完成.JAVA中文站社区门户jwse6@^'V

JAVA中文站社区门户 R"`xm:R I\ X!ka在打开个文档时候编辑器将同时进行文档分割处理,其结果是得到各种区别类型互不重叠文本块JAVA中文站社区门户/~"se^I!j9@]

u4\0M }5B8~下面我们来讲讲分割器,分割器设置是在IDocumentProvidercreateDocument思路方法中实现,如下代码所示:JAVA中文站社区门户,oUB?nbP)o6Tdy


n4IA0m8i9E+tp java 代码

    =dp-j>
  1. =alt>=keyword>protected IDocument createDocument(Object element) =keyword>throws CoreException   
  2. ="">{   
  3. =alt>    IDocument document = =keyword>super.createDocument(element);   
  4. ="">    =keyword> (document != =keyword>null)   
  5. =alt>    {   
  6. ="">        IDocumentPartitioner partitioner = =keyword> XMLPartitioner(   
  7. =alt>        =keyword> XMLPartitionScanner=keyword> String                               
  8. ="">          {   
  9. =alt>                  XMLPartitionScanner.XML_TAG, XMLPartitionScanner.XML_COMMENT   
  10. ="">          });   
  11. =alt>        partitioner.connect(document);   
  12. ="">        document.DocumentPartitioner(partitioner);   
  13. =alt>    }   
  14. ="">    =keyword> document;   
  15. =alt>}  

JAVA中文站社区门户F-Ze7@rT)h JAVA中文站社区门户w4OA%j({ f z;Q

JAVA中文站社区门户3wd%x R;F E%w B从上面代码我们可以看到,个IDocumentPartitioner我们需要两个参数,个是必须指定个IPartitionTokenScanner例子,另个是所支持内容类型(content type).

7I9B3U h7Q)Zl i jCYEvs和分割相关还有 3个概念:Scanner, Token和Rule, Scanner任务就是将当前编辑文档对象进行扫描并得到每个文本块所对应Token,对于Token需要解释下,它是IToken个实现,被视为内容类型标识符.比如个Token可能表示是某种语言中关键字,xml元素名,空格等.

j%v![/|)Ln | h5c*N4|3uO w.Gw}'~通过下面代码来介绍说明Scanner是如何来查找各个Token.JAVA中文站社区门户{E @.k+vx6WF1}


'dI U@'p java 代码

    =dp-j>
  1. =alt>=keyword>public =keyword> XMLPartitionScanner =keyword>extends RuleBasedPartitionScanner   
  2. ="">{   
  3. =alt>    =keyword>public =keyword>final =keyword> String XML_DEFAULT = =>"__xml_default";   
  4. ="">    =keyword>public =keyword>final =keyword> String XML_COMMENT = =>"__xml_comment";   
  5. =alt>    =keyword>public =keyword>final =keyword> String XML_TAG = =>"__xml_tag";   
  6. ="">  
  7. =alt>    =keyword>public XMLPartitionScanner   
  8. ="">    {   
  9. =alt>  
  10. ="">        IToken xmlComment = =keyword> Token(XML_COMMENT);   
  11. =alt>        IToken tag = =keyword> Token(XML_TAG);   
  12. ="">  
  13. =alt>        IPredicateRule rules = =keyword> IPredicateRule[=number>2];   
  14. ="">  
  15. =alt>        rules[=number>0] = =keyword> MultiLineRule(=>"", xmlComment);   
  16. ="">        rules[=number>1] = =keyword> TagRule(tag);   
  17. =alt>  
  18. ="">        PredicateRules(rules);   
  19. =alt>    }   
  20. ="">}   
  21. =alt>  

:CJ1n~x%w }} JAVA中文站社区门户,^*QA:|~ld6E#M

'VY)`R R.S0L*W8UV个编辑器中每种内容类型(content type)都表示为串常量.在上面代码中,定义了 3个内容类型:默认,xml标签和xml注释.为了简化,这里我们没有对xml中节点文本内容以及xml指令定义类型, 在XMLPartitionScanner中,每个内容类型都和个IToken例子相关联,而IToken例子非常简单,仅仅只是个内容类型标识符,用来在XMLPartitionScanner对文档进行扫描时候,对各种Token进行识别, 由于我们Scanner是继承RuleBasedPartitionScanner,因此它Token将和系列规则对应,而分割器通过这些规则来将文档分割成所需要结构,在XMLPartitionScanner中,我们使用了两条规则来将内容类型进行配置:个是MultiLineRule,对应注释内容类型,个是TagRule对应xml标签类型,在根据内容类型进行分割时,当找到个匹配分割片段的后将返回个唯Token,这样就在内容类型,Rule 以及Token的间做到了对应.

PXqUM1m*d ^k(eH9hHE使用个基于规则Scanner对文档进行分割工作原理如下:

3V.C u*?6X [
  • =alt>1.在RuleBasedPartitionScanner构造器中配置些规则   
  • ="">2.分割时Ruleevaluate思路方法   
  • =alt>3.在evaluate思路方法中根据配置各种规则实现类将对得到串片段进行匹配,比如用于查找XML注释MultiLineRule只去匹配那些以注释=comments>开始并以注释结尾 结束片段,这种匹配只有两种结果:成功或失败,还是拿匹配注释MultiLineRule来说,如果匹配串片段为"=tag>般节点"那么它会马上返回,匹配串不是以注释开头开始,如果匹配失败,扫描器将重新定位到匹配起始位置,并返回Token.UNDEFINED,接着个ruleevaluate思路方法进行匹配处理,如果找到则返回匹配Token,而且Scanner将去获取当前串在整个文档中位置以及长度,并使用TypedPosition类将这些信息和其内容类型加以封装保存到IDocument例子中. JAVA中文站社区门户 |o"sy u?9^)kj7]iIDocumentPartitioner通过computePartitioning思路方法将得到文档分割信息,当然了,在得到分割信息的前,必须要将文档对象和IDocumentPartitioner例子关联起来,这个是通过IDocumentPartitioner.connect(document)来实现.JAVA中文站社区门户p#go4Zv7gw3_

    #[-|)G%U!ff{3hQ ib0G当使用规则对文档进行分割,可能主要工作就是去定义IPredicateRule各种实现类,该接口实现包括MultiLineRule, SingleLineRule 和 PatternRule等,理解该接口难点在于如何配置这些规则,有时候,我们可能需要提供自己IPredicateRule实现类JAVA中文站社区门户Eo1Z]`!{8l3y&a

    JAVA中文站社区门户*U!z/b+SO2q'_3Z0W除了自定义规则的外,我们也可以提供自己ITokenScanner实现.比如在JDT中,就实现了自己ITokenScanner类FastJavaPartitionScanner,显然这个工作是巨大,般我们不这样做,除非有必要.JAVA中文站社区门户 FD"zto$FA"@{

    JAVA中文站社区门户q{8cKa mm对文档进行分割的后,接下来将要介绍如何显示,Text Editor底层采用StyledTextControl控件来显示编辑文本内容, ITextViewer提供了套API来封装StyledText处理IDocument模型细节,这样Text Editor使用者就不用再和底层StyledText打交道了.

    $M i(x)OyW JAVA中文站社区门户 Ye9te.vFVzITextViewer除了对StyledText进行封装的外还提供了其他如Undo Management这样功能,要了解更多细节可以去看看JavaDoc文档.

    a!QjJy7VE JAVA中文站社区门户1_-F*Y@;_U*z*m3}qx_为了更容易创建个结构化文档编辑器,Eclipse在ITextViewer基础上又提供了个ISourceViewer接口,它包括功能更强大,比如标记, 语法高亮等,下面我们将进行介绍

    Sl8d.sJd? JAVA中文站社区门户+Zx)_Q~ M1kEJFace Text Editor通过SourceViewerConfiguration类来对Source Viewer进行配置,我们需要做就是继承SourceViewerConfiguration类来对SourceViewer进行定制,SourceViewer很多功能比如文本格式化,语法高亮,双击选择,自动提示等等都是通过对SourceViewerConfiguration配置来实现,足见其重要性不容忽视.JAVA中文站社区门户 BfRk8qy9x

    JAVA中文站社区门户 ~[;H6Bi7[LE5M下面将通过在个增强版XML编辑器来实战Text Editor使用方法

    |N)aJ*kc6k` f V #Xk U:v_P8bEclipse插件开发套件提供个向导来帮助用户创建个简单XML Editor,下面我们将在该编辑器基础上来进行扩展JAVA中文站社区门户*YL*Jm{'e

    -T;@r$w2[该XML编辑器将实现下面 5个功能:语法高亮(Syntax hightlighting),标识(Error marker),格式化(Formating),内容辅助(Content Assistance), 内容大纲(Content Outline)

    ^;i,cj.q1l6_ 8nq `L)B.u进行扩展步就是增加新分割模型,我们增加了下面 3个分割内容类型:XML文本, CData内容, XML处理指令.JAVA中文站社区门户pRB9EO T

    (rh0a#Ff9jz为了在我们XMLPartionScanner中处理指令类型定义, 先:JAVA中文站社区门户y0Of:yg-k5?
    JAVA中文站社区门户|cn~*@8E0]g-f+M

    java 代码

      =dp-j>
    1. =alt>=keyword>public =keyword>final =keyword> String XML_PI = =>"__xml_pi";   

    JAVA中文站社区门户&}$TMM)a V&i7^ 

    D{;Tu~#^4^*Z,p3c JAVA中文站社区门户3]/yQ%Z^eP然后注册到分割器中,这个是在构造IDocumentPartitioner例子时作为参数传递进去:
    hJmu7B/]@1Pe;w ^JAVA中文站社区门户:|*m1ex\%`L

    java 代码

      =dp-j>
    1. =alt>=keyword>protected IDocument createDocument(Object element) =keyword>throws CoreException   
    2. ="">{   
    3. =alt>    IDocument document = =keyword>super.createDocument(element);   
    4. ="">    =keyword> (document != =keyword>null)   
    5. =alt>    {   
    6. ="">        IDocumentPartitioner partitioner = =keyword> XMLPartitioner(   
    7. =alt>         =keyword> XMLPartitionScanner=keyword> String   
    8. ="">        {   
    9. =alt>                XMLPartitionScanner.XML_START_TAG,   
    10. ="">                XMLPartitionScanner.XML_PI,   
    11. =alt>                XMLPartitionScanner.XML_DOCTYPE,   
    12. ="">                XMLPartitionScanner.XML_END_TAG,   
    13. =alt>                XMLPartitionScanner.XML_TEXT,   
    14. ="">                XMLPartitionScanner.XML_CDATA,   
    15. =alt>                XMLPartitionScanner.XML_COMMENT   
    16. ="">        });   
    17. =alt>        partitioner.connect(document);   
    18. ="">        document.DocumentPartitioner(partitioner);   
    19. =alt>    }   
    20. ="">    =keyword> document;   
    21. =alt>}   

    ER C"k'[#|AFb JAVA中文站社区门户W"o Y,\!wX+]PP

    (``T@CAS g!t q接下来是创建用于标识区别类型内容Token和Rule,由于我们使用是基于规则Scaner(RuleBasedPartitionScanner),因此我们需要添加对Token和Rule,这样才能让我们IPartitionTokenScanner例子能感知我们定义内容类型

    3}y:QS}6]HTh V&K-q]bv;N根据XML定义规范标准,XML指令必须以结束,因此我们将这样来定义我们Token和Rule:JAVA中文站社区门户5M;p Qa ["l


    C Y*y8B2T(n[s java 代码

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

    ^-x0I9JZ0}x2Bv S V JAVA中文站社区门户~%`5hd |RqFEJ6H E

    zBfAaW}为了让SourceViewerConfiguration能知道我们添加内容类型,我们还需要重载getConfiguredContentTypes思路方法:JAVA中文站社区门户/| ]J4N\K
    JAVA中文站社区门户J#M&L^ Xp*P

    java 代码

      =dp-j>
    1. =alt>=keyword>public String getConfiguredContentTypes(ISourceViewer sourceViewer)   
    2. ="">{   
    3. =alt>    =keyword> =keyword> String   
    4. ="">    {   
    5. =alt>            IDocument.DEFAULT_CONTENT_TYPE,   
    6. ="">            XMLPartitionScanner.XML_COMMENT,   
    7. =alt>            XMLPartitionScanner.XML_PI,   
    8. ="">            XMLPartitionScanner.XML_DOCTYPE,   
    9. =alt>            XMLPartitionScanner.XML_START_TAG,   
    10. ="">            XMLPartitionScanner.XML_END_TAG,   
    11. =alt>            XMLPartitionScanner.XML_TEXT   
    12. ="">    };   
    13. =alt>}  



  • TAG: Editor JFace Text 指南
    ="xspace-totlerecord">4="xspace-totlepages">1/4="xspace-current">1234>

    相关文章

    读者评论

    • 共0条 分0页

    发表评论

    • 昵称:
    • 内容: