Я создаю приложение RCP затмения, и у меня есть один вопрос:
В файле plugin.xml я объявил меню с 5 командами. Таким образом, это выглядит так:
Menu A
subMenu A1
subMenu A2
я хочу сказать, чтобы затмить, чтобы оценить, должны ли подменю быть видимыми только тогда, когда курсорная мышь нависает над пунктом главного меню, то есть с меню А. Как я могу это сделать?
заранее спасибо
<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>
Я сделал что-то подобное в прошлом, но не уверен, что трюк соответствует состоянию Eclipse; Я использовал dynamic
элемент в своем объявлении меню и sourceProvider
из точки расширения org.eclipse.ui.services
.
Я предполагаю, что он также должен быть применим к вашему всплывающему меню.
Класс, связанный с динамическим элементом, расширяет 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 маскируется в зависимости от времени...
Примечание: некоторые идентификаторы могут казаться довольно странными, но источники извлекаются из моего плагина компании
Надеюсь, это поможет...
Я сомневаюсь, что вы можете запустить это с помощью 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-фрагменте
edit: для всплывающего меню вы можете сделать
final Menu tableMenu = new Menu(shell, SWT.POP_UP);
MenuItem item = new MenuItem(tableMenu, SWT.PUSH);
item.setText("Hover Me");
item.addArmListener(armListener);