org.eclipse.core.runtime.preferences 包为存储插件的首选项提供了基础设施。
首选项通常映射到首选项页面上由用户控制的设置,尽管底层基础设施并不需要这样做。
插件首选项是键/值对,其中键描述首选项的名称,值是几种不同类型中的一种(boolean、double、float、int、long或string)。
首选项可以由平台从文件系统中存储和检索。
保存首选项的确切位置取决于首选项的范围。
目录
选择范围
首选项的范围与首选项的存储位置密切相关。
插件开发人员可以决定哪些标准范围适用于他们的首选项,或者定义对插件有意义的新范围。
让我们先看看平台运行时定义的作用域:
- 实例范围的首选项存储在每个工作区或平台的每个运行实例中。
- 每个平台安装都会存储配置范围的首选项。它们在工作空间之间共享。例如,如果一个用户有一个平台的安装,但是运行几个不同的工作空间,那么在配置级别上的首选项将在工作空间之间共享。
- 默认范围首选项表示首选项的默认值。这些数据不会被平台更改或存储。但是,这些值来自与插件的产品或主要特性一起存储的文件。(见 What is a product? 有关产品和主要功能的说明,以及相关文件
如果这一切听起来令人困惑,不要担心。
如果您不关心范围和节点,则不必担心任何特定的范围或树中的哪个节点实际上包含您的首选项值。
当您查询一个首选项值并使用提供的限定符和首选项名称来查找实际包含该值的节点时,preferences API将按照正确的顺序(实例、配置、默认)自动遍历节点。
使用IPreferencesService协议访问首选项。
平台的默认首选项服务可以使用platform类访问。
...
IPreferencesService service = Platform.getPreferencesService();
...
一旦获得了首选项服务,首选项值就可以使用get…IPreferencesService中提供的方法。
例如,下面的代码片段查询插件“com.example.myplugin”中的“MyPreference”的值。
...
IPreferencesService service = Platform.getPreferencesService();
boolean value = service.getBoolean("com.example.myplugin", "MyPreference", true, null);
//do something with the value.
...
查询方法中的最后一个参数是搜索首选项节点时使用的范围上下文数组。
如果数组为null,那么平台假定应该使用默认的范围搜索顺序,并猜测适当的首选项节点。
如果传递范围上下文数组,则这将确定用于查找首选项节点的范围查找顺序。
如果使用指定的范围找不到节点,则总是使用默认的范围查找顺序。
使用范围和节点
如果插件需要对范围搜索顺序进行更精细的控制,则可以使用表示范围的类来访问表示特定范围首选项的实际节点。
通过这种方式,可以创建一个节点数组,指定所需的特定搜索顺序。
下面的代码片段查询preferences服务,以获得上面使用的相同的首选项,但是搜索插件的配置范围,然后搜索插件的实例范围。
当为搜索顺序指定节点时,不考虑默认范围。
也就是说,平台将只搜索已经提供的确切节点。
...
IPreferencesService service = Platform.getPreferencesService();
Preferences configurationNode = new ConfigurationScope().getNode("com.example.myplugin");
Preferences instanceNode = new InstanceScope().getNode("com.example.myplugin");
Preferences[] nodes = new Preferences[] {configurationNode, instanceNode};
stringValue = service.get("MyPreference", "true", nodes);
//do something with the value.
...
插件也可以实现自己对首选项树节点的遍历。
首选项树的根节点可以从首选项服务中获得。
可以使用scope类进一步遍历树。
下面的代码片段遍历到特定的节点,并从节点本身检索首选项值。
...
IPreferencesService service = Platform.getPreferencesService();
Preferences root = service.getRootNode();
Preferences myInstanceNode = root.node(InstanceScope.SCOPE).node("com.example.myplugin");
if (myInstanceNode != null) {
value = node.getBoolean("MyPreference", "true");
//do something with the value.
}
...
扩展范围
插件可以使用 org.eclipse.core.runtime.preferences扩展定义它们自己的专用范围。
在这个扩展中,插件定义了新范围的名称,以及一个可以为新范围创建首选项节点的类。
可选地,它可以指定在该范围初始化默认首选项值的类的名称。
当插件定义了一个新的范围时,它将由该插件为任何新的范围实现相对于平台遍历顺序的遍历顺序。
我们将使用Project-scoped preferences的特定示例来更详细地研究这个功能。