下拉列表的动态填充添加到 Eclipse 插件中的 Eclipse 工具栏
Dynamic population of dropdown list added to Eclipse toolbar within Eclipse plugin
主题似乎在 Eclipse 插件开发的其他领域很容易,例如对话框上自己的工具栏。在这种情况下,我通过 plugin.xml 在我的视角内的主工具栏中添加了一个下拉菜单,如下所示
<menuContribution
locationURI="toolbar:org.eclipse.ui.main.toolbar">
<toolbar
id="com.company.ui.toolbar2">
// other items removed for clarity
// following is a drop-down
<command
commandId="com.company.ui.mydropdown"
label="%config.label.default"
icon="icons/myIcon.png"
style="pulldown">
<visibleWhen checkEnabled="false">
<reference definitionId="com.company.ui.visibilityTester"/>
</visibleWhen>
</command>
</toolbar>
</menuContribution>
我已经在其他地方定义了命令,并且在 plugin.xml 文件中有一个处理程序,该处理程序当前可以像按钮一样工作。
但是,下拉列表未填充。由于以下原因,我需要一种动态填充的方法:
- 下拉列表内容来自API
- 其中一个列表项(或像单击按钮一样单击列表)会启动一个可以编辑列表的对话框
- 关闭对话框意味着需要刷新(重建)列表并重新评估 selected/active 项目
我还需要能够挂钩用户选择不同的列表项并调用我的 API。
我注意到其他在线示例尝试以不同方式创建下拉列表,但我对这些如何连接存在知识空白。例如,在使用贡献的地方,并不总是很清楚它如何链接回 plugin.xml 文件中的特定定义。我还没有看到一个例子可以清楚地说明这一点。
我需要支持 Eclipse 4.4.2 及更高版本,因此当前的 Eclipse 4 示例可能不合适。
感谢任何帮助。
答案是向菜单贡献的工具栏部分添加一个控件,例如:
<menuContribution locationURI="toolbar:org.eclipse.ui.main.toolbar">
<toolbar id="com.company.ui.customToolbar">
<control
class="com.company.ui.MyDropDownContribution"
icon="icons/yourIconHere.png"
label="%config.label.default">
id="theDropdown">
<visibleWhen checkEnabled="false">
<reference definitionId="com.company.ui.isMyTestCaseSatisfied"/>
</visibleWhen>
</control>
</toolbar>
</menuContribution>
然后实施贡献 class 扩展 WorkbenchWindowControlContribution。我的简化代码,包括从列表项之一启动 EXE 的方法(并且可以重新用于做其他事情),本质上是:
public class MyDropDownContribution extends
WorkbenchWindowControlContribution {
private Combo dropdownlist;
private boolean listenerAdded = false;
private String currentlySelected = "Item 1";
private String[] listOfItems = new String[]{ "Item 1", "Item 2", "Item 3", "Launch my EXE" };
private final SelectionAdapter selectionListener = new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
if(e.widget instanceof Combo) {
// if the selection is currentlySelected, do nothing
if(dropdownlist.getText().equals(currentlySelected)) {
return;
}
//if the selection is to launch 'something', do that
if(dropdownlist.getText().equals("Launch my EXE")) {
launchExecutable();
} else {
// otherwise, a new item has been selected, do what you need to
}
}
}
};
private void launchExecutable() {
// place your code to launch your EXE here - you could do some other special case, not just launch EXE
}
@Override
protected Control createControl(Composite parent) {
Composite container = new Composite(parent, SWT.NONE);
GridLayout glContainer = new GridLayout(1, false);
glContainer.marginTop = 0;
glContainer.marginHeight = 0;
glContainer.marginWidth = 0;
container.setLayout(glContainer);
GridData glReader = new GridData(SWT.FILL, SWT.FILL, false, false, 1, 1);
glReader.widthHint = 150;
dropdownlist = new Combo(container, SWT.BORDER | SWT.READ_ONLY
| SWT.DROP_DOWN);
dropdownlist.setLayoutData(glReader);
populateDropdown();
toggleComboListener();
return container;
}
private void toggleComboListener() {
if(listenerAdded) {
dropdownlist.removeSelectionListener(selectionListener);
} else {
dropdownlist.addSelectionListener(selectionListener);
}
listenerAdded = !listenerAdded;
}
public void populateDropdown() {
PlatformUI.getWorkbench().getDisplay().syncExec(new Runnable() {
@Override
public void run() {
dropdownlist.setItems(new String[]{});
for(String itemName : listOfItems) {
dropdownlist.add(itemName);
}
dropdownlist.setText(currentlySelected);
}
});
}
}
主题似乎在 Eclipse 插件开发的其他领域很容易,例如对话框上自己的工具栏。在这种情况下,我通过 plugin.xml 在我的视角内的主工具栏中添加了一个下拉菜单,如下所示
<menuContribution
locationURI="toolbar:org.eclipse.ui.main.toolbar">
<toolbar
id="com.company.ui.toolbar2">
// other items removed for clarity
// following is a drop-down
<command
commandId="com.company.ui.mydropdown"
label="%config.label.default"
icon="icons/myIcon.png"
style="pulldown">
<visibleWhen checkEnabled="false">
<reference definitionId="com.company.ui.visibilityTester"/>
</visibleWhen>
</command>
</toolbar>
</menuContribution>
我已经在其他地方定义了命令,并且在 plugin.xml 文件中有一个处理程序,该处理程序当前可以像按钮一样工作。
但是,下拉列表未填充。由于以下原因,我需要一种动态填充的方法:
- 下拉列表内容来自API
- 其中一个列表项(或像单击按钮一样单击列表)会启动一个可以编辑列表的对话框
- 关闭对话框意味着需要刷新(重建)列表并重新评估 selected/active 项目
我还需要能够挂钩用户选择不同的列表项并调用我的 API。
我注意到其他在线示例尝试以不同方式创建下拉列表,但我对这些如何连接存在知识空白。例如,在使用贡献的地方,并不总是很清楚它如何链接回 plugin.xml 文件中的特定定义。我还没有看到一个例子可以清楚地说明这一点。
我需要支持 Eclipse 4.4.2 及更高版本,因此当前的 Eclipse 4 示例可能不合适。
感谢任何帮助。
答案是向菜单贡献的工具栏部分添加一个控件,例如:
<menuContribution locationURI="toolbar:org.eclipse.ui.main.toolbar">
<toolbar id="com.company.ui.customToolbar">
<control
class="com.company.ui.MyDropDownContribution"
icon="icons/yourIconHere.png"
label="%config.label.default">
id="theDropdown">
<visibleWhen checkEnabled="false">
<reference definitionId="com.company.ui.isMyTestCaseSatisfied"/>
</visibleWhen>
</control>
</toolbar>
</menuContribution>
然后实施贡献 class 扩展 WorkbenchWindowControlContribution。我的简化代码,包括从列表项之一启动 EXE 的方法(并且可以重新用于做其他事情),本质上是:
public class MyDropDownContribution extends
WorkbenchWindowControlContribution {
private Combo dropdownlist;
private boolean listenerAdded = false;
private String currentlySelected = "Item 1";
private String[] listOfItems = new String[]{ "Item 1", "Item 2", "Item 3", "Launch my EXE" };
private final SelectionAdapter selectionListener = new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
if(e.widget instanceof Combo) {
// if the selection is currentlySelected, do nothing
if(dropdownlist.getText().equals(currentlySelected)) {
return;
}
//if the selection is to launch 'something', do that
if(dropdownlist.getText().equals("Launch my EXE")) {
launchExecutable();
} else {
// otherwise, a new item has been selected, do what you need to
}
}
}
};
private void launchExecutable() {
// place your code to launch your EXE here - you could do some other special case, not just launch EXE
}
@Override
protected Control createControl(Composite parent) {
Composite container = new Composite(parent, SWT.NONE);
GridLayout glContainer = new GridLayout(1, false);
glContainer.marginTop = 0;
glContainer.marginHeight = 0;
glContainer.marginWidth = 0;
container.setLayout(glContainer);
GridData glReader = new GridData(SWT.FILL, SWT.FILL, false, false, 1, 1);
glReader.widthHint = 150;
dropdownlist = new Combo(container, SWT.BORDER | SWT.READ_ONLY
| SWT.DROP_DOWN);
dropdownlist.setLayoutData(glReader);
populateDropdown();
toggleComboListener();
return container;
}
private void toggleComboListener() {
if(listenerAdded) {
dropdownlist.removeSelectionListener(selectionListener);
} else {
dropdownlist.addSelectionListener(selectionListener);
}
listenerAdded = !listenerAdded;
}
public void populateDropdown() {
PlatformUI.getWorkbench().getDisplay().syncExec(new Runnable() {
@Override
public void run() {
dropdownlist.setItems(new String[]{});
for(String itemName : listOfItems) {
dropdownlist.add(itemName);
}
dropdownlist.setText(currentlySelected);
}
});
}
}