活动

活动是以某种任务为中心的功能的逻辑分组。例如,开发 Java 软件是一种通常由平台用户执行的活动,而 JDT 定义了许多仅在执行此活动时才有用的用户界面添加项(视图、编辑器、透视图和首选项等等)。在了解定义活动的机制之前,让我们先了解如何使用它们来帮助“整理”用户界面。

活动的概念被显示给用户,尽管对于新用户来说也许不是很明显。在平台中启用一项活动时,就会显示与该活动相关联的用户界面添加项。在平台中禁用一项活动时,将不会显示它的用户界面添加项。用户可以使用工作台 > 功能首选项页来根据需要启用和禁用活动。(在用户界面中,活动被称为“功能”,尽管我们在 API 中使用活动这一术语)。

某些用户操作将充当启用活动的触发器点。例如,创建新的 Java 项目就会触发启用 Java 开发活动。因此,当用户需要新功能时就会向用户显示新功能,用户会逐渐了解为他们提供的活动以及这些活动如何影响用户界面。当用户首次启动平台时,希望尽可能多地禁用活动,以使应用程序尽可能地简单。在欢迎页面中所作的选择可以帮助确定应该启用哪些活动。

活动与透视图

我们已经知道(在透视图中)如何使用透视图来将不同的视图布局和操作集组织到任务中。我们为什么需要活动呢?虽然透视图与活动定义相似种类的任务,但它们之间的主要区别在于插件的用户界面添加项如何与它们相关联。用户界面添加项在添加项的扩展定义中与透视图相关联。即,插件负责确定它的视图和操作集属于哪些透视图。插件也可以自由地定义它们自己的透视图。即使当透视图不活动时,用户也可以通过诸如显示视图之类的命令来访问与透视图相关联的视图和操作。

活动是更高级别的组织。各个用户界面添加项并不知道活动,并且不会在它们的扩展定义中引用活动。并且,活动被期望在更高级别(例如,平台集成/配置或产品安装)进行配置。除非插件是由系统集成器定义的系统级别的插件,否则,各个插件通常不会定义新活动。在典型方案中,系统集成器确定如何将功能分组到活动中以及缺省情况下启用哪项活动。活动是使用活动模式绑定与用户界面添加项相关联的,模式与插件生成的用户界面添加项的标识相匹配。以下示例将帮助说明这些概念。

定义活动

活动是使用 org.eclipse.ui.activities 扩展点来定义的。让我们查看 Eclipse SDK 插件如何定义两项活动的简化版本 - 一项活动用于开发 Java 软件,另一项活动用于开发插件:

<extension
	point="org.eclipse.ui.activities">
	<activity
		name="Java Activity"
		description="Developing Java Software"
		id="org.eclipse.javaDevelopment">
	</activity>
	
	<activity
		name="Plug-in Activity"
		description="Developing Eclipse Plug-ins"
		id="org.eclipse.plugInDevelopment">
	</activity>
	...

为活动指定名称和描述,每当用户启用和禁用活动时,就会向用户显示这些名称和描述,否则将显示有关活动的信息。当定义模式绑定或者定义活动之间的其它关系时,就会使用活动的标识。例如,我们可以决定一项活动需要另一项活动。

<activityRequirementBinding
	activityId="org.eclipse.plugInDevelopment"
	requiredActivityId="org.eclipse.javaDevelopment">
</activityRequirementBinding>

需求绑定声明,仅当启用了 Java 开发活动时才能启用插件开发活动。也可以将相关活动绑定到类别中,当用户使用活动时就会向用户显示类别。

<category
	name="Development"
	description="Software Development"
	id="org.eclipse.categories.developmentCategory">
</category>

<categoryActivityBinding
	activityId="org.eclipse.javaDevelopment"
	categoryId="org.eclipse.categories.developmentCategory">
</categoryActivityBinding>
      
<categoryActivityBinding
	activityId="org.eclipse.plugInDevelopment"
	categoryId="org.eclipse.categories.developmentCategory">
</categoryActivityBinding>

类别将相关开发活动组合到一起。当用户手工配置活动时,就会向用户显示此类别。

将活动绑定至用户界面添加项

活动是使用模式匹配来与用户界面添加项相关联的。活动模式绑定中使用的模式匹配遵循正则表达式的 java.util.regex 包中所描述的规则。工作台所使用的模式由两部分组成。第一部分使用正在添加用户界面扩展的插件的标识。第二部分是定义添加项时插件本身所使用的标识(它可能包括也可能不包括插件标识来作为标识的一部分)。使用以下格式:

