基于 JFace Text Framework 构建全功能代码编辑器: 第 3 部分:Double Click 和 Triple Click
2010-03-18 00:00:00 来源:WEB开发网配置
下一步就是让 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 则可以选中这条语句,即到分号为止的地方。我们可以从三击位置做一个扫描,直到前后碰到分号为止,有兴趣的读者可以尝试完善这个功能。
本文示例源代码或素材下载
更多精彩
赞助商链接