| /******************************************************************************* |
| * Copyright (c) 2006 Sybase, Inc. and others. |
| * |
| * 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: |
| * Sybase, Inc. - initial API and implementation |
| *******************************************************************************/ |
| package org.eclipse.jst.pagedesigner.actions.single; |
| |
| import java.util.ArrayList; |
| import java.util.Iterator; |
| import java.util.List; |
| |
| import org.eclipse.gef.EditPart; |
| import org.eclipse.jface.action.Action; |
| import org.eclipse.jface.action.IContributionItem; |
| import org.eclipse.jface.action.IMenuListener; |
| import org.eclipse.jface.action.IMenuManager; |
| import org.eclipse.jface.action.MenuManager; |
| import org.eclipse.jface.viewers.ISelection; |
| import org.eclipse.jface.viewers.IStructuredSelection; |
| import org.eclipse.jst.pagedesigner.PDPlugin; |
| import org.eclipse.jst.pagedesigner.css2.property.ICSSPropertyID; |
| import org.eclipse.jst.pagedesigner.dom.DOMStyleUtil; |
| import org.eclipse.jst.pagedesigner.editors.PageDesignerActionConstants; |
| import org.eclipse.jst.pagedesigner.elementedit.IElementEdit; |
| import org.eclipse.jst.pagedesigner.parts.ElementEditPart; |
| import org.eclipse.ui.actions.ActionGroup; |
| import org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement; |
| import org.w3c.dom.Element; |
| |
| /** |
| * Group that constructs context menu items for a single selected element. |
| * |
| * @author mengbo |
| * @version 1.5 |
| */ |
| public class SingleElementActionGroup extends ActionGroup { |
| // TODO: why? |
| private static final Action action = new Action() { |
| // create a default instance that does nothing |
| // Action is abstract but has no abstract methods |
| // run() on this object is a NOOP |
| }; |
| |
| /* |
| * (non-Javadoc) |
| * |
| * @see org.eclipse.ui.actions.ActionGroup#fillContextMenu(org.eclipse.jface.action.IMenuManager) |
| */ |
| public void fillContextMenu(IMenuManager menu) { |
| ElementEditPart part = fixUpSelection(getContext().getSelection()); |
| if (part == null) { |
| return; |
| } |
| IDOMElement ele = (IDOMElement) part.getIDOMNode(); |
| addPositionRelativeMenu(menu, part, ele); |
| addStylelMenu(menu, part, ele); |
| |
| // next add element special actions |
| IElementEdit elementEdit = part.getElementEdit(); |
| if (elementEdit != null) { |
| elementEdit.fillContextMenu(menu, ele); |
| } |
| } |
| |
| /** |
| * @param selection |
| * @return |
| */ |
| private ElementEditPart fixUpSelection(ISelection selection) { |
| if (selection instanceof IStructuredSelection) { |
| IStructuredSelection sel = (IStructuredSelection) selection; |
| if (sel.size() != 1) { |
| return null; |
| } |
| if (sel.getFirstElement() instanceof ElementEditPart) { |
| return (ElementEditPart) sel.getFirstElement(); |
| } |
| } |
| return null; |
| } |
| |
| /** |
| * Add menu actions that select relative to the current position |
| * |
| * @param menu |
| * @param part |
| * @param ele |
| */ |
| private void addPositionRelativeMenu(IMenuManager menu, ElementEditPart part, IDOMElement ele) |
| { |
| IContributionItem subMenuItem = menu.find(PageDesignerActionConstants.SELECT_SUBMENU_ID); |
| |
| if (subMenuItem instanceof IMenuManager) |
| { |
| final IMenuManager subMenu = (IMenuManager) subMenuItem; |
| // final IMenuManager selectMenu = new MenuManager(PDPlugin |
| // .getResourceString("ActionGroup.Submenu.SelectRelative"));//$NON-NLS-1$ |
| SelectParentAction selectParentAction = SelectParentAction.create(ele, part); |
| // Eclipse UI guideline: 6.13 |
| // even if there is no parent, a disabled action will be returned by |
| // create and this should be added to the menu |
| subMenu.add(selectParentAction); |
| |
| List children = new ArrayList(); |
| for (Iterator it = part.getChildren().iterator(); it.hasNext();) |
| { |
| EditPart childPart = (EditPart) it.next(); |
| |
| // only include selectable element edit part that are modelling |
| // XML elements in the source doc |
| if (childPart instanceof ElementEditPart |
| && ((ElementEditPart)childPart).isSelectable() |
| && ((ElementEditPart)childPart).getModel() instanceof Element) |
| { |
| children.add(SelectNodeAction |
| .create(((Element)((ElementEditPart)childPart).getModel()).getNodeName(), childPart)); |
| } |
| } |
| |
| |
| // don't add the select Children menu unless there are actually children |
| if (children.size() > 0) |
| { |
| MenuManager selectChildMenu = new MenuManager(Messages.SingleElementActionGroup_ChildrenActionText); |
| subMenu.add(selectChildMenu); |
| |
| for (final Iterator it = children.iterator(); it.hasNext();) |
| { |
| selectChildMenu.add((Action)it.next()); |
| } |
| } |
| else |
| { // Eclipse UI guideline 6.13 |
| // create the child actions even if no children but make it |
| // a disabled option if no children |
| Action childrenAction = new Action(Messages.SingleElementActionGroup_ChildrenActionText){/* do nothing*/}; |
| childrenAction.setEnabled(false); |
| subMenu.add(childrenAction); |
| } |
| } |
| } |
| |
| /** |
| * @param menu |
| * @param part |
| */ |
| private void addStylelMenu(IMenuManager menu, ElementEditPart part, |
| IDOMElement ele) { |
| IContributionItem subMenu = |
| menu.find(PageDesignerActionConstants.STYLE_SUBMENU_ID); |
| |
| if (subMenu instanceof IMenuManager) |
| { |
| final IMenuManager subMenuManager = |
| (IMenuManager) subMenu; |
| addStyle(subMenuManager, part, ele); |
| addStyleClassesMenu(subMenuManager, part, ele); |
| |
| if (DOMStyleUtil.supportStyleAttribute(ele)) { |
| // addBorderStyleMenu(stylesub, part, ele); |
| addColorMenu(subMenuManager, part, ele); |
| addBackgroundMenu(subMenuManager, part, ele); |
| } |
| } |
| } |
| |
| /** |
| * |
| * @param menu |
| * @param part |
| * @param ele |
| */ |
| private void addStyle(IMenuManager subMenu, ElementEditPart part, |
| IDOMElement ele) { |
| StyleSupport.createStyleAction(subMenu, part, ele); |
| } |
| |
| /** |
| * @param stylesub |
| * @param part |
| */ |
| private void addStyleClassesMenu(IMenuManager subMenu, |
| ElementEditPart part, final IDOMElement ele) { |
| final IMenuManager classmenu = new MenuManager(PDPlugin |
| .getResourceString("ActionGroup.Submenu.StyleClasses"));//$NON-NLS-1$ |
| StyleClassSupport.createStyleClassActions(classmenu, ele); |
| |
| subMenu.appendToGroup(PageDesignerActionConstants.GROUP_STYLE, |
| classmenu); |
| } |
| |
| /** |
| * @param stylesub |
| * @param part |
| */ |
| private void addColorMenu(IMenuManager subMenu, ElementEditPart part, |
| final IDOMElement ele) { |
| final IMenuManager colorSub = new MenuManager(PDPlugin |
| .getResourceString("ActionGroup.Submenu.Color"));//$NON-NLS-1$ |
| colorSub.add(action); |
| colorSub.addMenuListener(new IMenuListener() { |
| public void menuAboutToShow(IMenuManager manager) { |
| colorSub.removeAll(); |
| ColorSupport.createColorActions(colorSub, ele, |
| ICSSPropertyID.ATTR_COLOR); |
| } |
| }); |
| subMenu.appendToGroup(PageDesignerActionConstants.GROUP_STYLE, |
| colorSub); |
| |
| } |
| |
| /** |
| * @param stylesub |
| * @param part |
| */ |
| private void addBackgroundMenu(IMenuManager subMenu, ElementEditPart part, |
| final IDOMElement ele) { |
| final IMenuManager colorSub = new MenuManager(PDPlugin |
| .getResourceString("ActionGroup.Submenu.BackgroundColor"));//$NON-NLS-1$ |
| colorSub.add(action); |
| colorSub.addMenuListener(new IMenuListener() { |
| |
| public void menuAboutToShow(IMenuManager manager) { |
| colorSub.removeAll(); |
| ColorSupport.createColorActions(colorSub, ele, |
| ICSSPropertyID.ATTR_BACKGROUND_COLOR); |
| } |
| }); |
| |
| subMenu.appendToGroup(PageDesignerActionConstants.GROUP_STYLE, |
| colorSub); |
| } |
| } |