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

import java.util.List;

import org.eclipse.draw2d.FigureUtilities;
import org.eclipse.draw2d.Graphics;
import org.eclipse.draw2d.geometry.Point;
import org.eclipse.draw2d.geometry.Rectangle;
import org.eclipse.jst.pagedesigner.css2.ICSSStyle;
import org.eclipse.jst.pagedesigner.css2.list.CounterHelper;
import org.eclipse.jst.pagedesigner.css2.list.ICounterValueGenerator;
import org.eclipse.jst.pagedesigner.css2.marker.CounterUtil;
import org.eclipse.jst.pagedesigner.css2.property.ICSSPropertyID;
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
 */
public class CSSListItemLayout extends CSSBlockFlowLayout implements
		ICSSPainter {
	private static final String DEFAULT_LIST_COUNTER = "_anonymous";

	private static final int CIRCLE_DIAMETER = 6;

	private static final int DISC_DIAMETER = 5;

	private static final int ROUNDRECT_ARC = 2;

	private static final int TEXT_PADDING = 16;

	private int _count;

	/**
	 * @param cssfigure
	 */
	public CSSListItemLayout(CSSFigure cssfigure) {
		super(cssfigure);
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see org.eclipse.jst.pagedesigner.css2.layout.ICSSPainter#paintFigure(org.eclipse.draw2d.Graphics)
	 */
	public void paintFigure(Graphics g) {
		ICSSStyle style = this.getCSSStyle();
		if (style == null) {
			style = DefaultStyle.getInstance();
		}

		Rectangle drawArea = null;
		Font font = getCSSStyle().getCSSFont().getSwtFont();

		// draw the marker box
		Object styleType = style
				.getStyleProperty(ICSSPropertyID.ATTR_LIST_STYLE_TYPE);

		g.pushState();

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

		if (styleType instanceof String) {
			int type = CounterHelper.toTypeInt((String) styleType);
			switch (type) {
			case CounterHelper.LIST_T_UPPER_ALPHA:
			case CounterHelper.LIST_T_LOWER_ALPHA:
			case CounterHelper.LIST_T_LOWER_ROMAN:
			case CounterHelper.LIST_T_UPPER_ROMAN:
			case CounterHelper.LIST_T_DECIMAL:
				g.setFont(font);
				String displayString = CounterUtil.convertCount(_count, type);
				Point point = getDrawPointForText(displayString);
				g.drawString(displayString, point);
				break;
			case CounterHelper.LIST_T_CIRCLE:
				drawArea = getDrawAreaForGraph(CIRCLE_DIAMETER, CIRCLE_DIAMETER);
				g.drawArc(drawArea, 0, 360);
				break;
			case CounterHelper.LIST_T_SQUARE:
				drawArea = getDrawAreaForGraph(DISC_DIAMETER, DISC_DIAMETER);
				g.fillRectangle(drawArea);
			case CounterHelper.LIST_T_DECIMAL_LEADING_ZERO:
			case CounterHelper.LIST_T_LOWER_GREEK:
			case CounterHelper.LIST_T_ARMENIAN:
			case CounterHelper.LIST_T_GEORGIAN:
			case CounterHelper.LIST_T_IMAGE:
			case CounterHelper.LIST_T_NONE:
			default:
				drawArea = getDrawAreaForGraph(DISC_DIAMETER, DISC_DIAMETER);
				g.fillRoundRectangle(drawArea, ROUNDRECT_ARC, ROUNDRECT_ARC);
				break;
			}
		}
		g.popState();

		if (newColor != null) {
			newColor.dispose();
		}
	}

	/**
	 * @param g
	 * @return
	 */
	private Rectangle getDrawAreaForGraph(int width, int height) {
		Rectangle drawArea;

		int x = 0;
		int y = 0;

		List list = _blockBox.getFragments();
		Rectangle box = _blockBox.toRectangle().getCopy().expand(
				_blockBox.getBorderPaddingInsets().getAdded(
						_blockBox.getMarginInsets()));
		if (list != null && !list.isEmpty()) {
			LineBox line = (LineBox) list.get(0);
			y = line.getBaseline() - CIRCLE_DIAMETER;
			x = box.x;
		} else {
			x = box.x;
			y = box.height / 2 - CIRCLE_DIAMETER;
		}
		drawArea = new Rectangle(x - CIRCLE_DIAMETER * 5 / 2, y, width, height);
		return drawArea;
	}

	private Point getDrawPointForText(String displayString) {
		Font font = getCSSStyle().getCSSFont().getSwtFont();

		int x = 0;
		int y = 0;

		Rectangle box = _blockBox.toRectangle().getCopy().expand(
				_blockBox.getBorderPaddingInsets().getAdded(
						_blockBox.getMarginInsets()));

		x = box.x - FigureUtilities.getTextWidth(displayString, font);
		x = x
				- (TEXT_PADDING - FigureUtilities.getFontMetrics(font)
						.getDescent());

		return new Point(x, y);
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see org.eclipse.jst.pagedesigner.css2.layout.FlowContainerLayout#layoutChildren()
	 */
	protected void layoutChildren() {
		ICounterValueGenerator counter = this.getCSSStyle().findCounter(
				DEFAULT_LIST_COUNTER, true);
		if (counter != null) {
			_count = counter.getCurrentCount();
		} else {
			// should not happen.
			_count = 1; // use 1 as the default value
		}
		super.layoutChildren();
	}
}
