/*******************************************************************************
 * <copyright>
 *
 * Copyright (c) 2005, 2010 SAP AG.
 * 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:
 *    SAP AG - initial API, implementation and documentation
 *
 * </copyright>
 *
 *******************************************************************************/
package org.eclipse.graphiti.internal.contextbuttons;

import java.awt.Rectangle;
import java.util.List;

import org.eclipse.graphiti.util.IColorConstant;

/**
 * This interface provides the visual definition for the context button pad.
 * <p>
 * The context button pad consists of three pads (top, right, bottom), which are
 * slightly overlapping, so that they build one coherent area. Several context
 * buttons are placed inside those three pads and also outside (e.g. the
 * collapse button).
 * 
 * @noimplement This interface is not intended to be implemented by clients.
 * @noextend This class is not intended to be subclassed by clients.
 */
public interface IContextButtonPadDeclaration {

	public enum PadStyle {
		STANDARD, APPENDAGE
	};

	/**
	 * Returns the context buttons to be placed on the context button pad. Each
	 * {@link PositionedContextButton} contains information about the visual
	 * definition of the context button.
	 * 
	 * @return The context buttons to be placed on the context button pad.
	 */
	List<PositionedContextButton> getPositionedContextButtons();

	/**
	 * Returns the rectangular bounds of the top pad. Can be null.
	 * 
	 * @return The rectangular bounds of the top pad. Can be null.
	 */
	Rectangle getTopPad();

	/**
	 * Returns the rectangular bounds of the right pad. Can be null.
	 * 
	 * @return The rectangular bounds of the right pad. Can be null.
	 */
	Rectangle getRightPad();

	/**
	 * Returns the rectangular bounds of the bottom pad. Can be null.
	 * 
	 * @return The rectangular bounds of the bottom pad. Can be null.
	 */
	Rectangle getBottomPad();

	/**
	 * Returns the top pad style.
	 * 
	 * @return The top pad style.
	 */
	PadStyle getTopPadStyle();

	/**
	 * Returns the top pad style.
	 * 
	 * @return The top pad style.
	 */
	PadStyle getRightPadStyle();

	/**
	 * Returns the rectangular bounds around all visible areas of the context
	 * button pad. They might or might not overlap. A point is defined to be on
	 * the context button pad, if it is inside one of those rectangles.
	 * 
	 * @return The rectangular bounds around all visible areas of the context
	 *         button pad.
	 */
	List<Rectangle> getContainmentRectangles();

	/**
	 * Returns the overlapping rectangular bounds around all visible areas of
	 * the context button pad. All rectangles overlap and build an area, which
	 * has no free space in the middle. A point is defined to be on or inside
	 * the context button pad, if it is inside one of those rectangles.
	 * 
	 * @return The overlapping rectangular bounds around all visible areas of
	 *         the context button pad.
	 */
	List<Rectangle> getOverlappingContainmentRectangles();

	/**
	 * Returns the corner radius which is used to paint all corners of the pad.
	 * 
	 * @return The corner radius which is used to paint all corners of the pad.
	 */
	int getPadCornerRadius();

	/**
	 * Returns the line width which is used to paint the outline of the pad.
	 * 
	 * @return The line width which is used to paint the outline of the pad.
	 */
	int getPadLineWidth();

	/**
	 * Returns the color in which the outer line of the pads outline is painted.
	 * Note, that the pad is outlined with three adjacent lines (outer, middle,
	 * inner) and then filled inside.
	 * 
	 * @return The color in which the outer line of the pads outline is painted.
	 */
	IColorConstant getPadOuterLineColor();

	/**
	 * Returns the color in which the middle line of the pads outline is
	 * painted. Note, that the pad is outlined with three adjacent lines (outer,
	 * middle, inner) and then filled inside.
	 * 
	 * @return The color in which the middle line of the pads outline is
	 *         painted.
	 */
	IColorConstant getPadMiddleLineColor();

	/**
	 * Returns the color in which the inner line of the pads outline is painted.
	 * Note, that the pad is outlined with three adjacent lines (outer, middle,
	 * inner) and then filled inside.
	 * 
	 * @return The color in which the inner line of the pads outline is painted.
	 */
	IColorConstant getPadInnerLineColor();

	/**
	 * Returns the color in which the pads outline is filled. Note, that the pad
	 * is outlined with three adjacent lines (outer, middle, inner) and then
	 * filled inside.
	 * 
	 * @return The color in which the pads outline is filled.
	 */
	IColorConstant getPadFillColor();

	/**
	 * Returns the opacity which is used when painting the pad. Possible values
	 * are between 0.0 (invisible, transparent) and 1.0 (completely visible,
	 * opaque).
	 * 
	 * @return The opacity which is used when painting the pad.
	 */
	double getPadDefaultOpacity();
}
