/*******************************************************************************
 * <copyright>
 *
 * Copyright (c) 2005, 2012 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:
 *    mwenz - Bug 358255 - initial API, implementation and documentation
 *
 * </copyright>
 *
 *******************************************************************************/
package org.eclipse.graphiti.tb;

import org.eclipse.graphiti.util.IColorConstant;

/**
 * Border decorators can be used to add a border (a rectangle around the shape)
 * to the visualization of a shape without modifying the dirty state of the
 * displaying editor, see {@link IDecorator}.
 * 
 * @noextend This class is not intended to be subclassed by clients.
 * @since 0.9
 */
public class BorderDecorator extends AbstractDecorator implements IBorderDecorator {

	private IColorConstant borderColor = null;
	private Integer lineWidth = null;
	private Integer lineStyle = null;

	/**
	 * Creates a new border decorator that decorates a shape with a border.
	 */
	public BorderDecorator() {
		super();
	}

	/**
	 * Creates a new border decorator that decorates a shape with a border with
	 * the given settings. See the setter methods for details on these values.
	 * 
	 * @param borderColor
	 *            an {@link IColorConstant} defining the color for the border
	 *            line
	 * @param lineWidth
	 *            an {@link Integer} defining the width of the border line
	 * @param lineStyle
	 *            an {@link Integer} defining the style of the border line
	 */
	public BorderDecorator(IColorConstant borderColor, Integer lineWidth, Integer lineStyle) {
		super();
		this.borderColor = borderColor;
		this.lineWidth = lineWidth;
		this.lineStyle = lineStyle;
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see org.eclipse.graphiti.tb.IBorderDecorator#getBorderColor()
	 */
	public IColorConstant getBorderColor() {
		return borderColor;
	}

	/**
	 * Sets the color to be used for the border line. By default (when
	 * <code>null</code> is set) {@link IColorConstant#BLACK} is used.
	 * 
	 * @param borderColor
	 */
	public void setBorderColor(IColorConstant borderColor) {
		this.borderColor = borderColor;
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see org.eclipse.graphiti.tb.IBorderDecorator#getBorderWidth()
	 */
	public Integer getBorderWidth() {
		return lineWidth;
	}

	/**
	 * Sets the width that will be used for the border line. By default (when
	 * <code>null</code> or a value smaller than 1 is set) 1 is used.
	 * 
	 * @param lineWidth
	 *            an Integer defining the width of the border line
	 */
	public void setBorderWidth(Integer lineWidth) {
		this.lineWidth = lineWidth;
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see org.eclipse.graphiti.tb.IBorderDecorator#getBorderStyle()
	 */
	public Integer getBorderStyle() {
		return lineStyle;
	}

	/**
	 * Sets the style that will be used for the border line. Possible values
	 * are:
	 * <p>
	 * <ul>
	 * <li>{@link org.eclipse.draw2d.Graphics#LINE_SOLID}</li>
	 * <li>{@link org.eclipse.draw2d.Graphics#LINE_DASH}</li>
	 * <li>{@link org.eclipse.draw2d.Graphics#LINE_DASHDOT}</li>
	 * <li>{@link org.eclipse.draw2d.Graphics#LINE_DASHDOTDOT}</li>
	 * <li>{@link org.eclipse.draw2d.Graphics#LINE_DOT}</li>
	 * </ul>
	 * By default (when <code>null</code> or an invalid value is set)
	 * {@link org.eclipse.draw2d.Graphics#LINE_SOLID} is used.
	 * 
	 * @param lineStyle
	 *            an Integer defining the style of the border line
	 */
	public void setBorderStyle(Integer lineStyle) {
		this.lineStyle = lineStyle;
	}
}
