【问题标题】:Eclipse Modeling Framework: Linking an alternative view to the modelEclipse 建模框架:将替代视图链接到模型
【发布时间】:2011-09-21 22:25:56
【问题描述】:

我有一个用于自动生成模型源和 JFace 编辑包的 ECore 模型。我正在尝试为该模型的内容开发一个替代视图,基本上是基于 JFreeChart 的图形视图。我设法创建了一个基于 JFreeChart 的视图插件。现在我需要将视图与模型链接起来。我怎样才能做到这一点?我想用 TreeBased 编辑器编辑模型,并在图形视图中查看这种编辑的效果。这可能吗?

谢谢

【问题讨论】:

    标签: eclipse jface eclipse-emf


    【解决方案1】:

    如果你打开你的 Graphbased-View 请求当前打开的编辑器的 IFile。获得文件后,如果您的 EMF 模型的基础 IFile 发生更改,您可以加载模型(请参阅生成的编辑器如何从基础资源加载模型)附加 IResourceChangeListener 以获取通知。 收到通知后,您可以从文件中重新加载模型并在视图中显示模型。

    此外,如果用户将另一个 emf 编辑器置于顶部或关闭编辑器(您还必须卸载(关闭时)或刷新(另一个带有您的 emf 模型的编辑器),您必须注册一个 PartListener 以获得通知被带到顶部)。

    【讨论】:

    • 嗯...ecore 模型的实时更改将如何以这种方式反映在图表中?使用选择服务获取当前选中的EModelElement,获取模型根-EPackage-,如果不存在则添加内容适配器,然后更新图表不是更好吗?
    • 如果您想可视化实时更新,可以。使用 Resource-Listener,只有保存编辑器才会刷新图表。但是直接在模型上收听还有其他缺点(例如,如果用户想要使用替代的模型查看器)。选择服务没有用,如果我在我的包查看器中选择一个元素,而编辑器和视图保持打开状态怎么办?使用什么取决于需求和模型(例如模型与其他模型的交叉引用等)
    • 我同意。这取决于要求。当我使用选择监听器时,我经常测试当前选择所有者是否只更新相关更改的视图...
    • 我实际上是从默认编辑器打开文件。我只是想进一步了解它的内容。我的问题是如何获得对我的模型的引用/或将我的视图注册为它的变化的监听器?
    【解决方案2】:

    是的,是的,因为生成的 EMF 代码提供了一个通知层:使用 EObject.eAdapters 来添加一个新的适配器,如果模型发生更改,就会得到通知。

        object.eAdapters().add(new Adapter() {
    
            public void setTarget(Notifier newTarget) {
                // TODO Auto-generated method stub
    
            }
    
            public void notifyChanged(Notification notification) {
                // TODO Auto-generated method stub
    
            }
    
            public boolean isAdapterForType(Object type) {
                // TODO Auto-generated method stub
                return false;
            }
    
            public Notifier getTarget() {
                // TODO Auto-generated method stub
                return null;
            }
        });
    

    【讨论】:

    • 我应该将适配器添加到什么对象?我猜是模型,但我怎样才能从视图插件中获得对它的引用? (谢谢)
    • 正如 Tom Seidel 在另一个答案中所写,您可以使用工作台侦听器回复编辑器的打开,然后获取他们打开的文件;您还可以收听工作台选择 API,并通过这种方式获取对模型的引用。在这两种方式中,获取模型的根元素,并使用以下内容:wiki.eclipse.org/EMF/…
    • 感谢大家的帮助。我其实不知道如何添加这样的选择监听器。我的意思是我已经在我的视图插件中导入了 ModelPackage,我似乎可以得到它的一个实例,因为它是一个单例。然而,它似乎只是让我深入研究元模型而不是模型。
    • 您无法使用 ModelPackage 打开实例模型。您可以使用 ModelFactory 类创建自己的;您可以使用 Resource/ResourceSet API 打开一个;或者您可以使用 Platform Selection API(独立于 EMF)从当前编辑器中获取所选对象。
    • 我明白了。但是我应该如何使用 Selection API?我应该向哪个对象注册哪个观察者?
    【解决方案3】:

    好的,我已经按照 Zoltán 的建议做到了这一点。无论如何,我承认我会更喜欢一个更有条理的答案,这就是为什么我用一个简短的解决方案摘要来回答我自己的问题。

    基本上这个想法是视图插件实现了 ViewPart 接口。因此它实际上可以调用以下方法

    getSite().getWorkbenchWindow().getSelectionService()
    

    为了获得工作台选择服务。因此,您可以调用 SelectionService 方法

    addSelectionListener(ISelectionListener listener)
    

    将您自己的 ISelectionListener 作为参数传递,它可以是您正在实现的同一 ViewPart。您只需实现 ISelectionListener 接口,从而提供 selectionChanged 方法的实现

    public void selectionChanged(IWorkbenchPart sourcepart, ISelection selection)
    

    【讨论】:

      猜你喜欢
      • 2016-11-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-03
      • 1970-01-01
      相关资源
      最近更新 更多