在Eclipse文本编辑器中创建一个工具栏

问题描述:

我有一个Eclipse插件,其中我需要在文本编辑器中的工具栏,就像切换面包屑视图一样。 Eclipse中是否有任何通用工具类允许我这样做?在Eclipse文本编辑器中创建一个工具栏

@Override 
protected ISourceViewer createSourceViewer(Composite parent, 
              IVerticalRuler ruler, 
              int styles) 
{ 
    composite = new Composite(parent, SWT.NONE); 
    GridLayout gridLayout = new GridLayout(1, true); 
    gridLayout.numColumns = 1; 
    gridLayout.marginHeight = 0; 
    gridLayout.marginWidth = 0; 
    composite.setLayout(gridLayout); 

    ToolBar toolBar = new ToolBar(composite, SWT.FLAT); 
    GridData gridData = new GridData(GridData.FILL, SWT.TOP, true, false); 
    toolBar.setLayoutData(gridData); 
    toolBarManager = new ToolBarManager(toolBar); 

    return super.createSourceViewer(composite, ruler, styles); 
} 

假设你具有基于org.eclipse.ui.editors.text.TextEditor类的文本编辑器,那么你就必须覆盖AbstractDecoratedTextEditor.createSourceViewer(Composite parent, ...)。基本上

  • parentGridLayout(1, false)创建新的顶级Composite。 (这是需要的,因为parent参数中的Composite具有FillLayout)。
  • 创建一个ToolBarManager并与GridData(FILL, TOP, true, false)做'mng.createControl(顶部)'。
  • GridData(FILL, FILL, true, true)创建新的子女Composite
  • 调用super.createSourceViewer(child, ...)
+0

我被上面的代码尝试此请更正,笏在此代码会错。 – RTA 2012-04-17 09:56:18

+0

您需要创建第二个'Composite' - 请参阅上面的第3项 - 您将其传递给超级呼叫。 – 2012-04-17 12:19:31

+0

我已经在上面的代码中添加了以下代码行,但现在它与要打开的编辑器重叠..复合child = new Composite(parent,SWT.NONE); (new GridData(GridData.FILL,GridData.FILL,true,true)); return super.createSourceViewer(child,ruler,styles); – RTA 2012-04-17 14:08:19

托尼的回答是不错的,但有时
super.createSourceViewer(composite, ruler, styles);
会更改父节点的布局,真正的编辑区就会丢失,就像RTA在托尼的解答发表了评论。
我遇到了这个问题,当我想做RTA的确切的事情。
这里是我的解决方案:

@Override 
protected ISourceViewer createSourceViewer(Composite parent, 
     IVerticalRuler ruler, int styles) { 
    changeParentLayout(parent); 
    Label label = createPathLabel(parent); 
    ISourceViewer viewer = super.createSourceViewer(parent, ruler, styles); 
    updateSourceViewerLayout(parent, label); 
    return viewer; 
} 

//change the parent layout to grid layout, 
//so that the source file area can be shown 
protected void changeParentLayout(Composite parent) { 
    parent.setLayout(new GridLayout(1, false)); 
} 

//i need a label here, ToolBar will be the same 
protected Label createPathLabel(Composite parent) { 
    Label lblNewLabel = new Label(parent, SWT.NONE); 
    lblNewLabel.setLayoutData(new GridData(SWT.LEFT, SWT.TOP, true, false, 1, 1)); 
    lblNewLabel.setText(getFilePath()); 
    return lblNewLabel; 
} 

//after adding the label i need and call super.createSourceViewer() 
//now all widgets are ready, we need to change the editor area's layout data to grid data 
//here if you only have two widgets: label and area, you can directly choose the edit area widget. i used a loop to find all sub widgets 
protected void updateSourceViewerLayout(Composite parent, Label label) { 
    Control[] children = parent.getChildren(); 
    if (children.length < 2) return; 
    for (Control child : children) { 
     if (child != label) { 
      child.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 1, 1)); 
     } 
    } 
} 

private String getFilePath() { 
    //get the path I want 
    return ""; 
}