在Eclipse里自带了团队协作客户端CVS;另外还有好几个SVN的插件可以用。
当使用这些插件时,可以方便的进行同步、提交、更新等操作。
如果比较了CVS与SVN的实现成使用方式就会发现它们大同小异。这里因为和eclipse提供的其他功能一样,在eclipse里有一个专门提供团队协作的插件Team。而CVS和SVN就是通过实现这个Team的扩展来提供协作功能。
因此,如果我们想在eclipse里提供一个自己的协作实现,毫无疑问,也需要通过扩展这个team来实现。
(我理解部分):一般来说,一个资源在同步视图中通常有以下几种情况:
- 1.同步中
- 2.可提交
- 3.可更新
- 4.本地增加
- 5.本地删除
- 6.远程增加
- 7.远程删除
- 8.冲突中
要想实现这些状态的正确显示,我们需要一些东西来得到这些状态。在Team框架里,他是通过三类对象进行比较来得到这些状态:
- 1.本地资源 Local
- 2.记录资源 Base
- 3.远程资源 Remote
同步时分两步进行操作:首先判断base和remote是否存在,用以判断增删状态;如果都存在,则分别用base同local的比较和base和remote的比较来得到关系剩余的状态。
这两步在类:ResourceVariantTree 和 IResourceVariantComparator 中实现,所以我们需要提供自己的这两个类的实现。
得到了同步状态之后,需要做的就是操作的实现了。默认情况下同步视图会有一些默认的菜单,如果我们要对这些默认的菜单提供实现,那我们要实现以下类:SubscriberMergeContext。
除此之外,通常我们要有自己的操作实现,例如:提交、更新等等。
这个我花了一小段时间才找着路子。首先我们要提供一个扩展,在plugin.xml里声明一些插件入,例如:
<extension point="org.eclipse.ui.navigator.viewer"> <viewer viewerId="#viewId"> <popupMenu allowsPlatformContributions="false" id="#menuId"> <insertionPoint name="file"/> <insertionPoint name="file-bottom"/> <insertionPoint name="edit" separator="true"/> <insertionPoint name="synchronize"/> <insertionPoint name="navigate" separator="true"/> <insertionPoint name="update" separator="true"/> <insertionPoint name="commit" separator="false"/> <insertionPoint name="overrideActions" separator="true"/> <insertionPoint name="otherActions1" separator="true"/> <insertionPoint name="otherActions2" separator="true"/> <insertionPoint name="changeSetActions" separator="true"/> <insertionPoint name="sort" separator="true"/> <insertionPoint name="additions" separator="true"/> <insertionPoint name="properties" separator="true"/> </popupMenu> </viewer> </extension>
这里这个viewerId比较重要,它是之后我们的操作找到插入点的中介。
声明了这些插入点之后,在同步视图的右键菜单中就会新建这些group,最后我们的菜单就可以加到对应的group里了。
菜单的实现在ModelSynchronizeParticipant中提供。这是一个participant类,每个提供协作实现都需要扩展org.eclipse.team.ui.synchronizeParticipants扩展点,然后提供一个实现类,那个实现类就可以继承这个ModelSynchronizeParticipant类。
在这个类中,我们要注册上面扩展的viewerId和contextMenuId绑定,如下:
protected void initializeConfiguration(ISynchronizePageConfiguration configuration) {
configuration.setProperty(ISynchronizePageConfiguration.P_VIEWER_ID, VIEWER_ID);
super.initializeConfiguration(configuration);
}
然后再实现以下方法:
protected ModelSynchronizeParticipantActionGroup createMergeActionGroup() {
return new WorkspaceMergeActionGroup();
}
完了以后,在WorkspaceMergeActionGroup里定义的菜单就可以实现了。具体菜单的执行就不需要说了。