全部, 我使用“创建插件与视图”向导创建了一个插件,该向导创建了一个树查看器。该向导直接在视图中创建操作,因此视图的所有部分对操作都是可见的。这对于简单插件很好,但对于“真实世界”插件则不行,特别是如果你需要键绑定。
我的问题是:当视图中的类不是类时,视图和操作之间相互通信的“首选”方式是什么?
例如:我有那个树查看器。用户选择树中的各种项目,然后右键单击并显示一个菜单,其中包含我的操作。用户单击菜单项。那然后就开始了我的行动。
A)Action如何在树查看器中获取选择的“数据”,即构成树的基础对象
b)当Action运行时,我想让它获取每个选中的元素,执行一些操作,然后更新底层对象,并且由于我执行的操作,树的可见外观也会发生变化...即我想让Action与树查看器进行通信。也许我想更改所选项目元素的图标,例如。此外,当Action开始时,我希望它不仅可以与树视图进行通信,还可以与视图的其他可见元素进行通信...也许它应该禁用某些按钮,否则这些按钮会在动作未运行时显示,并且然后,当Action完成其任务时,我希望它与视图进行通信以更新按钮,并可能在某个标签中增加一些计数器。
c)此外,当树因Action执行某些操作而更新时,我希望同一视图中的另一个查看器进行响应。例如,视图中可能有一个TableViewer,位于树下,其作用是在树视图中显示所选元素的某些细节。因此Action运行,它对树中所有选定的元素进行操作;它会更新这些元素,并且当它更新这些元素时,“details”表查看器会因树查看器对象中的新数据而更新。
目前,我有类似于这项工作,但我知道我的方法是错误的。 Actions是单独的类,但我在View中创建了它们的新实例,将视图传递给Action的构造函数,并在Action直接调用的视图上提供getter和setter。另外,由于我没有使用plugin.xml进行任何操作,因此我没有获得可配置的键绑定....只是我在视图中添加的硬编码键绑定。
底线是我想在Eclipse中学习“正确的方法”,而不仅仅是“一种有效的方式”。欢迎大家光临!
感谢。
答案 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();
}
}
}