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

import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Font;

/**
 * @author mengbo
 */
public class CSSFont implements ICSSFont {
	private String _family;

	private int _size;

	private int _style;

	private int _weight;

	private String _cssString;

	/**
	 * 
	 */
	public CSSFont(String family, int size, int style, int weight,
			String cssString) {
		this._family = family;
		this._size = size;
		this._style = style;
		this._weight = weight;
		_cssString = cssString;
	}

	public String getFontFamily() {
		return _family;
	}

	public int getFontSize() {
		return _size;
	}

	public int getFontStyle() {
		return _style;
	}

	public String getCSSString() {
		return _cssString;
	}

	public int getWeight() {
		return _weight;
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see java.lang.Object#equals(java.lang.Object)
	 */
	public boolean equals(Object obj) {
		if (obj instanceof CSSFont) {
			CSSFont fd = (CSSFont) obj;
			return this._family.equals(fd._family) && this._size == fd._size
					&& this._style == fd._style && this._weight == fd._weight;
		} else
			return false;
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see java.lang.Object#hashCode()
	 */
	public int hashCode() {
		return _family.hashCode() + _size + _style + _weight;
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see org.eclipse.jst.pagedesigner.css2.font.ICSSFont#getSwtFont()
	 */
	public Font getSwtFont() {
		// return FontPoolManager.getInstance().getFont(this);
		return CSSFontManager.getInstance().getSwtFont(this);
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see org.eclipse.jst.pagedesigner.css2.font.ICSSFont#getXHeight()
	 */
	public int getXHeight() {
		return getFontSize();
	}

	/**
	 * @return
	 */
	public int getSwtFontStyle() {
		int style = SWT.NONE;
		// see:http://www.htmlhelp.com/reference/css/font/font-weight.html
		if (getWeight() >= 600)
			style |= SWT.BOLD;
		style |= getFontStyle();
		return style;
	}
}
