/*******************************************************************************
* Copyright (c) 2010 SAP AG.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Emil Simeonov - initial API and implementation.
* Dimitar Donchev - initial API and implementation.
* Dimitar Tenev - initial API and implementation.
* Nevena Manova - initial API and implementation.
* Georgi Konstantinov - initial API and implementation.
*******************************************************************************/
package org.eclipse.wst.sse.sieditor.ui.v2.dt;
import org.eclipse.jface.action.Action;
import org.eclipse.jface.action.GroupMarker;
import org.eclipse.jface.action.IMenuManager;
import org.eclipse.jface.action.MenuManager;
import org.eclipse.jface.action.Separator;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.wst.sse.sieditor.ui.i18n.Messages;
import org.eclipse.wst.sse.sieditor.ui.v2.AbstractTreeContextMenuListener;
import org.eclipse.wst.sse.sieditor.ui.v2.dt.actionenablement.DataTypesEditorActionEnablementForSelectionManager;
import org.eclipse.wst.sse.sieditor.ui.v2.dt.nodes.IDataTypesTreeNode;
import org.eclipse.wst.sse.sieditor.ui.v2.nodes.ITreeNode;
public class DTTreeContextMenuListener extends AbstractTreeContextMenuListener {
private Action addNamespaceAction;
private Action deleteAction;
private Action addElementAction;
private Action addSimpleTypeAction;
private Action addStructureTypeAction;
private Action addAttributeAction;
private GroupMarker groupGlobalActions;
private Separator groupContextActions;
private Separator groupEdit;
private Separator groupCopyPaste;
private Separator groupRefactor;
private boolean init = true;
private Action copyTypeAction;
private Action pasteTypeAction;
private Action addGlobalElementAction;
private Separator groupRefactorNamespace;
private Action maneAnInlineNamespaceAction;
private Action extractNamespaceAction;
private Separator groupRefactorGlobalElement;
private Action convertToAnonymousTypeWithTypeContentsAction;
private Action convertToAnonymousTypeAction;
private Action convertToGlobalTypeAction;
private IMenuManager refactorSubmenuManager;
private final DataTypesEditorActionEnablementForSelectionManager selectionEnablementManager;
public DTTreeContextMenuListener(final IDataTypesFormPageController controller, final TreeViewer treeViewer) {
super(controller, treeViewer);
this.selectionEnablementManager = new DataTypesEditorActionEnablementForSelectionManager(this);
this.selectionEnablementManager.setController(controller);
}
@Override
protected IDataTypesFormPageController getController() {
return (IDataTypesFormPageController) super.getController();
}
public void menuAboutToShow(final IMenuManager menu) {
createGroups(menu);
if (getController() instanceof ISiEditorDataTypesFormPageController) {
addAddNamespaceMenuAction(menu);
}
addAddGlobalElementMenuAction(menu);
addAddSimpleTypeMenuAction(menu);
addAddStructureTypeMenuAction(menu);
addAddElementMenuAction(menu);
addAddAttributeMenuAction(menu);
addRefactorSubMenu(menu);
addOpenInNewEditorMenuAction(menu);
if (getController() instanceof ISiEditorDataTypesFormPageController) {
addCopyTypeMenuAction(menu);
addPasteTypeMenuAction(menu);
}
addRemoveMenuAction(menu);
updateActionsState((IStructuredSelection) treeViewer.getSelection());
}
protected void updateActionsState(final IStructuredSelection selection) {
selectionEnablementManager.selectionChanged(selection);
}
private void createGroups(final IMenuManager menu) {
if (init) {
groupGlobalActions = new GroupMarker(ContextMenuConstants.GROUP_ADD_ITEMS);
groupContextActions = new Separator(ContextMenuConstants.GROUP_CONTEXT_ITEMS);
groupEdit = new Separator(ContextMenuConstants.GROUP_EDIT);
groupCopyPaste = new Separator(ContextMenuConstants.GROUP_COPY_PASTE);
groupRefactor = new Separator(ContextMenuConstants.GROUP_REFACTOR);
groupRefactorGlobalElement = new Separator(ContextMenuConstants.GROUP_REFACTOR_GLOBAL_TYPE);
groupRefactorNamespace = new Separator(ContextMenuConstants.GROUP_REFACTOR_NAMESPACE);
init = false;
}
menu.add(groupGlobalActions);
menu.add(groupContextActions);
menu.add(groupRefactor);
menu.add(groupOpenInNewEditor);
menu.add(groupCopyPaste);
menu.add(groupEdit);
// menu.add(new GroupMarker(IWorkbenchActionConstants.MB_ADDITIONS));
}
public void addAddNamespaceMenuAction(final IMenuManager manager) {
if (addNamespaceAction == null) {
addNamespaceAction = new Action(Messages.DTTreeContextMenuListener_add_namespace_action, Action.AS_PUSH_BUTTON) {
@Override
public void run() {
((ISiEditorDataTypesFormPageController) getController()).handleAddNewNamespaceAction();
}
};
addNamespaceAction.setId(ContextMenuConstants.ADD_NAMESPACE_ACTION_ID);
}
manager.appendToGroup(ContextMenuConstants.GROUP_ADD_ITEMS, addNamespaceAction);
}
public void addAddSimpleTypeMenuAction(final IMenuManager manager) {
if (addSimpleTypeAction == null) {
addSimpleTypeAction = new Action(Messages.DTTreeContextMenuListener_add_simple_type_action, Action.AS_PUSH_BUTTON) {
@Override
public void run() {
getController().handleAddSimpleTypeAction(
(ITreeNode) ((IStructuredSelection) treeViewer.getSelection()).getFirstElement());
}
};
addSimpleTypeAction.setId(ContextMenuConstants.ADD_SIMPLE_TYPE_ACTION_ID);
}
manager.appendToGroup(ContextMenuConstants.GROUP_ADD_ITEMS, addSimpleTypeAction);
}
public void addAddGlobalElementMenuAction(final IMenuManager manager) {
if (addGlobalElementAction == null) {
addGlobalElementAction = new Action(Messages.DTTreeContextMenuListener_Add_global_element, Action.AS_PUSH_BUTTON) {
@Override
public void run() {
getController().handleAddGlobalElementAction(
(IDataTypesTreeNode) ((IStructuredSelection) treeViewer.getSelection()).getFirstElement());
}
};
addGlobalElementAction.setId(ContextMenuConstants.ADD_GLOBAL_ELEMENT_ACTION_ID);
}
manager.appendToGroup(ContextMenuConstants.GROUP_ADD_ITEMS, addGlobalElementAction);
}
public void addAddStructureTypeMenuAction(final IMenuManager manager) {
if (addStructureTypeAction == null) {
addStructureTypeAction = new Action(Messages.DTTreeContextMenuListener_add_structure_type_action,
Action.AS_PUSH_BUTTON) {
@Override
public void run() {
getController().handleAddStructureTypeAction(
(ITreeNode) ((IStructuredSelection) treeViewer.getSelection()).getFirstElement());
}
};
addStructureTypeAction.setId(ContextMenuConstants.ADD_STRUCTURE_TYPE_ACTION_ID);
}
manager.appendToGroup(ContextMenuConstants.GROUP_ADD_ITEMS, addStructureTypeAction);
}
public void addAddElementMenuAction(final IMenuManager manager) {
if (addElementAction == null) {
addElementAction = new Action(Messages.DTTreeContextMenuListener_add_element_action, Action.AS_PUSH_BUTTON) {
@Override
public void run() {
getController().handleAddElementAction(
(ITreeNode) ((IStructuredSelection) treeViewer.getSelection()).getFirstElement());
}
};
addElementAction.setId(ContextMenuConstants.ADD_ELEMENT_ACTION_ID);
}
manager.appendToGroup(ContextMenuConstants.GROUP_CONTEXT_ITEMS, addElementAction);
}
private void addAddAttributeMenuAction(final IMenuManager manager) {
if (addAttributeAction == null) {
addAttributeAction = new Action(Messages.DataTypesMasterDetailsBlock_add_attribute_button, Action.AS_PUSH_BUTTON) {
@Override
public void run() {
getController().handleAddAttributeAction(
(ITreeNode) ((IStructuredSelection) treeViewer.getSelection()).getFirstElement());
}
};
addAttributeAction.setId(ContextMenuConstants.ADD_ATTRIBUTE_ACTION_ID);
}
manager.appendToGroup(ContextMenuConstants.GROUP_CONTEXT_ITEMS, addAttributeAction);
}
private void addRefactorSubMenu(final IMenuManager manager) {
refactorSubmenuManager = new MenuManager(Messages.DTTreeContextMenuListener_refactor_submenu,
ContextMenuConstants.REFACTOR_SUBMENU_ID);
refactorSubmenuManager.add(groupRefactorGlobalElement);
refactorSubmenuManager.add(groupRefactorNamespace);
addExtractNamespaceAction(refactorSubmenuManager);
addMakeAnInlineNamespaceAction(refactorSubmenuManager);
addConvertToGlobalTypeAction(refactorSubmenuManager);
addConvertToAnonymoysTypeAction(refactorSubmenuManager);
addConvertToAnonymoysTypeWithTypeContentsAction(refactorSubmenuManager);
manager.appendToGroup(ContextMenuConstants.GROUP_REFACTOR, refactorSubmenuManager);
}
private void addMakeAnInlineNamespaceAction(final IMenuManager submenuManager) {
if (maneAnInlineNamespaceAction == null) {
maneAnInlineNamespaceAction = new Action(Messages.DTTreeContextMenuListener_make_an_inline_namespace_action, Action.AS_PUSH_BUTTON) {
@Override
public void run() {
getController().handleMakeAnInlineNamespace(
(ITreeNode) ((IStructuredSelection) treeViewer.getSelection()).getFirstElement());
}
};
maneAnInlineNamespaceAction.setId(ContextMenuConstants.MAKE_AN_INLINE_NAMESPACE_ACTION_ID);
}
submenuManager.appendToGroup(ContextMenuConstants.GROUP_REFACTOR_NAMESPACE, maneAnInlineNamespaceAction);
}
private void addExtractNamespaceAction(final IMenuManager submenuManager) {
if (extractNamespaceAction == null) {
extractNamespaceAction = new Action(Messages.DTTreeContextMenuListener_extract_namespace_action,
Action.AS_PUSH_BUTTON) {
@Override
public void run() {
getController().handleExtractNamespace(
(ITreeNode) ((IStructuredSelection) treeViewer.getSelection()).getFirstElement());
}
};
extractNamespaceAction.setId(ContextMenuConstants.EXTRACT_NAMESPACE_ACTION_ID);
}
submenuManager.appendToGroup(ContextMenuConstants.GROUP_REFACTOR_NAMESPACE, extractNamespaceAction);
}
private void addConvertToGlobalTypeAction(final IMenuManager submenuManager) {
if (convertToGlobalTypeAction == null) {
convertToGlobalTypeAction = new Action(Messages.DTTreeContextMenuListener_make_type_global_context_menu_label,
Action.AS_PUSH_BUTTON) {
@Override
public void run() {
getController().handleConvertToGlobalAction(
(ITreeNode) ((IStructuredSelection) treeViewer.getSelection()).getFirstElement());
}
};
convertToGlobalTypeAction.setId(ContextMenuConstants.CONVERT_TO_GLOBAL_TYPE_ACTION_ID);
}
submenuManager.appendToGroup(ContextMenuConstants.GROUP_REFACTOR_GLOBAL_TYPE, convertToGlobalTypeAction);
}
private void addConvertToAnonymoysTypeAction(final IMenuManager submenuManager) {
if (convertToAnonymousTypeAction == null) {
convertToAnonymousTypeAction = new Action(Messages.DTTreeContextMenuListener_make_type_anonymous_context_menu_label,
Action.AS_PUSH_BUTTON) {
@Override
public void run() {
getController().handleConvertToAnonymousTypeAction(
(ITreeNode) ((IStructuredSelection) treeViewer.getSelection()).getFirstElement());
}
};
convertToAnonymousTypeAction.setId(ContextMenuConstants.CONVERT_TO_ANONYMOUS_TYPE_ID);
}
submenuManager.appendToGroup(ContextMenuConstants.GROUP_REFACTOR_GLOBAL_TYPE, convertToAnonymousTypeAction);
}
private void addConvertToAnonymoysTypeWithTypeContentsAction(final IMenuManager submenuManager) {
if (convertToAnonymousTypeWithTypeContentsAction == null) {
convertToAnonymousTypeWithTypeContentsAction = new Action(
Messages.DTTreeContextMenuListener_inline_structure_type_action, Action.AS_PUSH_BUTTON) {
@Override
public void run() {
getController().handleConvertToAnonymousTypeWithTypeContentsAction(
(ITreeNode) ((IStructuredSelection) treeViewer.getSelection()).getFirstElement());
}
};
convertToAnonymousTypeWithTypeContentsAction
.setId(ContextMenuConstants.CONVERT_TO_ANONYMOUS_TYPE_WITH_TYPE_CONTENTS_ID);
}
submenuManager.appendToGroup(ContextMenuConstants.GROUP_REFACTOR_GLOBAL_TYPE,
convertToAnonymousTypeWithTypeContentsAction);
}
/**
* Displays this action in the context menu.
*
* @param manager
*/
public void addRemoveMenuAction(final IMenuManager manager) {
if (deleteAction == null) {
deleteAction = new Action(Messages.DTTreeContextMenuListener_remove_action, Action.AS_PUSH_BUTTON) {
@Override
public void run() {
getController().handleRemoveAction(((IStructuredSelection) treeViewer.getSelection()).toList());
}
};
deleteAction.setId(ContextMenuConstants.REMOVE_ACTION_ID);
}
manager.appendToGroup(ContextMenuConstants.GROUP_COPY_PASTE, deleteAction);
}
public void addCopyTypeMenuAction(final IMenuManager manager) {
if (copyTypeAction == null) {
copyTypeAction = new Action(Messages.DTTreeContextMenuListener_0, Action.AS_PUSH_BUTTON) {
@Override
public void run() {
getController().handleCopyTypeAction(
(ITreeNode) ((IStructuredSelection) treeViewer.getSelection()).getFirstElement());
}
};
copyTypeAction.setId(ContextMenuConstants.COPY_TYPE_ACTION_ID);
}
manager.appendToGroup(ContextMenuConstants.GROUP_COPY_PASTE, copyTypeAction);
}
public void addPasteTypeMenuAction(final IMenuManager manager) {
if (pasteTypeAction == null) {
pasteTypeAction = new Action(Messages.DTTreeContextMenuListener_1, Action.AS_PUSH_BUTTON) {
@Override
public void run() {
getController().handlePasteTypeAction(
(ITreeNode) ((IStructuredSelection) treeViewer.getSelection()).getFirstElement());
}
};
pasteTypeAction.setId(ContextMenuConstants.PASTE_TYPE_ACTION_ID);
}
manager.appendToGroup(ContextMenuConstants.GROUP_COPY_PASTE, pasteTypeAction);
}
// =========================================================
// getters
// =========================================================
@Override
public Action getOpenInNewEditorAction() {
return super.getOpenInNewEditorAction();
}
public Action getAddAttributeAction() {
return addAttributeAction;
}
public Action getAddElementAction() {
return addElementAction;
}
public Action getAddGlobalElementAction() {
return addGlobalElementAction;
}
public Action getAddNamespaceAction() {
return addNamespaceAction;
}
public Action getAddSimpleTypeAction() {
return addSimpleTypeAction;
}
public Action getAddStructureTypeAction() {
return addStructureTypeAction;
}
public Action getCopyTypeAction() {
return copyTypeAction;
}
public Action getPasteTypeAction() {
return pasteTypeAction;
}
public Action getDeleteAction() {
return deleteAction;
}
public Action getConvertToGlobalTypeAction() {
return convertToGlobalTypeAction;
}
public Action getConvertToAnonymousTypeAction() {
return convertToAnonymousTypeAction;
}
public Action getConvertToAnonymousTypeWithTypeContentsAction() {
return convertToAnonymousTypeWithTypeContentsAction;
}
public Action getExtractNamespaceAction() {
return extractNamespaceAction;
}
public Action getMakeAnInlineNamespaceAction() {
return maneAnInlineNamespaceAction;
}
public IMenuManager getRefactorSubmenuManager() {
return refactorSubmenuManager;
}
}