/*****************************************************************************
 * Copyright (c) 2015, 2020 CEA LIST and others.
 *
 * This program and the accompanying materials are made
 * available under the terms of the Eclipse Public License 2.0
 * which is available at https://www.eclipse.org/legal/epl-2.0/
 *
 * SPDX-License-Identifier: EPL-2.0
 *
 * Contributors:
 *		Dirk Fauth <dirk.fauth@googlemail.com> - Initial API and implementation
 *
 *****************************************************************************/
package org.eclipse.nebula.widgets.nattable.extension.e4.css;

import java.net.URI;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

import org.eclipse.e4.ui.css.core.css2.CSS2FontPropertiesHelpers;
import org.eclipse.e4.ui.css.core.dom.CSSStylableElement;
import org.eclipse.e4.ui.css.core.dom.properties.Gradient;
import org.eclipse.e4.ui.css.core.dom.properties.ICSSPropertyHandler;
import org.eclipse.e4.ui.css.core.dom.properties.ICSSPropertyHandler2;
import org.eclipse.e4.ui.css.core.dom.properties.converters.ICSSValueConverter;
import org.eclipse.e4.ui.css.core.dom.properties.css2.CSS2FontProperties;
import org.eclipse.e4.ui.css.core.engine.CSSElementContext;
import org.eclipse.e4.ui.css.core.engine.CSSEngine;
import org.eclipse.e4.ui.css.core.util.resources.IResourcesLocatorManager;
import org.eclipse.e4.ui.css.swt.helpers.CSSSWTFontHelper;
import org.eclipse.e4.ui.css.swt.properties.converters.CSSValueSWTGradientConverterImpl;
import org.eclipse.e4.ui.css.swt.properties.css2.CSSPropertyBackgroundSWTHandler;
import org.eclipse.nebula.widgets.nattable.NatTable;
import org.eclipse.nebula.widgets.nattable.config.CellConfigAttributes;
import org.eclipse.nebula.widgets.nattable.data.convert.IDisplayConverter;
import org.eclipse.nebula.widgets.nattable.edit.EditConfigAttributes;
import org.eclipse.nebula.widgets.nattable.extension.e4.painterfactory.CellPainterFactory;
import org.eclipse.nebula.widgets.nattable.fillhandle.config.FillHandleConfigAttributes;
import org.eclipse.nebula.widgets.nattable.freeze.FreezeConfigAttributes;
import org.eclipse.nebula.widgets.nattable.hideshow.indicator.HideIndicatorConfigAttributes;
import org.eclipse.nebula.widgets.nattable.painter.IOverlayPainter;
import org.eclipse.nebula.widgets.nattable.painter.NatTableBorderOverlayPainter;
import org.eclipse.nebula.widgets.nattable.painter.cell.AbstractTextPainter;
import org.eclipse.nebula.widgets.nattable.painter.cell.CellPainterWrapper;
import org.eclipse.nebula.widgets.nattable.painter.cell.ICellPainter;
import org.eclipse.nebula.widgets.nattable.painter.cell.VerticalTextPainter;
import org.eclipse.nebula.widgets.nattable.painter.cell.decorator.PaddingDecorator;
import org.eclipse.nebula.widgets.nattable.painter.cell.decorator.PercentageBarDecorator;
import org.eclipse.nebula.widgets.nattable.resize.command.ColumnSizeConfigurationCommand;
import org.eclipse.nebula.widgets.nattable.resize.command.RowSizeConfigurationCommand;
import org.eclipse.nebula.widgets.nattable.style.BorderStyle;
import org.eclipse.nebula.widgets.nattable.style.BorderStyle.BorderModeEnum;
import org.eclipse.nebula.widgets.nattable.style.BorderStyle.LineStyleEnum;
import org.eclipse.nebula.widgets.nattable.style.CellStyleAttributes;
import org.eclipse.nebula.widgets.nattable.style.ConfigAttribute;
import org.eclipse.nebula.widgets.nattable.style.HorizontalAlignmentEnum;
import org.eclipse.nebula.widgets.nattable.style.IStyle;
import org.eclipse.nebula.widgets.nattable.style.TextDecorationEnum;
import org.eclipse.nebula.widgets.nattable.style.VerticalAlignmentEnum;
import org.eclipse.nebula.widgets.nattable.tree.config.TreeConfigAttributes;
import org.eclipse.nebula.widgets.nattable.ui.util.CellEdgeEnum;
import org.eclipse.nebula.widgets.nattable.util.GUIHelper;
import org.eclipse.swt.graphics.Color;
import org.eclipse.swt.graphics.Font;
import org.eclipse.swt.graphics.FontData;
import org.eclipse.swt.graphics.Image;
import org.w3c.dom.css.CSSPrimitiveValue;
import org.w3c.dom.css.CSSValue;
import org.w3c.dom.css.CSSValueList;

@SuppressWarnings("restriction")
public class NatTableCSSHandler implements ICSSPropertyHandler, ICSSPropertyHandler2 {

