2016-03-04 51 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); 

不過這表示還有明顯的偏好對話框是無法處理的活動的結合問題所以有一半時間您可以在打開對話框時看到喜好在您的眼前發生變化......而一半的時間對話框根本沒有對變化做出反應。

相關問題