/******************************************************************************
 * Copyright (c) 2003, 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 
 ****************************************************************************/

package org.eclipse.gmf.runtime.diagram.ui.editpolicies;

import java.util.Collections;
import java.util.List;
import java.util.Map;

import org.eclipse.gef.Request;
import org.eclipse.gef.commands.Command;
import org.eclipse.gef.editpolicies.AbstractEditPolicy;

import org.eclipse.gmf.runtime.diagram.ui.dialogs.sortfilter.SortFilterLabelProvider;
import org.eclipse.gmf.runtime.diagram.ui.dialogs.sortfilter.SortFilterPage;
import org.eclipse.gmf.runtime.diagram.ui.editparts.GraphicalEditPart;
import org.eclipse.gmf.runtime.diagram.ui.editparts.ListCompartmentEditPart;
import org.eclipse.gmf.runtime.diagram.ui.internal.requests.SortFilterContentRequest;
import org.eclipse.gmf.runtime.diagram.ui.requests.RequestConstants;

/**
 * EditPolicy which contributes <code>SortFilterPage</code> content 
 * to the <code>SortFilterDialog</code>.
 * 
 * @author jcorchis
 */
public abstract class SortFilterContentEditPolicy extends AbstractEditPolicy {

	/**
	 * Returns <code>true</code> if the request is a REQ_SORT_FILTER_CONTENT type.
	 * @return <code>true</code> if the request is a REQ_SORT_FILTER_CONTENT type
	 * and <code>false</code> otherwise.
	 */
	public boolean understandsRequest(Request request) {
		return RequestConstants.REQ_SORT_FILTER_CONTENT.equals(request
			.getType());
	}

	/**
	 * Adds the <code>SortFilterPage</code> to the <code>SortFilterDialog</code> given
	 * if the provided implementation has content.
	 * @param request the <code>SortFilterContentRequest</code>
	 * @return null Does not return a <code>Command</code>
	 */
	public Command getCommand(Request request) {
		if (understandsRequest(request)) {

			// Do not contribute to the Sort/Filter dialog
			// if there is nothing to sort or filter.	
			if (getContents() == null || getContents().size() == 0)
				return null;

			SortFilterContentRequest contentRequest =
				(SortFilterContentRequest) request;
			SortFilterPage newSortFilterPage =
				new SortFilterPage(
					SortFilterPage.CHILD_PAGE,
					(GraphicalEditPart) getHost(),
					getCollectionColumns(),
					getLabelProvider());

			newSortFilterPage.setContents(getContents(), getHiddenContents());
			newSortFilterPage.setTitle(getCompartmentLabel());

			if (getFilter() != null && getFilterColumn() != null)
				newSortFilterPage.setFilter(getFilter(), getFilterColumn());

			// Get the List from the request and Add the new page
			contentRequest.getSortFilterPageList().add(newSortFilterPage);
		}
		return null;
	}

	/**
	 * Override to return the label for the compartment other than the one provided
	 * by <code>ResizableCompartmentEditPart.getTitleName()</code>.
	 * @return the compartment label
	 */
	public String getCompartmentLabel() {
		if (getHost() instanceof ListCompartmentEditPart) {
			return ((ListCompartmentEditPart) getHost()).getCompartmentName();
		}
		return null;
	}

	/**
	 * Implement to return a <code>List</code> of <code>SortFilterCollectionColumn</code>s
	 * which are used to define the <code>SortFilterDialog</code> table.
	 * @return the collection columns.
	 */
	public abstract List getCollectionColumns();

	/**
	 * Implement to return a <code>SortFilterLabelProvider</code> for
	 * for the compartment.  The <code>SortFilterLabelProvider</code> 
	 * provides the content for the SortFilterDialog table.
	 * @return <code>SortFilterLabelProvider</code>
	 */
	public abstract SortFilterLabelProvider getLabelProvider();

	/**
	 * Implement to return a <code>List</code> of <code>SortFilterElement</code>s
	 * which are used to define the <code>SortFilterDialog</code> tables content.
	 * @return the collection of <code>SortFilterElement</code>s
	 */
	public abstract List getContents();
	
	/**
	 * Override to return a list of elements that are hidden by other means. The 
	 * items in this list will not be displayed in the sort/filter dialog, and will
	 * remain in the ID_FILTERED_OBJECTS list when changes to the sort/filter
	 * are applied.
	 * 
	 * @return a list if items not to be displayed in the sort/filter dialog.
	 */
	public List getHiddenContents() {
		return Collections.EMPTY_LIST;
	}

	/**
	 * Override to return a filter this SortFilterPage.
	 * @return the filter map
	 */
	public Map getFilter() {
		return null;
	}

	/**
	 * Override to return the column to which the filter applies.
	 * @return the filter column
	 */
	public String getFilterColumn() {
		return null;
	}

}
