org.eclipse.core.runtime.preferences 包提供了用于存储插件的首选项的基础结构。首选项通常映射至首选项页面上受用户控制的设置,尽管这不是底层基础结构所必需的。插件首选项是键/值对,其中键描述首选项的名称,而值是几种不同类型的其中一种(boolean、double、float、int、long 或 string)。可以存储首选项,并由平台从文件系统中检索到。已保存的首选项的准确位置取决于首选项的作用域。
可以将整个首选项库看作是各个节点的层次结构,层次结构中的每个主要分支都表示特定的作用域。任何特定节点的子代都取决于是如何定义该作用域的。对于实例和配置作用域,子节点是特定插件的首选项,如首选项限定符(通常是插件的标识)指定的那样。
如果所有这些让您听起来感到很迷惑,不用担心。如果您不在意作用域和节点,则不需要考虑任何特定作用域或者树的哪个节点实际包含您的首选项值。当您查询首选项值时,首选项 API 将按正确的顺序(实例、配置和缺省值)自动遍历节点,并使用所提供的限定符和首选项名称来查找实际包含该值的节点。
首选项是使用 IPreferencesService 协议来访问的。可以通过使用 Platform 类来访问平台的缺省首选项服务。
... IPreferencesService service = Platform.getPreferencesService(); ...
一旦获得了首选项服务,就可以使用在 IPreferencesService 中提供的任何 get... 方法按名称查询首选项值。例如,以下片段查询“com.example.myplugin”插件中的“MyPreference”首选项的值。
... IPreferencesService service = Platform.getPreferencesService(); boolean value = service.getBoolean("com.example.myplugin", "MyPreference", true, null); //do something with the value. ...
查询方法中的最后一个参数是在搜索首选节点时要使用的作用域上下文的数组。如果该数组为 null,则平台假定应该使用缺省作用域搜索顺序,并估计适当的首选节点。如果传递了作用域上下文的数组,这将确定应该用来查找首选节点的作用域查找顺序。如果使用指定的作用域找不到节点,则始终参考缺省作用域查找顺序。
如果插件需要更准确地控制作用域搜索顺序,则可以使用表示作用域的类来访问表示特定作用域中的首选项的实际节点。通过使用这种方法,可以创建节点的数组,它指定要求的特定搜索顺序。以下片段查询上面使用的同一首选项的首选项服务,但是搜索插件的配置作用域,接着是插件的实例作用域。当为搜索顺序指定节点时,不会考虑缺省作用域。即,平台将只搜索已提供的那些节点。
... 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. ...
插件还可以通过首选项树节点来实现它自己的遍历。可以从首选项服务中获得首选项树的根节点。作用域类可以用来进一步遍历树。以下片段遍历到特定节点,并从节点本身检索首选项值。
... 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 扩展来定义它们自己的专用作用域。在此扩展中,插件定义新作用域的名称以及可以为新作用域创建首选节点的类。(可选)它可以指定初始化该作用域的缺省首选项值的类的名称。当插件定义新的作用域时,由该插件负责实现任何新的作用域的遍历顺序(相对于平台遍历顺序)。我们将使用项目范围的首选项的特定示例来更详细地说明此功能。