1、 首先要實現EditPartFactory接口——EditPartFactoryOutlineImp,該接口為Outline視圖提供控制器EditPart對象,注意該EditPartFactoryImp要與編輯視圖——即真正的編輯區的EditPartFactory接口實現類PartFactoryEditAreaImp保持一致,否則無法同步編輯區與Outline的同步。當然,并不是編輯區的所有元素都應反應到Outline視圖中,這要根據自己的需要在EditPartFactoryOutlineImp創建EditPart對象。 2、 Outline視圖中的樹控制器的構建:需要實現EditPartFactory接口——TreePartFactory,實現public EditPart createEditPart(EditPart context, Object model)方法,在該方法里為每個結點——model創建其子模型的樹模型。Outline的樹結構的根結點應該在編輯區的——GraphicalEditorWithFlyoutPalette繼承類的內部類ContentOutlinePage繼承類的public void createControl(Composite parent)方法中進行創建,通過getViewer().setContents(model)方法將根模型注入Outline視圖中。 另外,為了維護Outline的樹,需要繼承AbstractTreeEditPart,及實現PropertyChangeListener接口,主要需要重載或實現的一些方法為:
補充資料: 在Eclipse 里,當編輯器(Editor)被激活時,大綱視圖自動通過這個編輯器的getAdapter()方法尋找它提供的大綱(大綱實現IcontentOutlinePage 接口)。GEF 提供了ContentOutlinePage 類用來實現大綱視圖,我們要做的就是實現一個它的子類,并重點實現createControl()方法。ContentOutlinePage 是org.eclipse.ui.part.Page 的一個子類,大綱視圖則是PageBookView 的子類,在大綱視圖中有一個PageBook,包含了很多Page 并可以在它們之間切換,切換的依據就是當前活動的Editor。因此,我們在createControl()方法里要做的就是構造這個Page,簡化后的代碼如下所示:
由于我們在構造方法里指定了使用樹結構顯示大綱,所以createControl()里的第一句就會使outline 變量得到一個Tree(見org.eclipse.gef.ui.parts.TreeViewer 的代碼),第二句把TreeViewer 加到選擇同步器中,從而讓用戶不論在大綱或編輯區域里選擇EditPart 時,另一方都能自動做出同樣的選擇;最后三行的作用在以前的帖子里都有介紹,總體目的是把大綱視圖的模型與編輯區域的模型聯系在一起,這樣,對于同一個模型我們就有了兩個視圖,體會到MVC 的好處了吧。 實現大綱視圖最重要的工作基本就是這些,但還沒有完,我們要在init()方法里綁定UNDO/REDO/DELETE 等命令到Eclipse 主窗口,否則當大綱視圖處于活動狀態時,主工具條上的這些命令就會變為不可用狀態;在 getControl()方法里要返回我們的outline 成員變量,也就是指定讓這個控件出現在大綱視圖中;在dispose()方法里應該把這個TreeViewer 從選擇同步器中移除;最后,必須在PracticeEditor 里覆蓋getAdapter()方法,前面說過,這個方法是在Editor 激活時被大綱視圖調用的,所以在這里必須把我們實現好的OutlinePage 返回給大綱視圖使用,代碼如下: