- 浏览: 224427 次
- 性别:
- 来自: 北京
-
文章分类
最新评论
-
dysking:
SWT 和 JFace -
wangyuhfut:
东西不少啊。学习中。。。
一个比较好、中文说明的emacs配置文件 1 -
pacocai:
呵呵!学习,学习~~~不过要说编辑器的话个人更喜欢用VIM,比 ...
一个比较好、中文说明的emacs配置文件 1 -
zhf1zhf2:
这两百多个记起来也不容易啊
英国人是这样背的! -
regex:
试了两次,都是乱码,版本是23.1.1,看来不适合
汉化 Emacs 菜单
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 基础知识。
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 构建全功能代码编辑器: 第 7 部分:
2009-05-17 16:18 1095https://www.ibm.com/developerwo ... -
基于 JFace Text Framework 构建全功能代码编辑器: 第 6 部分:Text Ho
2009-05-17 16:17 1324https://www.ibm.com/developerwo ... -
基于 JFace Text Framework 构建全功能代码编辑器: 第 5 部分:
2009-05-14 17:32 1270https://www.ibm.com/developerwo ... -
基于 JFace Text Framework 构建全功能代码编辑器: 第 4 部分
2009-05-14 17:31 1563Content Assistant developerWor ... -
实战SWT布局
2008-12-08 00:55 1438标准的SWT布局类 FillLayou ... -
SWT布局
2008-12-08 00:53 1188另外参见:http://java.chinaitlab.com ... -
基于 JFace Text Framework 构建全功能代码编辑器: 第 2 部分
2008-11-19 18:12 1274Syntax Highlight developerWork ... -
基于 JFace Text Framework 构建全功能代码编辑器: 第 1 部分
2008-11-19 18:11 1230级别: 中级 马 若劼 (maruojie@cn.ibm.c ... -
SWT 和 JFace, 第 2 部分: 简介
2008-11-19 18:06 1202http://www.ibm.com/developerwor ... -
SWT 和 JFace,第 1 部分: 简介
2008-11-19 18:04 1210http://www.ibm.com/developerwor ... -
基于 JFace Text Framework 构建全功能代码编辑器: 第 8 部分:
2008-11-19 03:54 0https://www.ibm.com/developerwo ... -
基于 JFace Text Framework 构建全功能代码编辑器: 第 10 部分:Text F
2008-11-19 03:50 0https://www.ibm.com/developerwo ... -
基于 JFace Text Framework 构建全功能代码编辑器: 第 11 部分:
2008-11-19 03:48 0https://www.ibm.com/developerwo ... -
基于 JFace Text Framework 构建全功能代码编辑器: 第 9 部分:Templa
2008-11-19 03:23 0基于 JFace Text Framework 构 ... -
JFace Text Editor完全掌握之终极指南
2008-06-13 01:57 1939JFace Text Editor是JFace里面一个功能强大 ... -
JFace 视图
2008-06-13 01:49 1193http://blog.itpub.net/post/5050 ... -
SWT的体系结构
2008-06-13 01:18 1265http://flyingbug.blogdriver.com ... -
SWT 全接触
2008-06-13 01:15 1819http://blog.csdn.net/DL88250/ar ... -
细说:AWT,SWT,Swing
2008-06-13 00:42 2099http://www.java3z.com/cwbwebhom ... -
SWT的--键盘事件处理
2008-06-12 21:51 2384http://203.208.37.104/search?q= ...
相关推荐
### 基于_JFace_Text_Framework_构建全功能代码编辑器 #### 引言与概述 _JFace_Text_Framework_(简称JTF),作为Eclipse平台的重要组成部分,为开发者提供了构建高度定制化的代码编辑器的强大能力。JTF不仅支撑了...
- 利用RCP架构组织应用的各个部分,如工作台视图、编辑器、透视图等。 - 调试和测试Eclipse插件,确保其在不同环境下正常运行。 通过深入研究这些实例代码,开发者不仅可以提升Eclipse插件开发技能,还能了解到如何...
3. **代码编辑器**:Eclipse的代码编辑器提供了丰富的代码提示、自动完成、语法高亮、错误检查等功能,极大地提高了开发效率。 4. **构建工具(Builder)**:Eclipse内置了Java编译器,可以自动检测源代码变化并...
4. **透视图(Perspectives)、视图(Views)、编辑器(Editors)和操作(Actions)**:这些是Eclipse插件开发中的基本元素,它们构成了用户界面的主要部分。学习如何创建和定制这些组件以提供特定功能。 5. **调试...
【EMF(Eclipse Modeling Framework)2.2.0】:EMF是Eclipse的一个重要组成部分,它基于 OMG 的 MOF(Meta-Object Facility)标准,提供了创建、存储和操作模型的强大工具。2.2.0版本可能引入了对模型版本控制的支持...
这份"eclipsePluginStudyNoteSourceCode"压缩包提供了从第1章到第24章的Eclipse插件开发学习笔记源代码,涵盖了从基础到进阶的全方面知识。 在Eclipse插件开发中,你需要了解以下核心概念: 1. **插件体系结构**:...
首先,书中会介绍Eclipse RCP的基础知识,包括工作台(Workbench)、视图(Views)、编辑器(Editors)、透视图(Perspectives)等核心概念。这些元素构成了Eclipse RCP应用的基本结构,理解它们对于后续的开发至关...
RCP是Eclipse框架的一个重要组成部分,它允许开发者构建功能丰富的桌面应用程序,具有与IDE类似的用户体验。 书中主要涵盖了以下几个关键知识点: 1. **Eclipse RCP基础**:介绍Eclipse RCP的基本概念,包括其架构...
在《Eclipse插件开发 学习笔记 第3篇 高级进阶》中,开发者将会学习到更多高级主题,比如命令框架(Command Framework)、透视图(Perspectives)、视图(Views)、编辑器(Editors)和操作(Actions)。这些是构建...