`
hqs7636
  • 浏览: 221178 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

基于 JFace Text Framework 构建全功能代码编辑器: 第 3 部分

阅读更多
Double Click 和 Triple Click
developerWorks
https://www.ibm.com/developerworks/cn/opensource/os-cn-ecljtf3/

文档选项
将打印机的版面设置成横向打印模式

打印本页
将此页作为电子邮件发送

将此页作为电子邮件发送


样例代码

级别: 中级

马 若劼 (maruojie@cn.ibm.com), 软件工程师, IBM 中国软件开发中心

2008 年 3 月 27 日

    Double Click(双击)和 Triple Click(三击)是方便用户选择文本(当然不一定非得是选择文本)的辅助功能。本文介绍在 JTF 里面如何自定义双击行为,以及如何为 JTF 添加三击支持。

Double Click(双击)和 Triple Click(三击)是方便用户选择文本(当然不一定非得是选择文本)的辅助功能。本文介绍在 JTF 里面如何自定义双击行为,以及如何为 JTF 添加三击支持。

Double Click

在 Eclipse 的 Java 编辑器中,用户用鼠标在编辑区域双击时,可以看到双击处的单词会被选中,这就是 JTF 的 Double Click(双击)特性。双击时触发的动作是可以自定义的,不一定非要选择一段文本。

与双击相关的接口是 ITextDoubleClickStrategy,它只有一个方法叫做 doubleClicked,只要实现这个接口就可以了,在例子中,我添加了 ExprDoubleClickStrategy 类:

清单1. ExprDoubleClickStrategy 实现了 ITextDoubleClickStrategy 接口

               
public class ExprDoubleClickStrategy implements ITextDoubleClickStrategy {
public void doubleClicked(ITextViewer viewer) {
// get doc
IDocument doc = viewer.getDocument();

// get token list
TokenList tokenList = TokenManager.getTokenList(doc);

// get double click position
int offset = viewer.getSelectedRange().x;

// get token in that offset
CommonToken token = tokenList.getToken(offset);

// select whole token if token is not null
if(token != null && token.getType() != Token.EOF)
{
// select double clicked token
viewer.setSelectedRange(
token.getStartIndex(), token.getStopIndex() - token.getStartIndex() + 1);
}
}
}


这个流程非常直接,得到被点击的位置,通过位置得到相应的符号,然后选择整个符号。我们再次利用了 TokenList 来得到指定字符偏移处的符号。

和本系列第二部分一样,有了实现还得让 JTF 知道你的实现,我们再来修改 ExprConfiguation,覆盖一个 getDoubleClickStrategy 方法:

清单2. 让 JTF 知道你的 Double Click 实现

               
      public ITextDoubleClickStrategy getDoubleClickStrategy(
        ISourceViewer sourceViewer, String contentType)
{
    return new ExprDoubleClickStrategy();
}


只是简单的返回我们实现的 ITextDoubleClickStrategy 而已,这样 JTF 就知道我们的双击行为了,注意双击行为也是和文本类型绑定到一起的,但是我们只有一种类型,所以没有利用这个信息。

读者可以尝试本文的例子,双击某个变量,看看是否这个变量被全部选中了。




回页首


Triple Click

有了双击,可能自然就会想到三击。但是 JTF 本身是不支持三击行为的。我们需要自己实现,只要模仿双击的机制来做就可以了。

接口

模仿双击的处理方式,我们也添加一个 ITextTripleClickStrategy 接口,如下所示:

清单3. 模仿 Double Click,创建 ITextTripleClickStrategy 接口

               
      public interface ITextTripleClickStrategy {
/**
* Invoked when triple clicking detected
*/
public void tripleClicked(ITextViewer viewer);
}


然后我定义了 ExprTripleClickStrategy,它实现了 ITextTripleClickStrategy 接口。为了简单起见,我不添加具体代码了,只是显示一个对话框表示三击事件被我们捕捉到了。三击的时候具体做什么,读者有兴趣可以自己完成。

配置

下一步就是让 JTF 知道我们的三击策略,不过 SourceViewerConfiguration 没有和三击有关的方法,我们可以模仿 getDoubleClickStrategy 的形式添加一个 getTripleClickStrategy 方法,然后修改 ExprViewer 的 configure 方法,把三击策略安装上去。其实就是一个哈希表,里面把文本类型和三击策略映射了起来。这些代码都是模仿 SourceViewer 中对双击策略的处理方式写的,所以就不一一列举了。

事件的触发

最后的一步是触发三击事件,不然你装多少个三击策略也没用。从原理上说,三击事件就是鼠标双击之后又点了一下,我们可以监听双击事件,然后在下一次鼠标单击时检查其和双击事件的时间间隔,如果小于一个阈值,就触发三击事件。所以为了触发三击事件,我们需要给 ExprViewer 安装一个鼠标事件监听器:

清单4. 给 ExprViewer 添加三击事件触发机制

               
      // How long we can wait for triple click after double click
public static final long TRIPLE_CLICK_THRESHOLD = 500;

private class TripleClickStrategyConnector extends MouseAdapter {
private long doubleClickTime;

public TripleClickStrategyConnector() {
doubleClickTime = 0;
}

@Override
public void mouseDoubleClick(MouseEvent e) {
doubleClickTime = System.currentTimeMillis();
}

@Override
public void mouseDown(MouseEvent e) {
// compare time interval with threshold
  if (System.currentTimeMillis() - doubleClickTime <= TRIPLE_CLICK_THRESHOLD) {
  ITextTripleClickStrategy strategy = (ITextTripleClickStrategy) selectContentTypePlugin(
getSelectedRange().x, tripleClickStrategies);
if (strategy != null) {
strategy.tripleClicked(ExprViewer.this);
}
}

// clear double click time to avoid trigger triple click more than once
doubleClickTime = 0;
}
}


上面的代码实现了我所描述的逻辑,如果检测到三击事件,我们通知 ITextTripleClickStrategy。

到这里为止,我们的三击流程就跑完了。当然不止是三击,四击五击以至 N 击,就都可以这样实现了。




回页首


结束语

运行本文的例子之后会发现,三击后对话框确实出来了,但是文本选择区域发生了变化。这是因为 StyledText 内部做了一些事情,处理了我们的鼠标事件,如果完整的实现 ITextTripleClickStrategy 接口并设置我们想要的选择范围,这样的情况就不会出现了。至于三击之后可以做什么,我可以提供一个建议:以语句”abcde = 12345;”为例,双击 abcde 会选中 abcde,三击 abcde 则可以选中这条语句,即到分号为止的地方。我们可以从三击位置做一个扫描,直到前后碰到分号为止,有兴趣的读者可以尝试完善这个功能。




回页首


声明

本文仅代表作者的个人观点,不代表 IBM 的立场。





回页首


下载
描述 名字 大小 下载方法
第三小节示例代码 jtf.tutorial.part3.zip 1130KB HTTP
关于下载方法的信息


参考资料

    * 如果对 ANTLR 有更多的兴趣,请参考“ANTLR 项目主页”

    * “SWT 和 JFace,第 1 部分: 简介”(developerWorks 中国,2005 年 5 月)介绍了 JFace 基础知识。
分享到:
评论

相关推荐

    基于_JFace_Text_Framework_构建全功能代码编辑器

    ### 基于_JFace_Text_Framework_构建全功能代码编辑器 #### 引言与概述 _JFace_Text_Framework_(简称JTF),作为Eclipse平台的重要组成部分,为开发者提供了构建高度定制化的代码编辑器的强大能力。JTF不仅支撑了...

    JFace Text Framework教程

    总结来说,IBM的JFace Text Framework教程为开发者提供了一个强大且灵活的工具,用于构建功能丰富的文本编辑器。通过学习和实践,开发者可以掌握如何利用这个框架来提升开发效率,创建出专业级的IDE(集成开发环境)...

    eclipse与MyEclipse代码提示上屏修改后jar包(org.eclipse.jface.text_3.8.101.v20130802-1147)

    标题提及的"org.eclipse.jface.text_3.8.101.v20130802-1147"是Eclipse中的一个关键组件,它负责文本编辑器的相关功能,包括代码提示。 `org.eclipse.jface.text`是Eclipse JFace库的一部分,JFace是构建用户界面的...

    jface.text 3.12.1.zip

    本文将围绕"jface.text 3.12.1.zip"这一特定的Eclipse插件进行深入探讨,该插件是Eclipse文本编辑器的重要组成部分,对于提升Java代码补全体验有着至关重要的作用。 首先,"jface.text"是Eclipse的Java Face (JFace...

    org.eclipse.jface.text_3.12.2.v20180112-1341.zip

    标题中的"org.eclipse.jface.text_3.12.2.v20180112-1341.zip"是Eclipse插件的一个版本,它专注于文本编辑功能。Eclipse是一个开源的集成开发环境(IDE),而JFace是Eclipse的一部分,提供了面向用户的界面组件。...

    org.eclipse.jface.text_3.11.2.v20170220-1911最新修改版

    JFace Text是Eclipse中的一个API,它是构建文本编辑器的基础,提供了文本编辑、搜索、替换、高亮等基本功能。在这个特定的版本中,开发者们对JFace Text进行了优化,特别是对于用户输入行为的处理,比如取消了空格和...

    org.eclipse.jface.text_3.12.2.v20180112-1341.jar

    Eclipse JFace Text是Eclipse IDE中的一个核心组件,它提供了高级文本编辑功能,广泛用于构建用户界面中的文本编辑器。这个特定的版本号表明它是该组件的一次更新迭代,可能包含错误修复、性能提升或其他新特性。 ...

    基于WTP开发自定义的JSP编辑器

    了解和利用WTP中与插件开发相关的其他关键概念,如JFace Text Framework和Eclipse Editor Framework,可以帮助进一步优化编辑器的性能和用户体验。 #### 五、总结 基于WTP开发自定义的JSP编辑器是一个综合性的工程...

    org.eclipse.jface.text_3.8.2.v20121126-164145源码

    深入研究这部分源码,不仅可以提升对Eclipse JFace的理解,也有助于提升开发者在构建文本编辑器组件时的定制能力。同时,这也提醒我们,源码的修改应遵循良好的编程实践,确保软件的稳定性和可维护性。

    org.eclipse.jface.text_3.7.2.v20111213-1208.jar

    《Eclipse JFace Text库与MyEclipse 10.0.0的编辑器功能优化》 在IT行业中,开发工具的效率与便利性对于程序员的工作至关重要。Eclipse作为一款广受欢迎的开源集成开发环境(IDE),其强大的扩展性和自定义能力一直...

    org.eclipse.jface.text_3.9.2.v20141003-1326.zip

    这个插件是JFace Text组件的一部分,JFace是Eclipse工作台(Workbench)框架的一个子项目,它提供了基于SWT(Standard Widget Toolkit)的高级用户界面构建工具。版本号"3.9.2"表明这是该插件的第三个主要版本的第九...

    Eclipse SWT/JFace 核心应用的全部源代码

    JFace包括数据绑定、视图管理、对话框和服务等组件,它将许多复杂的SWT操作进行了封装,例如表格和树的数据模型、表单编辑器等。通过研究JFace的源代码,开发者可以学习到如何优雅地组织用户界面,提高代码的可读性...

    MyEclipse10.7.1代码补全vs风格 jface.text修正版

    因为10.7.1已经完美破解(修正了war文件到处问题),故放上该版本修改过的org.eclipse.jface.text_3.7.2.v20111213-1208.jar 代码补全空格不上屏,适合习惯使用vs等工具的用户 详细描述参见10.0时的插件 ...

    jface源代码不容错过

    7. **视图和编辑器的实现**:Eclipse RCP中的视图和编辑器是通过JFace实现的,源代码能帮助我们理解这两者如何在RCP环境中协同工作。 总之,研究JFace的源代码不仅可以帮助开发者深入理解Eclipse RCP的工作原理,还...

    JFace教程

    **JFace** 是 Eclipse 平台的一个重要组成部分,它提供了一套丰富的 API 来帮助开发者构建基于 SWT(Standard Widget Toolkit)的用户界面。JFace 的核心目标是简化 GUI 开发流程,使开发者能够更加专注于应用程序...

    Eclipse SWT/JFACE 核心应用 配套源代码

    3. **核心应用**:在"核心应用"的标题中,我们可以期待看到一些基础和关键的GUI应用场景,比如文件浏览器、数据编辑器、配置管理器等。这些应用通常涉及到事件处理、模型-视图-控制器(MVC)设计模式、数据管理等...

    Eclipse SWT&JFace开发实战精解 源代码

    Eclipse SWT(Standard Widget Toolkit)和JFace是Java编程中用于构建桌面应用程序的两个关键库。它们都是Eclipse IDE的一部分,提供了丰富的用户界面组件和高级的UI设计工具。本篇文章将深入探讨这两个库的核心概念...

    SWT,JFACE核心应用源代码,第二部分.rar

    在"SWT,JFACE核心应用源代码,第二部分.rar"这个压缩包中,我们可以预期找到一系列关于SWT和JFace实际应用的源代码示例。这些示例可能涵盖了如何使用SWT创建基本和复杂的用户界面元素,如何利用JFace进行数据绑定,...

    swt JFace的API文档

    7. **Views and Editors**:JFace 提供了用于构建工作台视图和编辑器的框架,支持多窗口和多页编辑环境。 8. **Control Adapters**:这些适配器类可以添加额外的功能,例如在控件上添加右键菜单。 9. **Bindings ...

    org.eclipse.jface.text_3.12.0.v20170523-1043.jar

    总的来说,Eclipse JFace Text模块是Eclipse IDE中不可或缺的一部分,它提供了丰富的文本编辑功能,尤其是自动补全特性,大大提升了开发效率。版本3.12.0.v20170523-1043的JFace Text可能包含了一些优化和改进,使得...

Global site tag (gtag.js) - Google Analytics