我正在嘗試在eclipse中創建一個插件,它在包瀏覽器中右鍵單擊某個文件或文件夾時添加了一個菜單項。該菜單項包含某些必須動態加載的命令(所以我不能在plugin.xml中對它們進行硬編碼)。這些命令實際上是在另一個擴展中,它通過我提供的擴展點附加到我的插件上。Eclipse插件:用命令和相應的處理程序動態填充菜單
我現在正在做的是創建菜單項,使用附加到我的擴展點的所有命令填充它,並將ButtonListener添加到它們全部。一切都這樣工作,但有一個問題。我需要的信息上在Package Explorer用戶右鍵點擊(是它的的IFile或的iFolder項目?)和項目,從我的研究,我需要做的是,在處理類似如下:
public Object execute(ExecutionEvent event) throws ExecutionException {
ISelection currentSelection = HandlerUtil.getCurrentSelection(event);
TreeSelection treeSelection = (TreeSelection) currentSelection;
Object firstElement = treeSelection.getFirstElement();
ActionMenu.setNode(firstElement);
return null;
}
其中,Action菜單是表示菜單項的實際類,負責填充它。不幸的是,該代碼現在在我的插件中不會被調用。
我的問題是:
我如何才能創建動態每個命令的處理程序執行()函數被調用?或者在我的ActionMenu類中有更好的方法來獲取用戶右鍵點擊的選擇(知道它是一個IFolder還是IFile)?
下面是我的ActionMenu類(fill()函數中的相關代碼,它將每個命令添加爲子菜單項和ButtonListener嵌套類)。 ICommand的是命令必須在其他擴展實現接口:
...
public final void fill(final Menu menu, final int index) {
// Here you could get selection and decide what to do
// You can also simply return if you do not want to show a menu
List<ICommand> commands = new ArrayList<ICommand>();
IConfigurationElement[] contributions = Platform.getExtensionRegistry().getConfigurationElementsFor(Extension_Point_ID);
try {
for (IConfigurationElement e : contributions) {
final Object o =
e.createExecutableExtension("class");
commands.add((ICommand) o);
}
} catch (CoreException ex) {
System.out.println(ex.getMessage());
}
for (ICommand command : commands)
{
MenuItem menuItem = new MenuItem(menu, SWT.CHECK, index);
menuItem.setText(command.getName());
menuItem.addSelectionListener(new ButtonListener(command));
}
}
public class ButtonListener extends SelectionAdapter {
ICommand command_;
public ButtonListener(ICommand command) {
command_ = command;
}
@Override
public final void widgetSelected(final SelectionEvent e) {
if (node_ instanceof org.eclipse.core.resources.IFile) {
command_.executeFile(node_);
}
else if (node_ instanceof org.eclipse.core.resources.IFolder) {
command_.executeFolder(node_);
}
}
}
這裏是我的plugin.xml文件的內容:
<?xml version="1.0" encoding="UTF-8"?>
<?eclipse version="3.4"?>
<plugin>
<extension-point id="ca.polymtl.log8430.Command" name="Command" schema="schema/ca.polymtl.log8430.Command.exsd"/>
<extension point="org.eclipse.ui.menus">
<menuContribution locationURI="popup:org.eclipse.ui.navigator.ProjectExplorer#PopupMenu?after=additions">
<menu
id="apply_command"
label="ApplyCommand">
</menu>
</menuContribution>
<menuContribution locationURI="popup:apply_command?after=additions">
<dynamic
class="ca.polymtl.log8430.popup.ActionMenu"
id="ca.polymtl.log8430.popup.actionMenu">
</dynamic>
</menuContribution>
</extension>
<extension
point="org.eclipse.ui.handlers">
<handler
class="ca.polymtl.log8430.Handler"
commandId="ca.polymtl.log8430.Command1">
</handler>
</extension>
<extension
point="org.eclipse.ui.commands">
<command
id="ca.polymtl.log8430.Command1"
name="Command_1">
</command>
</extension>
</plugin>
感謝您的幫助,如果你需要更多的細節,請不要猶豫,問。
感謝您的建議!如果它是選定的文件或文件夾,我將如何檢查?該插件絕不會在widgetSelected()函數中輸入我的兩個if()語句。 – Choub890
@ Choub890添加適配器管理器使用 –
我在我的widgetSelected()函數中添加了IResource資源= ...行代碼,並且由於資源變量爲空,它仍然不會輸入我的if()語句。當我在包資源管理器中選擇文件或文件夾時會發生這種情況。 – Choub890