/******************************************************************************
 * 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.requests;

import java.util.ArrayList;
import java.util.List;

import org.eclipse.gef.Request;

import org.eclipse.gmf.runtime.common.ui.dialogs.ExpansionType;

/**
 * @author schafe 
 *
 * Request for showing related elements.
 */
public class ShowRelatedElementsRequest extends Request {

	private List selectedShapes;
	private List relatedShapes;
	private List relationshipsToShow;
	private boolean isExpandIndefinite;
	private int expandLevel;

	/**
	 * The expansion type, which could be incoming, outgoing, both, or all connected
	 */
	protected ExpansionType expansionType;
	
	/**
	 * The Stopping List 
	 */
	protected List stoppingList;
	
	/**
	 * List of Models.  Do not use IModels because it does not have a
	 * contains method.
	 */
	protected List models;

	/**
	 * Use the IRelationshipFilter when true, don't use it when false
	 */
	protected boolean useFilter;

	/**
	 * Constructor for ShowRelatedElementsRequest.
	 * @param shapes List of IShapeView objects that were selected
	 * @param relationshipTypesToShow  List of relationship type hints
	 * to show.  
	 * @param isExpandIndefinite true to expand indefinitely, false not to.
	 * @param expandLevel specify an int level here for the number of
	 * levels to expand if you set isExpandIndefinite to false.
	 * @param expansionType the ExpansionType for deciding which
	 * direction to expand in.
	 * @param useFilter use the IRelationshipFilter when true, 
	 * don't use it when false
	 * @param models List of IModel objects, if null, the default will
	 * be used.
	 * @param stoppingList List of the stopping conditions
	 * for related elements if this is true
	 */
	public ShowRelatedElementsRequest(
		List shapes,
		List relationshipTypesToShow,
		boolean isExpandIndefinite,
		int expandLevel,
		ExpansionType expansionType,
		boolean useFilter, 
		List models,
		List stoppingList) {

		super(RequestConstants.REQ_SHOW_RELATED_ELEMENTS);
		this.selectedShapes = new ArrayList(shapes);
		this.relatedShapes = new ArrayList();
		this.relationshipsToShow = relationshipTypesToShow;
		this.isExpandIndefinite = isExpandIndefinite;
		this.expandLevel = expandLevel;
		this.expansionType = expansionType;
		this.useFilter = useFilter;
		this.models = models;
		this.stoppingList = stoppingList;
	}

	/**
	 * Constructor for ShowRelatedElementsRequest.
	 * Filter is set to the default of true and the default list of models
	 * will be used.
	 * 
	 * @param shapes List of IShapeView objects that were selected
	 * @param relationshipTypesToShow  List of relationship type hints
	 * to show.  Use CoreUMLTypeInfo.
	 * @param isExpandIndefinite true to expand indefinitely, false not to.
	 * @param expandLevel specify an int level here for the number of
	 * levels to expand if you set isExpandIndefinite to false.
	 * @param expansionType should include incoming or outgoing  relationships when searching
	 * for related elements if this is true
	 */
	public ShowRelatedElementsRequest(
		List shapes,
		List relationshipTypesToShow,
		boolean isExpandIndefinite,
		int expandLevel,
		ExpansionType expansionType) {

		this(
			shapes,
			relationshipTypesToShow,
			isExpandIndefinite,
			expandLevel,
			expansionType,
			true,
			null,
			new ArrayList());
	}

	/**
	 * Method getShapes.
	 * @return List the list of <code>IAdaptable</code> shapes
	 */
	public List getSelectedShapes() {
		return this.selectedShapes;
	}

	/**
	 * Method getRelatedShapes.
	 * @return List the list of <code>IAdaptable</code> shapes
	 */
	public List getRelatedShapes() {
		return this.relatedShapes;
	}

	/**
	 * Method setRelatedShapes.
	 * @param relatedShapes List the list of <code>IAdaptable</code> shapes
	 */
	public void setRelatedShapes(List relatedShapes) {
		this.relatedShapes = relatedShapes;
	}

	/**
	 * Method getRelationshipsToShow.
	 * @return List
	 */
	public List getRelationshipsToShow() {
		return this.relationshipsToShow;
	}

	/**
	 * Method isExpandIndefinite.
	 * @return boolean
	 */
	public boolean isExpandIndefinite() {
		return this.isExpandIndefinite;
	}

	/**
	 * Method getExpandLevel.
	 * @return int
	 */
	public int getExpandLevel() {
		return this.expandLevel;
	}

	/**
	 * Method getUseIncoming.
	 * This will be deprecated when all SRE implementors implement the all
	 * connected option.  Use getExpansionType() instead. 
	 * 
	 * @return boolean
	 */
	public boolean getUseIncoming() {
		return expansionType.equals(ExpansionType.INCOMING) ||
			expansionType.equals(ExpansionType.BOTH);
	}

	/**
	 * Method getUseOutgoing.
	 * This will be deprecated when all SRE implementors implement the all
	 * connected option.  Use getExpansionType() instead.
	 * 
	 * @return boolean
	 */
	public boolean getUseOutgoing() {
		return expansionType.equals(ExpansionType.OUTGOING) ||
			expansionType.equals(ExpansionType.BOTH);
	}
	
	/**
	 * Return the expansion type that was passed into the constructor.
	 * 
	 * @return ExpansionType
	 */
	public ExpansionType getExpansionType() {
		return expansionType;
	}	

	/**
	 * Returns if the filter should be used or not
	 * Use the IRelationshipFilter when true, don't use it when false
	 * @return true if the IRelationshipFilter should be used, false if it
	 * shouldn't
	 */
	public boolean getUseFilter() {
		return this.useFilter;
	}

	/**
     * Return a List of IModel objects
	 * 
	 * @return List of IModel objects
	 */
	public List getModels() {
		return models;
	}

	/**
	 * Method getStoppingList
	 * @return stoppingList
	 */	
	public List getStoppingList() {
		return stoppingList;
	}
}
