终于完成了在outline中添加菜单,只是想总结一下过程,首先说明我也是一个菜鸟
我在GEF outline中添加菜单,必须先找个它所对应的editor,本例是extenes Page
在init()方法中
@Override
public void init(IPageSite pageSite) {
viewer.setContextMenu(new OutlineMenuProvider(getSite(),getViewer()) );
super.init(pageSite);
}
OutlineMenuProvider类的代码如下
public class OutlineMenuProvider extends ContextMenuProvider {
public static String FEE_ACTION_LABLE="Add Fee";
public static String DELETE_ACTION_LABLE="Delete";
private ActionRegistry registry;
private SelectionAction action;
private LicenceFlowEditor editor;
// private IMenuListener listener;
private EditPartViewer viewer;
private IPageSite page;
public OutlineMenuProvider(EditPartViewer viewer) {
super(viewer);
}
public OutlineMenuProvider(IPageSite page, EditPartViewer viewer) {
super(viewer);
this.page = page;
this.viewer = viewer;
init();
// listener = new OutlineMenuListener(viewer);
// addMenuListener(listener);
}
@Override
public void buildContextMenu(IMenuManager menu) {
menu.removeAll();
List actions = getActionRegistry().getActionList();
if (actions == null)
return;
for (int i = 0; i < actions.size(); i++) {
Object object = actions.get(i);
if (object instanceof AbstractSelectAction) {
AbstractSelectAction action = (AbstractSelectAction) object;
if (action.shouldShow()) {
action.refresh();
menu.add(action);
}
}
}
}
private void init() {
registry = new ActionRegistry();
action = new OutlineFeeAction(editor, viewer, FEE_ACTION_LABLE,ActionImageFactory.getImagePath(ActionImageConstant.NEW_FEE));
registry.registerAction(action);
action = new OutlineDeleteAction(editor, viewer, DELETE_ACTION_LABLE,ActionImageFactory.getImagePath(ActionImageConstant.DELETE));
registry.registerAction(action);
}
public ActionRegistry getActionRegistry() {
return registry;
}
public void setActionRegistry(ActionRegistry actionRegistry) {
this.registry = actionRegistry;
}
}
然后完成相就的action就行了
action 如下
public class OutlineFeeAction extends AbstractSelectAction {
public static final String ACTION_ID = "Add fee";
public OutlineFeeAction(IWorkbenchPart part, EditPartViewer tree,
String title) {
super(part, tree, title);
setId(ACTION_ID);
}
public OutlineFeeAction(IWorkbenchPart part, EditPartViewer tree,
String lable, String icon) {
super(part, tree, lable,icon);
setId(ACTION_ID);
}
@Override
public void run() {
AbstractModel model = (AbstractModel) getSelectionElement().getModel();
super.run();
}
public boolean shouldShow() {
AbstractModel model = (AbstractModel) getSelectionElement().getModel();
if (model instanceof FeeCPContainer) {
return true;
}
return false;
}
结果如图
在这里说一下我用的是org.eclipse.gef.ui.parts.TreeViewer,如果用jface更好做
只说到这里,希望能一些我帮助。这是我的第一篇博客,请多多谅解……