blob: 5deb85a905c8dc28437ec7932dc0b00f68cde20f [file] [log] [blame]
/*******************************************************************************
* 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.property;
import org.eclipse.jst.jsf.common.ui.internal.logging.Logger;
import org.eclipse.jst.pagedesigner.PDPlugin;
import org.eclipse.jst.pagedesigner.css2.ICSSStyle;
import org.eclipse.jst.pagedesigner.css2.font.ICSSFont;
import org.eclipse.jst.pagedesigner.css2.value.Length;
import org.eclipse.swt.widgets.Display;
import org.w3c.dom.DOMException;
import org.w3c.dom.css.CSSPrimitiveValue;
import org.w3c.dom.css.CSSValue;
/**
* @author mengbo
*/
public class LengthMeta extends CSSPropertyMeta {
private static final String[] KEYWORDS = new String[] { ICSSPropertyID.VAL_AUTO };
private static Logger _log = PDPlugin.getLogger(LengthMeta.class);
/**
* @param inherit
* @param initvalue
*/
public LengthMeta(boolean inherit, Object initvalue) {
super(inherit, initvalue);
}
/*
* (non-Javadoc)
*
* @see org.eclipse.jst.pagedesigner.css2.property.CSSPropertyMeta#getKeywordValues()
*/
protected String[] getKeywordValues() {
return KEYWORDS;
}
/*
* (non-Javadoc)
*
* @see org.eclipse.jst.pagedesigner.css2.property.ICSSPropertyMeta#calculateCSSValueResult(org.w3c.dom.css.CSSValue,
* java.lang.String,
* org.eclipse.jst.pagedesigner.css2.property.AbstractStyle)
*/
public Object calculateCSSValueResult(CSSValue value, String propertyName,
ICSSStyle style) {
if (value == null || value.getCssValueType() == CSSValue.CSS_VALUE_LIST
|| value.getCssValueType() == CSSValue.CSS_CUSTOM) {
return ICSSPropertyID.VAL_AUTO;
}
if (value.getCssValueType() == CSSValue.CSS_INHERIT) {
return ICSSPropertyID.VAL_AUTO;
}
CSSPrimitiveValue primitive = (CSSPrimitiveValue) value;
String key = checkKeywordValues(primitive.getCssText());
if (key != null) {
return key;
}
short unitType = primitive.getPrimitiveType();
float fvalue;
try {
fvalue = primitive.getFloatValue(unitType);
} catch (DOMException ex) {
_log.info("Get length failed, use auto value instead ("
+ value.getCssText() + ")");
return ICSSPropertyID.VAL_AUTO;
}
return toLength(fvalue, unitType, style, this.getPercentageType(),
getBaseFont(style));
}
public static Object toLength(String lengthStr, ICSSStyle style,
int percenttype, ICSSFont font) {
try {
FloatInfo floatinfo = new FloatInfo(lengthStr);
return toLength(floatinfo.getValue(), floatinfo.getValueType(),
style, percenttype, font);
} catch (Exception e) {
return ICSSPropertyID.VAL_AUTO;
}
}
/**
* Will not calculate percentage value. Used for calculate the "width" and
* "height" css property
*
* @param value
* @param parentValue
* @param font
* @return
*/
public static Object toLength(float result, short unitType,
ICSSStyle style, int percenttype, ICSSFont font) {
switch (unitType) {
case CSSPrimitiveValue.CSS_PERCENTAGE:
if (percenttype == PERCENTAGE_FONT) {
result = (int) ((result * font.getFontSize()) / 100.0);
break;
}
return new Length((int) result, true);
case CSSPrimitiveValue.CSS_PX: // no more calculation needed
case CSSPrimitiveValue.CSS_NUMBER:
break;
case CSSPrimitiveValue.CSS_EMS:
result *= font.getFontSize();
break;
case CSSPrimitiveValue.CSS_EXS:
result *= font.getXHeight();
break;
case CSSPrimitiveValue.CSS_CM:
result = cmToPixel(result);
break;
case CSSPrimitiveValue.CSS_IN:
result = inToPixel(result);
break;
case CSSPrimitiveValue.CSS_MM:
result = mmToPixel(result);
break;
case CSSPrimitiveValue.CSS_PT:
result = ptToPixel(result);
break;
case CSSPrimitiveValue.CSS_PC:
result = pcToPixel(result);
break;
case CSSPrimitiveValue.CSS_STRING:
return ICSSPropertyID.VAL_AUTO;
// FIXME:every thing is delt with?
}
// ok, when reach here, means we get the float value "result"
return new Length((int) result, false);
}
/**
* child class can override this method. e.g: font-size style's base font is
* parent style's font.
*
* @param style
* @return
*/
protected ICSSFont getBaseFont(ICSSStyle style) {
return style.getCSSFont();
}
private static float pcToPixel(float value) {
return ptToPixel(12 * value);
}
/**
* @param floatValue
* @return
*/
private static float ptToPixel(float floatValue) {
// the points used by CSS 2.1 are equal to 1/72th of an inch.
return inToPixel(floatValue / 72);
}
/**
* @param floatValue
* @return
*/
private static float mmToPixel(float floatValue) {
return cmToPixel(floatValue / 10);
}
/**
* @param floatValue
* @return
*/
private static float inToPixel(float floatValue) {
return getDPI() * floatValue;
}
/**
* @param floatValue
* @return
*/
private static float cmToPixel(float floatValue) {
// 1 inch is equal to 2.54 centimeters
return inToPixel((float) (floatValue / 2.54));
}
/**
* @return
*/
private static float getDPI() {
// XXX: cache the value?
return Display.getCurrent().getDPI().x;
}
public static boolean isAuto(Object result) {
if (result == ICSSPropertyID.VAL_AUTO) {
return true;
}
if (result instanceof Length && ((Length) result).getValue() <= 0) {
return true;
}
return false;
}
}