1ã€?nbsp;首先è¦å®žçްEditPartFactory接å£â€”—EditPartFactoryOutlineImpåQŒè¯¥æŽ¥å£ä¸ºOutline视图æä¾›æŽ§åˆ¶å™¨EditPart对象åQŒæ³¨æ„该EditPartFactoryImpè¦ä¸Ž¾~–辑视图——å³çœŸæ£çš„编辑区的EditPartFactory接å£å®žçް¾c»PartFactoryEditAreaImpä¿æŒä¸€è‡ß_¼Œå¦åˆ™æ— æ³•åŒæ¥¾~–辑åŒÞZ¸ŽOutlineçš„åŒæ¥ã€‚当ç„Óž¼Œòq¶ä¸æ˜¯ç¼–è¾‘åŒºçš„æ‰€æœ‰å…ƒç´ éƒ½åº”å应到Outline视图ä¸ï¼Œ˜q™è¦æ ÒŽ(gu¨©)®è‡ªå·±çš„需è¦åœ¨EditPartFactoryOutlineImp创å¾EditPart对象ã€?br />
2ã€?nbsp;Outline视图ä¸çš„æ ?w¨¨i)控制器的构建:需è¦å®žçްEditPartFactory接å£â€”—TreePartFactoryåQŒå®žçްpublic EditPart createEditPart(EditPart context, Object model)æ–ÒŽ(gu¨©)³•åQŒåœ¨è¯¥æ–¹æ³•里为æ¯ä¸ªç»“点——model创å¾å…¶åæ¨¡åž‹çš„æ ‘(w¨¨i)模型。Outlineçš„æ ‘(w¨¨i)¾l“æž„çš„æ ¹¾l“点应该在编辑区的——GraphicalEditorWithFlyoutPalette¾l§æ‰¿¾cÈš„内部¾c»ContentOutlinePage¾l§æ‰¿¾cÈš„public void createControl(Composite parent)æ–ÒŽ(gu¨©)³•ä¸è¿›è¡Œåˆ›å»ºï¼Œé€šè¿‡getViewer().setContents(model)æ–ÒŽ(gu¨©)³•ž®†æ ¹æ¨¡åž‹æ³¨å…¥Outline视图ä¸ã€?br />
å¦å¤–åQŒäؓ了维护Outlineçš„æ ‘(w¨¨i)åQŒéœ€è¦ç‘ô承AbstractTreeEditPartåQŒåŠå®žçްPropertyChangeListener接å£åQŒä¸»è¦éœ€è¦é‡è½½æˆ–å®žçŽ°çš„ä¸€äº›æ–¹æ³•äØ“åQ?/p>
//æ¤æ–¹æ³•负责处ç†ç”±äºŽé¼ æ ‡é€‰ä¸æˆ–更改对æ ?w¨¨i)é€ æˆçš„å˜åŒ–,å¯ÒŽ(gu¨©) ‘(w¨¨i)¾l“æž„˜q›è¡Œåˆäh–°
public void propertyChange(PropertyChangeEvent evt)
//æ ?w¨¨i)结点的图æ ?nbsp;
protected Image getImage()
//æ ?w¨¨i)结点的文æœ?nbsp;
protected String getText()
//该方法负责处ç†ç”±äºŽé¼ æ ‡é€‰ä¸æˆ–其他事件激‹zÀLŸæ ?w¨¨i)结点该åšçš„事情åQŒå¦‚æžœäØ“è¯¥æ ‘(w¨¨i)¾l“点æ·ÕdŠ PropertyChangeListenerã€?nbsp;
public void activate()
//与上é¢çš„æ–ÒŽ(gu¨©)³•相å
public void deactivate()
//å¾—åˆ°å½“å‰æ ?w¨¨i)结点的模åž?nbsp;
protected List getModelChildren()

