/****************************************************************************** * Copyright (c) 2002, 2006 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 ****************************************************************************/ package org.eclipse.gmf.runtime.diagram.ui.actions; import java.util.Collections; import java.util.List; import org.eclipse.draw2d.PositionConstants; import org.eclipse.draw2d.geometry.PrecisionRectangle; 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.requests.AlignmentRequest; import org.eclipse.gef.tools.ToolUtilities; import org.eclipse.gef.ui.actions.AlignmentAction; import org.eclipse.gmf.runtime.diagram.ui.actions.internal.l10n.DiagramUIActionsMessages; import org.eclipse.ui.IWorkbenchPage; /** * @author melaasar * * This action is cloned from the GEF AlignmentAction * @see org.eclipse.gef.actions.AlignmentAction */ public class AlignAction extends DiagramAction { private String id; private int alignment; private boolean isToolbarItem = true; /** * Constructs an AlignAction with the given part and alignment ID. The alignment ID * must by one of: * <UL> * <LI>GEFActionConstants.ALIGN_LEFT * <LI>GEFActionConstants.ALIGN_RIGHT * <LI>GEFActionConstants.ALIGN_CENTER * <LI>GEFActionConstants.ALIGN_TOP * <LI>GEFActionConstants.ALIGN_BOTTOM * <LI>GEFActionConstants.ALIGN_MIDDLE * </UL> * @param part the workbench part used to obtain context * @param id the action ID. * @param align the aligment ID. */ public AlignAction(IWorkbenchPage workbenchPage, String id, int align) { super(workbenchPage); this.id = id; this.alignment = align; initUI(); } /** * Constructs an AlignAction with the given part and alignment ID. The alignment ID * must by one of: * <UL> * <LI>GEFActionConstants.ALIGN_LEFT * <LI>GEFActionConstants.ALIGN_RIGHT * <LI>GEFActionConstants.ALIGN_CENTER * <LI>GEFActionConstants.ALIGN_TOP * <LI>GEFActionConstants.ALIGN_BOTTOM * <LI>GEFActionConstants.ALIGN_MIDDLE * </UL> * @param part the workbench part used to obtain context * @param id the action ID. * @param align the aligment ID. * @param isToolbarItem the indicator of whether or not this is a toolbar action * -as opposed to a context-menu action. */ public AlignAction(IWorkbenchPage workbenchPage, String id, int align, boolean isToolbarItem) { super(workbenchPage); this.id = id; this.alignment = align; this.isToolbarItem = isToolbarItem; initUI(); } /** * Initializes the actions UI presentation. * Two sets of each align action are required. One for the toolbar, * and one for other menus. The toolbar action has explicit text, * the other menus do not. For example: Align Left and Left. * */ protected void initUI() { setId(this.id); String text = null; String toolTipText = null; AlignmentAction gefAlignmentAction = new AlignmentAction(getWorkbenchPart(), alignment); setHoverImageDescriptor(gefAlignmentAction.getHoverImageDescriptor()); setImageDescriptor(gefAlignmentAction.getImageDescriptor()); setDisabledImageDescriptor(gefAlignmentAction.getDisabledImageDescriptor()); gefAlignmentAction.dispose(); switch (alignment) { case PositionConstants.LEFT: { if (isToolbarItem){ text = DiagramUIActionsMessages.AlignLeftToolbarAction_Label; toolTipText = DiagramUIActionsMessages.AlignLeftToolbarAction_Tooltip; } else{ text = DiagramUIActionsMessages.AlignLeft; toolTipText = DiagramUIActionsMessages.AlignLeft; } break; } case PositionConstants.RIGHT: { if (isToolbarItem){ text = DiagramUIActionsMessages.AlignRightToolbarAction_Label; toolTipText = DiagramUIActionsMessages.AlignRightToolbarAction_Tooltip; } else{ text = DiagramUIActionsMessages.AlignRight; toolTipText = DiagramUIActionsMessages.AlignRight; } break; } case PositionConstants.TOP: { if (isToolbarItem){ text = DiagramUIActionsMessages.AlignTopToolbarAction_Label; toolTipText = DiagramUIActionsMessages.AlignTopToolbarAction_Tooltip; } else{ text = DiagramUIActionsMessages.AlignTop; toolTipText = DiagramUIActionsMessages.AlignTop; } break; } case PositionConstants.BOTTOM: { if (isToolbarItem){ text = DiagramUIActionsMessages.AlignBottomToolbarAction_Label; toolTipText = DiagramUIActionsMessages.AlignBottomToolbarAction_Tooltip; } else{ text = DiagramUIActionsMessages.AlignBottom; toolTipText = DiagramUIActionsMessages.AlignBottom; } break; } case PositionConstants.CENTER: { if (isToolbarItem){ text = DiagramUIActionsMessages.AlignCenterToolbarAction_Label; toolTipText = DiagramUIActionsMessages.AlignCenterToolbarAction_Tooltip; } else{ text = DiagramUIActionsMessages.AlignCenter; toolTipText = DiagramUIActionsMessages.AlignCenter; } break; } case PositionConstants.MIDDLE: { if (isToolbarItem){ text = DiagramUIActionsMessages.AlignMiddleToolbarAction_Label; toolTipText = DiagramUIActionsMessages.AlignMiddleToolbarAction_Tooltip; } else{ text = DiagramUIActionsMessages.AlignMiddle; toolTipText = DiagramUIActionsMessages.AlignMiddle; } break; } } setText(text); setToolTipText(toolTipText); } /* (non-Javadoc) * @see org.eclipse.gmf.runtime.common.ui.action.AbstractActionHandler#isSelectionListener() */ protected boolean isSelectionListener() { return true; } protected boolean isOperationHistoryListener() { return true; } /* (non-Javadoc) * @see org.eclipse.gmf.runtime.diagram.ui.actions.DiagramAction#createOperationSet() */ protected List createOperationSet() { List editparts = super.createOperationSet(); editparts = ToolUtilities.getSelectionWithoutDependants(editparts); 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; } /* (non-Javadoc) * @see org.eclipse.gmf.runtime.diagram.ui.actions.DiagramAction#createTargetRequest() */ protected Request createTargetRequest() { AlignmentRequest request = new AlignmentRequest(RequestConstants.REQ_ALIGN); request.setAlignment(alignment); return request; } /* (non-Javadoc) * @see org.eclipse.gmf.runtime.diagram.ui.actions.DiagramAction#updateTargetRequest() */ protected void updateTargetRequest() { AlignmentRequest request = (AlignmentRequest) getTargetRequest(); request.setAlignmentRectangle(calculateAlignmentRectangle()); super.updateTargetRequest(); } /** * Returns the alignment rectangle to which all selected parts should be aligned. * @return the alignment rectangle */ protected Rectangle calculateAlignmentRectangle() { List editparts = getOperationSet(); if (editparts == null || editparts.isEmpty()) return null; GraphicalEditPart part = (GraphicalEditPart)editparts.get(editparts.size() - 1); Rectangle rect = new PrecisionRectangle(part.getFigure().getBounds()); part.getFigure().translateToAbsolute(rect); return rect; } }