Skip to main content
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTom Schindl2013-04-19 10:51:00 -0400
committerTom Schindl2013-04-19 10:51:00 -0400
commit69cd742566d37273086d028546cf1a087bd0469c (patch)
tree680def5bd77c5e71af8440d55fc8c2640ec4cd5b
parent47089b6ac6483b00f95e083939c270a77a2de44d (diff)
downloadorg.eclipse.efxclipse-69cd742566d37273086d028546cf1a087bd0469c.tar.gz
org.eclipse.efxclipse-69cd742566d37273086d028546cf1a087bd0469c.tar.xz
org.eclipse.efxclipse-69cd742566d37273086d028546cf1a087bd0469c.zip
initial check in
-rw-r--r--.gitignore1
-rw-r--r--bundles/runtime/.gitignore1
-rwxr-xr-xdemos/org.eclipse.fx.demo.contacts.app/.classpath7
-rwxr-xr-xdemos/org.eclipse.fx.demo.contacts.app/.gitignore2
-rwxr-xr-xdemos/org.eclipse.fx.demo.contacts.app/.project39
-rw-r--r--demos/org.eclipse.fx.demo.contacts.app/.settings/org.eclipse.core.resources.prefs6
-rw-r--r--demos/org.eclipse.fx.demo.contacts.app/.settings/org.eclipse.jdt.core.prefs7
-rwxr-xr-xdemos/org.eclipse.fx.demo.contacts.app/Application.e4xmi78
-rwxr-xr-xdemos/org.eclipse.fx.demo.contacts.app/IP_TODOS.txt24
-rwxr-xr-xdemos/org.eclipse.fx.demo.contacts.app/META-INF/MANIFEST.MF71
-rwxr-xr-xdemos/org.eclipse.fx.demo.contacts.app/OSGI-INF/component.xml7
-rwxr-xr-xdemos/org.eclipse.fx.demo.contacts.app/build.properties17
-rwxr-xr-xdemos/org.eclipse.fx.demo.contacts.app/contacts.product103
-rwxr-xr-xdemos/org.eclipse.fx.demo.contacts.app/css/blue.css104
-rwxr-xr-xdemos/org.eclipse.fx.demo.contacts.app/css/blue.pngbin0 -> 387 bytes
-rwxr-xr-xdemos/org.eclipse.fx.demo.contacts.app/css/bright.css85
-rwxr-xr-xdemos/org.eclipse.fx.demo.contacts.app/css/bright.pngbin0 -> 389 bytes
-rwxr-xr-xdemos/org.eclipse.fx.demo.contacts.app/css/dark.css132
-rwxr-xr-xdemos/org.eclipse.fx.demo.contacts.app/css/dark.pngbin0 -> 477 bytes
-rwxr-xr-xdemos/org.eclipse.fx.demo.contacts.app/icons/silk/arrow_redo.pngbin0 -> 625 bytes
-rwxr-xr-xdemos/org.eclipse.fx.demo.contacts.app/icons/silk/arrow_undo.pngbin0 -> 631 bytes
-rwxr-xr-xdemos/org.eclipse.fx.demo.contacts.app/icons/silk/bright.pngbin0 -> 389 bytes
-rwxr-xr-xdemos/org.eclipse.fx.demo.contacts.app/icons/silk/cross.pngbin0 -> 655 bytes
-rwxr-xr-xdemos/org.eclipse.fx.demo.contacts.app/icons/silk/cut.pngbin0 -> 648 bytes
-rwxr-xr-xdemos/org.eclipse.fx.demo.contacts.app/icons/silk/dark.pngbin0 -> 477 bytes
-rwxr-xr-xdemos/org.eclipse.fx.demo.contacts.app/icons/silk/disk.pngbin0 -> 620 bytes
-rwxr-xr-xdemos/org.eclipse.fx.demo.contacts.app/icons/silk/door_in.pngbin0 -> 693 bytes
-rwxr-xr-xdemos/org.eclipse.fx.demo.contacts.app/icons/silk/folder.pngbin0 -> 537 bytes
-rwxr-xr-xdemos/org.eclipse.fx.demo.contacts.app/icons/silk/folder_add.pngbin0 -> 668 bytes
-rwxr-xr-xdemos/org.eclipse.fx.demo.contacts.app/icons/silk/folder_user.pngbin0 -> 730 bytes
-rwxr-xr-xdemos/org.eclipse.fx.demo.contacts.app/icons/silk/page_copy.pngbin0 -> 663 bytes
-rwxr-xr-xdemos/org.eclipse.fx.demo.contacts.app/icons/silk/page_paste.pngbin0 -> 703 bytes
-rwxr-xr-xdemos/org.eclipse.fx.demo.contacts.app/icons/silk/readme.txt22
-rwxr-xr-xdemos/org.eclipse.fx.demo.contacts.app/icons/silk/report_user.pngbin0 -> 785 bytes
-rwxr-xr-xdemos/org.eclipse.fx.demo.contacts.app/icons/silk/user_add.pngbin0 -> 746 bytes
-rwxr-xr-xdemos/org.eclipse.fx.demo.contacts.app/icons/silk/user_delete.pngbin0 -> 767 bytes
-rwxr-xr-xdemos/org.eclipse.fx.demo.contacts.app/images/dummy.pngbin0 -> 3883 bytes
-rwxr-xr-xdemos/org.eclipse.fx.demo.contacts.app/plugin.properties29
-rwxr-xr-xdemos/org.eclipse.fx.demo.contacts.app/plugin.xml77
-rwxr-xr-xdemos/org.eclipse.fx.demo.contacts.app/plugin_customization.ini2
-rwxr-xr-xdemos/org.eclipse.fx.demo.contacts.app/plugin_ru.properties22
-rwxr-xr-xdemos/org.eclipse.fx.demo.contacts.app/splash.bmpbin0 -> 397386 bytes
-rwxr-xr-xdemos/org.eclipse.fx.demo.contacts.app/src/org/eclipse/fx/demo/contacts/BundleActivatorImpl.java75
-rwxr-xr-xdemos/org.eclipse.fx.demo.contacts.app/src/org/eclipse/fx/demo/contacts/DecorationController.java77
-rwxr-xr-xdemos/org.eclipse.fx.demo.contacts.app/src/org/eclipse/fx/demo/contacts/handlers/AddContactHandler.java40
-rwxr-xr-xdemos/org.eclipse.fx.demo.contacts.app/src/org/eclipse/fx/demo/contacts/handlers/AddGroupHandler.java41
-rwxr-xr-xdemos/org.eclipse.fx.demo.contacts.app/src/org/eclipse/fx/demo/contacts/handlers/CopyHandler.java51
-rwxr-xr-xdemos/org.eclipse.fx.demo.contacts.app/src/org/eclipse/fx/demo/contacts/handlers/CutHandler.java50
-rwxr-xr-xdemos/org.eclipse.fx.demo.contacts.app/src/org/eclipse/fx/demo/contacts/handlers/DeleteContactHandler.java51
-rwxr-xr-xdemos/org.eclipse.fx.demo.contacts.app/src/org/eclipse/fx/demo/contacts/handlers/ExitHandler.java25
-rwxr-xr-xdemos/org.eclipse.fx.demo.contacts.app/src/org/eclipse/fx/demo/contacts/handlers/PasteHandler.java66
-rwxr-xr-xdemos/org.eclipse.fx.demo.contacts.app/src/org/eclipse/fx/demo/contacts/handlers/RedoHandler.java39
-rwxr-xr-xdemos/org.eclipse.fx.demo.contacts.app/src/org/eclipse/fx/demo/contacts/handlers/SwitchThemeHandler.java29
-rwxr-xr-xdemos/org.eclipse.fx.demo.contacts.app/src/org/eclipse/fx/demo/contacts/handlers/UndoHandler.java41
-rwxr-xr-xdemos/org.eclipse.fx.demo.contacts.app/src/org/eclipse/fx/demo/contacts/model/ContactsManager.java25
-rwxr-xr-xdemos/org.eclipse.fx.demo.contacts.app/src/org/eclipse/fx/demo/contacts/model/ContactsManagerImpl.java55
-rwxr-xr-xdemos/org.eclipse.fx.demo.contacts.app/src/org/eclipse/fx/demo/contacts/model/VCardContactsResource.java263
-rwxr-xr-xdemos/org.eclipse.fx.demo.contacts.app/src/org/eclipse/fx/demo/contacts/processors/AbstractThemeProcessor.java119
-rwxr-xr-xdemos/org.eclipse.fx.demo.contacts.app/src/org/eclipse/fx/demo/contacts/processors/MenuThemeProcessor.java73
-rwxr-xr-xdemos/org.eclipse.fx.demo.contacts.app/src/org/eclipse/fx/demo/contacts/processors/ToolbarThemeProcessor.java71
-rwxr-xr-xdemos/org.eclipse.fx.demo.contacts.app/src/org/eclipse/fx/demo/contacts/views/ContactsListView.java86
-rwxr-xr-xdemos/org.eclipse.fx.demo.contacts.app/src/org/eclipse/fx/demo/contacts/views/ContactsTableView.java104
-rwxr-xr-xdemos/org.eclipse.fx.demo.contacts.app/src/org/eclipse/fx/demo/contacts/views/ContactsTreeView.java102
-rwxr-xr-xdemos/org.eclipse.fx.demo.contacts.app/src/org/eclipse/fx/demo/contacts/views/ContextMenuProvider.java156
-rwxr-xr-xdemos/org.eclipse.fx.demo.contacts.app/src/org/eclipse/fx/demo/contacts/views/CustomFeedbackHandler.java34
-rwxr-xr-xdemos/org.eclipse.fx.demo.contacts.app/src/org/eclipse/fx/demo/contacts/views/DetailsView.java61
-rwxr-xr-xdemos/org.eclipse.fx.demo.contacts.app/src/org/eclipse/fx/demo/contacts/views/DetailsViewController.java150
-rwxr-xr-xdemos/org.eclipse.fx.demo.contacts.app/src/org/eclipse/fx/demo/contacts/views/details.fxml91
-rwxr-xr-xdemos/org.eclipse.fx.demo.contacts.app/src/org/eclipse/fx/demo/contacts/views/dummy.pngbin0 -> 3883 bytes
-rwxr-xr-xdemos/org.eclipse.fx.demo.contacts.app/vcards/Angelo ZERR.vcf61
-rwxr-xr-xdemos/org.eclipse.fx.demo.contacts.app/vcards/Boris Bokowski.vcf61
-rwxr-xr-xdemos/org.eclipse.fx.demo.contacts.app/vcards/Chris Aniszczyk.vcf66
-rwxr-xr-xdemos/org.eclipse.fx.demo.contacts.app/vcards/Hallvard Traetteberg.vcf64
-rwxr-xr-xdemos/org.eclipse.fx.demo.contacts.app/vcards/Kai Toedter.vcf16
-rwxr-xr-xdemos/org.eclipse.fx.demo.contacts.app/vcards/Kevin McGuire.vcf58
-rwxr-xr-xdemos/org.eclipse.fx.demo.contacts.app/vcards/Lars Vogel.vcf16
-rwxr-xr-xdemos/org.eclipse.fx.demo.contacts.app/vcards/Peter Friese.vcf61
-rwxr-xr-xdemos/org.eclipse.fx.demo.contacts.app/vcards/Tom Schindl.vcf55
-rwxr-xr-xdemos/org.eclipse.fx.demo.contacts.app/vcards/Torsten Sommer.vcf18
-rwxr-xr-xdemos/org.eclipse.fx.demo.contacts.app/vcards/Yves YANG.vcf68
80 files changed, 3355 insertions, 0 deletions
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 000000000..9d89fa03f
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1 @@
+/org.eclipse.osgi
diff --git a/bundles/runtime/.gitignore b/bundles/runtime/.gitignore
new file mode 100644
index 000000000..9d89fa03f
--- /dev/null
+++ b/bundles/runtime/.gitignore
@@ -0,0 +1 @@
+/org.eclipse.osgi
diff --git a/demos/org.eclipse.fx.demo.contacts.app/.classpath b/demos/org.eclipse.fx.demo.contacts.app/.classpath
new file mode 100755
index 000000000..098194ca4
--- /dev/null
+++ b/demos/org.eclipse.fx.demo.contacts.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/demos/org.eclipse.fx.demo.contacts.app/.gitignore b/demos/org.eclipse.fx.demo.contacts.app/.gitignore
new file mode 100755
index 000000000..4dc009173
--- /dev/null
+++ b/demos/org.eclipse.fx.demo.contacts.app/.gitignore
@@ -0,0 +1,2 @@
+/target
+/bin
diff --git a/demos/org.eclipse.fx.demo.contacts.app/.project b/demos/org.eclipse.fx.demo.contacts.app/.project
new file mode 100755
index 000000000..ef0866633
--- /dev/null
+++ b/demos/org.eclipse.fx.demo.contacts.app/.project
@@ -0,0 +1,39 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>org.eclipse.fx.demo.contacts.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>
+ <buildCommand>
+ <name>org.eclipse.xtext.ui.shared.xtextBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.ds.core.builder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ </buildSpec>
+ <natures>
+ <nature>org.eclipse.pde.PluginNature</nature>
+ <nature>org.eclipse.jdt.core.javanature</nature>
+ <nature>org.eclipse.xtext.ui.shared.xtextNature</nature>
+ </natures>
+</projectDescription>
diff --git a/demos/org.eclipse.fx.demo.contacts.app/.settings/org.eclipse.core.resources.prefs b/demos/org.eclipse.fx.demo.contacts.app/.settings/org.eclipse.core.resources.prefs
new file mode 100644
index 000000000..02db9ba99
--- /dev/null
+++ b/demos/org.eclipse.fx.demo.contacts.app/.settings/org.eclipse.core.resources.prefs
@@ -0,0 +1,6 @@
+eclipse.preferences.version=1
+encoding//src/org/eclipse/fx/demo/contacts/handlers/AddContactHandler.java=UTF-8
+encoding//src/org/eclipse/fx/demo/contacts/handlers/AddGroupHandler.java=UTF-8
+encoding//src/org/eclipse/fx/demo/contacts/handlers/PasteHandler.java=UTF-8
+encoding//src/org/eclipse/fx/demo/contacts/handlers/SwitchThemeHandler.java=UTF-8
+encoding//src/org/eclipse/fx/demo/contacts/processors/AbstractThemeProcessor.java=UTF-8
diff --git a/demos/org.eclipse.fx.demo.contacts.app/.settings/org.eclipse.jdt.core.prefs b/demos/org.eclipse.fx.demo.contacts.app/.settings/org.eclipse.jdt.core.prefs
new file mode 100644
index 000000000..f42de363a
--- /dev/null
+++ b/demos/org.eclipse.fx.demo.contacts.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/demos/org.eclipse.fx.demo.contacts.app/Application.e4xmi b/demos/org.eclipse.fx.demo.contacts.app/Application.e4xmi
new file mode 100755
index 000000000..3c136dd70
--- /dev/null
+++ b/demos/org.eclipse.fx.demo.contacts.app/Application.e4xmi
@@ -0,0 +1,78 @@
+<?xml version="1.0" encoding="ASCII"?>
+<application:Application xmi:version="2.0" xmlns:xmi="http://www.omg.org/XMI" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 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" xsi:schemaLocation="http://www.eclipse.org/ui/2010/UIModel/application/ui/basic http://www.eclipse.org/ui/2010/UIModel/application#//ui/basic http://www.eclipse.org/ui/2010/UIModel/application/ui/menu http://www.eclipse.org/ui/2010/UIModel/application#//ui/menu" xmi:id="_GRxcMXk5Ed-55voCTyIpVQ" bindingContexts="_SeXUHO8EEd6FC9cDb6iV7y">
+ <children xsi:type="basic:TrimmedWindow" xmi:id="_SeXUAe8EEd6FC9cDb6iV7g" elementId="_SeXUAe8EEd6FC9cDb6iV7g" label="%windowTitle" x="20" y="20" width="700" height="570">
+ <tags>no-decoration#topdecoration.fxml</tags>
+ <children xsi:type="basic:PartSashContainer" xmi:id="_SeXUCu8EEd6FC9cDb6iV7g" elementId="_SeXUCu8EEd6FC9cDb6iV7g" horizontal="true">
+ <children xsi:type="basic:PartStack" xmi:id="_SeXUC-8EEd6FC9cDb6iV7g" elementId="_SeXUC-8EEd6FC9cDb6iV7g" containerData="30">
+ <children xsi:type="basic:Part" xmi:id="_SeXUDO8EEd6FC9cDb6iV7g" elementId="ContactsView" contributionURI="bundleclass://org.eclipse.fx.demo.contacts.app/org.eclipse.fx.demo.contacts.views.ContactsTreeView" label="%contactsTree" iconURI="platform:/plugin/org.eclipse.fx.demo.contacts.app/icons/silk/folder_user.png" tooltip="%contactsTooltip"/>
+ <children xsi:type="basic:Part" xmi:id="_OI8-sDb3EeKZBafm86UM9A" elementId="org.eclipse.fx.demo.contacts.app.parts.contactsTableView" contributionURI="bundleclass://org.eclipse.fx.demo.contacts.app/org.eclipse.fx.demo.contacts.views.ContactsTableView" label="%contactsTable" iconURI="platform:/plugin/org.eclipse.fx.demo.contacts.app/icons/silk/folder_user.png"/>
+ <children xsi:type="basic:Part" xmi:id="_DCqj8DmuEeKZ7fX033HQVQ" elementId="org.eclipse.fx.demo.contacts.app.parts.contactsListView" contributionURI="bundleclass://org.eclipse.fx.demo.contacts.app/org.eclipse.fx.demo.contacts.views.ContactsListView" label="%contactsList" iconURI="platform:/plugin/org.eclipse.fx.demo.contacts.app/icons/silk/folder_user.png"/>
+ </children>
+ <children xsi:type="basic:PartStack" xmi:id="_SeXUDe8EEd6FC9cDb6iV7g" elementId="org.eclipse.fx.demo.contacts.partstacks.second" containerData="70">
+ <children xsi:type="basic:Part" xmi:id="DetailsView" elementId="DetailsView" contributionURI="bundleclass://org.eclipse.fx.demo.contacts.app/org.eclipse.fx.demo.contacts.views.DetailsView" label="%partDetails" iconURI="platform:/plugin/org.eclipse.fx.demo.contacts.app/icons/silk/report_user.png" tooltip="%detailsTooltip"/>
+ </children>
+ </children>
+ <mainMenu xmi:id="menu:org.eclipse.ui.main.menu" elementId="menu:org.eclipse.ui.main.menu">
+ <children xsi:type="menu:Menu" xmi:id="_SeXUD-8EEd6FC9cDb6iV7g" elementId="_SeXUD-8EEd6FC9cDb6iV7g" label="%fileMenu">
+ <children xsi:type="menu:HandledMenuItem" xmi:id="_SeXUEe8EEd6FC9cDb6iV7g" elementId="_SeXUEe8EEd6FC9cDb6iV7g" label="%menuLabelDelete" iconURI="platform:/plugin/org.eclipse.fx.demo.contacts.app/icons/silk/user_delete.png" command="contacts.delete"/>
+ <children xsi:type="menu:DirectMenuItem" xmi:id="_SeXUEu8EEd6FC9cDb6iV7g" elementId="_SeXUEu8EEd6FC9cDb6iV7g" label="%menuLabelDirectExit" contributionURI="bundleclass://org.eclipse.fx.demo.contacts.app/org.eclipse.fx.demo.contacts.handlers.ExitHandler"/>
+ <children xsi:type="menu:HandledMenuItem" xmi:id="_SeXUE-8EEd6FC9cDb6iV7g" elementId="_SeXUE-8EEd6FC9cDb6iV7g" label="%menuLabelExit" command="contacts.exit"/>
+ </children>
+ <children xsi:type="menu:Menu" xmi:id="_0oZ9EDZ8EeKZBafm86UM9A" elementId="org.eclipse.fx.demo.contacts.app.menus.edit" label="%editMenu">
+ <children xsi:type="menu:HandledMenuItem" xmi:id="_CQyeUDZ9EeKZBafm86UM9A" elementId="" label="%menuLabelCut" iconURI="platform:/plugin/org.eclipse.fx.demo.contacts.app/icons/silk/cut.png" command="_9rAmADZ8EeKZBafm86UM9A"/>
+ <children xsi:type="menu:HandledMenuItem" xmi:id="_218HcDaDEeKZBafm86UM9A" elementId="" label="%menuLabelCopy" iconURI="platform:/plugin/org.eclipse.fx.demo.contacts.app/icons/silk/page_copy.png" command="_fe4hcDaDEeKZBafm86UM9A"/>
+ <children xsi:type="menu:HandledMenuItem" xmi:id="_98J8MDaDEeKZBafm86UM9A" elementId="" label="%menuLabelPaste" iconURI="platform:/plugin/org.eclipse.fx.demo.contacts.app/icons/silk/page_paste.png" command="_jc-HoDaDEeKZBafm86UM9A"/>
+ </children>
+ </mainMenu>
+ <trimBars xmi:id="_SeXUAu8EEd6FC9cDb6iV7g" elementId="toolbar:org.eclipse.ui.main.toolbar">
+ <children xsi:type="menu:ToolBar" xmi:id="_6RnVUE8FEeCyZoR8urPqaw" elementId="">
+ <children xsi:type="menu:HandledToolItem" xmi:id="_Y-d8MC3iEeKA67t6AqYX1w" elementId="" iconURI="platform:/plugin/org.eclipse.fx.demo.contacts.app/icons/silk/folder_add.png" tooltip="%menuLabelAddGroup" command="_8GIe8C3hEeKA67t6AqYX1w"/>
+ <children xsi:type="menu:HandledToolItem" xmi:id="_J5b-IC3fEeKA67t6AqYX1w" elementId="" iconURI="platform:/plugin/org.eclipse.fx.demo.contacts.app/icons/silk/user_add.png" tooltip="%menuLabelAddContact" command="_k20AAC3eEeKA67t6AqYX1w"/>
+ <children xsi:type="menu:HandledToolItem" xmi:id="_Vw4jUE8FEeCyZoR8urPqaw" label="" iconURI="platform:/plugin/org.eclipse.fx.demo.contacts.app/icons/silk/user_delete.png" tooltip="%menuLabelDelete" command="contacts.delete"/>
+ <children xsi:type="menu:HandledToolItem" xmi:id="_SZWWYCxCEeKKgKdy48tDJg" elementId="org.eclipse.fx.demo.contacts.handledtoolitems.undo" label="" iconURI="platform:/plugin/org.eclipse.fx.demo.contacts.app/icons/silk/arrow_undo.png" tooltip="%menuLabelUndo" command="_YYAtMCxCEeKKgKdy48tDJg"/>
+ <children xsi:type="menu:HandledToolItem" xmi:id="_UOyGoCxFEeKKgKdy48tDJg" elementId="org.eclipse.fx.demo.contacts.handledtoolitem.0" label="" iconURI="platform:/plugin/org.eclipse.fx.demo.contacts.app/icons/silk/arrow_redo.png" tooltip="%menuLabelRedo" command="_K6SccCxFEeKKgKdy48tDJg"/>
+ </children>
+ </trimBars>
+ </children>
+ <handlers xmi:id="_SeXUF-8EEd6FC9cDb6iV7g" elementId="_SeXUF-8EEd6FC9cDb6iV7g" contributionURI="bundleclass://org.eclipse.fx.demo.contacts.app/org.eclipse.fx.demo.contacts.handlers.ExitHandler" command="contacts.exit"/>
+ <handlers xmi:id="_SeXUGe8EEd6FC9cDb6iV7g" elementId="_SeXUGe8EEd6FC9cDb6iV7g" contributionURI="bundleclass://org.eclipse.fx.demo.contacts.app/org.eclipse.fx.demo.contacts.handlers.DeleteContactHandler" command="contacts.delete"/>
+ <handlers xmi:id="_SeXUG=8EEd6FC9cDb6iV7g" elementId="_SeXUG=8EEd6FC9cDb6iV7g" contributionURI="bundleclass://org.eclipse.fx.demo.contacts.app/org.eclipse.fx.demo.contacts.handlers.SwitchThemeHandler" command="contacts.switchTheme"/>
+ <handlers xmi:id="_B-yL8CxDEeKKgKdy48tDJg" elementId="org.eclipse.fx.demo.contacts.handlers.undo" contributionURI="bundleclass://org.eclipse.fx.demo.contacts.app/org.eclipse.fx.demo.contacts.handlers.UndoHandler" command="_YYAtMCxCEeKKgKdy48tDJg"/>
+ <handlers xmi:id="_IDToQCxFEeKKgKdy48tDJg" elementId="org.eclipse.fx.demo.contacts.handlers.redo" contributionURI="bundleclass://org.eclipse.fx.demo.contacts.app/org.eclipse.fx.demo.contacts.handlers.RedoHandler" command="_K6SccCxFEeKKgKdy48tDJg"/>
+ <handlers xmi:id="_8qTqYC3eEeKA67t6AqYX1w" elementId="org.eclipse.fx.demo.contacts.handlers.addContact" contributionURI="bundleclass://org.eclipse.fx.demo.contacts.app/org.eclipse.fx.demo.contacts.handlers.AddContactHandler" command="_k20AAC3eEeKA67t6AqYX1w"/>
+ <handlers xmi:id="_EPhA4C3iEeKA67t6AqYX1w" elementId="org.eclipse.fx.demo.contacts.handlers.AddGroup" contributionURI="bundleclass://org.eclipse.fx.demo.contacts.app/org.eclipse.fx.demo.contacts.handlers.AddGroupHandler" command="_8GIe8C3hEeKA67t6AqYX1w"/>
+ <handlers xmi:id="_KcZ04DZ9EeKZBafm86UM9A" elementId="org.eclipse.fx.demo.contacts.app.handlers.Cut" contributionURI="bundleclass://org.eclipse.fx.demo.contacts.app/org.eclipse.fx.demo.contacts.handlers.CutHandler" command="_9rAmADZ8EeKZBafm86UM9A"/>
+ <handlers xmi:id="_o3IDMDaDEeKZBafm86UM9A" elementId="" contributionURI="bundleclass://org.eclipse.fx.demo.contacts.app/org.eclipse.fx.demo.contacts.handlers.CopyHandler" command="_fe4hcDaDEeKZBafm86UM9A"/>
+ <handlers xmi:id="_w-ImkDaDEeKZBafm86UM9A" elementId="" contributionURI="bundleclass://org.eclipse.fx.demo.contacts.app/org.eclipse.fx.demo.contacts.handlers.PasteHandler" command="_jc-HoDaDEeKZBafm86UM9A"/>
+ <bindingTables xmi:id="_SeXUEO8EEd6FC9cDb6iV7x" elementId="_SeXUEO8EEd6FC9cDb6iV7x" bindingContext="_SeXUHO8EEd6FC9cDb6iV7y">
+ <bindings xmi:id="_SeXUH-8EEd6FC9cDb6iV7g" elementId="_SeXUH-8EEd6FC9cDb6iV7g" keySequence="CTRL+D" command="contacts.delete"/>
+ <bindings xmi:id="_SeXUIO8EEd6FC9cDb6iV7g" elementId="_SeXUIO8EEd6FC9cDb6iV7g" keySequence="CTRL+Q" command="contacts.exit"/>
+ <bindings xmi:id="_qMtB8DZ2EeKZBafm86UM9A" keySequence="CTRL+Z" command="_YYAtMCxCEeKKgKdy48tDJg"/>
+ <bindings xmi:id="_y4qsgDZ2EeKZBafm86UM9A" keySequence="CTRL+Y" command="_K6SccCxFEeKKgKdy48tDJg"/>
+ <bindings xmi:id="_tYHqADyVEeKgOtnn6QUdKw" keySequence="CTRL+X" command="_9rAmADZ8EeKZBafm86UM9A"/>
+ <bindings xmi:id="_3tYNoDyVEeKgOtnn6QUdKw" keySequence="CTRL+C" command="_fe4hcDaDEeKZBafm86UM9A"/>
+ <bindings xmi:id="_8zRJYDyVEeKgOtnn6QUdKw" keySequence="CTRL+V" command="_jc-HoDaDEeKZBafm86UM9A"/>
+ </bindingTables>
+ <rootContext xmi:id="_SeXUHO8EEd6FC9cDb6iV7y" elementId="org.eclipse.ui.contexts.dialogAndWindow" name="In Dialog and Windows">
+ <children xmi:id="_SeXUEO8EEd6FC9cDb6iV7w" elementId="org.eclipse.ui.contexts.window" name="In Windows"/>
+ <children xmi:id="_SeXUEO8EEd6FC9cDb6iV7x" elementId="org.eclipse.ui.contexts.dialog" name="In Dialogs"/>
+ </rootContext>
+ <commands xmi:id="contacts.exit" elementId="contacts.exit" commandName="%menuLabelExit" description=""/>
+ <commands xmi:id="contacts.delete" elementId="contacts.delete" commandName="%menuLabelDelete" description=""/>
+ <commands xmi:id="contacts.switchTheme" elementId="contacts.switchTheme" commandName="%menuLabelSwitchTheme" description="">
+ <parameters xmi:id="contacts.commands.switchtheme.themeid" elementId="contacts.commands.switchtheme.themeid" name="Theme Id" typeId="" optional="false"/>
+ </commands>
+ <commands xmi:id="_YYAtMCxCEeKKgKdy48tDJg" elementId="contacts.undo" commandName="%menuLabelUndo"/>
+ <commands xmi:id="_K6SccCxFEeKKgKdy48tDJg" elementId="contacts.redo" commandName="%menuLabelRedo"/>
+ <commands xmi:id="_k20AAC3eEeKA67t6AqYX1w" elementId="org.eclipse.fx.demo.contacts.commands.addContact" commandName="%menuLabelAddContact"/>
+ <commands xmi:id="_8GIe8C3hEeKA67t6AqYX1w" elementId="org.eclipse.fx.demo.contacts.commands.AddGroup" commandName="%menuLabelAddGroup" description=""/>
+ <commands xmi:id="_9rAmADZ8EeKZBafm86UM9A" elementId="org.eclipse.fx.demo.contacts.app.commands.cut" commandName="%menuLabelCut"/>
+ <commands xmi:id="_fe4hcDaDEeKZBafm86UM9A" elementId="org.eclipse.fx.demo.contacts.app.commands.copy" commandName="%menuLabelCopy"/>
+ <commands xmi:id="_jc-HoDaDEeKZBafm86UM9A" elementId="org.eclipse.fx.demo.contacts.app.commands.paste" commandName="%menuLabelPaste"/>
+ <addons xmi:id="_XGB3wPZlEd-XstlTZ6nTXg" elementId="org.eclipse.e4.core.commands.service" contributionURI="bundleclass://org.eclipse.e4.core.commands/org.eclipse.e4.core.commands.CommandServiceAddon"/>
+ <addons xmi:id="_XGB3wPZlEd-XstlTZ6nTXh" elementId="org.eclipse.e4.ui.contexts.service" contributionURI="bundleclass://org.eclipse.e4.ui.services/org.eclipse.e4.ui.services.ContextServiceAddon"/>
+ <addons xmi:id="_ViIQQBnuEeKroetix5qA3A" elementId="org.eclipse.fx.demo.contacts.addon.0" contributionURI="bundleclass://org.eclipse.fx.ui.keybindings.e4/org.eclipse.fx.ui.keybindings.e4.BindingServiceAddon"/>
+ <addons xmi:id="_LK0NgPZmEd-XstlTZ6nTXj" 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="_LK0NgPZmEd-XstlTZ6nTXk" 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="_W5TekBnuEeKroetix5qA3A" elementId="org.eclipse.fx.demo.contacts.addon.1" contributionURI="bundleclass://org.eclipse.fx.ui.keybindings.e4/org.eclipse.fx.ui.keybindings.e4.BindingProcessingAddon"/>
+</application:Application>
diff --git a/demos/org.eclipse.fx.demo.contacts.app/IP_TODOS.txt b/demos/org.eclipse.fx.demo.contacts.app/IP_TODOS.txt
new file mode 100755
index 000000000..1400c0596
--- /dev/null
+++ b/demos/org.eclipse.fx.demo.contacts.app/IP_TODOS.txt
@@ -0,0 +1,24 @@
+e4 icons:
+---------
+css/blue.png
+css/bright.png
+css/dark.png
+
+FAM-FAM-FAM (Creative Commons Attribution 2.5 License):
+-------------------------------------------------------
+icons/slik/arrow_redo.png
+icons/slik/arrow_undo.png
+icons/slik/bright.png
+icons/slik/cross.png
+icons/slik/cut.png
+icons/slik/dark.png
+icons/slik/disk.png
+icons/slik/door_in.png
+icons/slik/folder_add.png
+icons/slik/folder_user.png
+icons/slik/folder.png
+icons/slik/page_copy.png
+icons/slik/page_paste.png
+icons/slik/report_user.png
+icons/slik/user_add.png
+icons/slik/user_delete.png \ No newline at end of file
diff --git a/demos/org.eclipse.fx.demo.contacts.app/META-INF/MANIFEST.MF b/demos/org.eclipse.fx.demo.contacts.app/META-INF/MANIFEST.MF
new file mode 100755
index 000000000..6eaf39f84
--- /dev/null
+++ b/demos/org.eclipse.fx.demo.contacts.app/META-INF/MANIFEST.MF
@@ -0,0 +1,71 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: Contacts Plug-in (Incubation)
+Bundle-SymbolicName: org.eclipse.fx.demo.contacts.app;singleton:=true
+Bundle-Version: 0.9.1.qualifier
+Bundle-RequiredExecutionEnvironment: JavaSE-1.7
+Require-Bundle: org.eclipse.core.runtime,
+ org.eclipse.fx.ui.application,
+ org.eclipse.fx.ui.workbench.fx,
+ javax.inject;bundle-version="1.0.0",
+ org.eclipse.e4.ui.model.workbench;bundle-version="0.9.1",
+ org.eclipse.e4.core.services;bundle-version="0.9.1",
+ org.eclipse.e4.core.di;bundle-version="0.9.0",
+ org.eclipse.e4.core.di.extensions;bundle-version="0.9.0",
+ org.eclipse.fx.ui.di,
+ org.eclipse.e4.core.contexts;bundle-version="0.9.0",
+ org.eclipse.fx.ui.databinding;bundle-version="0.8.1",
+ org.eclipse.core.databinding;bundle-version="1.4.0",
+ org.eclipse.core.databinding.beans;bundle-version="1.2.100",
+ org.eclipse.core.databinding.observable;bundle-version="1.4.0",
+ org.eclipse.core.databinding.property;bundle-version="1.4.0",
+ org.eclipse.e4.ui.services;bundle-version="0.9.0",
+ org.eclipse.e4.ui.workbench;bundle-version="0.9.1",
+ org.eclipse.core.commands;bundle-version="3.6.0",
+ org.eclipse.e4.core.commands;bundle-version="0.9.0",
+ org.eclipse.fx.ui.services;bundle-version="0.8.1",
+ org.eclipse.fx.demo.contacts;bundle-version="1.0.0",
+ org.eclipse.fx.demo.contacts.edit;bundle-version="1.0.0",
+ org.eclipse.fx.emf.databinding;bundle-version="0.8.1",
+ org.eclipse.fx.emf.edit.ui;bundle-version="0.8.1"
+Import-Package: javafx.animation;version="2.0.0",
+ javafx.application;version="2.0.0",
+ javafx.beans;version="2.0.0",
+ javafx.beans.binding;version="2.0.0",
+ javafx.beans.property;version="2.0.0",
+ javafx.beans.value;version="2.0.0",
+ javafx.collections;version="2.0.0",
+ javafx.concurrent;version="2.0.0",
+ javafx.embed.swing;version="2.0.0",
+ javafx.event;version="2.0.0",
+ javafx.fxml;version="2.0.0",
+ javafx.geometry;version="2.0.0",
+ javafx.scene;version="2.0.0",
+ javafx.scene.chart;version="2.0.0",
+ javafx.scene.control;version="2.0.0",
+ javafx.scene.control.cell;version="2.0.0",
+ javafx.scene.effect;version="2.0.0",
+ javafx.scene.image;version="2.0.0",
+ javafx.scene.input;version="2.0.0",
+ javafx.scene.layout;version="2.0.0",
+ javafx.scene.media;version="2.0.0",
+ javafx.scene.paint;version="2.0.0",
+ javafx.scene.shape;version="2.0.0",
+ javafx.scene.text;version="2.0.0",
+ javafx.scene.transform;version="2.0.0",
+ javafx.scene.web;version="2.0.0",
+ javafx.stage;version="2.0.0",
+ javafx.util;version="2.0.0",
+ javax.annotation;version="1.0.0"
+Bundle-ActivationPolicy: lazy
+Bundle-Vendor: Eclipse.org
+Bundle-Activator: org.eclipse.fx.demo.contacts.BundleActivatorImpl
+Bundle-Localization: plugin
+Service-Component: OSGI-INF/component.xml
+Export-Package: org.eclipse.fx.demo.contacts,
+ org.eclipse.fx.demo.contacts.handlers,
+ org.eclipse.fx.demo.contacts.model,
+ org.eclipse.fx.demo.contacts.processors,
+ org.eclipse.fx.demo.contacts.views
+
+
diff --git a/demos/org.eclipse.fx.demo.contacts.app/OSGI-INF/component.xml b/demos/org.eclipse.fx.demo.contacts.app/OSGI-INF/component.xml
new file mode 100755
index 000000000..2a2b32aa3
--- /dev/null
+++ b/demos/org.eclipse.fx.demo.contacts.app/OSGI-INF/component.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0" name="org.eclipse.fx.demo.contacts.ContactsManager">
+ <implementation class="org.eclipse.fx.demo.contacts.model.ContactsManagerImpl"/>
+ <service>
+ <provide interface="org.eclipse.fx.demo.contacts.model.ContactsManager"/>
+ </service>
+</scr:component>
diff --git a/demos/org.eclipse.fx.demo.contacts.app/build.properties b/demos/org.eclipse.fx.demo.contacts.app/build.properties
new file mode 100755
index 000000000..6827a4f3e
--- /dev/null
+++ b/demos/org.eclipse.fx.demo.contacts.app/build.properties
@@ -0,0 +1,17 @@
+output.. = bin/
+bin.includes = META-INF/,\
+ .,\
+ plugin.xml,\
+ images/,\
+ icons/,\
+ images/,\
+ Application.e4xmi,\
+ css/,\
+ splash.bmp,\
+ plugin_customization.ini,\
+ vcards/,\
+ plugin_ru.properties,\
+ plugin.properties,\
+ OSGI-INF/component.xml,\
+ OSGI-INF/component.xml
+source.. = src/
diff --git a/demos/org.eclipse.fx.demo.contacts.app/contacts.product b/demos/org.eclipse.fx.demo.contacts.app/contacts.product
new file mode 100755
index 000000000..5b3be890c
--- /dev/null
+++ b/demos/org.eclipse.fx.demo.contacts.app/contacts.product
@@ -0,0 +1,103 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?pde version="3.5"?>
+
+<product name="E4 Contacs Demo" uid="org.eclipse.e4.demo.contacts.product" id="org.eclipse.fx.demo.contacts.app.product" application="org.eclipse.fx.ui.workbench.fx.application" version="1.0.0" useFeatures="false" includeLaunchers="true">
+
+ <configIni use="default">
+ </configIni>
+
+ <launcherArgs>
+ <vmArgs>-Dosgi.framework.extensions=org.eclipse.fx.osgi</vmArgs>
+ <vmArgsMac>-XstartOnFirstThread -Dorg.eclipse.swt.internal.carbon.smallFonts</vmArgsMac>
+ </launcherArgs>
+
+ <windowImages/>
+
+ <splash
+ location="org.eclipse.e4.demo.contacts"
+ startupProgressRect="5,275,445,15"
+ startupMessageRect="7,252,445,20"
+ startupForegroundColor="FFFFFF" />
+ <launcher>
+ <solaris/>
+ <win useIco="false">
+ <bmp/>
+ </win>
+ </launcher>
+
+ <vm>
+ </vm>
+
+ <plugins>
+ <plugin id="com.ibm.icu"/>
+ <plugin id="javax.annotation"/>
+ <plugin id="javax.inject"/>
+ <plugin id="javax.servlet"/>
+ <plugin id="javax.xml"/>
+ <plugin id="org.eclipse.ant.core"/>
+ <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.jobs"/>
+ <plugin id="org.eclipse.core.resources"/>
+ <plugin id="org.eclipse.core.runtime"/>
+ <plugin id="org.eclipse.core.runtime.compatibility.registry" fragment="true"/>
+ <plugin id="org.eclipse.core.variables"/>
+ <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.di"/>
+ <plugin id="org.eclipse.e4.ui.model.workbench"/>
+ <plugin id="org.eclipse.e4.ui.services"/>
+ <plugin id="org.eclipse.e4.ui.workbench"/>
+ <plugin id="org.eclipse.emf.common"/>
+ <plugin id="org.eclipse.emf.ecore"/>
+ <plugin id="org.eclipse.emf.ecore.change"/>
+ <plugin id="org.eclipse.emf.ecore.xmi"/>
+ <plugin id="org.eclipse.emf.edit"/>
+ <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.fx.core"/>
+ <plugin id="org.eclipse.fx.core.databinding"/>
+ <plugin id="org.eclipse.fx.demo.contacts"/>
+ <plugin id="org.eclipse.fx.demo.contacts.app"/>
+ <plugin id="org.eclipse.fx.demo.contacts.edit"/>
+ <plugin id="org.eclipse.fx.emf.databinding"/>
+ <plugin id="org.eclipse.fx.emf.edit.ui"/>
+ <plugin id="org.eclipse.fx.javafx"/>
+ <plugin id="org.eclipse.fx.osgi" fragment="true"/>
+ <plugin id="org.eclipse.fx.osgi.util"/>
+ <plugin id="org.eclipse.fx.ui.application"/>
+ <plugin id="org.eclipse.fx.ui.databinding"/>
+ <plugin id="org.eclipse.fx.ui.di"/>
+ <plugin id="org.eclipse.fx.ui.dialogs"/>
+ <plugin id="org.eclipse.fx.ui.keybindings"/>
+ <plugin id="org.eclipse.fx.ui.keybindings.e4"/>
+ <plugin id="org.eclipse.fx.ui.keybindings.generic"/>
+ <plugin id="org.eclipse.fx.ui.panes"/>
+ <plugin id="org.eclipse.fx.ui.services"/>
+ <plugin id="org.eclipse.fx.ui.theme"/>
+ <plugin id="org.eclipse.fx.ui.workbench.base"/>
+ <plugin id="org.eclipse.fx.ui.workbench.fx"/>
+ <plugin id="org.eclipse.fx.ui.workbench.fx.controls"/>
+ <plugin id="org.eclipse.fx.ui.workbench.renderers.base"/>
+ <plugin id="org.eclipse.fx.ui.workbench.renderers.fx"/>
+ <plugin id="org.eclipse.osgi"/>
+ <plugin id="org.eclipse.osgi.services"/>
+ </plugins>
+
+
+</product>
diff --git a/demos/org.eclipse.fx.demo.contacts.app/css/blue.css b/demos/org.eclipse.fx.demo.contacts.app/css/blue.css
new file mode 100755
index 000000000..ced94cc3c
--- /dev/null
+++ b/demos/org.eclipse.fx.demo.contacts.app/css/blue.css
@@ -0,0 +1,104 @@
+.root {
+ -fx-base: #7eaacc;
+ -fx-background: #7eaacc;
+ -fx-control-inner-background: white;
+}
+
+.tab {
+ -fx-background-color: linear-gradient(to top, -fx-base, derive(-fx-base,30%));
+}
+
+.button {
+ -fx-background-color: transparent;
+ -fx-padding: 4;
+}
+
+.button:hover {
+ -fx-background-color: -fx-shadow-highlight-color, -fx-outer-border, -fx-inner-border, -fx-body-color;
+ -fx-color: -fx-hover-base;
+}
+
+.tool-bar:horizontal .separator {
+ -fx-orientation: vertical;
+ -fx-padding: 2 0 2 0;
+}
+
+.table-view {
+ -fx-table-cell-border-color:derive(-fx-base,+10%);
+ -fx-table-header-border-color:derive(-fx-base,+20%);
+}
+
+.split-pane:horizontal > * > .split-pane-divider {
+ -fx-border-color: transparent -fx-base transparent -fx-base;
+ -fx-background-color: transparent, derive(-fx-base,20%);
+ -fx-background-insets: 0, 0 1 0 1;
+}
+
+.menu-bar {
+ -fx-background-color: linear-gradient(to bottom, #7eaacc, derive(#7eaacc,+50%));
+ }
+
+.menu-bar .menu .label {
+ -fx-padding: 0.333em 0.5em 0.333em 0.5em; /* 4 6 4 6*/
+ -fx-text-fill: black;
+}
+
+.my-gridpane {
+ -fx-background-color: radial-gradient(radius 100%, derive(-fx-base,70%), derive(-fx-base,20%));
+}
+
+.separator-label {
+ -fx-text-fill: derive(-fx-base,-50%) ;
+}
+
+#window-resize-button {
+ -fx-background-image: url("images/window-corner.png");
+ -fx-background-position: right 1px bottom 1px;
+ -fx-background-repeat: no-repeat;
+}
+
+#window_close {
+ -fx-font-size: 1px;
+ -fx-background-color: null;
+ -fx-background-image: url("images/window-close.png");
+ -fx-padding: 6 6 4 6;
+}
+
+#window_min {
+ -fx-font-size: 1px;
+ -fx-background-color: null;
+ -fx-background-image: url("images/window-min.png");
+ -fx-padding: 6 6 4 6;
+}
+
+#window_max {
+ -fx-font-size: 1px;
+ -fx-background-color: null;
+ -fx-background-image: url("images/window-expand.png");
+ -fx-padding: 6 6 4 6;
+}
+
+#window_close:hover {
+ -fx-background-image: url("images/window-close-over.png");
+}
+
+#window_min:hover {
+ -fx-background-image: url("images/window-min-over.png");
+}
+
+#window_max:hover {
+ -fx-background-image: url("images/window-expand-over.png");
+}
+
+.MTrimBar {
+ -fx-background-color:
+ linear-gradient(to bottom, derive(-fx-base,-30%), derive(-fx-base,-60%)),
+ linear-gradient(to bottom, derive(-fx-base,65%) 2%, derive(-fx-base,-20%) 95%);
+}
+
+.MTrimBar .tool-bar {
+ -fx-border-style: solid;
+ -fx-background-color: null;
+ -fx-border-color: null;
+ -fx-border-width: 0px;
+} \ No newline at end of file
diff --git a/demos/org.eclipse.fx.demo.contacts.app/css/blue.png b/demos/org.eclipse.fx.demo.contacts.app/css/blue.png
new file mode 100755
index 000000000..aac83ea0f
--- /dev/null
+++ b/demos/org.eclipse.fx.demo.contacts.app/css/blue.png
Binary files differ
diff --git a/demos/org.eclipse.fx.demo.contacts.app/css/bright.css b/demos/org.eclipse.fx.demo.contacts.app/css/bright.css
new file mode 100755
index 000000000..1beae7fc3
--- /dev/null
+++ b/demos/org.eclipse.fx.demo.contacts.app/css/bright.css
@@ -0,0 +1,85 @@
+.root {
+ -fx-base: #d0d0d0;
+ -fx-background: #f4f4f4;
+ -fx-control-inner-background: white;
+}
+
+.menu-bar {
+ -fx-background-color: linear-gradient(to bottom, #d0d0d0, derive(#d0d0d0,+50%));
+ -fx-text-fill: black;
+}
+
+.menu-bar .menu .label {
+ -fx-padding: 0.333em 0.5em 0.333em 0.5em; /* 4 6 4 6*/
+ -fx-text-fill: black;
+}
+
+.my-gridpane {
+ -fx-background-color: radial-gradient(radius 100%, derive(-fx-base,70%), derive(-fx-base,20%));
+}
+
+.separator-label {
+ -fx-text-fill: steelblue ;
+}
+
+.button {
+ -fx-background-color: transparent;
+ -fx-padding: 4;
+}
+
+.button:hover {
+ -fx-background-color: -fx-shadow-highlight-color, -fx-outer-border, -fx-inner-border, -fx-body-color;
+ -fx-color: -fx-hover-base;
+}
+
+#window-resize-button {
+ -fx-background-image: url("images/window-corner.png");
+ -fx-background-position: right 1px bottom 1px;
+ -fx-background-repeat: no-repeat;
+}
+
+#window_close {
+ -fx-font-size: 1px;
+ -fx-background-color: null;
+ -fx-background-image: url("images/window-close.png");
+ -fx-padding: 6 6 4 6;
+}
+
+#window_min {
+ -fx-font-size: 1px;
+ -fx-background-color: null;
+ -fx-background-image: url("images/window-min.png");
+ -fx-padding: 6 6 4 6;
+}
+
+#window_max {
+ -fx-font-size: 1px;
+ -fx-background-color: null;
+ -fx-background-image: url("images/window-expand.png");
+ -fx-padding: 6 6 4 6;
+}
+
+#window_close:hover {
+ -fx-background-image: url("images/window-close-over.png");
+}
+
+#window_min:hover {
+ -fx-background-image: url("images/window-min-over.png");
+}
+
+#window_max:hover {
+ -fx-background-image: url("images/window-expand-over.png");
+}
+
+.MTrimBar {
+ -fx-background-color:
+ linear-gradient(to bottom, derive(-fx-base,-30%), derive(-fx-base,-60%)),
+ linear-gradient(to bottom, derive(-fx-base,65%) 2%, derive(-fx-base,-20%) 95%);
+}
+
+.MTrimBar .tool-bar {
+ -fx-border-style: solid;
+ -fx-background-color: null;
+ -fx-border-color: null;
+ -fx-border-width: 0px;
+} \ No newline at end of file
diff --git a/demos/org.eclipse.fx.demo.contacts.app/css/bright.png b/demos/org.eclipse.fx.demo.contacts.app/css/bright.png
new file mode 100755
index 000000000..ed1021257
--- /dev/null
+++ b/demos/org.eclipse.fx.demo.contacts.app/css/bright.png
Binary files differ
diff --git a/demos/org.eclipse.fx.demo.contacts.app/css/dark.css b/demos/org.eclipse.fx.demo.contacts.app/css/dark.css
new file mode 100755
index 000000000..6c2b79326
--- /dev/null
+++ b/demos/org.eclipse.fx.demo.contacts.app/css/dark.css
@@ -0,0 +1,132 @@
+.root {
+ -fx-base: rgb(50, 50, 50);
+ -fx-background: rgb(50, 50, 50);
+ -fx-control-inner-background: rgb(50, 50, 50);
+}
+
+.tab {
+ -fx-background-color: linear-gradient(to top, -fx-base, derive(-fx-base,30%));
+}
+
+.menu-bar {
+ -fx-background-color: linear-gradient(to bottom, -fx-base, derive(-fx-base,30%));
+}
+
+.MTrimBar {
+ -fx-background-color:
+ linear-gradient(to bottom, derive(-fx-base,+50%),derive(-fx-base,-40%), derive(-fx-base,-20%));
+}
+
+.tool-bar:horizontal {
+ -fx-background-color:
+ linear-gradient(to bottom, derive(-fx-base,+50%), derive(-fx-base,-40%), derive(-fx-base,-20%));
+}
+
+.tool-bar:vertical {
+ -fx-background-color: linear-gradient(to bottom, derive(-fx-base,-50%), derive(-fx-base,-40%), derive(-fx-base,-20%));
+}
+
+.tool-bar .separator:vertical .line {
+ -fx-border-style: solid;
+ -fx-background-color: null;
+ -fx-border-color: transparent transparent derive(-fx-base,-35%) derive(-fx-base,+15%);
+}
+
+.tool-bar .separator:horizontal .line {
+ -fx-border-style: solid;
+ -fx-background-color: null;
+ -fx-border-color: transparent transparent derive(-fx-base,+15%) transparent;
+}
+
+.tooltip {
+ -fx-background-color:-fx-shadow-highlight-color, -fx-outer-border, -fx-inner-border, -fx-body-color;
+}
+
+.button {
+ -fx-background-color: transparent;
+ -fx-padding: 4;
+}
+
+.button:hover {
+ -fx-background-color: -fx-shadow-highlight-color, -fx-outer-border, -fx-inner-border, -fx-body-color;
+ -fx-color: -fx-hover-base;
+}
+
+.table-view {
+ -fx-table-cell-border-color:derive(-fx-base,+10%);
+ -fx-table-header-border-color:derive(-fx-base,+20%);
+}
+
+/* When the TableView is _not_ focused, we show alternate selection colors */
+.table-row-cell:filled:selected:focused, .table-row-cell:filled:selected {
+ -fx-background-color: derive(-fx-base,+60%);
+}
+
+ .table-row-cell:filled:hover {
+ -fx-background-color: derive(-fx-base,+40%);
+}
+
+.split-pane:horizontal > * > .split-pane-divider {
+ -fx-border-color: transparent -fx-base transparent -fx-base;
+ -fx-background-color: transparent, derive(-fx-base,20%);
+ -fx-background-insets: 0, 0 1 0 1;
+}
+
+.my-gridpane {
+ -fx-background-color: radial-gradient(radius 100%, derive(-fx-base,20%), derive(-fx-base,-20%));
+}
+
+.separator-label {
+ -fx-text-fill: orange;
+}
+
+#decorationArea {
+ -fx-padding: 10px;
+ -fx-background-color: derive(-fx-base,+10%);
+ /*
+ -fx-background-image: url("images/top-bar.png");
+ -fx-background-size: cover, contain;
+ -fx-background-position: left top, center center;
+ -fx-background-repeat: no-repeat;
+ */
+}
+
+#window-resize-button {
+ -fx-background-image: url("images/window-corner.png");
+ -fx-background-position: right 1px bottom 1px;
+ -fx-background-repeat: no-repeat;
+}
+
+#window_close {
+ -fx-font-size: 1px;
+ -fx-background-color: null;
+ -fx-background-image: url("images/window-close.png");
+ -fx-padding: 6 6 4 6;
+}
+
+#window_min {
+ -fx-font-size: 1px;
+ -fx-background-color: null;
+ -fx-background-image: url("images/window-min.png");
+ -fx-padding: 6 6 4 6;
+}
+
+#window_max {
+ -fx-font-size: 1px;
+ -fx-background-color: null;
+ -fx-background-image: url("images/window-expand.png");
+ -fx-padding: 6 6 4 6;
+}
+
+#window_close:hover {
+ -fx-background-image: url("images/window-close-over.png");
+}
+
+#window_min:hover {
+ -fx-background-image: url("images/window-min-over.png");
+}
+
+#window_max:hover {
+ -fx-background-image: url("images/window-expand-over.png");
+}
+
diff --git a/demos/org.eclipse.fx.demo.contacts.app/css/dark.png b/demos/org.eclipse.fx.demo.contacts.app/css/dark.png
new file mode 100755
index 000000000..cc5f8c08f
--- /dev/null
+++ b/demos/org.eclipse.fx.demo.contacts.app/css/dark.png
Binary files differ
diff --git a/demos/org.eclipse.fx.demo.contacts.app/icons/silk/arrow_redo.png b/demos/org.eclipse.fx.demo.contacts.app/icons/silk/arrow_redo.png
new file mode 100755
index 000000000..fdc394c7c
--- /dev/null
+++ b/demos/org.eclipse.fx.demo.contacts.app/icons/silk/arrow_redo.png
Binary files differ
diff --git a/demos/org.eclipse.fx.demo.contacts.app/icons/silk/arrow_undo.png b/demos/org.eclipse.fx.demo.contacts.app/icons/silk/arrow_undo.png
new file mode 100755
index 000000000..6972c5e59
--- /dev/null
+++ b/demos/org.eclipse.fx.demo.contacts.app/icons/silk/arrow_undo.png
Binary files differ
diff --git a/demos/org.eclipse.fx.demo.contacts.app/icons/silk/bright.png b/demos/org.eclipse.fx.demo.contacts.app/icons/silk/bright.png
new file mode 100755
index 000000000..ed1021257
--- /dev/null
+++ b/demos/org.eclipse.fx.demo.contacts.app/icons/silk/bright.png
Binary files differ
diff --git a/demos/org.eclipse.fx.demo.contacts.app/icons/silk/cross.png b/demos/org.eclipse.fx.demo.contacts.app/icons/silk/cross.png
new file mode 100755
index 000000000..1514d51a3
--- /dev/null
+++ b/demos/org.eclipse.fx.demo.contacts.app/icons/silk/cross.png
Binary files differ
diff --git a/demos/org.eclipse.fx.demo.contacts.app/icons/silk/cut.png b/demos/org.eclipse.fx.demo.contacts.app/icons/silk/cut.png
new file mode 100755
index 000000000..f215d6f6b
--- /dev/null
+++ b/demos/org.eclipse.fx.demo.contacts.app/icons/silk/cut.png
Binary files differ
diff --git a/demos/org.eclipse.fx.demo.contacts.app/icons/silk/dark.png b/demos/org.eclipse.fx.demo.contacts.app/icons/silk/dark.png
new file mode 100755
index 000000000..cc5f8c08f
--- /dev/null
+++ b/demos/org.eclipse.fx.demo.contacts.app/icons/silk/dark.png
Binary files differ
diff --git a/demos/org.eclipse.fx.demo.contacts.app/icons/silk/disk.png b/demos/org.eclipse.fx.demo.contacts.app/icons/silk/disk.png
new file mode 100755
index 000000000..99d532e8b
--- /dev/null
+++ b/demos/org.eclipse.fx.demo.contacts.app/icons/silk/disk.png
Binary files differ
diff --git a/demos/org.eclipse.fx.demo.contacts.app/icons/silk/door_in.png b/demos/org.eclipse.fx.demo.contacts.app/icons/silk/door_in.png
new file mode 100755
index 000000000..41676a0a5
--- /dev/null
+++ b/demos/org.eclipse.fx.demo.contacts.app/icons/silk/door_in.png
Binary files differ
diff --git a/demos/org.eclipse.fx.demo.contacts.app/icons/silk/folder.png b/demos/org.eclipse.fx.demo.contacts.app/icons/silk/folder.png
new file mode 100755
index 000000000..784e8fa48
--- /dev/null
+++ b/demos/org.eclipse.fx.demo.contacts.app/icons/silk/folder.png
Binary files differ
diff --git a/demos/org.eclipse.fx.demo.contacts.app/icons/silk/folder_add.png b/demos/org.eclipse.fx.demo.contacts.app/icons/silk/folder_add.png
new file mode 100755
index 000000000..529fe8fe0
--- /dev/null
+++ b/demos/org.eclipse.fx.demo.contacts.app/icons/silk/folder_add.png
Binary files differ
diff --git a/demos/org.eclipse.fx.demo.contacts.app/icons/silk/folder_user.png b/demos/org.eclipse.fx.demo.contacts.app/icons/silk/folder_user.png
new file mode 100755
index 000000000..f021c3e12
--- /dev/null
+++ b/demos/org.eclipse.fx.demo.contacts.app/icons/silk/folder_user.png
Binary files differ
diff --git a/demos/org.eclipse.fx.demo.contacts.app/icons/silk/page_copy.png b/demos/org.eclipse.fx.demo.contacts.app/icons/silk/page_copy.png
new file mode 100755
index 000000000..195dc6d6c
--- /dev/null
+++ b/demos/org.eclipse.fx.demo.contacts.app/icons/silk/page_copy.png
Binary files differ
diff --git a/demos/org.eclipse.fx.demo.contacts.app/icons/silk/page_paste.png b/demos/org.eclipse.fx.demo.contacts.app/icons/silk/page_paste.png
new file mode 100755
index 000000000..968f073fd
--- /dev/null
+++ b/demos/org.eclipse.fx.demo.contacts.app/icons/silk/page_paste.png
Binary files differ
diff --git a/demos/org.eclipse.fx.demo.contacts.app/icons/silk/readme.txt b/demos/org.eclipse.fx.demo.contacts.app/icons/silk/readme.txt
new file mode 100755
index 000000000..2cf67dcaf
--- /dev/null
+++ b/demos/org.eclipse.fx.demo.contacts.app/icons/silk/readme.txt
@@ -0,0 +1,22 @@
+Silk icon set 1.3
+
+_________________________________________
+Mark James
+http://www.famfamfam.com/lab/icons/silk/
+_________________________________________
+
+This work is licensed under a
+Creative Commons Attribution 2.5 License.
+[ http://creativecommons.org/licenses/by/2.5/ ]
+
+This means you may use it for any purpose,
+and make any changes you like.
+All I ask is that you include a link back
+to this page in your credits.
+
+Are you using this icon set? Send me an email
+(including a link or picture if available) to
+mjames@gmail.com
+
+Any other questions about this icon set please
+contact mjames@gmail.com \ No newline at end of file
diff --git a/demos/org.eclipse.fx.demo.contacts.app/icons/silk/report_user.png b/demos/org.eclipse.fx.demo.contacts.app/icons/silk/report_user.png
new file mode 100755
index 000000000..7766edd74
--- /dev/null
+++ b/demos/org.eclipse.fx.demo.contacts.app/icons/silk/report_user.png
Binary files differ
diff --git a/demos/org.eclipse.fx.demo.contacts.app/icons/silk/user_add.png b/demos/org.eclipse.fx.demo.contacts.app/icons/silk/user_add.png
new file mode 100755
index 000000000..deae99bcf
--- /dev/null
+++ b/demos/org.eclipse.fx.demo.contacts.app/icons/silk/user_add.png
Binary files differ
diff --git a/demos/org.eclipse.fx.demo.contacts.app/icons/silk/user_delete.png b/demos/org.eclipse.fx.demo.contacts.app/icons/silk/user_delete.png
new file mode 100755
index 000000000..acbb5630e
--- /dev/null
+++ b/demos/org.eclipse.fx.demo.contacts.app/icons/silk/user_delete.png
Binary files differ
diff --git a/demos/org.eclipse.fx.demo.contacts.app/images/dummy.png b/demos/org.eclipse.fx.demo.contacts.app/images/dummy.png
new file mode 100755
index 000000000..bb30f82d3
--- /dev/null
+++ b/demos/org.eclipse.fx.demo.contacts.app/images/dummy.png
Binary files differ
diff --git a/demos/org.eclipse.fx.demo.contacts.app/plugin.properties b/demos/org.eclipse.fx.demo.contacts.app/plugin.properties
new file mode 100755
index 000000000..5d021c984
--- /dev/null
+++ b/demos/org.eclipse.fx.demo.contacts.app/plugin.properties
@@ -0,0 +1,29 @@
+###############################################################################
+# Copyright (c) 2011 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
+###############################################################################
+fileMenu = _File
+editMenu = _Edit
+switchThemeMenu = _Theme
+partDetails = Details
+contactsTree = Tree
+contactsTable = Table
+contactsList = List
+menuLabelSave = _Save
+menuLabelCut = Cut
+menuLabelCopy = Copy
+menuLabelPaste = Paste
+menuLabelUndo = Undo
+menuLabelDelete = _Delete
+menuLabelDirectExit = Direct E_xit
+menuLabelExit = _Exit
+windowTitle = e4 JavaFX Contacts Demo
+contactsTooltip = List of Contacts
+detailsTooltip = Contact Details
+toolbarSaveTooltip = Save
diff --git a/demos/org.eclipse.fx.demo.contacts.app/plugin.xml b/demos/org.eclipse.fx.demo.contacts.app/plugin.xml
new file mode 100755
index 000000000..a7f112faa
--- /dev/null
+++ b/demos/org.eclipse.fx.demo.contacts.app/plugin.xml
@@ -0,0 +1,77 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?eclipse version="3.2"?>
+<plugin>
+ <extension
+ id="product"
+ point="org.eclipse.core.runtime.products">
+ <product
+ application="org.eclipse.fx.ui.workbench.fx.application"
+ name="E4 Contacs Demo">
+ <property
+ name="appName"
+ value="E4 Contacs Demo">
+ </property>
+ <property
+ name="applicationXMI"
+ value="org.eclipse.fx.demo.contacts.app/Application.e4xmi">
+ </property>
+ <property
+ name="preferenceCustomization"
+ value="plugin_customization.ini">
+ </property>
+ <property
+ name="cssTheme"
+ value="themes.dark">
+ </property>
+ <property
+ name="startupForegroundColor"
+ value="FFFFFF">
+ </property>
+ <property
+ name="startupMessageRect"
+ value="7,252,445,20">
+ </property>
+ <property
+ name="startupProgressRect"
+ value="5,275,445,15">
+ </property>
+ </product>
+ </extension>
+ <extension
+ point="org.eclipse.fx.ui.theme">
+ <theme
+ basestylesheet="css/dark.css"
+ id="themes.dark"
+ name="Dark Gradient">
+ </theme>
+ <theme
+ basestylesheet="css/bright.css"
+ id="themes.bright"
+ name="Bright Gradient">
+ </theme>
+ <theme
+ basestylesheet="css/blue.css"
+ id="themes.blue"
+ name="Blue Gradient">
+ </theme>
+ </extension>
+ <extension
+ id="modelContribution"
+ point="org.eclipse.e4.workbench.model">
+ <processor
+ beforefragment="true"
+ class="org.eclipse.fx.demo.contacts.processors.MenuThemeProcessor">
+ <element
+ id="menu:org.eclipse.ui.main.menu">
+ </element>
+ </processor>
+ <processor
+ beforefragment="true"
+ class="org.eclipse.fx.demo.contacts.processors.ToolbarThemeProcessor">
+ <element
+ id="toolbar:org.eclipse.ui.main.toolbar">
+ </element>
+ </processor>
+ </extension>
+
+</plugin>
diff --git a/demos/org.eclipse.fx.demo.contacts.app/plugin_customization.ini b/demos/org.eclipse.fx.demo.contacts.app/plugin_customization.ini
new file mode 100755
index 000000000..8a531fc70
--- /dev/null
+++ b/demos/org.eclipse.fx.demo.contacts.app/plugin_customization.ini
@@ -0,0 +1,2 @@
+org.eclipse.ui/SHOW_PROGRESS_ON_STARTUP = true
+
diff --git a/demos/org.eclipse.fx.demo.contacts.app/plugin_ru.properties b/demos/org.eclipse.fx.demo.contacts.app/plugin_ru.properties
new file mode 100755
index 000000000..f572982c7
--- /dev/null
+++ b/demos/org.eclipse.fx.demo.contacts.app/plugin_ru.properties
@@ -0,0 +1,22 @@
+###############################################################################
+# Copyright (c) 2011 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
+###############################################################################
+fileMenu = &\u0424\u0430\u0439\u043B
+partDetails = \u041F\u043E\u0434\u0440\u043E\u0431\u043D\u043E
+contactsList = \u041A\u043E\u043D\u0442\u0430\u043A\u0442\u044B
+menuLabelSave = &\u0421\u043E\u0445\u0440\u0430\u043D\u0438\u0442\u044C
+menuLabelDelete = &\u0423\u0434\u0430\u043B\u0438\u0442\u044C
+menuLabelDirectExit = &\u0411\u044B\u0441\u0442\u0440\u044B\u0439 \u0432\u044B\u0445\u043E\u0434
+menuLabelExit = &\u0412\u044B\u0445\u043E\u0434
+windowTitle = e4 \u0417\u0430\u043F\u0438\u0441\u043D\u0430\u044F \u043A\u043D\u0438\u0436\u043A\u0430
+contactsTooltip = \u0421\u043F\u0438\u0441\u043E\u043A \u043A\u043E\u043D\u0442\u0430\u043A\u0442\u043E\u0432
+detailsTooltip = \u041F\u043E\u0434\u0440\u043E\u0431\u043D\u0430\u044F \u0438\u043D\u0444\u043E\u0440\u043C\u0430\u0446\u0438\u044F \u043E \u043A\u043E\u043D\u0442\u0430\u043A\u0442\u0435
+toolbarSaveTooltip = \u0421\u043E\u0445\u0440\u0430\u043D\u0438\u0442\u044C
+
diff --git a/demos/org.eclipse.fx.demo.contacts.app/splash.bmp b/demos/org.eclipse.fx.demo.contacts.app/splash.bmp
new file mode 100755
index 000000000..68ce4201a
--- /dev/null
+++ b/demos/org.eclipse.fx.demo.contacts.app/splash.bmp
Binary files differ
diff --git a/demos/org.eclipse.fx.demo.contacts.app/src/org/eclipse/fx/demo/contacts/BundleActivatorImpl.java b/demos/org.eclipse.fx.demo.contacts.app/src/org/eclipse/fx/demo/contacts/BundleActivatorImpl.java
new file mode 100755
index 000000000..1aea28d10
--- /dev/null
+++ b/demos/org.eclipse.fx.demo.contacts.app/src/org/eclipse/fx/demo/contacts/BundleActivatorImpl.java
@@ -0,0 +1,75 @@
+/*******************************************************************************
+ * Copyright (c) 2009 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.fx.demo.contacts;
+
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.Path;
+import org.eclipse.osgi.service.datalocation.Location;
+import org.osgi.framework.BundleActivator;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.Filter;
+import org.osgi.framework.InvalidSyntaxException;
+import org.osgi.util.tracker.ServiceTracker;
+
+public class BundleActivatorImpl implements BundleActivator {
+
+ private static final String F_META_AREA = ".metadata"; //$NON-NLS-1$
+ private static final String F_PLUGIN_DATA = ".plugins"; //$NON-NLS-1$
+
+ private static BundleActivatorImpl instance;
+
+ private BundleContext context;
+
+ private ServiceTracker locationServiceTracker;
+
+ private IPath stateLocation;
+
+ public void start(BundleContext context) throws Exception {
+ instance = this;
+ this.context = context;
+ }
+
+ public void stop(BundleContext context) throws Exception {
+ this.context = null;
+ instance = null;
+ }
+
+ public IPath getStateLocation() {
+ try {
+ if (stateLocation == null) {
+ Filter filter = context.createFilter(Location.INSTANCE_FILTER);
+ if (locationServiceTracker == null) {
+ locationServiceTracker = new ServiceTracker(context,
+ filter, null);
+ locationServiceTracker.open();
+ }
+ Location location = (Location) locationServiceTracker
+ .getService();
+ if (location != null) {
+ IPath path = new Path(location.getURL().getPath());
+ stateLocation = path.append(F_META_AREA).append(
+ F_PLUGIN_DATA).append(
+ context.getBundle().getSymbolicName());
+ stateLocation.toFile().mkdirs();
+ }
+ }
+ } catch (InvalidSyntaxException e) {
+ // ignore this. It should never happen as we have tested the above
+ // format
+ }
+ return stateLocation;
+ }
+
+ public static BundleActivatorImpl getInstance() {
+ return instance;
+ }
+
+}
diff --git a/demos/org.eclipse.fx.demo.contacts.app/src/org/eclipse/fx/demo/contacts/DecorationController.java b/demos/org.eclipse.fx.demo.contacts.app/src/org/eclipse/fx/demo/contacts/DecorationController.java
new file mode 100755
index 000000000..ed3df76e5
--- /dev/null
+++ b/demos/org.eclipse.fx.demo.contacts.app/src/org/eclipse/fx/demo/contacts/DecorationController.java
@@ -0,0 +1,77 @@
+package org.eclipse.fx.demo.contacts;
+
+import javafx.application.Platform;
+import javafx.event.ActionEvent;
+import javafx.event.EventHandler;
+import javafx.fxml.FXML;
+import javafx.geometry.Rectangle2D;
+import javafx.scene.control.ToolBar;
+import javafx.scene.input.MouseEvent;
+import javafx.stage.Screen;
+import javafx.stage.Stage;
+import javax.annotation.PostConstruct;
+
+public class DecorationController {
+ private double mouseDragOffsetX = 0;
+ private double mouseDragOffsetY = 0;
+
+ @FXML
+ private ToolBar decorationArea;
+
+ private Rectangle2D backupWindowBounds;
+
+ public DecorationController() {
+ }
+
+ @PostConstruct
+ void init() {
+ decorationArea.setOnMousePressed(new EventHandler<MouseEvent>() {
+ public void handle(MouseEvent event) {
+ mouseDragOffsetX = event.getSceneX();
+ mouseDragOffsetY = event.getSceneY();
+ }
+ });
+ decorationArea.setOnMouseDragged(new EventHandler<MouseEvent>() {
+ public void handle(MouseEvent event) {
+ Stage w = getStage();
+ w.setX(event.getScreenX() - mouseDragOffsetX);
+ w.setY(event.getScreenY() - mouseDragOffsetY);
+ }
+ });
+ }
+
+ public void handleClose(ActionEvent event) {
+ Platform.exit();
+ }
+
+ public void handleMin(ActionEvent event) {
+ getStage().setIconified(true);
+ }
+
+ public void handleMax(ActionEvent event) {
+ Stage stage = getStage();
+ final double stageY = stage.getY();
+ final Screen screen = Screen.getScreensForRectangle(stage.getX(), stageY, 1, 1).get(0);
+ Rectangle2D bounds = screen.getVisualBounds();
+ if (bounds.getMinX() == stage.getX() && bounds.getMinY() == stageY && bounds.getWidth() == stage.getWidth()
+ && bounds.getHeight() == stage.getHeight()) {
+ if (backupWindowBounds != null) {
+ stage.setX(backupWindowBounds.getMinX());
+ stage.setY(backupWindowBounds.getMinY());
+ stage.setWidth(backupWindowBounds.getWidth());
+ stage.setHeight(backupWindowBounds.getHeight());
+ }
+ } else {
+ backupWindowBounds = new Rectangle2D(stage.getX(), stage.getY(), stage.getWidth(), stage.getHeight());
+ final double newStageY = screen.getVisualBounds().getMinY();
+ stage.setX(screen.getVisualBounds().getMinX());
+ stage.setY(newStageY);
+ stage.setWidth(screen.getVisualBounds().getWidth());
+ stage.setHeight(screen.getVisualBounds().getHeight());
+ }
+ }
+
+ Stage getStage() {
+ return (Stage) decorationArea.getScene().getWindow();
+ }
+}
diff --git a/demos/org.eclipse.fx.demo.contacts.app/src/org/eclipse/fx/demo/contacts/handlers/AddContactHandler.java b/demos/org.eclipse.fx.demo.contacts.app/src/org/eclipse/fx/demo/contacts/handlers/AddContactHandler.java
new file mode 100755
index 000000000..1476a8d62
--- /dev/null
+++ b/demos/org.eclipse.fx.demo.contacts.app/src/org/eclipse/fx/demo/contacts/handlers/AddContactHandler.java
@@ -0,0 +1,40 @@
+/*******************************************************************************
+ * Copyright (c) 2009, 2010 Siemens AG 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:
+ * Kai T��dter - initial implementation
+ ******************************************************************************/
+
+package org.eclipse.fx.demo.contacts.handlers;
+
+import javax.inject.Inject;
+
+import org.eclipse.e4.core.di.annotations.Execute;
+import org.eclipse.emf.common.command.Command;
+import org.eclipse.emf.edit.command.AddCommand;
+import org.eclipse.fx.demo.contacts.Contact;
+import org.eclipse.fx.demo.contacts.ContactsFactory;
+import org.eclipse.fx.demo.contacts.ContactsPackage;
+import org.eclipse.fx.demo.contacts.model.ContactsManager;
+
+
+@SuppressWarnings("restriction")
+public class AddContactHandler {
+
+ @Inject
+ ContactsManager contactsManager;
+
+ @Execute
+ void execute() {
+ Contact contact = ContactsFactory.eINSTANCE.createContact();
+ Command command = AddCommand.create(contactsManager.getEditingDomain(), contactsManager.getRootGroup(), ContactsPackage.Literals.GROUP__CONTACTS, contact);
+ if (command != null && command.canExecute())
+ contactsManager.getEditingDomain().getCommandStack().execute(command);
+ }
+
+}
diff --git a/demos/org.eclipse.fx.demo.contacts.app/src/org/eclipse/fx/demo/contacts/handlers/AddGroupHandler.java b/demos/org.eclipse.fx.demo.contacts.app/src/org/eclipse/fx/demo/contacts/handlers/AddGroupHandler.java
new file mode 100755
index 000000000..7c4cacfbb
--- /dev/null
+++ b/demos/org.eclipse.fx.demo.contacts.app/src/org/eclipse/fx/demo/contacts/handlers/AddGroupHandler.java
@@ -0,0 +1,41 @@
+/*******************************************************************************
+ * Copyright (c) 2009, 2010 Siemens AG 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:
+ * Kai T��dter - initial implementation
+ ******************************************************************************/
+
+package org.eclipse.fx.demo.contacts.handlers;
+
+import javax.inject.Inject;
+
+import org.eclipse.e4.core.di.annotations.Execute;
+import org.eclipse.emf.common.command.Command;
+import org.eclipse.emf.edit.command.AddCommand;
+import org.eclipse.fx.demo.contacts.ContactsFactory;
+import org.eclipse.fx.demo.contacts.ContactsPackage;
+import org.eclipse.fx.demo.contacts.Group;
+import org.eclipse.fx.demo.contacts.model.ContactsManager;
+
+
+@SuppressWarnings("restriction")
+public class AddGroupHandler {
+
+ @Inject
+ ContactsManager contactsManager;
+
+ @Execute
+ void execute() {
+ Group group = ContactsFactory.eINSTANCE.createGroup();
+ group.setName("New Group");
+ Command command = AddCommand.create(contactsManager.getEditingDomain(), contactsManager.getRootGroup(), ContactsPackage.Literals.GROUP__GROUPS, group);
+ if (command != null && command.canExecute())
+ contactsManager.getEditingDomain().getCommandStack().execute(command);
+ }
+
+}
diff --git a/demos/org.eclipse.fx.demo.contacts.app/src/org/eclipse/fx/demo/contacts/handlers/CopyHandler.java b/demos/org.eclipse.fx.demo.contacts.app/src/org/eclipse/fx/demo/contacts/handlers/CopyHandler.java
new file mode 100755
index 000000000..95be09f00
--- /dev/null
+++ b/demos/org.eclipse.fx.demo.contacts.app/src/org/eclipse/fx/demo/contacts/handlers/CopyHandler.java
@@ -0,0 +1,51 @@
+/*******************************************************************************
+ * Copyright (c) 2009, 2010 Siemens AG 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:
+ * Kai T??dter - initial implementation
+ ******************************************************************************/
+
+package org.eclipse.fx.demo.contacts.handlers;
+
+import java.util.List;
+import javax.inject.Inject;
+import org.eclipse.e4.core.di.annotations.CanExecute;
+import org.eclipse.e4.core.di.annotations.Execute;
+import org.eclipse.e4.core.di.annotations.Optional;
+import org.eclipse.emf.common.command.Command;
+import org.eclipse.emf.edit.command.CopyToClipboardCommand;
+import org.eclipse.fx.demo.contacts.model.ContactsManager;
+
+@SuppressWarnings("restriction")
+public class CopyHandler {
+
+ ContactsManager contactsManager;
+
+ Command command;
+
+ @Inject
+ public CopyHandler(ContactsManager contactsManager) {
+ this.contactsManager = contactsManager;
+ }
+
+ @CanExecute
+ public boolean canExecute(@Optional List<?> selection) {
+ if (selection != null) {
+ command = CopyToClipboardCommand.create(contactsManager.getEditingDomain(), selection);
+ return command.canExecute();
+ }
+ return false;
+ }
+
+ @Execute
+ public void execute() {
+ if (command != null && command.canExecute())
+ contactsManager.getEditingDomain().getCommandStack().execute(command);
+ }
+
+}
diff --git a/demos/org.eclipse.fx.demo.contacts.app/src/org/eclipse/fx/demo/contacts/handlers/CutHandler.java b/demos/org.eclipse.fx.demo.contacts.app/src/org/eclipse/fx/demo/contacts/handlers/CutHandler.java
new file mode 100755
index 000000000..2068adcdd
--- /dev/null
+++ b/demos/org.eclipse.fx.demo.contacts.app/src/org/eclipse/fx/demo/contacts/handlers/CutHandler.java
@@ -0,0 +1,50 @@
+/*******************************************************************************
+ * Copyright (c) 2009, 2010 Siemens AG 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:
+ * Kai T??dter - initial implementation
+ ******************************************************************************/
+
+package org.eclipse.fx.demo.contacts.handlers;
+
+import java.util.List;
+import javax.inject.Inject;
+import org.eclipse.e4.core.di.annotations.CanExecute;
+import org.eclipse.e4.core.di.annotations.Execute;
+import org.eclipse.e4.core.di.annotations.Optional;
+import org.eclipse.emf.common.command.Command;
+import org.eclipse.emf.edit.command.CutToClipboardCommand;
+import org.eclipse.fx.demo.contacts.model.ContactsManager;
+
+@SuppressWarnings("restriction")
+public class CutHandler {
+
+ ContactsManager contactsManager;
+ Command command;
+
+ @Inject
+ public CutHandler(ContactsManager contactsManager) {
+ this.contactsManager = contactsManager;
+ }
+
+ @CanExecute
+ public boolean canExecute(@Optional List<?> selection) {
+ if (selection != null) {
+ command = CutToClipboardCommand.create(contactsManager.getEditingDomain(), selection);
+ return command.canExecute();
+ }
+ return false;
+ }
+
+ @Execute
+ public void execute() {
+ if (command != null && command.canExecute())
+ contactsManager.getEditingDomain().getCommandStack().execute(command);
+ }
+
+}
diff --git a/demos/org.eclipse.fx.demo.contacts.app/src/org/eclipse/fx/demo/contacts/handlers/DeleteContactHandler.java b/demos/org.eclipse.fx.demo.contacts.app/src/org/eclipse/fx/demo/contacts/handlers/DeleteContactHandler.java
new file mode 100755
index 000000000..5c131b402
--- /dev/null
+++ b/demos/org.eclipse.fx.demo.contacts.app/src/org/eclipse/fx/demo/contacts/handlers/DeleteContactHandler.java
@@ -0,0 +1,51 @@
+/*******************************************************************************
+ * Copyright (c) 2009, 2010 Siemens AG 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:
+ * Kai T??dter - initial implementation
+ ******************************************************************************/
+
+package org.eclipse.fx.demo.contacts.handlers;
+
+import java.util.List;
+import javax.inject.Inject;
+import org.eclipse.e4.core.di.annotations.CanExecute;
+import org.eclipse.e4.core.di.annotations.Execute;
+import org.eclipse.e4.core.di.annotations.Optional;
+import org.eclipse.emf.common.command.Command;
+import org.eclipse.emf.edit.command.DeleteCommand;
+import org.eclipse.fx.demo.contacts.model.ContactsManager;
+
+@SuppressWarnings("restriction")
+public class DeleteContactHandler {
+
+ ContactsManager contactsManager;
+ Command command;
+
+ @Inject
+ public DeleteContactHandler(ContactsManager contactsManager) {
+ this.contactsManager = contactsManager;
+ }
+
+
+ @CanExecute
+ public boolean canExecute(@Optional List<?> selection) {
+ if (selection != null) {
+ command = DeleteCommand.create(contactsManager.getEditingDomain(), selection);
+ return command.canExecute();
+ }
+ return false;
+ }
+
+ @Execute
+ public void execute() {
+ if (command != null && command.canExecute())
+ contactsManager.getEditingDomain().getCommandStack().execute(command);
+ }
+
+}
diff --git a/demos/org.eclipse.fx.demo.contacts.app/src/org/eclipse/fx/demo/contacts/handlers/ExitHandler.java b/demos/org.eclipse.fx.demo.contacts.app/src/org/eclipse/fx/demo/contacts/handlers/ExitHandler.java
new file mode 100755
index 000000000..b6c8aa2a0
--- /dev/null
+++ b/demos/org.eclipse.fx.demo.contacts.app/src/org/eclipse/fx/demo/contacts/handlers/ExitHandler.java
@@ -0,0 +1,25 @@
+/*******************************************************************************
+ * Copyright (c) 2009 Siemens AG 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:
+ * Kai T??dter - initial implementation
+ ******************************************************************************/
+
+package org.eclipse.fx.demo.contacts.handlers;
+
+import javafx.application.Platform;
+import org.eclipse.e4.core.di.annotations.Execute;
+
+@SuppressWarnings("restriction")
+public class ExitHandler {
+ @Execute
+ public void exit() {
+ // TODO better life cycle support
+ Platform.exit();
+ }
+}
diff --git a/demos/org.eclipse.fx.demo.contacts.app/src/org/eclipse/fx/demo/contacts/handlers/PasteHandler.java b/demos/org.eclipse.fx.demo.contacts.app/src/org/eclipse/fx/demo/contacts/handlers/PasteHandler.java
new file mode 100755
index 000000000..3d4e21c8e
--- /dev/null
+++ b/demos/org.eclipse.fx.demo.contacts.app/src/org/eclipse/fx/demo/contacts/handlers/PasteHandler.java
@@ -0,0 +1,66 @@
+/*******************************************************************************
+ * Copyright (c) 2009, 2010 Siemens AG 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:
+ * Kai T��dter - initial implementation
+ ******************************************************************************/
+
+package org.eclipse.fx.demo.contacts.handlers;
+
+import javax.inject.Inject;
+
+import org.eclipse.e4.core.di.annotations.CanExecute;
+import org.eclipse.e4.core.di.annotations.Execute;
+import org.eclipse.e4.core.di.annotations.Optional;
+import org.eclipse.emf.common.command.Command;
+import org.eclipse.emf.edit.command.PasteFromClipboardCommand;
+import org.eclipse.fx.demo.contacts.Contact;
+import org.eclipse.fx.demo.contacts.ContactsPackage;
+import org.eclipse.fx.demo.contacts.Group;
+import org.eclipse.fx.demo.contacts.model.ContactsManager;
+
+
+@SuppressWarnings("restriction")
+public class PasteHandler {
+
+ ContactsManager contactsManager;
+
+ Command command;
+
+ @Inject
+ public PasteHandler(ContactsManager contactsManager) {
+ this.contactsManager = contactsManager;
+ }
+
+ @CanExecute
+ public boolean canExecute(@Optional Object selectedItem) {
+ Group group = null;
+
+ if (selectedItem instanceof Contact)
+ // get containing Group if selection is a Contact
+ group = (Group) ((Contact) selectedItem).eContainer();
+
+ else if (selectedItem instanceof Group)
+ group = (Group) selectedItem;
+
+ if (group != null) {
+ command = PasteFromClipboardCommand.create(contactsManager.getEditingDomain(), group,
+ ContactsPackage.eINSTANCE.getGroup_Contacts());
+ return command.canExecute();
+ }
+
+ return false;
+ }
+
+ @Execute
+ public void execute() {
+ if (command != null && command.canExecute())
+ contactsManager.getEditingDomain().getCommandStack().execute(command);
+ }
+
+}
diff --git a/demos/org.eclipse.fx.demo.contacts.app/src/org/eclipse/fx/demo/contacts/handlers/RedoHandler.java b/demos/org.eclipse.fx.demo.contacts.app/src/org/eclipse/fx/demo/contacts/handlers/RedoHandler.java
new file mode 100755
index 000000000..123840f00
--- /dev/null
+++ b/demos/org.eclipse.fx.demo.contacts.app/src/org/eclipse/fx/demo/contacts/handlers/RedoHandler.java
@@ -0,0 +1,39 @@
+/*******************************************************************************
+ * Copyright (c) 2009 Siemens AG 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:
+ * Kai T??dter - initial implementation
+ ******************************************************************************/
+package org.eclipse.fx.demo.contacts.handlers;
+
+
+import javax.inject.Inject;
+import org.eclipse.e4.core.di.annotations.CanExecute;
+import org.eclipse.e4.core.di.annotations.Execute;
+import org.eclipse.emf.common.command.CommandStack;
+import org.eclipse.fx.demo.contacts.model.ContactsManager;
+
+@SuppressWarnings("restriction")
+public class RedoHandler {
+
+ @Inject
+ ContactsManager contactsManager;
+
+ @CanExecute
+ public boolean canUndo() {
+ CommandStack commandStack = contactsManager.getEditingDomain().getCommandStack();
+ return commandStack.canRedo();
+ }
+
+ @Execute
+ public void undo() {
+ CommandStack commandStack = contactsManager.getEditingDomain().getCommandStack();
+ if (commandStack.canRedo())
+ commandStack.redo();
+ }
+}
diff --git a/demos/org.eclipse.fx.demo.contacts.app/src/org/eclipse/fx/demo/contacts/handlers/SwitchThemeHandler.java b/demos/org.eclipse.fx.demo.contacts.app/src/org/eclipse/fx/demo/contacts/handlers/SwitchThemeHandler.java
new file mode 100755
index 000000000..7cc4b6a17
--- /dev/null
+++ b/demos/org.eclipse.fx.demo.contacts.app/src/org/eclipse/fx/demo/contacts/handlers/SwitchThemeHandler.java
@@ -0,0 +1,29 @@
+/*******************************************************************************
+ * Copyright (c) 2010 BestSolution.at 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:
+ * Tom Schindl <tom.schindl@bestsolution.at> - initial API and implementation
+ * Kai T��dter - Adoption to contacts demo
+ ******************************************************************************/
+package org.eclipse.fx.demo.contacts.handlers;
+
+import javax.inject.Named;
+
+import org.eclipse.e4.core.di.annotations.Execute;
+import org.eclipse.e4.core.di.annotations.Optional;
+import org.eclipse.fx.ui.services.theme.ThemeManager;
+
+@SuppressWarnings("restriction")
+public class SwitchThemeHandler {
+ @Execute
+ public void switchTheme(@Named("contacts.commands.switchtheme.themeid") String themeId,
+ @Optional ThemeManager themeManager) {
+ if (themeManager != null) {
+ themeManager.setCurrentThemeId(themeId);
+ }
+ }
+} \ No newline at end of file
diff --git a/demos/org.eclipse.fx.demo.contacts.app/src/org/eclipse/fx/demo/contacts/handlers/UndoHandler.java b/demos/org.eclipse.fx.demo.contacts.app/src/org/eclipse/fx/demo/contacts/handlers/UndoHandler.java
new file mode 100755
index 000000000..07f1deb52
--- /dev/null
+++ b/demos/org.eclipse.fx.demo.contacts.app/src/org/eclipse/fx/demo/contacts/handlers/UndoHandler.java
@@ -0,0 +1,41 @@
+/*******************************************************************************
+ * Copyright (c) 2009 Siemens AG 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:
+ * Kai T??dter - initial implementation
+ ******************************************************************************/
+
+package org.eclipse.fx.demo.contacts.handlers;
+
+
+import javax.inject.Inject;
+import org.eclipse.e4.core.di.annotations.CanExecute;
+import org.eclipse.e4.core.di.annotations.Execute;
+import org.eclipse.emf.common.command.CommandStack;
+import org.eclipse.fx.demo.contacts.model.ContactsManager;
+
+@SuppressWarnings("restriction")
+public class UndoHandler {
+
+ @Inject
+ ContactsManager contactsManager;
+
+ @CanExecute
+ public boolean canUndo() {
+ CommandStack commandStack = contactsManager.getEditingDomain().getCommandStack();
+ return commandStack.canUndo();
+ }
+
+ @Execute
+ public void undo() {
+ CommandStack commandStack = contactsManager.getEditingDomain().getCommandStack();
+ if (commandStack.canUndo())
+ commandStack.undo();
+ }
+
+}
diff --git a/demos/org.eclipse.fx.demo.contacts.app/src/org/eclipse/fx/demo/contacts/model/ContactsManager.java b/demos/org.eclipse.fx.demo.contacts.app/src/org/eclipse/fx/demo/contacts/model/ContactsManager.java
new file mode 100755
index 000000000..377d1491b
--- /dev/null
+++ b/demos/org.eclipse.fx.demo.contacts.app/src/org/eclipse/fx/demo/contacts/model/ContactsManager.java
@@ -0,0 +1,25 @@
+/*******************************************************************************
+ * Copyright (c) 2012 TESIS DYNAware GmbH 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:
+ * Torsten Sommer <torsten.sommer@tesis.de> - initial API and implementation
+ ******************************************************************************/
+package org.eclipse.fx.demo.contacts.model;
+
+import org.eclipse.emf.common.notify.AdapterFactory;
+import org.eclipse.emf.edit.domain.EditingDomain;
+import org.eclipse.fx.demo.contacts.Group;
+
+public interface ContactsManager {
+
+ Group getRootGroup();
+
+ AdapterFactory getAdapterFactory();
+
+ EditingDomain getEditingDomain();
+
+} \ No newline at end of file
diff --git a/demos/org.eclipse.fx.demo.contacts.app/src/org/eclipse/fx/demo/contacts/model/ContactsManagerImpl.java b/demos/org.eclipse.fx.demo.contacts.app/src/org/eclipse/fx/demo/contacts/model/ContactsManagerImpl.java
new file mode 100755
index 000000000..425e9be6b
--- /dev/null
+++ b/demos/org.eclipse.fx.demo.contacts.app/src/org/eclipse/fx/demo/contacts/model/ContactsManagerImpl.java
@@ -0,0 +1,55 @@
+/*******************************************************************************
+ * Copyright (c) 2012 TESIS DYNAware GmbH 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:
+ * Torsten Sommer <torsten.sommer@tesis.de> - initial API and implementation
+ ******************************************************************************/
+package org.eclipse.fx.demo.contacts.model;
+
+
+import org.eclipse.emf.common.command.BasicCommandStack;
+import org.eclipse.emf.common.notify.AdapterFactory;
+import org.eclipse.emf.edit.domain.AdapterFactoryEditingDomain;
+import org.eclipse.emf.edit.domain.EditingDomain;
+import org.eclipse.emf.edit.provider.ComposedAdapterFactory;
+import org.eclipse.emf.edit.provider.ReflectiveItemProviderAdapterFactory;
+import org.eclipse.emf.edit.provider.resource.ResourceItemProviderAdapterFactory;
+import org.eclipse.fx.demo.contacts.Group;
+import org.eclipse.fx.demo.contacts.provider.ContactsItemProviderAdapterFactory;
+
+public class ContactsManagerImpl implements ContactsManager {
+
+ protected EditingDomain editingDomain;
+ protected VCardContactsResource contactsResource;
+ protected ComposedAdapterFactory adapterFactory;
+
+ public ContactsManagerImpl() {
+ adapterFactory = new ComposedAdapterFactory(ComposedAdapterFactory.Descriptor.Registry.INSTANCE);
+ adapterFactory.addAdapterFactory(new ResourceItemProviderAdapterFactory());
+ adapterFactory.addAdapterFactory(new ContactsItemProviderAdapterFactory());
+ adapterFactory.addAdapterFactory(new ReflectiveItemProviderAdapterFactory());
+
+ contactsResource = new VCardContactsResource();
+ BasicCommandStack commandStack = new BasicCommandStack();
+ editingDomain = new AdapterFactoryEditingDomain(adapterFactory, commandStack);
+ editingDomain.getResourceSet().getResources().add(contactsResource);
+ }
+
+ public AdapterFactory getAdapterFactory() {
+ return adapterFactory;
+ }
+
+ public EditingDomain getEditingDomain() {
+ return editingDomain;
+ }
+
+ @Override
+ public Group getRootGroup() {
+ return (Group) contactsResource.getContents().get(0);
+ }
+
+}
diff --git a/demos/org.eclipse.fx.demo.contacts.app/src/org/eclipse/fx/demo/contacts/model/VCardContactsResource.java b/demos/org.eclipse.fx.demo.contacts.app/src/org/eclipse/fx/demo/contacts/model/VCardContactsResource.java
new file mode 100755
index 000000000..2f729f693
--- /dev/null
+++ b/demos/org.eclipse.fx.demo.contacts.app/src/org/eclipse/fx/demo/contacts/model/VCardContactsResource.java
@@ -0,0 +1,263 @@
+/*******************************************************************************
+ * Copyright (c) 2009, 2010 Siemens AG 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:
+ * Kai T????dter - initial implementation
+ ******************************************************************************/
+
+package org.eclipse.fx.demo.contacts.model;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.io.FileOutputStream;
+import java.io.FilenameFilter;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.util.Enumeration;
+
+import org.eclipse.core.runtime.FileLocator;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.Path;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.emf.common.util.URI;
+import org.eclipse.emf.ecore.resource.impl.ResourceImpl;
+import org.eclipse.fx.demo.contacts.BundleActivatorImpl;
+import org.eclipse.fx.demo.contacts.Contact;
+import org.eclipse.fx.demo.contacts.ContactsFactory;
+import org.eclipse.fx.demo.contacts.Group;
+import org.osgi.framework.Bundle;
+
+
+public class VCardContactsResource extends ResourceImpl {
+
+ public VCardContactsResource() {
+ super(URI.createPlatformResourceURI("org.eclipse.fx.demo.contacts/vcards", false));
+
+ try {
+ Group rootGroup = ContactsFactory.eINSTANCE.createGroup();
+ for (File file : getContacts()) {
+ Contact contact = readFromVCard(file.getAbsolutePath());
+ rootGroup.getContacts().add(contact);
+ }
+ getContents().add(rootGroup);
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+
+ private File[] getContacts() throws Exception {
+ File[] localContacts = getLocalContacts();
+ if (localContacts.length == 0) {
+ IPath path = BundleActivatorImpl.getInstance().getStateLocation();
+ byte[] buffer = new byte[8192];
+ Bundle bundle = Platform.getBundle("org.eclipse.fx.demo.contacts.app"); //$NON-NLS-1$
+
+ for (Enumeration<?> contacts = getStoredContacts(); contacts.hasMoreElements();) {
+ String bundlePath = (String) contacts.nextElement();
+ if (!bundlePath.endsWith(".vcf")) { //$NON-NLS-1$
+ continue;
+ }
+
+ InputStream inputStream = FileLocator.openStream(bundle, new Path(bundlePath), false);
+ FileOutputStream outputStream = new FileOutputStream(path.append(
+ bundlePath.substring(bundlePath.indexOf('/') + 1)).toFile());
+
+ int read = inputStream.read(buffer);
+ while (read != -1) {
+ outputStream.write(buffer, 0, read);
+ read = inputStream.read(buffer);
+ }
+
+ inputStream.close();
+ outputStream.close();
+ }
+
+ return getLocalContacts();
+ }
+ return localContacts;
+ }
+
+ private File[] getLocalContacts() {
+ IPath path = BundleActivatorImpl.getInstance().getStateLocation();
+ File directory = path.toFile();
+ return directory.listFiles(new FilenameFilter() {
+ public boolean accept(File dir, String name) {
+ return name.endsWith(".vcf"); //$NON-NLS-1$
+ }
+ });
+ }
+
+ private Enumeration<?> getStoredContacts() throws Exception {
+ Bundle bundle = Platform.getBundle("org.eclipse.fx.demo.contacts.app"); //$NON-NLS-1$
+ return bundle.getEntryPaths("vcards"); //$NON-NLS-1$
+ }
+
+ /**
+ * Reads a Contact from a VCard. This method cannot parse a generic VCard,
+ * but can only parse VCards created with Microsoft Outlook. The intention
+ * is not to provide a generic VCard reader but an easy way to get contact
+ * data (including pictures) in the repository.
+ *
+ * @param fileName
+ * the vcard file
+ * @return the created Contact
+ */
+ public Contact readFromVCard(String fileName) {
+ Contact contact = ContactsFactory.eINSTANCE.createContact();
+ contact.setSourceFile(fileName);
+ BufferedReader bufferedReader = null;
+ String charSet = "Cp1252";
+
+ /*
+ * first try to guess the char set (currently not working under some
+ * JVMs
+ */
+
+ /*
+ * try { bufferedReader = new BufferedReader(new InputStreamReader( new
+ * FileInputStream(fileName))); String line; while ((line =
+ * bufferedReader.readLine()) != null) { int index =
+ * line.indexOf("CHARSET="); if (index != -1) { int endIndex = index +
+ * 8; while (line.charAt(endIndex) != ':' && line.charAt(endIndex) !=
+ * ';') { endIndex += 1; } charSet = line.substring(index + 8,
+ * endIndex); break; } } } catch (FileNotFoundException e) { // TODO
+ * Auto-generated catch block e.printStackTrace();
+ *
+ * } catch (IOException e) { // TODO Auto-generated catch block
+ * e.printStackTrace(); } finally { try { if (bufferedReader != null) {
+ * bufferedReader.close(); } } catch (IOException e) { // TODO
+ * Auto-generated catch block e.printStackTrace(); } }
+ */
+
+ // Then parse the vCard
+ try {
+ InputStreamReader inputStreamReader = new InputStreamReader(new FileInputStream(fileName), charSet);
+ bufferedReader = new BufferedReader(inputStreamReader);
+ String line;
+ String value;
+ while ((line = bufferedReader.readLine()) != null) {
+ value = getVCardValue(line, "N");
+ if (value != null) {
+ String[] result = value.split(";");
+
+ if (result.length > 0) {
+ contact.setLastName(result[0]);
+ }
+ if (result.length > 1) {
+ contact.setFirstName(result[1]);
+ }
+ if (result.length > 2) {
+ contact.setMiddleName(result[2]);
+ }
+ if (result.length > 3) {
+ contact.setTitle(result[3]);
+ }
+ continue;
+ }
+ value = getVCardValue(line, "TEL;WORK");
+ if (value != null) {
+ contact.setPhone(value);
+ continue;
+ }
+ value = getVCardValue(line, "TEL;CELL");
+ if (value != null) {
+ contact.setMobile(value);
+ continue;
+ }
+ value = getVCardValue(line, "ADR;WORK");
+ if (value != null) {
+ String[] result = value.split(";");
+
+ if (result.length > 2) {
+ contact.setStreet(result[2]);
+ }
+ if (result.length > 3) {
+ contact.setCity(result[3]);
+ }
+ if (result.length > 4) {
+ contact.setState(result[4]);
+ }
+ if (result.length > 5) {
+ contact.setZip(result[5]);
+ }
+ if (result.length > 6) {
+ contact.setCountry(result[6]);
+ }
+ continue;
+ }
+ value = getVCardValue(line, "EMAIL;PREF;INTERNET");
+ if (value != null) {
+ contact.setEmail(value);
+ continue;
+ }
+ value = getVCardValue(line, "URL;WORK");
+ if (value != null) {
+ contact.setWebPage(value);
+ continue;
+ }
+ value = getVCardValue(line, "ORG");
+ if (value != null) {
+ contact.setCompany(value);
+ continue;
+ }
+ value = getVCardValue(line, "TITLE");
+ if (value != null) {
+ contact.setJobTitle(value);
+ continue;
+ }
+ value = getVCardValue(line, "NOTE");
+ if (value != null) {
+ contact.setNote(value);
+ continue;
+ }
+ value = getVCardValue(line, "PHOTO;TYPE=JPEG;ENCODING=BASE64");
+ if (value != null) {
+ line = bufferedReader.readLine();
+ StringBuilder builder = new StringBuilder();
+ while (line != null && line.length() > 0 && line.charAt(0) == ' ') {
+ builder.append(line.trim());
+ line = bufferedReader.readLine();
+ }
+ String jpegString = builder.toString();
+
+ contact.setJpegString(jpegString);
+ continue;
+ }
+ }
+ } catch (FileNotFoundException e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+
+ } catch (IOException e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ } finally {
+ try {
+ if (bufferedReader != null) {
+ bufferedReader.close();
+ }
+ } catch (IOException e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ }
+ }
+ return contact;
+ }
+
+ private String getVCardValue(String line, String token) {
+ if (line.startsWith(token + ":") || line.startsWith(token + ";")) {
+ String value = line.substring(line.indexOf(":") + 1);
+ return value;
+ }
+ return null;
+ }
+
+}
diff --git a/demos/org.eclipse.fx.demo.contacts.app/src/org/eclipse/fx/demo/contacts/processors/AbstractThemeProcessor.java b/demos/org.eclipse.fx.demo.contacts.app/src/org/eclipse/fx/demo/contacts/processors/AbstractThemeProcessor.java
new file mode 100755
index 000000000..4d0595526
--- /dev/null
+++ b/demos/org.eclipse.fx.demo.contacts.app/src/org/eclipse/fx/demo/contacts/processors/AbstractThemeProcessor.java
@@ -0,0 +1,119 @@
+/*******************************************************************************
+ * Copyright (c) 2010 BestSolution.at, Siemens AG 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:
+ * Tom Schindl <tom.schindl@bestsolution.at> - initial API and implementation
+ * Kai T��dter - Adoption to contacts demo
+ ******************************************************************************/
+package org.eclipse.fx.demo.contacts.processors;
+
+import java.util.List;
+
+import org.eclipse.core.runtime.IConfigurationElement;
+import org.eclipse.core.runtime.IExtension;
+import org.eclipse.core.runtime.IExtensionPoint;
+import org.eclipse.core.runtime.IExtensionRegistry;
+import org.eclipse.core.runtime.RegistryFactory;
+import org.eclipse.e4.core.di.annotations.Execute;
+import org.eclipse.e4.ui.model.application.MApplication;
+import org.eclipse.e4.ui.model.application.commands.MCommand;
+import org.eclipse.e4.ui.model.application.commands.MCommandsFactory;
+import org.eclipse.e4.ui.model.application.commands.MParameter;
+import org.eclipse.fx.ui.services.theme.Theme;
+import org.eclipse.fx.ui.services.theme.ThemeManager;
+import org.osgi.framework.Bundle;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.FrameworkUtil;
+import org.osgi.framework.ServiceReference;
+
+@SuppressWarnings("restriction")
+public abstract class AbstractThemeProcessor {
+
+ @Execute
+ public void process() {
+ if (!check()) {
+ return;
+ }
+
+ // FIXME Remove once bug 314091 is resolved
+ Bundle bundle = FrameworkUtil.getBundle(getClass());
+ BundleContext context = bundle.getBundleContext();
+
+ ServiceReference reference = context.getServiceReference(ThemeManager.class.getName());
+ ThemeManager themeManager = (ThemeManager) context.getService(reference);
+
+ List<Theme> themes = themeManager.getAvailableThemes();
+ if (themes.size() > 0) {
+ MApplication application = getApplication();
+
+ MCommand switchThemeCommand = null;
+ for (MCommand cmd : application.getCommands()) {
+ if ("contacts.switchTheme".equals(cmd.getElementId())) { //$NON-NLS-1$
+ switchThemeCommand = cmd;
+ break;
+ }
+ }
+
+ if (switchThemeCommand != null) {
+
+ preprocess();
+
+ for (Theme theme : themes) {
+ MParameter parameter = MCommandsFactory.INSTANCE.createParameter();
+ parameter.setName("contacts.commands.switchtheme.themeid"); //$NON-NLS-1$
+ parameter.setValue(theme.getId());
+ String iconURI = getCSSUri(theme.getId());
+ if (iconURI != null) {
+ iconURI = iconURI.replace(".css", ".png");
+ }
+ processTheme(theme.getName(), switchThemeCommand, parameter, iconURI);
+ }
+
+ postprocess();
+ }
+ }
+ }
+
+ abstract protected boolean check();
+
+ abstract protected void preprocess();
+
+ abstract protected void processTheme(String name, MCommand switchCommand, MParameter themeId, String iconURI);
+
+ abstract protected void postprocess();
+
+ abstract protected MApplication getApplication();
+
+ private String getCSSUri(String themeId) {
+ IExtensionRegistry registry = RegistryFactory.getRegistry();
+ IExtensionPoint extPoint = registry.getExtensionPoint("org.eclipse.fx.ui.theme");
+
+ for (IExtension e : extPoint.getExtensions()) {
+ for (IConfigurationElement ce : e.getConfigurationElements()) {
+ if (ce.getName().equals("theme") && ce.getAttribute("id").equals(themeId)) {
+ return "platform:/plugin/" + ce.getContributor().getName() + "/"
+ + ce.getAttribute("basestylesheet");
+ }
+ }
+ }
+ return null;
+ }
+
+ protected boolean isAreadyProcessed(String processorId) {
+ MApplication application = getApplication();
+ List<String> tags = application.getTags();
+ for (String tag : tags) {
+ if (processorId.equals(tag)) {
+ return true; // already processed
+ }
+ }
+ tags.add(processorId);
+ return false;
+ }
+
+}
diff --git a/demos/org.eclipse.fx.demo.contacts.app/src/org/eclipse/fx/demo/contacts/processors/MenuThemeProcessor.java b/demos/org.eclipse.fx.demo.contacts.app/src/org/eclipse/fx/demo/contacts/processors/MenuThemeProcessor.java
new file mode 100755
index 000000000..dd48d12b9
--- /dev/null
+++ b/demos/org.eclipse.fx.demo.contacts.app/src/org/eclipse/fx/demo/contacts/processors/MenuThemeProcessor.java
@@ -0,0 +1,73 @@
+/*******************************************************************************
+ * Copyright (c) 2010 BestSolution.at, Siemens AG 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:
+ * Tom Schindl <tom.schindl@bestsolution.at> - initial API and implementation
+ * Kai T??dter - Adoption to contacts demo
+ ******************************************************************************/
+package org.eclipse.fx.demo.contacts.processors;
+
+import javax.inject.Inject;
+import javax.inject.Named;
+
+import org.eclipse.e4.ui.model.application.MApplication;
+import org.eclipse.e4.ui.model.application.commands.MCommand;
+import org.eclipse.e4.ui.model.application.commands.MParameter;
+import org.eclipse.e4.ui.model.application.ui.menu.MHandledMenuItem;
+import org.eclipse.e4.ui.model.application.ui.menu.MMenu;
+import org.eclipse.e4.ui.model.application.ui.menu.MMenuFactory;
+import org.eclipse.emf.ecore.EObject;
+
+public class MenuThemeProcessor extends AbstractThemeProcessor {
+
+ private static final String BUNDLE_ID = "platform:/plugin/org.eclipse.fx.demo.contacts.app"; //$NON-NLS-1$
+ private final static String PROCESSOR_ID = "org.eclipse.fx.demo.contacts.processors.theme.menu";
+
+ @Inject
+ @Named("menu:org.eclipse.ui.main.menu")
+ private MMenu menu;
+ private MMenu themesMenu;
+
+ @Override
+ protected boolean check() {
+ if (isAreadyProcessed(PROCESSOR_ID)) {
+ return false;
+ }
+ return menu != null;
+ }
+
+ @Override
+ protected void preprocess() {
+ themesMenu = MMenuFactory.INSTANCE.createMenu();
+ themesMenu.setLabel("%switchThemeMenu"); //$NON-NLS-1$
+ themesMenu.setContributorURI(BUNDLE_ID);
+ }
+
+ @Override
+ protected void processTheme(String name, MCommand switchCommand, MParameter themeId, String iconURI) {
+ MHandledMenuItem menuItem = MMenuFactory.INSTANCE.createHandledMenuItem();
+ menuItem.setLabel(name);
+ menuItem.setCommand(switchCommand);
+ menuItem.getParameters().add(themeId);
+ menuItem.setContributorURI(BUNDLE_ID);
+ if (iconURI != null) {
+ menuItem.setIconURI(iconURI);
+ }
+ themesMenu.getChildren().add(menuItem);
+ }
+
+ @Override
+ protected void postprocess() {
+ menu.getChildren().add(themesMenu);
+ }
+
+ @Override
+ protected MApplication getApplication() {
+ return (MApplication) (((EObject) menu).eContainer()).eContainer();
+ }
+}
diff --git a/demos/org.eclipse.fx.demo.contacts.app/src/org/eclipse/fx/demo/contacts/processors/ToolbarThemeProcessor.java b/demos/org.eclipse.fx.demo.contacts.app/src/org/eclipse/fx/demo/contacts/processors/ToolbarThemeProcessor.java
new file mode 100755
index 000000000..e23a9c3de
--- /dev/null
+++ b/demos/org.eclipse.fx.demo.contacts.app/src/org/eclipse/fx/demo/contacts/processors/ToolbarThemeProcessor.java
@@ -0,0 +1,71 @@
+/*******************************************************************************
+ * Copyright (c) 2010 Siemens AG 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:
+ * Kai T??dter - initial implementation
+ ******************************************************************************/
+
+package org.eclipse.fx.demo.contacts.processors;
+
+import javax.inject.Inject;
+import javax.inject.Named;
+
+import org.eclipse.e4.ui.model.application.MApplication;
+import org.eclipse.e4.ui.model.application.commands.MCommand;
+import org.eclipse.e4.ui.model.application.commands.MParameter;
+import org.eclipse.e4.ui.model.application.ui.basic.MTrimBar;
+import org.eclipse.e4.ui.model.application.ui.menu.MHandledToolItem;
+import org.eclipse.e4.ui.model.application.ui.menu.MMenuFactory;
+import org.eclipse.e4.ui.model.application.ui.menu.MToolBar;
+import org.eclipse.emf.ecore.EObject;
+
+@SuppressWarnings("restriction")
+public class ToolbarThemeProcessor extends AbstractThemeProcessor {
+
+ private final static String PROCESSOR_ID = "org.eclipse.fx.demo.contacts.processors.theme.toolbar";
+
+ @Inject
+ @Named("toolbar:org.eclipse.ui.main.toolbar")
+ private MTrimBar topBar;
+ private MToolBar toolBar;
+
+ @Override
+ protected boolean check() {
+ if (isAreadyProcessed(PROCESSOR_ID)) {
+ return false;
+ }
+ return topBar != null;
+ }
+
+ @Override
+ protected void preprocess() {
+ toolBar = MMenuFactory.INSTANCE.createToolBar();
+ topBar.getChildren().add(toolBar);
+ }
+
+ @Override
+ protected void processTheme(String name, MCommand switchCommand, MParameter themeId, String iconURI) {
+ MHandledToolItem toolItem = MMenuFactory.INSTANCE.createHandledToolItem();
+ toolItem.setTooltip(name);
+ toolItem.setCommand(switchCommand);
+ toolItem.getParameters().add(themeId);
+ if (iconURI != null) {
+ toolItem.setIconURI(iconURI);
+ }
+ toolBar.getChildren().add(toolItem);
+ }
+
+ @Override
+ protected void postprocess() {
+ }
+
+ @Override
+ protected MApplication getApplication() {
+ return (MApplication) (((EObject) topBar).eContainer()).eContainer();
+ }
+}
diff --git a/demos/org.eclipse.fx.demo.contacts.app/src/org/eclipse/fx/demo/contacts/views/ContactsListView.java b/demos/org.eclipse.fx.demo.contacts.app/src/org/eclipse/fx/demo/contacts/views/ContactsListView.java
new file mode 100755
index 000000000..491661da0
--- /dev/null
+++ b/demos/org.eclipse.fx.demo.contacts.app/src/org/eclipse/fx/demo/contacts/views/ContactsListView.java
@@ -0,0 +1,86 @@
+/*******************************************************************************
+ * Copyright (c) 2012 TESIS DYNAware GmbH 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:
+ * Torsten Sommer <torsten.sommer@tesis.de> - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.fx.demo.contacts.views;
+
+import java.util.List;
+
+import javafx.beans.value.ChangeListener;
+import javafx.beans.value.ObservableValue;
+import javafx.collections.ListChangeListener;
+import javafx.scene.control.ListView;
+import javafx.scene.control.SelectionMode;
+import javafx.scene.layout.BorderPane;
+
+import javax.inject.Inject;
+
+import org.eclipse.e4.ui.model.application.MApplication;
+import org.eclipse.emf.common.notify.AdapterFactory;
+import org.eclipse.emf.edit.domain.EditingDomain;
+import org.eclipse.fx.demo.contacts.ContactsPackage;
+import org.eclipse.fx.demo.contacts.model.ContactsManager;
+import org.eclipse.fx.emf.edit.ui.AdapterFactoryListCellFactory;
+import org.eclipse.fx.emf.edit.ui.AdapterFactoryObservableList;
+import org.eclipse.fx.emf.edit.ui.EAttributeCellEditHandler;
+import org.eclipse.fx.emf.edit.ui.dnd.CellDragAdapter;
+import org.eclipse.fx.emf.edit.ui.dnd.EditingDomainCellDropAdapter;
+
+
+@SuppressWarnings("restriction")
+public class ContactsListView {
+
+ @Inject
+ public ContactsListView(BorderPane parent, final MApplication application, final ContactsManager contactsManager) {
+ EditingDomain editingDomain = contactsManager.getEditingDomain();
+ AdapterFactory adapterFactory = contactsManager.getAdapterFactory();
+
+ ListView<Object> listView = new ListView<>();
+
+ parent.setCenter(listView);
+
+ listView.setItems(new AdapterFactoryObservableList<Object>(adapterFactory, contactsManager.getRootGroup()));
+ listView.getSelectionModel().setSelectionMode(SelectionMode.MULTIPLE);
+
+ AdapterFactoryListCellFactory listCellFactory = new AdapterFactoryListCellFactory(adapterFactory);
+ listCellFactory.addCellCreationListener(new CellDragAdapter());
+ EditingDomainCellDropAdapter dropAdapter = new EditingDomainCellDropAdapter(editingDomain);
+ dropAdapter.setFeedbackHandler(new CustomFeedbackHandler());
+ listCellFactory.addCellCreationListener(dropAdapter);
+ listView.setCellFactory(listCellFactory);
+
+ // add edit support
+ listView.setEditable(true);
+ listCellFactory.addCellEditHandler(new EAttributeCellEditHandler(ContactsPackage.eINSTANCE.getGroup_Name(), editingDomain));
+
+ // add the context menu
+ ContextMenuProvider contextMenuProvider = new ContextMenuProvider(contactsManager);
+ listCellFactory.addCellUpdateListener(contextMenuProvider);
+
+ listView.getSelectionModel().setSelectionMode(SelectionMode.MULTIPLE);
+
+ listView.getSelectionModel().getSelectedItems().addListener(new ListChangeListener<Object>() {
+
+ @Override
+ public void onChanged(Change<?> change) {
+ application.getContext().set(List.class, change.getList());
+ }
+
+ });
+
+ listView.getSelectionModel().selectedItemProperty().addListener(new ChangeListener<Object>() {
+
+ public void changed(ObservableValue<? extends Object> arg0, Object arg1, Object arg2) {
+ application.getContext().set(Object.class, arg2);
+ }
+
+ });
+ }
+
+}
diff --git a/demos/org.eclipse.fx.demo.contacts.app/src/org/eclipse/fx/demo/contacts/views/ContactsTableView.java b/demos/org.eclipse.fx.demo.contacts.app/src/org/eclipse/fx/demo/contacts/views/ContactsTableView.java
new file mode 100755
index 000000000..6574cec49
--- /dev/null
+++ b/demos/org.eclipse.fx.demo.contacts.app/src/org/eclipse/fx/demo/contacts/views/ContactsTableView.java
@@ -0,0 +1,104 @@
+/*******************************************************************************
+ * Copyright (c) 2012 TESIS DYNAware GmbH 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:
+ * Torsten Sommer <torsten.sommer@tesis.de> - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.fx.demo.contacts.views;
+
+import java.util.List;
+
+import javafx.beans.value.ChangeListener;
+import javafx.beans.value.ObservableValue;
+import javafx.collections.ListChangeListener;
+import javafx.scene.control.SelectionMode;
+import javafx.scene.control.TableColumn;
+import javafx.scene.control.TableView;
+import javafx.scene.layout.BorderPane;
+
+import javax.inject.Inject;
+
+import org.eclipse.e4.ui.model.application.MApplication;
+import org.eclipse.emf.common.notify.AdapterFactory;
+import org.eclipse.emf.edit.domain.EditingDomain;
+import org.eclipse.fx.demo.contacts.ContactsPackage;
+import org.eclipse.fx.demo.contacts.model.ContactsManager;
+import org.eclipse.fx.emf.edit.ui.AdapterFactoryObservableList;
+import org.eclipse.fx.emf.edit.ui.AdapterFactoryTableCellFactory;
+import org.eclipse.fx.emf.edit.ui.EAttributeCellEditHandler;
+import org.eclipse.fx.emf.edit.ui.ProxyCellValueFactory;
+import org.eclipse.fx.emf.edit.ui.dnd.CellDragAdapter;
+import org.eclipse.fx.emf.edit.ui.dnd.EditingDomainCellDropAdapter;
+
+
+@SuppressWarnings("restriction")
+public class ContactsTableView {
+
+ @Inject
+ public ContactsTableView(BorderPane parent, final MApplication application, final ContactsManager contactsManager) {
+ EditingDomain editingDomain = contactsManager.getEditingDomain();
+ AdapterFactory adapterFactory = contactsManager.getAdapterFactory();
+
+ TableView<Object> tableView = new TableView<>();
+
+ parent.setCenter(tableView);
+
+ TableColumn<Object, Object> firstNameColumn = new TableColumn<>("First Name");
+ TableColumn<Object, Object> lastNameColumn = new TableColumn<>("Last Name");
+
+ tableView.getColumns().addAll(firstNameColumn, lastNameColumn);
+
+ firstNameColumn.setCellValueFactory(new ProxyCellValueFactory<Object, Object>());
+ AdapterFactoryTableCellFactory<Object, Object> firstNameCellFactory = new AdapterFactoryTableCellFactory<>(adapterFactory, 0);
+ firstNameCellFactory.addCellCreationListener(new CellDragAdapter());
+ firstNameCellFactory.addCellCreationListener(new EditingDomainCellDropAdapter(editingDomain));
+ firstNameColumn.setCellFactory(firstNameCellFactory);
+ firstNameColumn.setSortable(false);
+
+ lastNameColumn.setCellValueFactory(new ProxyCellValueFactory<Object, Object>());
+ AdapterFactoryTableCellFactory<Object, Object> lastNameCellFactory = new AdapterFactoryTableCellFactory<Object, Object>(
+ adapterFactory, 1);
+ lastNameCellFactory.addCellCreationListener(new CellDragAdapter());
+ lastNameCellFactory.addCellCreationListener(new EditingDomainCellDropAdapter(editingDomain));
+ lastNameColumn.setCellFactory(lastNameCellFactory);
+ lastNameColumn.setSortable(false);
+
+ tableView.setItems(new AdapterFactoryObservableList<Object>(adapterFactory, contactsManager.getRootGroup()));
+ tableView.getSelectionModel().setSelectionMode(SelectionMode.MULTIPLE);
+
+ // add edit support
+ tableView.setEditable(true);
+ firstNameCellFactory.addCellEditHandler(new EAttributeCellEditHandler(ContactsPackage.eINSTANCE.getContact_FirstName(),
+ editingDomain));
+ lastNameCellFactory
+ .addCellEditHandler(new EAttributeCellEditHandler(ContactsPackage.eINSTANCE.getContact_LastName(), editingDomain));
+
+ // add the context menu
+ ContextMenuProvider contextMenuProvider = new ContextMenuProvider(contactsManager);
+ firstNameCellFactory.addCellUpdateListener(contextMenuProvider);
+ lastNameCellFactory.addCellUpdateListener(contextMenuProvider);
+
+ tableView.getSelectionModel().getSelectedItems().addListener(new ListChangeListener<Object>() {
+
+ @Override
+ public void onChanged(Change<?> change) {
+ application.getContext().set(List.class, change.getList());
+ }
+
+ });
+
+ tableView.getSelectionModel().selectedItemProperty().addListener(new ChangeListener<Object>() {
+
+ public void changed(ObservableValue<? extends Object> arg0, Object arg1, Object arg2) {
+ application.getContext().set(Object.class, arg2);
+ }
+
+ });
+
+ }
+
+}
diff --git a/demos/org.eclipse.fx.demo.contacts.app/src/org/eclipse/fx/demo/contacts/views/ContactsTreeView.java b/demos/org.eclipse.fx.demo.contacts.app/src/org/eclipse/fx/demo/contacts/views/ContactsTreeView.java
new file mode 100755
index 000000000..e6074166e
--- /dev/null
+++ b/demos/org.eclipse.fx.demo.contacts.app/src/org/eclipse/fx/demo/contacts/views/ContactsTreeView.java
@@ -0,0 +1,102 @@
+/*******************************************************************************
+ * Copyright (c) 2012 TESIS DYNAware GmbH 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:
+ * Torsten Sommer <torsten.sommer@tesis.de> - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.fx.demo.contacts.views;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import javafx.beans.value.ChangeListener;
+import javafx.beans.value.ObservableValue;
+import javafx.collections.ListChangeListener;
+import javafx.scene.control.SelectionMode;
+import javafx.scene.control.TreeView;
+import javafx.scene.layout.BorderPane;
+
+import javax.inject.Inject;
+
+import org.eclipse.e4.ui.model.application.MApplication;
+import org.eclipse.emf.edit.domain.EditingDomain;
+import org.eclipse.fx.demo.contacts.Contact;
+import org.eclipse.fx.demo.contacts.ContactsPackage;
+import org.eclipse.fx.demo.contacts.model.ContactsManager;
+import org.eclipse.fx.emf.edit.ui.AdapterFactoryTreeCellFactory;
+import org.eclipse.fx.emf.edit.ui.AdapterFactoryTreeItem;
+import org.eclipse.fx.emf.edit.ui.EAttributeCellEditHandler;
+import org.eclipse.fx.emf.edit.ui.dnd.CellDragAdapter;
+import org.eclipse.fx.emf.edit.ui.dnd.EditingDomainCellDropAdapter;
+
+
+@SuppressWarnings("restriction")
+public class ContactsTreeView {
+
+ @Inject
+ public ContactsTreeView(BorderPane parent, final MApplication application, final ContactsManager contactsManager) {
+ EditingDomain editingDomain = contactsManager.getEditingDomain();
+
+ // TreeView
+ TreeView<Object> treeView = new TreeView<>();
+ treeView.setRoot(new AdapterFactoryTreeItem(contactsManager.getRootGroup(), treeView, contactsManager.getAdapterFactory()));
+ AdapterFactoryTreeCellFactory treeCellFactory = new AdapterFactoryTreeCellFactory(contactsManager.getAdapterFactory());
+
+ // add edit support
+ treeCellFactory.addCellEditHandler(new EAttributeCellEditHandler(ContactsPackage.eINSTANCE.getGroup_Name(), editingDomain));
+
+ // adds drag support
+ treeCellFactory.addCellCreationListener(new CellDragAdapter());
+
+ // adds drop support
+ EditingDomainCellDropAdapter dropAdapter = new EditingDomainCellDropAdapter(editingDomain);
+ dropAdapter.setFeedbackHandler(new CustomFeedbackHandler());
+ treeCellFactory.addCellCreationListener(dropAdapter);
+
+ treeView.setCellFactory(treeCellFactory);
+
+ parent.setCenter(treeView);
+
+ treeView.setShowRoot(false);
+
+ treeView.getSelectionModel().setSelectionMode(SelectionMode.MULTIPLE);
+
+ treeView.getSelectionModel().selectedItemProperty().addListener(new ChangeListener<Object>() {
+
+ public void changed(ObservableValue<? extends Object> arg0, Object arg1, Object arg2) {
+ if (arg2 instanceof AdapterFactoryTreeItem) {
+ Object value = ((AdapterFactoryTreeItem) arg2).getValue();
+ if (value instanceof Contact)
+ application.getContext().set(Object.class, value);
+ }
+ }
+
+ });
+
+ treeView.getSelectionModel().getSelectedItems().addListener(new ListChangeListener<Object>() {
+
+ @Override
+ public void onChanged(Change<?> change) {
+ ArrayList<Object> selection = new ArrayList<Object>();
+ for (Object item : change.getList()) {
+ if (item instanceof AdapterFactoryTreeItem) {
+ Object value = ((AdapterFactoryTreeItem) item).getValue();
+ selection.add(value);
+ }
+ }
+ application.getContext().set(List.class, selection);
+ }
+
+ });
+
+ // add the context menu
+ ContextMenuProvider contextMenuProvider = new ContextMenuProvider(contactsManager);
+ treeCellFactory.addCellUpdateListener(contextMenuProvider);
+
+ treeView.setEditable(true);
+ }
+}
diff --git a/demos/org.eclipse.fx.demo.contacts.app/src/org/eclipse/fx/demo/contacts/views/ContextMenuProvider.java b/demos/org.eclipse.fx.demo.contacts.app/src/org/eclipse/fx/demo/contacts/views/ContextMenuProvider.java
new file mode 100755
index 000000000..2567674fe
--- /dev/null
+++ b/demos/org.eclipse.fx.demo.contacts.app/src/org/eclipse/fx/demo/contacts/views/ContextMenuProvider.java
@@ -0,0 +1,156 @@
+/*******************************************************************************
+ * Copyright (c) 2012 TESIS DYNAware GmbH 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:
+ * Torsten Sommer <torsten.sommer@tesis.de> - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.fx.demo.contacts.views;
+
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.fx.demo.contacts.handlers.CopyHandler;
+import org.eclipse.fx.demo.contacts.handlers.CutHandler;
+import org.eclipse.fx.demo.contacts.handlers.DeleteContactHandler;
+import org.eclipse.fx.demo.contacts.handlers.PasteHandler;
+import org.eclipse.fx.demo.contacts.model.ContactsManager;
+import org.eclipse.fx.emf.edit.ui.AdapterFactoryCellFactory.ICellUpdateListener;
+
+import javafx.collections.ObservableList;
+import javafx.event.ActionEvent;
+import javafx.event.EventHandler;
+import javafx.scene.control.Cell;
+import javafx.scene.control.ContextMenu;
+import javafx.scene.control.ListCell;
+import javafx.scene.control.MenuItem;
+import javafx.scene.control.MultipleSelectionModel;
+import javafx.scene.control.TableCell;
+import javafx.scene.control.TableRow;
+import javafx.scene.control.TreeCell;
+import javafx.scene.control.TreeItem;
+import javafx.scene.image.Image;
+import javafx.scene.image.ImageView;
+import javafx.stage.WindowEvent;
+
+public class ContextMenuProvider implements ICellUpdateListener {
+
+ ContactsManager contactsManager;
+ private DeleteContactHandler deleteHandler;
+ private MenuItem deleteMenuItem;
+ CutHandler cutHandler;
+ private MenuItem cutMenuItem;
+ private CopyHandler copyHandler;
+ private MenuItem copyMenuItem;
+ private PasteHandler pasteHandler;
+ private MenuItem pasteMenuItem;
+
+ public ContextMenuProvider(ContactsManager contactsManager) {
+ this.contactsManager = contactsManager;
+ }
+
+ static List<?> getSelectionModel(Cell<?> cell) {
+ if (cell instanceof ListCell<?>) {
+ return ((ListCell<?>) cell).getListView().getSelectionModel().getSelectedItems();
+ } else if (cell instanceof TreeCell<?>) {
+ MultipleSelectionModel<?> selectionModel = ((TreeCell<?>) cell).getTreeView().getSelectionModel();
+ ObservableList<?> selectedItems = selectionModel.getSelectedItems();
+ ArrayList<Object> unwrappedItems = new ArrayList<>(selectedItems.size());
+ for (Object object : selectedItems) {
+ TreeItem<?> treeItem = (TreeItem<?>) object;
+ unwrappedItems.add(treeItem.getValue());
+ }
+ return unwrappedItems;
+ } else if (cell instanceof TableCell<?, ?>) {
+ return ((TableCell<?, ?>) cell).getTableView().getSelectionModel().getSelectedItems();
+ } else if (cell instanceof TableRow<?>) {
+ return ((TableRow<?>) cell).getTableView().getSelectionModel().getSelectedItems();
+ }
+ return null;
+ }
+
+ @Override
+ public void updateItem(final Cell<?> cell, final Object item, boolean empty) {
+
+ final ContextMenu contextMenu = new ContextMenu();
+ cell.setContextMenu(contextMenu);
+ contextMenu.getItems().add(new MenuItem());
+ contextMenu.setOnShowing(new EventHandler<WindowEvent>() {
+
+ @Override
+ public void handle(WindowEvent event) {
+ List<?> selectedItems = getSelectionModel(cell);
+ deleteMenuItem.setDisable(!deleteHandler.canExecute(selectedItems));
+ cutMenuItem.setDisable(!cutHandler.canExecute(selectedItems));
+ copyMenuItem.setDisable(!copyHandler.canExecute(selectedItems));
+
+ Object item2 = cell.getItem();
+
+ pasteMenuItem.setDisable(!pasteHandler.canExecute(item2));
+ contextMenu.getItems().clear();
+ contextMenu.getItems().add(deleteMenuItem);
+ contextMenu.getItems().add(cutMenuItem);
+ contextMenu.getItems().add(copyMenuItem);
+ contextMenu.getItems().add(pasteMenuItem);
+ }
+
+ });
+
+ deleteMenuItem = new MenuItem("Delete", getImage("icons/silk/cross.png"));
+ deleteHandler = new DeleteContactHandler(contactsManager);
+ deleteMenuItem.setOnAction(new EventHandler<ActionEvent>() {
+ @Override
+ public void handle(ActionEvent event) {
+ deleteHandler.execute();
+ }
+ });
+
+ cutMenuItem = new MenuItem("Cut", getImage("icons/silk/cut.png"));
+ cutHandler = new CutHandler(contactsManager);
+ cutMenuItem.setOnAction(new EventHandler<ActionEvent>() {
+ @Override
+ public void handle(ActionEvent event) {
+ cutHandler.execute();
+ }
+ });
+
+ copyMenuItem = new MenuItem("Copy", getImage("icons/silk/page_copy.png"));
+ copyHandler = new CopyHandler(contactsManager);
+ copyMenuItem.setOnAction(new EventHandler<ActionEvent>() {
+
+ @Override
+ public void handle(ActionEvent event) {
+ copyHandler.execute();
+ }
+
+ });
+
+ pasteMenuItem = new MenuItem("Paste", getImage("icons/silk/page_paste.png"));
+ pasteHandler = new PasteHandler(contactsManager);
+ pasteMenuItem.setOnAction(new EventHandler<ActionEvent>() {
+
+ @Override
+ public void handle(ActionEvent event) {
+ pasteHandler.execute();
+ }
+
+ });
+
+ }
+
+ private ImageView getImage(String path) {
+ try {
+ URL url = new URL("platform:/plugin/org.eclipse.fx.demo.contacts.app/" + path);
+ Image image = new Image(url.toExternalForm());
+ return new ImageView(image);
+ } catch (MalformedURLException e) {
+ throw new IllegalArgumentException(e);
+ }
+ }
+
+}
diff --git a/demos/org.eclipse.fx.demo.contacts.app/src/org/eclipse/fx/demo/contacts/views/CustomFeedbackHandler.java b/demos/org.eclipse.fx.demo.contacts.app/src/org/eclipse/fx/demo/contacts/views/CustomFeedbackHandler.java
new file mode 100755
index 000000000..c8249940c
--- /dev/null
+++ b/demos/org.eclipse.fx.demo.contacts.app/src/org/eclipse/fx/demo/contacts/views/CustomFeedbackHandler.java
@@ -0,0 +1,34 @@
+package org.eclipse.fx.demo.contacts.views;
+
+import org.eclipse.fx.emf.edit.ui.dnd.EditingDomainCellDropAdapter.IDnDFeedbackHandler;
+
+import javafx.scene.control.Cell;
+import javafx.scene.control.TableView;
+
+/**
+ * A custom {@link IDnDFeedbackHandler} that increases the padding to make room
+ * for the dragged {@link Cell}. This does not work well with {@link TableView}s.
+ */
+public class CustomFeedbackHandler implements IDnDFeedbackHandler {
+
+ @Override
+ public void onFeedbackInsertBefore(Cell<?> cell) {
+ cell.setStyle("-fx-padding: 15 3 3 3;");
+ }
+
+ @Override
+ public void onFeedbackInsertAfter(Cell<?> cell) {
+ cell.setStyle("-fx-padding: 3 3 15 3;");
+ }
+
+ @Override
+ public void onFeedbackSelect(Cell<?> cell) {
+ cell.setStyle(null);
+ }
+
+ @Override
+ public void onFeedbackNone(Cell<?> cell) {
+ cell.setStyle(null);
+ }
+
+} \ No newline at end of file
diff --git a/demos/org.eclipse.fx.demo.contacts.app/src/org/eclipse/fx/demo/contacts/views/DetailsView.java b/demos/org.eclipse.fx.demo.contacts.app/src/org/eclipse/fx/demo/contacts/views/DetailsView.java
new file mode 100755
index 000000000..b1319d0d2
--- /dev/null
+++ b/demos/org.eclipse.fx.demo.contacts.app/src/org/eclipse/fx/demo/contacts/views/DetailsView.java
@@ -0,0 +1,61 @@
+/*******************************************************************************
+ * Copyright (c) 2012 TESIS DYNAware GmbH 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:
+ * Torsten Sommer <torsten.sommer@tesis.de> - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.fx.demo.contacts.views;
+
+import java.io.IOException;
+import java.net.URL;
+
+import javafx.fxml.FXMLLoader;
+import javafx.scene.layout.BorderPane;
+import javafx.scene.layout.Pane;
+
+import javax.inject.Inject;
+
+import org.eclipse.e4.core.di.annotations.Optional;
+import org.eclipse.e4.ui.model.application.MApplication;
+import org.eclipse.fx.demo.contacts.Contact;
+import org.eclipse.fx.demo.contacts.model.ContactsManager;
+
+
+@SuppressWarnings("restriction")
+public class DetailsView {
+
+ DetailsViewController controller;
+
+ @Inject
+ ContactsManager contactsManager;
+
+ @Inject
+ public DetailsView(BorderPane parent, final MApplication application) {
+
+ URL location = getClass().getResource("details.fxml");
+
+ FXMLLoader fxmlLoader = new FXMLLoader(location);
+ controller = new DetailsViewController();
+ fxmlLoader.setController(controller);
+
+ Pane root = null;
+ try {
+ root = (Pane) fxmlLoader.load();
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+
+ parent.setCenter(root);
+ }
+
+ @Inject
+ public void setSelection(@Optional Object selectedItem) {
+ Contact contact = selectedItem instanceof Contact ? (Contact) selectedItem : null;
+ controller.updateBindings(contact, contactsManager.getEditingDomain());
+ }
+
+}
diff --git a/demos/org.eclipse.fx.demo.contacts.app/src/org/eclipse/fx/demo/contacts/views/DetailsViewController.java b/demos/org.eclipse.fx.demo.contacts.app/src/org/eclipse/fx/demo/contacts/views/DetailsViewController.java
new file mode 100755
index 000000000..12953c46e
--- /dev/null
+++ b/demos/org.eclipse.fx.demo.contacts.app/src/org/eclipse/fx/demo/contacts/views/DetailsViewController.java
@@ -0,0 +1,150 @@
+/*******************************************************************************
+ * Copyright (c) 2012 TESIS DYNAware GmbH 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:
+ * Torsten Sommer <torsten.sommer@tesis.de> - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.fx.demo.contacts.views;
+
+import java.io.ByteArrayInputStream;
+
+import javafx.beans.property.Property;
+import javafx.fxml.FXML;
+import javafx.scene.control.TextField;
+import javafx.scene.image.Image;
+import javafx.scene.image.ImageView;
+
+import org.eclipse.emf.ecore.EStructuralFeature;
+import org.eclipse.emf.edit.domain.EditingDomain;
+import org.eclipse.fx.demo.contacts.Contact;
+import org.eclipse.fx.demo.contacts.ContactsPackage;
+import org.eclipse.fx.emf.databinding.edit.EMFEditFXProperties;
+import org.eclipse.osgi.internal.signedcontent.Base64;
+
+@SuppressWarnings("restriction")
+public class DetailsViewController {
+
+ @FXML
+ private ImageView imageView;
+
+ @FXML
+ private TextField title;
+ private Property<String> titleProperty;
+
+ @FXML
+ private TextField firstName;
+ private Property<String> firstNameProperty;
+
+ @FXML
+ private TextField lastName;
+ private Property<String> lastNameProperty;
+
+ @FXML
+ private TextField jobTitle;
+ private Property<String> jobTitleProperty;
+
+ @FXML
+ private TextField note;
+ private Property<String> noteProperty;
+
+ @FXML
+ private TextField street;
+ private Property<String> streetProperty;
+
+ @FXML
+ private TextField city;
+ private Property<String> cityProperty;
+
+ @FXML
+ private TextField zip;
+ private Property<String> zipProperty;
+
+ @FXML
+ private TextField state;
+ private Property<String> stateProperty;
+
+ @FXML
+ private TextField country;
+ private Property<String> countryProperty;
+
+ @FXML
+ private TextField phone;
+ private Property<String> phoneProperty;
+
+ @FXML
+ private TextField mobile;
+ private Property<String> mobileProperty;
+
+ @FXML
+ private TextField email;
+ private Property<String> emailProperty;
+
+ @FXML
+ private TextField webPage;
+ private Property<String> webPageProperty;
+
+ // @FXML
+ // public void initialize() {
+ //
+ // }
+
+ public void updateBindings(Contact contact, EditingDomain editingDomain) {
+ // General
+ titleProperty = rebind(title, titleProperty, contact, ContactsPackage.eINSTANCE.getContact_Title(), editingDomain);
+ firstNameProperty = rebind(firstName, firstNameProperty, contact, ContactsPackage.eINSTANCE.getContact_FirstName(), editingDomain);
+ lastNameProperty = rebind(lastName, lastNameProperty, contact, ContactsPackage.eINSTANCE.getContact_LastName(), editingDomain);
+ jobTitleProperty = rebind(jobTitle, jobTitleProperty, contact, ContactsPackage.eINSTANCE.getContact_JobTitle(), editingDomain);
+ noteProperty = rebind(note, noteProperty, contact, ContactsPackage.eINSTANCE.getContact_Note(), editingDomain);
+
+ // Business Address
+ streetProperty = rebind(street, streetProperty, contact, ContactsPackage.eINSTANCE.getContact_Street(), editingDomain);
+ cityProperty = rebind(city, cityProperty, contact, ContactsPackage.eINSTANCE.getContact_City(), editingDomain);
+ zipProperty = rebind(zip, zipProperty, contact, ContactsPackage.eINSTANCE.getContact_Zip(), editingDomain);
+ stateProperty = rebind(state, stateProperty, contact, ContactsPackage.eINSTANCE.getContact_State(), editingDomain);
+ countryProperty = rebind(country, countryProperty, contact, ContactsPackage.eINSTANCE.getContact_Country(), editingDomain);
+
+ // Business Phones
+ phoneProperty = rebind(phone, phoneProperty, contact, ContactsPackage.eINSTANCE.getContact_Phone(), editingDomain);
+ mobileProperty = rebind(mobile, mobileProperty, contact, ContactsPackage.eINSTANCE.getContact_Mobile(), editingDomain);
+
+ // Business Internet
+ emailProperty = rebind(email, emailProperty, contact, ContactsPackage.eINSTANCE.getContact_Email(), editingDomain);
+ webPageProperty = rebind(webPage, webPageProperty, contact, ContactsPackage.eINSTANCE.getContact_WebPage(), editingDomain);
+
+ // image
+ Image image = null;
+ if (contact != null) {
+ String jpegString = contact.getJpegString();
+ if (jpegString != null) {
+ byte[] imageBytes = Base64.decode(jpegString.getBytes());
+ ByteArrayInputStream is = new ByteArrayInputStream(imageBytes);
+ image = new Image(is);
+ }
+ }
+ imageView.setImage(image);
+ }
+
+ Property<String> rebind(TextField textField, Property<String> oldProperty, Contact contact, EStructuralFeature feature,
+ EditingDomain editingDomain) {
+ if (oldProperty != null)
+ textField.textProperty().unbindBidirectional(oldProperty);
+
+ Property<String> property = null;
+ if (contact != null) {
+ property = EMFEditFXProperties.value(editingDomain, contact, feature);
+ textField.textProperty().bindBidirectional(property);
+ }
+
+ textField.setDisable(contact == null);
+
+ if(contact == null)
+ textField.clear();
+
+ return property;
+ }
+
+}
diff --git a/demos/org.eclipse.fx.demo.contacts.app/src/org/eclipse/fx/demo/contacts/views/details.fxml b/demos/org.eclipse.fx.demo.contacts.app/src/org/eclipse/fx/demo/contacts/views/details.fxml
new file mode 100755
index 000000000..4c8be9d29
--- /dev/null
+++ b/demos/org.eclipse.fx.demo.contacts.app/src/org/eclipse/fx/demo/contacts/views/details.fxml
@@ -0,0 +1,91 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<?import java.lang.*?>
+<?import java.util.*?>
+<?import javafx.geometry.*?>
+<?import javafx.scene.control.*?>
+<?import javafx.scene.image.*?>
+<?import javafx.scene.layout.*?>
+<?import javafx.scene.paint.*?>
+
+<AnchorPane id="AnchorPane" maxHeight="-1.0" maxWidth="-1.0" minHeight="-1.0" minWidth="-1.0" prefHeight="600.0" prefWidth="400.0" xmlns:fx="http://javafx.com/fxml">
+ <children>
+ <ScrollPane fitToWidth="true" prefHeight="10000.0" prefWidth="10000.0" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0">
+ <content>
+ <AnchorPane id="Content" disable="false" minHeight="-1.0" minWidth="-1.0" prefHeight="-1.0" prefWidth="-1.0">
+ <children>
+ <GridPane prefHeight="-1.0" prefWidth="-1.0" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0">
+ <children>
+ <Label styleClass="separator-label" text="General" GridPane.columnIndex="0" GridPane.columnSpan="3" GridPane.rowIndex="0" />
+ <Label text="Title" GridPane.columnIndex="0" GridPane.columnSpan="3" GridPane.rowIndex="1" />
+ <Label text="First Name" GridPane.columnIndex="0" GridPane.rowIndex="2" />
+ <TextField fx:id="title" disable="true" prefWidth="200.0" GridPane.columnIndex="1" GridPane.rowIndex="1" />
+ <TextField id="name" fx:id="firstName" disable="true" prefWidth="200.0" GridPane.columnIndex="1" GridPane.rowIndex="2" />
+ <Label text="Job Title" GridPane.columnIndex="0" GridPane.rowIndex="4" />
+ <Label text="Note" GridPane.columnIndex="0" GridPane.rowIndex="5" />
+ <TextField fx:id="jobTitle" disable="true" prefWidth="200.0" GridPane.columnIndex="1" GridPane.rowIndex="4" />
+ <TextField fx:id="note" disable="true" prefWidth="200.0" GridPane.columnIndex="1" GridPane.columnSpan="2" GridPane.rowIndex="5" GridPane.rowSpan="1" />
+ <Label text="Last Name" GridPane.columnIndex="0" GridPane.rowIndex="3" />
+ <TextField id="name" fx:id="lastName" disable="true" prefWidth="200.0" GridPane.columnIndex="1" GridPane.rowIndex="3" />
+ <Label styleClass="separator-label" text="Business Address" GridPane.columnIndex="0" GridPane.columnSpan="3" GridPane.rowIndex="6" />
+ <Label text="Street" GridPane.columnIndex="0" GridPane.rowIndex="7" />
+ <Label text="City" GridPane.columnIndex="0" GridPane.rowIndex="8" />
+ <Label text="ZIP" GridPane.columnIndex="0" GridPane.rowIndex="9" />
+ <Label text="State" GridPane.columnIndex="0" GridPane.rowIndex="10" />
+ <Label text="Country" GridPane.columnIndex="0" GridPane.rowIndex="11" />
+ <Label styleClass="separator-label" text="Business Phones" GridPane.columnIndex="0" GridPane.columnSpan="3" GridPane.rowIndex="12" />
+ <Label text="Phone" GridPane.columnIndex="0" GridPane.rowIndex="13" />
+ <Label text="Mobile" GridPane.columnIndex="0" GridPane.rowIndex="14" />
+ <Label styleClass="separator-label" text="Business Internet" GridPane.columnIndex="0" GridPane.columnSpan="3" GridPane.rowIndex="15" />
+ <Label text="Email" GridPane.columnIndex="0" GridPane.rowIndex="16" />
+ <Label text="Web Page" GridPane.columnIndex="0" GridPane.rowIndex="17" />
+ <TextField fx:id="street" disable="true" prefWidth="178.0" GridPane.columnIndex="1" GridPane.columnSpan="2" GridPane.rowIndex="7" />
+ <TextField fx:id="city" disable="true" prefWidth="178.0" GridPane.columnIndex="1" GridPane.columnSpan="2" GridPane.rowIndex="8" />
+ <TextField fx:id="zip" disable="true" prefWidth="178.0" GridPane.columnIndex="1" GridPane.columnSpan="2" GridPane.rowIndex="9" />
+ <TextField fx:id="state" disable="true" prefWidth="178.0" GridPane.columnIndex="1" GridPane.columnSpan="2" GridPane.rowIndex="10" />
+ <TextField fx:id="country" disable="true" prefWidth="178.0" GridPane.columnIndex="1" GridPane.columnSpan="2" GridPane.rowIndex="11" />
+ <TextField fx:id="phone" disable="true" prefWidth="178.0" GridPane.columnIndex="1" GridPane.columnSpan="2" GridPane.rowIndex="13" />
+ <TextField fx:id="mobile" disable="true" prefWidth="178.0" GridPane.columnIndex="1" GridPane.columnSpan="2" GridPane.rowIndex="14" />
+ <TextField fx:id="email" disable="true" prefWidth="178.0" GridPane.columnIndex="1" GridPane.columnSpan="2" GridPane.rowIndex="16" />
+ <TextField fx:id="webPage" disable="true" prefWidth="178.0" GridPane.columnIndex="1" GridPane.columnSpan="2" GridPane.rowIndex="17" />
+ <ImageView fx:id="imageView" fitHeight="99.0" fitWidth="80.0" pickOnBounds="true" preserveRatio="true" GridPane.columnIndex="2" GridPane.hgrow="NEVER" GridPane.rowIndex="1" GridPane.rowSpan="4" GridPane.vgrow="SOMETIMES">
+ <GridPane.margin>
+ <Insets left="10.0" />
+ </GridPane.margin>
+ </ImageView>
+ </children>
+ <columnConstraints>
+ <ColumnConstraints hgrow="NEVER" maxWidth="-1.0" minWidth="10.0" prefWidth="100.0" />
+ <ColumnConstraints hgrow="ALWAYS" minWidth="10.0" prefWidth="-1.0" />
+ <ColumnConstraints hgrow="NEVER" maxWidth="100.0" minWidth="10.0" prefWidth="100.0" />
+ </columnConstraints>
+ <rowConstraints>
+ <RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" />
+ <RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" />
+ <RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" />
+ <RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" />
+ <RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" />
+ <RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" />
+ <RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" />
+ <RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" />
+ <RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" />
+ <RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" />
+ <RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" />
+ <RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" />
+ <RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" />
+ <RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" />
+ <RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" />
+ <RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" />
+ <RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" />
+ <RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" />
+ </rowConstraints>
+ </GridPane>
+ </children>
+ <padding>
+ <Insets bottom="10.0" left="10.0" right="10.0" top="10.0" />
+ </padding>
+ </AnchorPane>
+ </content>
+ </ScrollPane>
+ </children>
+</AnchorPane>
diff --git a/demos/org.eclipse.fx.demo.contacts.app/src/org/eclipse/fx/demo/contacts/views/dummy.png b/demos/org.eclipse.fx.demo.contacts.app/src/org/eclipse/fx/demo/contacts/views/dummy.png
new file mode 100755
index 000000000..bb30f82d3
--- /dev/null
+++ b/demos/org.eclipse.fx.demo.contacts.app/src/org/eclipse/fx/demo/contacts/views/dummy.png
Binary files differ
diff --git a/demos/org.eclipse.fx.demo.contacts.app/vcards/Angelo ZERR.vcf b/demos/org.eclipse.fx.demo.contacts.app/vcards/Angelo ZERR.vcf
new file mode 100755
index 000000000..4b55de06f
--- /dev/null
+++ b/demos/org.eclipse.fx.demo.contacts.app/vcards/Angelo ZERR.vcf
@@ -0,0 +1,61 @@
+BEGIN:VCARD
+VERSION:2.1
+N:ZERR;Angelo
+FN:Angelo ZERR
+TITLE:Enthusiastic developer
+NOTE:CSS Engine
+ADR;WORK:;;;Saint Paul 3 Chateaux;;26130;France
+LABEL;WORK;ENCODING=QUOTED-PRINTABLE:Saint Paul 3 Chateaux 26130=0D=0A=
+France
+ADR;HOME:;;;;;;France
+LABEL;HOME:France
+X-MS-OL-DEFAULT-POSTAL-ADDRESS:0
+X-WAB-GENDER:2
+URL;WORK:http://akrogen.sourceforge.net/
+EMAIL;PREF;INTERNET:angelo.zerr@gmail.com
+PHOTO;TYPE=JPEG;ENCODING=BASE64:
+ /9j/4AAQSkZJRgABAQEAYABgAAD/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQY
+ GBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYa
+ KCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAAR
+ CABYAEgDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAA
+ AgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkK
+ FhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWG
+ h4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl
+ 5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREA
+ AgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYk
+ NOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOE
+ hYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk
+ 5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwD1ySXc7beijFRp/qxnPJqrGSsRJPJ/nTri
+ cRjk4VBya961jzAuZlgikkchUX1rlNS8fx6c6pCsT84YFsEVxmu+Njqd46oxjto2IQf3u24+
+ /wDKuG11Z94lsC4jyTu3ZYseTzXDXrtStE7aVBJXkeyXfxQuzJutdNDIADhmOSM+1dPo3jW0
+ vcC5iktp2HRgSPzr580HXkaQR3hfeo2oHOR78n1rU/4SG7snjEQSO1LcLKCR/wABrH6xJGns
+ YNH0a8yNDuQ7gRkEVhXUhbzPYYry7w947ks9Xihe486xkbD5GNoP8WO2K9SnUfZy4wc8g120
+ qiqK6OSrTcHZlSI+XECepoocErgdBRWxkXHJ82OIduTWR4zu/snhrVZ8lSkDcj1IxW+iBmL9
+ 65H4p+Z/whepR28bSyOgXaoycZ5P4DmibtFsdNXkkfOK6g7SqB83cg12ummfUYo1ZUiiHIAH
+ X615tZFvti5555r1bRAXgiVMg47CvEnI9Wmk3qY/iLw1MiCSDbnrxxXLvd30TiGfLJ0KkfpX
+ rt5HMLc79hAHLFwf5DNcXqNsJHLBFznqDWc5tGipJmVpl4Jm8i5iRAR8smMFT+FfQfg+7a+8
+ KaezyB3VSjMDnO3ivnxoGVmypHB5xXrvwTdn8JOrsTi4fH5LXbgZ81zkxcbJHdEdfyop7/Jj
+ 9aK9I4C6PkiH515n8ZBdG00+SJ5Ft28zdsOOeMfp/WvSrj59sY78VleM9LN/o2EiaRoG8xUU
+ cng5H5Gs68eem0b4Wfs6qkfMmh6cr6lIJVOFG5Qa3NR1u40xRDaLsbGC23NSTvbnXZJLXPll
+ cdMYI6itqSOy1DT/ACrrajAfK69Qa8V7npxWjscCmu37XIka5kYZ6djWhd69PHECygFhxmtC
+ 10SzF8I1kM8hPAx0FaXj3QoYtLsJIlQMq4YL1ApNX1GlKKscbY6lPdXI34ZT1FfQXwpgji8J
+ WjLEELlmbH8XOM14HoemvJqEEIAy7hVx719L6NAllYQwR4CRRhB+ArvwUd2jhxUrJJ7k1++c
+ hTjiiq1y/wArMT14FFd5wm1uCyE4JCDJPpXh3xO+JGvwa3Pp+lS/ZLBCIxIsYLSEgZ+Yg+vb
+ FeuwXlyPMduDKj7VA6DBxXAXVrFr+iyx3cQlQsdyL/yzb1HpWVRylpE3pqMdWeYQkxKnmfec
+ bsmluZJXDeWxH07VqeKdJa2tgIsgx8ofX2rlbW8Mku12x/eWvJqRadnuejCatoaETmC3kaG7
+ 8q6P/LQNzj0rOk1O+f5JZmkA4yTnIrVltnlhMlpCmQOTxisZIHeba6AMT24qH2NG+p23wtsn
+ vdeSZ1yluN59Pb9a9rE22EkdScVyHgDQ5NH8Pb5UxdXR3YPUJjiuniRz5QfgZzXsYenyQSZ5
+ VepzzuPuFLbRngc0VFdT7JmA7cUVsYmTrF5rslgrnTLV7iEEr9kvQzL9RjkV53oHiG40/Xrk
+ alavbfajko7cB/UE16brF5HeQb3KTRMOGIDge/8A9cV414q0m4EkpS6lZA2URzuC/Qnmsvea
+ ujofLc7HXdRguYxbXEJBlHXrivKNcsWtrmQrnIPWum8H+KYY/Ms9dVXVV2xyEfMuO2fSqPiq
+ 5tZ7rdAWAfuw+Un2NcuISnHmW5pSTi+VnNRX9zGpQO209s06LVJra6jlQ/PGwYZ9ajYYchhy
+ KoXC7LhwTz1rhje5vd2PpjwJ410/xRGqyyJBqCrgwMcbj6r6iuyMa+YWJHyjgV8d2k7QypJH
+ IySKcqynBBr1/wAIfFJoIPs3iBWmGAq3KfeH+8O/1r1KWJUtJbnHUotaxO/1S68p5ZpDhSeA
+ O+KK5S/1iHXXZdNlWUFcKqn5uepx16UV0Kz1uZcrRzeh+IHs7sx4L2Urfdz9zPpWh4gt2Ks0
+ LK0LDdg9qKKKZpPc821zTpUuGmRSgPOTWc98NqJKpBAwW9fwoorhxC5J2RvDVaksZilwvmAA
+ 8ZxmtzXvDe3w/aarbglWXD8dxxn6GiislFOLNEcvbQrICx+VR1JPStSzCDHkQeaR/E/I/AUU
+ VlEGddovie90uVHjkMDrwUi6OPcdKKKK76NNSjdmM5NM/9k=
+
+X-MS-OL-DESIGN;CHARSET=utf-8:<card xmlns="http://schemas.microsoft.com/office/outlook/12/electronicbusinesscards" ver="1.0" layout="left" bgcolor="ffffff"><img xmlns="" align="tleft" area="32" use="photo"/><fld xmlns="" prop="name" align="left" dir="ltr" style="b" color="000000" size="10"/><fld xmlns="" prop="title" align="left" dir="ltr" color="000000" size="8"/><fld xmlns="" prop="blank" size="8"/><fld xmlns="" prop="email" align="left" dir="ltr" color="000000" size="8"/><fld xmlns="" prop="blank" size="8"/><fld xmlns="" prop="addrwork" align="left" dir="ltr" color="000000" size="8"/><fld xmlns="" prop="addrhome" align="left" dir="ltr" color="000000" size="8"/><fld xmlns="" prop="webwork" align="left" dir="ltr" color="000000" size="8"/><fld xmlns="" prop="blank" size="8"/><fld xmlns="" prop="blank" size="8"/><fld xmlns="" prop="blank" size="8"/><fld xmlns="" prop="blank" size="8"/><fld xmlns="" prop="blank" size="8"/><fld xmlns="" prop="blank" size="8"/><fld xmlns="" prop="blank" size="8"/><fld xmlns="" prop="blank" size="8"/></card>
+REV:20090622T152914Z
+END:VCARD
diff --git a/demos/org.eclipse.fx.demo.contacts.app/vcards/Boris Bokowski.vcf b/demos/org.eclipse.fx.demo.contacts.app/vcards/Boris Bokowski.vcf
new file mode 100755
index 000000000..4aaedfe21
--- /dev/null
+++ b/demos/org.eclipse.fx.demo.contacts.app/vcards/Boris Bokowski.vcf
@@ -0,0 +1,61 @@
+BEGIN:VCARD
+VERSION:2.1
+N:Bokowski;Boris;;Dr.
+FN:Dr. Boris Bokowski
+ORG:IBM Canada Ltd.
+TITLE:Eclipse Platform UI Technical Lead
+TEL;WORK;VOICE:+1-613-820-1200
+TEL;WORK;FAX:+1-613-820-1202
+TEL;PREF:+1-613-820-1200
+ADR;WORK:;;2670 Queensview Dr;Ottawa;ON;K2A2A8;Canada
+LABEL;WORK;ENCODING=QUOTED-PRINTABLE:2670 Queensview Dr=0D=0A=
+Ottawa ON K2A2A8=0D=0A=
+Canada
+X-MS-OL-DEFAULT-POSTAL-ADDRESS:0
+EMAIL;PREF;INTERNET:Boris_Bokowski@ca.ibm.com
+PHOTO;TYPE=JPEG;ENCODING=BASE64:
+ /9j/4AAQSkZJRgABAQEAYABgAAD/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQY
+ GBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYa
+ KCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAAR
+ CABgAEYDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAA
+ AgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkK
+ FhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWG
+ h4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl
+ 5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREA
+ AgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYk
+ NOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOE
+ hYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk
+ 5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwDuUjbP3qnSJ8jBpsRGc1Nc3cNnYz3VwwCR
+ pnJOMVNzVIjvdWtdKUfbHiAx1c1zt58RbOyud+nqs8Y5OTXj/jzxU+rXzywy5t14BHeuOgvb
+ 2VWMSyNzngVi5t7GqgfSuk+M7PVrlVJMcknTcR19K6A3Q8s7WUj2NfK9tqt1ZyRtIjhlPXGK
+ 9F8H+MF8lYpX3MAEUO2APUmqjPuTKFtj2KOVZTtZjj2p8tlFFbtIZsydlFczbaiJIg6Mp/3T
+ kH6VOdSPQmtbX2M/UuM/PNFZr3wznNFFhHSIqADA4rzL476+9lo1pptoMPdyF3b/AGVxxj6k
+ H8K9JVy3HavAPi/dm9+JEdlvBS2jjiwOxI3H/wBCqJbFx1ZkeHdF/tWCFZgwjU7mH96vRtO8
+ P29vCqRxhVx6VR8OQx28K7FwOmBXTJM2BkYFcE5XZ7FGmkjE1DRbdkP7pW78iuB8Q6Utk63V
+ kpjZGy6DoRXqVz5pQsvSuT15VdDkexohJpirU04lTwxrDRzW5kYmOQ7S2ehPAz+OK72STA61
+ 4gt21vqH2MDbE7BMnoD1B/z616+0pZRk5OOa76N7WPIrbk7TnPWiqRJzRWxketeTDbqRPIox
+ 3Jxivnn4paW9l8WPMyGjukjuIyOmNu0/qpr3DWNImRZt08kka8quc15F8QY5JdY0iaRWzEDG
+ Xb+6egH0IP50p04qm5JlU5SdRRsR6beeVAS06QjdhS3U1tafrHzKkz+Yr9Dtwax7axjZld13
+ DbgKRn3/AJ1ZFo39oW6qoXPIUdhXluzPdhGSJ7/UnuZXaHzSkeRsRsZx/WsTULgXaFVjkhkX
+ na5zkA4rSsLRzqMyjKyDLexFSXlufM3Oqgj0oTSHKm5annWo2oPiCJW6S7fwORXri25VQACA
+ BiuHj01b/XkYglYl3tg4PBFez22iSThN428DORXbRn0PIr02tTkTH7UV10+jQxuQfm96K3uc
+ 9jpL+RJFYbhtx1PFeZePbZJoYxGu6Uchs/3Tn9ea7iezvQrKzjH1rCm04XUqJNtba394jFa+
+ xU4OKZMK/s6ik1ocfoRQxRs/QjNO1ELd34dTsReNwOMH2p0EKWl9NYPx9nnaP/gB5U/liori
+ 0ljvjJC6OOCBKoYDHtXiyXLNpn0NOpzwTQ+zxZ3iyrhkIwSDkgn1qfUysudncZFUJLOe4ljl
+ nmTYnGIUCcehIGat6pIkUUbLwFQ5561LteyNHJoxtDtJZ5r14EcupCZU+uf8K9rsNSN1kNtX
+ aOxryn4f/PaXshPLSj+X/wBeuwtpmgl3IM54r28PhU6fN1Z81icW/acnRHQ3U8STlZTzjtRX
+ NyLMzlnySecmiuhYWNtWcrxMr7HeXmkGacSrNlB/BnH60yzuLbT3CpAhmGQ0nU/ga2I2dkyy
+ AfjXO6pClmwKKGZufWuBTbVmdzilqjz74syRQ+K7G9hyDdW4SXnqynAP5ED8K56LUFMxSY7c
+ 9/UV0HxMSK6stMIQiaN5FYnvkAj/ANBrjLZJsgH5iPXvXJWguY9DD1Go3Rs3NzCigRbsnt61
+ j6rcSPZsH4LHAHetAJOU+WML7gVnyWkkko3847VkopO5vKcpGz4A+WC9j9GQ/mD/AIV1WOa5
+ fwcyw6hdQsQGkRSAe+Cf8a63HtX0GDleij5vHQ5azGAdhRT/AMKK6TkPKPh/8SfE3hyQW18h
+ u9KHHlTSfNGP9huT+ByPpXf6/wDGmwaNU0rSpZZMfM9yQuPoBnP5ivn9ZXx9404OxHWvMVNb
+ nrczPR4PEl3rsxN/cZlEhkEfRcH+6PauihtfMRZEGDXjkNwykEEhh0INdLpXjTULABJBHcx+
+ kgwfzFYVsO5PmidVDEqC5ZI9OiiJjww/GoJrcIGOK5NfiQirzpZJ9p+P/QazNT+IV7coVtrW
+ C3HqSXb+g/Suf6tUfQ6niqS1udFdotvIZ5HEarzuJxiuduPGV7Fq63dtM7RxrsVJWJVx6kZr
+ lb/Vby+fddzvIewJ4H0HSqLSM3c12UKTpa31ODEVlW0toeoQfFApGBdafG79zHIVH5EGivLD
+ 7miur2sjj9jDsf/Z
+
+X-MS-OL-DESIGN;CHARSET=utf-8:<card xmlns="http://schemas.microsoft.com/office/outlook/12/electronicbusinesscards" ver="1.0" layout="left" bgcolor="ffffff"><img xmlns="" align="tleft" area="32" use="photo"/><fld xmlns="" prop="name" align="left" dir="ltr" style="b" color="000000" size="10"/><fld xmlns="" prop="org" align="left" dir="ltr" color="000000" size="8"/><fld xmlns="" prop="title" align="left" dir="ltr" color="000000" size="8"/><fld xmlns="" prop="blank" size="8"/><fld xmlns="" prop="telwork" align="left" dir="ltr" color="000000" size="8"><label align="right" color="626262">Work</label></fld><fld xmlns="" prop="telpri" align="left" dir="ltr" color="000000" size="8"><label align="right" color="626262">Primary</label></fld><fld xmlns="" prop="email" align="left" dir="ltr" color="000000" size="8"/><fld xmlns="" prop="addrwork" align="left" dir="ltr" color="000000" size="8"/><fld xmlns="" prop="blank" size="8"/><fld xmlns="" prop="blank" size="8"/><fld xmlns="" prop="blank" size="8"/><fld xmlns="" prop="blank" size="8"/><fld xmlns="" prop="blank" size="8"/><fld xmlns="" prop="blank" size="8"/><fld xmlns="" prop="blank" size="8"/><fld xmlns="" prop="blank" size="8"/></card>
+REV:20090525T141422Z
+END:VCARD
diff --git a/demos/org.eclipse.fx.demo.contacts.app/vcards/Chris Aniszczyk.vcf b/demos/org.eclipse.fx.demo.contacts.app/vcards/Chris Aniszczyk.vcf
new file mode 100755
index 000000000..442f6d43a
--- /dev/null
+++ b/demos/org.eclipse.fx.demo.contacts.app/vcards/Chris Aniszczyk.vcf
@@ -0,0 +1,66 @@
+BEGIN:VCARD
+VERSION:2.1
+N:Aniszczyk;Chris
+FN:Chris Aniszczyk
+ORG:EclipseSource
+TEL;WORK;VOICE:1-860-839-2465
+TEL;PREF:1-860-839-2465
+ADR;WORK;PREF:;;1221 S. Congress Ave;Austin;TX;78704;USA
+LABEL;WORK;PREF;ENCODING=QUOTED-PRINTABLE:1221 S. Congress Ave=0D=0A=
+Austin, TX 78704=0D=0A=
+USA
+X-MS-OL-DEFAULT-POSTAL-ADDRESS:2
+EMAIL;PREF;INTERNET:zx@eclipsesource.com
+PHOTO;TYPE=JPEG;ENCODING=BASE64:
+ /9j/4AAQSkZJRgABAQEAYABgAAD/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQY
+ GBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYa
+ KCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAAR
+ CABIAEgDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAA
+ AgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkK
+ FhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWG
+ h4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl
+ 5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREA
+ AgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYk
+ NOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOE
+ hYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk
+ 5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwDP+Hus6eunW9ibuIXZjZRERtJO9mxjp05q
+ j4+Yx38G2R48yTjKf9c0PWuFvry5Wzs3ljkt72FwQzKVY8cMM/SvUvDqQ+KdOW9lNuZRxJFJ
+ brL5b7QCRu6AgZ//AFVnFu12XKKva5gaxA2oWmn7HuGuJLKIkxA5JV8dPxFbF5ZDRtS1XU9U
+ uFhtHuPOQMc9iMY555PHWus1uWLwl4fs5FWGS+uZBBAzRqoiBGSQMcAKOnrivCfEuoXfiLW5
+ lE7tbQOVj3Hj0L+5J71SaauyeTWy3LeufEHUJmSHTD5FtECoZvvP7nHTp6965qXxNqjXzXgu
+ HS4ZChcHqpGCDnPatWHRrdI9zguRwN38qwtWaFXdY0REU4GAMsamFRSdkjaph3TjzSNPTvEs
+ iWWpW95CsovE/wBYo5Rsjn6fLX0f4Qj8FL4S05tSlsBm3hLoz56oueB369a+V4FMbRsRjPOC
+ K+hvgT4ihs9B1LTLmwub42rrPAIIPNPlvn5T3GGB/OoxFO6UiaMrOxf8XXOkgxL4SubGK3zm
+ 4EduzBuB0+RveitX4gXDeIfsYtrPWNGQMc5hWMNx3zItFKjKKjv+A6id/wDgo8UvPD8V4UMt
+ zcELwAWzge2a9U+EPgbRZtG1S81C4uIkt3UM4lCjbgnnj/Oa5nwB4b1vxdps97p+nsY4pjAR
+ JKqncFBPBI/vCu0vdK8TeGvD6aSsdvCdUeYTI5VyI1jyCpB+91x74q4xvozNy6o8w+LGo3l3
+ r0cJnia1Rf8ARIoH3hF3MmDxy5KnP6VgWfhjX5WJt9HvXY9WMbJ/PFe+eGfCNh4fMmo3Yja/
+ I+aVhhYVA4VPQADr1PWrNnLeeJn36fI1jpOcfatoMs3+4DwB/tEH2FKdZLSOxtSouTueEP4G
+ 8XTwlTp3kp/eklVcfrVC0+HV1LdbNU1bS7cA4KrcCRvyHH619JSeFtAiQi5zd3BzmS7m81vq
+ AeB+ArgvEPg3RY5T5dvGqt8xc4JP9B+FZKtbY6nhnLdnkPjbw3LojRNaZubLaP3wwcHuCBXU
+ fBjxRLomsTOtoLiSa0aBU8woGIYMOx5+8OR3rA1mzezvboaaX+xryyZ+UL7VueFrO3sdPuby
+ EE3DqQZd2QnH8IHqTnPtVVKrVM540ffsdx438WHUvLt5bMIbNyC9veHO5s5Xds5orzy2vJJd
+ Hkkmcu3mry3vmilDmhFamVTllJ6HsHwR8a6XpEDaXeebHJfXzSRybDsAKKBkn3Fd98T7QXes
+ +F5THujgnllZuy7UyCfxxXyrosl9A1rHdwzIqOQrMpH8J4r6f8H6i3jn4f3emzzvHfRRfZmm
+ x6r8rfjjn6VopN3uDjFNWPOtVvbjxtr39n2Ak/sC1lC3MynCzv1259OvHevUJICdP8u12xLt
+ CrhMhR9OKxbGzttLA06HSn0+WEDzR5eEkIGAyt/F9evrW1NfR2Vk8spCxouST0rlle+p6dHl
+ toeca94Pu9U1BCl9LJGCN2VRR154AFSfFDTRo/w8lOn7xLDtG4sScVq6DqlxqN/LeQxOLNeQ
+ 7DAb6DuKo/EfWrC88IXsS3cUhb5MKf4hRHWR0Sgkmz59jGoSWCXbyyzwONr4U4TnoTXa+GXe
+ y0B7WSF8OilifRlHH865nQNXEfhvUdKY4eSTfF75wCP0FdwoP2IRyeWSNiEBs4HAyfTp+taV
+ fhPOive0OImGPDV0W3JG8yhX6Z5YUV1j6ZpUvgGVb6e48/zGdPKAwoDMQCCOSfrRWkKkGtzB
+ 05JvQ4HUPF2r6g6/abgHY25QqKAD+Xua6fwP4y8RadcpHZ3V0to7g/KpK54znA+lc1/ZeqzW
+ DNNo9zFKsoAAtmUlcfSvTdF1Ky0TQ9FP2Bg1rFvmWT5d7sAX3Lg/xdPwqpuMVqaYXCVcTJqm
+ rnqUWp391Yx3OpNI+zbhnGODnJ5/CqmrSpfWpglXfGeqDo2O1U4/Hmk3umvLekwRbOVIBRRj
+ oMf1rM0rVIJoRfaXMbvTGcqGAOUI6j14rknrsd0qFTD2jNWOl0y2v7bTmLXUchkO8q8X3PYE
+ EV478WJhPvW4eN5t/wAoDMOPpXrp1m1eAt5wAxgjNeH/ABIvre5vTHCAQGyzk5xVUtwnUXI0
+ cr4cs2muGllRlgjG59vYfjXa6DGkTXgiRpLYiOU5xuAPOPTvXB2uqzp5iWzFYX4ZCOD9feu2
+ 8Jz/AGuC+2AZ8mNdhPUjI/wretF8tzzqUrztcvaklw3hNngh/wBH3Nhpjhjy3OFPrkUVpxHf
+ 4ClgkjbzhI4CD733m7dcYNFcsJaao6JpJ7k9+3iDT3Meo3U8cmSNomzyPXH1/nWfqQ+1Rss5
+ LFwSxPU56miilW0lY+3yXD04YdTS1ZwmsWl3zYTXG225dCB94+h+nWu8+DHiTTNP0G50nVrl
+ Le7S7ZoxJwpUqvGenUNRRWlP3o6niZvBKdyT4py2kMUcttK0V1J0MLfK49+x+teRanO7QPuY
+ ktxzRRW1PY+erMqQMS8bL92Qc/Wug06Se3Hm27vG4/iU4NFFdcNTjfc67R9Z1q/lWKGa6luF
+ GRsG7gUUUVlOnG5vTm2j/9k=
+
+X-MS-OL-DESIGN;CHARSET=utf-8:<card xmlns="http://schemas.microsoft.com/office/outlook/12/electronicbusinesscards" ver="1.0" layout="left" bgcolor="ffffff"><img xmlns="" align="tleft" area="32" use="photo"/><fld xmlns="" prop="name" align="left" dir="ltr" style="b" color="000000" size="10"/><fld xmlns="" prop="org" align="left" dir="ltr" color="000000" size="8"/><fld xmlns="" prop="blank" size="8"/><fld xmlns="" prop="telwork" align="left" dir="ltr" color="000000" size="8"><label align="right" color="626262">Work</label></fld><fld xmlns="" prop="telpri" align="left" dir="ltr" color="000000" size="8"><label align="right" color="626262">Primary</label></fld><fld xmlns="" prop="email" align="left" dir="ltr" color="000000" size="8"/><fld xmlns="" prop="blank" size="8"/><fld xmlns="" prop="addrwork" align="left" dir="ltr" color="000000" size="8"/><fld xmlns="" prop="blank" size="8"/><fld xmlns="" prop="blank" size="8"/><fld xmlns="" prop="blank" size="8"/><fld xmlns="" prop="blank" size="8"/><fld xmlns="" prop="blank" size="8"/><fld xmlns="" prop="blank" size="8"/><fld xmlns="" prop="blank" size="8"/><fld xmlns="" prop="blank" size="8"/></card>
+REV:20090525T195324Z
+END:VCARD
diff --git a/demos/org.eclipse.fx.demo.contacts.app/vcards/Hallvard Traetteberg.vcf b/demos/org.eclipse.fx.demo.contacts.app/vcards/Hallvard Traetteberg.vcf
new file mode 100755
index 000000000..d7c548c05
--- /dev/null
+++ b/demos/org.eclipse.fx.demo.contacts.app/vcards/Hallvard Traetteberg.vcf
@@ -0,0 +1,64 @@
+BEGIN:VCARD
+VERSION:2.1
+N:Traetteberg;Hallvard
+FN:Hallvard Traetteberg
+ORG:Norwegian University of Science and Technology;Dept. of Computer and Information Sciences
+TITLE:Associate Professor
+TEL;CELL;VOICE:+47 91897263
+ADR;WORK;PREF;CHARSET=Windows-1252:;;Glshaugen;Trondheim;;7491;Norway
+LABEL;WORK;PREF;CHARSET=Windows-1252;ENCODING=QUOTED-PRINTABLE:Gl=C3=B8shaugen=0D=0A=
+7491 Trondheim=0D=0A=
+Norway
+X-MS-OL-DEFAULT-POSTAL-ADDRESS:2
+URL;HOME:http://www.idi.ntnu.no/~hal
+URL;WORK:http://www.idi.ntnu.no/~hal/
+EMAIL;PREF;INTERNET:hal@idi.ntnu.no
+PHOTO;TYPE=JPEG;ENCODING=BASE64:
+ /9j/4AAQSkZJRgABAQEAYABgAAD/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQY
+ GBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYa
+ KCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAAR
+ CABcAEgDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAA
+ AgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkK
+ FhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWG
+ h4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl
+ 5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREA
+ AgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYk
+ NOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOE
+ hYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk
+ 5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwD6E700mhjxzXBfEn4g2HhSzeMSCTUnQmKA
+ AnnsWPYVA7nXapq1jpcPm6hdwW0fZpXC5+meteVeMPjXZ6dLJBotut3IvSaQkIfoOp/SvJEt
+ 9d8Y30l/dvIRK2WkYcH2A9KS+8D3I+5liOpzUucYuzZcaU5K6R1Fv8dNcF4jzRWrRZ+aMR8H
+ 8c5/WvQ/D/xo0W+QLqME1pJnqn7xOnU9CPyP1r55tfC19dXZhjU4B+8RWxD4OuoCQ7N6DFJ1
+ ILZlKjPsfV+i+INK1tC2lX0FztGWVG+ZR7qeRWqDXxpcxat4Zu4riCWWNozuSaIlWU/UV798
+ KfiVF4pVdP1EJFqirkMvCzAdSB2Pt+XpVrVXRm007M9OooBooEZ2tXq2On3FzI2EiQuxPYAV
+ 8lWoufGvjKe6vCWWRy7nsq9lHsBgV9IfFq8Fl4F1eQnBaBkH1bgfzrxf4PWqtY3MxUGRpMA+
+ 2KUnyxbKprmlqd9YWASGOC3XZGgCjArYj0UTR4cZz14rU063SKMEgVsRsm0AIpNcajzbnp35
+ VojlV8NwKcrEAR6cVXvdDAUsqDPauwfaOdo/OqdzcICECfiKmUUkVGTkeW6/pqz2slvNHnII
+ 6dK8ZYXGga6rRSSRGN9ySKcEYPBBr6c1a1ikieQ8fhXhnxMsBGkdwigYbB4rTDTalyvqc+Kp
+ rluj6T+HHiBvEvhCx1Cb/j4IMcxAwC68E/jwfxorlf2d7kT+AfLyCYrp1xj1VT/WiuxrU4EW
+ fjnay3PgHUBCpYoFkI9gwJ/SvMfguwGl3K5yyy5/DFevfFqK4n8HXsVqcNIAjf7pPNeKfBuG
+ YtqUa5BUKPocmolrFouCadz26C4gijjWR1Vj2JrRg8uXGCp/GvLNUjurdZ1axlvZEQvlrgxA
+ /wCyuAST7cVU0CyufsiasJLmz3OQls9w5IAxzg9QTkcjt71hyNLmO1VLvlPZGiVepXmsu7vb
+ KOUpJPCrgfd3DP5VRfUt2iRzzOzOEyR0NecavpDSxy6pHaw3E6J5oidny/PQbWXtk/41C992
+ RbbguZnfXl5bz20iQSqzA8jNeSfFFR/ZgPQs1dFYNPqdvbGXSktDICQ8TN8mDwGU56/XNYHx
+ XgkTT4VHJ3jJH0q4Q5Z2ZhVm5RO6/ZlkJ8OanEf4bhW6+q//AFqKufs66ZNYeGr2WdSv2iVW
+ XPpt/wDr0V1Sd2cdmtGeheK4hLod0Cob5c4+hzXm3gy1todV1N4IxFvkVmUf7v8A9c16xqMB
+ uLOaJQCXQgZ9cV5tBbvpepym5V43mwcMMdOOKxqaO50UXdWZ0Uxh53R7iR9a5/xFEBZllTyg
+ SOBxmujM8ccAb5SxHANcL4t1CeG5jnMInVCDhjgD8MVjK9rI7YpE1/L5emwQuxAOAcitTQrR
+ RDh/nQHIB5xXN+IPE1ne2Sxw2cjTHB2x9T+fSun8Iuy6WBdBh3UP94CoUWndFuzRstbRSICu
+ BjpXn3je3gmubSCYble4jXB/3ua9AubiGKAyKwK+orjYbIeJfE9vEm0CItJuboMDg/mRWid5
+ HPUSSO6+HQcaRIJTlvM6Y4HA4FFbHh/TP7LsjEzh3ZtzEcD8KK6Y6Kxwzd5Nmka4rxxEv22z
+ dh98MmfQ8Ef1rtTXO+MrGS90iT7P/wAfER82P3I7fiMilJXVgi7O5xtx58sSPA6+Zsx83QEd
+ c1kJLdvL5dzp/m89Y5eD+YFUrfWN1zjeApO7GfzFdNbxJcxho5GikPQocVhF2ex3waZRvIoU
+ RpF0653nBbATj8zVO2vL6V9sUDRRg5ZpWHA9gM5rYlspcbZr+5kXupfP9KzNVuodPj2pk7uM
+ k5NOUl0Relrjr24MNlcM8vEgAUDjJ55/lW38K7cPeXt3jIjQRA+pJyf5D868xvdaWRygIY8q
+ oBzzXuHw/sE0/wAL2YXmSdRPIfVmA/kMD8KdKOtzkr1NLHT5opoNFbHLcVqrXQ3RMCOMVMSa
+ r3DERmgVz5o8VJPpuoTz22SiSMpUdsHFWfD/AMQra3gEd3uRl4wa6i5tory7vROoIeVyR9WN
+ ctb+FtLu9xlhbIYjKtjvWSSlozru4ao1H8f6XHukSRnkYZ6E1x+ueIrjWptlnGyR92b/AArr
+ LXwfpAOfJfp/eq5faNY2Noy20CrjPPejlUdR88p6HI+G9MMkhlkydnevovwXdx3Phyx2MC0c
+ YjYehXj+leN6MirYYA4fOaz9R1jUtEt5p9Jv7i1dOcI2Vb6qcg0oTvKwVaV4aH0lmiuL+Fmv
+ 33iPwnDe6myPciRoyyLt3YxyR0z9MUVtY4bn/9k=
+
+X-MS-OL-DESIGN;CHARSET=utf-8:<card xmlns="http://schemas.microsoft.com/office/outlook/12/electronicbusinesscards" ver="1.0" layout="left" bgcolor="ffffff"><img xmlns="" align="tleft" area="32" use="photo"/><fld xmlns="" prop="name" align="left" dir="ltr" style="b" color="000000" size="10"/><fld xmlns="" prop="org" align="left" dir="ltr" color="000000" size="8"/><fld xmlns="" prop="title" align="left" dir="ltr" color="000000" size="8"/><fld xmlns="" prop="dept" align="left" dir="ltr" color="000000" size="8"/><fld xmlns="" prop="telcell" align="left" dir="ltr" color="000000" size="8"><label align="right" color="626262">Mobile</label></fld><fld xmlns="" prop="email" align="left" dir="ltr" color="000000" size="8"/><fld xmlns="" prop="addrwork" align="left" dir="ltr" color="000000" size="8"/><fld xmlns="" prop="webwork" align="left" dir="ltr" color="000000" size="8"/><fld xmlns="" prop="blank" size="8"/><fld xmlns="" prop="blank" size="8"/><fld xmlns="" prop="blank" size="8"/><fld xmlns="" prop="blank" size="8"/><fld xmlns="" prop="blank" size="8"/><fld xmlns="" prop="blank" size="8"/><fld xmlns="" prop="blank" size="8"/><fld xmlns="" prop="blank" size="8"/></card>
+REV:20090526T085040Z
+END:VCARD
diff --git a/demos/org.eclipse.fx.demo.contacts.app/vcards/Kai Toedter.vcf b/demos/org.eclipse.fx.demo.contacts.app/vcards/Kai Toedter.vcf
new file mode 100755
index 000000000..0a64e4c3e
--- /dev/null
+++ b/demos/org.eclipse.fx.demo.contacts.app/vcards/Kai Toedter.vcf
@@ -0,0 +1,16 @@
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=UTF-8:Tdter;Kai;
+FN;CHARSET=UTF-8:Kai Tdter
+ORG;CHARSET=UTF-8:Siemens AG, CT T DE IT 1
+TITLE:Dipl.-Inform.
+NOTE:Eclipse RCP Expert
+TEL;WORK;VOICE:+49 (89) 636-45450
+TEL;CELL;VOICE:+49 (173) 7068910
+ADR;WORK;CHARSET=UTF-8:;;Otto-Hahn-Ring 6;Munich;;81739;Germany
+URL;WORK:http://www.toedter.com
+EMAIL;PREF;INTERNET:kai.toedter@siemens.com
+PHOTO;TYPE=JPEG;ENCODING=BASE64:
+ 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
+END:VCARD
+
diff --git a/demos/org.eclipse.fx.demo.contacts.app/vcards/Kevin McGuire.vcf b/demos/org.eclipse.fx.demo.contacts.app/vcards/Kevin McGuire.vcf
new file mode 100755
index 000000000..cf2097dce
--- /dev/null
+++ b/demos/org.eclipse.fx.demo.contacts.app/vcards/Kevin McGuire.vcf
@@ -0,0 +1,58 @@
+BEGIN:VCARD
+VERSION:2.1
+N:McGuire;Kevin
+FN:Kevin McGuire
+ORG:IBM Canada
+TITLE:Eclipse UI Guy
+ADR;WORK:;;2670 Queensview Drive;Ottawa;Ontario;K2B 8K1;Canada
+LABEL;WORK;ENCODING=QUOTED-PRINTABLE:2670 Queensview Drive=0D=0A=
+Ottawa Ontario K2B 8K1=0D=0A=
+Canada
+X-MS-OL-DEFAULT-POSTAL-ADDRESS:0
+EMAIL;PREF;INTERNET:kevin_mcguire@ca.ibm.com
+PHOTO;TYPE=JPEG;ENCODING=BASE64:
+ /9j/4AAQSkZJRgABAQEAYABgAAD/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQY
+ GBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYa
+ KCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAAR
+ CABcAEgDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAA
+ AgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkK
+ FhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWG
+ h4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl
+ 5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREA
+ AgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYk
+ NOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOE
+ hYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk
+ 5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwD5npwpBUsMTSyBEGWPSkMYKcAScAEmtePS
+ QhDTmXGMkKnT2NWTpdnM4ZFYBxgMHOSajmRfIzF+zyAgbeT0GetNkjkjOJEZTkjDDHI61taT
+ pipdMLmcnIwu48Z7Z/L6VuvaWqiCJ285Dx85LAqP4fTd2yOemAez5kHIzhscUma3dZ0kQS3D
+ wDYiHcsbdSvqPcdx/SsM0yWrCUUYzRTERit3w3b/AOtuH2jjy4yeTuPoKwhXo3wn0tL3XLNr
+ oZjiLSqOzEDj9T+lZVpcsGzahDnmkaXh74f6jqs6zajK8UHGIsnJ+vvWtefD5rXUIZo2lkiT
+ AUZ6eoNe02VtGsY4Apl5ErI+B8wNeW683rc9tYamlax4Zqvgxd6yOpAA9apm2TT7aZHjeeEj
+ iIn+LBxg9u2a9T1pfmIIFcZf6ct3JNboMTOuIyOPm/8Ar1dOrJyWplWoxS0Rw8trPe6nMSBL
+ DgBVkGWGVz1578fjXKaxZNYahLbsCApBXPBweRXoEVrNawNBIJEu1ZoniKHcpAJVvocH8xXN
+ /EiNI9fVkOTJCrN9eR/ICvRhJtnlVIJI5biikorQwIhXonwe1Ax+J7SBu4dR9Nuf6V52K6Tw
+ Kp/txXjLCREbBEm3AYbT2JJ+btis68eaDRth21UVj6eu/Eml2BWO5vIlc8bFbLflUn9qW7Wx
+ uY3LRYzyegryf+w9SfzIrHT4onjAzNOwbJI6jJ4xx/hXW6Fo8w02a21NY5oJYyHQjAZuMdvY
+ 15LjFLRnvQnKTtY5nxX4uuZL54tNihcZ/wBY7cH6VzVpr2oxX8dy15BJKjcxCI4OD0OcfpWl
+ YWMcXiJ0OPkcqijjA7D6V0l54dgMfm+QqqpyEVQBmtVOMNkZSpVJvUsMZvGulXOr3UFpbXth
+ ECr224SZLYxJuGGUfe74x1rzDxTatcJNFdrm7t0Z0YN90Z3FT68ZPtXuPwtjSFdTW7QC2u0E
+ OG/i5ww/I1538QdHtdL8YeILXT1dtOt4C3ztnZvj3AD2wfyrpU5cqZzKlBylF9jxviioyeaK
+ 7DySMGtDRb9tN1S2u0G7ynyy/wB5ehH4jNZ1OBoaurDTad0fXmitZ31pFeqwMLxrIp9QRkVU
+ j1WCa6lkYeXbRvsBA3ZIGf8ACvPfhVrUmpeFZNNifF3aDYNx6qxO0/h0/CurgW60+KGKOxL2
+ wkKvKXB2/wC0R1P4V4k4cs3Fn09Gqp01KPU4PxIzLq872cUr5bck4BXFdXpmsG4sFhmYtKqD
+ JYYqx4gSSa2zFD5addwjAz+JPH5Vzvhu32X0kt3IzI5Ee3jA9auSVhXlF3Oi0PVJbO+S0nBC
+ xyeag+uM1xfxn1sQeJdR8htzX9uik/3VwB/JcVv67OreJVMR4JxxXH/GTT44rjSL/JHnQCKX
+ 1DBnw35YB/CurDvnsmebim4Xcep5pRU81u8XUbl/vDkUV3nlESQSNzt2j1bgVKIFX7z5/wB0
+ f1p5JY/MSaaBkkelTcuyNXwhrVxoniCC4tBmMfLMmcb0PUfXuPcV9IaDq9prNgk0EgeOUZBH
+ r7+9fMFn8tx8vauw+HmpS2niK2svPaOC6ymM8B8ZU/nx+NcmJoqa5lujtwld03y9Ge73umRP
+ DIW3Pjpk4rh/EU0Onw/u12kH7orXv9Z1KGBoxGGZeMmvNvEE19eTn7ScZ7LxmuKEL7npVKqt
+ puT2uqM7yahMOF+WMH+Jv/rVz/xI1z+0rHS7dseZDEd4z0Jc4/Rf1q/ZwtKRv4SMYA7AVwet
+ zfaNUmIPyl8D6DgV3Yde9p0PNxT9zXqLBdyQ3TOhOCAD70VXjGCc0V12OFNlrIxxTUb59pGR
+ TAflqbpKQOBntSGSLmOVie9ElxLbiK5hYrNE4kRh2IwR/KhxyD61SuZnF0IeDHjpQlcG7H0R
+ 4b1y28SaTBeRFFuCoEsZ/vd6xPEVrJc6giwQMqj77EAD8K848CXc9netHBIwRmII9a9c0x2u
+ CDKcmvNqQ9nKyPVpT9pFNnKayi6To1xKcCQjC/U9K8ic7rlj6V6n8V5GjNvCvCHLEe44/rXl
+ EZyzHvXZho2jfucOLlefL2LKDIop0PC5orc50f/Z
+
+X-MS-OL-DESIGN;CHARSET=utf-8:<card xmlns="http://schemas.microsoft.com/office/outlook/12/electronicbusinesscards" ver="1.0" layout="left" bgcolor="ffffff"><img xmlns="" align="tleft" area="32" use="photo"/><fld xmlns="" prop="name" align="left" dir="ltr" style="b" color="000000" size="10"/><fld xmlns="" prop="org" align="left" dir="ltr" color="000000" size="8"/><fld xmlns="" prop="title" align="left" dir="ltr" color="000000" size="8"/><fld xmlns="" prop="blank" size="8"/><fld xmlns="" prop="email" align="left" dir="ltr" color="000000" size="8"/><fld xmlns="" prop="blank" size="8"/><fld xmlns="" prop="addrwork" align="left" dir="ltr" color="000000" size="8"/><fld xmlns="" prop="blank" size="8"/><fld xmlns="" prop="blank" size="8"/><fld xmlns="" prop="blank" size="8"/><fld xmlns="" prop="blank" size="8"/><fld xmlns="" prop="blank" size="8"/><fld xmlns="" prop="blank" size="8"/><fld xmlns="" prop="blank" size="8"/><fld xmlns="" prop="blank" size="8"/><fld xmlns="" prop="blank" size="8"/></card>
+REV:20090529T154834Z
+END:VCARD
diff --git a/demos/org.eclipse.fx.demo.contacts.app/vcards/Lars Vogel.vcf b/demos/org.eclipse.fx.demo.contacts.app/vcards/Lars Vogel.vcf
new file mode 100755
index 000000000..9b243374a
--- /dev/null
+++ b/demos/org.eclipse.fx.demo.contacts.app/vcards/Lars Vogel.vcf
@@ -0,0 +1,16 @@
+BEGIN:VCARD
+VERSION:2.1
+N;CHARSET=windows-1252:Vogel;Lars;
+FN;CHARSET=windows-1252:Lars Vogel
+ORG;CHARSET=windows-1252:SAP AG
+TITLE:Product Manager
+NOTE:
+TEL;WORK;VOICE:
+TEL;CELL;VOICE:
+ADR;WORK;CHARSET=windows-1252:;;268 Charles Marx Way;Palo Alto;CA;94304;USA
+URL;WORK:http://www.vogella.de
+EMAIL;PREF;INTERNET:Lars.Vogel@gmail.com
+PHOTO;TYPE=JPEG;ENCODING=BASE64:
+ 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
+END:VCARD
+
diff --git a/demos/org.eclipse.fx.demo.contacts.app/vcards/Peter Friese.vcf b/demos/org.eclipse.fx.demo.contacts.app/vcards/Peter Friese.vcf
new file mode 100755
index 000000000..df31b274d
--- /dev/null
+++ b/demos/org.eclipse.fx.demo.contacts.app/vcards/Peter Friese.vcf
@@ -0,0 +1,61 @@
+BEGIN:VCARD
+VERSION:2.1
+N:Friese;Peter
+FN:Peter Friese
+ORG:itemis
+TEL;WORK;VOICE:+49 431 5606-338
+TEL;PREF:+49 431 5606-338
+ADR;WORK;PREF;CHARSET=Windows-1252:;;Schauenburgerstrae 116;Kiel;;24118;Germany
+LABEL;WORK;PREF;CHARSET=Windows-1252;ENCODING=QUOTED-PRINTABLE:Schauenburgerstra=DFe 116=0D=0A=
+=0D=0A=
+24118 Kiel
+X-MS-OL-DEFAULT-POSTAL-ADDRESS:2
+EMAIL;PREF;INTERNET:peter.friese@itemis.de
+PHOTO;TYPE=JPEG;ENCODING=BASE64:
+ /9j/4AAQSkZJRgABAQEAYABgAAD/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQY
+ GBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYa
+ KCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAAR
+ CABgAEUDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAA
+ AgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkK
+ FhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWG
+ h4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl
+ 5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREA
+ AgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYk
+ NOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOE
+ hYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk
+ 5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwD0vINOAFN2expQn1r61nz1yQCjb7Vn6tqV
+ tpVsZ72ZYo+m5jxXDXXxV063nkgaGSTIISWBwwJxxx1H61jUrQp/EzWnSnU+FHpB2jGeMnFO
+ Cqe9eJ/8Ldni861mhjuDxsmHykD8uSPwrqPDHxGsJ/tB1SRLXLFlLE46cj8/51jHF05uyZpL
+ C1Iq7R6MEHY07yz6g1V02+g1C0iubVleKQblIIPH4Vb/AANdFznEEbe1FPBopXDQM/7I/Ksn
+ xTr9p4c0WfUbtMpGMBR1Zj0Fdm1nJ/s/lXg37Tc88A0mxyBE4aVlHcjgf1rlniEoto6YUG5J
+ M8q8T+K9Q8T6oZrp28ok+XEpOEHpiqFvYmWdRISDkEN/iKueH7ELB5zjLv0z2Fb9vbKzrkDN
+ ePUblqz2qNLRWKM2iPdO4CKZkmKhlGPlNJceGNRSWWRImZVbr1/z1r13wZYQsV+0xgsccnnN
+ evaHodlf2rDy1jAH3l71xOq+blR6Dw0Yx557Hyt4b8Qav4aut9vO4tFYCW2kOQfUAZGPwr6P
+ 8PaxYa1pcF7ajMUi/ke4/OvMfi94Xj0fVVnEe9LolDgkZI6YNS/AeNzc6nEJG+z7UcBsjDZI
+ PHTPb3xXp4LEuXuSPIx2FUffgeu/6P6fpRUv2Vf7y0V6PMu55dpdjRMje9fPv7TULyapoznO
+ 0wuv4hv/AK9fRWwHrXz7+0Pdre6/Y6dDGS1qgZ2B5O/nAH0FccpK1jvhCTdzzmGDZbwJF2QZ
+ rU0m0E1xsmlCccGsC+vG3/uvMHoqL0+tSadqpRsTOR/v8EVxVH2PVotLRnrPhqSO2u4YxIee
+ CQ2RXuGjW6/2aJBkKOeOK+W7fURaoLlXVu4O/ivUPhz8UIZmWwv0GCQqur5Ga42rO53TblDl
+ jubfxlQXelWnlLmRJfkGO+K5b4MWbR32qlVKwgKpU9jk/wCBrovi3ex29np1z1heUnK/Stf4
+ Z6csehG7UhvtTb8+w4/xrpwTandnnY5L2fKjeEQ9DRWkIT7UV6ftTx/ZDS64614B8Yof+K8k
+ lA4+zI2fwx/jXum4eteYfGjT4xDa6orHzP8Aj3ZccEcsD/Os6kbRudFGd527nhk8bKxCgkfX
+ FGm2f2jVLTOAGkC4BzznqaWeR55mUD5VPPvU9jcGGWPcoXaQQwFcLnoz2YQjzJM9l+IngKPU
+ JdNltGhhMlqsYB43uBnNcno3gESXKxNcw/aUOdlspaQEfpXRa34guta8BNsREWFowkm7LhfU
+ enOKofDfxzcWV+ljfFSWbAkIwxPue9cvM1HyO72cU+7O5vtHEuhWNv4huTcpHKnJjwIxjHOO
+ Wx3JroPAT3S6I6Xjbtk8iRkDA2BsDHtxVm+tYtVt2EmAGAcfXtVy0UW1ukSY2qPzrTAxlOXN
+ 0RwY+tCFHk+03+RoeaKKq7/pRXq8h4fOZpmA6sB+Ncn8RoodU8M3MCSxm4ixMi7hkkdR+RNc
+ w92zc7VH4/8A164P4n+J5tMsEs7SXZc3IO5l6qn/ANes5YpTXLY2WHcHzXOX1C1NwHETFJMZ
+ BU45q3pJhuQkU0MouMAHyznJ+hqGCT9zEwOTtB/SrFok1zdAWwZpCeAByK4mrI9Wk+aWrOvE
+ WvJp0lnoVrezmRdux0Qrj3NYWkafeya/Cl4Qs8ThpNq4Cc816x4BtdVsbP8A09QqMPlzycVa
+ g8Pwza1LPtXDv5kpHfHQVxTqpXR6E6eqadzXTxJZWiLHNvaZF52gHGe3Wl/4TC1P3IZj9cCv
+ n/wH4guP7Y1S2eVyks8kgBY/e3H3ruGvJW43j8Tn+denRqqlBRR4Nan7Wbmz0N/GUSnC2sh/
+ 4F/9aivOzcPnLOPyH+FFafWvP8DL6uiJ3mCktwByTmvD/G2p/wBp6/cTI++NSEQ+wrb8TfEC
+ 61APbacv2a1bKsx5dh/SuFdt0n41zRTWrNZyvojtrKctaxYPIUCtGx1N7SUOoZW9R3rndNlx
+ EvpWvC2eozUyOqnJ7o9b8J+Mb/UhDYJEzY/i9K6rxt4kh8I+Fp7l2BvJEKwpnkuR1+g615t4
+ E1y10mOea42xhACSeuPavPfiX4sn8Sak80hKwj5Yo88Kv+Ncfseefkdsq/s6fM3dlbwtdm1n
+ F1je5fcw9eSTXqtld2t9GjW8qkkZK5G4fhXjug7xaBiOrfLV2+uDHcjyHKsgxlTjmu5xujyl
+ I9hxxzn8xRXllt4p1SGIJ9p3Af3xk/nRU8jHzI//2Q==
+
+X-MS-OL-DESIGN;CHARSET=utf-8:<card xmlns="http://schemas.microsoft.com/office/outlook/12/electronicbusinesscards" ver="1.0" layout="left" bgcolor="ffffff"><img xmlns="" align="tleft" area="32" use="photo"/><fld xmlns="" prop="name" align="left" dir="ltr" style="b" color="000000" size="10"/><fld xmlns="" prop="org" align="left" dir="ltr" color="000000" size="8"/><fld xmlns="" prop="blank" size="8"/><fld xmlns="" prop="telwork" align="left" dir="ltr" color="000000" size="8"><label align="right" color="626262">Work</label></fld><fld xmlns="" prop="telpri" align="left" dir="ltr" color="000000" size="8"><label align="right" color="626262">Primary</label></fld><fld xmlns="" prop="email" align="left" dir="ltr" color="000000" size="8"/><fld xmlns="" prop="blank" size="8"/><fld xmlns="" prop="addrwork" align="left" dir="ltr" color="000000" size="8"/><fld xmlns="" prop="blank" size="8"/><fld xmlns="" prop="blank" size="8"/><fld xmlns="" prop="blank" size="8"/><fld xmlns="" prop="blank" size="8"/><fld xmlns="" prop="blank" size="8"/><fld xmlns="" prop="blank" size="8"/><fld xmlns="" prop="blank" size="8"/><fld xmlns="" prop="blank" size="8"/></card>
+REV:20090526T042241Z
+END:VCARD
diff --git a/demos/org.eclipse.fx.demo.contacts.app/vcards/Tom Schindl.vcf b/demos/org.eclipse.fx.demo.contacts.app/vcards/Tom Schindl.vcf
new file mode 100755
index 000000000..2cf757e96
--- /dev/null
+++ b/demos/org.eclipse.fx.demo.contacts.app/vcards/Tom Schindl.vcf
@@ -0,0 +1,55 @@
+BEGIN:VCARD
+VERSION:2.1
+N:Schindl;Tom
+FN:Tom Schindl
+ORG:BestSolution.at Systemhaus Gmbh
+TEL;WORK;VOICE:0676 323 21 47
+TEL;CELL;VOICE:0676 323 21 47
+TEL;PREF:0676 323 21 47
+ADR;WORK;PREF;CHARSET=Windows-1252:;;Eduard-Bodemgasse 6;Innsbruck;;6020;sterreich
+LABEL;WORK;PREF;CHARSET=Windows-1252;ENCODING=QUOTED-PRINTABLE:Eduard-Bodemgasse 6=0D=0A=
+6020 Innsbruck=0D=0A=
+=D6sterreich
+X-MS-OL-DEFAULT-POSTAL-ADDRESS:2
+EMAIL;PREF;INTERNET:tom.schindl@bestsolution.at
+PHOTO;TYPE=JPEG;ENCODING=BASE64:
+ /9j/4AAQSkZJRgABAQEAYABgAAD/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQY
+ GBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYa
+ KCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAAR
+ CABTAEgDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAA
+ AgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkK
+ FhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWG
+ h4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl
+ 5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREA
+ AgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYk
+ NOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOE
+ hYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk
+ 5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwD6ppHYKMmhjtGa8Y+M/wAQp7C1l0vQXH2l
+ srNcbsBB3VT6/wAqmUlFXY0rnW+LPiRoeheZE93FLcrwYkbp9T2rzzUPjaXdks7SMdlZ3JFf
+ PKrdSXMjXUbSsW3FtxOalXbPMAlwseHKkdSBXPKcnszRRXU9yHxpmjj/ANJggL/9M92B9a6z
+ wn8SotXVfN2RyHptOQa+cLfR7VC00ySHP3drfzrT0e7XT7jzY8ptKsno3PSs1Wae9ynTR9f6
+ XqyXAGGBrcRw65FfO/grxmXuBBODHKDjBOa9p0PVFuIl+auyMlJXRi01udDRSI25c0VQjN8R
+ 3K2uj3czsVSOJnJBxwBmvkyOzufE2pTX0jHYznb6KM19QfEVXk8IaskX32tnA/KvDfDlsLTR
+ bZIhklck+pJrlxMrWOrCxUpanJXHg6VrrO+RgR8p7D6+tNbwn5SyOYxI/I2465r0FvNOBt5p
+ fsk4OcAmuKU5W3O9U49UcPDpcWm2iBQBJtJ2dR9K5zUmjZ1QgKu4Er34PUf57V6dqdh5Y8wx
+ k8cZ9a8t8TQlr+F0wuHO76VFJ80tTCtBJaFf+0Ge7ivIpStxbSbQOnmJ6GvoHwHrJlEYLdcV
+ 806kyRqrDG8yYOPTpXsvw3ui/wBnbJOVU8/QV6VBWOGofSOnS+ZCD7UVS8PvugX6UV0GY/xJ
+ b/atKuYAcGSNkz9RXzNc6/daNaJZfZADBlHllcICQTnFfU18u6Bq+dvHnhW31XUrpyAZSzoQ
+ WOAM1hXS0udOGvd8pkReI3mtllUA4HJQ7gPyrktT8V6kbphDeFFGTtjTccDvXc+CPCdrpFhq
+ A4YOMYJ4FYq+FdOuL9mikVHHUex9vSua8FKzPRtNx8zL8NeLjdtsluzcoTgh1KsPpWv4k0qK
+ eye4iGWCliPWuh07R9O0yEKIo3I5DFRgfgKivZEcMigbTkVzVLKV46CUHa0jw8xSm8X5WeIN
+ lgOuO9ey+AgiTQeSW8oqpXd1xjvXPHw3HHfpPE5VUQvKD0K5Oa6nwHCz3EbBcKMAAdgK9ChL
+ nd0cVekqcF3Z774bP7hPpRTvDsZWBM+lFdJxmtcjMLV8/wDxCuZrDWbuGMHc8mV/GvoSQZQi
+ vGPi7ozPdw3icA4QsOx7VlWV43OjDT5JnnGqeIL3Sl+zQpHuKA+of61mS397fLFd3c0a3KAq
+ qxrtAHpS+ILSSNf9Ju3YgcMFxWTaaW14FX7TcqueqtXK1FLmPUu7Xubdvqs86r15rUhl2Rhp
+ DzWO6RWBSEZwoySe5qlNqnmThFJ2g84rnmuf4SXLTU1L68urq7+wRjbAACxHVs84+len+AtH
+ KKhK1wnhOwe+vvOdfvHj2Fe9eF9OEMKcV6VGHJBI8mrUc5XOg06HyoQPairSjAwKK1MxawPE
+ umpfWcsUi7lYYNb9MmjDoQaAPmDxXJHpF61rfQjKk7Sw+8PWuVvvFVpBGViRU+gr6S8XeFbP
+ V4Gju7aOZe25c4+leW6h8LdOWQmO0AHuSa53h0zsWLaVjxm41e41GbESklugFdL4Z0CeaRWm
+ UlienpXoem/D+G3bEUCJ9BXc6B4USAqSg/KrhSUTGdaUtCr4L0DyVQla9RsYRFEABVbTbBbd
+ AABxWmBgcVqYhRRRQAUUUUARTqCORWbPDGTygoooAjigiz9wVo28ajoooooAtDiiiigAoooo
+ A//Z
+
+X-MS-OL-DESIGN;CHARSET=utf-8:<card xmlns="http://schemas.microsoft.com/office/outlook/12/electronicbusinesscards" ver="1.0" layout="left" bgcolor="ffffff"><img xmlns="" align="tleft" area="32" use="photo"/><fld xmlns="" prop="name" align="left" dir="ltr" style="b" color="000000" size="10"/><fld xmlns="" prop="org" align="left" dir="ltr" color="000000" size="8"/><fld xmlns="" prop="blank" size="8"/><fld xmlns="" prop="telwork" align="left" dir="ltr" color="000000" size="8"><label align="right" color="626262">Work</label></fld><fld xmlns="" prop="telpri" align="left" dir="ltr" color="000000" size="8"><label align="right" color="626262">Primary</label></fld><fld xmlns="" prop="telcell" align="left" dir="ltr" color="000000" size="8"><label align="right" color="626262">Mobile</label></fld><fld xmlns="" prop="email" align="left" dir="ltr" color="000000" size="8"/><fld xmlns="" prop="addrwork" align="left" dir="ltr" color="000000" size="8"/><fld xmlns="" prop="blank" size="8"/><fld xmlns="" prop="blank" size="8"/><fld xmlns="" prop="blank" size="8"/><fld xmlns="" prop="blank" size="8"/><fld xmlns="" prop="blank" size="8"/><fld xmlns="" prop="blank" size="8"/><fld xmlns="" prop="blank" size="8"/><fld xmlns="" prop="blank" size="8"/></card>
+REV:20090528T104730Z
+END:VCARD
diff --git a/demos/org.eclipse.fx.demo.contacts.app/vcards/Torsten Sommer.vcf b/demos/org.eclipse.fx.demo.contacts.app/vcards/Torsten Sommer.vcf
new file mode 100755
index 000000000..7989a04c5
--- /dev/null
+++ b/demos/org.eclipse.fx.demo.contacts.app/vcards/Torsten Sommer.vcf
@@ -0,0 +1,18 @@
+BEGIN:VCARD
+VERSION:2.1
+N:Sommer;Torsten
+FN:Torsten Sommer
+ORG:TESIS DYNAware GmbH
+TITLE:Dipl.-Ing.
+TEL;WORK;VOICE:+49 89 747377-7438
+TEL;WORK;FAX:+49 89 747377 99
+TEL;PREF:+49 89 747377-7438
+ADR;WORK:;;Baierbrunner Str. 15;Mnchen;;D-81379;Germany
+LABEL;WORK;ENCODING=QUOTED-PRINTABLE:Baierbrunner Str. 15=0D=0AM=FCnchen D-81379=0D=0AGermany
+URL;HOME:http://www.tesis-dynaware.de/
+URL;WORK:http://www.tesis-dynaware.de/
+EMAIL;PREF;INTERNET:torsten.sommer@tesis.de
+PHOTO;TYPE=JPEG;ENCODING=BASE64:
+ /9j/4AAQSkZJRgABAgIAHAAcAAD/4Qq9RXhpZgAATU0AKgAAAAgABwESAAMAAAABAAEAAAEaAAUAAAABAAAAYgEbAAUAAAABAAAAagEoAAMAAAABAAMAAAExAAIAAAAeAAAAcgEyAAIAAAAUAAAAkIdpAAQAAAABAAAApAAAANAABFNJAAAnEAAEU0kAACcQQWRvYmUgUGhvdG9zaG9wIENTMyBNYWNpbnRvc2gAMjAxMjoxMToxMSAyMzozOTo1NwAAA6ABAAMAAAABAAEAAKACAAQAAAABAAAAWqADAAQAAAABAAAAZAAAAAAAAAAGAQMAAwAAAAEABgAAARoABQAAAAEAAAEeARsABQAAAAEAAAEmASgAAwAAAAEAAgAAAgEABAAAAAEAAAEuAgIABAAAAAEAAAmHAAAAAAAAAEgAAAABAAAASAAAAAH/2P/gABBKRklGAAECAABIAEgAAP/tAAxBZG9iZV9DTQAB/+4ADkFkb2JlAGSAAAAAAf/bAIQADAgICAkIDAkJDBELCgsRFQ8MDA8VGBMTFRMTGBEMDAwMDAwRDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAENCwsNDg0QDg4QFA4ODhQUDg4ODhQRDAwMDAwREQwMDAwMDBEMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwM/8AAEQgAZABaAwEiAAIRAQMRAf/dAAQABv/EAT8AAAEFAQEBAQEBAAAAAAAAAAMAAQIEBQYHCAkKCwEAAQUBAQEBAQEAAAAAAAAAAQACAwQFBgcICQoLEAABBAEDAgQCBQcGCAUDDDMBAAIRAwQhEjEFQVFhEyJxgTIGFJGhsUIjJBVSwWIzNHKC0UMHJZJT8OHxY3M1FqKygyZEk1RkRcKjdDYX0lXiZfKzhMPTdePzRieUpIW0lcTU5PSltcXV5fVWZnaGlqa2xtbm9jdHV2d3h5ent8fX5/cRAAICAQIEBAMEBQYHBwYFNQEAAhEDITESBEFRYXEiEwUygZEUobFCI8FS0fAzJGLhcoKSQ1MVY3M08SUGFqKygwcmNcLSRJNUoxdkRVU2dGXi8rOEw9N14/NGlKSFtJXE1OT0pbXF1eX1VmZ2hpamtsbW5vYnN0dXZ3eHl6e3x//aAAwDAQACEQMRAD8A7cKYUAphFTMJPexjS97gxrRJcTAATSAC4mANSfJee/Wf6zt6hmjGpefsNcgAfnu/0j/5P+jTZGkxiSXpuofXfo2GX10E5V7fzWaM/tWrDu/xj5+4uqx8euvsHuc53/ff+pXMNvpafTrG9zp3Eaan+V9L/NU21ipu41we0NB/KozMsoxh6Wj/ABnXg/rGFUWD6RrsIP8AZa9q6noX1p6P1tu3FtDMgfSxrCA/+z+//ZXk1zvXBFjQCODBBQMe2zHuY9nsfWQWPadQRw5ETPVUsY6aPvMJ1zv1O+so6ziGnJcPt1H0403s/Nt/8mujhSA2LYiKNLJ08JQkh//Q7gBTCi1Eaih5v67dUdhYDcVjtjsrdvcORW36X+cvK7b97zt0C77/ABnuYz7B+8RbP9Vu3/vy5f6sdJoyScjLZvYDDazwf6yhmdSS2MQsAD6seg9Lzup3bcVvsH07Do0f2l2eN9ScmB62S0iOGtWjgtpora2ljaq2j6LQGgBa+PkUvGjwot2xwgOA36j47Qd1m+e3A+eizup/Ut3ovdUKy4ajbIOnxXaW5OPUwvtsDWjkkwqFnVOmugtya4OglwCRHZOla0+efVm+3pf1jxfVcaptFdrXDQtd7V7JC8z6ti009bbbpDXMuHcESC7/AKlemBwPuHB1HwKnxmw08oqS8JJJJ7G//9HuWqYQwphFDyP+Myhr+l4+RpupsIjuQ4f9S1ct0S546aPRO1wJExMea7L68Ybrq8O+Jqrc9lnh7w2J/wAxcl9XGNrdZSR7RYS2e7SoMh1LbwxqMZA/NY8lrNz9zWDJvfIFlm8xLv5Kv9Lb1fpuY0Wsf6G4Bzt0t1W9T0zGPuaDB7Awp5tIrrZWxsCeEziFeLMIG7/BD9ZcPKyaqxje6sj9ISYAlZPT+mZDWljsWh43bTpuc5vezc6V1tDWnHqcSHD6PjojMxaKyXVsaCfAJXQOiZR10Ozx3XcGyu3CqxwZc11bW/Pc0a/mtleiYFjrcHHsdo51bdwHiBC53LxzZ1Ci4Rtpa6R/W9v/AH1dJhV+liVV/utH46qTEdT5NfPECIPUy/5qYJ0ktVK1n//S7gIgQgpAoqYZ+G3OwrcV2nqNhrvBw1Y7/OXA34OR03JDLq3VRpqPaY/0b/ouavRA5YH11IPTqD3Fv/fVHkiCL7MuLIR6ehKHpuWHVHceO6qdcLc+gY9LyCTrtkT81R6Zls1rcYnlLMxMiuzfVluqos/N2gx/b+kq9atyJ4mz03pmZQduSXPqr2urBJAJB+K6GvM3HbBaTyCuZZjYz6vTOZus77XOkf53tatSmqjCqbtc55LdXvcXOJ+JRITIcI3dnApOVc87gK2RvHc86LbCyfq/W8Yjr3iPWdLAf3Rpu/tLWarEBUfNo5ZmUqvQbLylKSWqcxv/0+0DlIOVfel6iSmyHLD+uDg7BoZOpsJjy2rQyMyrGx7Mm522qlpe8+QErkeoZZ6nltz2BzWOYGsYdSGfS7fnfvoSiTGVDoqOSMMkOI1xGnCtusx3F7Twr+H1erJx3Mv9wOjQDBBT5uEHV7mjzCxnYdjbC6o7Ha6dpVYUd24QYnR08FwozHPc/wBXYJ2u4I7D+ytWjIf1DNYyT6cjcB58MXPYmBl2WnfZDX6HaNdV2P1f6e2rKxqmjQPDie5j3Eu+5OA180Wa2oDV7drQ1oaNA0AAfDRSboVEFSlWGozTSm5SSU//1On3JtxVDqHVcLp1fqZdor/dZy939Vi4/q/1szeobqMWcbGOhg/pHD+W/wDN/spAEqbn1v8ArCMhrumYbppaf1iwfnEf4Nv/AAbfzlW+reY21v2O0+9mtR8R+7/ZWCzVsHluinS99FrbanbXsIc0jsQpImmLLAZIkfZ5vfNxG3MLNA/w7FZWZ019TyC0td4LT6Xn15+LXl1wHt9trB2d3VrrXUsWnEZXZV6+TYYprbo7+W8u/NY1DJgjL1R0P4SYcPPZMRGPIDOA9P8AXh5OP0+phiB7+4Wn9t+y9SwKaz+kttAPkwBz3/8AUoWOaPRN7NGtB3A6EEfSa8fvNWS7quN0/Mb1bqDXOZIqorb9Il/0y3d/oqfpqDHD9YAdKOrf5jL/AEeRh6uKNRrxfTwZ1UgvMcP63dX6XfYxln2vEY8gU26+ydzPSs+mz2rsOj/XTonUw1hs+yZB5pu0E/yLfoOUpiQxA2Ae70AKeVEagEag8EcFOgl//9Xisr7R65+1b/W/P9Sd3/SSaufST0PQsjc74qR4MLnEkkPoH1R+0/bLPT/o+39NPE/4OP5a1Mv0/tz/AF93rR/Z9P8AM9OPd/XXlaSmx7fxc3nP5079Pl3fVcD0tuV9L0ZZun46/wApc59c/T+0N9bdt2H7Nt+hH8n+Vu+muNSUZ/nZ7fKGeH+58Hz/ADz2/wAL5v5f5x69vqSfU+l6de/+ttEoL9n5v0p1XLJIHds4/kj5B9R+rP8Azygfs31fs/8Awv8ANf8Ag3t/zV13/Zt/3R+h5/T/ANf+tLwBJDr0Xv8A/9n/7SeYUGhvdG9zaG9wIDMuMAA4QklNBAQAAAAAAAccAgAAAm9sADhCSU0EJQAAAAAAEHUqq0lMt8MP2eTQze+bRII4QklNA+oAAAAAGA88P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pgo8IURPQ1RZUEUgcGxpc3QgUFVCTElDICItLy9BcHBsZS8vRFREIFBMSVNUIDEuMC8vRU4iICJodHRwOi8vd3d3LmFwcGxlLmNvbS9EVERzL1Byb3BlcnR5TGlzdC0xLjAuZHRkIj4KPHBsaXN0IHZlcnNpb249IjEuMCI+CjxkaWN0PgoJPGtleT5jb20uYXBwbGUucHJpbnQuUGFnZUZvcm1hdC5QTUhvcml6b250YWxSZXM8L2tleT4KCTxkaWN0PgoJCTxrZXk+Y29tLmFwcGxlLnByaW50LnRpY2tldC5jcmVhdG9yPC9rZXk+CgkJPHN0cmluZz5jb20uYXBwbGUuam9idGlja2V0PC9zdHJpbmc+CgkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0Lml0ZW1BcnJheTwva2V5PgoJCTxhcnJheT4KCQkJPGRpY3Q+CgkJCQk8a2V5PmNvbS5hcHBsZS5wcmludC5QYWdlRm9ybWF0LlBNSG9yaXpvbnRhbFJlczwva2V5PgoJCQkJPHJlYWw+NzI8L3JlYWw+CgkJCQk8a2V5PmNvbS5hcHBsZS5wcmludC50aWNrZXQuc3RhdGVGbGFnPC9rZXk+CgkJCQk8aW50ZWdlcj4wPC9pbnRlZ2VyPgoJCQk8L2RpY3Q+CgkJPC9hcnJheT4KCTwvZGljdD4KCTxrZXk+Y29tLmFwcGxlLnByaW50LlBhZ2VGb3JtYXQuUE1PcmllbnRhdGlvbjwva2V5PgoJPGRpY3Q+CgkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0LmNyZWF0b3I8L2tleT4KCQk8c3RyaW5nPmNvbS5hcHBsZS5qb2J0aWNrZXQ8L3N0cmluZz4KCQk8a2V5PmNvbS5hcHBsZS5wcmludC50aWNrZXQuaXRlbUFycmF5PC9rZXk+CgkJPGFycmF5PgoJCQk8ZGljdD4KCQkJCTxrZXk+Y29tLmFwcGxlLnByaW50LlBhZ2VGb3JtYXQuUE1PcmllbnRhdGlvbjwva2V5PgoJCQkJPGludGVnZXI+MTwvaW50ZWdlcj4KCQkJCTxrZXk+Y29tLmFwcGxlLnByaW50LnRpY2tldC5zdGF0ZUZsYWc8L2tleT4KCQkJCTxpbnRlZ2VyPjA8L2ludGVnZXI+CgkJCTwvZGljdD4KCQk8L2FycmF5PgoJPC9kaWN0PgoJPGtleT5jb20uYXBwbGUucHJpbnQuUGFnZUZvcm1hdC5QTVNjYWxpbmc8L2tleT4KCTxkaWN0PgoJCTxrZXk+Y29tLmFwcGxlLnByaW50LnRpY2tldC5jcmVhdG9yPC9rZXk+CgkJPHN0cmluZz5jb20uYXBwbGUuam9idGlja2V0PC9zdHJpbmc+CgkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0Lml0ZW1BcnJheTwva2V5PgoJCTxhcnJheT4KCQkJPGRpY3Q+CgkJCQk8a2V5PmNvbS5hcHBsZS5wcmludC5QYWdlRm9ybWF0LlBNU2NhbGluZzwva2V5PgoJCQkJPHJlYWw+MTwvcmVhbD4KCQkJCTxrZXk+Y29tLmFwcGxlLnByaW50LnRpY2tldC5zdGF0ZUZsYWc8L2tleT4KCQkJCTxpbnRlZ2VyPjA8L2ludGVnZXI+CgkJCTwvZGljdD4KCQk8L2FycmF5PgoJPC9kaWN0PgoJPGtleT5jb20uYXBwbGUucHJpbnQuUGFnZUZvcm1hdC5QTVZlcnRpY2FsUmVzPC9rZXk+Cgk8ZGljdD4KCQk8a2V5PmNvbS5hcHBsZS5wcmludC50aWNrZXQuY3JlYXRvcjwva2V5PgoJCTxzdHJpbmc+Y29tLmFwcGxlLmpvYnRpY2tldDwvc3RyaW5nPgoJCTxrZXk+Y29tLmFwcGxlLnByaW50LnRpY2tldC5pdGVtQXJyYXk8L2tleT4KCQk8YXJyYXk+CgkJCTxkaWN0PgoJCQkJPGtleT5jb20uYXBwbGUucHJpbnQuUGFnZUZvcm1hdC5QTVZlcnRpY2FsUmVzPC9rZXk+CgkJCQk8cmVhbD43MjwvcmVhbD4KCQkJCTxrZXk+Y29tLmFwcGxlLnByaW50LnRpY2tldC5zdGF0ZUZsYWc8L2tleT4KCQkJCTxpbnRlZ2VyPjA8L2ludGVnZXI+CgkJCTwvZGljdD4KCQk8L2FycmF5PgoJPC9kaWN0PgoJPGtleT5jb20uYXBwbGUucHJpbnQuUGFnZUZvcm1hdC5QTVZlcnRpY2FsU2NhbGluZzwva2V5PgoJPGRpY3Q+CgkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0LmNyZWF0b3I8L2tleT4KCQk8c3RyaW5nPmNvbS5hcHBsZS5qb2J0aWNrZXQ8L3N0cmluZz4KCQk8a2V5PmNvbS5hcHBsZS5wcmludC50aWNrZXQuaXRlbUFycmF5PC9rZXk+CgkJPGFycmF5PgoJCQk8ZGljdD4KCQkJCTxrZXk+Y29tLmFwcGxlLnByaW50LlBhZ2VGb3JtYXQuUE1WZXJ0aWNhbFNjYWxpbmc8L2tleT4KCQkJCTxyZWFsPjE8L3JlYWw+CgkJCQk8a2V5PmNvbS5hcHBsZS5wcmludC50aWNrZXQuc3RhdGVGbGFnPC9rZXk+CgkJCQk8aW50ZWdlcj4wPC9pbnRlZ2VyPgoJCQk8L2RpY3Q+CgkJPC9hcnJheT4KCTwvZGljdD4KCTxrZXk+Y29tLmFwcGxlLnByaW50LnN1YlRpY2tldC5wYXBlcl9pbmZvX3RpY2tldDwva2V5PgoJPGRpY3Q+CgkJPGtleT5QTVBQRFBhcGVyQ29kZU5hbWU8L2tleT4KCQk8ZGljdD4KCQkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0LmNyZWF0b3I8L2tleT4KCQkJPHN0cmluZz5jb20uYXBwbGUuam9idGlja2V0PC9zdHJpbmc+CgkJCTxrZXk+Y29tLmFwcGxlLnByaW50LnRpY2tldC5pdGVtQXJyYXk8L2tleT4KCQkJPGFycmF5PgoJCQkJPGRpY3Q+CgkJCQkJPGtleT5QTVBQRFBhcGVyQ29kZU5hbWU8L2tleT4KCQkJCQk8c3RyaW5nPkE0PC9zdHJpbmc+CgkJCQkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0LnN0YXRlRmxhZzwva2V5PgoJCQkJCTxpbnRlZ2VyPjA8L2ludGVnZXI+CgkJCQk8L2RpY3Q+CgkJCTwvYXJyYXk+CgkJPC9kaWN0PgoJCTxrZXk+UE1UaW9nYVBhcGVyTmFtZTwva2V5PgoJCTxkaWN0PgoJCQk8a2V5PmNvbS5hcHBsZS5wcmludC50aWNrZXQuY3JlYXRvcjwva2V5PgoJCQk8c3RyaW5nPmNvbS5hcHBsZS5qb2J0aWNrZXQ8L3N0cmluZz4KCQkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0Lml0ZW1BcnJheTwva2V5PgoJCQk8YXJyYXk+CgkJCQk8ZGljdD4KCQkJCQk8a2V5PlBNVGlvZ2FQYXBlck5hbWU8L2tleT4KCQkJCQk8c3RyaW5nPmlzby1hNDwvc3RyaW5nPgoJCQkJCTxrZXk+Y29tLmFwcGxlLnByaW50LnRpY2tldC5zdGF0ZUZsYWc8L2tleT4KCQkJCQk8aW50ZWdlcj4wPC9pbnRlZ2VyPgoJCQkJPC9kaWN0PgoJCQk8L2FycmF5PgoJCTwvZGljdD4KCQk8a2V5PmNvbS5hcHBsZS5wcmludC5QYWdlRm9ybWF0LlBNQWRqdXN0ZWRQYWdlUmVjdDwva2V5PgoJCTxkaWN0PgoJCQk8a2V5PmNvbS5hcHBsZS5wcmludC50aWNrZXQuY3JlYXRvcjwva2V5PgoJCQk8c3RyaW5nPmNvbS5hcHBsZS5qb2J0aWNrZXQ8L3N0cmluZz4KCQkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0Lml0ZW1BcnJheTwva2V5PgoJCQk8YXJyYXk+CgkJCQk8ZGljdD4KCQkJCQk8a2V5PmNvbS5hcHBsZS5wcmludC5QYWdlRm9ybWF0LlBNQWRqdXN0ZWRQYWdlUmVjdDwva2V5PgoJCQkJCTxhcnJheT4KCQkJCQkJPGludGVnZXI+MDwvaW50ZWdlcj4KCQkJCQkJPGludGVnZXI+MDwvaW50ZWdlcj4KCQkJCQkJPHJlYWw+NzgzPC9yZWFsPgoJCQkJCQk8cmVhbD41NTk8L3JlYWw+CgkJCQkJPC9hcnJheT4KCQkJCQk8a2V5PmNvbS5hcHBsZS5wcmludC50aWNrZXQuc3RhdGVGbGFnPC9rZXk+CgkJCQkJPGludGVnZXI+MDwvaW50ZWdlcj4KCQkJCTwvZGljdD4KCQkJPC9hcnJheT4KCQk8L2RpY3Q+CgkJPGtleT5jb20uYXBwbGUucHJpbnQuUGFnZUZvcm1hdC5QTUFkanVzdGVkUGFwZXJSZWN0PC9rZXk+CgkJPGRpY3Q+CgkJCTxrZXk+Y29tLmFwcGxlLnByaW50LnRpY2tldC5jcmVhdG9yPC9rZXk+CgkJCTxzdHJpbmc+Y29tLmFwcGxlLmpvYnRpY2tldDwvc3RyaW5nPgoJCQk8a2V5PmNvbS5hcHBsZS5wcmludC50aWNrZXQuaXRlbUFycmF5PC9rZXk+CgkJCTxhcnJheT4KCQkJCTxkaWN0PgoJCQkJCTxrZXk+Y29tLmFwcGxlLnByaW50LlBhZ2VGb3JtYXQuUE1BZGp1c3RlZFBhcGVyUmVjdDwva2V5PgoJCQkJCTxhcnJheT4KCQkJCQkJPHJlYWw+LTE4PC9yZWFsPgoJCQkJCQk8cmVhbD4tMTg8L3JlYWw+CgkJCQkJCTxyZWFsPjgyNDwvcmVhbD4KCQkJCQkJPHJlYWw+NTc3PC9yZWFsPgoJCQkJCTwvYXJyYXk+CgkJCQkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0LnN0YXRlRmxhZzwva2V5PgoJCQkJCTxpbnRlZ2VyPjA8L2ludGVnZXI+CgkJCQk8L2RpY3Q+CgkJCTwvYXJyYXk+CgkJPC9kaWN0PgoJCTxrZXk+Y29tLmFwcGxlLnByaW50LlBhcGVySW5mby5QTVBhcGVyTmFtZTwva2V5PgoJCTxkaWN0PgoJCQk8a2V5PmNvbS5hcHBsZS5wcmludC50aWNrZXQuY3JlYXRvcjwva2V5PgoJCQk8c3RyaW5nPmNvbS5hcHBsZS5qb2J0aWNrZXQ8L3N0cmluZz4KCQkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0Lml0ZW1BcnJheTwva2V5PgoJCQk8YXJyYXk+CgkJCQk8ZGljdD4KCQkJCQk8a2V5PmNvbS5hcHBsZS5wcmludC5QYXBlckluZm8uUE1QYXBlck5hbWU8L2tleT4KCQkJCQk8c3RyaW5nPmlzby1hNDwvc3RyaW5nPgoJCQkJCTxrZXk+Y29tLmFwcGxlLnByaW50LnRpY2tldC5zdGF0ZUZsYWc8L2tleT4KCQkJCQk8aW50ZWdlcj4wPC9pbnRlZ2VyPgoJCQkJPC9kaWN0PgoJCQk8L2FycmF5PgoJCTwvZGljdD4KCQk8a2V5PmNvbS5hcHBsZS5wcmludC5QYXBlckluZm8uUE1VbmFkanVzdGVkUGFnZVJlY3Q8L2tleT4KCQk8ZGljdD4KCQkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0LmNyZWF0b3I8L2tleT4KCQkJPHN0cmluZz5jb20uYXBwbGUuam9idGlja2V0PC9zdHJpbmc+CgkJCTxrZXk+Y29tLmFwcGxlLnByaW50LnRpY2tldC5pdGVtQXJyYXk8L2tleT4KCQkJPGFycmF5PgoJCQkJPGRpY3Q+CgkJCQkJPGtleT5jb20uYXBwbGUucHJpbnQuUGFwZXJJbmZvLlBNVW5hZGp1c3RlZFBhZ2VSZWN0PC9rZXk+CgkJCQkJPGFycmF5PgoJCQkJCQk8aW50ZWdlcj4wPC9pbnRlZ2VyPgoJCQkJCQk8aW50ZWdlcj4wPC9pbnRlZ2VyPgoJCQkJCQk8cmVhbD43ODM8L3JlYWw+CgkJCQkJCTxyZWFsPjU1OTwvcmVhbD4KCQkJCQk8L2FycmF5PgoJCQkJCTxrZXk+Y29tLmFwcGxlLnByaW50LnRpY2tldC5zdGF0ZUZsYWc8L2tleT4KCQkJCQk8aW50ZWdlcj4wPC9pbnRlZ2VyPgoJCQkJPC9kaWN0PgoJCQk8L2FycmF5PgoJCTwvZGljdD4KCQk8a2V5PmNvbS5hcHBsZS5wcmludC5QYXBlckluZm8uUE1VbmFkanVzdGVkUGFwZXJSZWN0PC9rZXk+CgkJPGRpY3Q+CgkJCTxrZXk+Y29tLmFwcGxlLnByaW50LnRpY2tldC5jcmVhdG9yPC9rZXk+CgkJCTxzdHJpbmc+Y29tLmFwcGxlLmpvYnRpY2tldDwvc3RyaW5nPgoJCQk8a2V5PmNvbS5hcHBsZS5wcmludC50aWNrZXQuaXRlbUFycmF5PC9rZXk+CgkJCTxhcnJheT4KCQkJCTxkaWN0PgoJCQkJCTxrZXk+Y29tLmFwcGxlLnByaW50LlBhcGVySW5mby5QTVVuYWRqdXN0ZWRQYXBlclJlY3Q8L2tleT4KCQkJCQk8YXJyYXk+CgkJCQkJCTxyZWFsPi0xODwvcmVhbD4KCQkJCQkJPHJlYWw+LTE4PC9yZWFsPgoJCQkJCQk8cmVhbD44MjQ8L3JlYWw+CgkJCQkJCTxyZWFsPjU3NzwvcmVhbD4KCQkJCQk8L2FycmF5PgoJCQkJCTxrZXk+Y29tLmFwcGxlLnByaW50LnRpY2tldC5zdGF0ZUZsYWc8L2tleT4KCQkJCQk8aW50ZWdlcj4wPC9pbnRlZ2VyPgoJCQkJPC9kaWN0PgoJCQk8L2FycmF5PgoJCTwvZGljdD4KCQk8a2V5PmNvbS5hcHBsZS5wcmludC5QYXBlckluZm8ucHBkLlBNUGFwZXJOYW1lPC9rZXk+CgkJPGRpY3Q+CgkJCTxrZXk+Y29tLmFwcGxlLnByaW50LnRpY2tldC5jcmVhdG9yPC9rZXk+CgkJCTxzdHJpbmc+Y29tLmFwcGxlLmpvYnRpY2tldDwvc3RyaW5nPgoJCQk8a2V5PmNvbS5hcHBsZS5wcmludC50aWNrZXQuaXRlbUFycmF5PC9rZXk+CgkJCTxhcnJheT4KCQkJCTxkaWN0PgoJCQkJCTxrZXk+Y29tLmFwcGxlLnByaW50LlBhcGVySW5mby5wcGQuUE1QYXBlck5hbWU8L2tleT4KCQkJCQk8c3RyaW5nPkE0PC9zdHJpbmc+CgkJCQkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0LnN0YXRlRmxhZzwva2V5PgoJCQkJCTxpbnRlZ2VyPjA8L2ludGVnZXI+CgkJCQk8L2RpY3Q+CgkJCTwvYXJyYXk+CgkJPC9kaWN0PgoJCTxrZXk+Y29tLmFwcGxlLnByaW50LnRpY2tldC5BUElWZXJzaW9uPC9rZXk+CgkJPHN0cmluZz4wMC4yMDwvc3RyaW5nPgoJCTxrZXk+Y29tLmFwcGxlLnByaW50LnRpY2tldC50eXBlPC9rZXk+CgkJPHN0cmluZz5jb20uYXBwbGUucHJpbnQuUGFwZXJJbmZvVGlja2V0PC9zdHJpbmc+Cgk8L2RpY3Q+Cgk8a2V5PmNvbS5hcHBsZS5wcmludC50aWNrZXQuQVBJVmVyc2lvbjwva2V5PgoJPHN0cmluZz4wMC4yMDwvc3RyaW5nPgoJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0LnR5cGU8L2tleT4KCTxzdHJpbmc+Y29tLmFwcGxlLnByaW50LlBhZ2VGb3JtYXRUaWNrZXQ8L3N0cmluZz4KPC9kaWN0Pgo8L3BsaXN0PgoAOEJJTQPtAAAAAAAQAEf//wACAAIAR///AAIAAjhCSU0EJgAAAAAADgAAAAAAAAAAAAA/gAAAOEJJTQQNAAAAAAAEAAAAeDhCSU0EGQAAAAAABAAAAB44QklNA/MAAAAAAAkAAAAAAAAAAAEAOEJJTQQKAAAAAAABAAA4QklNJxAAAAAAAAoAAQAAAAAAAAACOEJJTQP1AAAAAABIAC9mZgABAGxmZgAGAAAAAAABAC9mZgABAKGZmgAGAAAAAAABADIAAAABAFoAAAAGAAAAAAABADUAAAABAC0AAAAGAAAAAAABOEJJTQP4AAAAAABwAAD/////////////////////////////A+gAAAAA/////////////////////////////wPoAAAAAP////////////////////////////8D6AAAAAD/////////////////////////////A+gAADhCSU0ECAAAAAAAEAAAAAEAAAJAAAACQAAAAAA4QklNBB4AAAAAAAQAAAAAOEJJTQQaAAAAAANVAAAABgAAAAAAAAAAAAAAZAAAAFoAAAAQAHAAcgBvAHQAcgBhAGkAdAAtADEANAAwAHgAMQA4ADAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAFoAAABkAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAEAAAAAAABudWxsAAAAAgAAAAZib3VuZHNPYmpjAAAAAQAAAAAAAFJjdDEAAAAEAAAAAFRvcCBsb25nAAAAAAAAAABMZWZ0bG9uZwAAAAAAAAAAQnRvbWxvbmcAAABkAAAAAFJnaHRsb25nAAAAWgAAAAZzbGljZXNWbExzAAAAAU9iamMAAAABAAAAAAAFc2xpY2UAAAASAAAAB3NsaWNlSURsb25nAAAAAAAAAAdncm91cElEbG9uZwAAAAAAAAAGb3JpZ2luZW51bQAAAAxFU2xpY2VPcmlnaW4AAAANYXV0b0dlbmVyYXRlZAAAAABUeXBlZW51bQAAAApFU2xpY2VUeXBlAAAAAEltZyAAAAAGYm91bmRzT2JqYwAAAAEAAAAAAABSY3QxAAAABAAAAABUb3AgbG9uZwAAAAAAAAAATGVmdGxvbmcAAAAAAAAAAEJ0b21sb25n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OmV4aWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20vZXhpZi8xLjAvIiBkYzpmb3JtYXQ9ImltYWdlL2pwZWciIHhhcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTMyBNYWNpbnRvc2giIHhhcDpDcmVhdGVEYXRlPSIyMDEwLTA2LTE1VDE5OjA5OjEyKzAyOjAwIiB4YXA6TW9kaWZ5RGF0ZT0iMjAxMi0xMS0xMVQyMzozOTo1NyswMTowMCIgeGFwOk1ldGFkYXRhRGF0ZT0iMjAxMi0xMS0xMVQyMzozOTo1NyswMTowMCIgeGFwTU06RG9jdW1lbnRJRD0idXVpZDo5MEExOTc4MTQzN0FERjExOTExMkZGMDI2OUVFQjI1MSIgeGFwTU06SW5zdGFuY2VJRD0idXVpZDowN0Y4MDgyN0VCMkRFMjExOERDQ0YzQUQ4NDRFQ0Y0NyIgcGhvdG9zaG9wOkNvbG9yTW9kZT0iMyIgcGhvdG9zaG9wOklDQ1Byb2ZpbGU9InNSR0IgSUVDNjE5NjYtMi4xIiBwaG90b3Nob3A6SGlzdG9yeT0iIiB0aWZmOk9yaWVudGF0aW9uPSIxIiB0aWZmOlhSZXNvbHV0aW9uPSIyODM0NjUvMTAwMDAiIHRpZmY6WVJlc29sdXRpb249IjI4MzQ2NS8xMDAwMCIgdGlmZjpSZXNvbHV0aW9uVW5pdD0iMyIgdGlmZjpOYXRpdmVEaWdlc3Q9IjI1NiwyNTcsMjU4LDI1OSwyNjIsMjc0LDI3NywyODQsNTMwLDUzMSwyODIsMjgzLDI5NiwzMDEsMzE4LDMxOSw1MjksNTMyLDMwNiwyNzAsMjcxLDI3MiwzMDUsMzE1LDMzNDMyOzI2MjExOTRDNEE1NjY5MTUwRjZDRjRDNDA0NUI3RTJFIiBleGlmOlBpeGVsWERpbWVuc2lvbj0iOTAiIGV4aWY6UGl4ZWxZRGltZW5zaW9uPSIxMDAiIGV4aWY6Q29sb3JTcGFjZT0iMSIgZXhpZjpOYXRpdmVEaWdlc3Q9IjM2ODY0LDQwOTYwLDQwOTYxLDM3MTIxLDM3MTIyLDQwOTYyLDQwOTYzLDM3NTEwLDQwOTY0LDM2ODY3LDM2ODY4LDMzNDM0LDMzNDM3LDM0ODUwLDM0ODUyLDM0ODU1LDM0ODU2LDM3Mzc3LDM3Mzc4LDM3Mzc5LDM3MzgwLDM3MzgxLDM3MzgyLDM3MzgzLDM3Mzg0LDM3Mzg1LDM3Mzg2LDM3Mzk2LDQxNDgzLDQxNDg0LDQxNDg2LDQxNDg3LDQxNDg4LDQxNDkyLDQxNDkzLDQxNDk1LDQxNzI4LDQxNzI5LDQxNzMwLDQxOTg1LDQxOTg2LDQxOTg3LDQxOTg4LDQxOTg5LDQxOTkwLDQxOTkxLDQxOTkyLDQxOTkzLDQxOTk0LDQxOTk1LDQxOTk2LDQyMDE2LDAsMiw0LDUsNiw3LDgsOSwxMCwxMSwxMiwxMywxNCwxNSwxNiwxNywxOCwyMCwyMiwyMywyNCwyNSwyNiwyNywyOCwzMDs4RTlEMkMwMjUwM0M1NDQ0MzlEQUQzNTEyNUNFNkVCMCI+IDx4YXBNTTpEZXJpdmVkRnJvbSBzdFJlZjppbnN0YW5jZUlEPSJ1dWlkOjhEQTE5NzgxNDM3QURGMTE5MTEyRkYwMjY5RUVCMjUxIiBzdFJlZjpkb2N1bWVudElEPSJ1dWlkOjhEQTE5NzgxNDM3QURGMTE5MTEyRkYwMjY5RUVCMjUxIi8+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw/eHBhY2tldCBlbmQ9InciPz7/4gxYSUNDX1BST0ZJTEUAAQEAAAxITGlubwIQAABtbnRyUkdCIFhZWiAHzgACAAkABgAxAABhY3NwTVNGVAAAAABJRUMgc1JHQgAAAAAAAAAAAAAAAQAA9tYAAQAAAADTLUhQICAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA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
+REV:20121111T231052Z
+END:VCARD
diff --git a/demos/org.eclipse.fx.demo.contacts.app/vcards/Yves YANG.vcf b/demos/org.eclipse.fx.demo.contacts.app/vcards/Yves YANG.vcf
new file mode 100755
index 000000000..e417f325a
--- /dev/null
+++ b/demos/org.eclipse.fx.demo.contacts.app/vcards/Yves YANG.vcf
@@ -0,0 +1,68 @@
+BEGIN:VCARD
+VERSION:2.1
+N;LANGUAGE=en-us:YANG;Yves
+FN:Yves YANG
+ORG:Soyatec
+TITLE:XWT
+NOTE:Modeling & Declarative UI
+TEL;WORK;VOICE:+33 (1) 60130667
+TEL;CELL;VOICE:+33 (6) 20743945
+TEL;WORK;FAX:+33 (9) 58070667
+ADR;WORK;PREF;CHARSET=Windows-1252:;;1, alle des Mongasques;Massy;;91300;France
+LABEL;WORK;PREF;CHARSET=Windows-1252;ENCODING=QUOTED-PRINTABLE:1, all=E9e des Mon=E9gasques=0D=0A=
+91300 Massy
+X-MS-OL-DEFAULT-POSTAL-ADDRESS:2
+URL;WORK:http://www.soyatec.com
+EMAIL;PREF;INTERNET:yves.yang@soyatec.com
+PHOTO;TYPE=JPEG;ENCODING=BASE64:
+ /9j/4AAQSkZJRgABAQEAYABgAAD/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQY
+ GBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYa
+ KCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAAR
+ CABgAEUDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAA
+ AgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkK
+ FhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWG
+ h4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl
+ 5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREA
+ AgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYk
+ NOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOE
+ hYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk
+ 5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwBPDXiP4eQ+GdJjvNO0x7pLSFZS2nqxLhBu
+ JO3k5zzV2TxX8NR00jTT9NLT/wCJrwewGbKD/rmv8qkmcRjnO70quULntUni/wCHC5xodiR7
+ aZH/AIVl33jrwGgxaeGbGRj3bT4gB+leNTSM3U8elR5pcpaR6wvj7wmj/vPCWmyJ6pZxKf1B
+ qwnjzwR28JW+fQ2cP+FePU4cHijlHynsLePPBm4BPBtofXNrAP6V1Hw+vfC/jDULu2i8J6bb
+ C3iEpZ7aJt2TjHC189Ruc89a9h/Z3mVdf1VWOC1qoH/fVDVhWIv2g9F0rTjoP2DTLG18z7Rv
+ 8m3RN2PLxnA56n86Ku/tJHP/AAjv/bx/7SoqRM4HTbC0t9Aiup2YAW6Pz6lelcq0hkkZznce
+ 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
+
+X-MS-OL-DESIGN;CHARSET=utf-8:<card xmlns="http://schemas.microsoft.com/office/outlook/12/electronicbusinesscards" ver="1.0" layout="left" bgcolor="ffffff"><img xmlns="" align="tleft" area="32" use="photo"/><fld xmlns="" prop="name" align="left" dir="ltr" style="b" color="000000" size="10"/><fld xmlns="" prop="org" align="left" dir="ltr" color="000000" size="8"/><fld xmlns="" prop="title" align="left" dir="ltr" color="000000" size="8"/><fld xmlns="" prop="telwork" align="left" dir="ltr" color="000000" size="8"><label align="right" color="626262">Work</label></fld><fld xmlns="" prop="telcell" align="left" dir="ltr" color="000000" size="8"><label align="right" color="626262">Mobile</label></fld><fld xmlns="" prop="email" align="left" dir="ltr" color="000000" size="8"/><fld xmlns="" prop="addrwork" align="left" dir="ltr" color="000000" size="8"/><fld xmlns="" prop="webwork" align="left" dir="ltr" color="000000" size="8"/><fld xmlns="" prop="blank" size="8"/><fld xmlns="" prop="blank" size="8"/><fld xmlns="" prop="blank" size="8"/><fld xmlns="" prop="blank" size="8"/><fld xmlns="" prop="blank" size="8"/><fld xmlns="" prop="blank" size="8"/><fld xmlns="" prop="blank" size="8"/><fld xmlns="" prop="blank" size="8"/></card>
+REV:20090602T075537Z
+END:VCARD

Back to the top