/*******************************************************************************
 * Copyright (c) 2006 Sybase, Inc. 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:
 *     Sybase, Inc. - initial API and implementation
 *******************************************************************************/
package org.eclipse.jst.pagedesigner.css2.widget;

import org.eclipse.draw2d.ColorConstants;
import org.eclipse.draw2d.FigureUtilities;
import org.eclipse.draw2d.Graphics;
import org.eclipse.draw2d.geometry.Rectangle;
import org.eclipse.jst.pagedesigner.css2.ICSSStyle;
import org.eclipse.jst.pagedesigner.css2.font.ICSSFont;
import org.eclipse.jst.pagedesigner.css2.layout.TextLayoutSupport;
import org.eclipse.jst.pagedesigner.css2.property.ICSSPropertyID;
import org.eclipse.jst.pagedesigner.css2.provider.DimensionInfo;
import org.eclipse.jst.pagedesigner.css2.style.DefaultStyle;
import org.eclipse.swt.graphics.Color;
import org.eclipse.swt.graphics.Font;
import org.eclipse.swt.graphics.RGB;
import org.eclipse.swt.widgets.Display;

/**
 * @author mengbo
 * @version 1.5
 */
public class TextAreaWidgetProvider extends AbstractWidgetProvider {
	private static final int DEFAULTCOLUMN = 20;

	private static final int DEFAULTROWS = 2;

	private static final int VERTICAL_PADDING = 2;

	private static final int HORIZONTAL_PADDING = 2;

	private static int ARRAWWIDTH = 16;

	private static int ARROWHEIGHT = 16;

	private int _columns = DEFAULTCOLUMN;

	private int _rows = DEFAULTROWS;

	private String _value;

	/**
	 * @param style
	 */
	public TextAreaWidgetProvider(ICSSStyle style) {
		super(style);
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see org.eclipse.jst.pagedesigner.css2.provider.ICSSWidgetProvider#getPreferredDimension(int,
	 *      int)
	 */
	public DimensionInfo getPreferredDimension(int width, int height) {
		if (width <= 0) {
			width = getDefaultWidth();
		}
		if (height <= 0) {
			height = getDefaultHeight();
		}
		return new DimensionInfo(width, height, -1);
	}

	/**
	 * @return
	 */
	private int getDefaultHeight() {
		ICSSStyle style = this.getCSSStyle();
		if (style == null) {
			style = DefaultStyle.getInstance();
		}
		ICSSFont font = style.getCSSFont();
		Font swtfont = font.getSwtFont();
		int fontHeight = FigureUtilities.getFontMetrics(swtfont).getHeight();

		return (fontHeight) * _rows + VERTICAL_PADDING;
	}

	/**
	 * @return
	 */
	private int getDefaultWidth() {
		ICSSStyle style = this.getCSSStyle();
		if (style == null) {
			style = DefaultStyle.getInstance();
		}
		ICSSFont font = style.getCSSFont();

		int fontWidth = FigureUtilities.getFontMetrics(font.getSwtFont())
				.getAverageCharWidth();
		return _columns * fontWidth + ARRAWWIDTH + HORIZONTAL_PADDING;
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see org.eclipse.jst.pagedesigner.css2.provider.ICSSWidgetProvider#paintFigure(org.eclipse.draw2d.Graphics,
	 *      org.eclipse.draw2d.geometry.Rectangle)
	 */
	public void paintFigure(Graphics g, Rectangle rect) {
		if (_value != null) {
			g.clipRect(rect);
			ICSSStyle style = this.getCSSStyle();
			if (style == null) {
				style = DefaultStyle.getInstance();
			}
			int decoration = ((Integer) style
					.getStyleProperty(ICSSPropertyID.ATTR_TEXTDECORATION))
					.intValue();
			ICSSFont font = style.getCSSFont();
			g.setFont(font.getSwtFont());

			Color newColor = null;
			Object color = style.getColor();
			if (color instanceof Color) {
				g.setForegroundColor((Color) color);
			} else if (color instanceof RGB) {
				newColor = new Color(Display.getCurrent(), (RGB) color);
				g.setForegroundColor(newColor);
			} else {
				g.setForegroundColor(ColorConstants.black);
			}

			Object textAlign = style
					.getStyleProperty(ICSSPropertyID.ATTR_TEXTALIGN);
			int begin = 0;
			int end = 0;
			int fontHeight = FigureUtilities.getFontMetrics(font.getSwtFont())
					.getHeight();

			int fontWidth = FigureUtilities.getFontMetrics(font.getSwtFont())
					.getAverageCharWidth();
			int columns = (rect.width - HORIZONTAL_PADDING) / fontWidth;

			int i = 0;
			while (true) {
				int y = rect.y + VERTICAL_PADDING / 2 + fontHeight * i;
				if (y >= rect.bottom()) {
					break;
				}
				end += columns;
				if (end > _value.length()) {
					end = _value.length();
				}
				end = getTextCount(begin, end, g.getFont(), rect.width
						- ARRAWWIDTH);

				String text = _value.substring(begin, end);

				int width = FigureUtilities.getTextWidth(text, g.getFont());
				int x = TextLayoutSupport.getBeginX(textAlign, rect, width);
				g.drawString(text, x, y);

				TextLayoutSupport.paintTextDecoration(g, new Rectangle(x, y,
						width, fontHeight), decoration);
				begin = end;

				if (end == _value.length()) {
					break;
				}
				i++;
			}
			if (newColor != null) {
				newColor.dispose();
			}
		}
		int borderThick = 2;
		BorderUtil
				.drawVertialBar(g, ARRAWWIDTH, ARROWHEIGHT, borderThick, rect);
	}

	private int getTextCount(int begin, int end, Font swtFont, int textWidth) {
		while (FigureUtilities.getTextWidth(_value.substring(begin, end),
				swtFont) > textWidth) {
			end--;
		}
		return end;
	}

	/**
	 * @param columns
	 */
	public void setColumns(int columns) {
		this._columns = (columns > 0 ? columns : DEFAULTCOLUMN);
	}

	/**
	 * @param rows
	 */
	public void setRows(int rows) {
		this._rows = (rows > 0 ? rows : DEFAULTROWS);
	}

	/**
	 * @param value
	 */
	public void setValue(String value) {
		this._value = value;
	}
}
