用例如下:我们有很多首选项页面,但根据用户的登录情况,只显示了几个页面。我们使用活动绑定来实现:
<extension point="org.eclipse.ui.activities">
<activity id="org.acme.user.isAdmin" name="Admin Activity">
<enabledWhen>
<test property="org.acme.user.userName" value="ADMIN" />
</enabledWhen>
</activity>
<activityPatternBinding
activityId="org.acme.user.isAdmin"
isEqualityPattern="true"
pattern="org.acme.project/org.acme.project.MyPreferencePage">
</activityPatternBinding>
</extension>
<extension point="org.eclipse.core.expressions.propertyTesters">
<propertyTester
class="org.acme.user.UserTester"
id="org.acme.user.UserTester"
namespace="org.acme.user"
properties="userName"
type="java.lang.Object">
</propertyTester>
</extension>
当然,还有更多。现在,如果我们以其中一个用户身份登录,此设置正常。如果我们注销并重新登录,则显示的首选项页面将按照以下模式进行:
由于属性测试人员正在完成其工作,并且所有内容都适用于首次登录,我认为问题在于首选项对话框如何创建其页面。实际上,无论有多少页可见,以下行总是在应用程序的过程中打印相同的数字:
System.out.println(PlatformUI.getWorkbench().getPreferenceManager().getRootSubNodes().length);
(我知道它没有下降,因为页面有缓存。但是当活动绑定突然决定页面应该可见时,它应该向上。)
任何人都可以了解可能引发这些问题的方法,以及我们如何解决这些问题? (我们正在使用Eclipse 3.7)
答案 0 :(得分:0)
此代码可用于注册PreferenceManager
:
// get the pages from the registry
PreferencePageRegistryReader registryReader = new PreferencePageRegistryReader(PlatformUI.getWorkbench());
registryReader.loadFromRegistry(Platform.getExtensionRegistry());
// we get the unfiltered list of pages
Field topLevelNodes = CategorizedPageRegistryReader.class.getDeclaredField("topLevelNodes"); //$NON-NLS-1$
topLevelNodes.setAccessible(true);
Collection<?> pageContributions = (Collection<?>) topLevelNodes.get(registryReader);
topLevelNodes.setAccessible(false);
// we remove the ones already displayed
Set<String> alreadyDisplayedIds = (Set<String>) registryReader.getTopLevelNodes().stream()
.filter(o -> o instanceof WorkbenchPreferenceNode).map(n -> ((WorkbenchPreferenceNode) n).getId())
.collect(Collectors.toSet());
for (Iterator<?> iterator = pageContributions.iterator(); iterator.hasNext();) {
Object object = iterator.next();
if (object instanceof WorkbenchPreferenceNode
&& alreadyDisplayedIds.contains(((WorkbenchPreferenceNode) object).getId())) {
iterator.remove();
}
}
// now we add the currently invisible pages
((WorkbenchPreferenceManager) PlatformUI.getWorkbench().getPreferenceManager()).addPages(pageContributions);
仍然存在问题,显然首选项对话框无法处理活动绑定更改,因此有一半时间您可以在打开对话框时看到首选项在您眼前改变...而对话框的一半时间根本没有对变化作出反应。