/*******************************************************************************
 * 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.FigureUtilities;
import org.eclipse.draw2d.Graphics;
import org.eclipse.jst.pagedesigner.css2.provider.DimensionInfo;
import org.eclipse.jst.pagedesigner.css2.style.HiddenElementStyle;
import org.eclipse.jst.pagedesigner.parts.EditProxyAdapter;
import org.eclipse.jst.pagedesigner.parts.ElementEditPart;
import org.eclipse.swt.graphics.Color;
import org.eclipse.swt.graphics.Font;
import org.eclipse.swt.graphics.FontMetrics;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.widgets.Display;
import org.w3c.dom.Element;

/**
 * @author mengbo
 */
public class HiddenProvider extends ImageWidgetProvider {
	private final static int GAP = 3;

	private String _label = null;

	private boolean _labelVisible = true;

	private FontMetrics _fontMetrics;
    
	/**
	 * @param image
	 * @param convertedElement 
	 */
	public HiddenProvider(Image image, Element convertedElement) {
		super(image, new HiddenElementStyle(convertedElement));
	}

	/**
	 * @param image
	 * @param editPart
	 */
	public HiddenProvider(Image image, ElementEditPart editPart) {
		super(image, new HiddenElementStyle(new EditProxyAdapter(editPart)));
	}

	// public HiddenProvider(Image image, String label)
	// {
	// this(image);
	// this._label = label;
	// }

	/*
	 * (non-Javadoc)
	 * 
	 * @see org.eclipse.jst.pagedesigner.css2.provider.ICSSWidgetProvider#getPreferredDimension(int,
	 *      int)
	 */
	public DimensionInfo getPreferredDimension(int width, int height) {
		int preWidth = width;
		int preHeight = height;
		_fontMetrics = getFontMetrics();
		if (width <= 0) {
			preWidth = getLabelWidth() + _imageWidth;
		}
		if (height <= 0) {
			preHeight = Math.max(getLabelHeight(), _imageHeight);
		}
		return new DimensionInfo(preWidth, preHeight, -1);
	}

	private FontMetrics getFontMetrics() {
		Font swtfont = Display.getCurrent().getSystemFont();
		return FigureUtilities.getFontMetrics(swtfont);
	}

	private int getLabelHeight() {
		if (_labelVisible && (_label != null) && (!_label.equals(""))
				&& (_fontMetrics != null)) {
			return _fontMetrics.getHeight();
		}
		return 0;
	}

	/**
	 * @return the label width
	 */
	public int getLabelWidth() {
		if (_labelVisible && _label != null && !_label.equals("")
				&& _fontMetrics != null) {
			Font swtfont = Display.getCurrent().getSystemFont();
			return FigureUtilities.getTextWidth(_label, swtfont) + GAP;
		}
		return 0;
	}

	public void paintFigure(Graphics g,
			org.eclipse.draw2d.geometry.Rectangle rect) {
		g.fillRectangle(rect);
		g.setClip(rect);
		int imageAreaWidth = Math.min(rect.width, _imageWidth);
		int imageAreaHeight = Math.min(rect.height, _imageHeight);
		if (_image != null && !_image.isDisposed()) {
			g.drawImage(_image, 0, 0, _imageWidth, _imageHeight, rect.x, rect.y
					+ (rect.height - imageAreaHeight) / 2, imageAreaWidth,
					imageAreaHeight);
		}
		if (_label != null && _labelVisible) {
			int leading = 0;
			if (_fontMetrics != null) {
				leading = _fontMetrics.getLeading();
			}
            // TODO: adapt to bg: go lighter on colors that darker() would make black
			// TODO: color registry
            Color fg = FigureUtilities.darker(g.getBackgroundColor());
            g.setForegroundColor(fg);
            g.drawString(_label, imageAreaWidth + GAP, rect.y
					+ (rect.height - getLabelHeight()) / 2 + leading);
            fg.dispose();
		}
	}

	/**
	 * @return the label text
	 */
	public String getLabel() {
		return _label;
	}

	/**
	 * @param label
	 */
	public void setLabel(String label) {
		this._label = label;
	}

	/**
	 * @return whether the label is visible
	 */
	public boolean isLabelVisible() {
		return _labelVisible;
	}

	/**
	 * @param labelVisible
	 */
	public void setLabelVisible(boolean labelVisible) {
		this._labelVisible = labelVisible;
	}
}
