2016-03-04 71 views
0

用例如下:我们有很多首选项页面,但根据登录的用户,只显示几个页面。我们使用活动绑定意识到:ActivityBinding不适用于偏好页面

<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

看起来像从过滤器是从扩展点注册表(通过PreferencePageRegistryReader)读取页面时完成的,但没有设置响应稍后启用的活动的任何更改。 –

+0

看起来这可能是(非常古老的)错误[65352](https://bugs.eclipse.org/bugs/show_bug.cgi?id=65352) –

回答

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

不过这表示还有明显的偏好对话框是无法处理的活动的结合问题所以有一半时间您可以在打开对话框时看到喜好在您的眼前发生变化......而一半的时间对话框根本没有对变化做出反应。