首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Eclipse Common Navigator Framework 開發資源管理器:模型篇

     編輯:Java 相關知識

承接基礎篇,本文深入剖析 Common Navigator Framework (CNF) 的模型架構:從傳統 Tree/TreeNode 到 JFace ITreeContentProvider,再到 CNF 代理模式實現的多擴展點動態合成模型。

樹模型演進脈絡

階段模型介面特點
SWT 原生TreeItem 直接掛載子節點模型與 UI 強耦合,難測試、難擴展
SwingTreeNode (含 userObject 持有資料)模型獨立,可作控制類也可作資料實體,靈活
JFaceITreeContentProvider (由 TreeViewer 驅動)純控制介面,資料存在 TreeItem.getData(),關注點分離

關鍵方法:getParent(Object element) 常被忽略直接回 null,但 CNF 的 LinkWithEditor (編輯器聯動定位) 依賴此方法尋找父節點路徑,必須正確實作。

CNF 模型架構核心:代理模式

CNF 自身不提供模型能力,而是透過 org.eclipse.ui.navigator.navigatorContent 擴展點,動態組合多個 ITreeContentProvider 實例:

  1. 根據當前處理節點與各擴展點的 triggerPoints/possibleChildren 運算式,篩選出能處理該節點的 Provider 集合。
  2. 依序呼叫各 Provider 的 getChildren(Object parent),收集子節點至 Set 去重。
  3. 最終以陣列回傳給 TreeViewer 顯示。

核心代理類:NavigatorContentServiceContentProvider 實作 ITreeContentProvider,封裝上述合成邏輯。

擴展點配置要素


<extension point="org.eclipse.ui.navigator.navigatorContent">
  <navigatorContent
    id="com.example.myModel"
    name="My Model"
    contentProvider="com.example.MyContentProvider"
    labelProvider="com.example.MyLabelProvider"
    priority="normal">
    <triggerPoints>
      <instanceof value="org.eclipse.core.resources.IResource"/>
    </triggerPoints>
    <possibleChildren>
      <instanceof value="org.eclipse.core.resources.IContainer"/>
    </possibleChildren>
  </navigatorContent>
</extension>
  • triggerPoints:何種節點觸發此 Provider (支援 instanceof, adapt, or, and 運算式)。
  • possibleChildren:此 Provider 可能產生的子節點型別,供父節點查詢時優化。
  • priority:高優先級 Provider 先產生子節點,影響顯示順序。

IWorkbenchAdapter / IWorkbenchAdapter2:實用妥協

這兩個介面將「模型物件」與「顯示屬性 (圖示、文字、動作)」綁定,違反純粹 MVC 分層,但大幅降低擴展門檻:模型類別直接實作介面即可獲得標籤、圖示、右鍵選單,無需額外 LabelProvider/ActionProvider 類別。設計時須在「純粹度」與「開發效率」間取得平衡。

實作檢核清單

  1. getElements(Object input):回傳根層節點 (通常為工作區專案或自定義根模型)。
  2. getChildren(Object parent):回傳子節點陣列,null 或空陣列表示葉節點。
  3. getParent(Object child):回傳父節點,**必須正確實作**以支援 LinkWithEditor。
  4. hasChildren(Object element):快速判斷是否有子節點,避免呼叫 getChildren 開銷。
  5. 實作 ILabelProvider 提供文字/圖示,或讓模型實作 IWorkbenchAdapter。
  6. 在 plugin.xml 註冊 navigatorContent 擴展點,綁定 Provider/LabelProvider/ActionProvider。

除錯技巧

  • 啟動 Eclipse 時加 -debug 參數,在 .options 開啟 org.eclipse.ui.navigator/debug=true,主控台輸出擴展點匹配、Provider 呼叫詳情。
  • 使用 Plugin Spy (Alt+Shift+F1) 檢視 Navigator 當前使用的 Provider/LabelProvider。

掌握 CNF 代理模型機制,即可輕鬆構建支援虛擬節點、多模型混合、動態擴展的企業級資源管理器。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved