/****************************************************************************** * 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.internal; import java.util.ArrayList; import java.util.Collections; import java.util.Iterator; import java.util.List; import org.eclipse.gef.EditPart; import org.eclipse.gef.Request; import org.eclipse.gmf.runtime.diagram.core.util.ViewUtil; import org.eclipse.gmf.runtime.diagram.ui.actions.ActionIds; import org.eclipse.gmf.runtime.diagram.ui.actions.DiagramAction; import org.eclipse.gmf.runtime.diagram.ui.actions.internal.l10n.DiagramUIActionsMessages; import org.eclipse.gmf.runtime.diagram.ui.actions.internal.l10n.DiagramUIActionsPluginImages; import org.eclipse.gmf.runtime.diagram.ui.editparts.IGraphicalEditPart; import org.eclipse.gmf.runtime.diagram.ui.editparts.ListCompartmentEditPart; import org.eclipse.gmf.runtime.diagram.ui.internal.requests.SortFilterCompartmentItemsRequest; import org.eclipse.gmf.runtime.diagram.ui.internal.requests.SortFilterContentRequest; import org.eclipse.gmf.runtime.notation.View; import org.eclipse.ui.IWorkbenchPage; /** * Action to sort/filter list compartment items. * * @author jcorchis */ public class SortFilterAction extends DiagramAction { public SortFilterAction(IWorkbenchPage workbenchpage) { super(workbenchpage); } /** * Returns an instance of <code>SortFilterCompartmentItemsRequest</code> * @see org.eclipse.gmf.runtime.diagram.ui.actions.DiagramAction#createTargetRequest() */ protected Request createTargetRequest() { return new SortFilterCompartmentItemsRequest(); } public void init() { super.init(); setId(ActionIds.ACTION_SORT_FILTER); setText(DiagramUIActionsMessages.SortFilterCompartmentsAction_ActionLabelText); setToolTipText(DiagramUIActionsMessages.SortFilterCompartmentsAction_ActionToolTipText); setImageDescriptor(DiagramUIActionsPluginImages.DESC_SORT_FILTER); setDisabledImageDescriptor(DiagramUIActionsPluginImages.DESC_SORT_FILTER_DISABLED); } /** * Enable this action if only one shape is selected and that * shape supports has children that support the SortFilterContentRequest. * @returns boolean whether the action is enabled */ protected boolean calculateEnabled() { // Return true if at least one items handles the request. Iterator iter = getSelectedObjects().iterator(); while(iter.hasNext()) { Object obj = iter.next(); if (obj instanceof IGraphicalEditPart) { IGraphicalEditPart selectedEP = (IGraphicalEditPart) obj; Object model = selectedEP.getModel(); if (!(model instanceof View) || ViewUtil.resolveSemanticElement((View)model)==null) continue; List childContributions = new ArrayList(); List children = selectedEP.getChildren(); for (int i = 0; i < children.size(); i++) { if (children.get(i) instanceof ListCompartmentEditPart) { SortFilterContentRequest contentRequest = new SortFilterContentRequest(childContributions); ListCompartmentEditPart editPart = (ListCompartmentEditPart) children.get(i); editPart.getCommand(contentRequest); if (childContributions.size() > 0) return true; } } } } return false; } /** * Filters the selected objects and returns the first editparts that understands the request * @return a list of editparts selected. * */ protected List createOperationSet() { List selection = getSelectedObjects(); if (selection.isEmpty() || !(selection.get(0) instanceof IGraphicalEditPart)) return Collections.EMPTY_LIST; Iterator selectedEPs = selection.iterator(); List targetedEPs = new ArrayList(); while (selectedEPs.hasNext()) { EditPart selectedEP = (EditPart) selectedEPs.next(); targetedEPs.addAll(getTargetEditParts(selectedEP)); if (targetedEPs.size() > 0) { EditPart ep = (EditPart)targetedEPs.get(0); targetedEPs.clear(); targetedEPs.add(ep); return targetedEPs; } } return targetedEPs.isEmpty() ? Collections.EMPTY_LIST : targetedEPs; } public boolean isSelectionListener() { return true; } /** * Updates the request with the selection. */ protected void updateTargetRequest() { ((SortFilterCompartmentItemsRequest)getTargetRequest()).setEditParts(getSelectedObjects()); } }