/**
* Copyright 2004-2016 Riccardo Solmi. All rights reserved.
* This file is part of the Whole Platform.
*
* The Whole Platform is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* The Whole Platform is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with the Whole Platform. If not, see <http://www.gnu.org/licenses/>.
*/
package org.whole.lang.e4.ui.menu;
import static org.whole.lang.e4.ui.actions.IE4UIConstants.*;
import java.util.HashSet;
import java.util.Set;
import org.eclipse.jface.action.ActionContributionItem;
import org.eclipse.jface.action.GroupMarker;
import org.eclipse.jface.action.IAction;
import org.eclipse.jface.action.IContributionItem;
import org.eclipse.jface.action.IMenuManager;
import org.eclipse.jface.action.MenuManager;
import org.eclipse.jface.action.Separator;
import org.whole.lang.bindings.IBindingManager;
import org.whole.lang.e4.ui.actions.AbstractUIBuilder;
import org.whole.lang.e4.ui.expressions.VisibilityExpression;
import org.whole.lang.e4.ui.handler.HandlersBehavior;
import org.whole.lang.model.IEntity;
import org.whole.lang.reflect.EntityDescriptor;
import org.whole.lang.reflect.IEditorKit;
import org.whole.lang.reflect.ReflectionFactory;
import org.whole.lang.ui.actions.IUpdatableAction;
/**
* @author Enrico Persiani
*/
public class JFaceMenuBuilder extends AbstractUIBuilder<IContributionItem, IMenuManager> {
protected Set<IUpdatableAction> actionsToUpdate;
protected IMenuManager menuManager;
public JFaceMenuBuilder() {
this.actionsToUpdate = new HashSet<IUpdatableAction>();
this.menuManager = null;
}
public IMenuManager getContainer() {
return menuManager;
}
public IMenuManager setContainer(IMenuManager menuManager) {
IMenuManager previous = this.menuManager;
this.menuManager = menuManager;
return previous;
}
public void before() {
actionRegistry.updateBaseActions();
}
public void after() {
actionRegistry.updateActions(actionsToUpdate);
actionsToUpdate.clear();
}
public void addSeparator() {
addItem(new Separator());
}
public void addSeparator(String groupName) {
addItem(new Separator(groupName));
}
public void addGroupMarker(String groupName) {
addItem(new GroupMarker(groupName));
}
public void addUndoItem() {
addItem(actionRegistry.getAction(EDIT_UNDO));
}
public void addRedoItem() {
addItem(actionRegistry.getAction(EDIT_REDO));
}
public void addCutItem() {
addItem(actionRegistry.getAction(EDIT_CUT));
}
public void addCopyItem() {
addItem(actionRegistry.getAction(EDIT_COPY));
}
public void addCopyEntityPathItem() {
addItem(actionRegistry.getAction(COPY_ENTITY_PATH_COMMAND_ID));
}
public void addCopyAsImageItem() {
addItem(actionRegistry.getAction(COPY_AS_IMAGE_COMMAND_ID));
}
public void addPasteAsItem() {
addItem(actionRegistry.getAction(PASTE_AS_COMMAND_ID));
}
public void addPasteItem() {
addItem(actionRegistry.getAction(EDIT_PASTE));
}
public void addDeleteItem() {
addItem(actionRegistry.getAction(EDIT_DELETE));
}
public void addSelectAllItem() {
addItem(actionRegistry.getAction(EDIT_SELECT_ALL));
}
@Override
public void addContentAssistItem() {
IMenuManager menu = createMenu(CONTENT_ASSIST_LABEL, getContentAssistVisibleWhen());
addItem(menu);
IContributionItem ici = new ContentAssistCompositeContributionItem(this);
menu.add(ici);
}
@Override
public void addEntityAssistItem() {
IMenuManager menu = createMenu(ENTITY_ASSIST_LABEL, getValidFocusPartVisibleWhen());
addItem(menu);
IContributionItem ici = new EntityAssistCompositeContributionItem(this);
menu.add(ici);
}
@Override
public void addFeatureAssistItem() {
IMenuManager menu = createMenu(FEATURE_ASSIST_LABEL, getFeatureAssistVisibleWhen());
addItem(menu);
IContributionItem ici = new FeatureAssistCompositeContributionItem(this);
menu.add(ici);
}
protected void addActionsItem(String menuLabel, VisibilityExpression expression, IContributionItem ici) {
IMenuManager menu = createMenu(menuLabel, expression);
addItem(menu);
menu.add(ici);
}
public void addNotationsItem() {
IBindingManager bm = getBindings();
IMenuManager menu = createMenu(NOTATION_LABEL, getNotationsVisibleWhen());
addItem(menu);
if (!HandlersBehavior.isValidFocusEntityPart(bm))
return;
IEntity focusEntity = bm.wGet("focusEntity");
IEditorKit selectedEditorKit = focusEntity.wGetEditorKit();
for (IEditorKit editorKit : ReflectionFactory.getEditorKits(focusEntity.wGetLanguageKit().getURI())) {
if (!editorKit.canApply(focusEntity.wGetLanguageKit()))
continue;
IUpdatableAction action = actionRegistry.getSelectNotationAction(editorKit);
action.setChecked(editorKit == selectedEditorKit);
menu.add(action);
}
}
public void addImportItem() {
addItem(actionRegistry.getAction(IMPORT_COMMAND_ID));
}
public void addRemoveItem() {
IMenuManager menu = createMenu(REMOVE_LABEL);
IMenuManager previous = setContainer(menu);
addDeleteItem();
addDefaultItem();
setContainer(previous);
addItem(menu);
}
@Override
public void addDefaultItem() {
addItem(actionRegistry.getAction(REPLACE_WITH_DEFAULT_COMMAND_ID));
}
public void addReplaceEntityItem(EntityDescriptor<?> ed) {
IUpdatableAction action = actionRegistry.getReplaceEntityAction(ed);
actionsToUpdate.add(action);
addItem(action);
}
public void addAddEntityItem(EntityDescriptor<?> ed) {
IUpdatableAction action = actionRegistry.getAddEntityAction(ed);
actionsToUpdate.add(action);
addItem(action);
}
protected IMenuManager createMenu(String name, VisibilityExpression expression) {
IMenuManager menu = createMenu(name);
menu.setVisible(expression.isVisible(getBindings()));
return menu;
}
protected IMenuManager createMenu(String name) {
return new MenuManager(name);
}
protected void addItem(IAction action) {
addItem(new ActionContributionItem(action));
}
protected void addItem(IContributionItem menu) {
menuManager.add(menu);
}
}