补充资料åQ?br />
在Eclipse 里,当编辑器åQˆEditoråQ‰è¢«‹È€‹zÀL—¶åQŒå¤§¾U²è§†å›¾è‡ªåŠ¨é€šè¿‡˜q™ä¸ª¾~–辑器的getAdapter()æ–ÒŽ(gu¨©)³•å¯ÀL‰¾å®ƒæä¾›çš„大纲åQˆå¤§¾U²å®žçްIcontentOutlinePage 接å£åQ‰ã€‚GEF æä¾›äº†ContentOutlinePage ¾cÈ”¨æ¥å®žçް大¾U²è§†å›¾ï¼Œæˆ‘们è¦åšçš„就是实çŽîC¸€ä¸ªå®ƒçš„å¾c»ï¼Œòq‰™‡ç‚¹å®žçްcreateControl()æ–ÒŽ(gu¨©)³•。ContentOutlinePage 是org.eclipse.ui.part.Page 的一个å¾c»ï¼Œå¤§çº²è§†å›¾åˆ™æ˜¯PageBookView çš„å¾c»ï¼Œåœ¨å¤§¾U²è§†å›¾ä¸æœ‰ä¸€ä¸ªPageBookåQŒåŒ…å«äº†å¾ˆå¤šPage òq¶å¯ä»¥åœ¨å®ƒä»¬ä¹‹é—´åˆ‡æ¢åQŒåˆ‡æ¢çš„便®ž®±æ˜¯å½“剋zÕdŠ¨çš„Editorã€‚å› æ¤ï¼Œæˆ‘们在createControl()æ–ÒŽ(gu¨©)³•里è¦åšçš„ž®±æ˜¯æž„é€ è¿™ä¸ªPageåQŒç®€åŒ–åŽçš„代ç 如下所½Cºï¼š
private Control outline;

public OutlinePage()
{
super(new TreeViewer());
}

public void createControl(Composite parent)
{
outline = getViewer().createControl(parent);
getSelectionSynchronizer().addViewer(getViewer());
getViewer().setEditDomain(getEditDomain());
getViewer().setEditPartFactory(new TreePartFactory());
getViewer().setContents(getDiagram());
}

ç”׃ºŽæˆ‘ä»¬åœ¨æž„é€ æ–¹æ³•é‡ŒæŒ‡å®šäº†ä‹Éç”¨æ ‘(w¨¨i)¾l“构昄¡¤ºå¤§çº²åQŒæ‰€ä»¥createControl()里的½W¬ä¸€å¥å°±ä¼šä‹Éoutline å˜é‡å¾—到一个TreeåQˆè§org.eclipse.gef.ui.parts.TreeViewer 的代ç )åQŒç¬¬äºŒå¥æŠŠTreeViewer åŠ åˆ°é€‰æ‹©åŒæ¥å™¨ä¸åQŒä»Žè€Œè®©ç”¨æˆ·ä¸è®ºåœ¨å¤§¾U²æˆ–¾~–辑区域里选择EditPart æ—Óž¼Œå¦ä¸€æ–šwƒ½èƒ½è‡ªåЍåšå‡ºåŒæ ïL(f¨¥ng)š„选择åQ›æœ€åŽä¸‰è¡Œçš„作用在以å‰çš„帖å里都有介¾l,æ€ÖM½“目的是把大纲视图的模型与¾~–辑区域的模型蔾pÕdœ¨ä¸€èµøP¼Œ˜q™æ ·åQŒå¯¹äºŽåŒä¸€ä¸ªæ¨¡åž‹æˆ‘们就有了两个视图åQŒä½“会到MVC 的好处了å§ã€?br />
实现大纲视图最é‡è¦çš„工作基本就是这些,但还没有完,我们è¦åœ¨init()æ–ÒŽ(gu¨©)³•里绑定UNDO/REDO/DELETE ½{‰å‘½ä»¤åˆ°Eclipse ä¸Èª—å£ï¼Œå¦åˆ™å½“大¾U²è§†å›‘Ö¤„äºŽæ´»åŠ¨çŠ¶æ€æ—¶åQŒä¸»å·¥å…·æ¡ä¸Šçš„这些命令就会å˜ä¸ÞZ¸å¯ç”¨çжæ€ï¼›åœ?getControl()æ–ÒŽ(gu¨©)³•里覘q”回我们的outline æˆå‘˜å˜é‡åQŒä¹Ÿž®±æ˜¯æŒ‡å®šè®©è¿™ä¸ªæŽ§ä»¶å‡ºçŽ°åœ¨å¤§çº²è§†å›¾ä¸ï¼›åœ¨dispose()æ–ÒŽ(gu¨©)³•里应该把˜q™ä¸ªTreeViewer ä»Žé€‰æ‹©åŒæ¥å™¨ä¸¿U»é™¤åQ›æœ€åŽï¼Œå¿…须在PracticeEditor 里覆盖getAdapter()æ–ÒŽ(gu¨©)³•åQŒå‰é¢è¯´˜q‡ï¼Œ˜q™ä¸ªæ–ÒŽ(gu¨©)³•是在Editor ‹È€‹zÀL—¶è¢«å¤§¾U²è§†å›¾è°ƒç”¨çš„åQŒæ‰€ä»¥åœ¨˜q™é‡Œå¿…须把我们实现好的OutlinePage ˜q”回¾l™å¤§¾U²è§†å›¾ä‹É用,代ç 如下åQ?/p>

public Object getAdapter(Class type)
{
if (type == IContentOutlinePage.class)
return new OutlinePage();
return super.getAdapter(type);
} 

]]>