Started implementation of label based CSS style registration

Change-Id: Iba2bbf6ce87316139826497cb40436b816551c47
Signed-off-by: Dirk Fauth <dirk.fauth@googlemail.com>
diff --git a/org.eclipse.nebula.widgets.nattable.extension.e4/META-INF/MANIFEST.MF b/org.eclipse.nebula.widgets.nattable.extension.e4/META-INF/MANIFEST.MF
index 9d7beb6..58ee93b 100644
--- a/org.eclipse.nebula.widgets.nattable.extension.e4/META-INF/MANIFEST.MF
+++ b/org.eclipse.nebula.widgets.nattable.extension.e4/META-INF/MANIFEST.MF
@@ -1,6 +1,14 @@
 Manifest-Version: 1.0
 Bundle-ManifestVersion: 2
 Bundle-Name: NatTable extension for Eclipse 4
-Bundle-SymbolicName: org.eclipse.nebula.widgets.nattable.extension.e4
+Bundle-SymbolicName: org.eclipse.nebula.widgets.nattable.extension.e4;singleton:=true
 Bundle-Version: 1.0.0.qualifier
 Bundle-RequiredExecutionEnvironment: JavaSE-1.6
+Require-Bundle: org.eclipse.swt;bundle-version="3.103.0",
+ org.eclipse.e4.ui.css.core;bundle-version="0.10.100",
+ org.eclipse.e4.ui.css.swt;bundle-version="0.11.101",
+ org.w3c.css.sac;bundle-version="1.3.1"
+Import-Package: org.eclipse.nebula.widgets.nattable;version="1.3.0",
+ org.eclipse.nebula.widgets.nattable.config;version="1.4.0",
+ org.eclipse.nebula.widgets.nattable.style;version="1.4.0"
+Bundle-ActivationPolicy: lazy
diff --git a/org.eclipse.nebula.widgets.nattable.extension.e4/build.properties b/org.eclipse.nebula.widgets.nattable.extension.e4/build.properties
index 34d2e4d..e9863e2 100644
--- a/org.eclipse.nebula.widgets.nattable.extension.e4/build.properties
+++ b/org.eclipse.nebula.widgets.nattable.extension.e4/build.properties
@@ -1,4 +1,5 @@
 source.. = src/
 output.. = bin/
 bin.includes = META-INF/,\
-               .
+               .,\
+               plugin.xml
diff --git a/org.eclipse.nebula.widgets.nattable.extension.e4/plugin.xml b/org.eclipse.nebula.widgets.nattable.extension.e4/plugin.xml
new file mode 100644
index 0000000..679613c
--- /dev/null
+++ b/org.eclipse.nebula.widgets.nattable.extension.e4/plugin.xml
@@ -0,0 +1,59 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?eclipse version="3.4"?>
+<plugin>
+   <extension
+         point="org.eclipse.e4.ui.css.core.propertyHandler">
+      <handler
+            adapter="org.eclipse.nebula.widgets.nattable.extension.e4.NatTableElementAdapter"
+            handler="org.eclipse.nebula.widgets.nattable.extension.e4.NatTableCSSHandler">
+         <property-name
+               name="background-color">
+         </property-name>
+         <property-name
+               name="cell-background-color">
+         </property-name>
+         <property-name
+               name="color">
+         </property-name>
+         <property-name
+               name="horizontal-align">
+         </property-name>
+         <property-name
+               name="vertical-align">
+         </property-name>
+         <property-name
+               name="font">
+         </property-name>
+         <property-name
+               name="image">
+         </property-name>
+         <property-name
+               name="border">
+         </property-name>
+         <property-name
+               name="password-echo-char">
+         </property-name>
+         <property-name
+               name="text-decoration">
+         </property-name>
+      </handler>
+   </extension>
+   <extension
+         point="org.eclipse.e4.ui.css.core.elementProvider">
+      <provider
+            class="org.eclipse.nebula.widgets.nattable.extension.e4.NatTableElementProvider">
+         <widget
+               class="org.eclipse.nebula.widgets.nattable.NatTable"></widget>
+      </provider>
+   </extension>
+   <extension
+         point="org.eclipse.e4.ui.css.core.elementProvider">
+      <provider
+            class="org.eclipse.nebula.widgets.nattable.extension.e4.NatTableElementProvider">
+         <widget
+               class="org.eclipse.nebula.widgets.nattable.extension.e4.NatTableWrapper">
+         </widget>
+      </provider>
+   </extension>
+
+</plugin>
diff --git a/org.eclipse.nebula.widgets.nattable.extension.e4/src/org/eclipse/nebula/widgets/nattable/extension/e4/NatTableCSSEngineImpl.java b/org.eclipse.nebula.widgets.nattable.extension.e4/src/org/eclipse/nebula/widgets/nattable/extension/e4/NatTableCSSEngineImpl.java
new file mode 100644
index 0000000..12e893d
--- /dev/null
+++ b/org.eclipse.nebula.widgets.nattable.extension.e4/src/org/eclipse/nebula/widgets/nattable/extension/e4/NatTableCSSEngineImpl.java
@@ -0,0 +1,114 @@
+package org.eclipse.nebula.widgets.nattable.extension.e4;
+
+import org.eclipse.e4.ui.css.core.dom.ChildVisibilityAwareElement;
+import org.eclipse.e4.ui.css.core.dom.ExtendedCSSRule;
+import org.eclipse.e4.ui.css.swt.engine.CSSSWTEngineImpl;
+import org.eclipse.swt.widgets.Display;
+import org.w3c.dom.Element;
+import org.w3c.dom.NodeList;
+import org.w3c.dom.css.CSSRule;
+import org.w3c.dom.css.CSSStyleDeclaration;
+
+//TODO I think this can be removed after the child stuff works
+
+@SuppressWarnings("restriction")
+public class NatTableCSSEngineImpl extends CSSSWTEngineImpl {
+
+    public NatTableCSSEngineImpl(Display display) {
+        super(display);
+    }
+
+    public NatTableCSSEngineImpl(Display display, boolean lazyApplyingStyles) {
+        super(display, lazyApplyingStyles);
+    }
+
+    @Override
+    public void applyStyles(Object element, boolean applyStylesToChildNodes,
+            boolean computeDefaultStyle) {
+        Element elt = getElement(element);
+        if (elt != null) {
+            if (!isVisible(elt)) {
+                return;
+            }
+
+            /*
+             * Compute new Style to apply.
+             */
+            // TODO custom viewCSS
+            CSSStyleDeclaration style = null;// viewCSS.getComputedStyle(elt,
+                                             // null);
+            if (computeDefaultStyle) {
+                if (applyStylesToChildNodes) {
+                    this.computeDefaultStyle = computeDefaultStyle;
+                }
+                /*
+                 * Apply default style.
+                 */
+                applyDefaultStyleDeclaration(element, false, style, null);
+            }
+
+            /*
+             * Manage static pseudo instances
+             */
+            String[] pseudoInstances = getStaticPseudoInstances(elt);
+            if (pseudoInstances != null) {
+                // there are static pseudo instances definied, loop for it and
+                // apply styles for each pseudo instance.
+                for (String pseudoInstance : pseudoInstances) {
+                    // TODO custom viewCSS
+                    CSSStyleDeclaration styleWithPseudoInstance = null;// viewCSS.getComputedStyle(elt,
+                                                                       // pseudoInstance);
+                    if (computeDefaultStyle) {
+                        /*
+                         * Apply default style for the current pseudo instance.
+                         */
+                        applyDefaultStyleDeclaration(element, false,
+                                styleWithPseudoInstance, pseudoInstance);
+                    }
+
+                    if (styleWithPseudoInstance != null) {
+                        CSSRule parentRule = styleWithPseudoInstance.getParentRule();
+                        if (parentRule instanceof ExtendedCSSRule) {
+                            // TODO inspect and handle pseudo
+                            // applyConditionalPseudoStyle((ExtendedCSSRule)
+                            // parentRule, pseudoInstance, element,
+                            // styleWithPseudoInstance);
+                        } else {
+                            // applyStyleDeclaration(element,
+                            // styleWithPseudoInstance,
+                            // pseudoInstance);
+                            applyStyleDeclaration(elt, styleWithPseudoInstance, pseudoInstance);
+                        }
+                    }
+                }
+            }
+
+            if (style != null) {
+                // applyStyleDeclaration(element, style, null);
+                applyStyleDeclaration(elt, style, null);
+            }
+            try {
+                // Apply inline style
+                applyInlineStyle(elt, false);
+            } catch (Exception e) {
+                handleExceptions(e);
+            }
+
+            if (applyStylesToChildNodes) {
+                /*
+                 * Style all children recursive.
+                 */
+                NodeList nodes = elt instanceof ChildVisibilityAwareElement ? ((ChildVisibilityAwareElement) elt)
+                        .getVisibleChildNodes() : elt.getChildNodes();
+                if (nodes != null) {
+                    for (int k = 0; k < nodes.getLength(); k++) {
+                        applyStyles(nodes.item(k), applyStylesToChildNodes);
+                    }
+                    onStylesAppliedToChildNodes(elt, nodes);
+                }
+            }
+        }
+
+    }
+
+}
diff --git a/org.eclipse.nebula.widgets.nattable.extension.e4/src/org/eclipse/nebula/widgets/nattable/extension/e4/NatTableCSSHandler.java b/org.eclipse.nebula.widgets.nattable.extension.e4/src/org/eclipse/nebula/widgets/nattable/extension/e4/NatTableCSSHandler.java
new file mode 100644
index 0000000..b0f4d02
--- /dev/null
+++ b/org.eclipse.nebula.widgets.nattable.extension.e4/src/org/eclipse/nebula/widgets/nattable/extension/e4/NatTableCSSHandler.java
@@ -0,0 +1,261 @@
+/*****************************************************************************
+ * Copyright (c) 2015 CEA LIST.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *		Dirk Fauth <dirk.fauth@googlemail.com> - Initial API and implementation
+ *
+ *****************************************************************************/
+package org.eclipse.nebula.widgets.nattable.extension.e4;
+
+import java.util.List;
+
+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.engine.CSSEngine;
+import org.eclipse.e4.ui.css.swt.properties.AbstractCSSPropertySWTHandler;
+import org.eclipse.nebula.widgets.nattable.NatTable;
+import org.eclipse.nebula.widgets.nattable.config.CellConfigAttributes;
+import org.eclipse.nebula.widgets.nattable.config.IConfigRegistry;
+import org.eclipse.nebula.widgets.nattable.style.CellStyleAttributes;
+import org.eclipse.nebula.widgets.nattable.style.CellStyleProxy;
+import org.eclipse.nebula.widgets.nattable.style.ConfigAttribute;
+import org.eclipse.nebula.widgets.nattable.style.DisplayMode;
+import org.eclipse.nebula.widgets.nattable.style.IStyle;
+import org.eclipse.nebula.widgets.nattable.style.Style;
+import org.eclipse.swt.graphics.Color;
+import org.eclipse.swt.widgets.Control;
+import org.w3c.dom.css.CSSValue;
+
+@SuppressWarnings("restriction")
+public class NatTableCSSHandler extends AbstractCSSPropertySWTHandler implements ICSSPropertyHandler2 {
+
+    /**
+     * CSS property for the NatTable background color. This has effect on the
+     * area that does not show cells.
+     */
+    public static final String BACKGROUND_COLOR = "background-color";
+
+    /**
+     * CSS property for {@link CellStyleAttributes#BACKGROUND_COLOR}.
+     */
+    public static final String CELL_BACKGROUND_COLOR = "cell-background-color";
+
+    /**
+     * CSS property for {@link CellStyleAttributes#FOREGROUND_COLOR}.
+     */
+    public static final String FOREGROUND_COLOR = "color";
+
+    // TODO instead of additional properties, distinguish via value
+    // http://www.vogella.com/tutorials/Eclipse4CSS/article.html#css_colors
+
+    /**
+     * CSS property for {@link CellStyleAttributes#GRADIENT_BACKGROUND_COLOR}.
+     * Triggers usage of the GradientBackgroundPainter.
+     */
+    public static final String GRADIENT_BACKGROUND_COLOR = "gradient-background-color";
+
+    /**
+     * CSS property for {@link CellStyleAttributes#GRADIENT_FOREGROUND_COLOR}.
+     * Triggers usage of the GradientBackgroundPainter.
+     */
+    public static final String GRADIENT__FOREGROUND_COLOR = "gradient-foreground-color";
+
+    /**
+     * CSS property for {@link CellStyleAttributes#HORIZONTAL_ALIGNMENT}.
+     */
+    public static final String HORIZONTAL_ALIGNMENT = "horizontal-align";
+
+    /**
+     * CSS property for {@link CellStyleAttributes#VERTICAL_ALIGNMENT}.
+     */
+    public static final String VERTICAL_ALIGNMENT = "vertical-align";
+
+    /**
+     * CSS property for {@link CellStyleAttributes#FONT}.
+     */
+    public static final String FONT = "font";
+
+    /**
+     * CSS property for {@link CellStyleAttributes#IMAGE}. Triggers the usage of
+     * the ImagePainter.
+     */
+    public static final String IMAGE = "image";
+
+    /**
+     * CSS property for {@link CellStyleAttributes#BORDER_STYLE}. Triggers the
+     * usage of the LineBorderDecorator.
+     */
+    public static final String BORDER = "border";
+
+    /**
+     * CSS property for {@link CellStyleAttributes#PASSWORD_ECHO_CHAR}. Triggers
+     * the usage of the PasswordTextPainter.
+     */
+    public static final String PASSWORD_ECHO_CHAR = "password-echo-char";
+
+    /**
+     * CSS property for {@link CellStyleAttributes#TEXT_DECORATION}.
+     * <p>
+     * Available values: none, underline, line-through
+     * </p>
+     * <p>
+     * Combinations are possible via space separated list.
+     * </p>
+     */
+    public static final String TEXT_DECORATION = "text-decoration";
+
+    // TODO add convenience for font attributes
+    // font-family, font-size, font-style, font-weight
+
+    // TODO add support for decorations
+    // image, side, padding
+
+    // TODO add support for border side definition via CustomLineBorderDecorator
+    // possibly extend CustomLineBorderDecorator to specify side at creation
+    // time (border-left, border-right ...)
+
+    // TODO add convenience for border attributes
+    // border-color, border-width, border-style
+
+    // TODO word wrapping
+
+    // TODO width/height calculation
+
+    // TODO padding
+
+    // TODO text direction
+
+    // TODO background image (on NatTable or cell)
+    // trigger BackgroundImagePainter (add separator color)
+    // public static final String BACKGROUND_IMAGE = "background-image";
+
+    @Override
+    protected void applyCSSProperty(Control control, String property, CSSValue value, String pseudo, CSSEngine engine)
+            throws Exception {
+
+        if (control instanceof NatTable) {
+            NatTable natTable = (NatTable) control;
+
+            // check property
+            if (BACKGROUND_COLOR.equalsIgnoreCase(property)
+                    && (value.getCssValueType() == CSSValue.CSS_PRIMITIVE_VALUE)) {
+                Color newColor = (Color) engine.convert(value, Color.class, control.getDisplay());
+                // apply style
+                natTable.setBackground(newColor);
+            } else if (CELL_BACKGROUND_COLOR.equalsIgnoreCase(property)
+                    && (value.getCssValueType() == CSSValue.CSS_PRIMITIVE_VALUE)) {
+                Color newColor = (Color) engine.convert(value, Color.class, control.getDisplay());
+                // apply style
+                applyNatTableStyle(
+                        natTable,
+                        CellStyleAttributes.BACKGROUND_COLOR,
+                        newColor,
+                        getDisplayMode(pseudo));
+            }
+
+        }
+    }
+
+    @Override
+    protected String retrieveCSSProperty(Control control, String property, String pseudo, CSSEngine engine)
+            throws Exception {
+
+        if (control instanceof NatTable) {
+            NatTable natTable = (NatTable) control;
+
+            // check property
+            if (BACKGROUND_COLOR.equalsIgnoreCase(property)) {
+                ICSSValueConverter cssValueConverter = engine.getCSSValueConverter(String.class);
+                return cssValueConverter.convert(
+                        natTable.getBackground(), engine, null);
+            } else if (CELL_BACKGROUND_COLOR.equalsIgnoreCase(property)) {
+                ICSSValueConverter cssValueConverter = engine.getCSSValueConverter(String.class);
+                return cssValueConverter.convert(
+                        getNatTableStyle(
+                                natTable,
+                                CellStyleAttributes.BACKGROUND_COLOR,
+                                getDisplayMode(pseudo)),
+                        engine,
+                        null);
+            }
+
+        }
+        return null;
+    }
+
+    protected <T> void applyNatTableStyle(
+            NatTable natTable,
+            ConfigAttribute<T> styleConfig,
+            T value,
+            String displayMode) {
+
+        IConfigRegistry configRegistry = natTable.getConfigRegistry();
+
+        // TODO retrieve labels from selector (pseudo?)
+        String[] configLabels = new String[0];
+
+        // retrieve the style object for the given selector
+        IStyle style = configRegistry.getConfigAttribute(
+                CellConfigAttributes.CELL_STYLE,
+                displayMode,
+                configLabels);
+
+        if (style == null) {
+            style = new Style();
+            if (configLabels != null && configLabels.length > 0) {
+                configRegistry.registerConfigAttribute(
+                        CellConfigAttributes.CELL_STYLE,
+                        style,
+                        displayMode,
+                        configLabels[0]);
+            } else {
+                configRegistry.registerConfigAttribute(
+                        CellConfigAttributes.CELL_STYLE,
+                        style,
+                        displayMode);
+            }
+        }
+
+        // set the value to the style object
+        style.setAttributeValue(
+                styleConfig,
+                value);
+    }
+
+    protected <T> T getNatTableStyle(NatTable natTable, ConfigAttribute<T> styleConfig, String displayMode) {
+        IConfigRegistry configRegistry = natTable.getConfigRegistry();
+
+        // TODO retrieve labels from selector (pseudo?)
+        List<String> configLabels = null;
+
+        IStyle style = new CellStyleProxy(configRegistry, displayMode, configLabels);
+
+        return style.getAttributeValue(styleConfig);
+    }
+
+    protected String getDisplayMode(String pseudo) {
+        if (pseudo != null) {
+            if ("select".equals(pseudo)) {
+                return DisplayMode.SELECT;
+            } else if ("edit".equals(pseudo)) {
+                return DisplayMode.EDIT;
+            } else if ("hover".equals(pseudo)) {
+                return DisplayMode.HOVER;
+            } else if ("select-hover".equals(pseudo)) {
+                return DisplayMode.SELECT_HOVER;
+            }
+        }
+        return DisplayMode.NORMAL;
+    }
+
+    @Override
+    public void onAllCSSPropertiesApplyed(Object element, CSSEngine engine) throws Exception {
+        // TODO build and apply painters
+
+    }
+}
diff --git a/org.eclipse.nebula.widgets.nattable.extension.e4/src/org/eclipse/nebula/widgets/nattable/extension/e4/NatTableElementAdapter.java b/org.eclipse.nebula.widgets.nattable.extension.e4/src/org/eclipse/nebula/widgets/nattable/extension/e4/NatTableElementAdapter.java
new file mode 100644
index 0000000..7fbe0cd
--- /dev/null
+++ b/org.eclipse.nebula.widgets.nattable.extension.e4/src/org/eclipse/nebula/widgets/nattable/extension/e4/NatTableElementAdapter.java
@@ -0,0 +1,82 @@
+/*****************************************************************************
+ * Copyright (c) 2015 CEA LIST.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *		Dirk Fauth <dirk.fauth@googlemail.com> - Initial API and implementation
+ *
+ *****************************************************************************/
+package org.eclipse.nebula.widgets.nattable.extension.e4;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.e4.ui.css.core.engine.CSSEngine;
+import org.eclipse.e4.ui.css.swt.dom.WidgetElement;
+import org.eclipse.nebula.widgets.nattable.NatTable;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.w3c.dom.Element;
+import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
+
+@SuppressWarnings("restriction")
+public class NatTableElementAdapter extends WidgetElement {
+
+    List<String> labels = new ArrayList<String>();
+
+    {
+        this.labels.add("COLUMN_HEADER");
+    }
+
+    public NatTableElementAdapter(NatTable natTable, CSSEngine engine) {
+        super(natTable, engine);
+
+        addStaticPseudoInstance("normal");
+        addStaticPseudoInstance("select");
+        addStaticPseudoInstance("edit");
+        addStaticPseudoInstance("hover");
+        addStaticPseudoInstance("select-hover");
+    }
+
+    // @Override
+    // public Node getParentNode() {
+    // return this;
+    // }
+
+    @Override
+    public Node getParentNode() {
+        Control control = getControl();
+        Composite parent = control.getParent();
+        if (parent != null) {
+            Element element = getElement(parent);
+            return element;
+        }
+        return null;
+    }
+
+    protected Control getControl() {
+        return (Control) getNativeWidget();
+    }
+
+    @Override
+    public NodeList getChildNodes() {
+        // only need to return a non-null value
+        // strange implementation
+        return this;
+    }
+
+    @Override
+    public int getLength() {
+        return this.labels.size();
+    }
+
+    @Override
+    public Node item(int index) {
+        return new NatTableWrapper((NatTable) getNativeWidget(), this.labels.get(index), this.engine, this);
+    }
+}
diff --git a/org.eclipse.nebula.widgets.nattable.extension.e4/src/org/eclipse/nebula/widgets/nattable/extension/e4/NatTableElementProvider.java b/org.eclipse.nebula.widgets.nattable.extension.e4/src/org/eclipse/nebula/widgets/nattable/extension/e4/NatTableElementProvider.java
new file mode 100644
index 0000000..1ce8ac2
--- /dev/null
+++ b/org.eclipse.nebula.widgets.nattable.extension.e4/src/org/eclipse/nebula/widgets/nattable/extension/e4/NatTableElementProvider.java
@@ -0,0 +1,33 @@
+/*****************************************************************************
+ * Copyright (c) 2015 CEA LIST.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *      Dirk Fauth <dirk.fauth@googlemail.com> - Initial API and implementation
+ *
+ *****************************************************************************/
+package org.eclipse.nebula.widgets.nattable.extension.e4;
+
+import org.eclipse.e4.ui.css.core.dom.IElementProvider;
+import org.eclipse.e4.ui.css.core.engine.CSSEngine;
+import org.eclipse.nebula.widgets.nattable.NatTable;
+import org.w3c.dom.Element;
+
+@SuppressWarnings("restriction")
+public class NatTableElementProvider implements IElementProvider {
+
+    @Override
+    public Element getElement(Object element, CSSEngine engine) {
+        if (element instanceof NatTable
+                || element instanceof NatTableWrapper) {
+            NatTable natTable = (NatTable) element;
+            return new NatTableElementAdapter(natTable, engine);
+        }
+        return null;
+    }
+
+}
diff --git a/org.eclipse.nebula.widgets.nattable.extension.e4/src/org/eclipse/nebula/widgets/nattable/extension/e4/NatTableWrapper.java b/org.eclipse.nebula.widgets.nattable.extension.e4/src/org/eclipse/nebula/widgets/nattable/extension/e4/NatTableWrapper.java
new file mode 100644
index 0000000..ddd8bc1
--- /dev/null
+++ b/org.eclipse.nebula.widgets.nattable.extension.e4/src/org/eclipse/nebula/widgets/nattable/extension/e4/NatTableWrapper.java
@@ -0,0 +1,37 @@
+package org.eclipse.nebula.widgets.nattable.extension.e4;
+
+import org.eclipse.e4.ui.css.core.engine.CSSEngine;
+import org.eclipse.nebula.widgets.nattable.NatTable;
+import org.w3c.dom.Node;
+
+public class NatTableWrapper extends NatTableElementAdapter {
+
+    public final NatTableElementAdapter parent;
+    public final String styleLabel;
+
+    public NatTableWrapper(NatTable natTable, String styleLabel, CSSEngine engine, NatTableElementAdapter parent) {
+        super(natTable, engine);
+
+        this.styleLabel = styleLabel;
+        this.parent = parent;
+    }
+
+    public String getStyleLabel() {
+        return this.styleLabel;
+    }
+
+    @Override
+    public Node getParentNode() {
+        return this.parent;
+    }
+
+    @Override
+    public int getLength() {
+        return 0;
+    }
+
+    @Override
+    public Node item(int index) {
+        return null;
+    }
+}