Я думаю, причина, по которой ваш самый левый ToolBar
пуст, является вопросом размещения. В моем коде ниже у меня была аналогичная «пустая» проблема ToolBar
, когда у меня не было кнопок, расположенных за пределами пользовательскихToolBar
, но все еще в ToolBar
. Добавление в кнопки «foo» и «bar» фиксировало проблему макета, но я не смог определить правильные вызовы layout()
или pack()
, чтобы исправить это. Я думаю, это может быть связано с the bug here.
Я сделал поворот при создании аналогичного ToolBar
и построен вокруг плагинового проекта «RCP Mail Template», который вы можете создать из мастера «Новый подключаемый проект».
Для решения ваших первых двух проблем, я создал 3 пакета в примере RCP расслоении (я назвал свой проект "com.bar.foo"):
- com.bar.foo.actions - Содержит классы, которые расширяют
ContributionControl
и обертывают Combo
и Text
виджетов. Они не имеют ничего общего с моделью данных и просто беспокоятся о создании виджетов.
- com.bar.foo.model - Содержит модель данных. Я просто составил простую модель здесь с IP, маской, шлюзом и одним или двумя полезными методами.
- com.bar.foo.toolBar - Эти классы подключаются к основному пользовательскому интерфейсу
ToolBar
через точку расширения org.eclipse.ui.menus
. Они связывают модель данных с ContributionControls
в первом пакете. Самый важный класс - ToolBarContribution
, который эффективно централизует всех ваших слушателей. Это упрощает связь между слушателями для виджетов с одной и той же моделью.
Вот источник для ToolBarContribution
(обратите внимание, что в нем рассматриваются ваши первые две проблемы, потому что он подключает слушателей к модели и предоставляет свой собственный ToolBar
к UI):
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
, у меня есть две отдельные кнопки в главном пользовательском интерфейсе 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, который содержит 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
виджета:
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
до пользовательскихToolBar
и кнопки для BarHandler
после изготовленный под заказToolBar
. Порядок, в котором эти команды указаны в xml, будет отражен в приложении. Аналогичным образом, порядок, в котором элементы добавляются к обычнымToolBar
, будет отражен в вашем продукте.
Другое примечание о размещении: вы можете сделать menuContributions в разных местах, установив место размещения в запросе locationURI, например, toolbar:org.eclipse.ui.main.toolbar?after=additions
. «before» - это другое ключевое слово размещения, например «after». Дополнительные примеры этого можно найти in this Eclipse help doc.
Добро пожаловать в SO! Если вам нужно какое-то разъяснение перед ответом, пожалуйста, оставьте комментарий (ну в следующий раз, когда у вас будет достаточно «репутации»). Почему бы вам просто не показать, как вы это сделаете, и добавить пример кода? – GameDroids