/******************************************************************************* * Copyright (c) 2000, 2005 IBM Corporation 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: * IBM Corporation - initial API and implementation * Exadel, Inc. * Red Hat, Inc. *******************************************************************************/ package org.jboss.tools.common.gef.alignment.xpl; import java.util.ArrayList; import java.util.Collections; import java.util.List; import org.eclipse.draw2d.PositionConstants; import org.eclipse.draw2d.geometry.Rectangle; import org.eclipse.gef.EditPart; import org.eclipse.gef.GraphicalEditPart; import org.eclipse.gef.Request; import org.eclipse.gef.RequestConstants; import org.eclipse.gef.commands.Command; import org.eclipse.gef.commands.CompoundCommand; import org.eclipse.gef.internal.GEFMessages; import org.eclipse.gef.internal.InternalImages; import org.eclipse.gef.requests.AlignmentRequest; import org.eclipse.gef.tools.ToolUtilities; import org.eclipse.gef.ui.actions.GEFActionConstants; import org.eclipse.gef.ui.actions.SelectionAction; import org.eclipse.jface.resource.ImageDescriptor; import org.eclipse.ui.IEditorPart; import org.eclipse.ui.IWorkbenchPart; import org.jboss.tools.common.gef.action.IDiagramSelectionProvider; public abstract class DefaultAlignmentAction extends SelectionAction { /** @deprecated */ public static final String ID_ALIGN_LEFT = GEFActionConstants.ALIGN_LEFT; /** @deprecated */ public static final String ID_ALIGN_RIGHT = GEFActionConstants.ALIGN_RIGHT; /** @deprecated */ public static final String ID_ALIGN_TOP = GEFActionConstants.ALIGN_TOP; /** @deprecated */ public static final String ID_ALIGN_BOTTOM = GEFActionConstants.ALIGN_BOTTOM; /** @deprecated */ public static final String ID_ALIGN_CENTER = GEFActionConstants.ALIGN_CENTER; /** @deprecated */ public static final String ID_ALIGN_MIDDLE = GEFActionConstants.ALIGN_MIDDLE; private List operationSet; private int alignment; public DefaultAlignmentAction(IWorkbenchPart editor, int align) { super(editor); alignment = align; init(); } protected boolean calculateEnabled() { operationSet = null; Command cmd = createAlignmentCommand(); if (cmd == null) return false; return cmd.canExecute(); } protected Rectangle calculateAlignmentRectangle(Request request) { List editparts = getOperationSet(request); if (editparts == null || editparts.isEmpty()) return null; GraphicalEditPart part = (GraphicalEditPart)editparts.get(editparts.size()-1); Rectangle rect = part.getFigure().getBounds().getCopy(); part.getFigure().translateToAbsolute(rect); return rect; } private Command createAlignmentCommand() { AlignmentRequest request = new AlignmentRequest(RequestConstants.REQ_ALIGN); request.setAlignmentRectangle(calculateAlignmentRectangle(request)); request.setAlignment(alignment); List editparts = getOperationSet(request); if (editparts.size() < 2) return null; CompoundCommand command = new CompoundCommand(); command.setDebugLabel(getText()); for (int i=0; i<editparts.size(); i++) { EditPart editpart = (EditPart)editparts.get(i); command.add(editpart.getCommand(request)); } return command; } public void dispose() { operationSet = Collections.EMPTY_LIST; super.dispose(); } public ImageDescriptor getHoverImageDescriptor() { return super.getHoverImageDescriptor(); } protected List getOperationSet(Request request) { if (operationSet != null) return operationSet; List editparts = new ArrayList(getSelectedObjects()); if (editparts.isEmpty() || !(editparts.get(0) instanceof GraphicalEditPart)) return Collections.EMPTY_LIST; editparts = ToolUtilities.getSelectionWithoutDependants(editparts); ToolUtilities.filterEditPartsUnderstanding(editparts, request); if (editparts.size() < 2) return Collections.EMPTY_LIST; EditPart parent = ((EditPart)editparts.get(0)).getParent(); for (int i=1; i<editparts.size(); i++) { EditPart part = (EditPart)editparts.get(i); if (part.getParent() != parent) return Collections.EMPTY_LIST; } return editparts; } protected void init() { super.init(); switch (alignment) { case PositionConstants.LEFT: { setId(GEFActionConstants.ALIGN_LEFT); setText(GEFMessages.AlignLeftAction_Label); setToolTipText(GEFMessages.AlignLeftAction_Tooltip); setHoverImageDescriptor(InternalImages.DESC_HORZ_ALIGN_LEFT); setImageDescriptor(InternalImages.DESC_HORZ_ALIGN_LEFT); setDisabledImageDescriptor(InternalImages.DESC_HORZ_ALIGN_LEFT_DIS); break; } case PositionConstants.RIGHT: { setId(GEFActionConstants.ALIGN_RIGHT); setText(GEFMessages.AlignRightAction_Label); setToolTipText(GEFMessages.AlignRightAction_Tooltip); setHoverImageDescriptor(InternalImages.DESC_HORZ_ALIGN_RIGHT); setImageDescriptor(InternalImages.DESC_HORZ_ALIGN_RIGHT); setDisabledImageDescriptor(InternalImages.DESC_HORZ_ALIGN_RIGHT_DIS); break; } case PositionConstants.TOP: { setId(GEFActionConstants.ALIGN_TOP); setText(GEFMessages.AlignTopAction_Label); setToolTipText(GEFMessages.AlignTopAction_Tooltip); setHoverImageDescriptor(InternalImages.DESC_VERT_ALIGN_TOP); setImageDescriptor(InternalImages.DESC_VERT_ALIGN_TOP); setDisabledImageDescriptor(InternalImages.DESC_VERT_ALIGN_TOP_DIS); break; } case PositionConstants.BOTTOM: { setId(GEFActionConstants.ALIGN_BOTTOM); setText(GEFMessages.AlignBottomAction_Label); setToolTipText(GEFMessages.AlignBottomAction_Tooltip); setHoverImageDescriptor(InternalImages.DESC_VERT_ALIGN_BOTTOM); setImageDescriptor(InternalImages.DESC_VERT_ALIGN_BOTTOM); setDisabledImageDescriptor(InternalImages.DESC_VERT_ALIGN_BOTTOM_DIS); break; } case PositionConstants.CENTER: { setId(GEFActionConstants.ALIGN_CENTER); setText(GEFMessages.AlignCenterAction_Label); setToolTipText(GEFMessages.AlignCenterAction_Tooltip); setHoverImageDescriptor(InternalImages.DESC_HORZ_ALIGN_CENTER); setImageDescriptor(InternalImages.DESC_HORZ_ALIGN_CENTER); setDisabledImageDescriptor(InternalImages.DESC_HORZ_ALIGN_CENTER_DIS); break; } case PositionConstants.MIDDLE: { setId(GEFActionConstants.ALIGN_MIDDLE); setText(GEFMessages.AlignMiddleAction_Label); setToolTipText(GEFMessages.AlignMiddleAction_Tooltip); setHoverImageDescriptor(InternalImages.DESC_VERT_ALIGN_MIDDLE); setImageDescriptor(InternalImages.DESC_VERT_ALIGN_MIDDLE); setDisabledImageDescriptor(InternalImages.DESC_VERT_ALIGN_MIDDLE_DIS); break; } } } public void run() { operationSet = null; execute(createAlignmentCommand()); } abstract public void update(); }