GEF实现Eclipse的Outline视图

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接口,主要需要重载或实现的一些方法为:

//此方法负责处理由于鼠标选中或更改对树造成的变化,对树结构进行刷新
public void propertyChange(PropertyChangeEvent evt)
//树结点的图标
protected Image getImage()
//树结点的文本
protected String getText()
//该方法负责处理由于鼠标选中或其他事件激活某树结点该做的事情,如果为该树结点添加PropertyChangeListener。
public void activate()
//与上面的方法相反
public void deactivate()
//得到当前树结点的模型
protected List getModelChildren()

 

 

补充资料:
在Eclipse 里,当编辑器(Editor)被激活时,大纲视图自动通过这个编辑器的getAdapter()方法寻找它提供的大纲(大纲实现IcontentOutlinePage 接口)。GEF 提供了ContentOutlinePage 类用来实现大纲视图,我们要做的就是实现一个它的子类,并重点实现createControl()方法。ContentOutlinePage 是org.eclipse.ui.part.Page 的一个子类,大纲视图则是PageBookView 的子类,在大纲视图中有一个PageBook,包含了很多Page 并可以在它们之间切换,切换的依据就是当前活动的Editor。因此,我们在createControl()方法里要做的就是构造这个Page,简化后的代码如下所示:

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());
}

 

由于我们在构造方法里指定了使用树结构显示大纲,所以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 返回给大纲视图使用,代码如下:

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

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值