我认为你最左边的原因ToolBar
为空是布局问题。在我下面的代码中,我有一个类似的“空”ToolBar
当我没有任何按钮位于外部时出现问题custom ToolBar
但仍处于main ToolBar
。添加“foo”和“bar”按钮修复了布局问题,但我无法找出正确的调用layout()
or pack()
要解决这个问题。我认为这可能与这里的错误 https://bugs.eclipse.org/bugs/show_bug.cgi?id=123205.
我尝试创建一个类似的ToolBar
并围绕“RCP 邮件模板”插件项目构建,您可以从“新建插件项目”向导创建该项目。
为了解决您的前两个问题,我在示例 RCP 包中创建了 3 个包(我将我的项目称为“com.bar.foo”):
-
com.bar.foo.actions- 包含扩展的类
ContributionControl
并包裹Combo
and Text
小部件。这些与数据模型无关,只需担心创建小部件。
-
com.bar.foo.model- 包含数据模型。我只是在这里建立了一个简单的模型,其中包含 IP、掩码、网关和一两个有用的方法。
-
com.bar.foo.toolBar- 这些类已插入主 UI
ToolBar
通过org.eclipse.ui.menus
扩展点。他们将数据模型链接到ContributionControls
在第一个包中。这里最重要的类是ToolBarContribution
,这有效地集中了所有听众。这使您可以更轻松地将小部件的侦听器链接到同一模型。
这是该的来源ToolBarContribution
(请注意,它解决了您的前两个问题,因为它将侦听器连接到模型and提供自己的ToolBar
到用户界面):
package com.bar.foo.toolBar;
import org.eclipse.jface.action.Action;
import org.eclipse.jface.action.ToolBarManager;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
import org.eclipse.swt.widgets.Combo;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.ToolBar;
import org.eclipse.ui.menus.WorkbenchWindowControlContribution;
import com.bar.foo.actions.ComboContributionItem;
import com.bar.foo.actions.TextContributionItem;
import com.bar.foo.model.NetworkConfig;
public class ToolBarContribution extends WorkbenchWindowControlContribution {
// Our data model.
private NetworkConfig configuration = new NetworkConfig();
// Each of these corresponds to a widget in the ToolBar.
private Action scanAction;
private ComboContributionItem sourceCombo;
private TextContributionItem ipText;
private TextContributionItem maskText;
private TextContributionItem gatewayText;
@Override
protected Control createControl(Composite parent) {
setupContributionItems();
// Let's not get our hands messy with SWT... add IActions or
// IContributionItems to a ToolBarManager and let the ToolBarManager
// create the SWT ToolBar.
ToolBarManager manager = new ToolBarManager();
manager.add(scanAction);
manager.add(sourceCombo);
manager.add(ipText);
manager.add(maskText);
manager.add(gatewayText);
ToolBar toolBar = manager.createControl(parent);
// Highlight the ToolBar in red.
toolBar.setBackground(parent.getDisplay().getSystemColor(SWT.COLOR_RED));
return toolBar;
}
private void setupContributionItems() {
scanAction = new Action("Scan Host") {
@Override
public void run() {
System.out.println("Scanning...");
String host = sourceCombo.getComboControl().getText();
configuration.scanHost(host);
System.out.println("Scanned!");
refreshTexts();
}
};
scanAction.setToolTipText("Scans the host for a configuration.");
final SelectionListener comboListener = new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
ipText.getTextControl().setText("");
maskText.getTextControl().setText("");
gatewayText.getTextControl().setText("");
}
};
sourceCombo = new ComboContributionItem("sourceCombo") {
@Override
public Control createControl(Composite parent) {
// Let ComboContributionItem create the initial control.
Control control = super.createControl(parent);
// Now customize the Combo widget.
Combo combo = getComboControl();
combo.setItems(configuration.getAvailableHosts());
combo.addSelectionListener(comboListener);
// Return the default control.
return control;
}
};
ipText = new TextContributionItem("ipText", SWT.BORDER | SWT.SINGLE
| SWT.READ_ONLY);
maskText = new TextContributionItem("maskText");
gatewayText = new TextContributionItem("gatewayText");
}
private void refreshTexts() {
ipText.getTextControl().setText(configuration.getIP());
maskText.getTextControl().setText(configuration.getMask());
gatewayText.getTextControl().setText(configuration.getGateway());
}
}
除此之外ToolBar
,我有两个单独的按钮main UI ToolBar
,一个在之前,一个在之后custom ToolBar
。它们的来源位于 com.bar.foo.toolBar 包中。这是第一个命令:
package com.bar.foo.toolBar;
import org.eclipse.core.commands.AbstractHandler;
import org.eclipse.core.commands.ExecutionEvent;
import org.eclipse.core.commands.ExecutionException;
public class FooHandler extends AbstractHandler {
@Override
public Object execute(ExecutionEvent event) throws ExecutionException {
System.out.println("foo");
return null;
}
}
这是第二个:
package com.bar.foo.toolBar;
import org.eclipse.core.commands.AbstractHandler;
import org.eclipse.core.commands.ExecutionEvent;
import org.eclipse.core.commands.ExecutionException;
public class BarHandler extends AbstractHandler {
@Override
public Object execute(ExecutionEvent event) throws ExecutionException {
System.out.println("bar");
return null;
}
}
由于我对您的数据了解不多,因此我必须创建自己的模型。 com.bar.foo.model 包中的模型只是一个类:
package com.bar.foo.model;
public class NetworkConfig {
private String ip = "";
private String mask = "";
private String gateway = "";
public String[] getAvailableHosts() {
return new String[] { "fooHost" };
}
public void scanHost(String host) {
if ("fooHost".equals(host)) {
ip = "192.168.1.2";
mask = "255.255.255.0";
gateway = "192.168.1.1";
} else {
ip = "";
mask = "";
gateway = "";
}
}
public String getIP() {
return ip;
}
public String getMask() {
return mask;
}
public String getGateway() {
return gateway;
}
}
现在对于包含以下内容的 com.bar.foo.actions 包ControlContributions
符合习俗的ToolBar
。注意这两个类都与模型无关,并且它们可以在您产品的其他地方重复使用。
第一类只是包装一个Combo
小部件。该小部件最初可以通过覆盖controlCreated(Combo)
方法。我用它在ToolBarContribution
类添加一个SelectionListener
并设置Combo
的物品。这是课程:
package com.bar.foo.actions;
import org.eclipse.jface.action.ControlContribution;
import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.Combo;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
public class ComboContributionItem extends ControlContribution {
private Combo combo;
public ComboContributionItem(String id) {
super(id);
}
@Override
protected Control createControl(Composite parent) {
combo = new Combo(parent, SWT.READ_ONLY | SWT.V_SCROLL | SWT.H_SCROLL);
return combo;
}
@Override
public int computeWidth(Control control) {
// The widget is now 100 pixels. You can new GC gc = new GC(control) and
// use the gc.stringExtent(String) method to help compute a more dynamic
// width.
return 100;
}
public Combo getComboControl() {
return combo;
}
}
这个包中的另一个类包装了一个Text
widget:
package com.bar.foo.actions;
import org.eclipse.jface.action.ControlContribution;
import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Text;
public class TextContributionItem extends ControlContribution {
private final int style;
private Text text;
public TextContributionItem(String id) {
this(id, SWT.BORDER | SWT.SINGLE);
}
public TextContributionItem(String id, int style) {
super(id);
this.style = style;
}
@Override
protected Control createControl(Composite parent) {
text = new Text(parent, style);
return text;
}
@Override
public int computeWidth(Control control) {
return 100;
}
public Text getTextControl() {
return text;
}
}
我没有这样做,但如果你需要进一步定制Text
小部件为您ToolBar
,您可以覆盖createControl(Composite)
方法就像我初始化时所做的那样ComboContributionItem
.
现在最后一件事:我使用扩展来自定义ToolBar
。然而,同样的逻辑被ToolBarContribution
适用于您的fillCoolBar(ICoolBarManager)
方法或你的createControl(Composite)
方法,取决于哪种ToolBar
你最终希望修改。
就我而言,这是我添加到插件末尾的内容plugin.xml
:
<extension
point="org.eclipse.ui.menus">
<menuContribution
locationURI="toolbar:org.eclipse.ui.main.toolbar">
<toolbar
id="com.bar.foo.toolbar">
<command
commandId="com.bar.foo.commands.foo"
label="Foo"
style="push">
</command>
<control
class="com.bar.foo.toolBar.ToolBarContribution">
</control>
<command
commandId="com.bar.foo.commands.bar"
label="Bar"
style="push">
</command>
</toolbar>
</menuContribution>
</extension>
<extension
point="org.eclipse.ui.commands">
<command
id="com.bar.foo.commands.foo"
name="Foo">
</command>
<command
id="com.bar.foo.commands.bar"
name="Bar">
</command>
</extension>
<extension
point="org.eclipse.ui.handlers">
<handler
class="com.bar.foo.toolBar.FooHandler"
commandId="com.bar.foo.commands.foo">
</handler>
<handler
class="com.bar.foo.toolBar.BarHandler"
commandId="com.bar.foo.commands.bar">
</handler>
</extension>
这些命令已连接起来,因此有一个按钮FooHandler
之前custom ToolBar
和一个按钮BarHandler
之后custom ToolBar
。这些命令在 xml 中指定的顺序将反映在应用程序中。同样,项目添加到的顺序custom ToolBar
将反映在您的产品中。
关于放置的另一个注意事项:您可以通过在 locationURI 的查询中设置放置位置来使 menuContributions 出现在不同的位置,例如,toolbar:org.eclipse.ui.main.toolbar?after=additions
。 “before”是另一个类似于“after”的展示位置关键字。可以找到更多这方面的例子在这个 Eclipse 帮助文档中 http://help.eclipse.org/indigo/index.jsp?topic=%2Forg.eclipse.platform.doc.isv%2Fguide%2Fworkbench_cmd_menus.htm.