Eclipse RCP应用程序自定义工具栏

我正在为我的RCP应用程序创建一个自定义工具栏。

在此处输入图像描述

  1. 如图所示,我希望有一个带有其他三个文本框的下拉框。 这些基本上是输入框并且是相互依赖的。 现在,每个盒子都在不同的类中。 我想把它们放在一个类中,这样就可以更容易地为彼此创建监听器。

    protected void fillCoolBar(ICoolBarManager coolBar) { IToolBarManager toolbar = new ToolBarManager(coolBar.getStyle()); coolBar.add(toolbar); Toolbar extraToolBar = new Toolbar("Toolbar"); toolbar.add(extraToolBar); toolbar.add(new Separator()); toolbar.add(new MyCombo("Demo Combo box")); toolbar.add(new Separator()); toolbar.add(new IPaddress("Ip")); toolbar.add(new Separator()); toolbar.add(new Mask("Mask")); toolbar.add(new Separator()); toolbar.add(new Count("Count")); } public class IPaddress extends ControlContribution { Text textBox; public IPaddress(String id) { super(id); // TODO Auto-generated constructor stub } @Override protected Control createControl(Composite parent) { textBox = new Text(parent, SWT.MULTI | SWT.BORDER | SWT.WRAP); textBox.setLayoutData(new GridData(GridData.FILL_BOTH)); textBox.addModifyListener(new ModifyListener(){ public void modifyText(ModifyEvent event) { Text text = (Text) event.widget; System.out.println(text.getText()); } }); return textBox; } } 
  2. 因此,我想创建一个新的自定义工具栏,将我想要的所有function,然后粘贴到原始。 但不知何故,它只显示左侧的空栏。

     protected Control createControl(Composite parent) { toolBar = new ToolBar(parent, SWT.FLAT |SWT.BORDER); Device dev = toolBar.getDisplay(); try { newi = new Image(dev, "C:\\Users\\RahmanAs\\ChipcoachWorkspace\\ChipCoach\\icons\\FileClose.png"); opei = new Image(dev, "C:\\Users\\RahmanAs\\ChipcoachWorkspace\\ChipCoach\\icons\\FileOpen.png"); } catch (Exception e) { System.out.println("Cannot load images"); System.out.println(e.getMessage()); System.exit(1); } ToolItem item0 = new ToolItem (toolBar, SWT.PUSH); item0.setImage(newi); item0.setText("Hello"); ToolItem item1 = new ToolItem(toolBar, SWT.PUSH); item1.setText("Push"); ToolItem item2 = new ToolItem(toolBar, SWT.PUSH); item2.setText("Pull"); return toolBar; } 
  3. 我也有运行按钮,我使用Vogella的教程在插件中创建。 但是我不能用这种方式编排他们的位置。 (例如,如果我在开始时想要它们。)有没有办法以编程方式创建它们?

我认为你最左边的ToolBar是空的原因是布局问题。 在我的下面的代码中,当我没有任何按钮位于自定义 ToolBar之外但仍在 ToolBar ToolBar时,我有一个类似的“空” ToolBar问题。 添加“foo”和“bar”按钮修复了布局问题,但我无法找到正确的layout()pack()来修复它。 我认为这可能与此处的错误有关。

我开始创建一个类似的ToolBar并围绕“RCP Mail Template”插件项目构建,您可以从“New Plug-in Project”向导创建该项目。

为了解决前两个问题,我在示例RCP包中创建了3个包(我称之为项目“com.bar.foo”):

  1. com.bar.foo.actions – 包含扩展ContributionControl并包装ComboText小部件的类。 这些与数据模型无关,只是担心创建小部件。
  2. com.bar.foo.model – 包含数据模型。 我刚刚在这里用IP,掩码,网关和一两种有用的方法组成了一个简单的模型。
  3. com.bar.foo.toolBar – 这些类通过org.eclipse.ui.menus扩展点插入主UI ToolBar 。 它们将数据模型链接到第一个包中的ContributionControls 。 这里最重要的类是ToolBarContribution ,它有效地集中了所有的监听器。 这使您可以更轻松地将窗口小部件的侦听器链接到同一模型。

这是ToolBarContribution的源代码(请注意,它解决了前两个问题,因为它将侦听器连接到模型并向 UI提供自己的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 ,我在主UI ToolBar有两个单独的按钮,一个在自定义 ToolBar之前,一个在自定义 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包,其中包含自定义ToolBar中的ControlContributions 。 请注意, 这两个类都与模型无关 ,它们可以在产品的其他位置重复使用。

第一个类只包含一个Combo小部件。 最初可以通过覆盖controlCreated(Combo)方法来自定义窗口小部件。 我在ToolBarContribution类中使用它来添加SelectionListener并设置Combo的项目。 这是class级:

 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小部件:

 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; } } 

我没有这样做,但是如果你需要进一步自定义ToolBarText小部件,你可以像初始化ComboContributionItem时那样覆盖createControl(Composite)方法。

现在最后一件事:我使用扩展来自定义ToolBar 。 但是, ToolBarContribution使用的相同逻辑适用于fillCoolBar(ICoolBarManager)方法或createControl(Composite)方法,具体取决于您最终希望修改的ToolBar

在我的例子中,这是我添加到插件的plugin.xml末尾的内容:

                         

连接命令,以便在自定义 ToolBar之前有一个FooHandler按钮,在自定义 ToolBar之后有一个BarHandler按钮。 在xml中指定这些命令的顺序将反映在应用程序中。 同样,项目添加到自定义 ToolBar的顺序也会反映在您的产品中。

关于放置的另一个注意事项:您可以通过在locationURI的查询中设置位置来使menuContributions显示在不同的位置,例如, toolbar:org.eclipse.ui.main.toolbar?after=additions 。 “之前”是另一个展示位置关键字,例如“之后”。 可以在此Eclipse帮助文档中找到更多此示例。