Actions与视图通信的首选方式是什么

时间:2009-09-10 21:54:41

标签: eclipse

全部,   我使用“创建插件与视图”向导创建了一个插件,该向导创建了一个树查看器。该向导直接在视图中创建操作,因此视图的所有部分对操作都是可见的。这对于简单插件很好,但对于“真实世界”插件则不行,特别是如果你需要键绑定。

我的问题是:当视图中的类不是类时,视图和操作之间相互通信的“首选”方式是什么?

例如:我有那个树查看器。用户选择树中的各种项目,然后右键单击并显示一个菜单,其中包含我的操作。用户单击菜单项。那然后就开始了我的行动。

A)Action如何在树查看器中获取选择的“数据”,即构成树的基础对象

b)当Action运行时,我想让它获取每个选中的元素,执行一些操作,然后更新底层对象,并且由于我执行的操作,树的可见外观也会发生变化...即我想让Action与树查看器进行通信。也许我想更改所选项目元素的图标,例如。此外,当Action开始时,我希望它不仅可以与树视图进行通信,还可以与视图的其他可见元素进行通信...也许它应该禁用某些按钮,否则这些按钮会在动作未运行时显示,并且然后,当Action完成其任务时,我希望它与视图进行通信以更新按钮,并可能在某个标签中增加一些计数器。

c)此外,当树因Action执行某些操作而更新时,我希望同一视图中的另一个查看器进行响应。例如,视图中可能有一个TableViewer,位于树下,其作用是在树视图中显示所选元素的某些细节。因此Action运行,它对树中所有选定的元素进行操作;它会更新这些元素,并且当它更新这些元素时,“details”表查看器会因树查看器对象中的新数据而更新。

目前,我有类似于这项工作,但我知道我的方法是错误的。 Actions是单独的类,但我在View中创建了它们的新实例,将视图传递给Action的构造函数,并在Action直接调用的视图上提供getter和setter。另外,由于我没有使用plugin.xml进行任何操作,因此我没有获得可配置的键绑定....只是我在视图中添加的硬编码键绑定。

底线是我想在Eclipse中学习“正确的方法”,而不仅仅是“一种有效的方式”。欢迎大家光临!

感谢。

1 个答案:

答案 0 :(得分:0)

我不确定这是否是正确的方法,但我解决类似问题的方法是使我的动作类扩展为IEditorActionDelegate。

这是我所拥有的片段,希望它有所帮助。

public class SubmitEditorActionDelegate implements IEditorActionDelegate { 
private IEditorPart targetEditor;

private ISelection selection;

/*
 * (non-Javadoc)
 * 
 * @see org.eclipse.ui.IEditorActionDelegate#setActiveEditor(org.eclipse.jface.action.IAction,
 *      org.eclipse.ui.IEditorPart)
 */
public void setActiveEditor(IAction action, IEditorPart targetEditor) {
    this.targetEditor = targetEditor;
}
/*
 * (non-Javadoc)
 * 
 * @see org.eclipse.ui.IActionDelegate#selectionChanged(org.eclipse.jface.action.IAction,
 *      org.eclipse.jface.viewers.ISelection)
 */
public void selectionChanged(IAction action, ISelection selection) {
    logger.fine("selectionChanged" + selection +"action ="+action);
    if (selection != null && (selection instanceof ITextSelection)){ 
        this.selection = selection;
    }else {
        this.selection=null;
    }           

}

public void run(IAction action) {
    if (targetEditor != null && targetEditor instanceof ProgramEditor) {
        ProgramEditor editor = (ProgramEditor) targetEditor;

        IDocumentProvider docProvider = editor.getDocumentProvider();
        IEditorInput input = editor.getEditorInput();

            String selectedText=((ITextSelection) selection).getText();
            }
     }

}