<%@ page contentType="text/html; charset=gb2312"%> 基于 JFace Text Framework 构建全功能代码编辑器:第 8 部分:Hyperlink
网站公告:   ◆北天JAVA技术网热情为java爱好者服务,本网内容包括JAVA(JSP、servlet、EJB、webservice、j2ee、javabean、应用服务器、JavaScript),数据库(MYSQL、SQL Server、Sybase、Oracle、DB2、数据库综合知识),设计研究(设计模式、Struts、Spring、Hibernate、设计框架、设计综合知识),WEB2.0新技术(主要介绍AJAX),以及各种技术的入门、实例、例子等等,欢迎各位多来坐坐!◆  诚邀各位JAVA爱好者加盟!◆  本网站内容丰富,更新快,保证每周20篇以上!  
加入收藏
设为首页
联系站长
承接项目
  相关资源:网站首页 | 免费培训学院 | 技术论坛 | JAVA聊天室 | 作家专栏 | 开发工具 | 认证考试 | 会员俱乐部
  JAVA技术初学者园地 | jsp与servlet | javascript | Java源代码 | EJB | web service | 应用服务器 | JAVA综合知识
  设计研究设计模式 | 设计框架 | Struts | Spring | Hibernate | 开源项目 | 面向对象设计 | 设计综合知识
  数 据 库MYSQL | SQL Server | Sybase | Oracle | DB2 | Informix | Access | 数据库综合知识
  其他资源:AJAX新技术 | 网站开发 | ERP软件 | OA办公软件 | 商业智能BI | 开发综合知识 | 承接项目 | 项目试用

 
 
基于 JFace Text Framework 构建全功能代码编辑器:第 8 部分:Hyperlink
     发布者: 发布时间:2008-05-06

Hyperlink

Hyperlink(超链接)在 Java 编辑器中用来进行快速的代码定位,当你按住 Ctrl 键并把鼠标指向一个函数名的时候,函数名会显示为超链接,点击之后代码会跳转到函数的声明处。这个功能使得 Eclipse 浏览代码很方便,这次我就来介绍如何在自己的编辑器中添加超链接功能。

超链接的定位

编辑器不会知道哪块区域应该显示为超链接,这是通过 IHyperlinkDetector 接口实现的。这里牵涉到语义方面的内容,因为你必须要能知道鼠标下面到底是个什么。在解析器那一层需要实现这样的支持。

超链接的渲染

JTF 是如何显示超链接的?可能你会想到标注,缺省的实现不是这样。这里要介绍另外一个接口:IHyperlinkPresenter。JTF 缺省的时候是用 StyledText 的 StyleRange 实现的,其实就是把超链接的那块文字置为蓝色且带下划线。但是因为有了这么一个接口,你可以把超链接弄成任何样子。





回页首


实现超链接

本文要实现的超链接功能是:点击某个变量名,编辑器会选中声明该变量的那条语句。

底层支持

底层需要支持两个功能:判断某个位置是一个变量,以及得到变量声明的语句范围。由于我的例子很简单,判断是不是变量也非常简单,只要符号类型是一个 ID 类型就行了。得到变量声明的语句范围需要检查语法树,因为变量声明的子树以等号为根节点,所以找到对应的根节点就行了。然后从等号开始得到子树的最左和最右节点,从而计算出整个子树的字符范围。这些代码已经添加到了 TreeHelper 中,具体请参看 getVariableDeclaration 和 getTreeRange 方法。

实现 IHyperlink

我实现了一个 VariableHyperlink 来封装超链接信息,它最重要的方法是 open(),因为它会在你点击超链接后被调用:


清单1. VariableHyperlink 的 open 方法
public void open() {
// get doc
IDocument doc = viewer.getDocument();

// get tree
Tree tree = TreeManager.getTree(doc);

// get variable declaration range
Point range = TreeHelper.getVariableDeclaration(tree, variable);

// select text
if(range != null) {
viewer.setSelectedRange(range.x, range.y);
viewer.revealRange(range.x, range.y);
}
}

我用到了刚才提到的 TreeHelper 中的方法来得到声明语句的范围,剩下的事情就比较直接了,选择这个范围并让确保其在编辑器中可见。

实现 IHyperlinkDetector

ExprHyperlinkDetector 完成了发现变量的功能,然后把变量信息包装在 VariableHyperlink 中。在之前的文章中,我已经不止一次的使用了 TokenList 来得到某个偏移处的符号,ExprHyperlinkDetector 也依赖于 TokenList,所以这里不详细解释了。

配置

覆盖 ExprConfiguration 的 getHyperlinkDetectors,让它返回 ExprHyperlinkDetector。它的返回值是一个数组,所以你可以安装多个 IHyperlinkDetector 实例。对于这个简单的小例子,并无必要使用多个 IHyperlinkDetector 实例。




(转载文章请保留出处:北天JAVA技术网(www.java114.com))
 
更多精彩文章:
关于能提高Java代码可重用性的三个措施
Spring中的四种声明式事务的配置
JVM深度
初学者需要掌握的数据库设计词汇对照表
数据库结构中不可缺少的交易日志
由浅入深讲解数据库中Synonym的使用方法
 
最近评论:
        
鍥炲
        
标 题:   
内 容:   
 
                                  
 
免责声明:该文章由网友发表,如果对您造成侵权,请联系站长

首页 - 承接项目 - 网站地图 - 联系我们 -
版权所有北天JAVA技术工作室 ICP证号:粤ICP备06079815号