当前位置: 代码迷 >> Eclipse >> Eclipse改动资源文件扩展
  详细解决方案

Eclipse改动资源文件扩展

热度:7   发布时间:2016-04-23 02:17:19.0
Eclipse更改资源文件扩展
        目前的Widget编辑器项目中有个需求,对于Project下面的文件进行移动,重命名等操作,相关的文件也要对链接描述进行修改。
        比如html文件里有一行<script type="text/javascript" src="ddd.js"/>,如果我们在Eclipse里把ddd.js重命名为aaa.js,那么这行也要相应改为<script type="text/javascript" src="aaa.js"/>。
        处理思路其实也很简单,对应所有此类重命名移动等IResource的操作,记录其文件名和路径,然后读取Project下的其他文件,将对应的文件链接的字符进行修改即可,如果不考虑相对路径的话,那这个需求的困难点就仅在于如何捕捉此类操作。
        需要捕获的操作大概有这些:1.右键点击文件或文件夹选择rename,同按F2 2.右键点击文件或文件夹选择move 3.直接拖拽文件或文件夹到别的目录 4.右键点击文件或文件夹选择delete,同按Delete键  下面是依次扩展点的介绍
        重命名扩展点首先要导入org.eclipse.ltk.core.refactoring包,这个包也是下面一些扩展点需要导入的,然后就可以再扩展点里增加renameParticipants扩展,按照提示定义一个扩展自RenameParticipant的类即可。对于本需求,还需要对扩展点加以特化,只针对文件重命名进行处理
<extension         point="org.eclipse.ltk.core.refactoring.renameParticipants">      <renameParticipant            class="xxx.MyRenameParticipant"            id="xxx.MyrenameParticipant1"            name="MyrenameParticipants">	      <enablement>		      <with variable="element">		      	<instanceof value="org.eclipse.core.resources.IResource"/>		      </with>		  </enablement>  	  </renameParticipant>   </extension>

代码中着重重写protected boolean initialize(Object element),elemet参数将为File类型,可以获得新的文件名,旧文件名则可以通过getArguments方法获取,具体改名就不累述了。

        move扩展点原理与rename类似,除了需要导入相同的包之外,增加扩展点的步骤和代码的重写都是类似的,不过扩展点名为moveParticipants,这里也不累述了。

        当我先实现3和4的时候,发现上述的重构相关的扩展点已经用不上了,而是需要实现IMoveDeleteHook接口,很有意思的是,这里实际上可以处理重构时候的重命名和移动,区别仅在于moveFile的updateFlags参数。
        首先我们要导入org.eclipse.team.core包(根据项目情况还需要导入org.eclipse.core.resources),然后就可以在扩展点中增加repository扩展点了
<extension         point="org.eclipse.team.core.repository">   <repository         class="xxx.MyRepositoryProvider"         id="xxx.myProviderID">   </repository></extension>

注意上面的id,然后在继承自RepositoryProvider的类时着重重写两个方法,即public String getID()和public IMoveDeleteHook getMoveDeleteHook()。前一个就需要返回扩展点的id,此例中为"xxx.myProviderID",而getMoveDeleteHook方法获得的hook就是实际工作的类,自己实现一个即可。
        还需要注意的是,我们必须把Project和定制的RepositoryProvider关联起来,使用RepositoryProvider的静态方法map(IProject project, String id),参数id也就是上面配置文件里的id,自此,便可以实现移动和删除文件的hook了。
        最后说一点,我在实现hook时走了个弯路,因为导入resources的包后就直接提供了moveDeleteHook的扩展点,但如果添加了这个扩展点则会导致WorkSpace的initializeMoveDeleteHook方法中找到两个hook代理,而只要代理超过一个,WorkSpace就会一个都不采用转而创建一个默认的代理,当然也无法实现我们想要的功能了。
  相关解决方案