关于TextEditor

一般我们写的文本编辑器都会继承于TextEditor,并可以override它的一些方法做一些定制,而初始化的工作需要在默认的空参数的构造函数中完成。

如果我们想完成一个简单的彩色文本编辑器,就需要用setSourceViewerConfiguration的方法设置一个SourceViewerConfiguration,这个SourceViewerConfiguration是对文本内容进行定制的核心。

不过在这之前,编辑器从文件中读入内容还有个过程。就所有的Editor来说,每一个Editor都会有一个IEditorInput,这个IEditorInput可以设置每次Editor输入内容的Name、ToolTipText等。而在WorkBenchPage打开每个Editor的时候都会根据要打开文件的IFile生成一个IFileEditorInput,这个类是IEditorInput的子类。eclipse把这个IFileEditorInput传到Editor,然后由Editor读入文件。我在这里看过源代码之后的理解是Editor把IFileEditorInput中的IFile的路径取得,然后由DocumentPrivide读取文件,作为InputStream输入到Editor。所以,文件在读入TextEditor之前,还会经过DocumentProvider,在这一过程中也可以对文本进行一些处理,过滤一些内容,可以用setDocumentProvider(IDocumentProvider provider)的方法设置DocumentProvider,把DocumentProvider设成一个继承TextFileDocumentProvider的子类。顺带提一提,eclipse中把Java的File转成eclipse的IFile很麻烦,如果文件一开始不在eclipse的IWorkspaceRoot、IResource、IContainer、IProject或IFolder里面,就很难把它转成IFile,因为IFile之能在IWorkspaceRoot、IContainer、IProject或IFolder里面用getXXX的方法得到。eclipse只有一个org.eclipse.ui.internal.editors.text.JavaFileEditorInput的类,它用到了IEditorInput的接口,可以读Java的File,但这个类是internal的,eclipse没有一个专门的类或方法来把Java的File转成eclipse的IFile。

用DocumentProvider对输入的内容做处理时,需要一个IDocumentPartitioner,就这个类的名字来说,好像是把Document分割。比较常用的是FastPartitioner,它的构造函数有两个参数,一个是IPartitionTokenScanner接口,一个是String的数组。

先说说它的第一个参数,在实现IPartitionTokenScanner的类中(一般是RuleBasedPartitionScanner的子类),会调用setPredicateRules(IPredicateRule[] rules)的方法设置多个PredicateRule,比较常用的是MultiLineRule和SingleLineRule。举例来说SingleLineRule,new一个SingleLineRule需要一头一尾的两个String,表示如果哪一行头尾是这两个String的话就应用这个SingleLineRule,另外还需要一个实现IToken的类(一般是Token),这个Token类很特殊,等会再说,我们叫这里的Token为Token1,这里的Token的构造参数是一个String。再说FastPartition的第二个参数:String数组。因为PredicateRule有多个,所以相应的Token也有多个,对应的构造参数的String也有多个,这些Token和String是一一对应的,只有在String数组中存在的String对应的Token才会生效。

实现了IDocumentPartitioner,我们还需要用它的connect(IDocument document)的方法,和IDocument的setDocumentPartitioner(IDocumentPartitioner partitioner)的方法把两者联系起来,而且这两个方法都要调用才能将两者连接。另外,IDocument是由IDocumentProvider的createDocument(Object element)得到的,IDocument的实现类的实例中应该就包含了文本文件的内容了。

获得了文本内容,就需要对文本进行进一步处理了,对文本着色最好建一个ColorManager类,专门负责色彩的管理,将RGB转换成Color。

另外,我们可以用一个实现了ITextDoubleClickStrategy的类,来处理双击,可以实现双击选词,在这里就不详细说了。

最重要的是一系列继承RuleBasedScanner的Scanner了。在这些Scanner中也有设置Rule的方法——setRules(IRule[] rules),前面的提到的IPredicateRule是继承于IRule的,所以这里的Rule有更广的范围,最明显的就是可以增加WordRule,可以对每个Word或每组Word设置Rule。另外还可以使用WhitespaceRule,对文本的留白进行处理,当然我们也可以继续使用SingleLineRule、MultiLineRule。每个Rule也会对应一个IToken的实现类(Token),WordRule是一系列Word对应一个Token,SingleLineRule和MultiLineRule是头尾的String对对应

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值