在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, ...)
。基本上
- 在
parent
与GridLayout(1, false)
创建新的顶级Composite
。 (这是需要的,因为parent
参数中的Composite
具有FillLayout
)。 - 创建一个
ToolBarManager
并与GridData(FILL, TOP, true, false)
做'mng.createControl(顶部)'。 - 用
GridData(FILL, FILL, true, true)
创建新的子女Composite
。 - 调用
super.createSourceViewer(child, ...)
。
答
托尼的回答是不错的,但有时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 "";
}
我被上面的代码尝试此请更正,笏在此代码会错。 – RTA 2012-04-17 09:56:18
您需要创建第二个'Composite' - 请参阅上面的第3项 - 您将其传递给超级呼叫。 – 2012-04-17 12:19:31
我已经在上面的代码中添加了以下代码行,但现在它与要打开的编辑器重叠..复合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