基于 JFace Text Framework 构建全功能代码编辑器: 第 11 部分:Text Folding
2010-03-18 00:00:00 来源:WEB开发网清单 5. updateProjectionAnnotations 的实现
public void updateProjectionAnnotations(List<Position> positions) {
// create projection annotation
Annotation[] annotations = new Annotation[positions.size()];
Map<Annotation, Position> newAnnotations = new HashMap<Annotation, Position>();
for(int i = 0; i > positions.size(); i++){
ProjectionAnnotation annotation = new ProjectionAnnotation();
newAnnotations.put(annotation, positions.get(i));
annotations[i] = annotation;
}
// get old annotation
Map<Position, Annotation> oldAnnotations = new HashMap<Position, Annotation>();
ProjectionAnnotationModel model = getProjectionAnnotationModel();
Iterator iter = model.getAnnotationIterator();
while(iter.hasNext()) {
Annotation anno = (Annotation)iter.next();
Position pos = model.getPosition(anno);
oldAnnotations.put(pos, anno);
}
// remove duplicated
List<Annotation> newKey = new ArrayList<Annotation>(newAnnotations.keySet());
for(Annotation anno : newKey) {
Position pos = newAnnotations.get(anno);
if(oldAnnotations.containsKey(pos)) {
oldAnnotations.remove(pos);
newAnnotations.remove(anno);
}
}
// replace annotations
getProjectionAnnotationModel().modifyAnnotations(
oldAnnotations.values().toArray(new Annotation[0]), newAnnotations, null);
}
看上去有点长,其实流程很简单:
为每条超过一行的语句创建一个新标注
得到所有的老标注
比较新老标注,去掉重复的
使用 modifyAnnotations 方法批量替换,不要一个一个替换,那样太慢
效果
现在运行一下本文的例子,当你输入一条超过一行的语句时,你会发现在等待了大概一秒钟之后,文本折叠标注就出现了。如图:
图 4. 语句超过一行时的文本折叠支持
结束语
我已经介绍完了 JTF 的所有关键特性,并从头到尾实现了一个代码编辑器,虽然它很简陋,但是它具有了 Java 编辑器的大部分功能!本系列的例子只是一个起点,它不是没有 bug,它也离完美距离甚远,而所有的缺点都是留给读者的课题。这也许不是本系列的最后一篇,因为 JTF 在不断发展,Eclipse 也在不断发展,所以本系列也有可能不断发展,希望本系列能成为你开发过程中的踏脚石,谢谢各位一直阅读到这里,再见。
本文示例源代码或素材下载
更多精彩
赞助商链接