blob: 98e112de19e5184bf0184cc685f4c2520a1bb588 [file] [log] [blame]
/******************************************************************************
* 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());
}
}