Text Folding
Text Folding(文本折叠)其实在 Eclipse 2.1 的时候就已经出现了苗头,在 Eclipse 3.0 之后,文本折叠的架构被重新设计了,开始逐渐变的实用。我们先来了解一下JTF为了文本折叠做了哪些工作。
ProjectionViewer
SourceViewer 本身不支持文本折叠,所以 JTF 添加了一个 ProjectionViewer 专门支持文本折叠,它是 SourceViewer 的子类。
主从文档结构
JTF 是不可能神奇的知道哪些文本是可以折叠的,这些事情都得有人告诉它。在有文本折叠的情况下,我们能看到的只是一部分文字,但是创建的 IDocument 实例里面是包含了所有文字的,怎么才能知道哪些不该显示?所以 JTF 引入了一个 Master/Slave(主/从)文档架构,主文档就是包含了所有内容的文档,而从文档则只包含用户能看得见的内容,从文档的实现类是 ProjectionDocument。既然存在两个文档,那么就带了同步的问题,所以又引入了 ProjectionDocumentManager 来维护主从文档的同步。需要注意的是,ProjectionDocument 不能直接创建,必须通过 ProjectionDocumentManager 的 createSlaveDocument 方法来创建。
好消息是:我们在实现文本折叠时不用关心什么主从文档架构,因为这些都被JTF包装好了,在上层,我们看到的只有一个文档。
ProjectionAnnotation
在 Java 编辑器中可以看到,可以折叠的地方旁边都有个小图标,它显示了当前的折叠状态,并且可以点击它改变折叠状态。从界面上看,你应该能想到:这不就是标注吗?没错,确实是标注,只不过这个标注是显示在另外一条标尺上的,和显示错误标注的标尺不同罢了。文本折叠标注的实现类是 ProjectionAnnotation,在实现文本折叠的过程中,很重要的一部分工作就是及时刷新 ProjectionAnnotation。
我在本系列第五部分讲述文本标注的时候提到过许多和标注相关的概念,它们也同样适用于文本折叠标注。比如,可以通过 IDrawingStrategy 来自定义标注的外观,缺省情况下它是一个省略号。如下图所示:
图 1. 缺省的文本折叠标注外观