ActivityBinding对首选项页面不起作用

时间:2016-03-04 08:46:12

标签: java eclipse-plugin

用例如下:我们有很多首选项页面,但根据用户的登录情况,只显示了几个页面。我们使用活动绑定来实现:

<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)

1 个答案:

答案 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);

仍然存在问题,显然首选项对话框无法处理活动绑定更改,因此有一半时间您可以在打开对话框时看到首选项在您眼前改变...而对话框的一半时间根本没有对变化作出反应。