Navigator 之 linkHelper

http://blog.sina.com.cn/s/blog_560eea89010005ql.html

org.eclipse.ui.navigator.linkHelper是一个提供连接到Editor的扩展点.完成Navigator浏览里面"Link With Editor"的功能.
首先看需求.我们在做产品的时候参照了Eclipse里面JDT PackageExplorer关于Link With Editor的功能描述,要点如下:

当Link With Editor有效时:

1). 双击PackageExplorer中的一个文件时,用已经注册的Editor打开这个文件.单击不打开.

2). 在PackageExplorer中双击一个Java文件里的一个Field或者Method时,如果编辑器没有打开这个文件,则要打开这个文件,但不要求Editor定位到文件中相应的位置,但如果当前文件已经被Editor打开了,那么要像点击了Outline一样,让Editor定位到详细位置.在文本Editor中即这个 Field或者Method所在的行数.像我们这样的GraphicalEditor当然就要选中这个Element.

3). 选择不同文件的Editor,PackageExplorer将更换选项为Editor所指向的文件.

4). 选择Editor中不同的Element,PackageExplorer中不必及时更新选中项,应该由Outline负责这件事情.

概括为双向的查找,所以LinkHelper扩展点的功能类要实现Interfaceorg.eclipse.ui.navigator.ILinkHelper.
该Interface有两个Methods:

更新Package Explorer的选择项.
IStructuredSelection findSelection(IEditorInput anInput);

双击Package Explorer中的Item,要调用这个方法让Editor做出反应
void activateEditor(IWorkbenchPage aPage, IStructuredSelectionaSelection);

当然,现在(Eclipse 3.2Edition)的PackageExplorer是在Navigator架构下工作的,所以其实现机制算是相当标准.条条大路通罗马,在Navigator框架下,不按其机制办事虽然不标准,但也可以完成任务,只不过为后来人创造了一些工作困难罢了.

需求已经明确,下面开始探索完成工作的步径.(老板的要求是两天之内完成这项工作,现在是第一天下班前90分钟,不知道我可以找到什么.希望明天这个时候我已经安心地在做着下一个任务了).

既然PackageExplorer已经实现了Linkhelper,那么看看它的源代码,就应该可以找到其中的奥妙,所以第一步,就是到Eclipse的CVS上面DownLoad源程序.
关于获取CVS设置得到源文件的方法请参见网页:
获取Eclipse源代码的CVS设置

Java开发环境中的PackageExplorer属于JDT项目,JDT项目是Eclipse的内置子项目,所以CVS RepositoryPaths 应该选择/cvsroot/eclipse

Package Explorer实现代码在org.eclipse.jdt.ui项目包中.
打开plugin.xml文件,可以发现其中正是实现了全部的Navigator框架.从Viewer定义到Navigator扩展,和我现在最关心的Linkhelper,一包打尽.

剩下的事情就是阅读代码,找到其中的关节.Ok,我现在开始读代码了,事后会把得到的要领进一步整理出来.现在是十点正,我也很期待,看自己这次能不能按时完成任务:)

LinkHelper扩展点有两个子项.

一个是selectionEnablement,用来注册自己会在哪些类型上面发生作用.当单击这些类型的时候,就会调用被指定的实现了ILinkHelper接口的工具类操作当前IWorkbenchPage的Editors,代码体现在activateEditor(IWorkbenchPage page, IStructuredSelection selection).
另一个是editorInputEnabement,用来注册喜欢的Editor输入.这样可以做到根据Editor的变化改变当前的选择项.代码写在public IStructuredSelection findSelection(IEditorInputinput)中.

Ok,这样两边的变化就都被捕获到了.程序写法可以参见示例项目:org.eclipse.ui.navigator.resources.里面有关于文件和文件编辑器之前LinkHelper的完整代码实例.

实现细节不再详述,现在问题的难点在展开PackageExplorer中的一个Java文件后,双击一个方法或变量就会打开Java CodeEditor并且定位到相应的文档位置.

原来在Viewer中双击鼠标之后,双击事件被程序捕获,该程序首先判断是否有注册了的ICommonActionConstants.OPEN对应的值,如果有,则进行Open操作,比如双击了IFile,就会有一个打开文件的Action去做动作.但是如果是Java文件中的一个方法呢,不是IFile类型,程序要打开编辑器,这是怎么实现的?

带着这样的问题,我找到了ICommonActionConstants.OPEN键的值提供者,在JDT里面是一个ID为org.eclipse.jdt.internal.ui.navigator.PackageExplorerOpenActionProvider
的ActionProvider,隶属于org.eclipse.ui.navigator.navigatorConten扩展点,当然,这个就是注册给PackageExplorer Viewer的Content Binding.

于是所有的注意力都集中在这个OpenProvider是如何实现内容的Open.

在PackageExplorerOpenActionProvider类内部有两个Field, 一个是fOpenAndExpand,类型为IAction,运行时指向一个OpenAndExpand实例.
另一个名字叫做fOpenGroup,运行指向一个OpenEditorActionGroup实例.

研究发现,这两个类的程序写得都很不好看,看了一个小时不知所以然.一气之下关之.
终于数分钟之后,找到了ActionProvider的fillActionBars方法,每次Viewer发生了SelectionChanged,都会叫这个方法,该方法分析选中类型并决定是否把OpenAction加进去,因此在这里做些小手脚,就可以搞定任务了.

方法思路:

如果当前选中的项不是IFile,而是已知的一种IFile解析之后的内容,如一个类成员,这时候我们得到TreeViewer中的路径,从叶结点向上找,找到第一个IFile文件类型,那么这个一定是要打开的文件,然后改变OpenAciotn的当前值为这个IFile,如此双击的时候这个OpenAction便被执行,就完成了双击内容打开一个Editor的工作.至于打开的Editor是否已经存在,存在的Editor要置顶等工作是Action的Run方法自己的事情了.

*关于在TreeViewer中由已知的选中结节,得到整条Path,可以通过:

((TreeSelection)((TreeViewer)viewSite.getSelectionProvider()).getSelection()).getPathsFor(selection.getFirstElement())[0]

得到.


关于双击打开文件的方法已经不是Linkhelper的内容,他们是相互独立的.这里只是做到了顺便提一下.因为所有为公司制作的程序代码需要保护,所以一生在这里不再粘贴.

现在离下班还有15分钟,虽然走了很多弯路,但是本次任务依然顺利完成.

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值