plug-in-identifier + "/" + local-identifier
例如,以下活动模式绑定声明,来自任何 JDT 插件标识(org.eclipse.jdt.*)的用户界面添加项与 Java 开发活动相关联,而不管它的局部标识(.*)如何。
<activityPatternBinding
	activityId="org.eclipse.javaDevelopment"
	pattern="org\.eclipse\.jdt\..*/.*">
</activityPatternBinding>
下一个绑定更具体。它声明在 JDT 核心(org.eclipse.jdt.core)中定义的名为 javanature 的添加项与 Java 开发活动相关联。
<activityPatternBinding
	activityId="org.eclipse.javaDevelopment"
	pattern="org\.eclipse\.jdt\.core/javanature">
</activityPatternBinding>
正如您所看到的,可以使用活动模式绑定来将大量的添加项与特定活动相关联,或者将非常具体的添加项与一项活动相关联。下列添加项将受活动的影响:

对于不需要遵循在插件的用户界面添加项标识前面添加它们的插件标识这一命名惯例的那些插件,工作台所使用的约定(插件标识 + 局部标识)使得可以很容易地绑定至这些插件。直接与活动 API 进行交互的插件可以自由地使用它们自己的格式来标识添加项以及与那些名称进行模式匹配。

将活动绑定至帮助添加项

活动是使用与用户界面添加项相同的模式匹配方案来与帮助添加项相关联的。标识的第二部分(局部标识)指示目录(TOC)文件的名称。例如,以下活动模式绑定将 JDT 插件(org.eclipse.jdt.*)添加的所有 TOC 文件与 Java 开发活动相关联:

<activityPatternBinding
	activityId="org.eclipse.javaDevelopment"
	pattern="org\.eclipse\.jdt\..*/.*">
</activityPatternBinding>
当禁用 Java 开发活动时,由 JDT 插件添加的帮助书籍或者任何子书籍(链接至 JDT 书籍的 TOC 或由 JDT 书籍链接的 TOC)将不会显示在帮助用户界面中(即使它们是由不同插件添加的)。这些书籍中定义的主题也不会显示在搜索结果中。在 JDT TOC 未作为主 TOC 显示,而是从另一个 TOC 进行链接以显示为书籍中的子树的情况下,禁用 JDT 活动将导致隐藏子树。包含书籍将出现,以便在用户界面中定义较少的主题。

通过使用更具体的绑定,可以使活动与将多个 TOC 添加至帮助系统的插件中的所选 TOC 相关联。例如,以下活动模式绑定将“示例”TOC 与 Java 开发示例活动相关联。

<activityPatternBinding
	activityId="org.eclipse.javaDevelopmentExamples"
	pattern="org\.eclipse\.jdt\.doc\.isv\.topics_Samples.xml">
</activityPatternBinding>
借助这样的模式绑定,禁用 Java 开发示例活动将从“JDT 插件开发者指南”书籍中隐藏“示例”一节。

使用活动 API

工作台活动支持包括一个 API 来使用定义的活动并更改它们的启用状态。大多数插件不需要涉及此 API,但是它对于实现允许用户使用活动的功能或者实现启用特定活动的触发器点而言是很有用的。假定正在通过 API 来处理活动的任何插件非常清楚为特定产品配置活动的方法。例如,工作台本身使用 API 来触发对诸如 Java 开发之类的活动的启用。我们将了解工作台如何使用通用活动 API 来实现触发器。

工作台中所有活动的中心是 IWorkbenchActivitySupport。活动支持与 IActivityManager 合作。插件可以从工作台中获得活动支持实例,还可以从那里获得活动管理器。

IWorkbenchActivitySupport workbenchActivitySupport = PlatformUI.getWorkbench().getActivitySupport();
IActivityManager activityManager = workbenchActivitySupport.getActivityManager();
以下片段将启用 Java 开发活动(如果尚未启用它)。它将显示触发器的简化版本。
...
//the user did something Java related.  Enable the Java activity.
Set enabledActivityIds = new HashSet(activityManager.getEnabledActivityIds());
if (enabledIds.add("org.eclipse.javaDevelopment"))
	workbenchActivitySupport.setEnabledActivityIds(enabledActivityIds);

IActivityManager 还定义协议,用来获取所有已定义的活动和类别标识,还用来获取特定标识的相关联的 IActivityICategory。可以使用这些对象来遍历 API 中的活动或类别的定义,例如,获取模式绑定或需求绑定。可以对活动管理器或者对活动和类别本身注册侦听器,以检测特定活动的定义中或者活动管理器自身中的更改。有关更多信息,请参阅 org.eclipse.ui.activities 包。