    @Override
    public boolean applyCSSProperty(Object element, String property, CSSValue value, String pseudo, CSSEngine engine)
            throws Exception {

        Object control = null;

        if (element instanceof CSSStylableElement) {
            CSSStylableElement elt = (CSSStylableElement) element;
            control = elt.getNativeWidget();
        }

        NatTable natTable = null;
        String label = null;
        String displayMode = NatTableCSSHelper.getDisplayMode(pseudo);

        CSSElementContext context = null;
        CSSElementContext natTableContext = null;

        if (control instanceof NatTable) {
            natTable = (NatTable) control;
        } else if (control instanceof NatTableWrapper) {
            natTable = ((NatTableWrapper) control).getNatTable();
            label = ((NatTableWrapper) control).getLabel();
            natTableContext = engine.getCSSElementContext(natTable);
        }

        if (natTable != null) {
            context = engine.getCSSElementContext(control);
            boolean resolvePainter = NatTableCSSHelper.resolvePainter(context, natTableContext, displayMode);

            // check property
            if (NatTableCSSConstants.PAINTER_RESOLUTION.equalsIgnoreCase(property)) {
                NatTableCSSHelper.storeContextValue(
                        context,
                        displayMode,
                        NatTableCSSConstants.PAINTER_RESOLUTION,
                        NatTableCSSHelper.getBoolean(value, true));
            } else if (NatTableCSSConstants.PAINTER.equalsIgnoreCase(property)) {
                NatTableCSSHelper.storeContextValue(
                        context,
                        displayMode,
                        NatTableCSSConstants.PAINTER,
                        NatTableCSSHelper.resolvePainterRepresentation(value));
            } else if (NatTableCSSConstants.BACKGROUND_COLOR.equalsIgnoreCase(property)) {
                CSSPropertyBackgroundSWTHandler.INSTANCE.applyCSSPropertyBackgroundColor(element, value, pseudo, engine);
            } else if (NatTableCSSConstants.BACKGROUND_IMAGE.equalsIgnoreCase(property)) {
                CSSPropertyBackgroundSWTHandler.INSTANCE.applyCSSPropertyBackgroundImage(element, value, pseudo, engine);
            } else if (NatTableCSSConstants.CELL_BACKGROUND_COLOR.equalsIgnoreCase(property)) {
                if (value.getCssValueType() == CSSValue.CSS_PRIMITIVE_VALUE) {
                    Color newColor = (Color) engine.convert(value, Color.class, natTable.getDisplay());
                    NatTableCSSHelper.applyNatTableStyle(
                            natTable,
                            CellStyleAttributes.BACKGROUND_COLOR,
                            newColor,
                            displayMode,
                            label);

                    if (resolvePainter) {
                        NatTableCSSHelper.storeContextValue(
                                context,
                                displayMode,
                                NatTableCSSConstants.CV_BACKGROUND_PAINTER,
                                CellPainterFactory.BACKGROUND_PAINTER_KEY);
                    }
                } else if (value.getCssValueType() == CSSValue.CSS_VALUE_LIST) {
                    Gradient grad = (Gradient) CSSValueSWTGradientConverterImpl.INSTANCE.convert(value, engine, natTable.getDisplay());
                    if (grad != null) {
                        List<?> values = grad.getValues();
                        if (values.size() == 2) {
                            Color background = (Color) engine.convert(
                                    (CSSPrimitiveValue) values.get(0), Color.class, natTable.getDisplay());
                            NatTableCSSHelper.applyNatTableStyle(
                                    natTable,
                                    CellStyleAttributes.GRADIENT_BACKGROUND_COLOR,
                                    background,
                                    displayMode,
                                    label);
                            Color foreground = (Color) engine.convert(
                                    (CSSPrimitiveValue) values.get(1), Color.class, natTable.getDisplay());
                            NatTableCSSHelper.applyNatTableStyle(
                                    natTable,
                                    CellStyleAttributes.GRADIENT_FOREGROUND_COLOR,
                                    foreground,
                                    displayMode,
                                    label);

                            NatTableCSSHelper
                                    .getPainterProperties(context, displayMode)
                                    .put(NatTableCSSConstants.GRADIENT_BACKGROUND_VERTICAL, grad.getVerticalGradient());

                            if (resolvePainter) {
                                NatTableCSSHelper.storeContextValue(
                                        context,
                                        displayMode,
                                        NatTableCSSConstants.CV_BACKGROUND_PAINTER,
                                        CellPainterFactory.GRADIENT_BACKGROUND_PAINTER_KEY);
                            }
                        }
                    }
                }
            } else if (NatTableCSSConstants.CELL_BACKGROUND_IMAGE.equalsIgnoreCase(property)) {
                Image image = (Image) engine.convert(value, Image.class, natTable.getDisplay());
                if (image != null) {
                    NatTableCSSHelper
                            .getPainterProperties(context, displayMode)
                            .put(NatTableCSSConstants.CELL_BACKGROUND_IMAGE, image);

                    if (resolvePainter) {
                        NatTableCSSHelper.storeContextValue(
                                context,
                                displayMode,
                                NatTableCSSConstants.CV_BACKGROUND_PAINTER,
                                CellPainterFactory.BACKGROUND_IMAGE_PAINTER_KEY);
                    }
                }
            } else if (NatTableCSSConstants.FOREGROUND_COLOR.equalsIgnoreCase(property)
                    && (value.getCssValueType() == CSSValue.CSS_PRIMITIVE_VALUE)) {
                Color newColor = (Color) engine.convert(value, Color.class, natTable.getDisplay());
                NatTableCSSHelper.applyNatTableStyle(
                        natTable,
                        CellStyleAttributes.FOREGROUND_COLOR,
                        newColor,
                        displayMode,
                        label);
            } else if (NatTableCSSConstants.HORIZONTAL_ALIGNMENT.equalsIgnoreCase(property)
                    && (value.getCssValueType() == CSSValue.CSS_PRIMITIVE_VALUE)) {
                String stringValue = value.getCssText().toLowerCase();
                HorizontalAlignmentEnum align = HorizontalAlignmentEnum.CENTER;
                if ("left".equals(stringValue)
                        || "lead".equals(stringValue)) {
                    align = HorizontalAlignmentEnum.LEFT;
                } else if ("right".equals(stringValue)
                        || "trail".equals(stringValue)) {
                    align = HorizontalAlignmentEnum.RIGHT;
                } else if ("center".equals(stringValue)) {
                    align = HorizontalAlignmentEnum.CENTER;
                }
                NatTableCSSHelper.applyNatTableStyle(
                        natTable,
                        CellStyleAttributes.HORIZONTAL_ALIGNMENT,
                        align,
                        displayMode,
                        label);
            } else if (NatTableCSSConstants.VERTICAL_ALIGNMENT.equalsIgnoreCase(property)
                    && (value.getCssValueType() == CSSValue.CSS_PRIMITIVE_VALUE)) {
                String stringValue = value.getCssText().toLowerCase();
                VerticalAlignmentEnum align = VerticalAlignmentEnum.MIDDLE;
                if ("top".equals(stringValue)
                        || "up".equals(stringValue)) {
                    align = VerticalAlignmentEnum.TOP;
                } else if ("bottom".equals(stringValue)
                        || "down".equals(stringValue)) {
                    align = VerticalAlignmentEnum.BOTTOM;
                } else if ("middle".equals(stringValue)) {
                    align = VerticalAlignmentEnum.MIDDLE;
                }
                NatTableCSSHelper.applyNatTableStyle(
                        natTable,
                        CellStyleAttributes.VERTICAL_ALIGNMENT,
                        align,
                        displayMode,
                        label);
            } else if (NatTableCSSConstants.FONT.equalsIgnoreCase(property)
                    && (value.getCssValueType() == CSSValue.CSS_VALUE_LIST)) {
                NatTableCSSHelper.setFontProperties(
                        (CSSValueList) value,
                        NatTableCSSHelper.getFontProperties(context, CSS2FontPropertiesHelpers.CSS2FONT_KEY, natTable, displayMode, label));
            } else if (NatTableCSSConstants.FONT_FAMILY.equalsIgnoreCase(property)
                    && (value.getCssValueType() == CSSValue.CSS_PRIMITIVE_VALUE)) {
                CSS2FontProperties font =
                        NatTableCSSHelper.getFontProperties(context, CSS2FontPropertiesHelpers.CSS2FONT_KEY, natTable, displayMode, label);
                font.setFamily((CSSPrimitiveValue) value);
            } else if (NatTableCSSConstants.FONT_SIZE.equalsIgnoreCase(property)
                    && (value.getCssValueType() == CSSValue.CSS_PRIMITIVE_VALUE)) {
                CSS2FontProperties font =
                        NatTableCSSHelper.getFontProperties(context, CSS2FontPropertiesHelpers.CSS2FONT_KEY, natTable, displayMode, label);
                font.setSize((CSSPrimitiveValue) value);
            } else if (NatTableCSSConstants.FONT_STYLE.equalsIgnoreCase(property)
                    && (value.getCssValueType() == CSSValue.CSS_PRIMITIVE_VALUE)) {
                CSS2FontProperties font =
                        NatTableCSSHelper.getFontProperties(context, CSS2FontPropertiesHelpers.CSS2FONT_KEY, natTable, displayMode, label);
                font.setStyle((CSSPrimitiveValue) value);
            } else if (NatTableCSSConstants.FONT_WEIGHT.equalsIgnoreCase(property)
                    && (value.getCssValueType() == CSSValue.CSS_PRIMITIVE_VALUE)) {
                CSS2FontProperties font =
                        NatTableCSSHelper.getFontProperties(context, CSS2FontPropertiesHelpers.CSS2FONT_KEY, natTable, displayMode, label);
                font.setWeight((CSSPrimitiveValue) value);
            } else if (NatTableCSSConstants.IMAGE.equalsIgnoreCase(property)) {
                Image image = (Image) engine.convert(value, Image.class, natTable.getDisplay());
                NatTableCSSHelper.applyNatTableStyle(
                        natTable,
                        CellStyleAttributes.IMAGE,
                        image,
                        displayMode,
                        label);

                if (resolvePainter) {
                    NatTableCSSHelper.storeContextValue(
                            context,
                            displayMode,
                            NatTableCSSConstants.CV_CONTENT_PAINTER,
                            CellPainterFactory.IMAGE_PAINTER_KEY);
                }
            } else if (NatTableCSSConstants.BORDER.equalsIgnoreCase(property)
                    && (value.getCssValueType() == CSSValue.CSS_VALUE_LIST)) {
                CSSValueList valueList = (CSSValueList) value;
                BorderStyle borderStyle = NatTableCSSHelper.getBorderStyle(context, displayMode);
                NatTableCSSHelper.storeBorderStyle(valueList, borderStyle, engine, natTable.getDisplay());
            } else if (NatTableCSSConstants.BORDER_COLOR.equalsIgnoreCase(property)
                    && (value.getCssValueType() == CSSValue.CSS_PRIMITIVE_VALUE)) {
                BorderStyle borderStyle = NatTableCSSHelper.getBorderStyle(context, displayMode);
                borderStyle.setColor((Color) engine.convert(value, Color.class, natTable.getDisplay()));
            } else if (NatTableCSSConstants.BORDER_STYLE.equalsIgnoreCase(property)
                    && (value.getCssValueType() == CSSValue.CSS_PRIMITIVE_VALUE)) {
                BorderStyle borderStyle = NatTableCSSHelper.getBorderStyle(context, displayMode);
                CSSPrimitiveValue primitiveValue = (CSSPrimitiveValue) value;
                borderStyle.setLineStyle(
                        LineStyleEnum.valueOf(primitiveValue.getStringValue().toUpperCase()));
            } else if (NatTableCSSConstants.BORDER_WIDTH.equalsIgnoreCase(property)
                    && (value.getCssValueType() == CSSValue.CSS_PRIMITIVE_VALUE)) {
                BorderStyle borderStyle = NatTableCSSHelper.getBorderStyle(context, displayMode);
                borderStyle.setThickness(
                        (int) ((CSSPrimitiveValue) value).getFloatValue(CSSPrimitiveValue.CSS_PT));
            } else if (NatTableCSSConstants.BORDER_MODE.equalsIgnoreCase(property)
                    && (value.getCssValueType() == CSSValue.CSS_PRIMITIVE_VALUE)) {
                BorderStyle borderStyle = NatTableCSSHelper.getBorderStyle(context, displayMode);
                CSSPrimitiveValue primitiveValue = (CSSPrimitiveValue) value;
                borderStyle.setBorderMode(
                        BorderModeEnum.valueOf(primitiveValue.getStringValue().toUpperCase()));
            } else if (NatTableCSSConstants.PASSWORD_ECHO_CHAR.equalsIgnoreCase(property)
                    && (value.getCssValueType() == CSSValue.CSS_PRIMITIVE_VALUE)) {
                String stringValue = value.getCssText();
                NatTableCSSHelper.applyNatTableStyle(
                        natTable,
                        CellStyleAttributes.PASSWORD_ECHO_CHAR,
                        stringValue.charAt(0),
                        displayMode,
                        label);
            } else if (NatTableCSSConstants.TEXT_DECORATION.equalsIgnoreCase(property)) {
                if (value.getCssValueType() == CSSValue.CSS_PRIMITIVE_VALUE) {
                    String stringValue = value.getCssText();
                    if ("none".equals(stringValue)) {
                        NatTableCSSHelper.applyNatTableStyle(
                                natTable,
                                CellStyleAttributes.TEXT_DECORATION,
                                null,
                                displayMode,
                                label);
                    } else if ("underline".equals(stringValue)) {
                        NatTableCSSHelper.applyNatTableStyle(
                                natTable,
                                CellStyleAttributes.TEXT_DECORATION,
                                TextDecorationEnum.UNDERLINE,
                                displayMode,
                                label);
                    } else if ("line-through".equals(stringValue)) {
                        NatTableCSSHelper.applyNatTableStyle(
                                natTable,
                                CellStyleAttributes.TEXT_DECORATION,
                                TextDecorationEnum.STRIKETHROUGH,
                                displayMode,
                                label);
                    }
                } else if (value.getCssValueType() == CSSValue.CSS_VALUE_LIST) {
                    CSSValueList valueList = (CSSValueList) value;
                    int length = valueList.getLength();
                    boolean strikethrough = false;
                    boolean underline = false;
                    for (int i = 0; i < length; i++) {
                        CSSValue value2 = valueList.item(i);
                        if (value2.getCssValueType() == CSSValue.CSS_PRIMITIVE_VALUE) {
                            String stringValue = value2.getCssText();
                            if ("none".equals(stringValue)) {
                                strikethrough = false;
                                underline = false;
                                break;
                            } else if ("underline".equals(stringValue)) {
                                underline = true;
                            } else if ("line-through".equals(stringValue)) {
                                strikethrough = true;
                            }
                        }
                    }

                    if (!strikethrough && !underline) {
                        NatTableCSSHelper.applyNatTableStyle(
                                natTable,
                                CellStyleAttributes.TEXT_DECORATION,
                                null,
                                displayMode,
                                label);
                    } else if (!strikethrough && underline) {
                        NatTableCSSHelper.applyNatTableStyle(
                                natTable,
                                CellStyleAttributes.TEXT_DECORATION,
                                TextDecorationEnum.UNDERLINE,
                                displayMode,
                                label);
                    } else if (strikethrough && !underline) {
                        NatTableCSSHelper.applyNatTableStyle(
                                natTable,
                                CellStyleAttributes.TEXT_DECORATION,
                                TextDecorationEnum.STRIKETHROUGH,
                                displayMode,
                                label);
                    } else if (strikethrough && underline) {
                        NatTableCSSHelper.applyNatTableStyle(
                                natTable,
                                CellStyleAttributes.TEXT_DECORATION,
                                TextDecorationEnum.UNDERLINE_STRIKETHROUGH,
                                displayMode,
                                label);
                    }
                }
            } else if (NatTableCSSConstants.FREEZE_SEPARATOR_COLOR.equalsIgnoreCase(property)
                    && (value.getCssValueType() == CSSValue.CSS_PRIMITIVE_VALUE)) {
                natTable.getConfigRegistry().registerConfigAttribute(
                        FreezeConfigAttributes.SEPARATOR_COLOR,
                        (Color) engine.convert(value, Color.class, natTable.getDisplay()),
                        displayMode,
                        label);
            } else if (NatTableCSSConstants.FREEZE_SEPARATOR_WIDTH.equalsIgnoreCase(property)
                    && (value.getCssValueType() == CSSValue.CSS_PRIMITIVE_VALUE)) {
                natTable.getConfigRegistry().registerConfigAttribute(
                        FreezeConfigAttributes.SEPARATOR_WIDTH,
                        (int) ((CSSPrimitiveValue) value).getFloatValue(CSSPrimitiveValue.CSS_PT),
                        displayMode,
                        label);
            } else if (NatTableCSSConstants.GRID_LINE_COLOR.equalsIgnoreCase(property)
                    && (value.getCssValueType() == CSSValue.CSS_PRIMITIVE_VALUE)) {
                natTable.getConfigRegistry().registerConfigAttribute(
                        CellConfigAttributes.GRID_LINE_COLOR,
                        (Color) engine.convert(value, Color.class, natTable.getDisplay()),
                        displayMode,
                        label);
            } else if (NatTableCSSConstants.GRID_LINE_WIDTH.equalsIgnoreCase(property)
                    && (value.getCssValueType() == CSSValue.CSS_PRIMITIVE_VALUE)) {
                natTable.getConfigRegistry().registerConfigAttribute(
                        CellConfigAttributes.GRID_LINE_WIDTH,
                        (int) ((CSSPrimitiveValue) value).getFloatValue(CSSPrimitiveValue.CSS_PT),
                        displayMode,
                        label);
            } else if (NatTableCSSConstants.RENDER_GRID_LINES.equalsIgnoreCase(property)
                    && (value.getCssValueType() == CSSValue.CSS_PRIMITIVE_VALUE)) {
                natTable.getConfigRegistry().registerConfigAttribute(
                        CellConfigAttributes.RENDER_GRID_LINES,
                        NatTableCSSHelper.getBoolean(value, true),
                        displayMode,
                        label);
            } else if (NatTableCSSConstants.CONVERSION_ERROR_FONT.equalsIgnoreCase(property)
                    && (value.getCssValueType() == CSSValue.CSS_VALUE_LIST)) {
                NatTableCSSHelper.setFontProperties(
                        (CSSValueList) value,
                        NatTableCSSHelper.getFontProperties(
                                context,
                                NatTableCSSConstants.CV_CONVERSION_ERROR_FONT_PROPERTIES,
                                natTable,
                                displayMode,
                                label));
            } else if (NatTableCSSConstants.CONVERSION_ERROR_FONT_FAMILY.equalsIgnoreCase(property)
                    && (value.getCssValueType() == CSSValue.CSS_PRIMITIVE_VALUE)) {
                CSS2FontProperties font = NatTableCSSHelper.getFontProperties(
                        context,
                        NatTableCSSConstants.CV_CONVERSION_ERROR_FONT_PROPERTIES,
                        natTable,
                        displayMode,
                        label);
                font.setFamily((CSSPrimitiveValue) value);
            } else if (NatTableCSSConstants.CONVERSION_ERROR_FONT_SIZE.equalsIgnoreCase(property)
                    && (value.getCssValueType() == CSSValue.CSS_PRIMITIVE_VALUE)) {
                CSS2FontProperties font = NatTableCSSHelper.getFontProperties(
                        context,
                        NatTableCSSConstants.CV_CONVERSION_ERROR_FONT_PROPERTIES,
                        natTable,
                        displayMode,
                        label);
                font.setSize((CSSPrimitiveValue) value);
            } else if (NatTableCSSConstants.CONVERSION_ERROR_FONT_STYLE.equalsIgnoreCase(property)
                    && (value.getCssValueType() == CSSValue.CSS_PRIMITIVE_VALUE)) {
                CSS2FontProperties font = NatTableCSSHelper.getFontProperties(
                        context,
                        NatTableCSSConstants.CV_CONVERSION_ERROR_FONT_PROPERTIES,
                        natTable,
                        displayMode,
                        label);
                font.setStyle((CSSPrimitiveValue) value);
            } else if (NatTableCSSConstants.CONVERSION_ERROR_FONT_WEIGHT.equalsIgnoreCase(property)
                    && (value.getCssValueType() == CSSValue.CSS_PRIMITIVE_VALUE)) {
                CSS2FontProperties font = NatTableCSSHelper.getFontProperties(
                        context,
                        NatTableCSSConstants.CV_CONVERSION_ERROR_FONT_PROPERTIES,
                        natTable,
                        displayMode,
                        label);
                font.setWeight((CSSPrimitiveValue) value);
            } else if (NatTableCSSConstants.CONVERSION_ERROR_BACKGROUND_COLOR.equalsIgnoreCase(property)
                    && (value.getCssValueType() == CSSValue.CSS_PRIMITIVE_VALUE)) {
                Color newColor = (Color) engine.convert(value, Color.class, natTable.getDisplay());
                NatTableCSSHelper.applyNatTableStyle(
                        natTable,
                        EditConfigAttributes.CONVERSION_ERROR_STYLE,
                        CellStyleAttributes.BACKGROUND_COLOR,
                        newColor,
                        displayMode,
                        label);
            } else if (NatTableCSSConstants.CONVERSION_ERROR_FOREGROUND_COLOR.equalsIgnoreCase(property)
                    && (value.getCssValueType() == CSSValue.CSS_PRIMITIVE_VALUE)) {
                Color newColor = (Color) engine.convert(value, Color.class, natTable.getDisplay());
                NatTableCSSHelper.applyNatTableStyle(
                        natTable,
                        EditConfigAttributes.CONVERSION_ERROR_STYLE,
                        CellStyleAttributes.FOREGROUND_COLOR,
                        newColor,
                        displayMode,
                        label);
            } else if (NatTableCSSConstants.VALIDATION_ERROR_FONT.equalsIgnoreCase(property)
                    && (value.getCssValueType() == CSSValue.CSS_VALUE_LIST)) {
                NatTableCSSHelper.setFontProperties(
                        (CSSValueList) value,
                        NatTableCSSHelper.getFontProperties(
                                context,
                                NatTableCSSConstants.CV_VALIDATION_ERROR_FONT_PROPERTIES,
                                natTable,
                                displayMode,
                                label));
            } else if (NatTableCSSConstants.VALIDATION_ERROR_FONT_FAMILY.equalsIgnoreCase(property)
                    && (value.getCssValueType() == CSSValue.CSS_PRIMITIVE_VALUE)) {
                CSS2FontProperties font = NatTableCSSHelper.getFontProperties(
                        context,
                        NatTableCSSConstants.CV_VALIDATION_ERROR_FONT_PROPERTIES,
                        natTable,
                        displayMode,
                        label);
                font.setFamily((CSSPrimitiveValue) value);
            } else if (NatTableCSSConstants.VALIDATION_ERROR_FONT_SIZE.equalsIgnoreCase(property)
                    && (value.getCssValueType() == CSSValue.CSS_PRIMITIVE_VALUE)) {
                CSS2FontProperties font = NatTableCSSHelper.getFontProperties(
                        context,
                        NatTableCSSConstants.CV_VALIDATION_ERROR_FONT_PROPERTIES,
                        natTable,
                        displayMode,
                        label);
                font.setSize((CSSPrimitiveValue) value);
            } else if (NatTableCSSConstants.VALIDATION_ERROR_FONT_STYLE.equalsIgnoreCase(property)
                    && (value.getCssValueType() == CSSValue.CSS_PRIMITIVE_VALUE)) {
                CSS2FontProperties font = NatTableCSSHelper.getFontProperties(
                        context,
                        NatTableCSSConstants.CV_VALIDATION_ERROR_FONT_PROPERTIES,
                        natTable,
                        displayMode,
                        label);
                font.setStyle((CSSPrimitiveValue) value);
            } else if (NatTableCSSConstants.VALIDATION_ERROR_FONT_WEIGHT.equalsIgnoreCase(property)
                    && (value.getCssValueType() == CSSValue.CSS_PRIMITIVE_VALUE)) {
                CSS2FontProperties font = NatTableCSSHelper.getFontProperties(
                        context,
                        NatTableCSSConstants.CV_VALIDATION_ERROR_FONT_PROPERTIES,
                        natTable,
                        displayMode,
                        label);
                font.setWeight((CSSPrimitiveValue) value);
            } else if (NatTableCSSConstants.VALIDATION_ERROR_BACKGROUND_COLOR.equalsIgnoreCase(property)
                    && (value.getCssValueType() == CSSValue.CSS_PRIMITIVE_VALUE)) {
                Color newColor = (Color) engine.convert(value, Color.class, natTable.getDisplay());
                NatTableCSSHelper.applyNatTableStyle(
                        natTable,
                        EditConfigAttributes.VALIDATION_ERROR_STYLE,
                        CellStyleAttributes.BACKGROUND_COLOR,
                        newColor,
                        displayMode,
                        label);
            } else if (NatTableCSSConstants.VALIDATION_ERROR_FOREGROUND_COLOR.equalsIgnoreCase(property)
                    && (value.getCssValueType() == CSSValue.CSS_PRIMITIVE_VALUE)) {
                Color newColor = (Color) engine.convert(value, Color.class, natTable.getDisplay());
                NatTableCSSHelper.applyNatTableStyle(
                        natTable,
                        EditConfigAttributes.VALIDATION_ERROR_STYLE,
                        CellStyleAttributes.FOREGROUND_COLOR,
                        newColor,
                        displayMode,
                        label);
            } else if (NatTableCSSConstants.WORD_WRAP.equalsIgnoreCase(property)
                    && (value.getCssValueType() == CSSValue.CSS_PRIMITIVE_VALUE)) {
                NatTableCSSHelper
                        .getPainterProperties(context, displayMode)
                        .put(NatTableCSSConstants.WORD_WRAP, NatTableCSSHelper.getBoolean(value, false));
            } else if (NatTableCSSConstants.TEXT_WRAP.equalsIgnoreCase(property)
                    && (value.getCssValueType() == CSSValue.CSS_PRIMITIVE_VALUE)) {
                NatTableCSSHelper
                        .getPainterProperties(context, displayMode)
                        .put(NatTableCSSConstants.TEXT_WRAP, NatTableCSSHelper.getBoolean(value, false));
            } else if (NatTableCSSConstants.TEXT_TRIM.equalsIgnoreCase(property)
                    && (value.getCssValueType() == CSSValue.CSS_PRIMITIVE_VALUE)) {
                NatTableCSSHelper
                        .getPainterProperties(context, displayMode)
                        .put(NatTableCSSConstants.TEXT_TRIM, NatTableCSSHelper.getBoolean(value, true));
            } else if (NatTableCSSConstants.TEXT_DIRECTION.equalsIgnoreCase(property)
                    && (value.getCssValueType() == CSSValue.CSS_PRIMITIVE_VALUE)) {
                NatTableCSSHelper
                        .getPainterProperties(context, displayMode)
                        .put(NatTableCSSConstants.TEXT_DIRECTION, value.getCssText());
            } else if (NatTableCSSConstants.LINE_SPACING.equalsIgnoreCase(property)
                    && (value.getCssValueType() == CSSValue.CSS_PRIMITIVE_VALUE)) {
                NatTableCSSHelper
                        .getPainterProperties(context, displayMode)
                        .put(NatTableCSSConstants.LINE_SPACING, (int) ((CSSPrimitiveValue) value).getFloatValue(CSSPrimitiveValue.CSS_PT));
            } else if (NatTableCSSConstants.COLUMN_WIDTH.equalsIgnoreCase(property)
                    && (value.getCssValueType() == CSSValue.CSS_PRIMITIVE_VALUE)) {
                CSSPrimitiveValue primitiveValue = (CSSPrimitiveValue) value;
                short type = primitiveValue.getPrimitiveType();
                switch (type) {
                    case CSSPrimitiveValue.CSS_IDENT:
                        if ("auto".equalsIgnoreCase(value.getCssText())) {
                            NatTableCSSHelper
                                    .getPainterProperties(context, displayMode)
                                    .put(NatTableCSSConstants.CALCULATE_CELL_WIDTH, true);
                        } else if ("percentage".equalsIgnoreCase(value.getCssText())) {
                            // set column percentage sizing
                            natTable.doCommand(new ColumnSizeConfigurationCommand(label, null, true));
                        }
                        break;
                    case CSSPrimitiveValue.CSS_PERCENTAGE:
                        // set column percentage sizing
                        int percentage = (int) ((CSSPrimitiveValue) value).getFloatValue(CSSPrimitiveValue.CSS_PERCENTAGE);
                        natTable.doCommand(new ColumnSizeConfigurationCommand(label, percentage, true));
                        break;
                    case CSSPrimitiveValue.CSS_PT:
                    case CSSPrimitiveValue.CSS_NUMBER:
                    case CSSPrimitiveValue.CSS_PX:
                        // set column width by label
                        int width = (int) ((CSSPrimitiveValue) value).getFloatValue(CSSPrimitiveValue.CSS_PT);
                        natTable.doCommand(new ColumnSizeConfigurationCommand(label, width, false));
                        break;
                }
            } else if (NatTableCSSConstants.ROW_HEIGHT.equalsIgnoreCase(property)
                    && (value.getCssValueType() == CSSValue.CSS_PRIMITIVE_VALUE)) {
                CSSPrimitiveValue primitiveValue = (CSSPrimitiveValue) value;
                short type = primitiveValue.getPrimitiveType();
                switch (type) {
                    case CSSPrimitiveValue.CSS_IDENT:
                        if ("auto".equalsIgnoreCase(value.getCssText())) {
                            NatTableCSSHelper
                                    .getPainterProperties(context, displayMode)
                                    .put(NatTableCSSConstants.CALCULATE_CELL_HEIGHT, true);
                        } else if ("percentage".equalsIgnoreCase(value.getCssText())) {
                            // set column percentage sizing
                            natTable.doCommand(new RowSizeConfigurationCommand(label, null, true));
                        }
                        break;
                    case CSSPrimitiveValue.CSS_PERCENTAGE:
                        // set column percentage sizing
                        int percentage = (int) ((CSSPrimitiveValue) value).getFloatValue(CSSPrimitiveValue.CSS_PERCENTAGE);
                        natTable.doCommand(new RowSizeConfigurationCommand(label, percentage, true));
                        break;
                    case CSSPrimitiveValue.CSS_PT:
                    case CSSPrimitiveValue.CSS_NUMBER:
                    case CSSPrimitiveValue.CSS_PX:
                        // set column width by label
                        int width = (int) ((CSSPrimitiveValue) value).getFloatValue(CSSPrimitiveValue.CSS_PT);
                        natTable.doCommand(new RowSizeConfigurationCommand(label, width, false));
                        break;
                }
            } else if (NatTableCSSConstants.CONVERTER.equalsIgnoreCase(property)) {
                if (value.getCssValueType() == CSSValue.CSS_PRIMITIVE_VALUE) {
                    if (NatTableCSSHelper.isConverterString(value.getCssText())) {
                        natTable.getConfigRegistry().registerConfigAttribute(
                                CellConfigAttributes.DISPLAY_CONVERTER,
                                NatTableCSSHelper.getDisplayConverter(
                                        value.getCssText(),
                                        true,
                                        null,
                                        null,
                                        null),
                                displayMode,
                                label);
                    }
                } else if (value.getCssValueType() == CSSValue.CSS_VALUE_LIST) {
                    String converterKey = null;
                    boolean format = true;
                    Integer minFractionDigits = null;
                    Integer maxFractionDigits = null;
                    String pattern = null;

                    CSSValueList valueList = (CSSValueList) value;
                    int length = valueList.getLength();
                    for (int i = 0; i < length; i++) {
                        CSSValue value2 = valueList.item(i);
                        if (value2.getCssValueType() == CSSValue.CSS_PRIMITIVE_VALUE) {
                            CSSPrimitiveValue primitiveValue = (CSSPrimitiveValue) value2;
                            short type = primitiveValue.getPrimitiveType();
                            switch (type) {
                                case CSSPrimitiveValue.CSS_IDENT:
                                    if (NatTableCSSHelper.isConverterString(primitiveValue.getCssText())) {
                                        converterKey = primitiveValue.getCssText();
                                    } else if ("true".equals(primitiveValue.getCssText())
                                            || "false".equals(primitiveValue.getCssText())) {
                                        format = NatTableCSSHelper.getBoolean(primitiveValue, true);
                                    }
                                    break;
                                case CSSPrimitiveValue.CSS_STRING:
                                    pattern = primitiveValue.getCssText();
                                    break;
                                case CSSPrimitiveValue.CSS_PT:
                                case CSSPrimitiveValue.CSS_NUMBER:
                                case CSSPrimitiveValue.CSS_PX:
                                    if (minFractionDigits == null) {
                                        minFractionDigits = (int) primitiveValue.getFloatValue(CSSPrimitiveValue.CSS_PT);
                                    } else {
                                        maxFractionDigits = (int) primitiveValue.getFloatValue(CSSPrimitiveValue.CSS_PT);
                                    }
                                    break;
                            }
                        }
                    }

                    if (converterKey != null) {
                        natTable.getConfigRegistry().registerConfigAttribute(
                                CellConfigAttributes.DISPLAY_CONVERTER,
                                NatTableCSSHelper.getDisplayConverter(
                                        converterKey,
                                        format,
                                        minFractionDigits,
                                        maxFractionDigits,
                                        pattern),
                                displayMode,
                                label);
                    }
                }
            } else if (NatTableCSSConstants.PADDING.equalsIgnoreCase(property)) {
                if (value.getCssValueType() == CSSValue.CSS_PRIMITIVE_VALUE) {
                    NatTableCSSHelper.storePadding(NatTableCSSConstants.PADDING_TOP, value, context, displayMode);
                    NatTableCSSHelper.storePadding(NatTableCSSConstants.PADDING_RIGHT, value, context, displayMode);
                    NatTableCSSHelper.storePadding(NatTableCSSConstants.PADDING_BOTTOM, value, context, displayMode);
                    NatTableCSSHelper.storePadding(NatTableCSSConstants.PADDING_LEFT, value, context, displayMode);
                } else if (value.getCssValueType() == CSSValue.CSS_VALUE_LIST) {
                    CSSValueList valueList = (CSSValueList) value;
                    int length = valueList.getLength();
                    if (length == 4) {
                        NatTableCSSHelper.storePadding(NatTableCSSConstants.PADDING_TOP, valueList.item(0), context, displayMode);
                        NatTableCSSHelper.storePadding(NatTableCSSConstants.PADDING_RIGHT, valueList.item(1), context, displayMode);
                        NatTableCSSHelper.storePadding(NatTableCSSConstants.PADDING_BOTTOM, valueList.item(2), context, displayMode);
                        NatTableCSSHelper.storePadding(NatTableCSSConstants.PADDING_LEFT, valueList.item(3), context, displayMode);
                    } else if (length == 3) {
                        NatTableCSSHelper.storePadding(NatTableCSSConstants.PADDING_TOP, valueList.item(0), context, displayMode);
                        NatTableCSSHelper.storePadding(NatTableCSSConstants.PADDING_RIGHT, valueList.item(1), context, displayMode);
                        NatTableCSSHelper.storePadding(NatTableCSSConstants.PADDING_BOTTOM, valueList.item(2), context, displayMode);
                        NatTableCSSHelper.storePadding(NatTableCSSConstants.PADDING_LEFT, valueList.item(1), context, displayMode);
                    } else if (length == 2) {
                        NatTableCSSHelper.storePadding(NatTableCSSConstants.PADDING_TOP, valueList.item(0), context, displayMode);
                        NatTableCSSHelper.storePadding(NatTableCSSConstants.PADDING_RIGHT, valueList.item(1), context, displayMode);
                        NatTableCSSHelper.storePadding(NatTableCSSConstants.PADDING_BOTTOM, valueList.item(0), context, displayMode);
                        NatTableCSSHelper.storePadding(NatTableCSSConstants.PADDING_LEFT, valueList.item(1), context, displayMode);
                    }
                }
            } else if (NatTableCSSConstants.PADDING_TOP.equalsIgnoreCase(property)) {
                NatTableCSSHelper.storePadding(NatTableCSSConstants.PADDING_TOP, value, context, displayMode);
            } else if (NatTableCSSConstants.PADDING_RIGHT.equalsIgnoreCase(property)) {
                NatTableCSSHelper.storePadding(NatTableCSSConstants.PADDING_RIGHT, value, context, displayMode);
            } else if (NatTableCSSConstants.PADDING_BOTTOM.equalsIgnoreCase(property)) {
                NatTableCSSHelper.storePadding(NatTableCSSConstants.PADDING_BOTTOM, value, context, displayMode);
            } else if (NatTableCSSConstants.PADDING_LEFT.equalsIgnoreCase(property)) {
                NatTableCSSHelper.storePadding(NatTableCSSConstants.PADDING_LEFT, value, context, displayMode);
            } else if (NatTableCSSConstants.TABLE_BORDER_COLOR.equals(property)
                    && value.getCssValueType() == CSSValue.CSS_PRIMITIVE_VALUE) {

                // remove any prior configured NatTableBorderOverlayPainter
                for (Iterator<IOverlayPainter> it = natTable.getOverlayPainters().iterator(); it.hasNext();) {
                    IOverlayPainter painter = it.next();
                    if (painter instanceof NatTableBorderOverlayPainter) {
                        it.remove();
                    }
                }

                // add the new NatTableBorderOverlayPainter
                if ("auto".equalsIgnoreCase(value.getCssText())) {
                    natTable.addOverlayPainter(new NatTableBorderOverlayPainter(true, natTable.getConfigRegistry()));
                } else {
                    Color newColor = (Color) engine.convert(value, Color.class, natTable.getDisplay());
                    natTable.addOverlayPainter(new NatTableBorderOverlayPainter(newColor, true));
                }
            } else if (NatTableCSSConstants.FILL_HANDLE_BORDER.equalsIgnoreCase(property)
                    && (value.getCssValueType() == CSSValue.CSS_VALUE_LIST)) {
                CSSValueList valueList = (CSSValueList) value;
                BorderStyle borderStyle = new BorderStyle();
                NatTableCSSHelper.storeBorderStyle(valueList, borderStyle, engine, natTable.getDisplay());
                natTable.getConfigRegistry().registerConfigAttribute(
                        FillHandleConfigAttributes.FILL_HANDLE_BORDER_STYLE,
                        borderStyle);
            } else if (NatTableCSSConstants.FILL_HANDLE_COLOR.equalsIgnoreCase(property)
                    && (value.getCssValueType() == CSSValue.CSS_PRIMITIVE_VALUE)) {
                natTable.getConfigRegistry().registerConfigAttribute(
                        FillHandleConfigAttributes.FILL_HANDLE_COLOR,
                        (Color) engine.convert(value, Color.class, natTable.getDisplay()));
            } else if (NatTableCSSConstants.FILL_REGION_BORDER.equalsIgnoreCase(property)
                    && (value.getCssValueType() == CSSValue.CSS_VALUE_LIST)) {
                CSSValueList valueList = (CSSValueList) value;
                BorderStyle borderStyle = new BorderStyle();
                NatTableCSSHelper.storeBorderStyle(valueList, borderStyle, engine, natTable.getDisplay());
                natTable.getConfigRegistry().registerConfigAttribute(
                        FillHandleConfigAttributes.FILL_HANDLE_REGION_BORDER_STYLE,
                        borderStyle);
            } else if (NatTableCSSConstants.DECORATION.equalsIgnoreCase(property)
                    && (value.getCssValueType() == CSSValue.CSS_VALUE_LIST)) {
                CSSValueList valueList = (CSSValueList) value;
                int length = valueList.getLength();
                for (int i = 0; i < length; i++) {
                    CSSValue value2 = valueList.item(i);
                    if (value2.getCssValueType() == CSSValue.CSS_PRIMITIVE_VALUE) {
                        CSSPrimitiveValue primitiveValue = (CSSPrimitiveValue) value2;
                        short type = primitiveValue.getPrimitiveType();
                        switch (type) {
                            case CSSPrimitiveValue.CSS_IDENT:
                                if ("true".equalsIgnoreCase(value2.getCssText())
                                        || "false".equalsIgnoreCase(value2.getCssText())) {
                                    NatTableCSSHelper
                                            .getPainterProperties(context, displayMode)
                                            .put(NatTableCSSConstants.PAINT_DECORATION_DEPENDENT,
                                                    NatTableCSSHelper.getBoolean(value2, true));
                                } else {
                                    CellEdgeEnum edge = NatTableCSSHelper.getCellEdgeEnum(value2.getCssText());
                                    NatTableCSSHelper
                                            .getPainterProperties(context, displayMode)
                                            .put(NatTableCSSConstants.DECORATOR_EDGE, edge);
                                }

                                break;
                            case CSSPrimitiveValue.CSS_URI:
                                // first try to resolve the image using NatTable
                                // GUIHelper to support scaling
                                Image image = null;
                                try {
                                    IResourcesLocatorManager manager = engine.getResourcesLocatorManager();
                                    String resolved = manager.resolve(primitiveValue.getStringValue());
                                    image = GUIHelper.getImageByURL(new URI(resolved).toURL());
                                } catch (Exception e) {
                                    // something went wrong with loading the
                                    // image by URL try to use the CSSEngine
                                    image = (Image) engine.convert(value2, Image.class, natTable.getDisplay());
                                }

                                if (image != null) {
                                    NatTableCSSHelper
                                            .getPainterProperties(context, displayMode)
                                            .put(NatTableCSSConstants.DECORATOR_IMAGE, image);
                                }
                                break;
                            case CSSPrimitiveValue.CSS_PT:
                            case CSSPrimitiveValue.CSS_NUMBER:
                            case CSSPrimitiveValue.CSS_PX:
                                int spacing = (int) ((CSSPrimitiveValue) value2).getFloatValue(CSSPrimitiveValue.CSS_PT);
                                NatTableCSSHelper
                                        .getPainterProperties(context, displayMode)
                                        .put(NatTableCSSConstants.DECORATOR_SPACING, spacing);
                                break;
                        }
                    }
                }

                List<String> decoratorKeys = NatTableCSSHelper.getDecoratorPainter(context, displayMode);
                if (!decoratorKeys.contains(CellPainterFactory.DECORATOR_KEY)) {
                    decoratorKeys.add(CellPainterFactory.DECORATOR_KEY);
                }
            } else if (NatTableCSSConstants.INVERT_ICONS.equalsIgnoreCase(property)
                    && (value.getCssValueType() == CSSValue.CSS_PRIMITIVE_VALUE)) {
                NatTableCSSHelper
                        .getPainterProperties(context, displayMode)
                        .put(NatTableCSSConstants.INVERT_ICONS, NatTableCSSHelper.getBoolean(value, false));
            } else if (NatTableCSSConstants.PERCENTAGE_DECORATOR_COLORS.equalsIgnoreCase(property)) {
                if (value.getCssValueType() == CSSValue.CSS_PRIMITIVE_VALUE) {
                    Color newColor = (Color) engine.convert(value, Color.class, natTable.getDisplay());
                    NatTableCSSHelper.applyNatTableStyle(
                            natTable,
                            PercentageBarDecorator.PERCENTAGE_BAR_COMPLETE_REGION_START_COLOR,
                            newColor,
                            displayMode,
                            label);
                } else if (value.getCssValueType() == CSSValue.CSS_VALUE_LIST) {
                    CSSValueList valueList = (CSSValueList) value;
                    int length = valueList.getLength();
                    for (int i = 0; i < length; i++) {
                        CSSValue value2 = valueList.item(i);
                        if (value2.getCssValueType() == CSSValue.CSS_PRIMITIVE_VALUE) {
                            Color newColor = (Color) engine.convert(value2, Color.class, natTable.getDisplay());
                            ConfigAttribute<Color> percentageConfig = null;
                            switch (i) {
                                case 0:
                                    percentageConfig = PercentageBarDecorator.PERCENTAGE_BAR_COMPLETE_REGION_START_COLOR;
                                    break;
                                case 1:
                                    percentageConfig = PercentageBarDecorator.PERCENTAGE_BAR_COMPLETE_REGION_END_COLOR;
                                    break;
                                case 2:
                                    percentageConfig = PercentageBarDecorator.PERCENTAGE_BAR_INCOMPLETE_REGION_COLOR;
                                    break;
                            }

                            if (percentageConfig != null) {
                                NatTableCSSHelper.applyNatTableStyle(
                                        natTable,
                                        percentageConfig,
                                        newColor,
                                        displayMode,
                                        label);
                            }
                        }
                    }
                }
            } else if (NatTableCSSConstants.TREE_STRUCTURE_PAINTER.equalsIgnoreCase(property)) {
                List<String> painterValues = NatTableCSSHelper.resolvePainterRepresentation(value);
                Map<String, Object> painterProperties =
                        NatTableCSSHelper.getPainterPropertiesInherited(context, natTableContext, displayMode);

                // ensure that the last value in the element is not a content
                // painter
                if (CellPainterFactory.getInstance().isContentPainterKey(painterValues.get(painterValues.size() - 1))) {
                    painterValues.remove(painterValues.size() - 1);
                }

                // add none to the end to ensure that the content painter is
                // resolved dynamically by the TreeLayer
                painterValues.add(CellPainterFactory.NONE);

                ICellPainter painter = CellPainterFactory.getInstance().getCellPainter(painterValues, painterProperties);

                if (painter != null) {
                    natTable.getConfigRegistry().registerConfigAttribute(
                            TreeConfigAttributes.TREE_STRUCTURE_PAINTER,
                            painter,
                            displayMode);
                }
            } else if (NatTableCSSConstants.HIDE_INDICATOR_COLOR.equalsIgnoreCase(property)
                    && (value.getCssValueType() == CSSValue.CSS_PRIMITIVE_VALUE)) {
                natTable.getConfigRegistry().registerConfigAttribute(
                        HideIndicatorConfigAttributes.HIDE_INDICATOR_COLOR,
                        (Color) engine.convert(value, Color.class, natTable.getDisplay()),
                        displayMode,
                        label);
            } else if (NatTableCSSConstants.HIDE_INDICATOR_WIDTH.equalsIgnoreCase(property)
                    && (value.getCssValueType() == CSSValue.CSS_PRIMITIVE_VALUE)) {
                natTable.getConfigRegistry().registerConfigAttribute(
                        HideIndicatorConfigAttributes.HIDE_INDICATOR_LINE_WIDTH,
                        (int) ((CSSPrimitiveValue) value).getFloatValue(CSSPrimitiveValue.CSS_PT),
                        displayMode,
                        label);
            }

            return true;
        }

        return false;
    }

