我正在构建一个eclipse RCP应用程序,我有一个问题:
在plugin.xml文件中,我声明了一个包含5个命令的菜单。总之,它是这样的:
Menu A
subMenu A1
subMenu A2我想要的是告诉eclipse来评估子菜单是否必须只有在光标鼠标悬停在主菜单项上时才可见,即菜单A。我该怎么做?
提前感谢
<extension
point="org.eclipse.ui.menus">
<menuContribution
allPopups="false"
locationURI="popup:com.x.sat.ui.views.ProjectsView?after=com.x.sat.ui.commands.closeproject">
<menu
icon="icons/repository_rep.gif"
id="com.x.sat.ui.sgc"
label="Gestion de Configuration">
<command
commandId="com.x.sat.sgc.ui.addProject"
label="Partager le projet"
style="push">
<visibleWhen
checkEnabled="false">
<reference
definitionId="satProjetOrSatModelProjectSelected">
</reference>
</visibleWhen>
</command>
<command
commandId="com.x.sat.sgc.ui.synchronize"
label="Synchroniser avec le dépôt ..."
style="push">
<visibleWhen
checkEnabled="false">
<reference
definitionId="synchronizeObject">
</reference>
</visibleWhen>
</command>
<command
commandId="com.x.sat.sgc.ui.browseRepository"
label="Parcourir le dépôt...."
style="push">
</command>
<command
commandId="com.x.sat.sgc.ui.compare"
label="Comparer..."
style="push">
</command>
<command
commandId="com.x.sat.sgc.ui.disconnect"
label="Déconnecter le projet ..."
style="push">
</command>
</menu>
</menuContribution>
</extension>发布于 2014-03-13 19:08:38
我怀疑您是否可以使用plugin.xml和visiblewhen来运行它。由于您知道要侦听的MenuItem,因此可以添加一个ArmListener。它将侦听MenuItem,您可以在内部实现visibleWhen命令,或者调用一些其他方法来触发您的项目。
ArmListener armListener = new ArmListener() {
@Override
public void widgetArmed(ArmEvent e) {
System.out.println(e);
}
};并将其称为:
Menu systemMenu = display.getSystemMenu();
if (systemMenu != null) {
MenuItem sysItem = getItem(systemMenu, SWT.ID_QUIT);
sysItem.addArmListener(armListener);
}在此SWT Snippet中可以找到用法的完整示例
编辑:对于弹出菜单,您可以执行以下操作
final Menu tableMenu = new Menu(shell, SWT.POP_UP);
MenuItem item = new MenuItem(tableMenu, SWT.PUSH);
item.setText("Hover Me");
item.addArmListener(armListener);发布于 2014-03-14 23:59:09
我在过去做过类似的事情,但不确定它是否符合Eclipse的最新技术;我在菜单声明中使用了一个dynamic元素,并从org.eclipse.ui.services扩展点使用了一个sourceProvider。
我想它也应该适用于你的弹出菜单。
链接到动态元素的类扩展CompoundContributionItem并覆盖getContributionItems()方法,以便更新sourceProvider变量状态...这里有一个诀窍,虽然我的头脑不是很清楚,但它确实有效。
@Override
protected IContributionItem[] getContributionItems() {
SourceProvider.getInstance().updateState();
return new IContributionItem[0];
}SourceProvider示例:
public class SourceProvider extends AbstractSourceProvider {
private static String ID = "fr.jln.stackoverflow.services.SourceProvider";
private static String VAR = "fr.jln.stackoverflow.variable1";
private static final String VAL_TRUE = "TRUE";
private static final String VAL_FALSE = "FALSE";
public static SourceProvider getInstance() {
ISourceProviderService ser = (ISourceProviderService) PlatformUI.getWorkbench().getService(ISourceProviderService.class);
return (SourceProvider) ser.getSourceProvider(ID);
}
boolean state = false;
public SourceProvider() {}
@Override
public Map<?, ?> getCurrentState() {
String value = null;
Map<String, String> map = new HashMap<String, String>(1);
// fake variable (my id)
map.put(ID, VAL_TRUE);
// var state
value = state ? VAL_TRUE : VAL_FALSE;
map.put(VAR, value);
return map;
}
@Override
public String[] getProvidedSourceNames() {
return new String[] { ID, VAR };
}
public void updateState() {
Calendar cal = Calendar.getInstance();
int min = cal.get(Calendar.MINUTE);
state = (min % 2 == 0);
fireSourceChanged(ISources.WORKBENCH, VAR, state?VAL_TRUE:VAL_FALSE);
}
@Override
public void dispose() {}
}plugin.xml:
<extension
point="org.eclipse.ui.menus">
<menuContribution
allPopups="false"
locationURI="menu:org.eclipse.ui.main.menu?after=additions">
<menu
label="StackOverflow">
<command
commandId="fr.jln.stackoverflow.command1"
label="Command 1"
style="push">
<visibleWhen
checkEnabled="false">
<with
variable="fr.jln.stackoverflow.variable1">
<equals
value="TRUE">
</equals>
</with>
</visibleWhen>
</command>
<command
commandId="fr.jln.stackoverflow.command2"
label="Command 2"
style="push">
<visibleWhen
checkEnabled="false">
<with
variable="fr.jln.stackoverflow.variable1">
<equals
value="FALSE">
</equals>
</with>
</visibleWhen>
</command>
<dynamic
class="ContributionItem"
id="fr.jln.stackoverflow.dynamic1">
</dynamic>
</menu>
</menuContribution>
</extension>
<extension
point="org.eclipse.ui.services">
<sourceProvider
provider="SourceProvider">
<variable
name="fr.jln.stackoverflow.variable1"
priorityLevel="workbench">
</variable>
</sourceProvider>
</extension>对于这个示例,在结果中您应该有一个包含2项的菜单,其中1项根据时间而被屏蔽。
注意:一些ids可能看起来很奇怪,但源代码是从我的公司插件中提取出来的
希望这能有所帮助..。
https://stackoverflow.com/questions/22355660
复制相似问题