| /******************************************************************************* |
| * 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; |
| } |
| } |