    @Override
    public String retrieveCSSProperty(Object control, String property, String pseudo, CSSEngine engine)
            throws Exception {

        NatTable natTable = null;
        String label = null;
        String displayMode = NatTableCSSHelper.getDisplayMode(pseudo);

        if (control instanceof NatTable) {
            natTable = (NatTable) control;
        } else if (control instanceof NatTableWrapper) {
            natTable = ((NatTableWrapper) control).getNatTable();
            label = ((NatTableWrapper) control).getLabel();
        }

        if (natTable != null) {
            // check property
            if (NatTableCSSConstants.BACKGROUND_COLOR.equalsIgnoreCase(property)) {
                return CSSPropertyBackgroundSWTHandler.INSTANCE.retrieveCSSPropertyBackgroundColor(control, pseudo, engine);
            } else if (NatTableCSSConstants.BACKGROUND_IMAGE.equalsIgnoreCase(property)) {
                return CSSPropertyBackgroundSWTHandler.INSTANCE.retrieveCSSPropertyBackgroundImage(control, pseudo, engine);
            } else if (NatTableCSSConstants.CELL_BACKGROUND_COLOR.equalsIgnoreCase(property)) {
                ICSSValueConverter cssValueConverter = engine.getCSSValueConverter(String.class);
                return cssValueConverter.convert(
                        NatTableCSSHelper.getNatTableStyle(
                                natTable,
                                CellStyleAttributes.BACKGROUND_COLOR,
                                displayMode,
                                label),
                        engine,
                        null);
            } else if (NatTableCSSConstants.CELL_BACKGROUND_IMAGE.equalsIgnoreCase(property)) {
                // TODO : manage path of Image.
                return "none";
            } else if (NatTableCSSConstants.FOREGROUND_COLOR.equalsIgnoreCase(property)) {
                ICSSValueConverter cssValueConverter = engine.getCSSValueConverter(String.class);
                return cssValueConverter.convert(
                        NatTableCSSHelper.getNatTableStyle(
                                natTable,
                                CellStyleAttributes.FOREGROUND_COLOR,
                                displayMode,
                                label),
                        engine,
                        null);
            } else if (NatTableCSSConstants.HORIZONTAL_ALIGNMENT.equalsIgnoreCase(property)) {
                HorizontalAlignmentEnum align = NatTableCSSHelper.getNatTableStyle(
                        natTable,
                        CellStyleAttributes.HORIZONTAL_ALIGNMENT,
                        displayMode,
                        label);
                switch (align) {
                    case CENTER:
                        return "center";
                    case LEFT:
                        return "left";
                    case RIGHT:
                        return "right";
                }
            } else if (NatTableCSSConstants.VERTICAL_ALIGNMENT.equalsIgnoreCase(property)) {
                VerticalAlignmentEnum align = NatTableCSSHelper.getNatTableStyle(
                        natTable,
                        CellStyleAttributes.VERTICAL_ALIGNMENT,
                        displayMode,
                        label);
                switch (align) {
                    case TOP:
                        return "top";
                    case MIDDLE:
                        return "middle";
                    case BOTTOM:
                        return "bottom";
                }
            } else if (NatTableCSSConstants.FONT.equalsIgnoreCase(property)) {
                Font font = NatTableCSSHelper.getNatTableStyle(
                        natTable,
                        CellStyleAttributes.FONT,
                        displayMode,
                        label);
                return CSSSWTFontHelper.getFontComposite(font);
            } else if (NatTableCSSConstants.FONT_FAMILY.equalsIgnoreCase(property)) {
                Font font = NatTableCSSHelper.getNatTableStyle(
                        natTable,
                        CellStyleAttributes.FONT,
                        displayMode,
                        label);
                return CSSSWTFontHelper.getFontFamily(font);
            } else if (NatTableCSSConstants.FONT_SIZE.equalsIgnoreCase(property)) {
                Font font = NatTableCSSHelper.getNatTableStyle(
                        natTable,
                        CellStyleAttributes.FONT,
                        displayMode,
                        label);
                return CSSSWTFontHelper.getFontSize(font);
            } else if (NatTableCSSConstants.FONT_STYLE.equalsIgnoreCase(property)) {
                Font font = NatTableCSSHelper.getNatTableStyle(
                        natTable,
                        CellStyleAttributes.FONT,
                        displayMode,
                        label);
                return CSSSWTFontHelper.getFontStyle(font);
            } else if (NatTableCSSConstants.FONT_WEIGHT.equalsIgnoreCase(property)) {
                Font font = NatTableCSSHelper.getNatTableStyle(
                        natTable,
                        CellStyleAttributes.FONT,
                        displayMode,
                        label);
                return CSSSWTFontHelper.getFontWeight(font);
            } else if (NatTableCSSConstants.IMAGE.equalsIgnoreCase(property)) {
                // TODO : manage path of Image.
                return "none";
            } else if (NatTableCSSConstants.BORDER.equalsIgnoreCase(property)) {
                BorderStyle border = NatTableCSSHelper.getNatTableStyle(
                        natTable,
                        CellStyleAttributes.BORDER_STYLE,
                        displayMode,
                        label);

                ICSSValueConverter cssValueConverter = engine.getCSSValueConverter(String.class);
                return border.getThickness() + " "
                        + border.getLineStyle().toString().toLowerCase()
                        + " " + border.getBorderMode().toString().toLowerCase()
                        + " " + cssValueConverter.convert(
                                border.getColor(),
                                engine,
                                null);
            } else if (NatTableCSSConstants.BORDER_COLOR.equalsIgnoreCase(property)) {
                BorderStyle border = NatTableCSSHelper.getNatTableStyle(
                        natTable,
                        CellStyleAttributes.BORDER_STYLE,
                        displayMode,
                        label);
                ICSSValueConverter cssValueConverter = engine.getCSSValueConverter(String.class);
                return cssValueConverter.convert(
                        border.getColor(),
                        engine,
                        null);
            } else if (NatTableCSSConstants.BORDER_STYLE.equalsIgnoreCase(property)) {
                BorderStyle border = NatTableCSSHelper.getNatTableStyle(
                        natTable,
                        CellStyleAttributes.BORDER_STYLE,
                        displayMode,
                        label);
                return border.getLineStyle().toString().toLowerCase();
            } else if (NatTableCSSConstants.BORDER_WIDTH.equalsIgnoreCase(property)) {
                BorderStyle border = NatTableCSSHelper.getNatTableStyle(
                        natTable,
                        CellStyleAttributes.BORDER_STYLE,
                        displayMode,
                        label);
                return "" + border.getThickness();
            } else if (NatTableCSSConstants.BORDER_MODE.equalsIgnoreCase(property)) {
                BorderStyle border = NatTableCSSHelper.getNatTableStyle(
                        natTable,
                        CellStyleAttributes.BORDER_STYLE,
                        displayMode,
                        label);
                return "" + border.getBorderMode();
            } else if (NatTableCSSConstants.PASSWORD_ECHO_CHAR.equalsIgnoreCase(property)) {
                return "" + NatTableCSSHelper.getNatTableStyle(
                        natTable,
                        CellStyleAttributes.PASSWORD_ECHO_CHAR,
                        displayMode,
                        label);
            } else if (NatTableCSSConstants.TEXT_DECORATION.equalsIgnoreCase(property)) {
                TextDecorationEnum decoration = NatTableCSSHelper.getNatTableStyle(
                        natTable,
                        CellStyleAttributes.TEXT_DECORATION,
                        displayMode,
                        label);
                switch (decoration) {
                    case NONE:
                        return "none";
                    case STRIKETHROUGH:
                        return "line-through";
                    case UNDERLINE:
                        return "underline";
                    case UNDERLINE_STRIKETHROUGH:
                        return "underline line-through";
                }
            } else if (NatTableCSSConstants.FREEZE_SEPARATOR_COLOR.equalsIgnoreCase(property)) {
                ICSSValueConverter cssValueConverter = engine.getCSSValueConverter(String.class);
                return cssValueConverter.convert(
                        natTable.getConfigRegistry().getConfigAttribute(
                                FreezeConfigAttributes.SEPARATOR_COLOR,
                                displayMode,
                                label),
                        engine,
                        null);
            } else if (NatTableCSSConstants.FREEZE_SEPARATOR_WIDTH.equalsIgnoreCase(property)) {
                Integer width = natTable.getConfigRegistry().getConfigAttribute(
                        FreezeConfigAttributes.SEPARATOR_WIDTH,
                        displayMode,
                        label);
                if (width == null) {
                    return "0";
                } else {
                    return width.toString();
                }
            } else if (NatTableCSSConstants.GRID_LINE_COLOR.equalsIgnoreCase(property)) {
                ICSSValueConverter cssValueConverter = engine.getCSSValueConverter(String.class);
                return cssValueConverter.convert(
                        natTable.getConfigRegistry().getConfigAttribute(
                                CellConfigAttributes.GRID_LINE_COLOR,
                                displayMode,
                                label),
                        engine,
                        null);
            } else if (NatTableCSSConstants.GRID_LINE_WIDTH.equalsIgnoreCase(property)) {
                Integer width = natTable.getConfigRegistry().getConfigAttribute(
                        CellConfigAttributes.GRID_LINE_WIDTH,
                        displayMode,
                        label);
                if (width == null) {
                    return "0";
                } else {
                    return width.toString();
                }
            } else if (NatTableCSSConstants.RENDER_GRID_LINES.equalsIgnoreCase(property)) {
                Boolean render = natTable.getConfigRegistry().getConfigAttribute(
                        CellConfigAttributes.RENDER_GRID_LINES,
                        displayMode,
                        label);
                if (render == null) {
                    return Boolean.TRUE.toString();
                } else {
                    return render.toString();
                }
            } else if (NatTableCSSConstants.CONVERSION_ERROR_FONT.equalsIgnoreCase(property)) {
                IStyle style = natTable.getConfigRegistry().getConfigAttribute(
                        EditConfigAttributes.CONVERSION_ERROR_STYLE,
                        displayMode,
                        label);
                Font font = style.getAttributeValue(CellStyleAttributes.FONT);
                return CSSSWTFontHelper.getFontComposite(font);
            } else if (NatTableCSSConstants.CONVERSION_ERROR_FONT_FAMILY.equalsIgnoreCase(property)) {
                IStyle style = natTable.getConfigRegistry().getConfigAttribute(
                        EditConfigAttributes.CONVERSION_ERROR_STYLE,
                        displayMode,
                        label);
                Font font = style.getAttributeValue(CellStyleAttributes.FONT);
                return CSSSWTFontHelper.getFontFamily(font);
            } else if (NatTableCSSConstants.CONVERSION_ERROR_FONT_SIZE.equalsIgnoreCase(property)) {
                IStyle style = natTable.getConfigRegistry().getConfigAttribute(
                        EditConfigAttributes.CONVERSION_ERROR_STYLE,
                        displayMode,
                        label);
                Font font = style.getAttributeValue(CellStyleAttributes.FONT);
                return CSSSWTFontHelper.getFontSize(font);
            } else if (NatTableCSSConstants.CONVERSION_ERROR_FONT_STYLE.equalsIgnoreCase(property)) {
                IStyle style = natTable.getConfigRegistry().getConfigAttribute(
                        EditConfigAttributes.CONVERSION_ERROR_STYLE,
                        displayMode,
                        label);
                Font font = style.getAttributeValue(CellStyleAttributes.FONT);
                return CSSSWTFontHelper.getFontStyle(font);
            } else if (NatTableCSSConstants.CONVERSION_ERROR_FONT_WEIGHT.equalsIgnoreCase(property)) {
                IStyle style = natTable.getConfigRegistry().getConfigAttribute(
                        EditConfigAttributes.CONVERSION_ERROR_STYLE,
                        displayMode,
                        label);
                Font font = style.getAttributeValue(CellStyleAttributes.FONT);
                return CSSSWTFontHelper.getFontWeight(font);
            } else if (NatTableCSSConstants.CONVERSION_ERROR_BACKGROUND_COLOR.equalsIgnoreCase(property)) {
                ICSSValueConverter cssValueConverter = engine.getCSSValueConverter(String.class);
                IStyle style = natTable.getConfigRegistry().getConfigAttribute(
                        EditConfigAttributes.CONVERSION_ERROR_STYLE,
                        displayMode,
                        label);
                return cssValueConverter.convert(
                        style.getAttributeValue(CellStyleAttributes.BACKGROUND_COLOR),
                        engine,
                        null);
            } else if (NatTableCSSConstants.CONVERSION_ERROR_FOREGROUND_COLOR.equalsIgnoreCase(property)) {
                ICSSValueConverter cssValueConverter = engine.getCSSValueConverter(String.class);
                IStyle style = natTable.getConfigRegistry().getConfigAttribute(
                        EditConfigAttributes.CONVERSION_ERROR_STYLE,
                        displayMode,
                        label);
                return cssValueConverter.convert(
                        style.getAttributeValue(CellStyleAttributes.FOREGROUND_COLOR),
                        engine,
                        null);
            } else if (NatTableCSSConstants.VALIDATION_ERROR_FONT.equalsIgnoreCase(property)) {
                IStyle style = natTable.getConfigRegistry().getConfigAttribute(
                        EditConfigAttributes.VALIDATION_ERROR_STYLE,
                        displayMode,
                        label);
                Font font = style.getAttributeValue(CellStyleAttributes.FONT);
                return CSSSWTFontHelper.getFontComposite(font);
            } else if (NatTableCSSConstants.VALIDATION_ERROR_FONT_FAMILY.equalsIgnoreCase(property)) {
                IStyle style = natTable.getConfigRegistry().getConfigAttribute(
                        EditConfigAttributes.VALIDATION_ERROR_STYLE,
                        displayMode,
                        label);
                Font font = style.getAttributeValue(CellStyleAttributes.FONT);
                return CSSSWTFontHelper.getFontFamily(font);
            } else if (NatTableCSSConstants.VALIDATION_ERROR_FONT_SIZE.equalsIgnoreCase(property)) {
                IStyle style = natTable.getConfigRegistry().getConfigAttribute(
                        EditConfigAttributes.VALIDATION_ERROR_STYLE,
                        displayMode,
                        label);
                Font font = style.getAttributeValue(CellStyleAttributes.FONT);
                return CSSSWTFontHelper.getFontSize(font);
            } else if (NatTableCSSConstants.VALIDATION_ERROR_FONT_STYLE.equalsIgnoreCase(property)) {
                IStyle style = natTable.getConfigRegistry().getConfigAttribute(
                        EditConfigAttributes.VALIDATION_ERROR_STYLE,
                        displayMode,
                        label);
                Font font = style.getAttributeValue(CellStyleAttributes.FONT);
                return CSSSWTFontHelper.getFontStyle(font);
            } else if (NatTableCSSConstants.VALIDATION_ERROR_FONT_WEIGHT.equalsIgnoreCase(property)) {
                IStyle style = natTable.getConfigRegistry().getConfigAttribute(
                        EditConfigAttributes.VALIDATION_ERROR_STYLE,
                        displayMode,
                        label);
                Font font = style.getAttributeValue(CellStyleAttributes.FONT);
                return CSSSWTFontHelper.getFontWeight(font);
            } else if (NatTableCSSConstants.VALIDATION_ERROR_BACKGROUND_COLOR.equalsIgnoreCase(property)) {
                ICSSValueConverter cssValueConverter = engine.getCSSValueConverter(String.class);
                IStyle style = natTable.getConfigRegistry().getConfigAttribute(
                        EditConfigAttributes.VALIDATION_ERROR_STYLE,
                        displayMode,
                        label);
                return cssValueConverter.convert(
                        style.getAttributeValue(CellStyleAttributes.BACKGROUND_COLOR),
                        engine,
                        null);
            } else if (NatTableCSSConstants.VALIDATION_ERROR_FOREGROUND_COLOR.equalsIgnoreCase(property)) {
                ICSSValueConverter cssValueConverter = engine.getCSSValueConverter(String.class);
                IStyle style = natTable.getConfigRegistry().getConfigAttribute(
                        EditConfigAttributes.VALIDATION_ERROR_STYLE,
                        displayMode,
                        label);
                return cssValueConverter.convert(
                        style.getAttributeValue(CellStyleAttributes.FOREGROUND_COLOR),
                        engine,
                        null);
            } else if (NatTableCSSConstants.WORD_WRAP.equalsIgnoreCase(property)) {
                Boolean wrap = Boolean.FALSE;

                ICellPainter painter = natTable.getConfigRegistry().getConfigAttribute(
                        CellConfigAttributes.CELL_PAINTER,
                        displayMode,
                        label);
                if (painter != null) {
                    while (painter instanceof CellPainterWrapper) {
                        painter = ((CellPainterWrapper) painter).getWrappedPainter();
                    }
                }

                if (painter instanceof AbstractTextPainter) {
                    wrap = ((AbstractTextPainter) painter).isWordWrapping();
                }

                return wrap.toString();
            } else if (NatTableCSSConstants.TEXT_WRAP.equalsIgnoreCase(property)) {
                Boolean wrap = Boolean.FALSE;

                ICellPainter painter = natTable.getConfigRegistry().getConfigAttribute(
                        CellConfigAttributes.CELL_PAINTER,
                        displayMode,
                        label);
                if (painter != null) {
                    while (painter instanceof CellPainterWrapper) {
                        painter = ((CellPainterWrapper) painter).getWrappedPainter();
                    }
                }

                if (painter instanceof AbstractTextPainter) {
                    wrap = ((AbstractTextPainter) painter).isWrapText();
                }

                return wrap.toString();
            } else if (NatTableCSSConstants.TEXT_TRIM.equalsIgnoreCase(property)) {
                Boolean trim = Boolean.FALSE;

                ICellPainter painter = natTable.getConfigRegistry().getConfigAttribute(
                        CellConfigAttributes.CELL_PAINTER,
                        displayMode,
                        label);
                if (painter != null) {
                    while (painter instanceof CellPainterWrapper) {
                        painter = ((CellPainterWrapper) painter).getWrappedPainter();
                    }
                }

                if (painter instanceof AbstractTextPainter) {
                    trim = ((AbstractTextPainter) painter).isTrimText();
                }

                return trim.toString();
            } else if (NatTableCSSConstants.LINE_SPACING.equalsIgnoreCase(property)) {
                int spacing = 0;

                ICellPainter painter = natTable.getConfigRegistry().getConfigAttribute(
                        CellConfigAttributes.CELL_PAINTER,
                        displayMode,
                        label);
                if (painter != null) {
                    while (painter instanceof CellPainterWrapper) {
                        painter = ((CellPainterWrapper) painter).getWrappedPainter();
                    }
                }

                if (painter instanceof AbstractTextPainter) {
                    spacing = ((AbstractTextPainter) painter).getLineSpacing();
                }

                return "" + spacing;
            } else if (NatTableCSSConstants.TEXT_DIRECTION.equalsIgnoreCase(property)) {
                String direction = "horizontal";

                ICellPainter painter = natTable.getConfigRegistry().getConfigAttribute(
                        CellConfigAttributes.CELL_PAINTER,
                        displayMode,
                        label);
                if (painter != null) {
                    while (painter instanceof CellPainterWrapper) {
                        painter = ((CellPainterWrapper) painter).getWrappedPainter();
                    }
                }

                if (painter instanceof VerticalTextPainter) {
                    direction = "vertical";
                }

                return direction;
            } else if (NatTableCSSConstants.COLUMN_WIDTH.equalsIgnoreCase(property)) {
                // return a value that would not trigger any action for resizing
                // inherit is not supported here
                return "default";
            } else if (NatTableCSSConstants.ROW_HEIGHT.equalsIgnoreCase(property)) {
                // return a value that would not trigger any action for resizing
                // inherit is not supported here
                return "default";
            } else if (NatTableCSSConstants.PADDING.equalsIgnoreCase(property)) {
                ICellPainter painter = natTable.getConfigRegistry().getConfigAttribute(
                        CellConfigAttributes.CELL_PAINTER,
                        displayMode,
                        label);
                if (painter != null) {
                    while (painter instanceof CellPainterWrapper) {
                        painter = ((CellPainterWrapper) painter).getWrappedPainter();
                        if (painter instanceof PaddingDecorator) {
                            PaddingDecorator decorator = (PaddingDecorator) painter;
                            return new StringBuilder()
                                    .append(decorator.getTopPadding())
                                    .append(" ")
                                    .append(decorator.getRightPadding())
                                    .append(" ")
                                    .append(decorator.getBottomPadding())
                                    .append(" ")
                                    .append(decorator.getLeftPadding())
                                    .toString();
                        }
                    }
                }

            } else if (NatTableCSSConstants.PADDING_TOP.equalsIgnoreCase(property)) {
                ICellPainter painter = natTable.getConfigRegistry().getConfigAttribute(
                        CellConfigAttributes.CELL_PAINTER,
                        displayMode,
                        label);
                if (painter != null) {
                    while (painter instanceof CellPainterWrapper) {
                        painter = ((CellPainterWrapper) painter).getWrappedPainter();
                        if (painter instanceof PaddingDecorator) {
                            return "" + ((PaddingDecorator) painter).getTopPadding();
                        }
                    }
                }
                return "0";
            } else if (NatTableCSSConstants.PADDING_RIGHT.equalsIgnoreCase(property)) {
                ICellPainter painter = natTable.getConfigRegistry().getConfigAttribute(
                        CellConfigAttributes.CELL_PAINTER,
                        displayMode,
                        label);
                if (painter != null) {
                    while (painter instanceof CellPainterWrapper) {
                        painter = ((CellPainterWrapper) painter).getWrappedPainter();
                        if (painter instanceof PaddingDecorator) {
                            return "" + ((PaddingDecorator) painter).getRightPadding();
                        }
                    }
                }
                return "0";
            } else if (NatTableCSSConstants.PADDING_BOTTOM.equalsIgnoreCase(property)) {
                ICellPainter painter = natTable.getConfigRegistry().getConfigAttribute(
                        CellConfigAttributes.CELL_PAINTER,
                        displayMode,
                        label);
                if (painter != null) {
                    while (painter instanceof CellPainterWrapper) {
                        painter = ((CellPainterWrapper) painter).getWrappedPainter();
                        if (painter instanceof PaddingDecorator) {
                            return "" + ((PaddingDecorator) painter).getBottomPadding();
                        }
                    }
                }
                return "0";
            } else if (NatTableCSSConstants.PADDING_LEFT.equalsIgnoreCase(property)) {
                ICellPainter painter = natTable.getConfigRegistry().getConfigAttribute(
                        CellConfigAttributes.CELL_PAINTER,
                        displayMode,
                        label);
                if (painter != null) {
                    while (painter instanceof CellPainterWrapper) {
                        painter = ((CellPainterWrapper) painter).getWrappedPainter();
                        if (painter instanceof PaddingDecorator) {
                            return "" + ((PaddingDecorator) painter).getLeftPadding();
                        }
                    }
                }
                return "0";
            } else if (NatTableCSSConstants.TABLE_BORDER_COLOR.equalsIgnoreCase(property)) {
                for (Iterator<IOverlayPainter> it = natTable.getOverlayPainters().iterator(); it.hasNext();) {
                    IOverlayPainter painter = it.next();
                    if (painter instanceof NatTableBorderOverlayPainter) {
                        return engine.getCSSValueConverter(String.class).convert(
                                ((NatTableBorderOverlayPainter) painter).getBorderColor(),
                                engine,
                                null);
                    }
                }
            } else if (NatTableCSSConstants.FILL_HANDLE_BORDER.equalsIgnoreCase(property)) {
                BorderStyle border = NatTableCSSHelper.getNatTableStyle(
                        natTable,
                        FillHandleConfigAttributes.FILL_HANDLE_BORDER_STYLE,
                        displayMode,
                        label);

                ICSSValueConverter cssValueConverter = engine.getCSSValueConverter(String.class);
                return border.getThickness() + " "
                        + border.getLineStyle().toString().toLowerCase()
                        + " " + border.getBorderMode().toString().toLowerCase()
                        + " " + cssValueConverter.convert(
                                border.getColor(),
                                engine,
                                null);
            } else if (NatTableCSSConstants.FILL_HANDLE_COLOR.equalsIgnoreCase(property)) {
                ICSSValueConverter cssValueConverter = engine.getCSSValueConverter(String.class);
                return cssValueConverter.convert(
                        natTable.getConfigRegistry().getConfigAttribute(
                                FillHandleConfigAttributes.FILL_HANDLE_COLOR,
                                displayMode,
                                label),
                        engine,
                        null);
            } else if (NatTableCSSConstants.FILL_REGION_BORDER.equalsIgnoreCase(property)) {
                BorderStyle border = NatTableCSSHelper.getNatTableStyle(
                        natTable,
                        FillHandleConfigAttributes.FILL_HANDLE_REGION_BORDER_STYLE,
                        displayMode,
                        label);

                ICSSValueConverter cssValueConverter = engine.getCSSValueConverter(String.class);
                return border.getThickness() + " "
                        + border.getLineStyle().toString().toLowerCase()
                        + " " + border.getBorderMode().toString().toLowerCase()
                        + " " + cssValueConverter.convert(
                                border.getColor(),
                                engine,
                                null);
            } else if (NatTableCSSConstants.INVERT_ICONS.equalsIgnoreCase(property)) {
                // that information is hidden in specific painters and we are
                // not able to determine it easily here
                return Boolean.FALSE.toString();
            } else if (NatTableCSSConstants.DECORATION.equalsIgnoreCase(property)) {
                // TODO : manage path of Image.
                return "none";
            } else if (NatTableCSSConstants.PERCENTAGE_DECORATOR_COLORS.equalsIgnoreCase(property)) {
                IStyle style = natTable.getConfigRegistry().getConfigAttribute(
                        CellConfigAttributes.CELL_STYLE,
                        displayMode,
                        label);

                Color c1 = style.getAttributeValue(PercentageBarDecorator.PERCENTAGE_BAR_COMPLETE_REGION_START_COLOR);
                Color c2 = style.getAttributeValue(PercentageBarDecorator.PERCENTAGE_BAR_COMPLETE_REGION_END_COLOR);
                Color c3 = style.getAttributeValue(PercentageBarDecorator.PERCENTAGE_BAR_INCOMPLETE_REGION_COLOR);

                ICSSValueConverter cssValueConverter = engine.getCSSValueConverter(String.class);
                return cssValueConverter.convert(c1, engine, null) + " "
                        + cssValueConverter.convert(c2, engine, null) + " "
                        + cssValueConverter.convert(c3, engine, null);
            } else if (NatTableCSSConstants.CONVERTER.equalsIgnoreCase(property)) {
                IDisplayConverter converter = natTable.getConfigRegistry().getConfigAttribute(
                        CellConfigAttributes.DISPLAY_CONVERTER,
                        displayMode,
                        label);
                return NatTableCSSHelper.getDisplayConverterString(converter);
            } else if (NatTableCSSConstants.HIDE_INDICATOR_COLOR.equalsIgnoreCase(property)) {
                ICSSValueConverter cssValueConverter = engine.getCSSValueConverter(String.class);
                return cssValueConverter.convert(
                        natTable.getConfigRegistry().getConfigAttribute(
                                HideIndicatorConfigAttributes.HIDE_INDICATOR_COLOR,
                                displayMode,
                                label),
                        engine,
                        null);
            } else if (NatTableCSSConstants.HIDE_INDICATOR_WIDTH.equalsIgnoreCase(property)) {
                Integer width = natTable.getConfigRegistry().getConfigAttribute(
                        HideIndicatorConfigAttributes.HIDE_INDICATOR_LINE_WIDTH,
                        displayMode,
                        label);
                if (width == null) {
                    return "0";
                } else {
                    return width.toString();
                }
            }
        }
        return null;
    }

