2009-07-30 33 views
3

在Eclipse中,您可以發佈一個擴展點以供下游插件使用。 從註冊表返回時,循環訪問點的擴展時,是否有方法知道/控制它們返回的順序。Eclipse擴展點擴展的排序/排序

eclipse如何根據磁盤上文件的順序查找擴展名?

更新:
有人問我爲什麼會想這樣做,所以我給和實例的使用情況

在Eclipse中,如果您運行MultiPageEditor插件例子中,你將創建三個選項卡編輯。如果我發佈一個擴展,允許添加製表符,並希望它們以某種/邏輯/上下文順序添加,而不是隨機/特定於操作系統的文件排序順序。

回答

2

當我要訂購擴展點貢獻,我添加了一個優先數,如int 10

我只使用數字10,20,30,......因爲你可以很容易地把兩者之間的元素未來。這可以用於訂購按鈕,合成或您無法按名稱排序的所有內容。

您可以將此優先級添加到您用來定義擴展點的界面中。或者你可以在擴展點描述中使用一個字段。

當您收集所有擴展點貢獻時,您可以要求優先級,並在返回鏈接列表之前對它們進行排序。

String tmpExtensionPoint = "EXTENSION POINT ID"; //$NON-NLS-1$ 
IExtensionRegistry registry = Platform.getExtensionRegistry(); 
IConfigurationElement[] elements = registry.getConfigurationElementsFor(tmpExtensionPoint); 

    List references = new LinkedList(); 
    if (elements != null && elements.length > 0) { 
     for (int i = 0; i < elements.length; i++) { 
      try { 
       Object obj = elements[i].createExecutableExtension("class"); 
       references.add((IExtensionPointInterface)obj); //$NON-NLS-1$ 
      } catch (CoreException e) { 
       logger.error("Get Extension Point For " + tmpExtensionPoint, e); 
      } 
     } 
    } 

//... 
//ORDER here 

return references; 

訂貨代碼可以通過這樣的事情:

Arrays.sort(references, new Comparator() { 
     public int compare(Object arg0, Object arg1) { 
      if (!(arg0 instanceof IExtensionPointInterface)) { 
       return -1; 
      } 

      if (!(arg1 instanceof IExtensionPointInterface)) { 
       return -1; 
      } 

      IExtensionPointInterface part0 = (IExtensionPointInterface)arg0; 
      IExtensionPointInterface part1 = (IExtensionPointInterface)arg1; 

      if (part0.getPriority() < part1.getPriority()) { 
       return -1; 
      } 

      if (part0.getPriority() > part1.getPriority()) { 
       return 1; 
      } 

      return 0; 
     } 
    }); 
2

您沒有任何直接控制它們被解析或返回的順序,但這應該不重要。爲什麼他們以特定的順序返回對你來說很重要?我隱約記得,每個擴展位置都是按照它們定義的順序依次讀取的,並且位置中的每個插件都按字母順序讀取,但由於P2在Eclipse 3.4中出現,因此處理方式可能會有所不同。我不會依賴任何閱讀順序,因爲你不應該知道這些知識。

如果您需要訂購貢獻,當您從註冊表中獲得擴展名時,可以將它們添加到列表中,實現比較器,並根據需要對它們進行分類。或者,您可以按順序對它們進行迭代,然後在繼續之前對結果對象進行排序。

article是有點老,但我相信仍然有效。它給你一些關於擴展點處理的指針。