Меню и действия Eclipse RCP: настройка или код?
Это общий вопрос, но моя текущая проблема вращается вокруг обработки меню.
в обычном плагине с действиями меню contributes вы бы настроили ActionSets и т. д. в плагине.конфигурация xml. Это, очевидно, разумно.
Я работаю над приложением RCP (на самом деле RAP), и мне интересно, Стоит ли пытаться настроить все через плагин.XML. Мой плагин не должен взаимодействовать с другими неизвестными плагинами, поэтому теоретически у меня есть управление. Я могу программно добавлять меню и действия.
Я пытался настроить меню, которое содержит подменю. Я попытался определить ActionSets и связать один внутри другого, но безуспешно. Некоторые элементы необходимо отключить в зависимости от роли пользователя.
Я думаю, что я мог бы закодировать все это за несколько минут, но я не уверен, что это соответствует "этосу" eclipse.
какие мнения есть? Приложение станет довольно большим так что я хотел бы сделать подход с самого начала. Возможно, кто-то может указать мне на пример настройки вложенного меню: -)
4 ответов
мое мнение, что плагин.реализация XML-это путь.
мои основные две причины использования этого метода:
- очень легко перенастроить и реорганизовать меню и кнопки без написания кода java.
- очень четкая иерархическая визуализация деревьев меню.
вот фрагмент кода, который реализует меню и подменю. В этом примере они добавляются в Главное меню.
вы можете вставьте это в свой плагин.XML-код:
<extension
name="Main Menu Contributions"
point="org.eclipse.ui.menus">
<menuContribution
allPopups="false"
locationURI="menu:org.eclipse.ui.main.menu">
<menu
id="fileMenu"
label="File">
<command
commandId="org.eclipse.ui.file.exit"
label="Exit"
style="push">
</command>
</menu>
<menu
label="Edit">
<command
commandId="org.eclipse.ui.edit.selectAll"
label="Select All"
style="push">
</command>
<menu
label="Submenu">
<command
commandId="org.eclipse.ui.edit.selectAll"
label="Select All Submenu"
style="push">
</command>
<command
commandId="org.eclipse.ui.edit.delete"
label="Delete submenu"
style="push">
</command>
</menu>
</menu>
</menuContribution>
</extension>
для активации / деактивации меню необходимо использовать основные выражения для включения / отключения обработчиков команд. Если команда не имеет активных обработчиков, она будет отключена. Таким образом, пункт меню, вызывающий эту команду, также будет отключен.
в следующих фрагментах кода показано, как создать кнопку на панели инструментов вид и он включается/отключается в зависимости от значения переменной. Оголите в уме, что вы будете нужно изменить некоторые вещи в этом коде, чтобы заставить его работать. Большинство изменений относятся к ссылочным именам и реализации класса.
создать кнопку на панели инструментов (плагинов.XML-код):
<extension
name="View Toolbar Contributions"
point="org.eclipse.ui.menus">
<menuContribution
allPopups="false"
locationURI="toolbar:myapp.views.MyView">
<command
commandId="myapp.commands.PauseSound"
icon=""
label="Pause Playback Sound"
style="push"
tooltip="Pause">
</command>
</menuContribution>
</extension>
создать команду (плагин.XML-код):
<extension
id="myapp.commands.PauseSound"
name="Pause sound command"
point="org.eclipse.ui.commands">
<command
id="myapp.commands.PauseSound"
name="Pause Sound">
</command>
</extension>
создайте обработчик команд (плагин.XML-код):
<extension
point="org.eclipse.ui.handlers">
<handler
commandId="myapp.commands.PauseSound">
<activeWhen>
<with
variable="myapp.commands.sourceprovider.active">
<or>
<equals
value="PLAYING">
</equals>
<equals
value="PAUSED">
</equals>
</or>
</with>
</activeWhen>
<class
class="myapp.rcp.commands.toolbar.PausePlayback">
</class>
</handler>
</extension>
создайте переменную состояния для команды (plugin.XML-код):
<extension
point="org.eclipse.ui.services">
<sourceProvider
provider="myapp.commands.sourceprovider.CommandState">
<variable
name="myapp.commands.sourceprovider.active"
priorityLevel="workbench">
</variable>
</sourceProvider>
</extension>
реализовать класс, который изменяет переменную состояние:
public class CommandState extends AbstractSourceProvider {
public final static String STATE = "myapp.commands.sourceprovider.active";
public final static String STOPPED = "STOPPED";
public final static String PLAYING = "PLAYING";
public final static String PAUSED = "PAUSED";
public final static String NOT_LOADED = "NOT_LOADED";
enum State {
NOT_LOADED, PLAYING, PAUSED, STOPPED
};
private State curState = State.NOT_LOADED;
@Override
public void dispose() {
}
@Override
public String[] getProvidedSourceNames() {
return new String[] { STATE };
}
// You cannot return NULL
@SuppressWarnings("unchecked")
@Override
public Map getCurrentState() {
Map map = new HashMap(1);
if (curState == State.PLAYING)
map.put(STATE, PLAYING);
else if (curState == State.STOPPED)
map.put(STATE, STOPPED);
else if (curState == State.PAUSED)
map.put(STATE, PAUSED);
return map;
}
public void setPlaying() {
fireSourceChanged(ISources.WORKBENCH, STATE, PLAYING);
}
public void setPaused() {
fireSourceChanged(ISources.WORKBENCH, STATE, PAUSED);
}
public void setStopped() {
fireSourceChanged(ISources.WORKBENCH, STATE, STOPPED);
}
public void setNotLoaded() {
fireSourceChanged(ISources.WORKBENCH, STATE, NOT_LOADED);
}
}
более подробную информацию о том, как реализовать эти функции можно найти в этих местах:
для Eclipse есть два разных способа внести свой вклад в верстак: действия и команды.
Я определенно рекомендую команды как более новые и более продвинутые, чем действия. Недостатки действий, указанные здесь (1):
- пользовательский интерфейс и обработка всегда связаны. Вы не можете разделить друг друга
- хотя действия могут быть внесены в различные части верстака (всплывающее меню/Панель инструментов), все они были различные точки расширения, и поэтому вы в конечном итоге дублируете XML в нескольких местах. Хуже всего то, что не все точки расширения ожидают одинаковой конфигурации.
- указание действий в нескольких местах является кошмаром обслуживания. Если вам нужно изменить значок действия, вам нужно изменить его во всех местах.
-
еще одна проблема с дублированием действий в плагин.xml - это несколько экземпляров одних и тех же действий, которые будут созданы в память!--2-->
Если вы пишете приложение RCP, хорошей практикой является создание держателей места в вашем ActionBarAdvisor. Хотя это определило бы основную структуру меню и панелей инструментов, вы можете расширить menuContributions и использовать команды для внесения фактических элементов меню/инструмента.
для добавления действий в RCP вы также можете использовать ApplicationActinBarAcvisor.Это проще, чем вышеупомянутое решение В этом u просто нужно сначала объявить действие как объект IWorkbenchAction, затем в методе "protected void makeActions(iworkbenchwindow window)" u может его зарегистрировать. И последний шаг-добавить его в меню. Следующий код поможет вам.
1.Сначала объявите акцию: -
private IWorkbenchAction newAction
2.Регистрация действий :-
protected void makeActions(IWorkbenchWindow window) {
newAction = ActionFactory.NEW_WIZARD_DROP_DOWN.create(window);
register(newAction);
newAction.setText("New");
3.Последний шаг-добавить действие в меню: -
MenuManager filemenu = new MenuManager("&File", "file");
filemenu.add(newAction);
вы также можете добавить действие в панели инструментов следующим образом:-
protected void fillCoolBar(ICoolBarManager coolBar) {
IToolBarManager toolbar = new ToolBarManager(coolBar.getStyle());
coolBar.add(toolbar);
toolbar.add(newAction);