    @Override
    public void onAllCSSPropertiesApplyed(Object element, CSSEngine engine, String pseudo) throws Exception {
        Object control = null;

        if (element instanceof CSSStylableElement) {
            CSSStylableElement elt = (CSSStylableElement) element;
            control = elt.getNativeWidget();
        }

        NatTable natTable = null;
        String label = null;

        CSSElementContext context = null;
        CSSElementContext natTableContext = null;

        if (control instanceof NatTable) {
            natTable = (NatTable) control;
        } else if (control instanceof NatTableWrapper) {
            natTable = ((NatTableWrapper) control).getNatTable();
            label = ((NatTableWrapper) control).getLabel();
            natTableContext = engine.getCSSElementContext(natTable);
        }

        if (natTable != null) {
            context = engine.getCSSElementContext(control);
            String displayMode = NatTableCSSHelper.getDisplayMode(pseudo);

            CSS2FontProperties fontProperties =
                    (CSS2FontProperties) NatTableCSSHelper.getContextValue(
                            context,
                            displayMode,
                            CSS2FontPropertiesHelpers.CSS2FONT_KEY);
            if (fontProperties != null) {
                // if there are font properties, register the font
                // check if there is a font registered in the hierarchy
                Font font = NatTableCSSHelper.getNatTableStyle(natTable, CellStyleAttributes.FONT, displayMode, label);

                if (font == null) {
                    // if there are no font properties already and no font, use
                    // the default font
                    font = GUIHelper.DEFAULT_FONT;
                }

                FontData fontData = CSSSWTFontHelper.getFontData(
                        fontProperties,
                        CSSSWTFontHelper.getFirstFontData(font));
                NatTableCSSHelper.applyNatTableStyle(
                        natTable,
                        CellStyleAttributes.FONT,
                        GUIHelper.getFont(fontData),
                        displayMode,
                        label);
            }

            BorderStyle borderStyle =
                    (BorderStyle) NatTableCSSHelper.getContextValue(
                            context,
                            displayMode,
                            NatTableCSSConstants.CV_BORDER_CONFIGURATION);
            if (borderStyle != null) {
                NatTableCSSHelper.applyNatTableStyle(
                        natTable,
                        CellStyleAttributes.BORDER_STYLE,
                        borderStyle,
                        displayMode,
                        label);
            }

            CSS2FontProperties conversionErrorFontProperties =
                    (CSS2FontProperties) NatTableCSSHelper.getContextValue(
                            context,
                            displayMode,
                            NatTableCSSConstants.CV_CONVERSION_ERROR_FONT_PROPERTIES);
            if (conversionErrorFontProperties != null) {
                // if there are font properties, register the font
                FontData fontData = CSSSWTFontHelper.getFontData(
                        conversionErrorFontProperties,
                        CSSSWTFontHelper.getFirstFontData(GUIHelper.DEFAULT_FONT));
                NatTableCSSHelper.applyNatTableStyle(
                        natTable,
                        EditConfigAttributes.CONVERSION_ERROR_STYLE,
                        CellStyleAttributes.FONT,
                        GUIHelper.getFont(fontData),
                        displayMode,
                        label);
            }

            CSS2FontProperties validationErrorFontProperties =
                    (CSS2FontProperties) NatTableCSSHelper.getContextValue(
                            context,
                            displayMode,
                            NatTableCSSConstants.CV_VALIDATION_ERROR_FONT_PROPERTIES);
            if (validationErrorFontProperties != null) {
                // if there are font properties, register the font
                FontData fontData = CSSSWTFontHelper.getFontData(
                        validationErrorFontProperties,
                        CSSSWTFontHelper.getFirstFontData(GUIHelper.DEFAULT_FONT));
                NatTableCSSHelper.applyNatTableStyle(
                        natTable,
                        EditConfigAttributes.VALIDATION_ERROR_STYLE,
                        CellStyleAttributes.FONT,
                        GUIHelper.getFont(fontData),
                        displayMode,
                        label);
            }

            Object pv = NatTableCSSHelper.getContextValue(context, displayMode, NatTableCSSConstants.PAINTER);
            if (pv instanceof List<?>) {
                @SuppressWarnings("unchecked")
                List<String> painterValues = (List<String>) pv;

                Map<String, Object> painterProperties =
                        NatTableCSSHelper.getPainterPropertiesInherited(context, natTableContext, displayMode);

                ICellPainter painter = CellPainterFactory.getInstance().getCellPainter(painterValues, painterProperties);

                if (painter != null) {
                    natTable.getConfigRegistry().registerConfigAttribute(
                            CellConfigAttributes.CELL_PAINTER,
                            painter,
                            displayMode,
                            label);
                }
            } else if (NatTableCSSHelper.resolvePainter(context, natTableContext, displayMode)) {
                String backgroundKey = (String) NatTableCSSHelper.getContextValueInherited(
                        context,
                        natTableContext,
                        displayMode,
                        NatTableCSSConstants.CV_BACKGROUND_PAINTER);
                List<String> decoratorKeys = NatTableCSSHelper.getDecoratorPainter(context, displayMode);
                String contentKey = (String) NatTableCSSHelper.getContextValue(
                        context,
                        displayMode,
                        NatTableCSSConstants.CV_CONTENT_PAINTER);
                Map<String, Object> painterProperties =
                        NatTableCSSHelper.getPainterPropertiesInherited(context, natTableContext, displayMode);

                if ((painterProperties.containsKey(NatTableCSSConstants.PADDING_TOP)
                        || painterProperties.containsKey(NatTableCSSConstants.PADDING_LEFT)
                        || painterProperties.containsKey(NatTableCSSConstants.PADDING_BOTTOM)
                        || painterProperties.containsKey(NatTableCSSConstants.PADDING_RIGHT))
                        && !decoratorKeys.contains(CellPainterFactory.PADDING_DECORATOR_KEY)) {
                    decoratorKeys.add(0, CellPainterFactory.PADDING_DECORATOR_KEY);
                }

                if (borderStyle != null && !decoratorKeys.contains(CellPainterFactory.LINE_BORDER_DECORATOR_KEY)) {
                    decoratorKeys.add(0, CellPainterFactory.LINE_BORDER_DECORATOR_KEY);
                }

                ICellPainter painter = CellPainterFactory.getInstance().getCellPainter(
                        backgroundKey,
                        decoratorKeys,
                        contentKey,
                        painterProperties);

                if (painter != null) {
                    natTable.getConfigRegistry().registerConfigAttribute(
                            CellConfigAttributes.CELL_PAINTER,
                            painter,
                            displayMode,
                            label);
                }
            }
        }
    }
}
