如何将控件(按钮)添加到自定义编辑器的大纲视图中

时间:2014-03-12 13:39:04

标签: eclipse eclipse-plugin

我正在研究一个eclipse-plugin,它带有一个大纲视图的自己的编辑器 我已经用元素填充了大纲视图,现在我想对其中一些元素进行操作。如果用户(右键)单击它们,它应该显示一个行为类似于QuickFix-Popup的弹出窗口。

请帮我提供相关资源或教程的一些提示或链接。

提前谢谢!

编辑:

  

发布大纲视图代码

我在此之后实施了视图:http://wiki.eclipse.org/FAQ_How_do_I_create_an_Outline_view_for_my_own_language_editor%3F

这是.jav文件的大纲视图。我的.jav-Editor创建了OutlineView,它扩展了ContentOutlinePage,如下所示:

public Object getAdapter(Class required) {
    if (IContentOutlinePage.class.equals(required)) {
        if (fOutlinePage == null) {
            fOutlinePage= new JavOutline(this.sourceFile);
        }
        return fOutlinePage;
    }

    return super.getAdapter(required);
}

JavOutline-class的代码:

public class JavOutline extends ContentOutlinePage{


private SourceFile syntaxTree;

public JavOutline(SourceFile syntaxTree) {
    this.syntaxTree = syntaxTree;
}


public void createControl(Composite parent) {

    super.createControl(parent);

    TreeViewer viewer = getTreeViewer();
    viewer.setContentProvider(new SyntaxTreeContentProvider());
    viewer.setLabelProvider(new SyntaxTreeLabelProvider());
    viewer.addSelectionChangedListener(this);
    if(this.syntaxTree!=null)viewer.setInput(this.syntaxTree);
}

public void update(SourceFile sourceFile) {
    TreeViewer viewer= getTreeViewer();

    if (viewer != null) {
        Control control= viewer.getControl();
        if (control != null && !control.isDisposed()) {
            control.setRedraw(false);
            viewer.setInput(sourceFile);
            viewer.expandAll();
            control.setRedraw(true);
        }
    }
}

}

class SyntaxTreeContentProvider implements ITreeContentProvider {

public SyntaxTreeContentProvider() {
}

@Override
public void dispose() {
    // TODO Auto-generated method stub
}

@Override
public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
}

@Override
public Object[] getElements(Object inputElement) {
    if(! (inputElement instanceof SourceFile))return null;
    return ((SourceFile)inputElement).getChildren().toArray();
}

@Override
public Object[] getChildren(Object parentElement) {
    if(! (parentElement instanceof SyntaxTreeNode))return null;
    return ((SyntaxTreeNode)parentElement).getChildren().toArray();
}

@Override
public Object getParent(Object element) {
    if(! (element instanceof SyntaxTreeNode))return null;
    return ((SyntaxTreeNode)element).getParent();
}

@Override
public boolean hasChildren(Object element) {
    return true;
}
}

class SyntaxTreeLabelProvider extends LabelProvider{

@Override
public String getText(Object element) {
    if(! (element instanceof SyntaxTreeNode))return super.getText(element);
    return ((SyntaxTreeNode)element).getDescription();

}

}

我只想在TreeViewer中的一个元素被(右键)单击时调用一个动作。

1 个答案:

答案 0 :(得分:1)

您可以为上下文菜单设置菜单侦听器,如下所示:

final MenuManager menuMgr = new MenuManager();
menuMgr.setRemoveAllWhenShown(true);

menuMgr.addMenuListener(new FillContextMenu());

final Control tree = viewer.getControl();

final Menu menu = menuMgr.createContextMenu(tree);

tree.setMenu(menu);


private class FillContextMenu implements IMenuListener
{
  @Override
  public void menuAboutToShow(final IMenuManager manager)
  {
    // TODO add Actions or other items to the menu
  }
}