开发透视图插件
Eclipse中的透视图(也称为视角)是一个比较有趣的概念,也非常有用。想象一下,Eclipse是一个插件的大拼图,在同一时间Eclipse如果实现了很多个视图,把这么多个视图同时展现给用户会是什么场景。因为大多的视图同时展现出来,布局一定会很乱,结果肯定是用户不会用Eclipse了。Eclipse中通过透视图来组织视图的显示,解决了视图显示的问题。
简介
如果把所有的视图都在同一时间展现给用户肯定是不行的,一方面,Eclipse在同一时间打开成千上万个视图的效率会很低(效率是Eclipse中的一个关注点),另一方面,如果在同一时间成千上万个视图堆在一块,肯定不美观(而且大多视图在某一时刻用户是不关心的)。
Eclipse通过透视图(也称为视角)很好地解决了这个问题。就如同一个物体,这个物体有很多个面,从一个视角只能看到几个面。Eclipse中同一个视角可以有若干个视图,用户可以通过视角扩展点建立自己的视角,在此视角中包含自己感兴趣的视图,那么当用户选择此视角时,Eclipse就会自动打开此视角中包含的视图(从这个角度说,笔者觉得视角这个词可能较为准确)。
可以通过“Window”→“Open perspectives”→“Other”打开选择透视图的对话框,如图1所示。
图1 选择透视图
在Eclipse中,用户能够扩展Eclipse的扩展点实现自己的透视图,也可以实现扩展点把自己的视图加入到其他的透视图中,后面将简单介绍如何通过这两个方法实现透视图。
提示:透视图只包含视图的引用,当选择了透视图后,此透视图会自动打开透视图中包含的视图引用。如果视图还未初始化,Eclipse会负责初始化此视图。一个透视图可以包含多个视图,一个视图也可以属于多个透视图。
扩展透视图
在Eclipse中,用户可以建立自己的透视图,把感兴趣的视图展现在自己的透视图中,也可以把自己的视图放在已经建立的透视图中。“org.eclipse.ui.perspectiveExtensions”为用户提供了把自己的视图放入相应透视图的扩展。
例如用户有这样的场景:当切换Eclipse的Resource透视图后要显示用户的视图,如图2所示。
图2 Resource透视图
当切换到Resource透视图后,Eclipse会自动把“Sample View”视图放在相应的位置。这就要求实现“org.eclipse.ui.perspectiveExtensions”扩展点。
“org.eclipse.ui.perspectiveExtensions”扩展点没有实现类,此扩展点只是作为一个描述,告诉Eclipse怎样对Eclipse中的相应透视图进行布局。此扩展点有几个比较重要的描述信息:一是目标透视图的ID号,表示要对哪一个透视图的布局进行重定义;还要指定视图的ID,表示把哪一个视图的引用放入目标透视图;另外要指定视图在透视图中的相应位置。
建立一个“org.eclipse.ui.perspectiveExtensions”扩展的步骤如下。
1. 在Extensions页中添加一个“org.eclipse.ui.perspectiveExtensions”的扩展。
2. 在“org.eclipse.ui.perspectiveExtensions”节点中添加一个“perspectiveExtension”节点,并指定它的targetID属性为“org.eclipse.ui.resourcePerspective”(表示Resource透视图的ID),如图3所示。
图3 目标透视图
3. 在“perspectiveExtension”节点下建立一个view节点,并设置好view节点的属性,通过这些属性可以设置指定视图在指定透视图中的位置,如图4所示。
图4 视图节点属性
视图节点属性解释如下。
id:表示放入目标透视图的视图ID号。
relative:相关视图的ID号(即和哪一个视图放在同一个区域)。
relationship:放在区域的什么位置。
ratio:视图在区域中的百分比。
visible:如果视图没有被初始化,第一次打开透视图是否初始化此视图并显示。
closeable:视图是否可关闭。
moveable:视图是否可移动。
standalone:是否是孤立的视图(即视图是否可以和其他视图放在一起)。
showtitle:是否显示标题。
“perspectiveExtension”扩展点相当于起到把透视图和视图ID绑定的作用,这样,Eclipse会通过透视图找到视图的引用。这种手法在Eclipse中是比较常见的。本例源程序可参考本书附带光盘,扩展点定义文件如例程1所示。
例程1 plugin.xml
<plugin>
…
<extension
point="org.eclipse.ui.perspectiveExtensions">
<perspectiveExtension
targetID="org.eclipse.ui.resourcePerspective">
<view
closeable="false"
id="com.free.proj.persperctivetest.views.SampleView"
moveable="false"
ratio="0.5"
relationship="right"
relative="org.eclipse.ui.views.TaskList"
visible="false">
</view>
</perspectiveExtension>
</extension>
…
</plugin>
提示:用户不但可以把视图放到相应的透视图,也可以把“ActionSet”之类的扩展放入相应的透视图。
实现透视图
上面介绍了如何把自己的视图放入已有的透视图中,但是用户如果想建立自己的透视图应该如何实现呢?这就要求用户实现“org.eclipse.ui.perspectives”扩展点,步骤如下。
1. 在清单文件的Extensions页添加“org.eclipse.ui.perspectives”节点。
2. 在“org.eclipse.ui.perspectives”节点建立perspective节点,并设置相应的属性,如图5所示。
图5 perspertive节点属性
perspertive节点属性解释如下。
id:透视图的ID号。
name:透视图的名称。
class:透视图扩展点的实现类。
icon:透视图的图标。
透视图扩展点的描述信息如下。
<extension
point="org.eclipse.ui.perspectives">
<perspective
class="com.free.proj.persperctivetest.PerspectiveFactory"
id="com.free.proj.persperctivetest.perspective"
name="persperctive test"/>
</extension>
在此透视图中,实现类为“PerspectiveFactory”。透视图的实现类要求实现“IPerspectiveFactory”接口,通过createInitialLayout(IPageLayout layout)方法实现透视图中视图的布局。用户可以通过layout参数添加视图到当前的透视图中,如例程2所示,添加了一个ID为“com.free.proj. persperctivetest.views.SampleView”的视图到当前透视图。
例程2 PerspectiveFactory.java
package com.free.proj.persperctivetest;
import org.eclipse.ui.IPageLayout;
import org.eclipse.ui.IPerspectiveFactory;
public class PerspectiveFactory implements IPerspectiveFactory {
public void createInitialLayout(IPageLayout layout) {
layout.setFixed(true);
layout.addView("com.free.proj.persperctivetest.views.SampleView",
IPageLayout.LEFT, 0.5f,
IPageLayout.ID_PROBLEM_VIEW);
layout.setEditorAreaVisible(true);
}}
IPageLayout的addView方法定义为“public void addView(String viewId, int relationship, float ratio, String refId);”,参数解释如下。
viewId:被添加到透视图中的视图ID号。
relationship:放在区域的什么位置。
ratio:视图在区域中的百分比。
refId:相关视图的ID号(即和哪一个视图放在同一个区域)。
打开选择透视图的对话框,可以看到“persperctive test”透视图,选择“persperctive test”透视图,如图6所示。
图6 “persperctive test”透视图
上例创建了用户自定义的透视图,在透视图中只添加了一个视图,如果在一些比较大的项目中,可能还会用到很多的视图,以及Eclipse原有的视图。用户也可以把这些视图添加到自定义的透视图中,只需要知道这些视图的ID即可。