initial nattable.core, e4 app projects
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..a10482b
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,3 @@
+/.metadata/
+
+bin/
diff --git a/org.eclipse.nebula.widgets.nattable.app/.classpath b/org.eclipse.nebula.widgets.nattable.app/.classpath
new file mode 100644
index 0000000..098194c
--- /dev/null
+++ b/org.eclipse.nebula.widgets.nattable.app/.classpath
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.7"/>
+	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
+	<classpathentry kind="src" path="src"/>
+	<classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/org.eclipse.nebula.widgets.nattable.app/.project b/org.eclipse.nebula.widgets.nattable.app/.project
new file mode 100644
index 0000000..d562047
--- /dev/null
+++ b/org.eclipse.nebula.widgets.nattable.app/.project
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>org.eclipse.nebula.widgets.nattable.app</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>org.eclipse.jdt.core.javabuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.pde.ManifestBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.pde.SchemaBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>org.eclipse.pde.PluginNature</nature>
+		<nature>org.eclipse.jdt.core.javanature</nature>
+	</natures>
+</projectDescription>
diff --git a/org.eclipse.nebula.widgets.nattable.app/.settings/org.eclipse.jdt.core.prefs b/org.eclipse.nebula.widgets.nattable.app/.settings/org.eclipse.jdt.core.prefs
new file mode 100644
index 0000000..f42de36
--- /dev/null
+++ b/org.eclipse.nebula.widgets.nattable.app/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,7 @@
+eclipse.preferences.version=1
+org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.7
+org.eclipse.jdt.core.compiler.compliance=1.7
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.source=1.7
diff --git a/org.eclipse.nebula.widgets.nattable.app/.settings/org.eclipse.pde.core.prefs b/org.eclipse.nebula.widgets.nattable.app/.settings/org.eclipse.pde.core.prefs
new file mode 100644
index 0000000..f29e940
--- /dev/null
+++ b/org.eclipse.nebula.widgets.nattable.app/.settings/org.eclipse.pde.core.prefs
@@ -0,0 +1,3 @@
+eclipse.preferences.version=1
+pluginProject.extensions=false
+resolve.requirebundle=false
diff --git a/org.eclipse.nebula.widgets.nattable.app/Application.e4xmi b/org.eclipse.nebula.widgets.nattable.app/Application.e4xmi
new file mode 100644
index 0000000..7a32d27
--- /dev/null
+++ b/org.eclipse.nebula.widgets.nattable.app/Application.e4xmi
@@ -0,0 +1,54 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<application:Application xmi:version="2.0" xmlns:xmi="http://www.omg.org/XMI" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:advanced="http://www.eclipse.org/ui/2010/UIModel/application/ui/advanced" xmlns:application="http://www.eclipse.org/ui/2010/UIModel/application" xmlns:basic="http://www.eclipse.org/ui/2010/UIModel/application/ui/basic" xmlns:menu="http://www.eclipse.org/ui/2010/UIModel/application/ui/menu" xmi:id="_ah7NUDQUEeKwNq_-kmT7bA" elementId="org.eclipse.e4.ide.application" bindingContexts="_ah70ZzQUEeKwNq_-kmT7bA">
+  <children xsi:type="basic:TrimmedWindow" xmi:id="_ah70YDQUEeKwNq_-kmT7bA" label="org.eclipse.nebula.widgets.nattable.app" width="500" height="400">
+    <children xsi:type="advanced:PerspectiveStack" xmi:id="_ah8bcjQUEeKwNq_-kmT7bA">
+      <children xsi:type="advanced:Perspective" xmi:id="_ah8bczQUEeKwNq_-kmT7bA">
+        <children xsi:type="basic:PartSashContainer" xmi:id="_ah8bdDQUEeKwNq_-kmT7bA">
+          <children xsi:type="basic:PartStack" xmi:id="_ah8bdTQUEeKwNq_-kmT7bA">
+            <children xsi:type="basic:Part" xmi:id="_ah8bdjQUEeKwNq_-kmT7bA" contributionURI="bundleclass://org.eclipse.nebula.widgets.nattable.app/org.eclipse.nebula.widgets.nattable.app.parts.SamplePart" label="Sample Part"/>
+          </children>
+        </children>
+      </children>
+    </children>
+    <mainMenu xmi:id="_ah70dzQUEeKwNq_-kmT7bA" elementId="menu:org.eclipse.ui.main.menu">
+      <children xsi:type="menu:Menu" xmi:id="_ah70eDQUEeKwNq_-kmT7bA" label="File">
+        <children xsi:type="menu:HandledMenuItem" xmi:id="_ah70eTQUEeKwNq_-kmT7bA" label="Open" iconURI="platform:/plugin/org.eclipse.nebula.widgets.nattable.app/icons/sample.gif" command="_ah70bjQUEeKwNq_-kmT7bA"/>
+        <children xsi:type="menu:HandledMenuItem" xmi:id="_ah70ejQUEeKwNq_-kmT7bA" label="Save" iconURI="platform:/plugin/org.eclipse.nebula.widgets.nattable.app/icons/save_edit.gif" command="_ah70cTQUEeKwNq_-kmT7bA"/>
+        <children xsi:type="menu:HandledMenuItem" xmi:id="_ah70ezQUEeKwNq_-kmT7bA" label="Quit" command="_ah70ajQUEeKwNq_-kmT7bA"/>
+      </children>
+      <children xsi:type="menu:Menu" xmi:id="_ah8bcDQUEeKwNq_-kmT7bA" label="Help">
+        <children xsi:type="menu:HandledMenuItem" xmi:id="_ah8bcTQUEeKwNq_-kmT7bA" label="About" command="_ah70dDQUEeKwNq_-kmT7bA"/>
+      </children>
+    </mainMenu>
+    <trimBars xmi:id="_ah8bdzQUEeKwNq_-kmT7bA">
+      <children xsi:type="menu:ToolBar" xmi:id="_ah8beDQUEeKwNq_-kmT7bA" elementId="toolbar:org.eclipse.ui.main.toolbar">
+        <children xsi:type="menu:HandledToolItem" xmi:id="_ah8beTQUEeKwNq_-kmT7bA" iconURI="platform:/plugin/org.eclipse.nebula.widgets.nattable.app/icons/sample.gif" command="_ah70bjQUEeKwNq_-kmT7bA"/>
+        <children xsi:type="menu:HandledToolItem" xmi:id="_ah8bejQUEeKwNq_-kmT7bA" iconURI="platform:/plugin/org.eclipse.nebula.widgets.nattable.app/icons/save_edit.gif" command="_ah70cTQUEeKwNq_-kmT7bA"/>
+      </children>
+    </trimBars>
+  </children>
+  <handlers xmi:id="_ah70azQUEeKwNq_-kmT7bA" contributionURI="bundleclass://org.eclipse.nebula.widgets.nattable.app/org.eclipse.nebula.widgets.nattable.app.handlers.QuitHandler" command="_ah70ajQUEeKwNq_-kmT7bA"/>
+  <handlers xmi:id="_ah70bzQUEeKwNq_-kmT7bA" contributionURI="bundleclass://org.eclipse.nebula.widgets.nattable.app/org.eclipse.nebula.widgets.nattable.app.handlers.OpenHandler" command="_ah70bjQUEeKwNq_-kmT7bA"/>
+  <handlers xmi:id="_ah70cjQUEeKwNq_-kmT7bA" contributionURI="bundleclass://org.eclipse.nebula.widgets.nattable.app/org.eclipse.nebula.widgets.nattable.app.handlers.SaveHandler" command="_ah70cTQUEeKwNq_-kmT7bA"/>
+  <handlers xmi:id="_ah70dTQUEeKwNq_-kmT7bA" contributionURI="bundleclass://org.eclipse.nebula.widgets.nattable.app/org.eclipse.nebula.widgets.nattable.app.handlers.AboutHandler" command="_ah70dDQUEeKwNq_-kmT7bA"/>
+  <bindingTables xmi:id="_ah70bDQUEeKwNq_-kmT7bA" bindingContext="_ah70ZzQUEeKwNq_-kmT7bA">
+    <bindings xmi:id="_ah70bTQUEeKwNq_-kmT7bA" keySequence="M1+Q" command="_ah70ajQUEeKwNq_-kmT7bA"/>
+    <bindings xmi:id="_ah70cDQUEeKwNq_-kmT7bA" keySequence="M1+O" command="_ah70bjQUEeKwNq_-kmT7bA"/>
+    <bindings xmi:id="_ah70czQUEeKwNq_-kmT7bA" keySequence="M1+S" command="_ah70cTQUEeKwNq_-kmT7bA"/>
+    <bindings xmi:id="_ah70djQUEeKwNq_-kmT7bA" keySequence="M1+A" command="_ah70dDQUEeKwNq_-kmT7bA"/>
+  </bindingTables>
+  <rootContext xmi:id="_ah70ZzQUEeKwNq_-kmT7bA" elementId="org.eclipse.ui.contexts.dialogAndWindow" name="In Dialog and Windows">
+    <children xmi:id="_ah70aDQUEeKwNq_-kmT7bA" elementId="org.eclipse.ui.contexts.window" name="In Windows"/>
+    <children xmi:id="_ah70aTQUEeKwNq_-kmT7bA" elementId="org.eclipse.ui.contexts.dialog" name="In Dialogs"/>
+  </rootContext>
+  <commands xmi:id="_ah70ajQUEeKwNq_-kmT7bA" elementId="org.eclipse.ui.file.exit" commandName="quitCommand"/>
+  <commands xmi:id="_ah70bjQUEeKwNq_-kmT7bA" elementId="org.eclipse.nebula.widgets.nattable.app.open" commandName="openCommand"/>
+  <commands xmi:id="_ah70cTQUEeKwNq_-kmT7bA" elementId="org.eclipse.ui.file.save" commandName="saveCommand"/>
+  <commands xmi:id="_ah70dDQUEeKwNq_-kmT7bA" elementId="org.eclipse.ui.help.aboutAction" commandName="aboutCommand"/>
+  <addons xmi:id="_ah70YTQUEeKwNq_-kmT7bA" elementId="org.eclipse.e4.core.commands.service" contributionURI="bundleclass://org.eclipse.e4.core.commands/org.eclipse.e4.core.commands.CommandServiceAddon"/>
+  <addons xmi:id="_ah70YjQUEeKwNq_-kmT7bA" elementId="org.eclipse.e4.ui.contexts.service" contributionURI="bundleclass://org.eclipse.e4.ui.services/org.eclipse.e4.ui.services.ContextServiceAddon"/>
+  <addons xmi:id="_ah70YzQUEeKwNq_-kmT7bA" elementId="org.eclipse.e4.ui.bindings.service" contributionURI="bundleclass://org.eclipse.e4.ui.bindings/org.eclipse.e4.ui.bindings.BindingServiceAddon"/>
+  <addons xmi:id="_ah70ZDQUEeKwNq_-kmT7bA" elementId="org.eclipse.e4.ui.workbench.commands.model" contributionURI="bundleclass://org.eclipse.e4.ui.workbench/org.eclipse.e4.ui.internal.workbench.addons.CommandProcessingAddon"/>
+  <addons xmi:id="_ah70ZTQUEeKwNq_-kmT7bA" elementId="org.eclipse.e4.ui.workbench.contexts.model" contributionURI="bundleclass://org.eclipse.e4.ui.workbench/org.eclipse.e4.ui.internal.workbench.addons.ContextProcessingAddon"/>
+  <addons xmi:id="_ah70ZjQUEeKwNq_-kmT7bA" elementId="org.eclipse.e4.ui.workbench.bindings.model" contributionURI="bundleclass://org.eclipse.e4.ui.workbench.swt/org.eclipse.e4.ui.workbench.swt.util.BindingProcessingAddon"/>
+</application:Application>
diff --git a/org.eclipse.nebula.widgets.nattable.app/META-INF/MANIFEST.MF b/org.eclipse.nebula.widgets.nattable.app/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..c1b280b
--- /dev/null
+++ b/org.eclipse.nebula.widgets.nattable.app/META-INF/MANIFEST.MF
@@ -0,0 +1,26 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: NatTable App
+Bundle-SymbolicName: org.eclipse.nebula.widgets.nattable.app; singleton:=true
+Bundle-Version: 1.0.0.qualifier
+Require-Bundle: javax.inject;bundle-version="1.0.0",
+ org.eclipse.core.runtime;bundle-version="3.8.0",
+ org.eclipse.swt;bundle-version="3.100.1",
+ org.eclipse.core.databinding;bundle-version="1.4.1",
+ org.eclipse.core.databinding.beans;bundle-version="1.2.200",
+ org.eclipse.jface;bundle-version="3.8.101",
+ org.eclipse.jface.databinding;bundle-version="1.6.0",
+ org.eclipse.e4.ui.services;bundle-version="0.10.2",
+ org.eclipse.e4.ui.workbench;bundle-version="0.10.3",
+ org.eclipse.e4.core.services;bundle-version="1.0.0",
+ org.eclipse.e4.core.di;bundle-version="1.1.0",
+ org.eclipse.e4.ui.di;bundle-version="0.10.1",
+ org.eclipse.e4.core.contexts;bundle-version="1.1.0",
+ org.eclipse.e4.ui.workbench.swt;bundle-version="0.10.2",
+ org.eclipse.core.databinding.property;bundle-version="1.4.100",
+ org.eclipse.e4.ui.css.core;bundle-version="0.10.2",
+ org.w3c.css.sac;bundle-version="1.3.1",
+ org.eclipse.e4.core.commands;bundle-version="0.10.1",
+ org.eclipse.e4.ui.bindings;bundle-version="0.10.1",
+ org.eclipse.nebula.widgets.nattable.core;bundle-version="1.0.0"
+Bundle-RequiredExecutionEnvironment: JavaSE-1.7
diff --git a/org.eclipse.nebula.widgets.nattable.app/build.properties b/org.eclipse.nebula.widgets.nattable.app/build.properties
new file mode 100644
index 0000000..026e9c1
--- /dev/null
+++ b/org.eclipse.nebula.widgets.nattable.app/build.properties
@@ -0,0 +1,6 @@
+output.. = bin/
+bin.includes = META-INF/,\
+               .,\
+               plugin.xml,\
+               css/default.css
+source.. = src/
diff --git a/org.eclipse.nebula.widgets.nattable.app/css/default.css b/org.eclipse.nebula.widgets.nattable.app/css/default.css
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/org.eclipse.nebula.widgets.nattable.app/css/default.css
diff --git a/org.eclipse.nebula.widgets.nattable.app/icons/sample.gif b/org.eclipse.nebula.widgets.nattable.app/icons/sample.gif
new file mode 100644
index 0000000..34fb3c9
--- /dev/null
+++ b/org.eclipse.nebula.widgets.nattable.app/icons/sample.gif
Binary files differ
diff --git a/org.eclipse.nebula.widgets.nattable.app/icons/save_edit.gif b/org.eclipse.nebula.widgets.nattable.app/icons/save_edit.gif
new file mode 100644
index 0000000..499dd0c
--- /dev/null
+++ b/org.eclipse.nebula.widgets.nattable.app/icons/save_edit.gif
Binary files differ
diff --git a/org.eclipse.nebula.widgets.nattable.app/org.eclipse.nebula.widgets.nattable.app.product b/org.eclipse.nebula.widgets.nattable.app/org.eclipse.nebula.widgets.nattable.app.product
new file mode 100644
index 0000000..c7b2c93
--- /dev/null
+++ b/org.eclipse.nebula.widgets.nattable.app/org.eclipse.nebula.widgets.nattable.app.product
@@ -0,0 +1,107 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?pde version="3.5"?>
+
+<product name="org.eclipse.nebula.widgets.nattable.app" uid="org.eclipse.nebula.widgets.nattable.app.product" id="org.eclipse.nebula.widgets.nattable.app.product" application="org.eclipse.e4.ui.workbench.swt.E4Application" version="1.0.0.qualifier" useFeatures="false" includeLaunchers="true">
+
+   <configIni use="default">
+   </configIni>
+
+   <launcherArgs>
+      <programArgs>-clearPersistedState</programArgs>
+      <vmArgsMac>-XstartOnFirstThread -Dorg.eclipse.swt.internal.carbon.smallFonts</vmArgsMac>
+   </launcherArgs>
+
+   <windowImages/>
+
+   <plugins>
+      <plugin id="com.ibm.icu"/>
+      <plugin id="javax.annotation"/>
+      <plugin id="javax.inject"/>
+      <plugin id="javax.xml"/>
+      <plugin id="org.apache.batik.css"/>
+      <plugin id="org.apache.batik.util"/>
+      <plugin id="org.apache.batik.util.gui"/>
+      <plugin id="org.apache.commons.logging"/>
+      <plugin id="org.eclipse.core.commands"/>
+      <plugin id="org.eclipse.core.contenttype"/>
+      <plugin id="org.eclipse.core.databinding"/>
+      <plugin id="org.eclipse.core.databinding.beans"/>
+      <plugin id="org.eclipse.core.databinding.observable"/>
+      <plugin id="org.eclipse.core.databinding.property"/>
+      <plugin id="org.eclipse.core.expressions"/>
+      <plugin id="org.eclipse.core.filesystem"/>
+      <plugin id="org.eclipse.core.filesystem.aix.ppc" fragment="true"/>
+      <plugin id="org.eclipse.core.filesystem.hpux.ia64_32" fragment="true"/>
+      <plugin id="org.eclipse.core.filesystem.linux.ppc" fragment="true"/>
+      <plugin id="org.eclipse.core.filesystem.linux.x86" fragment="true"/>
+      <plugin id="org.eclipse.core.filesystem.linux.x86_64" fragment="true"/>
+      <plugin id="org.eclipse.core.filesystem.macosx" fragment="true"/>
+      <plugin id="org.eclipse.core.filesystem.solaris.sparc" fragment="true"/>
+      <plugin id="org.eclipse.core.filesystem.win32.x86" fragment="true"/>
+      <plugin id="org.eclipse.core.filesystem.win32.x86_64" fragment="true"/>
+      <plugin id="org.eclipse.core.jobs"/>
+      <plugin id="org.eclipse.core.resources"/>
+      <plugin id="org.eclipse.core.resources.win32.x86" fragment="true"/>
+      <plugin id="org.eclipse.core.runtime"/>
+      <plugin id="org.eclipse.core.runtime.compatibility.registry" fragment="true"/>
+      <plugin id="org.eclipse.e4.core.commands"/>
+      <plugin id="org.eclipse.e4.core.contexts"/>
+      <plugin id="org.eclipse.e4.core.di"/>
+      <plugin id="org.eclipse.e4.core.di.extensions"/>
+      <plugin id="org.eclipse.e4.core.services"/>
+      <plugin id="org.eclipse.e4.ui.bindings"/>
+      <plugin id="org.eclipse.e4.ui.css.core"/>
+      <plugin id="org.eclipse.e4.ui.css.swt"/>
+      <plugin id="org.eclipse.e4.ui.css.swt.theme"/>
+      <plugin id="org.eclipse.e4.ui.di"/>
+      <plugin id="org.eclipse.e4.ui.model.workbench"/>
+      <plugin id="org.eclipse.e4.ui.services"/>
+      <plugin id="org.eclipse.e4.ui.widgets"/>
+      <plugin id="org.eclipse.e4.ui.workbench"/>
+      <plugin id="org.eclipse.e4.ui.workbench.renderers.swt"/>
+      <plugin id="org.eclipse.e4.ui.workbench.swt"/>
+      <plugin id="org.eclipse.e4.ui.workbench3"/>
+      <plugin id="org.eclipse.emf.common"/>
+      <plugin id="org.eclipse.emf.databinding"/>
+      <plugin id="org.eclipse.emf.ecore"/>
+      <plugin id="org.eclipse.emf.ecore.change"/>
+      <plugin id="org.eclipse.emf.ecore.xmi"/>
+      <plugin id="org.eclipse.equinox.app"/>
+      <plugin id="org.eclipse.equinox.common"/>
+      <plugin id="org.eclipse.equinox.concurrent"/>
+      <plugin id="org.eclipse.equinox.ds"/>
+      <plugin id="org.eclipse.equinox.event"/>
+      <plugin id="org.eclipse.equinox.preferences"/>
+      <plugin id="org.eclipse.equinox.registry"/>
+      <plugin id="org.eclipse.equinox.util"/>
+      <plugin id="org.eclipse.jface"/>
+      <plugin id="org.eclipse.jface.databinding"/>
+      <plugin id="org.eclipse.nebula.widgets.nattable.app"/>
+      <plugin id="org.eclipse.osgi"/>
+      <plugin id="org.eclipse.osgi.services"/>
+      <plugin id="org.eclipse.swt"/>
+      <plugin id="org.eclipse.swt.carbon.macosx" fragment="true"/>
+      <plugin id="org.eclipse.swt.cocoa.macosx" fragment="true"/>
+      <plugin id="org.eclipse.swt.cocoa.macosx.x86_64" fragment="true"/>
+      <plugin id="org.eclipse.swt.gtk.linux.ppc" fragment="true"/>
+      <plugin id="org.eclipse.swt.gtk.linux.ppc64" fragment="true"/>
+      <plugin id="org.eclipse.swt.gtk.linux.s390" fragment="true"/>
+      <plugin id="org.eclipse.swt.gtk.linux.s390x" fragment="true"/>
+      <plugin id="org.eclipse.swt.gtk.linux.x86" fragment="true"/>
+      <plugin id="org.eclipse.swt.gtk.linux.x86_64" fragment="true"/>
+      <plugin id="org.eclipse.swt.gtk.solaris.sparc" fragment="true"/>
+      <plugin id="org.eclipse.swt.gtk.solaris.x86" fragment="true"/>
+      <plugin id="org.eclipse.swt.motif.aix.ppc" fragment="true"/>
+      <plugin id="org.eclipse.swt.motif.hpux.ia64_32" fragment="true"/>
+      <plugin id="org.eclipse.swt.motif.linux.x86" fragment="true"/>
+      <plugin id="org.eclipse.swt.motif.solaris.sparc" fragment="true"/>
+      <plugin id="org.eclipse.swt.photon.qnx.x86" fragment="true"/>
+      <plugin id="org.eclipse.swt.win32.win32.x86" fragment="true"/>
+      <plugin id="org.eclipse.swt.win32.win32.x86_64" fragment="true"/>
+      <plugin id="org.w3c.css.sac"/>
+      <plugin id="org.w3c.dom.smil"/>
+      <plugin id="org.w3c.dom.svg"/>
+   </plugins>
+
+
+</product>
diff --git a/org.eclipse.nebula.widgets.nattable.app/plugin.xml b/org.eclipse.nebula.widgets.nattable.app/plugin.xml
new file mode 100644
index 0000000..c173988
--- /dev/null
+++ b/org.eclipse.nebula.widgets.nattable.app/plugin.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<plugin>
+
+   <extension
+         id="product"
+         point="org.eclipse.core.runtime.products">
+      <product
+            name="org.eclipse.nebula.widgets.nattable.app"
+            application="org.eclipse.e4.ui.workbench.swt.E4Application">
+         <property
+               name="RICH_SAMPLE"
+               value="TRUE">
+         </property>
+         <property
+               name="clearPersistedState"
+               value="true">
+         </property>
+         <property
+               name="applicationCSS"
+               value="platform:/plugin/org.eclipse.nebula.widgets.nattable.app/css/default.css">
+         </property>
+         <property
+               name="appName"
+               value="org.eclipse.nebula.widgets.nattable.app">
+         </property>
+      </product>
+   </extension>
+
+</plugin>
diff --git a/org.eclipse.nebula.widgets.nattable.app/src/org/eclipse/nebula/widgets/nattable/app/handlers/AboutHandler.java b/org.eclipse.nebula.widgets.nattable.app/src/org/eclipse/nebula/widgets/nattable/app/handlers/AboutHandler.java
new file mode 100644
index 0000000..a1505e3
--- /dev/null
+++ b/org.eclipse.nebula.widgets.nattable.app/src/org/eclipse/nebula/widgets/nattable/app/handlers/AboutHandler.java
@@ -0,0 +1,25 @@
+/*******************************************************************************
+ * Copyright (c) 2010 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.nebula.widgets.nattable.app.handlers;
+
+import javax.inject.Named;
+
+import org.eclipse.e4.core.di.annotations.Execute;
+import org.eclipse.e4.ui.services.IServiceConstants;
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.swt.widgets.Shell;
+
+public class AboutHandler {
+	@Execute
+	public void execute(@Named(IServiceConstants.ACTIVE_SHELL) Shell shell) {
+		MessageDialog.openInformation(shell, "About", "e4 Application example.");
+	}
+}
diff --git a/org.eclipse.nebula.widgets.nattable.app/src/org/eclipse/nebula/widgets/nattable/app/handlers/OpenHandler.java b/org.eclipse.nebula.widgets.nattable.app/src/org/eclipse/nebula/widgets/nattable/app/handlers/OpenHandler.java
new file mode 100644
index 0000000..cd3945d
--- /dev/null
+++ b/org.eclipse.nebula.widgets.nattable.app/src/org/eclipse/nebula/widgets/nattable/app/handlers/OpenHandler.java
@@ -0,0 +1,33 @@
+/*******************************************************************************
+ * Copyright (c) 2010 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.nebula.widgets.nattable.app.handlers;
+
+import java.lang.reflect.InvocationTargetException;
+
+import javax.inject.Named;
+
+import org.eclipse.e4.core.contexts.IEclipseContext;
+import org.eclipse.e4.core.di.annotations.Execute;
+import org.eclipse.e4.ui.services.IServiceConstants;
+import org.eclipse.swt.widgets.FileDialog;
+import org.eclipse.swt.widgets.Shell;
+
+public class OpenHandler {
+
+	@Execute
+	public void execute(
+			IEclipseContext context,
+			@Named(IServiceConstants.ACTIVE_SHELL) Shell shell)
+			throws InvocationTargetException, InterruptedException {
+		FileDialog dialog = new FileDialog(shell);
+		dialog.open();
+	}
+}
diff --git a/org.eclipse.nebula.widgets.nattable.app/src/org/eclipse/nebula/widgets/nattable/app/handlers/QuitHandler.java b/org.eclipse.nebula.widgets.nattable.app/src/org/eclipse/nebula/widgets/nattable/app/handlers/QuitHandler.java
new file mode 100644
index 0000000..c65ff2b
--- /dev/null
+++ b/org.eclipse.nebula.widgets.nattable.app/src/org/eclipse/nebula/widgets/nattable/app/handlers/QuitHandler.java
@@ -0,0 +1,34 @@
+/*******************************************************************************
+ * Copyright (c) 2010 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.nebula.widgets.nattable.app.handlers;
+
+import java.lang.reflect.InvocationTargetException;
+
+import javax.inject.Named;
+
+import org.eclipse.e4.core.contexts.IEclipseContext;
+import org.eclipse.e4.core.di.annotations.Execute;
+import org.eclipse.e4.ui.services.IServiceConstants;
+import org.eclipse.e4.ui.workbench.IWorkbench;
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.swt.widgets.Shell;
+
+public class QuitHandler {
+	@Execute
+	public void execute(IWorkbench workbench, IEclipseContext context,
+			@Named(IServiceConstants.ACTIVE_SHELL) Shell shell)
+			throws InvocationTargetException, InterruptedException {
+		if (MessageDialog.openConfirm(shell, "Confirmation",
+				"Do you want to exit?")) {
+			workbench.close();
+		}
+	}
+}
diff --git a/org.eclipse.nebula.widgets.nattable.app/src/org/eclipse/nebula/widgets/nattable/app/handlers/SaveHandler.java b/org.eclipse.nebula.widgets.nattable.app/src/org/eclipse/nebula/widgets/nattable/app/handlers/SaveHandler.java
new file mode 100644
index 0000000..91a1aa4
--- /dev/null
+++ b/org.eclipse.nebula.widgets.nattable.app/src/org/eclipse/nebula/widgets/nattable/app/handlers/SaveHandler.java
@@ -0,0 +1,64 @@
+/*******************************************************************************
+ * Copyright (c) 2010 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.nebula.widgets.nattable.app.handlers;
+
+import java.lang.reflect.InvocationTargetException;
+
+import javax.inject.Named;
+
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.e4.core.contexts.ContextInjectionFactory;
+import org.eclipse.e4.core.contexts.IEclipseContext;
+import org.eclipse.e4.core.di.annotations.Execute;
+import org.eclipse.e4.core.di.annotations.CanExecute;
+import org.eclipse.e4.ui.model.application.MContribution;
+import org.eclipse.e4.ui.model.application.ui.MDirtyable;
+import org.eclipse.e4.ui.services.IServiceConstants;
+//import org.eclipse.e4.ui.workbench.Persist;
+import org.eclipse.jface.dialogs.ProgressMonitorDialog;
+import org.eclipse.jface.operation.IRunnableWithProgress;
+import org.eclipse.swt.widgets.Shell;
+
+public class SaveHandler {
+	@CanExecute
+	public boolean canExecute(
+			@Named(IServiceConstants.ACTIVE_PART) MDirtyable dirtyable) {
+		if (dirtyable == null) {
+			return false;
+		}
+		return dirtyable.isDirty();
+	}
+
+	@Execute
+	public void execute(
+			IEclipseContext context,
+			@Named(IServiceConstants.ACTIVE_SHELL) Shell shell,
+			@Named(IServiceConstants.ACTIVE_PART) final MContribution contribution)
+			throws InvocationTargetException, InterruptedException {
+		final IEclipseContext pmContext = context.createChild();
+
+		ProgressMonitorDialog dialog = new ProgressMonitorDialog(shell);
+		dialog.open();
+		dialog.run(true, true, new IRunnableWithProgress() {
+			public void run(IProgressMonitor monitor)
+					throws InvocationTargetException, InterruptedException {
+				pmContext.set(IProgressMonitor.class.getName(), monitor);
+				if (contribution != null) {
+					Object clientObject = contribution.getObject();
+//					ContextInjectionFactory.invoke(clientObject, Persist.class, //$NON-NLS-1$
+//							pmContext, null);
+				}
+			}
+		});
+		
+		pmContext.dispose();
+	}
+}
diff --git a/org.eclipse.nebula.widgets.nattable.app/src/org/eclipse/nebula/widgets/nattable/app/parts/SamplePart.java b/org.eclipse.nebula.widgets.nattable.app/src/org/eclipse/nebula/widgets/nattable/app/parts/SamplePart.java
new file mode 100644
index 0000000..a24db27
--- /dev/null
+++ b/org.eclipse.nebula.widgets.nattable.app/src/org/eclipse/nebula/widgets/nattable/app/parts/SamplePart.java
@@ -0,0 +1,43 @@
+/*******************************************************************************
+ * Copyright (c) 2010 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.nebula.widgets.nattable.app.parts;
+
+import javax.annotation.PostConstruct;
+
+import org.eclipse.e4.ui.di.Focus;
+import org.eclipse.nebula.widgets.nattable.core.NatTable;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Label;
+
+public class SamplePart {
+
+	private Label label;
+	private NatTable natTable;
+
+	@PostConstruct
+	public void createComposite(Composite parent) {
+		parent.setLayout(new GridLayout());
+
+		label = new Label(parent, SWT.NONE);
+		label.setText("Sample table");
+
+		natTable = new NatTable(parent);
+		natTable.setLayoutData(new GridData(GridData.FILL_BOTH));
+	}
+
+	@Focus
+	public void setFocus() {
+		natTable.setFocus();
+	}
+}
diff --git a/org.eclipse.nebula.widgets.nattable.core/.classpath b/org.eclipse.nebula.widgets.nattable.core/.classpath
new file mode 100644
index 0000000..098194c
--- /dev/null
+++ b/org.eclipse.nebula.widgets.nattable.core/.classpath
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.7"/>
+	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
+	<classpathentry kind="src" path="src"/>
+	<classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/org.eclipse.nebula.widgets.nattable.core/.project b/org.eclipse.nebula.widgets.nattable.core/.project
new file mode 100644
index 0000000..2e30a2f
--- /dev/null
+++ b/org.eclipse.nebula.widgets.nattable.core/.project
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>org.eclipse.nebula.widgets.nattable.core</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>org.eclipse.jdt.core.javabuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.pde.ManifestBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.pde.SchemaBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>org.eclipse.pde.PluginNature</nature>
+		<nature>org.eclipse.jdt.core.javanature</nature>
+	</natures>
+</projectDescription>
diff --git a/org.eclipse.nebula.widgets.nattable.core/.settings/org.eclipse.jdt.core.prefs b/org.eclipse.nebula.widgets.nattable.core/.settings/org.eclipse.jdt.core.prefs
new file mode 100644
index 0000000..f42de36
--- /dev/null
+++ b/org.eclipse.nebula.widgets.nattable.core/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,7 @@
+eclipse.preferences.version=1
+org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.7
+org.eclipse.jdt.core.compiler.compliance=1.7
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.source=1.7
diff --git a/org.eclipse.nebula.widgets.nattable.core/META-INF/MANIFEST.MF b/org.eclipse.nebula.widgets.nattable.core/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..cdaf85a
--- /dev/null
+++ b/org.eclipse.nebula.widgets.nattable.core/META-INF/MANIFEST.MF
@@ -0,0 +1,11 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: NatTable Core
+Bundle-SymbolicName: org.eclipse.nebula.widgets.nattable.core
+Bundle-Version: 1.0.0.qualifier
+Bundle-RequiredExecutionEnvironment: JavaSE-1.7
+Import-Package: org.eclipse.swt,
+ org.eclipse.swt.events,
+ org.eclipse.swt.graphics,
+ org.eclipse.swt.widgets
+Export-Package: org.eclipse.nebula.widgets.nattable.core
diff --git a/org.eclipse.nebula.widgets.nattable.core/build.properties b/org.eclipse.nebula.widgets.nattable.core/build.properties
new file mode 100644
index 0000000..34d2e4d
--- /dev/null
+++ b/org.eclipse.nebula.widgets.nattable.core/build.properties
@@ -0,0 +1,4 @@
+source.. = src/
+output.. = bin/
+bin.includes = META-INF/,\
+               .
diff --git a/org.eclipse.nebula.widgets.nattable.core/src/org/eclipse/nebula/widgets/nattable/core/NatTable.java b/org.eclipse.nebula.widgets.nattable.core/src/org/eclipse/nebula/widgets/nattable/core/NatTable.java
new file mode 100644
index 0000000..8e913e9
--- /dev/null
+++ b/org.eclipse.nebula.widgets.nattable.core/src/org/eclipse/nebula/widgets/nattable/core/NatTable.java
@@ -0,0 +1,687 @@
+/*******************************************************************************
+ * Copyright (c) 2012 Original authors and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *     Original authors and others - initial API and implementation
+ ******************************************************************************/
+package org.eclipse.nebula.widgets.nattable.core;
+
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.PaintEvent;
+import org.eclipse.swt.events.PaintListener;
+import org.eclipse.swt.widgets.Canvas;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.ScrollBar;
+
+public class NatTable extends Canvas implements PaintListener
+//	, ILayer, IClientAreaProvider, ILayerListener, IPersistable
+	{
+
+	public static final int DEFAULT_STYLE_OPTIONS = SWT.NO_BACKGROUND | SWT.NO_REDRAW_RESIZE | SWT.DOUBLE_BUFFERED  | SWT.V_SCROLL | SWT.H_SCROLL;
+
+//	private UiBindingRegistry uiBindingRegistry;
+//
+//	private ModeSupport modeSupport;
+//
+//	private final EventConflaterChain conflaterChain = new EventConflaterChain();
+//
+//	private final List<IOverlayPainter> overlayPainters = new ArrayList<IOverlayPainter>();
+//
+//	private final List<IPersistable> persistables = new LinkedList<IPersistable>();
+//
+//	private ILayer underlyingLayer;
+//
+//	private IConfigRegistry configRegistry;
+//
+//	protected final Collection<IConfiguration> configurations = new LinkedList<IConfiguration>();
+//
+//	protected String id = GUIHelper.getSequenceNumber();
+//
+//	private ILayerPainter layerPainter = new NatLayerPainter(this);
+//
+//	private final boolean autoconfigure;
+
+	public NatTable(Composite parent) {
+		this(parent, DEFAULT_STYLE_OPTIONS);
+	}
+
+//	/**
+//	 * @param parent widget for the table.
+//	 * @param autoconfigure if set to False
+//	 *    - No auto configuration is done
+//	 *    - Default settings are <i>not</i> loaded. Configuration(s) have to be manually
+//	 *      added by invoking addConfiguration(). At the minimum the {@link DefaultNatTableStyleConfiguration}
+//	 *      must be added for the table to render.
+//	 */
+//	public NatTable(Composite parent, boolean autoconfigure) {
+//		this(parent, DEFAULT_STYLE_OPTIONS, autoconfigure);
+//	}
+//
+//	public NatTable(Composite parent, ILayer layer) {
+//	    this(parent, DEFAULT_STYLE_OPTIONS, layer);
+//	}
+//
+//	public NatTable(Composite parent, ILayer layer, boolean autoconfigure) {
+//	    this(parent, DEFAULT_STYLE_OPTIONS, layer, autoconfigure);
+//	}
+
+	public NatTable(Composite parent, final int style) {
+//		this(parent, style, new DummyGridLayerStack());
+//	}
+//
+//	public NatTable(Composite parent, final int style, boolean autoconfigure) {
+//		this(parent, style, new DummyGridLayerStack(), autoconfigure);
+//	}
+//
+//	public NatTable(final Composite parent, final int style, ILayer layer) {
+//		this(parent, style, layer, true);
+//	}
+//
+//	public NatTable(final Composite parent, final int style, final ILayer layer, boolean autoconfigure) {
+		super(parent, style);
+
+		// Disable scroll bars by default; if a Viewport is available, it will enable the scroll bars
+		disableScrollBar(getHorizontalBar());
+		disableScrollBar(getVerticalBar());
+
+//		initInternalListener();
+//
+//		internalSetLayer(layer);
+//
+//		this.autoconfigure = autoconfigure;
+//		if (autoconfigure) {
+//			configurations.add(new DefaultNatTableStyleConfiguration());
+//			configure();
+//		}
+//
+//		conflaterChain.add(getVisualChangeEventConflater());
+//		conflaterChain.start();
+//
+//		addDisposeListener(new DisposeListener() {
+//
+//			public void widgetDisposed(DisposeEvent e) {
+//				doCommand(new DisposeResourcesCommand());
+//				conflaterChain.stop();
+//				InlineCellEditController.dispose();
+//				ActiveCellEditor.close();
+//				
+//				layer.dispose();
+//			}
+//
+//		});
+	}
+	
+//	protected IEventConflater getVisualChangeEventConflater() {
+//		return new VisualChangeEventConflater(this);
+//	}
+
+	private void disableScrollBar(ScrollBar scrollBar) {
+		scrollBar.setMinimum(0);
+		scrollBar.setMaximum(1);
+		scrollBar.setThumb(1);
+		scrollBar.setEnabled(false);
+	}
+
+//	public ILayer getLayer() {
+//		return underlyingLayer;
+//	}
+//
+//	public void setLayer(ILayer layer) {
+//		if (autoconfigure) {
+//			throw new IllegalStateException("May only set layer post construction if autoconfigure is turned off"); //$NON-NLS-1$
+//		}
+//
+//		internalSetLayer(layer);
+//	}
+//
+//	private void internalSetLayer(ILayer layer) {
+//		if (layer != null) {
+//			this.underlyingLayer = layer;
+//			underlyingLayer.setClientAreaProvider(new IClientAreaProvider() {
+//
+//				public Rectangle getClientArea() {
+//					final Rectangle clientArea = new Rectangle(0, 0, 0, 0);
+//					if (!isDisposed()) {
+//						getDisplay().syncExec(new Runnable() {
+//							public void run() {
+//								Rectangle natClientArea = NatTable.this.getClientArea();
+//								clientArea.x = natClientArea.x;
+//								clientArea.y = natClientArea.y;
+//								clientArea.width = natClientArea.width;
+//								clientArea.height = natClientArea.height;
+//							}
+//						});
+//					}
+//					return clientArea;
+//				}
+//
+//			});
+//			underlyingLayer.addLayerListener(this);
+//		}
+//	}
+//
+//	/**
+//	 * Adds a configuration to the table.<br/>
+//	 *
+//	 * Configurations are processed when the {@link #configure()} method is invoked.<br/>
+//	 * Each configuration object then has a chance to configure the<br/>
+//	 * 	<ol>
+//	 * 		<li>ILayer</li>
+//	 * 		<li>ConfigRegistry</li>
+//	 * 		<li>UiBindingRegistry</li>
+//	 *  </ol>
+//	 */
+//	public void addConfiguration(IConfiguration configuration) {
+//		if (autoconfigure) {
+//			throw new IllegalStateException("May only add configurations post construction if autoconfigure is turned off"); //$NON-NLS-1$
+//		}
+//
+//		configurations.add(configuration);
+//	}
+//
+//	/**
+//	 * @return {@link IConfigRegistry} used to hold the configuration bindings<br/>
+//	 * 	by Layer, DisplayMode and Config labels.
+//	 */
+//	public IConfigRegistry getConfigRegistry() {
+//		if (configRegistry == null) {
+//			configRegistry = new ConfigRegistry();
+//		}
+//		return configRegistry;
+//	}
+//
+//	public void setConfigRegistry(IConfigRegistry configRegistry) {
+//		if (autoconfigure) {
+//			throw new IllegalStateException("May only set config registry post construction if autoconfigure is turned off"); //$NON-NLS-1$
+//		}
+//
+//		this.configRegistry = configRegistry;
+//	}
+//
+//	/**
+//	 * @return Registry holding all the UIBindings contributed by the underlying layers
+//	 */
+//	public UiBindingRegistry getUiBindingRegistry() {
+//		if (uiBindingRegistry == null) {
+//			uiBindingRegistry = new UiBindingRegistry(this);
+//		}
+//		return uiBindingRegistry;
+//	}
+//
+//	public void setUiBindingRegistry(UiBindingRegistry uiBindingRegistry) {
+//		if (autoconfigure) {
+//			throw new IllegalStateException("May only set UI binding registry post construction if autoconfigure is turned off"); //$NON-NLS-1$
+//		}
+//
+//		this.uiBindingRegistry = uiBindingRegistry;
+//	}
+//
+//	public String getID() {
+//		return id;
+//	}
+
+	@Override
+	protected void checkSubclass() {
+	}
+
+//	protected void initInternalListener() {
+//		modeSupport = new ModeSupport(this);
+//		modeSupport.registerModeEventHandler(Mode.NORMAL_MODE, new ConfigurableModeEventHandler(modeSupport, this));
+//		modeSupport.switchMode(Mode.NORMAL_MODE);
+//
+//		addPaintListener(this);
+//
+//		addFocusListener(new FocusListener() {
+//
+//			public void focusLost(final FocusEvent arg0) {
+//				redraw();
+//			}
+//
+//			public void focusGained(final FocusEvent arg0) {
+//				redraw();
+//			}
+//
+//		});
+//
+//		addListener(SWT.Resize, new Listener() {
+//			public void handleEvent(final Event e) {
+//				doCommand(new ClientAreaResizeCommand(NatTable.this));
+//			}
+//		});
+//	}
+
+	@Override
+	public boolean forceFocus() {
+		return super.forceFocus();
+	}
+
+	// Painting ///////////////////////////////////////////////////////////////
+
+//	public List<IOverlayPainter> getOverlayPainters() {
+//		return overlayPainters;
+//	}
+//	
+//	public void addOverlayPainter(IOverlayPainter overlayPainter) {
+//		overlayPainters.add(overlayPainter);
+//	}
+//
+//	public void removeOverlayPainter(IOverlayPainter overlayPainter) {
+//		overlayPainters.remove(overlayPainter);
+//	}
+
+	public void paintControl(final PaintEvent event) {
+		paintNatTable(event);
+	}
+
+	private void paintNatTable(final PaintEvent event) {
+//		getLayerPainter().paintLayer(this, event.gc, 0, 0, new Rectangle(event.x, event.y, event.width, event.height), getConfigRegistry());
+	}
+
+//	public ILayerPainter getLayerPainter() {
+//		return layerPainter;
+//	}
+//
+//	public void setLayerPainter(ILayerPainter layerPainter) {
+//		this.layerPainter = layerPainter;
+//	}
+//
+//	/**
+//	 * Repaint only a specific column in the grid. This method is optimized so that only the specific column is
+//	 * repainted and nothing else.
+//	 *
+//	 * @param gridColumnPosition column of the grid to repaint
+//	 */
+//	public void repaintColumn(int columnPosition) {
+//		int xOffset = getStartXOfColumnPosition(columnPosition);
+//		if (xOffset < 0) {
+//			return;
+//		}
+//		redraw(xOffset, 0, getColumnWidthByPosition(columnPosition), getHeight(), true);
+//	}
+//
+//	/**
+//	 * Repaint only a specific row in the grid. This method is optimized so that only the specific row is repainted and
+//	 * nothing else.
+//	 *
+//	 * @param gridRowPosition row of the grid to repaint
+//	 */
+//	public void repaintRow(int rowPosition) {
+//		int yOffset = getStartYOfRowPosition(rowPosition);
+//		if (yOffset < 0) {
+//			return;
+//		}
+//		redraw(0, yOffset, getWidth(), getRowHeightByPosition(rowPosition), true);
+//	}
+
+	public void updateResize() {
+		updateResize(true);
+	}
+
+	/**
+	 * Update the table screen by re-calculating everything again. It should not
+	 * be called too frequently.
+	 *
+	 * @param redraw
+	 *            true to redraw the table
+	 */
+	private void updateResize(final boolean redraw) {
+		if (isDisposed()) {
+			return;
+		}
+//		doCommand(new RecalculateScrollBarsCommand());
+		if (redraw) {
+			redraw();
+		}
+	}
+
+//	/**
+//	 * Refreshes the entire NatTable as every layer will be refreshed.
+//	 */
+//	public void refresh() {
+//		doCommand(new StructuralRefreshCommand());
+//	}
+//	
+//	public void configure(ConfigRegistry configRegistry, UiBindingRegistry uiBindingRegistry) {
+//		throw new UnsupportedOperationException("Cannot use this method to configure NatTable. Use no-argument configure() instead."); //$NON-NLS-1$
+//	}
+//
+//	/**
+//	 * Processes all the registered {@link IConfiguration} (s).
+//	 * All the underlying layers are walked and given a chance to configure.
+//	 * Note: all desired configuration tweaks must be done <i>before</i> this method is invoked.
+//	 */
+//	public void configure() {
+//		if (underlyingLayer == null) {
+//			throw new IllegalStateException("Layer must be set before configure is called"); //$NON-NLS-1$
+//		}
+//
+//		if (underlyingLayer != null) {
+//			underlyingLayer.configure((ConfigRegistry) getConfigRegistry(), getUiBindingRegistry());
+//		}
+//
+//		for (IConfiguration configuration : configurations) {
+//			configuration.configureLayer(this);
+//			configuration.configureRegistry(getConfigRegistry());
+//			configuration.configureUiBindings(getUiBindingRegistry());
+//		}
+//
+//		// Once everything is initialized and properly configured we will
+//		// now formally initialize the grid
+//		doCommand(new InitializeGridCommand(this));
+//	}
+//
+//	// Events /////////////////////////////////////////////////////////////////
+//
+//	public void handleLayerEvent(ILayerEvent event) {
+//		for (ILayerListener layerListener : listeners) {
+//			layerListener.handleLayerEvent(event);
+//		}
+//
+//	    if (event instanceof IVisualChangeEvent) {
+//	    	conflaterChain.addEvent(event);
+//	    }
+//
+//		if (event instanceof CellSelectionEvent) {
+//			Event e = new Event();
+//			e.widget = this;
+//			try {
+//				notifyListeners(SWT.Selection, e);
+//			} catch (RuntimeException re) {
+//				re.printStackTrace();
+//			}
+//		}
+//	}
+//
+//
+//	// ILayer /////////////////////////////////////////////////////////////////
+//
+//	// Persistence
+//
+//	/**
+//	 * Save the state of the table to the properties object.
+//	 * {@link ILayer#saveState(String, Properties)} is invoked on all the underlying layers.
+//	 * This properties object will be populated with the settings of all underlying layers
+//	 * and any {@link IPersistable} registered with those layers.
+//	 */
+//	public void saveState(String prefix, Properties properties) {
+//		underlyingLayer.saveState(prefix, properties);
+//	}
+//
+//	/**
+//	 * Restore the state of the underlying layers from the values in the properties object.
+//	 * @see #saveState(String, Properties)
+//	 */
+//	public void loadState(String prefix, Properties properties) {
+//		underlyingLayer.loadState(prefix, properties);
+//	}
+//
+//	/**
+//	 * @see ILayer#registerPersistable(IPersistable)
+//	 */
+//	public void registerPersistable(IPersistable persistable) {
+//		persistables.add(persistable);
+//	}
+//
+//	public void unregisterPersistable(IPersistable persistable) {
+//		persistables.remove(persistable);
+//	}
+//
+//	// Command
+//
+//	public boolean doCommand(ILayerCommand command) {
+//		return underlyingLayer.doCommand(command);
+//	}
+//
+//	// Events
+//
+//	private final List<ILayerListener> listeners = new ArrayList<ILayerListener>();
+//
+//	public void fireLayerEvent(ILayerEvent event) {
+//		underlyingLayer.fireLayerEvent(event);
+//	}
+//
+//	public void addLayerListener(ILayerListener listener) {
+//		listeners.add(listener);
+//	}
+//
+//	public void removeLayerListener(ILayerListener listener) {
+//		listeners.remove(listener);
+//	}
+//
+//	// Columns
+//
+//	public int getColumnCount() {
+//		return underlyingLayer.getColumnCount();
+//	}
+//
+//	public int getPreferredColumnCount() {
+//		return underlyingLayer.getPreferredColumnCount();
+//	}
+//
+//	public int getColumnIndexByPosition(int columnPosition) {
+//		return underlyingLayer.getColumnIndexByPosition(columnPosition);
+//	}
+//
+//	public int localToUnderlyingColumnPosition(int localColumnPosition) {
+//		return localColumnPosition;
+//	}
+//
+//	public int underlyingToLocalColumnPosition(ILayer sourceUnderlyingLayer, int underlyingColumnPosition) {
+//		if (sourceUnderlyingLayer != underlyingLayer) {
+//			return -1;
+//		}
+//
+//		return underlyingColumnPosition;
+//	}
+//
+//	public Collection<Range> underlyingToLocalColumnPositions(ILayer sourceUnderlyingLayer, Collection<Range> underlyingColumnPositionRanges) {
+//		if (sourceUnderlyingLayer != underlyingLayer) {
+//			return null;
+//		}
+//
+//		return underlyingColumnPositionRanges;
+//	}
+//
+//	// Width
+//
+//	public int getWidth() {
+//		return underlyingLayer.getWidth();
+//	}
+//
+//	public int getPreferredWidth() {
+//		return underlyingLayer.getPreferredWidth();
+//	}
+//
+//	public int getColumnWidthByPosition(int columnPosition) {
+//		return underlyingLayer.getColumnWidthByPosition(columnPosition);
+//	}
+//
+//	// Column resize
+//
+//	public boolean isColumnPositionResizable(int columnPosition) {
+//		return underlyingLayer.isColumnPositionResizable(columnPosition);
+//	}
+//
+//	// X
+//
+//	public int getColumnPositionByX(int x) {
+//		return underlyingLayer.getColumnPositionByX(x);
+//	}
+//
+//	public int getStartXOfColumnPosition(int columnPosition) {
+//		return underlyingLayer.getStartXOfColumnPosition(columnPosition);
+//	}
+//
+//	// Underlying
+//
+//	public Collection<ILayer> getUnderlyingLayersByColumnPosition(int columnPosition) {
+//		Collection<ILayer> underlyingLayers = new HashSet<ILayer>();
+//		underlyingLayers.add(underlyingLayer);
+//		return underlyingLayers;
+//	}
+//
+//	// Rows
+//
+//	public int getRowCount() {
+//		return underlyingLayer.getRowCount();
+//	}
+//
+//	public int getPreferredRowCount() {
+//		return underlyingLayer.getPreferredRowCount();
+//	}
+//
+//	public int getRowIndexByPosition(int rowPosition) {
+//		return underlyingLayer.getRowIndexByPosition(rowPosition);
+//	}
+//
+//	public int localToUnderlyingRowPosition(int localRowPosition) {
+//		return localRowPosition;
+//	}
+//
+//	public int underlyingToLocalRowPosition(ILayer sourceUnderlyingLayer, int underlyingRowPosition) {
+//		if (sourceUnderlyingLayer != underlyingLayer) {
+//			return -1;
+//		}
+//
+//		return underlyingRowPosition;
+//	}
+//
+//	public Collection<Range> underlyingToLocalRowPositions(ILayer sourceUnderlyingLayer, Collection<Range> underlyingRowPositionRanges) {
+//		if (sourceUnderlyingLayer != underlyingLayer) {
+//			return null;
+//		}
+//
+//		return underlyingRowPositionRanges;
+//	}
+//
+//	// Height
+//
+//	public int getHeight() {
+//		return underlyingLayer.getHeight();
+//	}
+//
+//	public int getPreferredHeight() {
+//		return underlyingLayer.getPreferredHeight();
+//	}
+//
+//	public int getRowHeightByPosition(int rowPosition) {
+//		return underlyingLayer.getRowHeightByPosition(rowPosition);
+//	}
+//
+//	// Row resize
+//
+//	public boolean isRowPositionResizable(int rowPosition) {
+//		return underlyingLayer.isRowPositionResizable(rowPosition);
+//	}
+//
+//	// Y
+//
+//	public int getRowPositionByY(int y) {
+//		return underlyingLayer.getRowPositionByY(y);
+//	}
+//
+//	public int getStartYOfRowPosition(int rowPosition) {
+//		return underlyingLayer.getStartYOfRowPosition(rowPosition);
+//	}
+//
+//	// Underlying
+//
+//	public Collection<ILayer> getUnderlyingLayersByRowPosition(int rowPosition) {
+//		Collection<ILayer> underlyingLayers = new HashSet<ILayer>();
+//		underlyingLayers.add(underlyingLayer);
+//		return underlyingLayers;
+//	}
+//
+//	// Cell features
+//
+//	public ILayerCell getCellByPosition(int columnPosition, int rowPosition) {
+//		return underlyingLayer.getCellByPosition(columnPosition, rowPosition);
+//	}
+//
+//	public Rectangle getBoundsByPosition(int columnPosition, int rowPosition) {
+//		return underlyingLayer.getBoundsByPosition(columnPosition, rowPosition);
+//	}
+//
+//	public String getDisplayModeByPosition(int columnPosition, int rowPosition) {
+//		return underlyingLayer.getDisplayModeByPosition(columnPosition, rowPosition);
+//	}
+//
+//	public LabelStack getConfigLabelsByPosition(int columnPosition, int rowPosition) {
+//		return underlyingLayer.getConfigLabelsByPosition(columnPosition, rowPosition);
+//	}
+//
+//	public Object getDataValueByPosition(int columnPosition, int rowPosition) {
+//		return underlyingLayer.getDataValueByPosition(columnPosition, rowPosition);
+//	}
+//	
+//	public ICellPainter getCellPainter(int columnPosition, int rowPosition, ILayerCell cell, IConfigRegistry configRegistry) {
+//		return underlyingLayer.getCellPainter(columnPosition, rowPosition, cell, configRegistry);
+//	}
+//
+//	// IRegionResolver
+//
+//	public LabelStack getRegionLabelsByXY(int x, int y) {
+//		return underlyingLayer.getRegionLabelsByXY(x, y);
+//	}
+//
+//	public ILayer getUnderlyingLayerByPosition(int columnPosition, int rowPosition) {
+//		return underlyingLayer;
+//	}
+//
+//	public IClientAreaProvider getClientAreaProvider() {
+//		return this;
+//	}
+//
+//	public void setClientAreaProvider(IClientAreaProvider clientAreaProvider) {
+//		throw new UnsupportedOperationException("Cannot set an area provider."); //$NON-NLS-1$
+//	}
+//	
+//	
+//	// DND /////////////////////////////////////////////////////////////////
+//	
+//	/**
+//	 * Adds support for dragging items out of this control via a user
+//	 * drag-and-drop operation.
+//	 *
+//	 * @param operations
+//	 *            a bitwise OR of the supported drag and drop operation types (
+//	 *            <code>DROP_COPY</code>,<code>DROP_LINK</code>, and
+//	 *            <code>DROP_MOVE</code>)
+//	 * @param transferTypes
+//	 *            the transfer types that are supported by the drag operation
+//	 * @param listener
+//	 *            the callback that will be invoked to set the drag data and to
+//	 *            cleanup after the drag and drop operation finishes
+//	 * @see org.eclipse.swt.dnd.DND
+//	 */
+//	public void addDragSupport(final int operations, final Transfer[] transferTypes, final DragSourceListener listener) {
+//		final DragSource dragSource = new DragSource(this, operations);
+//		dragSource.setTransfer(transferTypes);
+//		dragSource.addDragListener(listener);
+//	}
+//
+//	/**
+//	 * Adds support for dropping items into this control via a user drag-and-drop
+//	 * operation.
+//	 *
+//	 * @param operations
+//	 *            a bitwise OR of the supported drag and drop operation types (
+//	 *            <code>DROP_COPY</code>,<code>DROP_LINK</code>, and
+//	 *            <code>DROP_MOVE</code>)
+//	 * @param transferTypes
+//	 *            the transfer types that are supported by the drop operation
+//	 * @param listener
+//	 *            the callback that will be invoked after the drag and drop
+//	 *            operation finishes
+//	 * @see org.eclipse.swt.dnd.DND
+//	 */
+//	public void addDropSupport(final int operations, final Transfer[] transferTypes, final DropTargetListener listener) {
+//		final DropTarget dropTarget = new DropTarget(this, operations);
+//		dropTarget.setTransfer(transferTypes);
+//		dropTarget.addDropListener(listener);
+//	}
+}