blob: 4b798ab0bc3dce6b1afe79da28951893b524d031 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2008 Angelo Zerr 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:
* Angelo Zerr <angelo.zerr@gmail.com> - initial API and implementation
* IBM Corporation
*******************************************************************************/
package org.eclipse.e4.ui.css.swt.helpers;
import org.eclipse.e4.ui.css.core.css2.CSS2FontHelper;
import org.eclipse.e4.ui.css.core.css2.CSS2FontPropertiesHelpers;
import org.eclipse.e4.ui.css.core.css2.CSS2PrimitiveValueImpl;
import org.eclipse.e4.ui.css.core.dom.properties.css2.CSS2FontProperties;
import org.eclipse.e4.ui.css.core.dom.properties.css2.CSS2FontPropertiesImpl;
import org.eclipse.e4.ui.css.core.engine.CSSElementContext;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Font;
import org.eclipse.swt.graphics.FontData;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Widget;
import org.w3c.dom.css.CSSPrimitiveValue;
/**
* CSS SWT Font Helper to :
* <ul>
* <li>get CSS2FontProperties from Font of SWT Control.</li>
* <li>get Font of SWT Control from CSS2FontProperties.</li>
* </ul>
*/
public class CSSSWTFontHelper {
/**
* Get CSS2FontProperties from Control stored into Data of Control. If
* CSS2FontProperties doesn't exist, create it from Font of Control and
* store it into Data of Control.
*
* @param control
* @return
*/
public static CSS2FontProperties getCSS2FontProperties(Widget widget,
Font font, CSSElementContext context) {
// Search into Data of Control if CSS2FontProperties exist.
CSS2FontProperties fontProperties = CSS2FontPropertiesHelpers
.getCSS2FontProperties(context);
if (fontProperties == null) {
// CSS2FontProperties doesn't exist, create it
fontProperties = getCSS2FontProperties(font);
// store into ClientProperty the CSS2FontProperties
CSS2FontPropertiesHelpers.setCSS2FontProperties(fontProperties,
context);
}
return fontProperties;
}
/**
* Get CSS2FontProperties from Control stored into Data of Control. If
* CSS2FontProperties doesn't exist, create it from Font of Control and
* store it into Data of Control.
*
* @param control
* @return
*/
public static CSS2FontProperties getCSS2FontProperties(Control control,
CSSElementContext context) {
// Search into Data of Control if CSS2FontProperties exist.
CSS2FontProperties fontProperties = CSS2FontPropertiesHelpers
.getCSS2FontProperties(context);
if (fontProperties == null) {
// CSS2FontProperties doesn't exist, create it
Font font = control.getFont();
fontProperties = getCSS2FontProperties(font);
// store into ClientProperty the CSS2FontProperties
CSS2FontPropertiesHelpers.setCSS2FontProperties(fontProperties,
context);
}
return fontProperties;
}
/**
* Build CSS2FontProperties from SWT Font.
*
* @param font
* @return
*/
public static CSS2FontProperties getCSS2FontProperties(Font font) {
// Create CSS Font Properties
CSS2FontProperties fontProperties = new CSS2FontPropertiesImpl();
if (font != null) {
FontData fontData = getFirstFontData(font);
// Update font-family
String fontFamily = getFontFamily(font);
fontProperties.setFamily(new CSS2PrimitiveValueImpl(fontFamily));
// Update font-size
int fontSize = fontData.getHeight();
fontProperties.setSize(new CSS2PrimitiveValueImpl(fontSize));
// Update font-weight
String fontWeight = getFontWeight(font);
fontProperties.setWeight((new CSS2PrimitiveValueImpl(fontWeight)));
// Update font-style
String fontStyle = getFontStyle(font);
fontProperties.setStyle((new CSS2PrimitiveValueImpl(fontStyle)));
}
return fontProperties;
}
/**
* Get CSS2FontProperties from Font of JComponent and store
* CSS2FontProperties instance into ClientProperty of JComponent.
*
* @param component
* @return
*/
public static Font getFont(CSS2FontProperties fontProperties,
Control control) {
FontData oldFontData = getFirstFontData(control.getFont());
return getFont(fontProperties, oldFontData, control.getDisplay());
}
public static Font getFont(CSS2FontProperties fontProperties,
FontData oldFontData, Display display) {
FontData newFontData = getFontData(fontProperties, oldFontData);
return new Font(display, newFontData);
}
/**
* Return FontData from {@link CSS2FontProperties}.
*
* @param fontProperties
* @param control
* @return
*/
public static FontData getFontData(CSS2FontProperties fontProperties,
FontData oldFontData) {
FontData newFontData = new FontData();
// Style
int style = getSWTStyle(fontProperties, oldFontData);
newFontData.setStyle(style);
// Height
CSSPrimitiveValue cssFontSize = fontProperties.getSize();
if (cssFontSize != null) {
newFontData.setHeight((int) (cssFontSize)
.getFloatValue(CSSPrimitiveValue.CSS_PT));
} else {
if (oldFontData != null)
newFontData.setHeight(oldFontData.getHeight());
}
// Family
CSSPrimitiveValue cssFontFamily = fontProperties.getFamily();
if (cssFontFamily != null)
newFontData.setName(cssFontFamily.getStringValue());
else {
if (oldFontData != null)
newFontData.setName(oldFontData.getName());
}
return newFontData;
}
/**
* Return SWT style Font from {@link CSS2FontProperties}.
*
* @param fontProperties
* @param control
* @return
*/
public static int getSWTStyle(CSS2FontProperties fontProperties,
FontData fontData) {
if (fontData == null)
return SWT.NONE;
int fontStyle = fontData.getStyle();
// CSS2 font-style
CSSPrimitiveValue cssFontStyle = fontProperties.getStyle();
if (cssFontStyle != null) {
String style = cssFontStyle.getStringValue();
if ("italic".equals(style)) {
fontStyle = fontStyle | SWT.ITALIC;
} else {
if (fontStyle == (fontStyle | SWT.ITALIC))
fontStyle = fontStyle ^ SWT.ITALIC;
}
}
// CSS font-weight
CSSPrimitiveValue cssFontWeight = fontProperties.getWeight();
if (cssFontWeight != null) {
String weight = cssFontWeight.getStringValue();
if ("bold".equals(weight.toLowerCase())) {
fontStyle = fontStyle | SWT.BOLD;
} else {
if (fontStyle == (fontStyle | SWT.BOLD))
fontStyle = fontStyle ^ SWT.BOLD;
}
}
return fontStyle;
}
/**
* Return CSS Value font-family from Control Font
*
* @param control
* @return
*/
public static String getFontFamily(Control control) {
return getFontFamily(control.getFont());
}
/**
* Return CSS Value font-family from SWT Font
*
* @param font
* @return
*/
public static String getFontFamily(Font font) {
FontData fontData = getFirstFontData(font);
return getFontFamily(fontData);
}
public static String getFontFamily(FontData fontData) {
if (fontData != null) {
String family = fontData.getName();
return CSS2FontHelper.getFontFamily(family);
}
return null;
}
/**
* Return CSS Value font-size from Control Font
*
* @param control
* @return
*/
public static String getFontSize(Control control) {
return getFontSize(control.getFont());
}
/**
* Return CSS Value font-size from SWT Font
*
* @param font
* @return
*/
public static String getFontSize(Font font) {
FontData fontData = getFirstFontData(font);
return getFontSize(fontData);
}
public static String getFontSize(FontData fontData) {
if (fontData != null)
return CSS2FontHelper.getFontSize(fontData.getHeight());
return null;
}
/**
* Return CSS Value font-style from SWT Font
*
* @param control
* @return
*/
public static String getFontStyle(Control control) {
return getFontStyle(control.getFont());
}
/**
* Return CSS Value font-style from SWT Font
*
* @param font
* @return
*/
public static String getFontStyle(Font font) {
FontData fontData = getFirstFontData(font);
return getFontStyle(fontData);
}
public static String getFontStyle(FontData fontData) {
boolean isItalic = false;
if (fontData != null) {
isItalic = isItalic(fontData);
}
return CSS2FontHelper.getFontStyle(isItalic);
}
public static boolean isItalic(FontData fontData) {
int fontStyle = fontData.getStyle();
return ((fontStyle | SWT.ITALIC) == fontStyle);
}
/**
* Return CSS Value font-weight from Control Font
*
* @param control
* @return
*/
public static String getFontWeight(Control control) {
return getFontWeight(control.getFont());
}
/**
* Return CSS Value font-weight from Control Font
*
* @param font
* @return
*/
public static String getFontWeight(Font font) {
FontData fontData = getFirstFontData(font);
return getFontWeight(fontData);
}
public static String getFontWeight(FontData fontData) {
boolean isBold = false;
if (fontData != null) {
isBold = isBold(fontData);
}
return CSS2FontHelper.getFontWeight(isBold);
}
public static boolean isBold(FontData fontData) {
int fontStyle = fontData.getStyle();
return ((fontStyle | SWT.BOLD) == fontStyle);
}
/**
* Return CSS Value font-family from Control Font
*
* @param control
* @return
*/
public static String getFontComposite(Control control) {
return getFontComposite(control.getFont());
}
/**
* Return CSS Value font-family from SWT Font
*
* @param font
* @return
*/
public static String getFontComposite(Font font) {
FontData fontData = getFirstFontData(font);
return getFontComposite(fontData);
}
public static String getFontComposite(FontData fontData) {
if (fontData != null) {
StringBuffer composite = new StringBuffer();
// font-family
composite.append(getFontFamily(fontData));
composite.append(" ");
// font-size
composite.append(getFontSize(fontData));
composite.append(" ");
// font-weight
composite.append(getFontWeight(fontData));
composite.append(" ");
// font-style
composite.append(getFontStyle(fontData));
return composite.toString();
}
return null;
}
/**
* Return first FontData from Control Font.
*
* @param control
* @return
*/
public static FontData getFirstFontData(Control control) {
Font font = control.getFont();
if (font == null)
return null;
return getFirstFontData(font);
}
/**
*
* Return first FontData from SWT Font.
*
* @param font
* @return
*/
public static FontData getFirstFontData(Font font) {
FontData[] fontDatas = font.getFontData();
if (fontDatas == null || fontDatas.length < 1)
return null;
return fontDatas[0];
}
}