changeset 6063:423cf238579d 8.0-b123

Sync up SceneBuilder changes
author Yves Joan <yves.joan@oracle.com>
date Tue, 07 Jan 2014 12:06:59 +0100
parents 5aca75258738
children 2872be3a2984 b42c0c512c4a
files apps/scenebuilder/SceneBuilderApp/src/com/oracle/javafx/scenebuilder/app/AppPlatform.java apps/scenebuilder/SceneBuilderApp/src/com/oracle/javafx/scenebuilder/app/SceneBuilderApp.java apps/scenebuilder/SceneBuilderApp/src/com/oracle/javafx/scenebuilder/app/SceneBuilderTest.java apps/scenebuilder/SceneBuilderApp/src/com/oracle/javafx/scenebuilder/app/ScenicViewStarter.java apps/scenebuilder/SceneBuilderApp/src/com/oracle/javafx/scenebuilder/app/i18n/SceneBuilderApp.properties apps/scenebuilder/SceneBuilderApp/src/com/oracle/javafx/scenebuilder/app/menubar/MenuBar.fxml apps/scenebuilder/SceneBuilderApp/src/com/oracle/javafx/scenebuilder/app/menubar/MenuBarController.java apps/scenebuilder/SceneBuilderApp/src/com/oracle/javafx/scenebuilder/app/preferences/PreferencesDialogController.java apps/scenebuilder/SceneBuilderApp/src/com/oracle/javafx/scenebuilder/app/preferences/SBPreferences.java apps/scenebuilder/SceneBuilderApp/src/com/oracle/javafx/scenebuilder/app/preview/PreviewWindowController.java apps/scenebuilder/SceneBuilderApp/src/com/oracle/javafx/scenebuilder/app/template/FxmlTemplates.java apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/EditorController.java apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/EditorPlatform.java apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/i18n/SceneBuilderKit.properties apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/images/ImageUtilsBase.java apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/job/ModifyFxIdJob.java apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/job/UsePredefinedSizeJob.java apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/panel/content/gesture/mouse/ResizeShadow.java apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/panel/hierarchy/ImageView.fxml apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/panel/hierarchy/treetableview/HierarchyTreeTableCell.java apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/panel/hierarchy/treeview/HierarchyTreeCell.java apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/panel/inspector/InspectorPanelController.java apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/panel/inspector/editors/AutoSuggestEditor.java apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/panel/inspector/editors/BoundedDoubleEditor.fxml apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/panel/inspector/editors/BoundedDoubleEditor.java apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/panel/inspector/editors/ColumnResizePolicyEditor.java apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/panel/inspector/editors/CursorEditor.java apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/panel/inspector/editors/EditorUtils.java apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/panel/inspector/editors/EnumEditor.java apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/panel/inspector/editors/EventHandlerEditor.java apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/panel/inspector/editors/FxIdEditor.java apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/panel/inspector/editors/I18nStringEditor.java apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/panel/inspector/editors/PropertyEditor.java apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/panel/inspector/editors/StyleClassEditor.java apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/panel/inspector/editors/StyleEditor.java apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/panel/inspector/editors/StylesheetEditor.java apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/panel/inspector/popupeditors/EffectPopupEditor.java apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/panel/inspector/popupeditors/PopupEditor.fxml apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/panel/inspector/popupeditors/PopupEditor.java apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/panel/inspector/popupeditors/Rectangle2DPopupEditor.fxml apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/panel/inspector/popupeditors/Rectangle2DPopupEditor.java apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/panel/library/LibraryPanelController.java apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/panel/util/AbstractWindowController.java apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/panel/util/dialog/AbstractModalDialog.java apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/fxom/FXOMBuilderFactory.java apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/fxom/FXOMCollection.java apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/fxom/FXOMDocument.java apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/fxom/FXOMImageBuilder.java apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/fxom/FXOMInstance.java apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/fxom/FXOMIntrinsic.java apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/fxom/FXOMLoader.java apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/fxom/FXOMNode.java apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/fxom/FXOMObject.java apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/fxom/FXOMPropertyC.java apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/fxom/FXOMPropertyT.java apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/fxom/ResourceKeyCollector.java apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/fxom/TransientClassLoader.java apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/fxom/TransientObject.java apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/fxom/missing-image.png apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/metadata/Metadata.java apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/metadata/property/value/EffectPropertyMetadata.java apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/metadata/property/value/ImagePropertyMetadata.java apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/metadata/property/value/KeyCombinationPropertyMetadata.java apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/metadata/property/value/effect/BlendPropertyMetadata.java apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/metadata/property/value/effect/BloomPropertyMetadata.java apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/metadata/property/value/effect/BoxBlurPropertyMetadata.java apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/metadata/property/value/effect/ColorAdjustPropertyMetadata.java apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/metadata/property/value/effect/ColorInputPropertyMetadata.java apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/metadata/property/value/effect/DropShadowPropertyMetadata.java apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/metadata/property/value/effect/EffectPropertyMetadata.java apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/metadata/property/value/effect/GaussianBlurPropertyMetadata.java apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/metadata/property/value/effect/GlowPropertyMetadata.java apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/metadata/property/value/effect/ImageInputPropertyMetadata.java apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/metadata/property/value/effect/InnerShadowPropertyMetadata.java apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/metadata/property/value/effect/LightingPropertyMetadata.java apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/metadata/property/value/effect/MotionBlurPropertyMetadata.java apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/metadata/property/value/effect/PerspectiveTransformPropertyMetadata.java apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/metadata/property/value/effect/ReflectionPropertyMetadata.java apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/metadata/property/value/effect/SepiaTonePropertyMetadata.java apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/metadata/property/value/effect/ShadowPropertyMetadata.java apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/metadata/util/GradientEncoder.java apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/metadata/util/PrefixedValue.java apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/util/Deprecation.java apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/util/URLUtils.java apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/util/control/effectpicker/BlendPathItem.java apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/util/control/effectpicker/ColorInputPathItem.java apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/util/control/effectpicker/EffectPathItem.fxml apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/util/control/effectpicker/EffectPathItem.java apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/util/control/effectpicker/EffectPicker.css apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/util/control/effectpicker/EffectPicker.fxml apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/util/control/effectpicker/EffectPicker.java apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/util/control/effectpicker/EffectPickerController.java apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/util/control/effectpicker/ImageInputPathItem.java apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/util/control/effectpicker/LightingPathItem.java apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/util/control/effectpicker/SingleInputPathItem.java apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/util/control/effectpicker/Utils.java apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/util/control/effectpicker/editors/CheckBoxEditor.fxml apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/util/control/effectpicker/editors/CheckBoxEditor.java apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/util/control/effectpicker/editors/EnumEditor.fxml apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/util/control/effectpicker/editors/EnumEditor.java apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/util/control/effectpicker/editors/ImageEditor.fxml apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/util/control/effectpicker/editors/ImageEditor.java apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/util/control/effectpicker/editors/NumFieldEditor.fxml apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/util/control/effectpicker/editors/NumFieldEditor.java apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/util/control/effectpicker/editors/SliderEditor.fxml apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/util/control/effectpicker/editors/SliderEditor.java apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/util/control/effectpicker/images/Blend.png apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/util/control/effectpicker/images/Bloom.png apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/util/control/effectpicker/images/BoxBlur.png apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/util/control/effectpicker/images/ColorAdjust.png apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/util/control/effectpicker/images/ColorInput.png apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/util/control/effectpicker/images/DisplacementMap.png apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/util/control/effectpicker/images/DropShadow.png apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/util/control/effectpicker/images/GaussianBlur.png apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/util/control/effectpicker/images/Glow.png apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/util/control/effectpicker/images/ImageInput.png apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/util/control/effectpicker/images/InnerShadow.png apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/util/control/effectpicker/images/Lighting.png apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/util/control/effectpicker/images/MotionBlur.png apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/util/control/effectpicker/images/PerspectiveTransform.png apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/util/control/effectpicker/images/Reflection.png apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/util/control/effectpicker/images/SepiaTone.png apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/util/control/effectpicker/images/Shadow.png apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/util/control/effectpicker/images/selection-chevron.png apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/util/control/painteditor/PaintEditor.css apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/util/control/painteditor/PaintEditor.fxml apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/util/control/painteditor/PaintEditor.java apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/util/control/painteditor/PaintEditorController.java apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/util/control/painteditor/coloreditor/ColorEditor.css apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/util/control/painteditor/coloreditor/ColorEditor.fxml apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/util/control/painteditor/coloreditor/ColorEditor.java apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/util/control/painteditor/gradienteditor/GradientEditor.css apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/util/control/painteditor/gradienteditor/GradientEditor.fxml apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/util/control/painteditor/gradienteditor/GradientEditor.java apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/util/control/painteditor/gradienteditor/GradientEditorStop.css apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/util/control/painteditor/gradienteditor/GradientEditorStop.fxml apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/util/control/painteditor/gradienteditor/GradientEditorStop.java apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/util/control/painteditor/images/chequers.png apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/util/control/painteditor/images/stop-indicator.png apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/util/control/painteditor/rotateeditor/RotateEditor.css apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/util/control/painteditor/rotateeditor/RotateEditor.fxml apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/util/control/painteditor/rotateeditor/RotateEditor.java apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/util/control/painteditor/rotateeditor/rotate-handle.png apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/util/control/painteditor/slidereditor/SliderEditor.fxml apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/util/control/painteditor/slidereditor/SliderEditor.java
diffstat 145 files changed, 6821 insertions(+), 3458 deletions(-) [+]
line wrap: on
line diff
--- a/apps/scenebuilder/SceneBuilderApp/src/com/oracle/javafx/scenebuilder/app/AppPlatform.java	Mon Jan 06 11:23:36 2014 +0200
+++ b/apps/scenebuilder/SceneBuilderApp/src/com/oracle/javafx/scenebuilder/app/AppPlatform.java	Tue Jan 07 12:06:59 2014 +0100
@@ -58,6 +58,8 @@
     private static String messageBoxFolder;
     private static MessageBox<MessageBoxMessage> messageBox;
     
+    private static boolean launchedFromMainRoutine;
+    
     public static synchronized String getApplicationDataFolder() {
         
         if (applicationDataFolder == null) {
@@ -92,6 +94,11 @@
         return userLibraryFolder;
     }
     
+    public static void setLaunchedFromMainRoutine(boolean launched) {
+        // For testing purpose. See details in handleOpenFilesAction().
+        launchedFromMainRoutine = launched;
+    }
+    
     public static boolean requestStart(
             AppNotificationHandler notificationHandler, Application.Parameters parameters)  
     throws IOException {
@@ -225,7 +232,6 @@
         
         private final AppNotificationHandler notificationHandler;
         private final com.sun.glass.ui.Application.EventHandler oldEventHandler;
-        private int openFilesCount;
         
         public MacEventHandler(AppNotificationHandler notificationHandler,
                 com.sun.glass.ui.Application.EventHandler oldEventHandler) {
@@ -258,20 +264,15 @@
             }
             
             /*
-             * When SB is started from NB, this method is called a first time
-             * with files[0] == "com.oracle.javafx.scenebuilder.app.SceneBuilderApp". //NOI18N
-             * We ignore this call here.
+             * When SB is started by invoking SceneBuilderApp.main(),
+             * handleOpenFilesAction() is invoked with files[0] equal to
+             * the name of the class invoking main(). It's probably a bug in RT.
+             * 
+             * In that case, launchedFromMainroutine is set to true and 
+             * we simply ignore files variable.
              */
-            final boolean openRejected;
-            if (openFilesCount++
-                    == 0) {
-                openRejected = (files.length == 1) 
-                        && files[0].equals("com.oracle.javafx.scenebuilder.app.SceneBuilderApp"); //NOI18N
-            } else {
-                openRejected = false;
-            }
             
-            if (openRejected == false) {
+            if (launchedFromMainRoutine == false) {
                 notificationHandler.handleOpenFilesAction(Arrays.asList(files));
             }
         }
--- a/apps/scenebuilder/SceneBuilderApp/src/com/oracle/javafx/scenebuilder/app/SceneBuilderApp.java	Mon Jan 06 11:23:36 2014 +0200
+++ b/apps/scenebuilder/SceneBuilderApp/src/com/oracle/javafx/scenebuilder/app/SceneBuilderApp.java	Tue Jan 07 12:06:59 2014 +0100
@@ -340,6 +340,7 @@
      * Ignored in correctly deployed JavaFX application.
      */
     public static void main(String[] args) {
+        AppPlatform.setLaunchedFromMainRoutine(true);
         launch(args);
     }
 
--- a/apps/scenebuilder/SceneBuilderApp/src/com/oracle/javafx/scenebuilder/app/SceneBuilderTest.java	Mon Jan 06 11:23:36 2014 +0200
+++ b/apps/scenebuilder/SceneBuilderApp/src/com/oracle/javafx/scenebuilder/app/SceneBuilderTest.java	Tue Jan 07 12:06:59 2014 +0100
@@ -385,6 +385,21 @@
         return awc.getBuildInfo();
     }
     
+    
+    /**
+     * Closes the preview window associated to a document window.
+     * Performs nothing if documentScene is not a scene associated to a
+     * document window or if preview window is not opened.
+     * 
+     * @param documentScene a scene holding a document window
+     */
+    public static void closePreviewWindow(Scene documentScene) {
+        final DocumentWindowController dwc = lookupWindowController(documentScene);
+        if (dwc != null) {
+            dwc.getPreviewWindowController().closeWindow();
+        }
+    }
+    
     /*
      * Private
      */
--- a/apps/scenebuilder/SceneBuilderApp/src/com/oracle/javafx/scenebuilder/app/ScenicViewStarter.java	Mon Jan 06 11:23:36 2014 +0200
+++ b/apps/scenebuilder/SceneBuilderApp/src/com/oracle/javafx/scenebuilder/app/ScenicViewStarter.java	Tue Jan 07 12:06:59 2014 +0100
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2012, 2013, Oracle and/or its affiliates.
+ * Copyright (c) 2012, 2014, Oracle and/or its affiliates.
  * All rights reserved. Use is subject to license terms.
  *
  * This file is available and licensed under the following license:
--- a/apps/scenebuilder/SceneBuilderApp/src/com/oracle/javafx/scenebuilder/app/i18n/SceneBuilderApp.properties	Mon Jan 06 11:23:36 2014 +0200
+++ b/apps/scenebuilder/SceneBuilderApp/src/com/oracle/javafx/scenebuilder/app/i18n/SceneBuilderApp.properties	Tue Jan 07 12:06:59 2014 +0100
@@ -158,12 +158,15 @@
 menu.title.hide.preview = Hide Preview in Window
 menu.title.choose.background.color = Choose Background Color\u2026
 menu.title.theme = JavaFX Theme
-menu.title.theme.modena = Modena (JavaFX 8)
-menu.title.theme.modena.touch = Modena Touch (JavaFX 8)
-menu.title.theme.caspian = Caspian (JavaFX 2)
-menu.title.theme.caspian.embedded = Caspian Embedded (JavaFX 2)
-menu.title.theme.caspian.embedded.qvga = Caspian Embedded QVGA (JavaFX 2)
-menu.title.theme.caspian.high.contrast = High Contrast, for Caspian only (JavaFX 2)
+menu.title.theme.modena = Modena (FX8)
+menu.title.theme.modena.touch = Modena Touch (FX8)
+menu.title.theme.modena.high.contrast.blackonwhite = Modena High Contrast - Black on White (FX8)
+menu.title.theme.modena.high.contrast.whiteonblack = Modena High Contrast - White on Black (FX8)
+menu.title.theme.modena.high.contrast.yellowonblack = Modena High Contrast - Yellow on Black (FX8)
+menu.title.theme.caspian = Caspian (FX2)
+menu.title.theme.caspian.embedded = Caspian Embedded (FX2)
+menu.title.theme.caspian.embedded.qvga = Caspian Embedded QVGA (FX2)
+menu.title.theme.caspian.high.contrast = Caspian High Contrast (FX2)
 menu.title.scene.stylesheets = Scene Style Sheets
 menu.title.add.stylesheet = Add a Style Sheet\u2026
 menu.title.remove.stylesheet = Remove a Style Sheet
@@ -175,6 +178,13 @@
 menu.title.reveal.resource = Reveal Resource
 menu.title.reveal.resource.with.file = Reveal Resource "{0}"
 menu.title.resolve.unknown.types = Resolve Unknown Types\u2026
+menu.title.size = Scene Size
+menu.title.size.qvga = 320 x 240 (QVGA)
+menu.title.size.vga = 640 x 480 (VGA)
+menu.title.size.touch = 1280 x 800
+menu.title.size.hd = 1920 x 1080
+menu.title.size.preferred = Preferred Size
+menu.title.size.preferred.with.value = Preferred Size ({0} x {1})
 # Window menu items
 menu.title.no.window = No Window
 # Help menu items
--- a/apps/scenebuilder/SceneBuilderApp/src/com/oracle/javafx/scenebuilder/app/menubar/MenuBar.fxml	Mon Jan 06 11:23:36 2014 +0200
+++ b/apps/scenebuilder/SceneBuilderApp/src/com/oracle/javafx/scenebuilder/app/menubar/MenuBar.fxml	Tue Jan 07 12:06:59 2014 +0100
@@ -31,182 +31,195 @@
   (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
   OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 -->
+
 <?import java.lang.*?>
 <?import javafx.scene.control.*?>
 <?import javafx.scene.layout.*?>
 <?scenebuilder-preview-i18n-resource ../i18n/SceneBuilderApp.properties?>
 
-<StackPane xmlns:fx="http://javafx.com/fxml/1" xmlns="http://javafx.com/javafx/2.2">
+<StackPane xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1">
   <children>
     <MenuBar fx:id="menuBar">
       <menus>
-        <Menu mnemonicParsing="false" text="%menu.title.file" fx:id="fileMenu">
+        <Menu fx:id="fileMenu" mnemonicParsing="false" text="%menu.title.file">
           <items>
-            <MenuItem mnemonicParsing="false" text="%menu.title.new" fx:id="newMenuItem" />
-            <Menu mnemonicParsing="false" text="%menu.title.new.template" fx:id="newTemplateMenuItem">
+            <MenuItem fx:id="newMenuItem" mnemonicParsing="false" text="%menu.title.new" />
+            <Menu fx:id="newTemplateMenuItem" mnemonicParsing="false" text="%menu.title.new.template">
               <items>
-                <MenuItem mnemonicParsing="false" text="%menu.title.new.alert.dialog" fx:id="newAlertDialogMenuItem" />
-                <MenuItem mnemonicParsing="false" text="%menu.title.new.basic.app" fx:id="newBasicAppMenuItem" />
-                <MenuItem mnemonicParsing="false" text="%menu.title.new.complex.app" fx:id="newComplexAppMenuItem" />
+                <MenuItem fx:id="newAlertDialogMenuItem" mnemonicParsing="false" text="%menu.title.new.alert.dialog" />
+                <MenuItem fx:id="newBasicAppMenuItem" mnemonicParsing="false" text="%menu.title.new.basic.app" />
+                <MenuItem fx:id="newComplexAppMenuItem" mnemonicParsing="false" text="%menu.title.new.complex.app" />
                 <SeparatorMenuItem mnemonicParsing="false" />
-                <MenuItem mnemonicParsing="false" text="%menu.title.new.alert.dialog.css" fx:id="newAlertDialogCssMenuItem" />
-                <MenuItem mnemonicParsing="false" text="%menu.title.new.alert.dialog.i18n" fx:id="newAlertDialogI18nMenuItem" />
-                <MenuItem mnemonicParsing="false" text="%menu.title.new.basic.app.css" fx:id="newBasicAppCssMenuItem" />
-                <MenuItem mnemonicParsing="false" text="%menu.title.new.basic.app.i18n" fx:id="newBasicAppI18nMenuItem" />
-                <MenuItem mnemonicParsing="false" text="%menu.title.new.complex.app.css" fx:id="newComplexAppCssMenuItem" />
-                <MenuItem mnemonicParsing="false" text="%menu.title.new.complex.app.i18n" fx:id="newComplexAppI18nMenuItem" />
+                <MenuItem fx:id="newAlertDialogCssMenuItem" mnemonicParsing="false" text="%menu.title.new.alert.dialog.css" />
+                <MenuItem fx:id="newAlertDialogI18nMenuItem" mnemonicParsing="false" text="%menu.title.new.alert.dialog.i18n" />
+                <MenuItem fx:id="newBasicAppCssMenuItem" mnemonicParsing="false" text="%menu.title.new.basic.app.css" />
+                <MenuItem fx:id="newBasicAppI18nMenuItem" mnemonicParsing="false" text="%menu.title.new.basic.app.i18n" />
+                <MenuItem fx:id="newComplexAppCssMenuItem" mnemonicParsing="false" text="%menu.title.new.complex.app.css" />
+                <MenuItem fx:id="newComplexAppI18nMenuItem" mnemonicParsing="false" text="%menu.title.new.complex.app.i18n" />
               </items>
             </Menu>
             <SeparatorMenuItem mnemonicParsing="false" />
-            <MenuItem mnemonicParsing="false" text="%menu.title.open" fx:id="openMenuItem" />
-            <Menu mnemonicParsing="false" text="%menu.title.open.recent" fx:id="openRecentMenu">
+            <MenuItem fx:id="openMenuItem" mnemonicParsing="false" text="%menu.title.open" />
+            <Menu fx:id="openRecentMenu" mnemonicParsing="false" text="%menu.title.open.recent">
               <items>
                 <MenuItem mnemonicParsing="false" text="Action 1" />
               </items>
             </Menu>
             <SeparatorMenuItem mnemonicParsing="false" />
-            <MenuItem mnemonicParsing="false" text="%menu.title.save" fx:id="saveMenuItem" />
-            <MenuItem mnemonicParsing="false" text="%menu.title.save.as" fx:id="saveAsMenuItem" />
-            <MenuItem mnemonicParsing="false" text="%menu.title.revert" fx:id="revertMenuItem" />
+            <MenuItem fx:id="saveMenuItem" mnemonicParsing="false" text="%menu.title.save" />
+            <MenuItem fx:id="saveAsMenuItem" mnemonicParsing="false" text="%menu.title.save.as" />
+            <MenuItem fx:id="revertMenuItem" mnemonicParsing="false" text="%menu.title.revert" />
             <SeparatorMenuItem mnemonicParsing="false" />
-            <MenuItem mnemonicParsing="false" text="Reveal (setup at runtime)" fx:id="revealMenuItem" />
+            <MenuItem fx:id="revealMenuItem" mnemonicParsing="false" text="Reveal (setup at runtime)" />
             <SeparatorMenuItem mnemonicParsing="false" />
-            <MenuItem mnemonicParsing="false" text="%menu.title.close" fx:id="closeMenuItem" />
-            <SeparatorMenuItem mnemonicParsing="false" fx:id="separatorAbovePreferencesMenuItem" />
-            <MenuItem mnemonicParsing="false" text="%menu.title.preferences" fx:id="showPreferencesMenuItem" />
-            <MenuItem mnemonicParsing="false" text="%menu.title.quit" fx:id="exitMenuItem" />
+            <MenuItem fx:id="closeMenuItem" mnemonicParsing="false" text="%menu.title.close" />
+            <SeparatorMenuItem fx:id="separatorAbovePreferencesMenuItem" mnemonicParsing="false" />
+            <MenuItem fx:id="showPreferencesMenuItem" mnemonicParsing="false" text="%menu.title.preferences" />
+            <MenuItem fx:id="exitMenuItem" mnemonicParsing="false" text="%menu.title.quit" />
           </items>
         </Menu>
         <Menu mnemonicParsing="false" text="%menu.title.edit">
           <items>
-            <MenuItem mnemonicParsing="false" text="%menu.title.undo" fx:id="undoMenuItem" />
-            <MenuItem mnemonicParsing="false" text="%menu.title.redo" fx:id="redoMenuItem" />
+            <MenuItem fx:id="undoMenuItem" mnemonicParsing="false" text="%menu.title.undo" />
+            <MenuItem fx:id="redoMenuItem" mnemonicParsing="false" text="%menu.title.redo" />
             <SeparatorMenuItem mnemonicParsing="false" />
-            <MenuItem mnemonicParsing="false" text="%menu.title.cut" fx:id="cutMenuItem" />
-            <MenuItem mnemonicParsing="false" text="%menu.title.copy" fx:id="copyMenuItem" />
-            <MenuItem mnemonicParsing="false" text="%menu.title.paste" fx:id="pasteMenuItem" />
-            <MenuItem mnemonicParsing="false" text="%menu.title.paste.into" fx:id="pasteIntoMenuItem" />
-            <MenuItem mnemonicParsing="false" text="%menu.title.duplicate" fx:id="duplicateMenuItem" />
-            <MenuItem mnemonicParsing="false" text="%menu.title.delete" fx:id="deleteMenuItem" />
+            <MenuItem fx:id="cutMenuItem" mnemonicParsing="false" text="%menu.title.cut" />
+            <MenuItem fx:id="copyMenuItem" mnemonicParsing="false" text="%menu.title.copy" />
+            <MenuItem fx:id="pasteMenuItem" mnemonicParsing="false" text="%menu.title.paste" />
+            <MenuItem fx:id="pasteIntoMenuItem" mnemonicParsing="false" text="%menu.title.paste.into" />
+            <MenuItem fx:id="duplicateMenuItem" mnemonicParsing="false" text="%menu.title.duplicate" />
+            <MenuItem fx:id="deleteMenuItem" mnemonicParsing="false" text="%menu.title.delete" />
             <SeparatorMenuItem mnemonicParsing="false" />
-            <MenuItem mnemonicParsing="false" text="%menu.title.select.all" fx:id="selectAllMenuItem" />
-            <MenuItem mnemonicParsing="false" text="%menu.title.select.none" fx:id="selectNoneMenuItem" />
-            <MenuItem mnemonicParsing="false" text="%menu.title.select.parent" fx:id="selectParentMenuItem" />
-            <MenuItem mnemonicParsing="false" text="%menu.title.select.next" fx:id="selectNextMenuItem" />
-            <MenuItem mnemonicParsing="false" text="%menu.title.select.previous" fx:id="selectPreviousMenuItem" />
+            <MenuItem fx:id="selectAllMenuItem" mnemonicParsing="false" text="%menu.title.select.all" />
+            <MenuItem fx:id="selectNoneMenuItem" mnemonicParsing="false" text="%menu.title.select.none" />
+            <MenuItem fx:id="selectParentMenuItem" mnemonicParsing="false" text="%menu.title.select.parent" />
+            <MenuItem fx:id="selectNextMenuItem" mnemonicParsing="false" text="%menu.title.select.next" />
+            <MenuItem fx:id="selectPreviousMenuItem" mnemonicParsing="false" text="%menu.title.select.previous" />
             <SeparatorMenuItem mnemonicParsing="false" />
-            <MenuItem mnemonicParsing="false" text="%menu.title.trim" fx:id="trimMenuItem" />
+            <MenuItem fx:id="trimMenuItem" mnemonicParsing="false" text="%menu.title.trim" />
           </items>
         </Menu>
         <Menu mnemonicParsing="false" text="%menu.title.view">
           <items>
-            <MenuItem mnemonicParsing="false" text="%menu.title.content" fx:id="gotoContentMenuItem" />
-            <MenuItem mnemonicParsing="false" text="%menu.title.properties" fx:id="gotoPropertiesMenuItem" />
-            <MenuItem mnemonicParsing="false" text="%menu.title.layout" fx:id="gotoLayoutMenuItem" />
-            <MenuItem mnemonicParsing="false" text="%menu.title.code" fx:id="gotoCodeMenuItem" />
+            <MenuItem fx:id="gotoContentMenuItem" mnemonicParsing="false" text="%menu.title.content" />
+            <MenuItem fx:id="gotoPropertiesMenuItem" mnemonicParsing="false" text="%menu.title.properties" />
+            <MenuItem fx:id="gotoLayoutMenuItem" mnemonicParsing="false" text="%menu.title.layout" />
+            <MenuItem fx:id="gotoCodeMenuItem" mnemonicParsing="false" text="%menu.title.code" />
             <SeparatorMenuItem mnemonicParsing="false" />
-            <MenuItem mnemonicParsing="false" text="%menu.title.hide.library.panel" fx:id="toggleLibraryPanelMenuItem" />
-            <MenuItem mnemonicParsing="false" text="%menu.title.hide.document.panel" fx:id="toggleHierarchyPanelMenuItem" />
+            <MenuItem fx:id="toggleLibraryPanelMenuItem" mnemonicParsing="false" text="%menu.title.hide.library.panel" />
+            <MenuItem fx:id="toggleHierarchyPanelMenuItem" mnemonicParsing="false" text="%menu.title.hide.document.panel" />
             <SeparatorMenuItem mnemonicParsing="false" />
-            <MenuItem mnemonicParsing="false" text="%menu.title.show.bottom.panel" fx:id="toggleCSSPanelMenuItem" />
+            <MenuItem fx:id="toggleCSSPanelMenuItem" mnemonicParsing="false" text="%menu.title.show.bottom.panel" />
             <SeparatorMenuItem mnemonicParsing="false" />
-            <MenuItem mnemonicParsing="false" text="%menu.title.hide.left.panel" fx:id="toggleLeftPanelMenuItem" />
-            <MenuItem mnemonicParsing="false" text="%menu.title.hide.right.panel" fx:id="toggleRightPanelMenuItem" />
+            <MenuItem fx:id="toggleLeftPanelMenuItem" mnemonicParsing="false" text="%menu.title.hide.left.panel" />
+            <MenuItem fx:id="toggleRightPanelMenuItem" mnemonicParsing="false" text="%menu.title.hide.right.panel" />
             <SeparatorMenuItem mnemonicParsing="false" />
-            <MenuItem mnemonicParsing="false" text="%menu.title.show.outlines" fx:id="toggleOutlinesMenuItem" />
-            <MenuItem mnemonicParsing="false" text="%menu.title.show.sample.data" fx:id="toggleSampleDataMenuItem" />
-            <MenuItem mnemonicParsing="false" text="%menu.title.disable.guides" fx:id="toggleAlignmentGuidesMenuItem" />
+            <MenuItem fx:id="toggleOutlinesMenuItem" mnemonicParsing="false" text="%menu.title.show.outlines" />
+            <MenuItem fx:id="toggleSampleDataMenuItem" mnemonicParsing="false" text="%menu.title.show.sample.data" />
+            <MenuItem fx:id="toggleAlignmentGuidesMenuItem" mnemonicParsing="false" text="%menu.title.disable.guides" />
             <SeparatorMenuItem mnemonicParsing="false" />
-            <Menu mnemonicParsing="false" text="%menu.title.zoom" fx:id="zoomMenu" />
+            <Menu fx:id="zoomMenu" mnemonicParsing="false" text="%menu.title.zoom" />
             <SeparatorMenuItem mnemonicParsing="false" />
-            <MenuItem mnemonicParsing="false" text="%menu.title.show.sample.controller.skeleton" fx:id="showSampleControllerMenuItem" />
+            <MenuItem fx:id="showSampleControllerMenuItem" mnemonicParsing="false" text="%menu.title.show.sample.controller.skeleton" />
           </items>
         </Menu>
-        <Menu mnemonicParsing="false" text="%menu.title.insert" fx:id="insertMenu" />
+        <Menu fx:id="insertMenu" mnemonicParsing="false" text="%menu.title.insert" />
         <Menu mnemonicParsing="false" text="%menu.title.modify">
           <items>
-            <MenuItem mnemonicParsing="false" text="%menu.title.fit" fx:id="fitToParentMenuItem" />
-            <MenuItem mnemonicParsing="false" text="%menu.title.use.computed.sizes" fx:id="useComputedSizesMenuItem" />
+            <MenuItem fx:id="fitToParentMenuItem" mnemonicParsing="false" text="%menu.title.fit" />
+            <MenuItem fx:id="useComputedSizesMenuItem" mnemonicParsing="false" text="%menu.title.use.computed.sizes" />
             <SeparatorMenuItem mnemonicParsing="false" />
             <Menu mnemonicParsing="false" text="%menu.title.grid">
               <items>
-                <MenuItem mnemonicParsing="false" text="%menu.title.grid.move.row.above" fx:id="moveRowAboveMenuItem" />
-                <MenuItem mnemonicParsing="false" text="%menu.title.grid.move.row.below" fx:id="moveRowBelowMenuItem" />
-                <MenuItem mnemonicParsing="false" text="%menu.title.grid.move.column.before" fx:id="moveColumnBeforeMenuItem" />
-                <MenuItem mnemonicParsing="false" text="%menu.title.grid.move.column.after" fx:id="moveColumnAfterMenuItem" />
+                <MenuItem fx:id="moveRowAboveMenuItem" mnemonicParsing="false" text="%menu.title.grid.move.row.above" />
+                <MenuItem fx:id="moveRowBelowMenuItem" mnemonicParsing="false" text="%menu.title.grid.move.row.below" />
+                <MenuItem fx:id="moveColumnBeforeMenuItem" mnemonicParsing="false" text="%menu.title.grid.move.column.before" />
+                <MenuItem fx:id="moveColumnAfterMenuItem" mnemonicParsing="false" text="%menu.title.grid.move.column.after" />
                 <SeparatorMenuItem mnemonicParsing="false" />
-                <MenuItem mnemonicParsing="false" text="%menu.title.grid.add.row.above" fx:id="addRowAboveMenuItem" />
-                <MenuItem mnemonicParsing="false" text="%menu.title.grid.add.row.below" fx:id="addRowBelowMenuItem" />
-                <MenuItem mnemonicParsing="false" text="%menu.title.grid.add.column.before" fx:id="addColumnBeforeMenuItem" />
-                <MenuItem mnemonicParsing="false" text="%menu.title.grid.add.column.after" fx:id="addColumnAfterMenuItem" />
+                <MenuItem fx:id="addRowAboveMenuItem" mnemonicParsing="false" text="%menu.title.grid.add.row.above" />
+                <MenuItem fx:id="addRowBelowMenuItem" mnemonicParsing="false" text="%menu.title.grid.add.row.below" />
+                <MenuItem fx:id="addColumnBeforeMenuItem" mnemonicParsing="false" text="%menu.title.grid.add.column.before" />
+                <MenuItem fx:id="addColumnAfterMenuItem" mnemonicParsing="false" text="%menu.title.grid.add.column.after" />
                 <SeparatorMenuItem mnemonicParsing="false" />
-                <MenuItem mnemonicParsing="false" text="%menu.title.grid.increase.row.span" fx:id="increaseRowSpanMenuItem" />
-                <MenuItem mnemonicParsing="false" text="%menu.title.grid.decrease.row.span" fx:id="decreaseRowSpanMenuItem" />
-                <MenuItem mnemonicParsing="false" text="%menu.title.grid.increase.column.span" fx:id="increaseColumnSpanMenuItem" />
-                <MenuItem mnemonicParsing="false" text="%menu.title.grid.decrease.column.span" fx:id="decreaseColumnSpanMenuItem" />
+                <MenuItem fx:id="increaseRowSpanMenuItem" mnemonicParsing="false" text="%menu.title.grid.increase.row.span" />
+                <MenuItem fx:id="decreaseRowSpanMenuItem" mnemonicParsing="false" text="%menu.title.grid.decrease.row.span" />
+                <MenuItem fx:id="increaseColumnSpanMenuItem" mnemonicParsing="false" text="%menu.title.grid.increase.column.span" />
+                <MenuItem fx:id="decreaseColumnSpanMenuItem" mnemonicParsing="false" text="%menu.title.grid.decrease.column.span" />
               </items>
             </Menu>
             <SeparatorMenuItem mnemonicParsing="false" />
-            <Menu mnemonicParsing="false" text="%menu.title.add.effect" fx:id="addEffectMenu" />
-            <Menu mnemonicParsing="false" text="%menu.title.add.popup" fx:id="addPopupControlMenu" />
+            <Menu fx:id="addEffectMenu" mnemonicParsing="false" text="%menu.title.add.effect" />
+            <Menu fx:id="addPopupControlMenu" mnemonicParsing="false" text="%menu.title.add.popup" />
             <SeparatorMenuItem mnemonicParsing="false" />
-            <MenuItem mnemonicParsing="false" text="%menu.title.edit.included.default" fx:id="editIncludedFileMenuItem" />
-            <MenuItem mnemonicParsing="false" text="%menu.title.reveal.included.default" fx:id="revealIncludedFileMenuItem" />
+            <MenuItem fx:id="editIncludedFileMenuItem" mnemonicParsing="false" text="%menu.title.edit.included.default" />
+            <MenuItem fx:id="revealIncludedFileMenuItem" mnemonicParsing="false" text="%menu.title.reveal.included.default" />
+            <SeparatorMenuItem mnemonicParsing="false" />
+            <Menu mnemonicParsing="false" text="%menu.title.size">
+              <items>
+                  <RadioMenuItem fx:id="qvgaSetSizeMenuItem" mnemonicParsing="false" text="%menu.title.size.qvga" />
+                  <RadioMenuItem fx:id="vgaSetSizeMenuItem" mnemonicParsing="false" text="%menu.title.size.vga" />
+                  <RadioMenuItem fx:id="touchSetSizeMenuItem" mnemonicParsing="false" text="%menu.title.size.touch" />
+                  <RadioMenuItem fx:id="hdSetSizeMenuItem" mnemonicParsing="false" text="%menu.title.size.hd" />
+              </items></Menu>
           </items>
         </Menu>
         <Menu mnemonicParsing="false" text="%menu.title.arrange">
           <items>
-            <MenuItem mnemonicParsing="false" text="%menu.title.front" fx:id="bringToFrontMenuItem" />
-            <MenuItem mnemonicParsing="false" text="%menu.title.back" fx:id="sendToBackMenuItem" />
-            <MenuItem mnemonicParsing="false" text="%menu.title.forward" fx:id="bringForwardMenuItem" />
-            <MenuItem mnemonicParsing="false" text="%menu.title.backward" fx:id="sendBackwardMenuItem" />
+            <MenuItem fx:id="bringToFrontMenuItem" mnemonicParsing="false" text="%menu.title.front" />
+            <MenuItem fx:id="sendToBackMenuItem" mnemonicParsing="false" text="%menu.title.back" />
+            <MenuItem fx:id="bringForwardMenuItem" mnemonicParsing="false" text="%menu.title.forward" />
+            <MenuItem fx:id="sendBackwardMenuItem" mnemonicParsing="false" text="%menu.title.backward" />
             <SeparatorMenuItem mnemonicParsing="false" />
             <Menu mnemonicParsing="false" text="%menu.title.wrap">
               <items>
-                <MenuItem mnemonicParsing="false" text="AnchorPane" fx:id="wrapInAnchorPaneMenuItem" />
-                <MenuItem mnemonicParsing="false" text="GridPane" fx:id="wrapInGridPaneMenuItem" />
-                <MenuItem mnemonicParsing="false" text="HBox" fx:id="wrapInHBoxMenuItem" />
-                <MenuItem mnemonicParsing="false" text="Pane" fx:id="wrapInPaneMenuItem" />
-                <MenuItem mnemonicParsing="false" text="ScrollPane" fx:id="wrapInScrollPaneMenuItem" />
-                <MenuItem mnemonicParsing="false" text="SplitPane" fx:id="wrapInSplitPaneMenuItem" />
-                <MenuItem mnemonicParsing="false" text="StackPane" fx:id="wrapInStackPaneMenuItem" />
-                <MenuItem mnemonicParsing="false" text="TabPane" fx:id="wrapInTabPaneMenuItem" />
-                <MenuItem mnemonicParsing="false" text="TitledPane" fx:id="wrapInTitledPaneMenuItem" />
-                <MenuItem mnemonicParsing="false" text="ToolBar" fx:id="wrapInToolBarMenuItem" />
-                <MenuItem mnemonicParsing="false" text="VBox" fx:id="wrapInVBoxMenuItem" />
-                <MenuItem mnemonicParsing="false" text="Group" fx:id="wrapInGroupMenuItem" />
+                <MenuItem fx:id="wrapInAnchorPaneMenuItem" mnemonicParsing="false" text="AnchorPane" />
+                <MenuItem fx:id="wrapInGridPaneMenuItem" mnemonicParsing="false" text="GridPane" />
+                <MenuItem fx:id="wrapInHBoxMenuItem" mnemonicParsing="false" text="HBox" />
+                <MenuItem fx:id="wrapInPaneMenuItem" mnemonicParsing="false" text="Pane" />
+                <MenuItem fx:id="wrapInScrollPaneMenuItem" mnemonicParsing="false" text="ScrollPane" />
+                <MenuItem fx:id="wrapInSplitPaneMenuItem" mnemonicParsing="false" text="SplitPane" />
+                <MenuItem fx:id="wrapInStackPaneMenuItem" mnemonicParsing="false" text="StackPane" />
+                <MenuItem fx:id="wrapInTabPaneMenuItem" mnemonicParsing="false" text="TabPane" />
+                <MenuItem fx:id="wrapInTitledPaneMenuItem" mnemonicParsing="false" text="TitledPane" />
+                <MenuItem fx:id="wrapInToolBarMenuItem" mnemonicParsing="false" text="ToolBar" />
+                <MenuItem fx:id="wrapInVBoxMenuItem" mnemonicParsing="false" text="VBox" />
+                <MenuItem fx:id="wrapInGroupMenuItem" mnemonicParsing="false" text="Group" />
               </items>
             </Menu>
-            <MenuItem mnemonicParsing="false" text="%menu.title.unwrap" fx:id="unwrapMenuItem" />
+            <MenuItem fx:id="unwrapMenuItem" mnemonicParsing="false" text="%menu.title.unwrap" />
           </items>
         </Menu>
         <Menu mnemonicParsing="false" text="%menu.title.preview">
           <items>
-            <MenuItem mnemonicParsing="false" text="%menu.title.show.preview" fx:id="showPreviewMenuItem" />
+            <MenuItem fx:id="showPreviewMenuItem" mnemonicParsing="false" text="%menu.title.show.preview" />
             <SeparatorMenuItem mnemonicParsing="false" />
-            <MenuItem mnemonicParsing="false" text="%menu.title.choose.background.color" fx:id="chooseBackgroundColorMenuItem" />
+            <MenuItem fx:id="chooseBackgroundColorMenuItem" mnemonicParsing="false" text="%menu.title.choose.background.color" />
             <SeparatorMenuItem mnemonicParsing="false" />
             <Menu mnemonicParsing="false" text="%menu.title.theme">
               <items>
-                <RadioMenuItem mnemonicParsing="false" text="%menu.title.theme.modena" fx:id="modenaThemeMenuItem" />
-                <RadioMenuItem mnemonicParsing="false" text="%menu.title.theme.modena.touch" fx:id="modenaTouchThemeMenuItem" />
+                <RadioMenuItem fx:id="modenaThemeMenuItem" mnemonicParsing="false" text="%menu.title.theme.modena" />
+                <RadioMenuItem fx:id="modenaTouchThemeMenuItem" mnemonicParsing="false" text="%menu.title.theme.modena.touch" />
                 <SeparatorMenuItem mnemonicParsing="false" />
-                <RadioMenuItem mnemonicParsing="false" text="%menu.title.theme.caspian" fx:id="caspianThemeMenuItem" />
-                <RadioMenuItem mnemonicParsing="false" text="%menu.title.theme.caspian.embedded" fx:id="caspianEmbeddedThemeMenuItem" />
-                <RadioMenuItem mnemonicParsing="false" text="%menu.title.theme.caspian.embedded.qvga" fx:id="caspianEmbeddedQVGAThemeMenuItem" />
+                <RadioMenuItem fx:id="modenaHighContrastBlackonwhiteThemeMenuItem" mnemonicParsing="false" text="%menu.title.theme.modena.high.contrast.blackonwhite" />
+                <RadioMenuItem fx:id="modenaHighContrastWhiteonblackThemeMenuItem" mnemonicParsing="false" text="%menu.title.theme.modena.high.contrast.whiteonblack" />
+                <RadioMenuItem fx:id="modenaHighContrastYellowonblackThemeMenuItem" mnemonicParsing="false" text="%menu.title.theme.modena.high.contrast.yellowonblack" />
                 <SeparatorMenuItem mnemonicParsing="false" />
-                <CheckMenuItem mnemonicParsing="false" text="%menu.title.theme.caspian.high.contrast" fx:id="caspianHighContrastThemeMenuItem"/>
+                <RadioMenuItem fx:id="caspianThemeMenuItem" mnemonicParsing="false" text="%menu.title.theme.caspian" />
+                <RadioMenuItem fx:id="caspianEmbeddedThemeMenuItem" mnemonicParsing="false" text="%menu.title.theme.caspian.embedded" />
+                <RadioMenuItem fx:id="caspianEmbeddedQVGAThemeMenuItem" mnemonicParsing="false" text="%menu.title.theme.caspian.embedded.qvga" />
+                <SeparatorMenuItem mnemonicParsing="false" />
+                <CheckMenuItem fx:id="caspianHighContrastThemeMenuItem" mnemonicParsing="false" text="%menu.title.theme.caspian.high.contrast" />
               </items>
             </Menu>
             <Menu mnemonicParsing="false" text="%menu.title.scene.stylesheets">
               <items>
-                <MenuItem mnemonicParsing="false" text="%menu.title.add.stylesheet" fx:id="addSceneStyleSheetMenuItem" />
-                <Menu mnemonicParsing="false" text="%menu.title.remove.stylesheet" fx:id="removeSceneStyleSheetMenu">
+                <MenuItem fx:id="addSceneStyleSheetMenuItem" mnemonicParsing="false" text="%menu.title.add.stylesheet" />
+                <Menu fx:id="removeSceneStyleSheetMenu" mnemonicParsing="false" text="%menu.title.remove.stylesheet">
                   <items>
                     <MenuItem disable="true" mnemonicParsing="false" text="%scenestylesheet.none" />
                   </items>
                 </Menu>
-                <Menu mnemonicParsing="false" text="%menu.title.open.stylesheet" fx:id="openSceneStyleSheetMenu">
+                <Menu fx:id="openSceneStyleSheetMenu" mnemonicParsing="false" text="%menu.title.open.stylesheet">
                   <items>
                     <MenuItem disable="true" mnemonicParsing="false" text="%scenestylesheet.none" />
                   </items>
@@ -215,22 +228,31 @@
             </Menu>
             <Menu mnemonicParsing="false" text="%menu.title.internationalization">
               <items>
-                <MenuItem mnemonicParsing="false" text="%menu.title.set.resource" fx:id="setResourceMenuItem" />
-                <MenuItem mnemonicParsing="false" text="%menu.title.remove.resource" fx:id="removeResourceMenuItem" />
-                <MenuItem mnemonicParsing="false" text="%menu.title.reveal.resource" fx:id="revealResourceMenuItem" />
+                <MenuItem fx:id="setResourceMenuItem" mnemonicParsing="false" text="%menu.title.set.resource" />
+                <MenuItem fx:id="removeResourceMenuItem" mnemonicParsing="false" text="%menu.title.remove.resource" />
+                <MenuItem fx:id="revealResourceMenuItem" mnemonicParsing="false" text="%menu.title.reveal.resource" />
+              </items>
+            </Menu>
+            <Menu mnemonicParsing="false" text="%menu.title.size">
+              <items>
+                  <RadioMenuItem fx:id="qvgaPreviewSizeMenuItem" mnemonicParsing="false" text="%menu.title.size.qvga" />
+                  <RadioMenuItem fx:id="vgaPreviewSizeMenuItem" mnemonicParsing="false" text="%menu.title.size.vga" />
+                  <RadioMenuItem fx:id="touchPreviewSizeMenuItem" mnemonicParsing="false" text="%menu.title.size.touch" />
+                  <RadioMenuItem fx:id="hdPreviewSizeMenuItem" mnemonicParsing="false" text="%menu.title.size.hd" />
+                  <RadioMenuItem fx:id="preferredPreviewSizeMenuItem" mnemonicParsing="false" text="%menu.title.size.preferred" />
               </items>
             </Menu>
           </items>
         </Menu>
-        <Menu mnemonicParsing="false" text="%menu.title.window" fx:id="windowMenu">
+        <Menu fx:id="windowMenu" mnemonicParsing="false" text="%menu.title.window">
           <items>
             <SeparatorMenuItem mnemonicParsing="false" />
           </items>
         </Menu>
         <Menu mnemonicParsing="false" text="%menu.title.help">
           <items>
-            <MenuItem mnemonicParsing="false" text="%menu.title.scene.builder.help" fx:id="helpMenuItem" />
-            <MenuItem mnemonicParsing="false" text="%menu.title.about" fx:id="aboutMenuItem" />
+            <MenuItem fx:id="helpMenuItem" mnemonicParsing="false" text="%menu.title.scene.builder.help" />
+            <MenuItem fx:id="aboutMenuItem" mnemonicParsing="false" text="%menu.title.about" />
           </items>
         </Menu>
       </menus>
--- a/apps/scenebuilder/SceneBuilderApp/src/com/oracle/javafx/scenebuilder/app/menubar/MenuBarController.java	Mon Jan 06 11:23:36 2014 +0200
+++ b/apps/scenebuilder/SceneBuilderApp/src/com/oracle/javafx/scenebuilder/app/menubar/MenuBarController.java	Tue Jan 07 12:06:59 2014 +0100
@@ -42,6 +42,7 @@
 import com.oracle.javafx.scenebuilder.kit.editor.EditorController;
 import com.oracle.javafx.scenebuilder.kit.editor.EditorController.ControlAction;
 import com.oracle.javafx.scenebuilder.kit.editor.EditorController.EditAction;
+import com.oracle.javafx.scenebuilder.kit.editor.EditorController.Size;
 import com.oracle.javafx.scenebuilder.kit.editor.EditorPlatform;
 import com.oracle.javafx.scenebuilder.kit.editor.panel.content.ContentPanelController;
 import com.oracle.javafx.scenebuilder.kit.library.BuiltinSectionComparator;
@@ -237,6 +238,14 @@
     private MenuItem editIncludedFileMenuItem;
     @FXML
     private MenuItem revealIncludedFileMenuItem;
+    @FXML
+    private RadioMenuItem qvgaSetSizeMenuItem;
+    @FXML
+    private RadioMenuItem vgaSetSizeMenuItem;
+    @FXML
+    private RadioMenuItem touchSetSizeMenuItem;
+    @FXML
+    private RadioMenuItem hdSetSizeMenuItem;
 
     // Arrange
     @FXML
@@ -282,6 +291,12 @@
     @FXML
     private RadioMenuItem modenaTouchThemeMenuItem;
     @FXML
+    private RadioMenuItem modenaHighContrastBlackonwhiteThemeMenuItem;
+    @FXML
+    private RadioMenuItem modenaHighContrastWhiteonblackThemeMenuItem;
+    @FXML
+    private RadioMenuItem modenaHighContrastYellowonblackThemeMenuItem;
+    @FXML
     private RadioMenuItem caspianThemeMenuItem;
     @FXML
     private CheckMenuItem caspianHighContrastThemeMenuItem;
@@ -303,6 +318,16 @@
     private MenuItem removeResourceMenuItem;
     @FXML
     private MenuItem revealResourceMenuItem;
+    @FXML
+    private RadioMenuItem qvgaPreviewSizeMenuItem;
+    @FXML
+    private RadioMenuItem vgaPreviewSizeMenuItem;
+    @FXML
+    private RadioMenuItem touchPreviewSizeMenuItem;
+    @FXML
+    private RadioMenuItem hdPreviewSizeMenuItem;
+    @FXML
+    private RadioMenuItem preferredPreviewSizeMenuItem;
 
     // Window
     // Help
@@ -444,6 +469,10 @@
         assert decreaseColumnSpanMenuItem != null;
         assert editIncludedFileMenuItem != null;
         assert revealIncludedFileMenuItem != null;
+        assert qvgaSetSizeMenuItem != null;
+        assert vgaSetSizeMenuItem != null;
+        assert touchSetSizeMenuItem != null;
+        assert hdSetSizeMenuItem != null;
 
         assert bringToFrontMenuItem != null;
         assert sendToBackMenuItem != null;
@@ -466,6 +495,9 @@
         assert showPreviewMenuItem != null;
         assert modenaThemeMenuItem != null;
         assert modenaTouchThemeMenuItem != null;
+        assert modenaHighContrastBlackonwhiteThemeMenuItem != null;
+        assert modenaHighContrastWhiteonblackThemeMenuItem != null;
+        assert modenaHighContrastYellowonblackThemeMenuItem != null;
         assert caspianThemeMenuItem != null;
         assert caspianHighContrastThemeMenuItem != null;
         assert caspianEmbeddedThemeMenuItem != null;
@@ -477,6 +509,11 @@
         assert setResourceMenuItem != null;
         assert removeResourceMenuItem != null;
         assert revealResourceMenuItem != null;
+        assert qvgaPreviewSizeMenuItem != null;
+        assert vgaPreviewSizeMenuItem != null;
+        assert touchPreviewSizeMenuItem != null;
+        assert hdPreviewSizeMenuItem != null;
+        assert preferredPreviewSizeMenuItem != null;
 
         assert helpMenuItem != null;
         assert aboutMenuItem != null;
@@ -755,6 +792,34 @@
         increaseColumnSpanMenuItem.setUserData(new EditActionController(EditAction.INCREASE_COLUMN_SPAN));
         decreaseColumnSpanMenuItem.setUserData(new EditActionController(EditAction.DECREASE_COLUMN_SPAN));
         editIncludedFileMenuItem.setUserData(new DocumentControlActionController(DocumentControlAction.EDIT_INCLUDED_FILE));
+        qvgaSetSizeMenuItem.setUserData(new EditActionController(EditAction.SET_SIZE_320x240) {
+            @Override
+            public void perform() {
+                super.perform();
+                updatePreviewWindowSize(Size.SIZE_320x240);
+            }
+        });
+        vgaSetSizeMenuItem.setUserData(new EditActionController(EditAction.SET_SIZE_640x480) {
+            @Override
+            public void perform() {
+                super.perform();
+                updatePreviewWindowSize(Size.SIZE_640x480);
+            }
+        });
+        touchSetSizeMenuItem.setUserData(new EditActionController(EditAction.SET_SIZE_1280x800) {
+            @Override
+            public void perform() {
+                super.perform();
+                updatePreviewWindowSize(Size.SIZE_1280x800);
+            }
+        });
+        hdSetSizeMenuItem.setUserData(new EditActionController(EditAction.SET_SIZE_1920x1080) {
+            @Override
+            public void perform() {
+                super.perform();
+                updatePreviewWindowSize(Size.SIZE_1920x1080);
+            }
+        });
 
         // Add Effect submenu
         updateAddEffectMenu();
@@ -816,6 +881,9 @@
         caspianEmbeddedQVGAThemeMenuItem.setUserData(new SetThemeActionController(EditorPlatform.Theme.CASPIAN_EMBEDDED_QVGA));
         modenaThemeMenuItem.setUserData(new SetThemeActionController(EditorPlatform.Theme.MODENA));
         modenaTouchThemeMenuItem.setUserData(new SetThemeActionController(EditorPlatform.Theme.MODENA_TOUCH));
+        modenaHighContrastBlackonwhiteThemeMenuItem.setUserData(new SetThemeActionController(EditorPlatform.Theme.MODENA_HIGH_CONTRAST_BLACK_ON_WHITE));
+        modenaHighContrastWhiteonblackThemeMenuItem.setUserData(new SetThemeActionController(EditorPlatform.Theme.MODENA_HIGH_CONTRAST_WHITE_ON_BLACK));
+        modenaHighContrastYellowonblackThemeMenuItem.setUserData(new SetThemeActionController(EditorPlatform.Theme.MODENA_HIGH_CONTRAST_YELLOW_ON_BLACK));
 
         addSceneStyleSheetMenuItem.setUserData(new DocumentControlActionController(DocumentControlAction.ADD_SCENE_STYLE_SHEET));
         updateOpenAndRemoveSceneStyleSheetMenus();
@@ -861,6 +929,11 @@
                 return title;
             }
         });
+        qvgaPreviewSizeMenuItem.setUserData(new SetSizeActionController(EditorController.Size.SIZE_320x240));
+        vgaPreviewSizeMenuItem.setUserData(new SetSizeActionController(EditorController.Size.SIZE_640x480));
+        touchPreviewSizeMenuItem.setUserData(new SetSizeActionController(EditorController.Size.SIZE_1280x800));
+        hdPreviewSizeMenuItem.setUserData(new SetSizeActionController(EditorController.Size.SIZE_1920x1080));
+        preferredPreviewSizeMenuItem.setUserData(new SetSizeActionController(EditorController.Size.SIZE_PREFERRED));
 
         /*
          * Window menu : it is setup after the other menus
@@ -1488,6 +1561,81 @@
         }
 
     }
+    
+    private void updatePreviewWindowSize(Size size) {
+        if (documentWindowController != null
+                && documentWindowController.getPreviewWindowController() != null
+                && documentWindowController.getPreviewWindowController().getStage().isShowing()) {
+            documentWindowController.getPreviewWindowController().setSize(size);
+        }
+    }
+
+    class SetSizeActionController extends MenuItemController {
+
+        private final EditorController.Size size;
+
+        public SetSizeActionController(EditorController.Size size) {
+            this.size = size;
+        }
+
+        @Override
+        public boolean canPerform() {
+            boolean res = (documentWindowController != null)
+                    && (documentWindowController.getPreviewWindowController() != null)
+                    && documentWindowController.getPreviewWindowController().getStage().isShowing()
+                    && ! documentWindowController.getEditorController().is3D()
+                    && documentWindowController.getEditorController().isNode()
+                    && documentWindowController.getPreviewWindowController().sizeDoesFit(size);
+            return res;
+        }
+
+        @Override
+        public void perform() {
+            assert documentWindowController != null;
+            assert documentWindowController.getPreviewWindowController() != null;
+            documentWindowController.getPreviewWindowController().setSize(size);
+        }
+
+        @Override
+        public boolean isSelected() {
+            boolean res;
+
+            if (documentWindowController == null || documentWindowController.getPreviewWindowController() == null) {
+                res = false;
+            } else {
+                Size currentSize = documentWindowController.getPreviewWindowController().getSize();
+                res = (size == currentSize)
+                        && documentWindowController.getPreviewWindowController().getStage().isShowing()
+                        && ! documentWindowController.getPreviewWindowController().userResizedPreviewWindow()
+                        && ! documentWindowController.getEditorController().is3D()
+                        && documentWindowController.getEditorController().isNode();
+            }
+            
+            return res;
+        }
+        
+        @Override
+        public String getTitle() {
+            assert documentWindowController != null;
+            
+            if (size == EditorController.Size.SIZE_PREFERRED) {
+                String title = I18N.getString("menu.title.size.preferred");
+                
+                if (documentWindowController.getPreviewWindowController() != null
+                        && documentWindowController.getPreviewWindowController().getStage().isShowing()
+                        && ! documentWindowController.getEditorController().is3D()
+                        && documentWindowController.getEditorController().isNode()) {
+                        title = I18N.getString("menu.title.size.preferred.with.value",
+                                documentWindowController.getPreviewWindowController().getRoot().prefWidth(-1),
+                                documentWindowController.getPreviewWindowController().getRoot().prefHeight(-1));
+                }
+                
+                return title;
+            } else {
+                return null;
+            }
+        }
+    }
 
     class SetThemeActionController extends MenuItemController {
 
@@ -1504,18 +1652,34 @@
                     = documentWindowController.getEditorController().getTheme();
             // CASPIAN_HIGH_CONTRAST can be selected only if another CASPIAN
             // theme is active.
+            // MODENA_HIGH_CONTRAST_<*> can be selected only if another MODENA
+            // theme is active.
             if (theme == EditorPlatform.Theme.CASPIAN_HIGH_CONTRAST
-                    && (currentTheme == EditorPlatform.Theme.MODENA || currentTheme == EditorPlatform.Theme.MODENA_TOUCH)) {
+                    && EditorPlatform.isModena(currentTheme)) {
                 res = false;
                 caspianHighContrastThemeMenuItem.setSelected(false);
+            } else if (theme == EditorPlatform.Theme.MODENA_HIGH_CONTRAST_BLACK_ON_WHITE
+                    && EditorPlatform.isCaspian(currentTheme)) {
+                res = false;
+                modenaHighContrastBlackonwhiteThemeMenuItem.setSelected(false);
+            } else if (theme == EditorPlatform.Theme.MODENA_HIGH_CONTRAST_WHITE_ON_BLACK
+                    && EditorPlatform.isCaspian(currentTheme)) {
+                res = false;
+                modenaHighContrastWhiteonblackThemeMenuItem.setSelected(false);
+            } else if (theme == EditorPlatform.Theme.MODENA_HIGH_CONTRAST_YELLOW_ON_BLACK
+                    && EditorPlatform.isCaspian(currentTheme)) {
+                res = false;
+                modenaHighContrastYellowonblackThemeMenuItem.setSelected(false);
             }
+            
             return res;
         }
 
         @Override
         public void perform() {
             assert documentWindowController != null;
-
+            EditorPlatform.Theme currentTheme
+                            = documentWindowController.getEditorController().getTheme();
             EditorPlatform.Theme overiddingTheme = theme;
 
             switch (theme) {
@@ -1535,8 +1699,6 @@
                     }
                     break;
                 case CASPIAN_HIGH_CONTRAST:
-                    final EditorPlatform.Theme currentTheme
-                            = documentWindowController.getEditorController().getTheme();
                     switch (currentTheme) {
                         case CASPIAN:
                             if (caspianHighContrastThemeMenuItem.isSelected()) {
@@ -1569,13 +1731,151 @@
                             }
                             break;
                         default:
-                            // All known 6 Caspian cases are already handled above.
+                            // All known 6 Caspian cases are handled above.
                             assert false;
                             break;
                     }
                     break;
+                case MODENA:
+                    if (modenaHighContrastBlackonwhiteThemeMenuItem.isSelected()) {
+                        overiddingTheme = EditorPlatform.Theme.MODENA_HIGH_CONTRAST_BLACK_ON_WHITE;
+                    } else if (modenaHighContrastWhiteonblackThemeMenuItem.isSelected()) {
+                        overiddingTheme = EditorPlatform.Theme.MODENA_HIGH_CONTRAST_WHITE_ON_BLACK;
+                    } else if (modenaHighContrastYellowonblackThemeMenuItem.isSelected()) {
+                        overiddingTheme = EditorPlatform.Theme.MODENA_HIGH_CONTRAST_YELLOW_ON_BLACK;
+                    }
+                    break;
+                case MODENA_TOUCH:
+                    if (modenaHighContrastBlackonwhiteThemeMenuItem.isSelected()) {
+                        overiddingTheme = EditorPlatform.Theme.MODENA_TOUCH_HIGH_CONTRAST_BLACK_ON_WHITE;
+                    } else if (modenaHighContrastWhiteonblackThemeMenuItem.isSelected()) {
+                        overiddingTheme = EditorPlatform.Theme.MODENA_TOUCH_HIGH_CONTRAST_WHITE_ON_BLACK;
+                    } else if (modenaHighContrastYellowonblackThemeMenuItem.isSelected()) {
+                        overiddingTheme = EditorPlatform.Theme.MODENA_TOUCH_HIGH_CONTRAST_YELLOW_ON_BLACK;
+                    }
+                    break;
+                case MODENA_HIGH_CONTRAST_BLACK_ON_WHITE:
+                    switch (currentTheme) {
+                        case MODENA:
+                            if (modenaHighContrastBlackonwhiteThemeMenuItem.isSelected()) {
+                                overiddingTheme = EditorPlatform.Theme.MODENA_HIGH_CONTRAST_BLACK_ON_WHITE;
+                            }
+                            break;
+                        case MODENA_TOUCH:
+                            if (modenaHighContrastBlackonwhiteThemeMenuItem.isSelected()) {
+                                overiddingTheme = EditorPlatform.Theme.MODENA_TOUCH_HIGH_CONTRAST_BLACK_ON_WHITE;
+                            }
+                            break;
+                        case MODENA_HIGH_CONTRAST_BLACK_ON_WHITE:
+                            if (modenaHighContrastBlackonwhiteThemeMenuItem.isSelected()) {
+                                overiddingTheme = EditorPlatform.Theme.MODENA;
+                            }
+                            break;
+                        case MODENA_HIGH_CONTRAST_WHITE_ON_BLACK:
+                            break;
+                        case MODENA_HIGH_CONTRAST_YELLOW_ON_BLACK:
+                            break;
+                        case MODENA_TOUCH_HIGH_CONTRAST_BLACK_ON_WHITE:
+                            if (modenaHighContrastBlackonwhiteThemeMenuItem.isSelected()) {
+                                overiddingTheme = EditorPlatform.Theme.MODENA_TOUCH;
+                            }
+                            break;
+                        case MODENA_TOUCH_HIGH_CONTRAST_WHITE_ON_BLACK:
+                            if (modenaHighContrastBlackonwhiteThemeMenuItem.isSelected()) {
+                                overiddingTheme = EditorPlatform.Theme.MODENA_TOUCH_HIGH_CONTRAST_BLACK_ON_WHITE;
+                            }
+                            break;
+                        case MODENA_TOUCH_HIGH_CONTRAST_YELLOW_ON_BLACK:
+                            if (modenaHighContrastBlackonwhiteThemeMenuItem.isSelected()) {
+                                overiddingTheme = EditorPlatform.Theme.MODENA_TOUCH_HIGH_CONTRAST_BLACK_ON_WHITE;
+                            }
+                            break;
+                        default:
+                            break;
+                    }
+                break;
+                case MODENA_HIGH_CONTRAST_WHITE_ON_BLACK:
+                    switch (currentTheme) {
+                        case MODENA:
+                                if (modenaHighContrastWhiteonblackThemeMenuItem.isSelected()) {
+                                overiddingTheme = EditorPlatform.Theme.MODENA_HIGH_CONTRAST_WHITE_ON_BLACK;
+                            }
+                            break;
+                        case MODENA_TOUCH:
+                                if (modenaHighContrastWhiteonblackThemeMenuItem.isSelected()) {
+                                overiddingTheme = EditorPlatform.Theme.MODENA_TOUCH_HIGH_CONTRAST_WHITE_ON_BLACK;
+                            }
+                            break;
+                        case MODENA_HIGH_CONTRAST_BLACK_ON_WHITE:
+                            break;
+                        case MODENA_HIGH_CONTRAST_WHITE_ON_BLACK:
+                            if (modenaHighContrastWhiteonblackThemeMenuItem.isSelected()) {
+                                overiddingTheme = EditorPlatform.Theme.MODENA;
+                            }
+                            break;
+                        case MODENA_HIGH_CONTRAST_YELLOW_ON_BLACK:
+                            break;
+                        case MODENA_TOUCH_HIGH_CONTRAST_BLACK_ON_WHITE:
+                            if (modenaHighContrastWhiteonblackThemeMenuItem.isSelected()) {
+                                overiddingTheme = EditorPlatform.Theme.MODENA_TOUCH_HIGH_CONTRAST_WHITE_ON_BLACK;
+                            }
+                            break;
+                        case MODENA_TOUCH_HIGH_CONTRAST_WHITE_ON_BLACK:
+                            if (modenaHighContrastWhiteonblackThemeMenuItem.isSelected()) {
+                                overiddingTheme = EditorPlatform.Theme.MODENA_TOUCH;
+                            }
+                            break;
+                        case MODENA_TOUCH_HIGH_CONTRAST_YELLOW_ON_BLACK:
+                            if (modenaHighContrastWhiteonblackThemeMenuItem.isSelected()) {
+                                overiddingTheme = EditorPlatform.Theme.MODENA_TOUCH_HIGH_CONTRAST_WHITE_ON_BLACK;
+                            }
+                            break;
+                        default:
+                            break;
+                    }
+                break;
+                case MODENA_HIGH_CONTRAST_YELLOW_ON_BLACK:
+                    switch (currentTheme) {
+                        case MODENA:
+                            if (modenaHighContrastYellowonblackThemeMenuItem.isSelected()) {
+                                overiddingTheme = EditorPlatform.Theme.MODENA_HIGH_CONTRAST_YELLOW_ON_BLACK;
+                            }
+                            break;
+                        case MODENA_TOUCH:
+                            if (modenaHighContrastYellowonblackThemeMenuItem.isSelected()) {
+                                overiddingTheme = EditorPlatform.Theme.MODENA_TOUCH_HIGH_CONTRAST_YELLOW_ON_BLACK;
+                            }
+                            break;
+                        case MODENA_HIGH_CONTRAST_BLACK_ON_WHITE:
+                            break;
+                        case MODENA_HIGH_CONTRAST_WHITE_ON_BLACK:
+                            break;
+                        case MODENA_HIGH_CONTRAST_YELLOW_ON_BLACK:
+                            if (modenaHighContrastYellowonblackThemeMenuItem.isSelected()) {
+                                overiddingTheme = EditorPlatform.Theme.MODENA;
+                            }
+                            break;
+                        case MODENA_TOUCH_HIGH_CONTRAST_BLACK_ON_WHITE:
+                            if (modenaHighContrastYellowonblackThemeMenuItem.isSelected()) {
+                                overiddingTheme = EditorPlatform.Theme.MODENA_TOUCH_HIGH_CONTRAST_YELLOW_ON_BLACK;
+                            }
+                            break;
+                        case MODENA_TOUCH_HIGH_CONTRAST_WHITE_ON_BLACK:
+                            if (modenaHighContrastYellowonblackThemeMenuItem.isSelected()) {
+                                overiddingTheme = EditorPlatform.Theme.MODENA_TOUCH_HIGH_CONTRAST_YELLOW_ON_BLACK;
+                            }
+                            break;
+                        case MODENA_TOUCH_HIGH_CONTRAST_YELLOW_ON_BLACK:
+                            if (modenaHighContrastYellowonblackThemeMenuItem.isSelected()) {
+                                overiddingTheme = EditorPlatform.Theme.MODENA_TOUCH;
+                            }
+                            break;
+                        default:
+                            break;
+                    }
+                break;
                 default:
-                    // Modena
+                    assert false;
                     break;
             }
 
@@ -1596,11 +1896,7 @@
                     // CASPIAN_HIGH_CONTRAST can be selected only if another CASPIAN
                     // theme is active.
                     case CASPIAN_HIGH_CONTRAST:
-                        if (currentTheme == EditorPlatform.Theme.MODENA || currentTheme == EditorPlatform.Theme.MODENA_TOUCH) {
-                            res = false;
-                        } else {
-                            res = true;
-                        }
+                        res = EditorPlatform.isCaspian(currentTheme);
                         break;
                     case CASPIAN:
                         res = (currentTheme == theme || currentTheme == EditorPlatform.Theme.CASPIAN_HIGH_CONTRAST);
@@ -1611,9 +1907,29 @@
                     case CASPIAN_EMBEDDED_QVGA:
                         res = (currentTheme == theme || currentTheme == EditorPlatform.Theme.CASPIAN_EMBEDDED_QVGA_HIGH_CONTRAST);
                         break;
+                    case MODENA_HIGH_CONTRAST_BLACK_ON_WHITE:
+                        res = EditorPlatform.isModenaBlackonwhite(currentTheme)
+                                && EditorPlatform.isModenaHighContrast(currentTheme);
+                        break;
+                    case MODENA_HIGH_CONTRAST_WHITE_ON_BLACK:
+                        res = EditorPlatform.isModenaWhiteonblack(currentTheme)
+                                && EditorPlatform.isModenaHighContrast(currentTheme);
+                        break;
+                    case MODENA_HIGH_CONTRAST_YELLOW_ON_BLACK:
+                        res = EditorPlatform.isModenaYellowonblack(currentTheme)
+                                && EditorPlatform.isModenaHighContrast(currentTheme);
+                        break;
+                    case MODENA:
+                        res = (currentTheme == theme
+                                || (EditorPlatform.isModenaHighContrast(currentTheme)
+                                    && !EditorPlatform.isModenaTouch(currentTheme)));
+                        break;
+                    case MODENA_TOUCH:
+                        res = (currentTheme == theme || EditorPlatform.isModenaTouchHighContrast(currentTheme));
+                        break;
                     default:
-                        // Modena
-                        res = currentTheme == theme;
+                        assert false;
+                        res = false;
                         break;
                 }
             }
--- a/apps/scenebuilder/SceneBuilderApp/src/com/oracle/javafx/scenebuilder/app/preferences/PreferencesDialogController.java	Mon Jan 06 11:23:36 2014 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,198 +0,0 @@
-/*
- * Copyright (c) 2012, 2013, Oracle and/or its affiliates.
- * All rights reserved. Use is subject to license terms.
- *
- * This file is available and licensed under the following license:
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- *  - Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- *  - Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in
- *    the documentation and/or other materials provided with the distribution.
- *  - Neither the name of Oracle Corporation nor the names of its
- *    contributors may be used to endorse or promote products derived
- *    from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-package com.oracle.javafx.scenebuilder.app.preferences;
-
-import com.oracle.javafx.scenebuilder.app.i18n.I18N;
-import com.oracle.javafx.scenebuilder.app.preferences.SBPreferences.BackgroundStyleClass;
-import com.oracle.javafx.scenebuilder.app.preferences.SBPreferences.CSSAnalyzerColumnsOrder;
-import com.oracle.javafx.scenebuilder.kit.editor.panel.util.dialog.AbstractModalDialog;
-import com.oracle.javafx.scenebuilder.kit.editor.panel.hierarchy.AbstractHierarchyPanelController.DisplayOption;
-import java.util.Arrays;
-import javafx.beans.value.ChangeListener;
-import javafx.beans.value.ObservableValue;
-import javafx.event.ActionEvent;
-import javafx.fxml.FXML;
-import javafx.scene.control.ChoiceBox;
-import javafx.scene.control.TextField;
-import javafx.scene.layout.VBox;
-import javafx.stage.Modality;
-
-/**
- * Preferences dialog.
- *
- */
-public class PreferencesDialogController extends AbstractModalDialog {
-
-    @FXML
-    private TextField documentHeight;
-    @FXML
-    private TextField documentWidth;
-    @FXML
-    private ChoiceBox<DisplayOption> hierarchyDisplayOption;
-    @FXML
-    private ChoiceBox<CSSAnalyzerColumnsOrder> cssAnalyzerColumnsOrder;
-    @FXML
-    private ChoiceBox<BackgroundStyleClass> backgroundStyleClass;
-    @FXML
-    private VBox alignmentGuides;
-    @FXML
-    private VBox dropTargetRing;
-
-    public PreferencesDialogController() {
-        super(PreferencesDialogController.class.getResource("Preferences.fxml"), //NOI18N
-                I18N.getBundle(), null);
-    }
-
-    public void onWidthChange() {
-        // TODO fix DTL-5656 : SB APP: Preferences dialog
-        // check value type when TextField will provide an appropriate callback
-    }
-
-    public void onHeightChange() {
-        // TODO fix DTL-5656 : SB APP: Preferences dialog
-        // check value type when TextField will provide an appropriate callback
-    }
-
-    /*
-     * AbstractModalDialog
-     */
-    
-    @Override
-    protected void controllerDidLoadFxml() {
-        super.controllerDidLoadFxml();
-        
-        // The AbstractModalDialog.controllerDidLoadFxml initialize the 
-        // ACTION, CANCEL and OK buttons as follows :
-        // By default, the ACTION button is not visible.
-        // => update the buttons setup if needed.
-        setActionButtonVisible(true);
-        setActionButtonTitle(I18N.getString("prefs.revert"));
-        setDefaultButtonID(ButtonID.OK);
-        setShowDefaultButton(true);
-    }
-    
-    @Override
-    protected void controllerDidLoadContentFxml() {
-        // Background style class
-        // TODO fix DTL-5656 : SB APP: Preferences dialog
-        // update the underlying preference
-        backgroundStyleClass.getItems().setAll(Arrays.asList(BackgroundStyleClass.class.getEnumConstants()));
-        backgroundStyleClass.getSelectionModel().select(BackgroundStyleClass.BACKGROUND_01); // get value stored in preferences
-        backgroundStyleClass.getSelectionModel().selectedItemProperty().addListener(new ChangeListener<BackgroundStyleClass>() {
-
-            @Override
-            public void changed(ObservableValue<? extends BackgroundStyleClass> observable,
-                    BackgroundStyleClass oldValue,
-                    BackgroundStyleClass newValue) {
-                backgroundStyleClassDidChange();
-            }
-        });
-
-        // Background style class
-        // TODO fix DTL-5656 : SB APP: Preferences dialog
-        // update the underlying preference
-        cssAnalyzerColumnsOrder.getItems().setAll(Arrays.asList(CSSAnalyzerColumnsOrder.class.getEnumConstants()));
-        cssAnalyzerColumnsOrder.getSelectionModel().select(CSSAnalyzerColumnsOrder.DEFAULTS_FIRST); // get value stored in preferences
-        cssAnalyzerColumnsOrder.getSelectionModel().selectedItemProperty().addListener(new ChangeListener<CSSAnalyzerColumnsOrder>() {
-
-            @Override
-            public void changed(ObservableValue<? extends CSSAnalyzerColumnsOrder> observable,
-                    CSSAnalyzerColumnsOrder oldValue,
-                    CSSAnalyzerColumnsOrder newValue) {
-                cssAnalyzerColumnsOrderDidChange();
-            }
-        });
-
-        // Hierarchy display option
-        // TODO fix DTL-5656 : SB APP: Preferences dialog
-        // update the underlying preference
-        hierarchyDisplayOption.getItems().setAll(Arrays.asList(DisplayOption.class.getEnumConstants()));
-        hierarchyDisplayOption.getSelectionModel().select(DisplayOption.INFO); // get value stored in preferences
-        hierarchyDisplayOption.getSelectionModel().selectedItemProperty().addListener(new ChangeListener<DisplayOption>() {
-
-            @Override
-            public void changed(ObservableValue<? extends DisplayOption> observable,
-                    DisplayOption oldValue,
-                    DisplayOption newValue) {
-                hierarchyDisplayOptionDidChange();
-            }
-        });
-    }
-
-    @Override
-    protected void okButtonPressed(ActionEvent e) {
-        getStage().close();
-    }
-
-    @Override
-    protected void cancelButtonPressed(ActionEvent e) {
-        getStage().close();
-    }
-
-    @Override
-    protected void actionButtonPressed(ActionEvent e) {
-        getStage().close();
-    }
-    
-    
-    /*
-     * AbstractWindowController
-     */
-    
-    @Override
-    protected void controllerDidCreateStage() {
-        assert getRoot() != null;
-        assert getRoot().getScene() != null;
-        assert getRoot().getScene().getWindow() != null;
-        
-        getStage().setTitle(I18N.getString("prefs.title"));
-        getStage().setResizable(false);
-        getStage().initModality(Modality.APPLICATION_MODAL);
-    }
-    
-    
-    /*
-     * Private
-     */
-    
-    private void backgroundStyleClassDidChange() {
-        // To be implemented
-    }
-    
-    private void cssAnalyzerColumnsOrderDidChange() {
-        // To be implemented
-    }
-    
-    private void hierarchyDisplayOptionDidChange() {
-        // To be implemented
-    }
-}
--- a/apps/scenebuilder/SceneBuilderApp/src/com/oracle/javafx/scenebuilder/app/preferences/SBPreferences.java	Mon Jan 06 11:23:36 2014 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,85 +0,0 @@
-/*
- * Copyright (c) 2012, 2013, Oracle and/or its affiliates.
- * All rights reserved. Use is subject to license terms.
- *
- * This file is available and licensed under the following license:
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- *  - Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- *  - Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in
- *    the documentation and/or other materials provided with the distribution.
- *  - Neither the name of Oracle Corporation nor the names of its
- *    contributors may be used to endorse or promote products derived
- *    from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-package com.oracle.javafx.scenebuilder.app.preferences;
-
-import com.oracle.javafx.scenebuilder.app.i18n.I18N;
-
-/**
- * Defines preferences for Scene Builder. Theses preferences are common to all
- * SB projects.
- *
- */
-public class SBPreferences {
-
-    public enum BackgroundStyleClass {
-
-        BACKGROUND_01 {
-
-            @Override
-            public String toString() {
-                return I18N.getString("prefs.background.value1");
-            }
-        },
-        BACKGROUND_02 {
-
-            @Override
-            public String toString() {
-                return I18N.getString("prefs.background.value2");
-            }
-        },
-        BACKGROUND_03 {
-
-            @Override
-            public String toString() {
-                return I18N.getString("prefs.background.value3");
-            }
-        }
-    }
-    
-    public enum CSSAnalyzerColumnsOrder {
-        
-        DEFAULTS_FIRST {
-
-            @Override
-            public String toString() {
-                return I18N.getString("prefs.cssanalyzer.columns.defaults.first");
-            }
-        },
-        DEFAULTS_LAST {
-
-            @Override
-            public String toString() {
-                return I18N.getString("prefs.cssanalyzer.columns.defaults.last");
-            }
-        }
-    }
-}
--- a/apps/scenebuilder/SceneBuilderApp/src/com/oracle/javafx/scenebuilder/app/preview/PreviewWindowController.java	Mon Jan 06 11:23:36 2014 +0200
+++ b/apps/scenebuilder/SceneBuilderApp/src/com/oracle/javafx/scenebuilder/app/preview/PreviewWindowController.java	Tue Jan 07 12:06:59 2014 +0100
@@ -34,6 +34,7 @@
 import com.oracle.javafx.scenebuilder.app.DocumentWindowController;
 import com.oracle.javafx.scenebuilder.app.i18n.I18N;
 import com.oracle.javafx.scenebuilder.kit.editor.EditorController;
+import com.oracle.javafx.scenebuilder.kit.editor.EditorController.Size;
 import com.oracle.javafx.scenebuilder.kit.editor.EditorPlatform;
 import com.oracle.javafx.scenebuilder.kit.editor.panel.util.AbstractWindowController;
 import com.oracle.javafx.scenebuilder.kit.fxom.FXOMDocument;
@@ -52,11 +53,13 @@
 import javafx.beans.value.ObservableValue;
 import javafx.collections.ObservableList;
 import javafx.geometry.Bounds;
+import javafx.geometry.Rectangle2D;
 import javafx.scene.Node;
 import javafx.scene.Parent;
 import javafx.scene.PerspectiveCamera;
 import javafx.scene.control.Label;
 import javafx.scene.layout.StackPane;
+import javafx.scene.shape.MeshView;
 import javafx.scene.transform.Scale;
 import javafx.scene.transform.Translate;
 import javafx.stage.Window;
@@ -76,6 +79,15 @@
     private static final String NID_PREVIEW_ROOT = "previewRoot"; //NOI18N
     private EditorPlatform.Theme editorControllerTheme;
     private ObservableList<File> sceneStyleSheet;
+    private Size currentSize = Size.SIZE_PREFERRED;
+    private boolean sizeChangedFromMenu = false;
+    private static final double TARGET_SIZE_3D = 500;
+    
+    // These two one are used to host the width and height difference
+    // coming from the decoration of the window; this is something highly
+    // dependent on the operating system.
+    private double decorationX = 0;
+    private double decorationY = 0;
     
     /**
      * The type of Camera used by the Preview panel.
@@ -84,7 +96,6 @@
 
         PARALLEL, PERSPECTIVE
     }
-
         
     public PreviewWindowController(EditorController editorController, Window owner) {
         super(owner);
@@ -240,53 +251,30 @@
 
                             if (sceneGraphRoot instanceof Parent) {
                                 ((Parent) sceneGraphRoot).setId(NID_PREVIEW_ROOT);
+                                assert ((Parent) sceneGraphRoot).getScene() == null;
+
                                 setRoot((Parent) updateAutoResizeTransform((Parent) sceneGraphRoot));
-                                assert ((Parent) sceneGraphRoot).getScene() == null;
-                                
-                                // At that stage current style sheets are the one defined within the FXML
-                                ObservableList<String> currentStyleSheets = ((Parent) sceneGraphRoot).getStylesheets();
+
+                                // Compute the proper styling
                                 List<String> newStyleSheets = new ArrayList<>();
-                                
-                                for (String stylesheet : currentStyleSheets) {
-                                    newStyleSheets.add(stylesheet);
-                                }
-                                
-                                // Add style sheet set thanks Preview > Scene Style Sheets > Add a Style Sheet
-                                if (sceneStyleSheet != null) {
-                                    for (File f : sceneStyleSheet) {
-                                        String urlString = ""; //NOI18N
-                                        try {
-                                            urlString = f.toURI().toURL().toString();
-                                        } catch (MalformedURLException ex) {
-                                            throw new RuntimeException("Bug in PreviewWindowController", ex); //NOI18N
-                                        }
-                                        newStyleSheets.add(urlString);
-                                    }
-                                }
-                                
+                                computeStyleSheets(newStyleSheets, sceneGraphRoot, themeStyleSheetStrings);
+
                                 // Clean all styling
                                 ((Parent) sceneGraphRoot).getStylesheets().removeAll();
-                                
-                                // Add theme style sheet; order is significant ==> theme one always first
-                                newStyleSheets.addAll(0, themeStyleSheetStrings);
-                                
-                                // Apply the whole styling
+
+                                // Apply the new styling as a whole
                                ((Parent) sceneGraphRoot).getStylesheets().addAll(newStyleSheets);
                             } else if (sceneGraphRoot instanceof Node) {
                                 StackPane sp = new StackPane();
-                                sp.getStylesheets().addAll(0, themeStyleSheetStrings);
+                                sp.setId(NID_PREVIEW_ROOT);
                                 
-                                if (sceneStyleSheet != null) {
-                                    for (File f : sceneStyleSheet) {
-                                        try {
-                                            ((Parent) sceneGraphRoot).getStylesheets().add(f.toURI().toURL().toString());
-                                        } catch (MalformedURLException ex) {
-                                            throw new RuntimeException("Bug in PreviewWindowController", ex); //NOI18N
-                                        }
-                                    }
-                                }
+                                // Compute the proper styling
+                                List<String> newStyleSheets = new ArrayList<>();
+                                computeStyleSheets(newStyleSheets, sceneGraphRoot, themeStyleSheetStrings);
+
+                                // Apply the new styling as a whole
+                                sp.getStylesheets().addAll(newStyleSheets);
                                 
-                                sp.setId(NID_PREVIEW_ROOT);
                                 // With some 3D assets such as TuxRotation the
                                 // rendering is wrong unless applyCSS is called.
                                 ((Node) sceneGraphRoot).applyCss();
@@ -294,6 +282,7 @@
                                 setRoot(sp);
                             } else {
                                 setCameraType(CameraType.PARALLEL);
+                                sizeChangedFromMenu = false;
                                 StackPane sp = new StackPane(new Label(I18N.getString("preview.not.node")));
                                 sp.setId(NID_PREVIEW_ROOT);
                                 sp.setPrefSize(WIDTH_WHEN_EMPTY, HEIGHT_WHEN_EMPTY);
@@ -301,6 +290,7 @@
                             }
                         } else {
                             setCameraType(CameraType.PARALLEL);
+                            sizeChangedFromMenu = false;
                             StackPane sp = new StackPane(new Label(I18N.getString("preview.no.document")));
                             sp.setId(NID_PREVIEW_ROOT);
                             sp.setPrefSize(WIDTH_WHEN_EMPTY, HEIGHT_WHEN_EMPTY);
@@ -318,9 +308,12 @@
         long delay = 0;
 
         // A long delay makes sense only if we have a valid document and
-        // the preview window is already opened.
+        // the preview window is already opened, except when we change size thanks
+        // Scene Size menu.
         // When opening preview window we want it fast.
-        if (editorController.getFxomDocument() != null && getStage().isShowing()) {
+        if (editorController.getFxomDocument() != null
+                && getStage().isShowing()
+                && ! sizeChangedFromMenu) {
             delay = 1000;
         }
 
@@ -332,7 +325,7 @@
         timer.schedule(timerTask, delay); // milliseconds
     }
     
-    private boolean userResizedPreviewWindow() {
+    public boolean userResizedPreviewWindow() {
         boolean res = false;
         double sceneHeight = getScene().getHeight();
         double sceneWidth = getScene().getWidth();
@@ -341,8 +334,13 @@
             double prefHeight = getRoot().prefHeight(-1);
             double prefWidth = getRoot().prefWidth(-1);
             
-            if ((! MathUtils.equals(prefHeight, sceneHeight) && ! MathUtils.equals(sceneHeight, HEIGHT_WHEN_EMPTY))
-                    || (! MathUtils.equals(prefWidth, sceneWidth) && ! MathUtils.equals(sceneWidth, WIDTH_WHEN_EMPTY))) {
+            if ((! MathUtils.equals(prefHeight, sceneHeight)
+                    && ! MathUtils.equals(sceneHeight, HEIGHT_WHEN_EMPTY)
+                    && ! MathUtils.equals(sceneHeight, getHeightFromSize(getSize())))
+                    ||
+                    (! MathUtils.equals(prefWidth, sceneWidth)
+                    && ! MathUtils.equals(sceneWidth, WIDTH_WHEN_EMPTY)
+                    && ! MathUtils.equals(sceneWidth, getWidthFromSize(getSize())))) {
                 res = true;
             }
         }
@@ -350,15 +348,43 @@
         return res;
     }
 
+    // With some 3D layout the preferred size can be ridiculous (< 1) hence a dot
+    // on screen, or it can be gigantic (several thousands). Do we want to put
+    // some bounds so that something is made visible ?
+    // In the same spirit some of the predefined sizes such as 1920x1080 or even
+    // 1280x800 may exceed the capability of the user screen: should we greyed
+    // relevant size values accordingly in Preview menu ?
     private void updateWindowSize() {
         final FXOMDocument fxomDocument = editorController.getFxomDocument();
 
         if (fxomDocument != null) {
-            // When we change the stylesheet (Modena, Caspian) we need to know
-            // if the user has resized the preview window: if yes we keep
-            // the user size, else we size the layout to the scene.
-            if ( ! userResizedPreviewWindow()) {
-                getStage().sizeToScene();
+            // A size setup action taken from menu bar has priority over a resize
+            // done directly on the Preview window.
+            if (sizeChangedFromMenu) {
+                sizeChangedFromMenu = false;
+                // We take into account size taken by decoration so that we are
+                // sure the area rendered has the exact size we want.
+                getStage().setWidth(getWidthFromSize(getSize()) + decorationX);
+                getStage().setHeight(getHeightFromSize(getSize()) + decorationY);
+            } else if ( ! userResizedPreviewWindow()) {
+                // Experience shows 3D layout defined so that top level item is
+                // a Group are rendered correctly on their own. The 3D case is
+                // something that deserves a closer look anyway.
+                if (fxomDocument.getSceneGraphRoot() instanceof MeshView) {
+                    getStage().setWidth(TARGET_SIZE_3D);
+                    getStage().setHeight(TARGET_SIZE_3D);
+                } else {
+                    // When we change the stylesheet (Modena, Caspian) we need to know
+                    // if the user has resized the preview window: if yes we keep
+                    // the user size, else we size the layout to the scene.
+                    getStage().sizeToScene();
+                }
+                
+                // The first time preview is rendered we always enter this case.
+                // The whole layout is made visible and size difference between
+                // Scene and Stage allows to compute size taken by decoration.
+                decorationX = getStage().getWidth() - getRoot().prefWidth(-1);
+                decorationY = getStage().getHeight() - getRoot().prefHeight(-1);
             }
         } else {
             getStage().setWidth(WIDTH_WHEN_EMPTY);
@@ -416,16 +442,15 @@
         Node res = whatever;
 //        System.out.println("PreviewWindowController::updateAutoResizeTransform: Called");
         assert editorController.getFxomDocument() != null;
-        final Bounds rootBounds = res.getLayoutBounds();
 
-        if ((rootBounds.getDepth() > 0) && autoResize3DContent) {
+        if (editorController.is3D() && autoResize3DContent) {
             res.getTransforms().clear();
+            final Bounds rootBounds = res.getLayoutBounds();
             // Content is 3D.
-            // Zoom to get a 500 size.
-            final double targetSize = 500.0;
-            final double scaleX = targetSize / rootBounds.getWidth();
-            final double scaleY = targetSize / rootBounds.getHeight();
-            final double scaleZ = targetSize / rootBounds.getDepth();
+            // Zoom to get a TARGET_SIZE_3D size.
+            final double scaleX = TARGET_SIZE_3D / rootBounds.getWidth();
+            final double scaleY = TARGET_SIZE_3D / rootBounds.getHeight();
+            final double scaleZ = TARGET_SIZE_3D / rootBounds.getDepth();
             final double scale = Math.min(scaleX, Math.min(scaleY, scaleZ));
             final double tX = -rootBounds.getMinX();
             final double tY = -rootBounds.getMinY();
@@ -442,4 +467,112 @@
         
         return res;
     }
+
+    private double getWidthFromSize(Size size) {
+        double res = WIDTH_WHEN_EMPTY;
+        
+        switch (size) {
+            case SIZE_1280x800:
+                res = 1280.0;
+                break;
+            case SIZE_1920x1080:
+                res = 1920.0;
+                break;
+            case SIZE_320x240:
+                res = 320.0;
+                break;
+            case SIZE_640x480:
+                res = 640.0;
+                break;
+            case SIZE_PREFERRED:
+                res = getRoot().prefWidth(-1);
+                break;
+            default:
+                break;
+        }
+        
+        return res;
+    }
+
+    private double getHeightFromSize(Size size) {
+        double res = HEIGHT_WHEN_EMPTY;
+        
+        switch (size) {
+            case SIZE_1280x800:
+                res = 800.0;
+                break;
+            case SIZE_1920x1080:
+                res = 1080.0;
+                break;
+            case SIZE_320x240:
+                res = 240.0;
+                break;
+            case SIZE_640x480:
+                res = 480.0;
+                break;
+            case SIZE_PREFERRED:
+                res = getRoot().prefHeight(-1);
+                break;
+            default:
+                break;
+        }
+        
+        return res;
+    }
+    
+    /**
+     * 
+     * @return the current Size used for previewing.
+     */
+    public Size getSize() {
+        return currentSize;
+    }
+    
+    public void setSize(Size size) {
+        currentSize = size;
+        sizeChangedFromMenu = true;
+        requestUpdate();
+    }
+    
+    private void computeStyleSheets(List<String> newStyleSheets, Object sceneGraphRoot, List<String> themeStyleSheetStrings) {        
+        // Add theme style sheet; order is significant ==> theme one always first
+        newStyleSheets.addAll(0, themeStyleSheetStrings);
+
+        if (sceneGraphRoot instanceof Parent) {
+            // At that stage current style sheets are the one defined within the FXML
+            ObservableList<String> currentStyleSheets = ((Parent) sceneGraphRoot).getStylesheets();
+
+            for (String stylesheet : currentStyleSheets) {
+                newStyleSheets.add(stylesheet);
+            }
+        }
+
+        // Add style sheet set thanks Preview > Scene Style Sheets > Add a Style Sheet
+        if (sceneStyleSheet != null) {
+            for (File f : sceneStyleSheet) {
+                String urlString = ""; //NOI18N
+                try {
+                    urlString = f.toURI().toURL().toString();
+                } catch (MalformedURLException ex) {
+                    throw new RuntimeException("Bug in PreviewWindowController", ex); //NOI18N
+                }
+                newStyleSheets.add(urlString);
+            }
+        }
+    }
+    
+    public boolean sizeDoesFit(Size size) {
+        boolean res = false;
+        
+        if (getStage() != null) {
+            Rectangle2D frame = getBiggestViewableRectangle();
+            
+            if (getWidthFromSize(size) <= frame.getWidth()
+                    && getHeightFromSize(size) <= frame.getHeight()) {
+                res = true;
+            }
+        }
+        
+        return res;
+    }
 }
--- a/apps/scenebuilder/SceneBuilderApp/src/com/oracle/javafx/scenebuilder/app/template/FxmlTemplates.java	Mon Jan 06 11:23:36 2014 +0200
+++ b/apps/scenebuilder/SceneBuilderApp/src/com/oracle/javafx/scenebuilder/app/template/FxmlTemplates.java	Tue Jan 07 12:06:59 2014 +0100
@@ -126,7 +126,7 @@
                 names.add("ComplexApplication.css"); //NOI18N
                 break;
             case NEW_COMPLEX_APPLICATION_I18N:
-                names.add("AlertDialog.css"); //NOI18N
+                names.add("ComplexApplication.css"); //NOI18N
                 names.add("ComplexApplication_en.properties"); //NOI18N
                 names.add("ComplexApplication_fr.properties"); //NOI18N
                 break;
--- a/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/EditorController.java	Mon Jan 06 11:23:36 2014 +0200
+++ b/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/EditorController.java	Tue Jan 07 12:06:59 2014 +0100
@@ -46,6 +46,7 @@
 import com.oracle.javafx.scenebuilder.kit.editor.job.SendToBackJob;
 import com.oracle.javafx.scenebuilder.kit.editor.job.TrimSelectionJob;
 import com.oracle.javafx.scenebuilder.kit.editor.job.UseComputedSizesSelectionJob;
+import com.oracle.javafx.scenebuilder.kit.editor.job.UsePredefinedSizeJob;
 import com.oracle.javafx.scenebuilder.kit.editor.job.gridpane.AddColumnJob;
 import com.oracle.javafx.scenebuilder.kit.editor.job.gridpane.AddRowJob;
 import com.oracle.javafx.scenebuilder.kit.editor.job.gridpane.GridPaneJobUtils.Position;
@@ -91,6 +92,8 @@
 import javafx.beans.value.ObservableListValue;
 import javafx.beans.value.ObservableValue;
 import javafx.collections.ObservableList;
+import javafx.geometry.Bounds;
+import javafx.scene.Node;
 import javafx.scene.Parent;
 import javafx.scene.effect.Effect;
 import javafx.scene.input.Clipboard;
@@ -127,6 +130,10 @@
         // Candidates for Modify menu
         FIT_TO_PARENT,
         USE_COMPUTED_SIZES,
+        SET_SIZE_320x240,
+        SET_SIZE_640x480,
+        SET_SIZE_1280x800,
+        SET_SIZE_1920x1080,
         // Candidates for Modify/GridPane menu
         MOVE_ROW_ABOVE,
         MOVE_ROW_BELOW,
@@ -176,6 +183,19 @@
         TOGGLE_SAMPLE_DATA
     }
     
+    /**
+     * Predefined sizes (width x height).
+     * Preferred one refers to the one explicitly set by the user: it is for
+     * use for previewing only.
+     */
+    public enum Size {
+        SIZE_320x240,
+        SIZE_640x480,
+        SIZE_1280x800,
+        SIZE_1920x1080,
+        SIZE_PREFERRED
+    }
+    
     private final Selection selection = new Selection();
     private final JobManager jobManager = new JobManager(this);
     private final MessageLog messageLog = new MessageLog();
@@ -310,6 +330,7 @@
         fxmlLocationProperty.setValue(fxmlLocation);
         if (getFxomDocument() != null) {
             getFxomDocument().setLocation(fxmlLocation);
+            clearUndoRedo(); // Because FXOMDocument.setLocation() mutates the document
         }
     }
     
@@ -799,6 +820,31 @@
                 jobManager.push(job);
                 break;
             }
+            case SET_SIZE_320x240: {
+                final UsePredefinedSizeJob job = new UsePredefinedSizeJob(this, Size.SIZE_320x240);
+                jobManager.push(job);
+                break;
+            }
+            case SET_SIZE_640x480: {
+                final UsePredefinedSizeJob job = new UsePredefinedSizeJob(this, Size.SIZE_640x480);
+                jobManager.push(job);
+                break;
+            }
+            case SET_SIZE_1280x800: {
+                final UsePredefinedSizeJob job = new UsePredefinedSizeJob(this, Size.SIZE_1280x800);
+                jobManager.push(job);
+                break;
+            }
+            case SET_SIZE_1920x1080: {
+                final UsePredefinedSizeJob job = new UsePredefinedSizeJob(this, Size.SIZE_1920x1080);
+                jobManager.push(job);
+                break;
+            }
+            case TRIM: {
+                final TrimSelectionJob job = new TrimSelectionJob(this);
+                jobManager.push(job);
+                break;
+            }
             case UNWRAP: {
                 final UnwrapJob job = new UnwrapJob(this);
                 jobManager.push(job);
@@ -810,11 +856,6 @@
                 jobManager.push(job);
                 break;
             }
-            case TRIM: {
-                final TrimSelectionJob job = new TrimSelectionJob(this);
-                jobManager.push(job);
-                break;
-            }
             case WRAP_IN_ANCHOR_PANE: {
                 performWrap(javafx.scene.layout.AnchorPane.class);
                 break;
@@ -969,6 +1010,31 @@
                 result = job.isExecutable();
                 break;
             }
+            case SET_SIZE_320x240: {
+                final UsePredefinedSizeJob job = new UsePredefinedSizeJob(this, Size.SIZE_320x240);
+                result = job.isExecutable();
+                break;
+            }
+            case SET_SIZE_640x480: {
+                final UsePredefinedSizeJob job = new UsePredefinedSizeJob(this, Size.SIZE_640x480);
+                result = job.isExecutable();
+                break;
+            }
+            case SET_SIZE_1280x800: {
+                final UsePredefinedSizeJob job = new UsePredefinedSizeJob(this, Size.SIZE_1280x800);
+                result = job.isExecutable();
+                break;
+            }
+            case SET_SIZE_1920x1080: {
+                final UsePredefinedSizeJob job = new UsePredefinedSizeJob(this, Size.SIZE_1920x1080);
+                result = job.isExecutable();
+                break;
+            }
+            case TRIM: {
+                final TrimSelectionJob job = new TrimSelectionJob(this);
+                result = job.isExecutable();
+                break;
+            }
             case UNWRAP: {
                 final UnwrapJob job = new UnwrapJob(this);
                 result = job.isExecutable();
@@ -980,11 +1046,6 @@
                 result = job.isExecutable();
                 break;
             }
-            case TRIM: {
-                final TrimSelectionJob job = new TrimSelectionJob(this);
-                result = job.isExecutable();
-                break;
-            }
             case WRAP_IN_ANCHOR_PANE: {
                 result = canPerformWrap(javafx.scene.layout.AnchorPane.class);
                 break;
@@ -1644,7 +1705,7 @@
     
     /**
      * Returns the list of library items that can be passed to
-     * {@link EditorController#performWrap(java.lang.Object)}.
+     * {@link EditorController#performWrap(java.lang.Class)}.
      * 
      * @return the list of library items usable for wrapping.
      */
@@ -1679,6 +1740,51 @@
     }
     
     
+    /**
+     * @treatAsPrivate
+     * 
+     * @return true if the current FXOM document represents a 3D layout, false
+     * otherwise.
+     */
+    public boolean is3D() {
+        boolean res = false;
+        FXOMDocument doc = getFxomDocument();
+        
+        if (doc != null) {
+            Object sgroot = doc.getSceneGraphRoot();
+            
+            if (sgroot instanceof Node) {
+                final Bounds rootBounds = ((Node)sgroot).getLayoutBounds();
+                res = (rootBounds.getDepth() > 0);
+            }
+        }
+        
+        return res;
+    }
+    
+    
+    /**
+     * @treatAsPrivate
+     * 
+     * @return true if the current FXOM document is an instance of a Node, false
+     * otherwise.
+     */
+    public boolean isNode() {
+        boolean res = false;
+        FXOMDocument doc = getFxomDocument();
+        
+        if (doc != null) {
+            Object sgroot = doc.getSceneGraphRoot();
+            
+            if (sgroot instanceof Node) {
+                res = true;
+            }
+        }
+        
+        return res;
+    }
+
+    
     /*
      * Private
      */
--- a/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/EditorPlatform.java	Mon Jan 06 11:23:36 2014 +0200
+++ b/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/EditorPlatform.java	Tue Jan 07 12:06:59 2014 +0100
@@ -76,6 +76,12 @@
 
         MODENA,
         MODENA_TOUCH,
+        MODENA_HIGH_CONTRAST_BLACK_ON_WHITE,
+        MODENA_HIGH_CONTRAST_WHITE_ON_BLACK,
+        MODENA_HIGH_CONTRAST_YELLOW_ON_BLACK,
+        MODENA_TOUCH_HIGH_CONTRAST_BLACK_ON_WHITE,
+        MODENA_TOUCH_HIGH_CONTRAST_WHITE_ON_BLACK,
+        MODENA_TOUCH_HIGH_CONTRAST_YELLOW_ON_BLACK,
         CASPIAN,
         CASPIAN_HIGH_CONTRAST,
         CASPIAN_EMBEDDED,
@@ -90,6 +96,9 @@
     private final static URL caspianEmbeddedQVGAThemeUrl = Deprecation.getCaspianEmbeddedQVGAStylesheetURL();
     private final static URL modenaThemeUrl = Deprecation.getModenaStylesheetURL();
     private final static URL modenaTouchThemeUrl = Deprecation.getModenaTouchStylesheetURL();
+    private final static URL modenaHighContrastBlackonwhiteThemeUrl = Deprecation.getModenaHighContrastBlackonwhiteStylesheetURL();
+    private final static URL modenaHighContrastWhiteonblackThemeUrl = Deprecation.getModenaHighContrastWhiteonblackStylesheetURL();
+    private final static URL modenaHighContrastYellowonblackThemeUrl = Deprecation.getModenaHighContrastYellowonblackStylesheetURL();
 
     /**
      * Returns the list of url for locating the specified set of stylesheet in jfxrt.jar.
@@ -110,6 +119,33 @@
                 result.add(modenaThemeUrl);
                 result.add(modenaTouchThemeUrl);
                 break;
+            case MODENA_HIGH_CONTRAST_BLACK_ON_WHITE:
+                result.add(modenaThemeUrl);
+                result.add(modenaHighContrastBlackonwhiteThemeUrl);
+                break;
+            case MODENA_HIGH_CONTRAST_WHITE_ON_BLACK:
+                result.add(modenaThemeUrl);
+                result.add(modenaHighContrastWhiteonblackThemeUrl);
+                break;
+            case MODENA_HIGH_CONTRAST_YELLOW_ON_BLACK:
+                result.add(modenaThemeUrl);
+                result.add(modenaHighContrastYellowonblackThemeUrl);
+                break;
+            case MODENA_TOUCH_HIGH_CONTRAST_BLACK_ON_WHITE:
+                result.add(modenaThemeUrl);
+                result.add(modenaTouchThemeUrl);
+                result.add(modenaHighContrastBlackonwhiteThemeUrl);
+                break;
+            case MODENA_TOUCH_HIGH_CONTRAST_WHITE_ON_BLACK:
+                result.add(modenaThemeUrl);
+                result.add(modenaTouchThemeUrl);
+                result.add(modenaHighContrastWhiteonblackThemeUrl);
+                break;
+            case MODENA_TOUCH_HIGH_CONTRAST_YELLOW_ON_BLACK:
+                result.add(modenaThemeUrl);
+                result.add(modenaTouchThemeUrl);
+                result.add(modenaHighContrastYellowonblackThemeUrl);
+                break;
             case CASPIAN:
                 result.add(caspianThemeUrl);
                 break;
@@ -142,6 +178,45 @@
 
         return result;
     }
+    
+    public static boolean isModena(Theme theme) {
+        return theme.toString().startsWith("MODENA");
+    }
+    
+    public static boolean isModenaBlackonwhite(Theme theme) {
+        return isModena(theme)
+                && theme.toString().indexOf("BLACK_ON_WHITE") != -1;
+    }
+    
+    public static boolean isModenaWhiteonblack(Theme theme) {
+        return isModena(theme)
+                && theme.toString().indexOf("WHITE_ON_BLACK") != -1;
+    }
+    
+    public static boolean isModenaYellowonblack(Theme theme) {
+        return isModena(theme)
+                && theme.toString().indexOf("YELLOW_ON_BLACK") != -1;
+    }
+    
+    public static boolean isModenaHighContrast(Theme theme) {
+        return isModena(theme)
+                && theme.toString().indexOf("HIGH_CONTRAST") != -1;
+    }
+    
+    public static boolean isModenaTouch(Theme theme) {
+        return isModena(theme)
+                && theme.toString().indexOf("TOUCH") != -1;
+    }
+    
+    public static boolean isModenaTouchHighContrast(Theme theme) {
+        return isModena(theme)
+                && theme.toString().indexOf("HIGH_CONTRAST") != -1
+                && theme.toString().indexOf("TOUCH") != -1;
+    }
+    
+    public static boolean isCaspian(Theme theme) {
+        return theme.toString().startsWith("CASPIAN");
+    }
 
     /**
      * Requests the underlying platform to open a given file. On Linux, it runs
--- a/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/i18n/SceneBuilderKit.properties	Mon Jan 06 11:23:36 2014 +0200
+++ b/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/i18n/SceneBuilderKit.properties	Tue Jan 07 12:06:59 2014 +0100
@@ -80,8 +80,8 @@
 # Inspector Panel
 # -----------------------------------------------------------------------------
 inspector.cursor.chooseimage = Choose Image...
-inspector.cursor.inherited = Inherited
-inspector.cursor.inheritedparent = Inherited from Parent
+inspector.cursor.inherited = Inherited (Default)
+inspector.cursor.inheritedparent = Inherited from Parent (Default)
 inspector.event.invalid.method = Method name {0} is invalid, it is not a valid java identifier
 inspector.event.menu.methodmode = Switch to Method Name mode
 inspector.event.menu.scriptmode = Switch to Script mode
@@ -117,6 +117,7 @@
 inspector.message.no.thingforinspector = No information to display
 inspector.message.searchpattern.empty = Search pattern is empty
 inspector.fxml.invalid.id = Id {0} is not a valid java identifier, node can''t be injected
+inspector.rectangle2D.not.defined = not defined
 inspector.select.css = css files
 inspector.select.image = Image files
 inspector.stylesheet.alreadyexist = Stylesheet {0} has already been added
@@ -212,3 +213,6 @@
 csspanel.reveal.explorer = Reveal {0} in Explorer
 csspanel.open.stylesheet = Open {0}
 csspanel.multiselection = multiple elements selected
+
+################ Description of Jobs
+job.set.size = Use Predefined Size {0} x {1}
\ No newline at end of file
--- a/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/images/ImageUtilsBase.java	Mon Jan 06 11:23:36 2014 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,54 +0,0 @@
-/*
- * Copyright (c) 2012, 2013, Oracle and/or its affiliates.
- * All rights reserved. Use is subject to license terms.
- *
- * This file is available and licensed under the following license:
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- *  - Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- *  - Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in
- *    the documentation and/or other materials provided with the distribution.
- *  - Neither the name of Oracle Corporation nor the names of its
- *    contributors may be used to endorse or promote products derived
- *    from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-package com.oracle.javafx.scenebuilder.kit.editor.images;
-
-import java.net.URL;
-
-/**
- * Methods defined here can be safely called without being on the FX thread.
- */
-public abstract class ImageUtilsBase {
-    static final String NODE_ICONS_DIR = "nodeicons"; //NOI18N
-    static final String UI_DIR = "ui"; //NOI18N
-    static final String MISSING_ICON = "MissingIcon.png"; //NOI18N
-    static final String WARNING_BADGE = "WarningBadge.png"; //NOI18N
-
-    /**
-     * Returns the URL corresponding to the specified name.
-     * The file MUST be located in the NODE_ICONS_DIR.
-     * @param name
-     * @return
-     */
-    public static URL getNodeIconURL(String name) {
-        return ImageUtils.class.getResource(NODE_ICONS_DIR + "/" + name); //NOI18N
-    }
-}
--- a/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/job/ModifyFxIdJob.java	Mon Jan 06 11:23:36 2014 +0200
+++ b/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/job/ModifyFxIdJob.java	Tue Jan 07 12:06:59 2014 +0100
@@ -33,6 +33,7 @@
 
 import com.oracle.javafx.scenebuilder.kit.editor.EditorController;
 import com.oracle.javafx.scenebuilder.kit.fxom.FXOMObject;
+import com.oracle.javafx.scenebuilder.kit.util.JavaLanguage;
 import java.util.Objects;
 
 /**
@@ -61,7 +62,8 @@
      */
     @Override
     public boolean isExecutable() {
-        return Objects.equals(oldValue, newValue) == false;
+        return Objects.equals(oldValue, newValue) == false
+                && ((newValue == null) || JavaLanguage.isIdentifier(newValue));
     }
 
     @Override
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/job/UsePredefinedSizeJob.java	Tue Jan 07 12:06:59 2014 +0100
@@ -0,0 +1,202 @@
+/*
+ * Copyright (c) 2014, Oracle and/or its affiliates.
+ * All rights reserved. Use is subject to license terms.
+ *
+ * This file is available and licensed under the following license:
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *  - Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ *  - Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in
+ *    the documentation and/or other materials provided with the distribution.
+ *  - Neither the name of Oracle Corporation nor the names of its
+ *    contributors may be used to endorse or promote products derived
+ *    from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+package com.oracle.javafx.scenebuilder.kit.editor.job;
+
+import com.oracle.javafx.scenebuilder.kit.editor.EditorController;
+import com.oracle.javafx.scenebuilder.kit.editor.EditorController.Size;
+import com.oracle.javafx.scenebuilder.kit.editor.i18n.I18N;
+import com.oracle.javafx.scenebuilder.kit.fxom.FXOMDocument;
+import com.oracle.javafx.scenebuilder.kit.fxom.FXOMInstance;
+import com.oracle.javafx.scenebuilder.kit.fxom.FXOMObject;
+import com.oracle.javafx.scenebuilder.kit.metadata.Metadata;
+import com.oracle.javafx.scenebuilder.kit.metadata.property.ValuePropertyMetadata;
+import com.oracle.javafx.scenebuilder.kit.metadata.util.PropertyName;
+import java.util.ArrayList;
+import java.util.List;
+import javafx.scene.layout.Region;
+import javafx.scene.web.WebView;
+
+/**
+ * Job to use for setting the size of the layout. It will set the preferred width
+ * and height to the given value while min and max width and height are set to
+ * Region.USE_PREF_SIZE.
+ * No action is taken unless the layout is an instance of Region or WebView.
+ */
+public class UsePredefinedSizeJob extends Job {
+
+    private final List<ModifyObjectJob> subJobs = new ArrayList<>();
+    private String description; // final but initialized lazily
+    private final Size size;
+    private final EditorController editorController;
+
+    public UsePredefinedSizeJob(EditorController editorController, Size size) {
+        super(editorController);
+        this.editorController = editorController;
+        this.size = size;
+        buildSubJobs();
+    }
+
+    /*
+     * Job
+     */
+    @Override
+    public boolean isExecutable() {
+        return subJobs.isEmpty() == false;
+    }
+
+    @Override
+    public void execute() {
+        final FXOMDocument fxomDocument = editorController.getFxomDocument();
+        fxomDocument.beginUpdate();
+        for (ModifyObjectJob subJob : subJobs) {
+            subJob.execute();
+        }
+        fxomDocument.endUpdate();
+    }
+
+    @Override
+    public void undo() {
+        final FXOMDocument fxomDocument = editorController.getFxomDocument();
+        fxomDocument.beginUpdate();
+        for (int i = subJobs.size() - 1; i >= 0; i--) {
+            subJobs.get(i).undo();
+        }
+        fxomDocument.endUpdate();
+    }
+
+    @Override
+    public void redo() {
+        final FXOMDocument fxomDocument = editorController.getFxomDocument();
+        fxomDocument.beginUpdate();
+        for (ModifyObjectJob subJob : subJobs) {
+            subJob.redo();
+        }
+        fxomDocument.endUpdate();
+    }
+
+    @Override
+    public String getDescription() {
+        if (description == null) {
+            description = I18N.getString("job.set.size", getWidthFromSize(size), getHeightFromSize(size));
+        }
+        return description;
+    }
+
+    private void buildSubJobs() {
+
+        final Object sceneGraphObject = editorController.getFxomDocument().getSceneGraphRoot();
+        FXOMObject fxomObject = editorController.getFxomDocument().getFxomRoot();
+
+        if (sceneGraphObject instanceof WebView
+                || sceneGraphObject instanceof Region) {
+            assert fxomObject instanceof FXOMInstance;
+            subJobs.addAll(modifyHeightJobs((FXOMInstance)fxomObject));
+            subJobs.addAll(modifyWidthJobs((FXOMInstance)fxomObject));
+        }
+    }
+
+    private List<ModifyObjectJob> modifyHeightJobs(final FXOMInstance candidate) {
+        final List<ModifyObjectJob> result = new ArrayList<>();
+
+        final PropertyName maxHeight = new PropertyName("maxHeight"); //NOI18N
+        final PropertyName minHeight = new PropertyName("minHeight"); //NOI18N
+        final PropertyName prefHeight = new PropertyName("prefHeight"); //NOI18N
+
+        final ValuePropertyMetadata maxHeightVPM
+                = Metadata.getMetadata().queryValueProperty(candidate, maxHeight);
+        final ValuePropertyMetadata minHeightVPM
+                = Metadata.getMetadata().queryValueProperty(candidate, minHeight);
+        final ValuePropertyMetadata prefHeightVPM
+                = Metadata.getMetadata().queryValueProperty(candidate, prefHeight);
+
+        final ModifyObjectJob maxHeightJob = new ModifyObjectJob(
+                candidate, maxHeightVPM, Region.USE_PREF_SIZE, editorController);
+        final ModifyObjectJob minHeightJob = new ModifyObjectJob(
+                candidate, minHeightVPM, Region.USE_PREF_SIZE, editorController);
+        final ModifyObjectJob prefHeightJob = new ModifyObjectJob(
+                candidate, prefHeightVPM, getHeightFromSize(size), editorController);
+
+        if (maxHeightJob.isExecutable()) {
+            result.add(maxHeightJob);
+        }
+        if (minHeightJob.isExecutable()) {
+            result.add(minHeightJob);
+        }
+        if (prefHeightJob.isExecutable()) {
+            result.add(prefHeightJob);
+        }
+        return result;
+    }
+
+    private List<ModifyObjectJob> modifyWidthJobs(final FXOMInstance candidate) {
+        final List<ModifyObjectJob> result = new ArrayList<>();
+
+        final PropertyName maxWidth = new PropertyName("maxWidth"); //NOI18N
+        final PropertyName minWidth = new PropertyName("minWidth"); //NOI18N
+        final PropertyName prefWidth = new PropertyName("prefWidth"); //NOI18N
+
+        final ValuePropertyMetadata maxWidthVPM
+                = Metadata.getMetadata().queryValueProperty(candidate, maxWidth);
+        final ValuePropertyMetadata minWidthVPM
+                = Metadata.getMetadata().queryValueProperty(candidate, minWidth);
+        final ValuePropertyMetadata prefWidthVPM
+                = Metadata.getMetadata().queryValueProperty(candidate, prefWidth);
+
+        final ModifyObjectJob maxWidthJob = new ModifyObjectJob(
+                candidate, maxWidthVPM, Region.USE_PREF_SIZE, editorController);
+        final ModifyObjectJob minWidthJob = new ModifyObjectJob(
+                candidate, minWidthVPM, Region.USE_PREF_SIZE, editorController);
+        final ModifyObjectJob prefWidthJob = new ModifyObjectJob(
+                candidate, prefWidthVPM, getWidthFromSize(size), editorController);
+
+        if (maxWidthJob.isExecutable()) {
+            result.add(maxWidthJob);
+        }
+        if (minWidthJob.isExecutable()) {
+            result.add(minWidthJob);
+        }
+        if (prefWidthJob.isExecutable()) {
+            result.add(prefWidthJob);
+        }
+        return result;
+    }
+    
+    private double getWidthFromSize(Size size) {
+        String sizeString = size.toString();
+        return new Double(sizeString.substring(5, sizeString.indexOf("x"))).doubleValue(); //NOI18N
+    }
+    
+    private double getHeightFromSize(Size size) {
+        String sizeString = size.toString();
+        return new Double(sizeString.substring(sizeString.indexOf("x") + 1, sizeString.length())).doubleValue(); //NOI18N
+    }
+}
--- a/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/panel/content/gesture/mouse/ResizeShadow.java	Mon Jan 06 11:23:36 2014 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,67 +0,0 @@
-/*
- * Copyright (c) 2012, 2013, Oracle and/or its affiliates.
- * All rights reserved. Use is subject to license terms.
- *
- * This file is available and licensed under the following license:
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- *  - Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- *  - Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in
- *    the documentation and/or other materials provided with the distribution.
- *  - Neither the name of Oracle Corporation nor the names of its
- *    contributors may be used to endorse or promote products derived
- *    from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-package com.oracle.javafx.scenebuilder.kit.editor.panel.content.gesture.mouse;
-
-import javafx.geometry.Bounds;
-import javafx.scene.Group;
-import javafx.scene.layout.Region;
-
-/**
- * A resize shadow is the following construct:
- *
- *    Group
- *         Region           glass area with css styling
- *
- * Layout bounds of the group must be equal to layout bounds
- * of the scene graph node. We ensure this by setting layoutX/Y
- * on the region (1).
- */
-class ResizeShadow extends Group {
-    
-    private final Region glass = new Region();
-    
-    
-    public ResizeShadow() {
-        this.getChildren().add(glass);
-        
-        this.glass.getStyleClass().add("resize-shadow");
-    }
-    
-    public void setLayoutBounds(Bounds layoutBounds) {
-        
-        // Setup layoutX/layoutY on the image view and the region (1)
-        glass.setLayoutX(layoutBounds.getMinX());
-        glass.setLayoutY(layoutBounds.getMinY());
-        glass.setPrefWidth(layoutBounds.getWidth());
-        glass.setPrefHeight(layoutBounds.getHeight());
-    }
-}
--- a/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/panel/hierarchy/ImageView.fxml	Mon Jan 06 11:23:36 2014 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,43 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-  Copyright (c) 2012, 2014, Oracle and/or its affiliates.
-  All rights reserved. Use is subject to license terms.
-
-  This file is available and licensed under the following license:
-
-  Redistribution and use in source and binary forms, with or without
-  modification, are permitted provided that the following conditions
-  are met:
-
-  - Redistributions of source code must retain the above copyright
-    notice, this list of conditions and the following disclaimer.
-  - Redistributions in binary form must reproduce the above copyright
-    notice, this list of conditions and the following disclaimer in
-    the documentation and/or other materials provided with the distribution.
-  - Neither the name of Oracle Corporation nor the names of its
-    contributors may be used to endorse or promote products derived
-    from this software without specific prior written permission.
-
-  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-  "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-  LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-  A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-  OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-  SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-  LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-  DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-  THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-  OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--->
-<?import java.lang.*?>
-<?import java.util.*?>
-<?import javafx.scene.image.*?>
-<?import javafx.scene.layout.*?>
-<?import javafx.scene.paint.*?>
-
-<ImageView fitHeight="150.0" fitWidth="200.0" pickOnBounds="true" preserveRatio="true" >
-    <image>
-        <Image url="IMAGE_URL" />
-    </image>
-</ImageView>
--- a/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/panel/hierarchy/treetableview/HierarchyTreeTableCell.java	Mon Jan 06 11:23:36 2014 +0200
+++ b/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/panel/hierarchy/treetableview/HierarchyTreeTableCell.java	Tue Jan 07 12:06:59 2014 +0100
@@ -351,8 +351,10 @@
                         }
                         break;
                     case FXID:
+                        assert newValue != null;
+                        final String fxId = newValue.isEmpty() ? null : newValue;
                         final ModifyFxIdJob job
-                                = new ModifyFxIdJob(fxomObject, newValue, editorController);
+                                = new ModifyFxIdJob(fxomObject, fxId, editorController);
                         if (job.isExecutable()) {
                             editorController.getJobManager().push(job);
                         }
--- a/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/panel/hierarchy/treeview/HierarchyTreeCell.java	Mon Jan 06 11:23:36 2014 +0200
+++ b/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/panel/hierarchy/treeview/HierarchyTreeCell.java	Tue Jan 07 12:06:59 2014 +0100
@@ -688,8 +688,10 @@
                         }
                         break;
                     case FXID:
+                        assert newValue != null;
+                        final String fxId = newValue.isEmpty() ? null : newValue;
                         final ModifyFxIdJob job
-                                = new ModifyFxIdJob(fxomObject, newValue, editorController);
+                                = new ModifyFxIdJob(fxomObject, fxId, editorController);
                         if (job.isExecutable()) {
                             editorController.getJobManager().push(job);
                         }
--- a/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/panel/inspector/InspectorPanelController.java	Mon Jan 06 11:23:36 2014 +0200
+++ b/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/panel/inspector/InspectorPanelController.java	Tue Jan 07 12:06:59 2014 +0100
@@ -40,6 +40,7 @@
 import com.oracle.javafx.scenebuilder.kit.editor.panel.inspector.editors.AnchorPaneConstraintsEditor;
 import com.oracle.javafx.scenebuilder.kit.editor.panel.inspector.editors.BooleanEditor;
 import com.oracle.javafx.scenebuilder.kit.editor.panel.inspector.editors.BoundedDoubleEditor;
+import com.oracle.javafx.scenebuilder.kit.editor.panel.inspector.editors.ColumnResizePolicyEditor;
 import com.oracle.javafx.scenebuilder.kit.editor.panel.inspector.editors.CursorEditor;
 import com.oracle.javafx.scenebuilder.kit.editor.panel.inspector.editors.DoubleEditor;
 import com.oracle.javafx.scenebuilder.kit.editor.panel.inspector.editors.Editor;
@@ -64,7 +65,9 @@
 import com.oracle.javafx.scenebuilder.kit.editor.panel.inspector.editors.TextAlignmentEditor;
 import com.oracle.javafx.scenebuilder.kit.editor.panel.inspector.popupeditors.BoundsPopupEditor;
 import com.oracle.javafx.scenebuilder.kit.editor.panel.inspector.popupeditors.KeyCombinationPopupEditor;
+import com.oracle.javafx.scenebuilder.kit.editor.panel.inspector.popupeditors.EffectPopupEditor;
 import com.oracle.javafx.scenebuilder.kit.editor.panel.inspector.popupeditors.PaintPopupEditor;
+import com.oracle.javafx.scenebuilder.kit.editor.panel.inspector.popupeditors.Rectangle2DPopupEditor;
 import com.oracle.javafx.scenebuilder.kit.editor.panel.util.AbstractFxmlPanelController;
 import com.oracle.javafx.scenebuilder.kit.editor.selection.GridSelectionGroup;
 import com.oracle.javafx.scenebuilder.kit.editor.selection.ObjectSelectionGroup;
@@ -87,8 +90,12 @@
 import com.oracle.javafx.scenebuilder.kit.metadata.property.value.InsetsPropertyMetadata;
 import com.oracle.javafx.scenebuilder.kit.metadata.property.value.IntegerPropertyMetadata;
 import com.oracle.javafx.scenebuilder.kit.metadata.property.value.Point3DPropertyMetadata;
+import com.oracle.javafx.scenebuilder.kit.metadata.property.value.Rectangle2DPropertyMetadata;
 import com.oracle.javafx.scenebuilder.kit.metadata.property.value.StringPropertyMetadata;
 import com.oracle.javafx.scenebuilder.kit.metadata.property.value.keycombination.KeyCombinationPropertyMetadata;
+import com.oracle.javafx.scenebuilder.kit.metadata.property.value.TableViewResizePolicyPropertyMetadata;
+import com.oracle.javafx.scenebuilder.kit.metadata.property.value.TreeTableViewResizePolicyPropertyMetadata;
+import com.oracle.javafx.scenebuilder.kit.metadata.property.value.effect.EffectPropertyMetadata;
 import com.oracle.javafx.scenebuilder.kit.metadata.property.value.list.ListValuePropertyMetadata;
 import com.oracle.javafx.scenebuilder.kit.metadata.property.value.paint.PaintPropertyMetadata;
 import com.oracle.javafx.scenebuilder.kit.metadata.util.InspectorPath;
@@ -124,6 +131,7 @@
 import javafx.scene.control.Accordion;
 import javafx.scene.control.Label;
 import javafx.scene.control.MenuButton;
+import javafx.scene.control.ProgressIndicator;
 import javafx.scene.control.ScrollPane;
 import javafx.scene.control.SplitPane;
 import javafx.scene.control.TextArea;
@@ -209,6 +217,7 @@
     private final Stack<Editor> integerEditorPool = new Stack<>();
     private final Stack<Editor> booleanEditorPool = new Stack<>();
     private final Stack<Editor> enumEditorPool = new Stack<>();
+    private final Stack<Editor> effectPopupEditorPool = new Stack<>();
     private final Stack<Editor> genericEditorPool = new Stack<>();
     private final Stack<Editor> insetsEditorPool = new Stack<>();
     private final Stack<Editor> boundedDoubleEditorPool = new Stack<>();
@@ -227,6 +236,8 @@
     private final Stack<Editor> dividerPositionsEditorPool = new Stack<>();
     private final Stack<Editor> textAlignmentEditorPool = new Stack<>();
     private final Stack<Editor> keyCombinationPopupEditorPool = new Stack<>();
+    private final Stack<Editor> columnResizePolicyEditorPool = new Stack<>();
+    private final Stack<Editor> rectangle2DPopupEditorPool = new Stack<>();
     // ...
     //
     // Subsection title pool
@@ -269,6 +280,7 @@
         editorPools.put(IntegerEditor.class, integerEditorPool);
         editorPools.put(BooleanEditor.class, booleanEditorPool);
         editorPools.put(EnumEditor.class, enumEditorPool);
+        editorPools.put(EffectPopupEditor.class, effectPopupEditorPool);
         editorPools.put(GenericEditor.class, genericEditorPool);
         editorPools.put(InsetsEditor.class, insetsEditorPool);
         editorPools.put(BoundedDoubleEditor.class, boundedDoubleEditorPool);
@@ -287,6 +299,9 @@
         editorPools.put(DividerPositionsEditor.class, dividerPositionsEditorPool);
         editorPools.put(TextAlignmentEditor.class, textAlignmentEditorPool);
         editorPools.put(KeyCombinationPopupEditor.class, keyCombinationPopupEditorPool);
+        editorPools.put(ColumnResizePolicyEditor.class, columnResizePolicyEditorPool);
+        editorPools.put(Rectangle2DPopupEditor.class, rectangle2DPopupEditorPool);
+        
         // ...
     }
 
@@ -311,7 +326,8 @@
         } else if (expandedSection == codeTitledPane) {
             result = InspectorPanelController.SectionId.CODE;
         } else {
-            throw new IllegalStateException("Unexpected section " + expandedSection); //NOI18N
+            // may happen if the view mode has been changed
+            return null;
         }
 
         return result;
@@ -1327,6 +1343,9 @@
         } else if (propMeta instanceof EventHandlerPropertyMetadata) {
             // EventHandler editor
             propertyEditor = makePropertyEditor(EventHandlerEditor.class, propMeta);
+        } else if (propMeta instanceof EffectPropertyMetadata) {
+            // Effect editor
+            propertyEditor = makePropertyEditor(EffectPopupEditor.class, propMeta);
         } else if (propMeta instanceof PaintPropertyMetadata) {
             // Paint editor
             propertyEditor = makePropertyEditor(PaintPopupEditor.class, propMeta);
@@ -1342,6 +1361,13 @@
         } else if (propMeta instanceof KeyCombinationPropertyMetadata) {
             // KeyCombination editor
             propertyEditor = makePropertyEditor(KeyCombinationPopupEditor.class, propMeta);
+        } else if ((propMeta instanceof TableViewResizePolicyPropertyMetadata) ||
+                (propMeta instanceof TreeTableViewResizePolicyPropertyMetadata)) {
+            // ColumnResizePolicy editor
+            propertyEditor = makePropertyEditor(ColumnResizePolicyEditor.class, propMeta);
+        } else if (propMeta instanceof Rectangle2DPropertyMetadata) {
+            // Rectangle2D editor
+            propertyEditor = makePropertyEditor(Rectangle2DPopupEditor.class, propMeta);
         } else {
             // Generic editor
             propertyEditor = makePropertyEditor(GenericEditor.class, propMeta);
@@ -1380,6 +1406,8 @@
             constants.put(DoubleKind.USE_PREF_SIZE.toString(), Region.USE_PREF_SIZE);
         } else if (kind == DoubleKind.NULLABLE_COORDINATE) {
             constants.put("NULL", null); //NOI18N
+        } else if (kind == DoubleKind.PROGRESS) {
+            constants.put("INDETERMINATE", ProgressIndicator.INDETERMINATE_PROGRESS);
         }
         return constants;
     }
@@ -1574,10 +1602,12 @@
                 propertyEditor = new InsetsEditor(propMeta, selectedClasses);
             }
         } else if (editorClass == BoundedDoubleEditor.class) {
+            assert propMeta instanceof DoublePropertyMetadata;
+            DoublePropertyMetadata doublePropMeta = (DoublePropertyMetadata) propMeta;
             if (propertyEditor != null) {
-                ((BoundedDoubleEditor) propertyEditor).reset(propMeta, selectedClasses);
+                ((BoundedDoubleEditor) propertyEditor).reset(propMeta, selectedClasses, getConstants(doublePropMeta));
             } else {
-                propertyEditor = new BoundedDoubleEditor(propMeta, selectedClasses);
+                propertyEditor = new BoundedDoubleEditor(propMeta, selectedClasses, getConstants(doublePropMeta));
             }
         } else if (editorClass == RotateEditor.class) {
             if (propertyEditor != null) {
@@ -1622,6 +1652,12 @@
             } else {
                 propertyEditor = new EventHandlerEditor(propMeta, selectedClasses, getSuggestedEventHandlers(getControllerClass()));
             }
+        } else if (editorClass == EffectPopupEditor.class) {
+            if (propertyEditor != null) {
+                ((EffectPopupEditor) propertyEditor).reset(propMeta, selectedClasses);
+            } else {
+                propertyEditor = new EffectPopupEditor(propMeta, selectedClasses);
+            }
         } else if (editorClass == PaintPopupEditor.class) {
             if (propertyEditor != null) {
                 ((PaintPopupEditor) propertyEditor).reset(propMeta, selectedClasses);
@@ -1664,6 +1700,18 @@
             } else {
                 propertyEditor = new KeyCombinationPopupEditor(propMeta, selectedClasses);
             }
+        } else if (editorClass == ColumnResizePolicyEditor.class) {
+            if (propertyEditor != null) {
+                ((ColumnResizePolicyEditor) propertyEditor).reset(propMeta, selectedClasses);
+            } else {
+                propertyEditor = new ColumnResizePolicyEditor(propMeta, selectedClasses);
+            }
+        } else if (editorClass == Rectangle2DPopupEditor.class) {
+            if (propertyEditor != null) {
+                ((Rectangle2DPopupEditor) propertyEditor).reset(propMeta, selectedClasses);
+            } else {
+                propertyEditor = new Rectangle2DPopupEditor(propMeta, selectedClasses);
+            }
         } else {
             if (propertyEditor != null) {
                 ((GenericEditor) propertyEditor).reset(propMeta, selectedClasses);
@@ -1704,7 +1752,7 @@
         return propertiesEditor;
     }
 
-    public static class SubSectionTitle {
+    private static class SubSectionTitle {
 
         @FXML
         private Label titleLb;
--- a/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/panel/inspector/editors/AutoSuggestEditor.java	Mon Jan 06 11:23:36 2014 +0200
+++ b/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/panel/inspector/editors/AutoSuggestEditor.java	Tue Jan 07 12:06:59 2014 +0100
@@ -33,13 +33,13 @@
 
 import static com.oracle.javafx.scenebuilder.kit.editor.panel.inspector.editors.PropertyEditor.handleIndeterminate;
 import com.oracle.javafx.scenebuilder.kit.metadata.property.ValuePropertyMetadata;
+import java.util.ArrayList;
 import java.util.List;
 import java.util.Locale;
 import java.util.Set;
 import javafx.beans.value.ChangeListener;
 import javafx.beans.value.ObservableValue;
 import javafx.collections.FXCollections;
-import javafx.collections.ObservableList;
 import javafx.event.ActionEvent;
 import javafx.event.EventHandler;
 import javafx.fxml.FXML;
@@ -168,8 +168,7 @@
         }
 
         if (value == null) {
-            // Should be set to null, but need a global work on the "null handling"
-            entryField.setText(""); //NOI18N
+            entryField.setText(null);
         } else {
             assert value instanceof String;
             entryField.setText((String) value); //NOI18N
@@ -194,15 +193,15 @@
 
     public void reset(ValuePropertyMetadata propMeta, Set<Class<?>> selectedClasses, List<String> suggestedList) {
         super.reset(propMeta, selectedClasses);
-        reset(suggestedList);
+        resetSuggestedList(suggestedList);
     }
 
     public void reset(String name, String defaultValue, List<String> suggestedList) {
         super.reset(name, defaultValue);
-        reset(suggestedList);
+        resetSuggestedList(suggestedList);
     }
 
-    private void reset(List<String> suggestedList) {
+    protected void resetSuggestedList(List<String> suggestedList) {
         this.suggestedList = suggestedList;
         updateMenuButtonIfNeeded();
         entryField.setPromptText(null);
@@ -265,7 +264,7 @@
         String value = entryField.getText();
         if (!suggest) {
             // Suggest popup is disabled
-            if (value.isEmpty()) {
+            if (value == null || value.isEmpty()) {
                 // Suggest popup is re-enabled when text is empty
                 suggest = true;
             } else {
@@ -273,7 +272,7 @@
             }
         }
 
-        ObservableList<String> suggestedItems;
+        List<String> suggestedItems;
         suggestedItems = getSuggestedItems(value, value);
         // If the suggested list is empty, or contains a single element equals to the current value,
         // hide the popup
@@ -285,9 +284,12 @@
         }
     }
 
-    private ObservableList<String> getSuggestedItems(String filter, String currentValue) {
-        // filter equal to null means no filter
-        ObservableList<String> suggestedItems = FXCollections.observableArrayList();
+    private List<String> getSuggestedItems(String filter, String currentValue) {
+        List<String> suggestedItems = new ArrayList<>();
+        if (filter == null || currentValue == null) {
+            // Return the whole suggestedList
+            return suggestedList;
+        }
         // We don't want to be case sensitive
         assert filter != null;
         filter = filter.toLowerCase(Locale.ROOT);
@@ -306,9 +308,9 @@
         return suggestedItems;
     }
 
-    private void showPopup(ObservableList<String> suggestedItems) {
+    private void showPopup(List<String> suggestedItems) {
         if (!suggestedLv.getItems().equals(suggestedItems)) {
-            suggestedLv.setItems(suggestedItems);
+            suggestedLv.setItems(FXCollections.observableArrayList(suggestedItems));
         }
         if (entryField.getContextMenu().isShowing() == false) {
 //                System.out.println("showPopup");
--- a/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/panel/inspector/editors/BoundedDoubleEditor.fxml	Mon Jan 06 11:23:36 2014 +0200
+++ b/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/panel/inspector/editors/BoundedDoubleEditor.fxml	Tue Jan 07 12:06:59 2014 +0100
@@ -1,4 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
+
 <!--
   Copyright (c) 2012, 2014, Oracle and/or its affiliates.
   All rights reserved. Use is subject to license terms.
@@ -30,15 +31,13 @@
   (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
   OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 -->
+
 <?import java.lang.*?>
-<?import java.util.*?>
 <?import javafx.scene.control.*?>
 <?import javafx.scene.layout.*?>
-<?import javafx.scene.paint.*?>
 
-<HBox alignment="CENTER" prefHeight="-1.0" prefWidth="-1.0" spacing="5.0" xmlns:fx="http://javafx.com/fxml">
+<HBox alignment="CENTER" prefHeight="-1.0" prefWidth="-1.0" spacing="5.0" xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1">
   <children>
-    <Slider fx:id="slider" HBox.hgrow="ALWAYS" />
-    <TextField fx:id="textField" maxWidth="44.0" minWidth="44.0" prefColumnCount="12" prefWidth="44.0" HBox.hgrow="NEVER" />
+    <Slider fx:id="slider" HBox.hgrow="ALWAYS" /><StackPane fx:id="textSp" maxHeight="25.0" maxWidth="55.0" minHeight="25.0" minWidth="55.0" opacity="0.71" prefHeight="25.0" prefWidth="55.0" />
   </children>
 </HBox>
--- a/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/panel/inspector/editors/BoundedDoubleEditor.java	Mon Jan 06 11:23:36 2014 +0200
+++ b/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/panel/inspector/editors/BoundedDoubleEditor.java	Tue Jan 07 12:06:59 2014 +0100
@@ -33,6 +33,9 @@
 
 import com.oracle.javafx.scenebuilder.kit.metadata.property.ValuePropertyMetadata;
 import com.oracle.javafx.scenebuilder.kit.metadata.property.value.DoublePropertyMetadata;
+import java.util.ArrayList;
+import java.util.Locale;
+import java.util.Map;
 import java.util.Set;
 import javafx.beans.InvalidationListener;
 import javafx.beans.Observable;
@@ -42,21 +45,22 @@
 import javafx.scene.Node;
 import javafx.scene.Parent;
 import javafx.scene.control.Slider;
-import javafx.scene.control.TextField;
+import javafx.scene.layout.StackPane;
 
 /**
  * Editor for bounded double properties. (e.g. 0 &lt;= opacity &lt;= 1)
  *
- * 
+ *
  */
-public class BoundedDoubleEditor extends PropertyEditor {
+public class BoundedDoubleEditor extends AutoSuggestEditor {
 
     @FXML
     private Slider slider;
     @FXML
-    private TextField textField;
+    private StackPane textSp;
 
     private final Parent root;
+    private Map<String, Object> constants;
     // default min and max
     double min = 0;
     double max = 100;
@@ -65,8 +69,9 @@
     private boolean updateFromSlider = false;
 
     @SuppressWarnings("LeakingThisInConstructor")
-    public BoundedDoubleEditor(ValuePropertyMetadata propMeta, Set<Class<?>> selectedClasses) {
-        super(propMeta, selectedClasses);
+    public BoundedDoubleEditor(ValuePropertyMetadata propMeta, Set<Class<?>> selectedClasses, Map<String, Object> constantsMap) {
+        super(propMeta, selectedClasses, new ArrayList<>(constantsMap.keySet()), AutoSuggestEditor.Type.DOUBLE);
+        this.constants = constantsMap;
         root = EditorUtils.loadFxml("BoundedDoubleEditor.fxml", this); //NOI18N
 
         //
@@ -83,29 +88,35 @@
                     // nothing to do
                     return;
                 }
-                String valStr = textField.getText();
-                double valDouble;
-                try {
-                    valDouble = Double.parseDouble(valStr);
-                } catch (NumberFormatException e) {
-                    handleInvalidValue(valStr);
-                    return;
+
+                Object value = getValue();
+                if ((value == null)
+                        || !((DoublePropertyMetadata) getPropertyMeta()).isValidValue((Double) value)) {
+                    handleInvalidValue(getTextField().getText());
                 }
-                if (!((DoublePropertyMetadata) getPropertyMeta()).isValidValue(valDouble)) {
-                    handleInvalidValue(valDouble);
-                    return;
+                assert value instanceof Double;
+                double valDouble = (Double) value;
+                // Check if the entered value is a constant string
+                boolean isConstant = constants.get(getTextField().getText().toUpperCase(Locale.ROOT)) != null;
+                // Check if the entered value is a constant value
+                for (Map.Entry<String, Object> entry : constants.entrySet()) {
+                    if (value.equals(entry.getValue())) {
+                        isConstant = true;
+                        break;
+                    }
                 }
-                // If the value is less than the minimum, or more than the maximum,
+                // If the value is not a constant,
+                // and is less than the minimum, or more than the maximum,
                 // set the value to min or max
-                if (valDouble < min || valDouble > max) {
+                if (!isConstant && (valDouble < min || valDouble > max)) {
                     if (valDouble < min) {
                         valDouble = min;
                     } else if (valDouble > max) {
                         valDouble = max;
                     }
-                    textField.setText(EditorUtils.valAsStr(valDouble));
+                    getTextField().setText(EditorUtils.valAsStr(valDouble));
                 }
-                textField.selectAll();
+                getTextField().selectAll();
                 updateFromTextField = true;
                 slider.setValue(valDouble);
                 updateFromTextField = false;
@@ -133,7 +144,7 @@
                 // since the Slider may returns many decimals.
                 double value = EditorUtils.round(slider.getValue(), roundingFactor);
                 updateFromSlider = true;
-                textField.setText(EditorUtils.valAsStr(value));
+                getTextField().setText(EditorUtils.valAsStr(value));
                 updateFromSlider = false;
                 userUpdateValueProperty(value);
             }
@@ -142,7 +153,9 @@
 
     // Method to please FindBugs
     private void initialize(EventHandler<ActionEvent> onActionListener) {
-        setTextEditorBehavior(this, textField, onActionListener, false);
+        // Add the AutoSuggest text field in the scene graph
+        textSp.getChildren().add(super.getRoot());
+        setTextEditorBehavior(this, getTextField(), onActionListener, false);
     }
 
     @Override
@@ -152,7 +165,21 @@
 
     @Override
     public Object getValue() {
-        return getValueFromTextField();
+        String val = getTextField().getText();
+        if (val.isEmpty()) {
+            val = "0"; //NOI18N
+            getTextField().setText(val);
+            return new Double(val);
+        }
+        Object constantValue = constants.get(val.toUpperCase(Locale.ROOT));
+        if (constantValue != null) {
+            val = EditorUtils.valAsStr(constantValue);
+        }
+        try {
+            return Double.parseDouble(val);
+        } catch (NumberFormatException e) {
+            return null;
+        }
     }
 
     @Override
@@ -164,29 +191,25 @@
 
         assert (value instanceof Double);
         slider.setValue((Double) value);
-        textField.setText(EditorUtils.valAsStr(value));
+        // Get the corresponding constant if any
+        for (Map.Entry<String, Object> entry : constants.entrySet()) {
+            if (value.equals(entry.getValue())) {
+                value = entry.getKey();
+            }
+        }
+        getTextField().setText(EditorUtils.valAsStr(value));
     }
 
-    @Override
-    public void reset(ValuePropertyMetadata propMeta, Set<Class<?>> selectedClasses) {
-        super.reset(propMeta, selectedClasses);
+    public void reset(ValuePropertyMetadata propMeta, Set<Class<?>> selectedClasses,
+            Map<String, Object> constants) {
+        super.reset(propMeta, selectedClasses, new ArrayList<>(constants.keySet()));
+        this.constants = constants;
         configureSlider(propMeta);
     }
 
     @Override
     protected void valueIsIndeterminate() {
-        handleIndeterminate(textField);
-    }
-
-    private double getValueFromTextField() {
-        double valueTextField = 0;
-        try {
-            valueTextField = Double.parseDouble(textField.getText());
-        } catch (NumberFormatException e) {
-            // should not happen: already checked in text field listener
-            assert false;
-        }
-        return valueTextField;
+        handleIndeterminate(getTextField());
     }
 
     private void configureSlider(ValuePropertyMetadata propMeta) {
@@ -210,7 +233,7 @@
 
             @Override
             public void run() {
-                textField.requestFocus();
+                getTextField().requestFocus();
             }
         });
     }
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/panel/inspector/editors/ColumnResizePolicyEditor.java	Tue Jan 07 12:06:59 2014 +0100
@@ -0,0 +1,84 @@
+/*
+ * Copyright (c) 2012, 2014, Oracle and/or its affiliates.
+ * All rights reserved. Use is subject to license terms.
+ *
+ * This file is available and licensed under the following license:
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *  - Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ *  - Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in
+ *    the documentation and/or other materials provided with the distribution.
+ *  - Neither the name of Oracle Corporation nor the names of its
+ *    contributors may be used to endorse or promote products derived
+ *    from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+package com.oracle.javafx.scenebuilder.kit.editor.panel.inspector.editors;
+
+import com.oracle.javafx.scenebuilder.kit.metadata.property.ValuePropertyMetadata;
+import com.oracle.javafx.scenebuilder.kit.metadata.property.value.TableViewResizePolicyPropertyMetadata;
+import java.util.Set;
+import javafx.scene.control.TableView;
+import javafx.scene.control.TreeTableView;
+
+/**
+ * Editor for TableView columnResizePolicy property.
+ */
+public class ColumnResizePolicyEditor extends EnumEditor {
+
+    boolean isTableView;
+
+    public ColumnResizePolicyEditor(ValuePropertyMetadata propMeta, Set<Class<?>> selectedClasses) {
+        super(propMeta, selectedClasses);
+        isTableView = propMeta instanceof TableViewResizePolicyPropertyMetadata;
+    }
+
+    @Override
+    public Object getValue() {
+        String policy = getChoiceBox().getSelectionModel().getSelectedItem();
+        if (isTableView) {
+            if (policy.equals(TableView.UNCONSTRAINED_RESIZE_POLICY.toString())) {
+                return TableView.UNCONSTRAINED_RESIZE_POLICY;
+            } else {
+                return TableView.CONSTRAINED_RESIZE_POLICY;
+            }
+        } else {
+            if (policy.equals(TreeTableView.UNCONSTRAINED_RESIZE_POLICY.toString())) {
+                return TreeTableView.UNCONSTRAINED_RESIZE_POLICY;
+            } else {
+                return TreeTableView.CONSTRAINED_RESIZE_POLICY;
+            }
+        }
+    }
+
+
+   @Override
+    public void reset(ValuePropertyMetadata propMeta, Set<Class<?>> selectedClasses) {
+        super.reset(propMeta, selectedClasses);
+        isTableView = propMeta instanceof TableViewResizePolicyPropertyMetadata;
+    }
+
+    @Override
+    protected void updateItems() {
+        getChoiceBox().getItems().clear();
+        getChoiceBox().getItems().add(TableView.UNCONSTRAINED_RESIZE_POLICY.toString());
+        getChoiceBox().getItems().add(TableView.CONSTRAINED_RESIZE_POLICY.toString());
+    }
+
+}
--- a/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/panel/inspector/editors/CursorEditor.java	Mon Jan 06 11:23:36 2014 +0200
+++ b/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/panel/inspector/editors/CursorEditor.java	Tue Jan 07 12:06:59 2014 +0100
@@ -40,7 +40,6 @@
 import java.net.MalformedURLException;
 import java.util.Arrays;
 import java.util.Map;
-import java.util.Map.Entry;
 import java.util.Set;
 import javafx.event.ActionEvent;
 import javafx.event.EventHandler;
@@ -90,7 +89,7 @@
             public void handle(ActionEvent event) {
                 try {
                     cursor = new ImageCursor(new Image(imagePathTf.getText()));
-                } catch (NullPointerException  | IllegalArgumentException ex) {
+                } catch (NullPointerException | IllegalArgumentException ex) {
                     handleInvalidValue(imagePathTf.getText());
                     return;
                 }
@@ -103,15 +102,22 @@
     // Separate method to please FindBugs
     private void initialize(EventHandler<ActionEvent> valueListener) {
         setTextEditorBehavior(this, imagePathTf, valueListener);
+        // We do not want the valueListener is called when reset to default
+        setCommitListener(null);
         imagePathTfEnabled(false);
 
         int index = 0;
         Map<Cursor, String> predefinedCursors = CursorPropertyMetadata.getCursorMap();
-        for (Entry<Cursor, String> entry : predefinedCursors.entrySet()) {
-            String cursorStr = entry.getValue();
+        // Order the cursors
+        Cursor[] cursorList = {Cursor.DEFAULT, Cursor.CLOSED_HAND, Cursor.OPEN_HAND, Cursor.HAND, Cursor.MOVE, Cursor.WAIT,
+            Cursor.TEXT, Cursor.V_RESIZE, Cursor.H_RESIZE, Cursor.N_RESIZE, Cursor.NE_RESIZE, Cursor.E_RESIZE, Cursor.SE_RESIZE,
+            Cursor.S_RESIZE, Cursor.SW_RESIZE, Cursor.W_RESIZE, Cursor.NW_RESIZE,
+            Cursor.CROSSHAIR, Cursor.NONE, Cursor.DISAPPEAR};
+        for (Cursor cursorObj : cursorList) {
+            String cursorStr = predefinedCursors.get(cursorObj);
             final Label cursorLabel = new Label(cursorStr);
 //            cursorLabel.setPrefWidth(150.0);
-            cursorLabel.setCursor(entry.getKey());
+            cursorLabel.setCursor(cursorObj);
             CheckMenuItem menuItem = new CheckMenuItem();
             menuItem.setGraphic(cursorLabel);
             // add predefined cursors before "Choose image" menu item
--- a/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/panel/inspector/editors/EditorUtils.java	Mon Jan 06 11:23:36 2014 +0200
+++ b/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/panel/inspector/editors/EditorUtils.java	Tue Jan 07 12:06:59 2014 +0100
@@ -164,16 +164,6 @@
         }
     }
 
-    public static void replaceMenuItem(MenuItem item, MenuItem newItem) {
-        ContextMenu menu = item.getParentPopup();
-        if (menu == null) {
-            // menu item to replace is not in the menu : do nothing
-            return;
-        }
-        int index = menu.getItems().indexOf(item);
-        menu.getItems().set(index, newItem);
-    }
-
     public static String valAsStr(Object val) {
         if (val == null) {
             return null;
--- a/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/panel/inspector/editors/EnumEditor.java	Mon Jan 06 11:23:36 2014 +0200
+++ b/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/panel/inspector/editors/EnumEditor.java	Tue Jan 07 12:06:59 2014 +0100
@@ -61,6 +61,10 @@
                 }
             }
         });
+        initialize();
+    }
+    
+    private void initialize() {
         updateItems();
     }
 
@@ -100,7 +104,11 @@
         handleIndeterminate(choiceBox);
     }
 
-    private void updateItems() {
+    protected ChoiceBox<String> getChoiceBox() {
+        return choiceBox;
+    }
+    
+    protected void updateItems() {
         assert getPropertyMeta() instanceof EnumerationPropertyMetadata;
         final EnumerationPropertyMetadata enumPropMeta 
                 = (EnumerationPropertyMetadata) getPropertyMeta();
--- a/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/panel/inspector/editors/EventHandlerEditor.java	Mon Jan 06 11:23:36 2014 +0200
+++ b/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/panel/inspector/editors/EventHandlerEditor.java	Tue Jan 07 12:06:59 2014 +0100
@@ -34,6 +34,7 @@
 import com.oracle.javafx.scenebuilder.kit.editor.i18n.I18N;
 import com.oracle.javafx.scenebuilder.kit.metadata.property.ValuePropertyMetadata;
 import com.oracle.javafx.scenebuilder.kit.util.JavaLanguage;
+import java.util.ArrayList;
 import java.util.List;
 import java.util.Set;
 import javafx.event.ActionEvent;
@@ -60,21 +61,23 @@
     private boolean methodNameMode;
     private StackPane root = new StackPane();
     private HBox hbox = null;
+    private List<String> suggestedMethods;
 
     @SuppressWarnings("LeakingThisInConstructor")
     public EventHandlerEditor(ValuePropertyMetadata propMeta, Set<Class<?>> selectedClasses, List<String> suggestedMethods) {
         super(propMeta, selectedClasses, suggestedMethods); //NOI18N
+        this.suggestedMethods = suggestedMethods;
 
         // text field events handling
         EventHandler<ActionEvent> onActionListener = new EventHandler<ActionEvent>() {
             @Override
             public void handle(ActionEvent event) {
-                String tfValue = textField.getText();
-                if (tfValue.isEmpty()) {
+                String tfValue = getTextField().getText();
+                if (tfValue == null || tfValue.isEmpty()) {
                     userUpdateValueProperty(null);
                     return;
                 }
-                if (!tfValue.isEmpty() && methodNameMode) {
+                if (methodNameMode) {
                     // method name should be a java identifier
                     if (!JavaLanguage.isIdentifier(tfValue)) {
                         System.err.println(I18N.getString("inspector.event.invalid.method", tfValue)); // Will go in message panel
@@ -85,37 +88,29 @@
                 Object value = getValue();
                 assert value instanceof String;
                 userUpdateValueProperty((String) value);
-                textField.selectAll();
+                getTextField().selectAll();
             }
         };
-        setTextEditorBehavior(this, textField, onActionListener);
+        setTextEditorBehavior(this, getTextField(), onActionListener);
 
         scriptMenuItem.setOnAction(new EventHandler<ActionEvent>() {
             @Override
             public void handle(ActionEvent e) {
-                Object valueObj = getValue();
-                assert valueObj instanceof String;
-                String value = (String) valueObj;
-                assert value.startsWith(HASH_STR);
-                // Remove '#'
-                value = value.substring(1);
-                setValue(value);
+                getTextField().setText(null);
+                userUpdateValueProperty(null);
+                switchToScriptMode();
             }
         });
 
         controllerMethodMenuItem.setOnAction(new EventHandler<ActionEvent>() {
             @Override
             public void handle(ActionEvent e) {
-                Object valueObj = getValue();
-                assert valueObj instanceof String;
-                String value = (String) valueObj;
-                assert !value.startsWith(HASH_STR);
-                // Add '#'
-                value = HASH_STR + value;
-                setValue(value);
+                getTextField().setText(null);
+                userUpdateValueProperty(null);
+                switchToMethodNameMode();
             }
         });
-        getMenu().getItems().add(scriptMenuItem);
+        getMenu().getItems().add(controllerMethodMenuItem);
 
         // methodeName mode by default
         switchToMethodNameMode();
@@ -123,14 +118,15 @@
 
     @Override
     public Object getValue() {
-        if (textField.getText().isEmpty()) {
-            return "";
+        String valueTf = getTextField().getText();
+        if (valueTf == null || valueTf.isEmpty()) {
+            return null; // default value
         }
         String value;
         if (methodNameMode) {
-            value = HASH_STR + textField.getText();
+            value = HASH_STR + getTextField().getText();
         } else {
-            value = textField.getText();
+            value = getTextField().getText();
         }
 //        System.out.println("EventHandlerEditor : getValue() returns: '" + value + "'");
         return value;
@@ -149,7 +145,7 @@
             if (!methodNameMode) {
                 switchToMethodNameMode();
             }
-            valueStr = ""; //NOI18N
+            valueStr = null;
         } else {
             assert value instanceof String;
             valueStr = (String) value;
@@ -162,7 +158,7 @@
                 switchToScriptMode();
             }
         }
-        textField.setText(valueStr);
+        getTextField().setText(valueStr);
     }
 
     @Override
@@ -181,26 +177,28 @@
         hbox.setAlignment(Pos.CENTER);
         Label hashLabel = new Label(HASH_STR);
         hashLabel.setMinWidth(10);
-        hbox.getChildren().addAll(hashLabel, textField);
-        HBox.setHgrow(textField, Priority.ALWAYS);
+        hbox.getChildren().addAll(hashLabel, getRoot());
+        HBox.setHgrow(getTextField(), Priority.ALWAYS);
         root.getChildren().clear();
         root.getChildren().add(hbox);
     }
 
     private void unwrapHBox() {
         root.getChildren().clear();
-        root.getChildren().add(textField);
+        root.getChildren().add(getRoot());
     }
 
     private void switchToMethodNameMode() {
         methodNameMode = true;
-        EditorUtils.replaceMenuItem(controllerMethodMenuItem, scriptMenuItem);
+        resetSuggestedList(suggestedMethods);
+        replaceMenuItem(controllerMethodMenuItem, scriptMenuItem);
         wrapInHBox();
     }
 
     private void switchToScriptMode() {
         methodNameMode = false;
-        EditorUtils.replaceMenuItem(scriptMenuItem, controllerMethodMenuItem);
+        resetSuggestedList(new ArrayList<>());
+        replaceMenuItem(scriptMenuItem, controllerMethodMenuItem);
         unwrapHBox();
     }
 }
--- a/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/panel/inspector/editors/FxIdEditor.java	Mon Jan 06 11:23:36 2014 +0200
+++ b/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/panel/inspector/editors/FxIdEditor.java	Tue Jan 07 12:06:59 2014 +0100
@@ -67,7 +67,7 @@
                         return;
                     }
                 }
-                userUpdateValueProperty(value);
+                userUpdateValueProperty(value.isEmpty() ? null : value);
                 textField.selectAll();
             }
         };
@@ -75,6 +75,6 @@
     }
     
     public void reset(List<String> suggestedFxIds) {
-        super.reset(PROPERTY_NAME, DEFAULT_VALUE, suggestedFxIds);
+        reset(PROPERTY_NAME, DEFAULT_VALUE, suggestedFxIds);
     }
 }
--- a/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/panel/inspector/editors/I18nStringEditor.java	Mon Jan 06 11:23:36 2014 +0200
+++ b/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/panel/inspector/editors/I18nStringEditor.java	Tue Jan 07 12:06:59 2014 +0100
@@ -86,7 +86,7 @@
             public void handle(ActionEvent e) {
                 setValue(PERCENT_STR + I18N.getString("inspector.i18n.dummykey"));
                 I18nStringEditor.this.getCommitListener().handle(null);
-                EditorUtils.replaceMenuItem(i18nOnMenuItem, i18nOffMenuItem);
+                replaceMenuItem(i18nOnMenuItem, i18nOffMenuItem);
                 multilineMenuItem.setDisable(true);
             }
         });
@@ -95,7 +95,7 @@
             public void handle(ActionEvent e) {
                 setValue(""); //NOI18N
                 I18nStringEditor.this.getCommitListener().handle(null);
-                EditorUtils.replaceMenuItem(i18nOffMenuItem, i18nOnMenuItem);
+                replaceMenuItem(i18nOffMenuItem, i18nOnMenuItem);
                 multilineMenuItem.setDisable(false);
             }
         });
@@ -127,9 +127,8 @@
         }
 
         if (value == null) {
-            // We consider a null string property as an empty string
-            // TBD: should not be defined here !
-            value = ""; //NOI18N
+            textNode.setText(null);
+            return;
         }
         assert value instanceof String;
         String val = (String) value;
--- a/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/panel/inspector/editors/PropertyEditor.java	Mon Jan 06 11:23:36 2014 +0200
+++ b/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/panel/inspector/editors/PropertyEditor.java	Tue Jan 07 12:06:59 2014 +0100
@@ -238,6 +238,12 @@
         return menu;
     }
 
+    public void replaceMenuItem(MenuItem item, MenuItem newItem) {
+        MenuButton cogMenu = getMenu();
+        int index = cogMenu.getItems().indexOf(item);
+        cogMenu.getItems().set(index, newItem);
+    }
+
     public void setPropertyMetadata(ValuePropertyMetadata propMeta) {
         this.propMeta = propMeta;
     }
--- a/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/panel/inspector/editors/StyleClassEditor.java	Mon Jan 06 11:23:36 2014 +0200
+++ b/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/panel/inspector/editors/StyleClassEditor.java	Tue Jan 07 12:06:59 2014 +0100
@@ -160,7 +160,7 @@
      *
      ***************************************************************************
      */
-    public class StyleClassItem extends AutoSuggestEditor implements EditorItem {
+    private class StyleClassItem extends AutoSuggestEditor implements EditorItem {
 
         @FXML
         private Button plusBt;
--- a/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/panel/inspector/editors/StyleEditor.java	Mon Jan 06 11:23:36 2014 +0200
+++ b/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/panel/inspector/editors/StyleEditor.java	Tue Jan 07 12:06:59 2014 +0100
@@ -182,7 +182,7 @@
      *
      ***************************************************************************
      */
-    public class StyleItem extends AutoSuggestEditor implements EditorItem {
+    private class StyleItem extends AutoSuggestEditor implements EditorItem {
 
         @FXML
         private Button plusBt;
--- a/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/panel/inspector/editors/StylesheetEditor.java	Mon Jan 06 11:23:36 2014 +0200
+++ b/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/panel/inspector/editors/StylesheetEditor.java	Tue Jan 07 12:06:59 2014 +0100
@@ -271,7 +271,7 @@
      *
      ***************************************************************************
      */
-    public class StylesheetItem implements EditorItem {
+    private class StylesheetItem implements EditorItem {
 
         @FXML
         private Button plusBt;
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/panel/inspector/popupeditors/EffectPopupEditor.java	Tue Jan 07 12:06:59 2014 +0100
@@ -0,0 +1,99 @@
+/*
+ * Copyright (c) 2012, 2014, Oracle and/or its affiliates.
+ * All rights reserved. Use is subject to license terms.
+ *
+ * This file is available and licensed under the following license:
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *  - Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ *  - Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in
+ *    the documentation and/or other materials provided with the distribution.
+ *  - Neither the name of Oracle Corporation nor the names of its
+ *    contributors may be used to endorse or promote products derived
+ *    from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+package com.oracle.javafx.scenebuilder.kit.editor.panel.inspector.popupeditors;
+
+import com.oracle.javafx.scenebuilder.kit.metadata.property.ValuePropertyMetadata;
+import com.oracle.javafx.scenebuilder.kit.util.control.effectpicker.EffectPicker;
+import java.util.List;
+import java.util.Set;
+import javafx.beans.value.ChangeListener;
+import javafx.beans.value.ObservableValue;
+import javafx.scene.control.MenuItem;
+import javafx.scene.effect.Effect;
+
+/**
+ * Popup editor for the Effect property.
+ */
+public class EffectPopupEditor extends PopupEditor {
+
+    private final EffectPicker effectPicker = new EffectPicker();
+    private final List<MenuItem> effectMenuItems;
+
+    private final ChangeListener<Effect> effectChangeListener = new ChangeListener<Effect>() {
+        @Override
+        public void changed(ObservableValue<? extends Effect> ov, Effect oldValue, Effect newValue) {
+            final String valueAsString = effectPicker.getEffectPath();
+            commitValue(newValue, valueAsString);
+            // Refresh MenuButton items if needed
+            updateMenuButton(newValue);
+            displayValueAsString(valueAsString);
+        }
+    };
+
+    @SuppressWarnings("LeakingThisInConstructor")
+    public EffectPopupEditor(ValuePropertyMetadata propMeta, Set<Class<?>> selectedClasses) {
+        super(propMeta, selectedClasses);
+        plugEditor(this, effectPicker);
+        effectMenuItems = effectPicker.getMenuItems();
+    }
+
+    @Override
+    public void setPopupContentValue(Object value) {
+        assert value == null || value instanceof Effect;
+        effectPicker.rootEffectProperty().removeListener(effectChangeListener);
+        effectPicker.setRootEffectProperty((Effect) value);
+        // Refresh MenuButton items if needed
+        updateMenuButton((Effect) value);
+        effectPicker.rootEffectProperty().addListener(effectChangeListener);
+        // Update the menu button string
+        displayValueAsString(effectPicker.getEffectPath());
+    }
+
+    @Override
+    public void resetPopupContent() {
+        effectPicker.reset();
+    }
+
+    private void updateMenuButton(Effect value) {
+        if (value != null) {
+            if (popupMb.getItems().contains(popupMenuItem) == false) {
+                popupMb.getItems().removeAll(effectMenuItems);
+                popupMb.getItems().add(popupMenuItem);
+            }
+        } else {
+            if (popupMb.getItems().contains(popupMenuItem) == true) {
+                popupMb.getItems().addAll(effectMenuItems);
+                popupMb.getItems().remove(popupMenuItem);
+            }
+        }
+    }
+}
--- a/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/panel/inspector/popupeditors/PopupEditor.fxml	Mon Jan 06 11:23:36 2014 +0200
+++ b/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/panel/inspector/popupeditors/PopupEditor.fxml	Tue Jan 07 12:06:59 2014 +0100
@@ -1,4 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
+
 <!--
   Copyright (c) 2012, 2014, Oracle and/or its affiliates.
   All rights reserved. Use is subject to license terms.
@@ -39,7 +40,7 @@
   <children>
     <MenuButton fx:id="popupMb" maxWidth="1.7976931348623157E308" mnemonicParsing="false" prefHeight="-1.0" prefWidth="-1.0" text="value">
       <items>
-        <CustomMenuItem hideOnClick="false" mnemonicParsing="false" text="Unspecified Action">
+        <CustomMenuItem hideOnClick="false" mnemonicParsing="false" text="Unspecified Action" fx:id="popupMenuItem">
           <content>
             <StackPane fx:id="editorHost" prefHeight="-1.0" prefWidth="-1.0" />
           </content>
--- a/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/panel/inspector/popupeditors/PopupEditor.java	Mon Jan 06 11:23:36 2014 +0200
+++ b/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/panel/inspector/popupeditors/PopupEditor.java	Tue Jan 07 12:06:59 2014 +0100
@@ -37,7 +37,7 @@
 import java.util.Set;
 import javafx.fxml.FXML;
 import javafx.scene.Node;
-import javafx.scene.Parent;
+import javafx.scene.control.CustomMenuItem;
 import javafx.scene.control.MenuButton;
 import javafx.scene.layout.Pane;
 
@@ -51,6 +51,9 @@
     MenuButton popupMb;
 
     @FXML
+    CustomMenuItem popupMenuItem;
+
+    @FXML
     Pane editorHost;
 
     private PopupEditor editor;
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/panel/inspector/popupeditors/Rectangle2DPopupEditor.fxml	Tue Jan 07 12:06:59 2014 +0100
@@ -0,0 +1,79 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<!--
+  Copyright (c) 2012, 2014, Oracle and/or its affiliates.
+  All rights reserved. Use is subject to license terms.
+
+  This file is available and licensed under the following license:
+
+  Redistribution and use in source and binary forms, with or without
+  modification, are permitted provided that the following conditions
+  are met:
+
+  - Redistributions of source code must retain the above copyright
+    notice, this list of conditions and the following disclaimer.
+  - Redistributions in binary form must reproduce the above copyright
+    notice, this list of conditions and the following disclaimer in
+    the documentation and/or other materials provided with the distribution.
+  - Neither the name of Oracle Corporation nor the names of its
+    contributors may be used to endorse or promote products derived
+    from this software without specific prior written permission.
+
+  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+  "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+  LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+  A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+  OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+  SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+  LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+  DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+  THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+  OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+-->
+
+<?import com.oracle.javafx.scenebuilder.kit.editor.panel.inspector.editors.*?>
+<?import java.lang.*?>
+<?import javafx.scene.control.*?>
+<?import javafx.scene.layout.*?>
+<?scenebuilder-classpath-element ../../../../../../../../../../dist/SceneBuilderKit.jar?>
+
+<GridPane hgap="7.0" maxHeight="1.7976931348623157E308" maxWidth="1.7976931348623157E308" stylesheets="@../Inspector.css" vgap="5.0" xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1">
+    <children>
+        <Label maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" text="min" />
+        <Label maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" text="size" GridPane.rowIndex="1" />
+        <VBox alignment="CENTER" GridPane.columnIndex="1" HBox.hgrow="ALWAYS">
+            <children>
+                <Label styleClass="label, small-label" text="X" />
+                <DoubleField fx:id="minXDf" prefWidth="50.0"/>
+            </children>
+        </VBox>
+        <VBox alignment="CENTER" GridPane.columnIndex="2" HBox.hgrow="ALWAYS">
+            <children>
+                <Label styleClass="label, small-label" text="Y" />
+                <DoubleField fx:id="minYDf"  prefWidth="50.0"/>
+            </children>
+        </VBox>
+        <VBox alignment="CENTER" GridPane.columnIndex="1" GridPane.rowIndex="1" HBox.hgrow="ALWAYS">
+            <children>
+                <Label styleClass="label, small-label" text="Width" />
+                <DoubleField fx:id="widthDf"  prefWidth="50.0"/>
+            </children>
+        </VBox>
+        <VBox alignment="CENTER" GridPane.columnIndex="2" GridPane.rowIndex="1" HBox.hgrow="ALWAYS">
+            <children>
+                <Label styleClass="label, small-label" text="Height" />
+                <DoubleField fx:id="heightDf"  prefWidth="50.0"/>
+            </children>
+        </VBox>
+    </children>
+    <columnConstraints>
+        <ColumnConstraints halignment="RIGHT" hgrow="SOMETIMES" maxWidth="-Infinity" minWidth="-Infinity" />
+        <ColumnConstraints hgrow="ALWAYS" maxWidth="-Infinity" minWidth="-Infinity" />
+        <ColumnConstraints hgrow="ALWAYS" maxWidth="-Infinity" minWidth="-Infinity" />
+    </columnConstraints>
+    <rowConstraints>
+        <RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" valignment="BOTTOM"/>
+        <RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" valignment="BOTTOM"/>
+    </rowConstraints>
+</GridPane>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/panel/inspector/popupeditors/Rectangle2DPopupEditor.java	Tue Jan 07 12:06:59 2014 +0100
@@ -0,0 +1,159 @@
+/*
+ * Copyright (c) 2012, 2014, Oracle and/or its affiliates.
+ * All rights reserved. Use is subject to license terms.
+ *
+ * This file is available and licensed under the following license:
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *  - Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ *  - Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in
+ *    the documentation and/or other materials provided with the distribution.
+ *  - Neither the name of Oracle Corporation nor the names of its
+ *    contributors may be used to endorse or promote products derived
+ *    from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+package com.oracle.javafx.scenebuilder.kit.editor.panel.inspector.popupeditors;
+
+import com.oracle.javafx.scenebuilder.kit.editor.i18n.I18N;
+import com.oracle.javafx.scenebuilder.kit.editor.panel.inspector.editors.DoubleField;
+import com.oracle.javafx.scenebuilder.kit.editor.panel.inspector.editors.EditorUtils;
+import com.oracle.javafx.scenebuilder.kit.metadata.property.ValuePropertyMetadata;
+import java.util.Set;
+import javafx.event.ActionEvent;
+import javafx.event.EventHandler;
+import javafx.fxml.FXML;
+import javafx.geometry.Rectangle2D;
+import javafx.scene.Parent;
+
+/**
+ * Rectangle2D popup editor. Used for ImageView/MediaView viewPort property.
+ */
+public class Rectangle2DPopupEditor extends PopupEditor {
+
+    @FXML
+    DoubleField minXDf;
+    @FXML
+    DoubleField minYDf;
+    @FXML
+    DoubleField widthDf;
+    @FXML
+    DoubleField heightDf;
+
+    DoubleField[] doubleFields = new DoubleField[4];
+    private final Parent root;
+    private Rectangle2D rectangle2D;
+
+    @SuppressWarnings("LeakingThisInConstructor")
+    public Rectangle2DPopupEditor(ValuePropertyMetadata propMeta, Set<Class<?>> selectedClasses) {
+        super(propMeta, selectedClasses);
+        root = EditorUtils.loadPopupFxml("Rectangle2DPopupEditor.fxml", this); //NOI18N
+        initialize();
+    }
+
+    // Method to please FindBugs
+    private void initialize() {
+        doubleFields[0] = minXDf;
+        doubleFields[1] = minYDf;
+        doubleFields[2] = widthDf;
+        doubleFields[3] = heightDf;
+        for (DoubleField doubleField : doubleFields) {
+            EventHandler<ActionEvent> valueListener = new EventHandler<ActionEvent>() {
+                @Override
+                public void handle(ActionEvent event) {
+                    commitValue(getValue(), getValueAsString());
+                    displayValueAsString(getValueAsString());
+                }
+            };
+            setNumericEditorBehavior(this, doubleField, valueListener, false);
+        }
+
+        // Plug to the menu button.
+        plugEditor(this, root);
+    }
+
+    private String getValueAsString() {
+        String valueAsString;
+        if (isIndeterminate()) {
+            valueAsString = "-"; //NOI18N
+        } else {
+            if (rectangle2D == null) {
+                valueAsString = I18N.getString("inspector.rectangle2D.not.defined");
+            } else {
+                valueAsString = EditorUtils.valAsStr(rectangle2D.getMinX()) + "," //NOI18N
+                        + EditorUtils.valAsStr(rectangle2D.getMinY())
+                        + "  " + EditorUtils.valAsStr(rectangle2D.getWidth()) //NOI18N
+                        + "x" + EditorUtils.valAsStr(rectangle2D.getHeight()); //NOI18N
+            }
+        }
+        return valueAsString;
+    }
+
+    @Override
+    public Object getValue() {
+        Double[] values = new Double[4];
+        int index = 0;
+        for (DoubleField doubleField : doubleFields) {
+            String val = doubleField.getText();
+            if (val.isEmpty()) {
+                val = "0"; //NOI18N
+            } else {
+                try {
+                    Double.parseDouble(val);
+                } catch (NumberFormatException e) {
+                    // should not happen, DoubleField should prevent any error
+                    return null;
+                }
+            }
+            values[index] = new Double(val);
+            index++;
+        }
+        rectangle2D = new Rectangle2D(values[0], values[1], values[2], values[3]);
+        return rectangle2D;
+    }
+
+    //
+    // Interface PopupEditor.InputValue.
+    // Methods called by PopupEditor.
+    //
+    @Override
+    public void setPopupContentValue(Object value) {
+        if (value == null) {
+            for (DoubleField doubleField : doubleFields) {
+                doubleField.setText(""); //NOI18N
+            }
+        } else {
+            assert value instanceof Rectangle2D;
+            rectangle2D = (Rectangle2D) value;
+            minXDf.setText(EditorUtils.valAsStr(rectangle2D.getMinX()));
+            minYDf.setText(EditorUtils.valAsStr(rectangle2D.getMinY()));
+            widthDf.setText(EditorUtils.valAsStr(rectangle2D.getWidth()));
+            heightDf.setText(EditorUtils.valAsStr(rectangle2D.getHeight()));
+        }
+
+        // Update the menu button string
+        displayValueAsString(getValueAsString());
+    }
+
+    @Override
+    public void resetPopupContent() {
+        rectangle2D = null;
+        setPopupContentValue(null);
+    }
+}
--- a/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/panel/library/LibraryPanelController.java	Mon Jan 06 11:23:36 2014 +0200
+++ b/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/panel/library/LibraryPanelController.java	Tue Jan 07 12:06:59 2014 +0100
@@ -157,6 +157,7 @@
     
     /**
      * @treatAsPrivate Perform the import of the selection
+     * @param objects the FXOM objects to import to customize the Library content.
      */
     public void performImportSelection(List<FXOMObject> objects) {
         processInternalImport(objects);
--- a/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/panel/util/AbstractWindowController.java	Mon Jan 06 11:23:36 2014 +0200
+++ b/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/panel/util/AbstractWindowController.java	Tue Jan 07 12:06:59 2014 +0100
@@ -31,6 +31,7 @@
  */
 package com.oracle.javafx.scenebuilder.kit.editor.panel.util;
 
+import java.util.List;
 import javafx.application.Platform;
 import javafx.event.EventHandler;
 import javafx.geometry.Rectangle2D;
@@ -231,5 +232,53 @@
         }
     }
 
+    protected Rectangle2D getBiggestViewableRectangle() {
+        assert stage != null;
+        
+        Rectangle2D res;
+        
+        if (Screen.getScreens().size() == 1) {
+            res = Screen.getPrimary().getVisualBounds();
+        } else {
+            Rectangle2D stageRect = new Rectangle2D(stage.getX(), stage.getY(), stage.getWidth(), stage.getHeight());
+            List<Screen> screens = Screen.getScreensForRectangle(stageRect);
+            
+            // The stage is entirely rendered on one screen, which is either the
+            // primary one or not, we don't care here.
+//            if (screens.size() == 1) {
+                res = screens.get(0).getVisualBounds();
+//            } else {
+                // The stage is spread over several screens.
+                // We compute the surface of the stage on each on the involved
+                // screen to select the biggest one == still to be implemented.
+//                TreeMap<String, Screen> sortedScreens = new TreeMap<>();
+//                
+//                for (Screen screen : screens) {
+//                    computeSurface(screen, stageRect, sortedScreens);
+//                }
+//                
+//                res = sortedScreens.get(sortedScreens.lastKey()).getVisualBounds();
+//            }
+        }
+        
+        return res;
+    }
+
+    // Compute the percentage of the surface of stageRect which is rendered in
+    // the given screen and write the result in sortedScreens (percentage is
+    // rounded and turned into a String so that we benefit natural order sorting.
+//    private void computeSurface(Screen screen, Rectangle2D stageRect, TreeMap<String, Screen> sortedScreens) {
+//        Rectangle2D screenBounds = screen.getVisualBounds();
+//        double surfaceX, surfaceY, surfaceW, surfaceH;
+//        if (screenBounds.getMinX() < stageRect.getMinX()) {
+//            if (screenBounds.getMinX() < 0) {
+//                surfaceX = stageRect.getMinX();
+//            } else {
+//                surfaceX = screenBounds.getMinX();
+//            }
+//        } else {
+//            
+//        }
+//    }
 
 }
--- a/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/panel/util/dialog/AbstractModalDialog.java	Mon Jan 06 11:23:36 2014 +0200
+++ b/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/panel/util/dialog/AbstractModalDialog.java	Tue Jan 07 12:06:59 2014 +0100
@@ -247,23 +247,15 @@
     
     /*
      * To be subclassed #2
-     * 
-     * Those methods cannot be declared abstract else we fall in RT-34146.
      */
     @FXML
-    protected void okButtonPressed(ActionEvent e) {
-        
-    }
+    protected abstract void okButtonPressed(ActionEvent e);
     
     @FXML
-    protected void cancelButtonPressed(ActionEvent e) {
-        
-    }
+    protected abstract void cancelButtonPressed(ActionEvent e);
     
     @FXML
-    protected void actionButtonPressed(ActionEvent e) {
-        
-    }
+    protected abstract void actionButtonPressed(ActionEvent e);
     
     
     /*
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/fxom/FXOMBuilderFactory.java	Tue Jan 07 12:06:59 2014 +0100
@@ -0,0 +1,71 @@
+/*
+ * Copyright (c) 2012, 2014, Oracle and/or its affiliates.
+ * All rights reserved. Use is subject to license terms.
+ *
+ * This file is available and licensed under the following license:
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *  - Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ *  - Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in
+ *    the documentation and/or other materials provided with the distribution.
+ *  - Neither the name of Oracle Corporation nor the names of its
+ *    contributors may be used to endorse or promote products derived
+ *    from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+package com.oracle.javafx.scenebuilder.kit.fxom;
+
+import com.oracle.javafx.scenebuilder.kit.util.Deprecation;
+import java.net.URL;
+import javafx.fxml.JavaFXBuilderFactory;
+import javafx.scene.image.Image;
+import javafx.util.Builder;
+import javafx.util.BuilderFactory;
+
+/**
+ *
+ */
+class FXOMBuilderFactory implements BuilderFactory {
+
+    final JavaFXBuilderFactory delegate;
+    
+    public FXOMBuilderFactory(ClassLoader classLoader) {
+        assert classLoader != null;
+        
+        this.delegate = Deprecation.newJavaFXBuilderFactory(classLoader);
+    }
+    
+    /*
+     * BuilderFactory
+     */
+    
+    @Override
+    public Builder<?> getBuilder(Class<?> type) {
+        final Builder<?> result;
+        
+        if (Image.class == type) {
+           result = new FXOMImageBuilder();
+        } else {
+           result = delegate.getBuilder(type);
+        }
+        
+        return result;
+    }
+    
+}
--- a/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/fxom/FXOMCollection.java	Mon Jan 06 11:23:36 2014 +0200
+++ b/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/fxom/FXOMCollection.java	Tue Jan 07 12:06:59 2014 +0100
@@ -33,6 +33,7 @@
 
 import com.oracle.javafx.scenebuilder.kit.fxom.glue.GlueElement;
 import com.oracle.javafx.scenebuilder.kit.metadata.util.PropertyName;
+import java.net.URL;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Collections;
@@ -187,6 +188,15 @@
     }
 
     @Override
+    protected void collectPropertiesT(List<FXOMPropertyT> result) {
+        assert result != null;
+        
+        for (FXOMObject i : items) {
+            i.collectPropertiesT(result);
+        }
+    }
+
+    @Override
     protected void collectReferences(String source, List<FXOMIntrinsic> result) {
         for (FXOMObject i : items) {
             i.collectReferences(source, result);
@@ -239,8 +249,14 @@
         }
     }
 
+    @Override
+    public void documentLocationWillChange(URL newLocation) {
+        for (FXOMObject i : items) {
+            i.documentLocationWillChange(newLocation);
+        }
+    }
     
-  
+    
     /*
      * Package
      */
--- a/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/fxom/FXOMDocument.java	Mon Jan 06 11:23:36 2014 +0200
+++ b/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/fxom/FXOMDocument.java	Tue Jan 07 12:06:59 2014 +0100
@@ -33,6 +33,7 @@
 
 import com.oracle.javafx.scenebuilder.kit.fxom.sampledata.SampleDataGenerator;
 import com.oracle.javafx.scenebuilder.kit.fxom.glue.GlueDocument;
+import com.oracle.javafx.scenebuilder.kit.util.URLUtils;
 import java.io.BufferedReader;
 import java.io.IOException;
 import java.io.InputStream;
@@ -96,9 +97,14 @@
     }
 
     public void setLocation(URL location) {
-        beginUpdate();
-        this.location = location;
-        endUpdate();
+        if (URLUtils.equals(this.location, location) == false) {
+            beginUpdate();
+            if (fxomRoot != null) {
+                fxomRoot.documentLocationWillChange(location);
+            }
+            this.location = location;
+            endUpdate();
+        }
     }
 
     public ClassLoader getClassLoader() {
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/fxom/FXOMImageBuilder.java	Tue Jan 07 12:06:59 2014 +0100
@@ -0,0 +1,99 @@
+/*
+ * Copyright (c) 2012, 2014, Oracle and/or its affiliates.
+ * All rights reserved. Use is subject to license terms.
+ *
+ * This file is available and licensed under the following license:
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *  - Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ *  - Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in
+ *    the documentation and/or other materials provided with the distribution.
+ *  - Neither the name of Oracle Corporation nor the names of its
+ *    contributors may be used to endorse or promote products derived
+ *    from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package com.oracle.javafx.scenebuilder.kit.fxom;
+
+import com.sun.javafx.fxml.builder.JavaFXImageBuilder;
+import java.io.File;
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.util.Objects;
+
+/**
+ *
+ */
+class FXOMImageBuilder extends JavaFXImageBuilder {
+    
+    /*
+     * JavaFXImageBuilder
+     */
+    
+    @Override
+    public Object put(String key, Object value) {
+        Object fixedValue;
+        
+        if ("url".equals(key)) { //NOI18N
+            if (value == null) {
+                fixedValue = getMissingImageURL().toExternalForm();
+            } else {
+                try {
+                    // Check that value is a valid URL
+                    final URL url = new URL(value.toString());
+                    if (Objects.equals(url.getProtocol(), "file")) { //NOI18N
+                        // Check if a valid Image can be created from file
+                        final File imageFile = new File(url.getPath());
+                        if (imageFile.canRead()) {
+                            fixedValue = value;
+                        } else {
+                            fixedValue = getMissingImageURL().toExternalForm();
+                        }
+                    } else {
+                        fixedValue = value;
+                    }
+                } catch(MalformedURLException x) {
+                    fixedValue = getMissingImageURL().toExternalForm();
+                }
+            }
+        } else {
+            fixedValue = value;
+        }
+        
+        return super.put(key, fixedValue);
+    }
+        
+    
+    /*
+     * Private
+     */
+    
+    private static URL missingImageURL;
+    
+    private static URL getMissingImageURL() {
+        if (missingImageURL == null) {
+            missingImageURL = FXOMImageBuilder.class.getResource("missing-image.png"); //NOI18N
+            if (missingImageURL == null) {
+                throw new RuntimeException("Cannot find missing-image.png"); //NOI18N
+            }
+        }
+        return missingImageURL;
+    }
+}
--- a/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/fxom/FXOMInstance.java	Mon Jan 06 11:23:36 2014 +0200
+++ b/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/fxom/FXOMInstance.java	Tue Jan 07 12:06:59 2014 +0100
@@ -33,6 +33,7 @@
 
 import com.oracle.javafx.scenebuilder.kit.fxom.glue.GlueElement;
 import com.oracle.javafx.scenebuilder.kit.metadata.util.PropertyName;
+import java.net.URL;
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.Iterator;
@@ -61,7 +62,8 @@
         
         assert declaredClass != null;
         assert glueElement.getTagName().equals("fx:root") 
-                || glueElement.getTagName().equals(declaredClass.getSimpleName());
+                || glueElement.getTagName().equals(declaredClass.getSimpleName())
+                || glueElement.getTagName().equals(declaredClass.getCanonicalName());
         assert sceneGraphObject != null;
         assert properties != null;
 
@@ -244,6 +246,23 @@
     }
 
     @Override
+    protected void collectPropertiesT(List<FXOMPropertyT> result) {
+        assert result != null;
+        
+        for (FXOMProperty p : properties.values()) {
+            if (p instanceof FXOMPropertyT) {
+                final FXOMPropertyT tp = (FXOMPropertyT) p;
+                result.add(tp);
+            } else {
+                assert p instanceof FXOMPropertyC;
+                for (FXOMObject v : ((FXOMPropertyC)p).getValues()) {
+                    v.collectPropertiesT(result);
+                }
+            }
+        }
+    }
+
+    @Override
     protected void collectReferences(String source, List<FXOMIntrinsic> result) {
         for (FXOMProperty p : properties.values()) {
             if (p instanceof FXOMPropertyC) {
@@ -320,8 +339,14 @@
         }
     }
 
+    @Override
+    public void documentLocationWillChange(URL newLocation) {
+        for (FXOMProperty p : properties.values()) {
+            p.documentLocationWillChange(newLocation);
+        }
+    }
+
     
-  
     /*
      * Package
      */
--- a/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/fxom/FXOMIntrinsic.java	Mon Jan 06 11:23:36 2014 +0200
+++ b/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/fxom/FXOMIntrinsic.java	Tue Jan 07 12:06:59 2014 +0100
@@ -33,6 +33,7 @@
 
 import com.oracle.javafx.scenebuilder.kit.fxom.glue.GlueElement;
 import com.oracle.javafx.scenebuilder.kit.metadata.util.PropertyName;
+import java.net.URL;
 import java.util.Collections;
 import java.util.List;
 import java.util.Map;
@@ -158,6 +159,11 @@
     }
 
     @Override
+    protected void collectPropertiesT(List<FXOMPropertyT> result) {
+        // Nothing to collect in this kind of object
+    }
+
+    @Override
     protected void collectProperties(PropertyName propertyName, List<FXOMProperty> result) {
         // Nothing to collect in this kind of object
     }
@@ -190,7 +196,16 @@
         // Nothing to collect in this kind of object
     }
 
-
+    /*
+     * FXOMNode
+     */
+    
+    @Override
+    public void documentLocationWillChange(URL newLocation) {
+        // Nothing special to do here
+    }
+    
+    
     /*
      * Private
      */
--- a/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/fxom/FXOMLoader.java	Mon Jan 06 11:23:36 2014 +0200
+++ b/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/fxom/FXOMLoader.java	Tue Jan 07 12:06:59 2014 +0100
@@ -64,13 +64,19 @@
     public void load(String fxmlText) throws java.io.IOException {
         assert fxmlText != null;
         
+        final ClassLoader classLoader;
+        if (document.getClassLoader() != null) {
+            classLoader = document.getClassLoader();
+        } else {
+            classLoader = FXMLLoader.getDefaultClassLoader();
+        }
+        
         FXMLLoader fxmlLoader = new FXMLLoader();
         
         fxmlLoader.setLocation(document.getLocation());
         fxmlLoader.setResources(new ResourceKeyCollector(document.getResources()));
-        if (document.getClassLoader() != null) {
-            fxmlLoader.setClassLoader(document.getClassLoader());
-        }
+        fxmlLoader.setClassLoader(new TransientClassLoader(classLoader));
+        fxmlLoader.setBuilderFactory(new FXOMBuilderFactory(classLoader));
         Deprecation.setStaticLoad(fxmlLoader, true);
         Deprecation.setLoadListener(fxmlLoader, this);
         
@@ -111,7 +117,8 @@
     @Override
     public void beginInstanceDeclarationElement(Class<?> declaredClass) {
         assert declaredClass != null;
-        assert glueCursor.getCurrentElement().getTagName().equals(declaredClass.getSimpleName());
+        assert glueCursor.getCurrentElement().getTagName().equals(declaredClass.getSimpleName()) ||
+                glueCursor.getCurrentElement().getTagName().equals(declaredClass.getCanonicalName());
         
         final TransientObject transientInstance
                 = new TransientObject(currentTransientNode, 
--- a/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/fxom/FXOMNode.java	Mon Jan 06 11:23:36 2014 +0200
+++ b/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/fxom/FXOMNode.java	Tue Jan 07 12:06:59 2014 +0100
@@ -31,6 +31,7 @@
  */
 package com.oracle.javafx.scenebuilder.kit.fxom;
 
+import java.net.URL;
 
 /**
  *
@@ -51,6 +52,7 @@
     
     public abstract void moveToFxomDocument(FXOMDocument destination);
     
+    public abstract void documentLocationWillChange(URL newLocation);
     
     protected void changeFxomDocument(FXOMDocument destination) {
         assert destination != null;
--- a/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/fxom/FXOMObject.java	Mon Jan 06 11:23:36 2014 +0200
+++ b/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/fxom/FXOMObject.java	Tue Jan 07 12:06:59 2014 +0100
@@ -34,10 +34,7 @@
 import com.oracle.javafx.scenebuilder.kit.fxom.glue.GlueElement;
 import com.oracle.javafx.scenebuilder.kit.metadata.util.PropertyName;
 import com.oracle.javafx.scenebuilder.kit.util.JavaLanguage;
-import java.net.MalformedURLException;
-import java.net.URI;
-import java.net.URISyntaxException;
-import java.net.URL;
+import com.oracle.javafx.scenebuilder.kit.util.URLUtils;
 import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.HashSet;
@@ -363,6 +360,17 @@
     protected abstract void collectNullProperties(List<FXOMPropertyT> result);
     
     
+    public List<FXOMPropertyT> collectPropertiesT() {
+        final List<FXOMPropertyT> result = new ArrayList<>();
+        
+        collectPropertiesT(result);
+        
+        return result;
+    }
+    
+    protected abstract void collectPropertiesT(List<FXOMPropertyT> result);
+    
+    
     public List<FXOMIntrinsic> collectReferences(String source) {
         final List<FXOMIntrinsic> result = new ArrayList<>();
         
@@ -459,13 +467,10 @@
     
     
     public void setFxId(String fxId) {
+        assert (fxId == null) || JavaLanguage.isIdentifier(fxId);
         if (fxId == null) {
             glueElement.getAttributes().remove("fx:id");
         } else {
-            if (!fxId.isEmpty()) {
-                // Empty fx:id is allowed by fxml
-                assert JavaLanguage.isIdentifier(fxId);
-            }
             glueElement.getAttributes().put("fx:id", fxId);
         }
     }
@@ -556,6 +561,10 @@
                 || (parentProperty.getParentInstance() == null)
                 || (parentProperty.getValues().size() >= 2);
         
+        if (URLUtils.equals(getFxomDocument().getLocation(), destination.getLocation()) == false) {
+            documentLocationWillChange(destination.getLocation());
+        }
+        
         if (parentProperty != null) {
             assert parentProperty.getFxomDocument() == getFxomDocument();
             removeFromParentProperty();
@@ -582,7 +591,7 @@
         
         super.changeFxomDocument(destination);
     }
-    
+
     
     /*
      * Object
--- a/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/fxom/FXOMPropertyC.java	Mon Jan 06 11:23:36 2014 +0200
+++ b/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/fxom/FXOMPropertyC.java	Tue Jan 07 12:06:59 2014 +0100
@@ -33,6 +33,7 @@
 
 import com.oracle.javafx.scenebuilder.kit.fxom.glue.GlueElement;
 import com.oracle.javafx.scenebuilder.kit.metadata.util.PropertyName;
+import java.net.URL;
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
@@ -183,6 +184,8 @@
         assert destination != null;
         assert destination != getFxomDocument();
         
+        documentLocationWillChange(destination.getLocation());
+        
         if (getParentInstance() != null) {
             assert getParentInstance().getFxomDocument() == getFxomDocument();
             removeFromParentInstance();
@@ -208,6 +211,12 @@
         }
     }
 
+    @Override
+    public void documentLocationWillChange(URL newLocation) {
+        for (FXOMObject v : values) {
+            v.documentLocationWillChange(newLocation);
+        }
+    }
     
   
     /*
--- a/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/fxom/FXOMPropertyT.java	Mon Jan 06 11:23:36 2014 +0200
+++ b/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/fxom/FXOMPropertyT.java	Tue Jan 07 12:06:59 2014 +0100
@@ -32,7 +32,10 @@
 package com.oracle.javafx.scenebuilder.kit.fxom;
 
 import com.oracle.javafx.scenebuilder.kit.fxom.glue.GlueElement;
+import com.oracle.javafx.scenebuilder.kit.metadata.util.PrefixedValue;
 import com.oracle.javafx.scenebuilder.kit.metadata.util.PropertyName;
+import java.net.MalformedURLException;
+import java.net.URL;
 import java.util.Map;
 
 /**
@@ -225,6 +228,8 @@
         assert destination != null;
         assert destination != getFxomDocument();
         
+        documentLocationWillChange(destination.getLocation());
+        
         if (getParentInstance() != null) {
             assert getParentInstance().getFxomDocument() == getFxomDocument();
             removeFromParentInstance();
@@ -249,4 +254,51 @@
         
         super.changeFxomDocument(destination);
     }
+    
+    @Override
+    public void documentLocationWillChange(URL newLocation) {
+        final String currentValue = getValue();
+        final URL currentLocation = getFxomDocument().getLocation();
+        
+        final PrefixedValue pv = new PrefixedValue(currentValue);
+        if (pv.isDocumentRelativePath()) {
+            assert currentLocation != null;
+
+            /*
+             * currentValue is a path relative to currentLocation.
+             * We compute the absolute path and, if new location 
+             * is non null, we relativize the absolute path against
+             * newLocation.
+             */
+            final URL assetURL = pv.resolveDocumentRelativePath(currentLocation);
+            final String newValue;
+            if (newLocation == null) {
+                newValue = assetURL.toString();
+            } else {
+                final PrefixedValue pv2 
+                        = PrefixedValue.makePrefixedValue(assetURL, newLocation);
+                newValue = pv2.toString();
+            }
+            setValue(newValue);
+        } else if (pv.isPlainString() && (currentLocation == null)) {
+
+            /*
+             * currentValue is a plain string.
+             * We check if it is an URL.
+             * 
+             * Since currentLocation is null and newLocation non null,
+             * then all URLs should be converted to relative path.
+             */
+            assert newLocation != null;
+            try {
+                final URL assetURL = new URL(pv.getSuffix());
+                final PrefixedValue pv2 = PrefixedValue.makePrefixedValue(assetURL, newLocation);
+                setValue(pv2.toString());
+            } catch(MalformedURLException x) {
+                // p.getValue() is not an URL
+                // We keep currentValue unchanged.
+            }
+        }
+    }
+    
 }
--- a/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/fxom/ResourceKeyCollector.java	Mon Jan 06 11:23:36 2014 +0200
+++ b/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/fxom/ResourceKeyCollector.java	Tue Jan 07 12:06:59 2014 +0100
@@ -36,6 +36,7 @@
 import java.util.Iterator;
 import java.util.MissingResourceException;
 import java.util.ResourceBundle;
+import javafx.fxml.FXMLLoader;
 
 /**
  *
@@ -67,7 +68,7 @@
             result = null;
         }
         if (result == null) {
-            result = "%" + key;
+            result = FXMLLoader.RESOURCE_KEY_PREFIX + key;
         }
         
         return result;
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/fxom/TransientClassLoader.java	Tue Jan 07 12:06:59 2014 +0100
@@ -0,0 +1,72 @@
+/*
+ * Copyright (c) 2012, 2014, Oracle and/or its affiliates.
+ * All rights reserved. Use is subject to license terms.
+ *
+ * This file is available and licensed under the following license:
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *  - Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ *  - Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in
+ *    the documentation and/or other materials provided with the distribution.
+ *  - Neither the name of Oracle Corporation nor the names of its
+ *    contributors may be used to endorse or promote products derived
+ *    from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package com.oracle.javafx.scenebuilder.kit.fxom;
+
+import java.net.MalformedURLException;
+import java.net.URL;
+
+/**
+ * This class loader delegates all its tasks to its parent class loader but
+ * overrides ClassLoader.getResource().
+ * 
+ * The getResource() invokes the parent class loader implementation and checks
+ * if the result is null or not. When null (ie no existing resource match), it
+ * returns a dummy URL in place of null.
+ * 
+ * This class loader is instantiated by FXOMLoader and passed to FXMLLoader.
+ * It avoids FXMLLoader to break and interrupt loading when a classpath relative
+ * URL is unresolved.
+ */
+class TransientClassLoader extends ClassLoader {
+    
+    public TransientClassLoader(ClassLoader parentClassLoader) {
+        super(parentClassLoader);
+    }
+    
+    /*
+     * ClassLoader
+     */
+    
+    @Override
+    public URL getResource(String name) {
+        URL  result = super.getResource(name);
+        if (result == null) {
+            try {
+                result = new URL("file", null, name); //NOI18N
+            } catch(MalformedURLException x) {
+                throw new RuntimeException("Bug", x); //NOI18N
+            }
+        }
+        return result;
+    }
+}
--- a/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/fxom/TransientObject.java	Mon Jan 06 11:23:36 2014 +0200
+++ b/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/fxom/TransientObject.java	Tue Jan 07 12:06:59 2014 +0100
@@ -56,7 +56,8 @@
         
         assert declaredClass != null;
         assert glueElement != null;
-        assert glueElement.getTagName().equals(declaredClass.getSimpleName());
+        assert glueElement.getTagName().equals(declaredClass.getSimpleName()) ||
+                glueElement.getTagName().equals(declaredClass.getCanonicalName());
         
         this.declaredClass = declaredClass;
         this.unknownClassName = null;
Binary file apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/fxom/missing-image.png has changed
--- a/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/metadata/Metadata.java	Mon Jan 06 11:23:36 2014 +0200
+++ b/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/metadata/Metadata.java	Tue Jan 07 12:06:59 2014 +0100
@@ -44,6 +44,7 @@
 import com.oracle.javafx.scenebuilder.kit.metadata.property.PropertyMetadata;
 import com.oracle.javafx.scenebuilder.kit.metadata.property.ValuePropertyMetadata;
 import com.oracle.javafx.scenebuilder.kit.metadata.property.value.*;
+import com.oracle.javafx.scenebuilder.kit.metadata.property.value.effect.*;
 import com.oracle.javafx.scenebuilder.kit.metadata.property.value.list.*;
 import com.oracle.javafx.scenebuilder.kit.metadata.util.InspectorPath;
 import com.oracle.javafx.scenebuilder.kit.metadata.util.InspectorPathComparator;
@@ -1121,8 +1122,6 @@
             new PropertyName("tooltip");
     private final PropertyName topName = 
             new PropertyName("top");
-    private final PropertyName transformsName = 
-            new PropertyName("transforms");
     private final PropertyName translateXName = 
             new PropertyName("translateX");
     private final PropertyName translateYName = 
@@ -3789,12 +3788,6 @@
                 topName,
                 NodeMetadata,
                 false); /* collection */
-    private final ValuePropertyMetadata transformsPropertyMetadata =
-            new TransformListPropertyMetadata(
-                transformsName,
-                true, /* readWrite */
-                Collections.emptyList(), /* defaultValue */
-                new InspectorPath("Layout", "Transforms", 8));
     private final ValuePropertyMetadata translateXPropertyMetadata =
             new DoublePropertyMetadata(
                 translateXName,
@@ -3925,7 +3918,7 @@
                 viewportName,
                 true, /* readWrite */
                 null, /* defaultValue */
-                new InspectorPath("Layout", "Transforms", 9));
+                new InspectorPath("Layout", "Specific", 0));
     private final ValuePropertyMetadata viewportBoundsPropertyMetadata =
             new BoundsPropertyMetadata(
                 viewportBoundsName,
@@ -4776,7 +4769,6 @@
         NodeMetadata.getProperties().add(scaleZPropertyMetadata);
         NodeMetadata.getProperties().add(stylePropertyMetadata);
         NodeMetadata.getProperties().add(styleClass_empty_PropertyMetadata);
-        NodeMetadata.getProperties().add(transformsPropertyMetadata);
         NodeMetadata.getProperties().add(translateXPropertyMetadata);
         NodeMetadata.getProperties().add(translateYPropertyMetadata);
         NodeMetadata.getProperties().add(translateZPropertyMetadata);
@@ -5364,6 +5356,7 @@
         hiddenProperties.add(new PropertyName("tableView"));
         hiddenProperties.add(new PropertyName("tabPane"));
         hiddenProperties.add(new PropertyName("toggleGroup"));
+        hiddenProperties.add(new PropertyName("transforms"));
         hiddenProperties.add(new PropertyName("treeTableView"));
         hiddenProperties.add(new PropertyName("typeInternal"));
         hiddenProperties.add(new PropertyName("typeSelector"));
@@ -5419,6 +5412,7 @@
         ss1.add("Transforms");
         ss1.add("Bounds");
         ss1.add("Extras");
+        ss1.add("Specific");
         subSectionMap.put("Layout", ss1);
         final List<String> ss2 = new ArrayList<>();
         ss2.add("Main");
--- a/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/metadata/property/value/EffectPropertyMetadata.java	Mon Jan 06 11:23:36 2014 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,54 +0,0 @@
-/*
- * Copyright (c) 2012, 2014, Oracle and/or its affiliates.
- * All rights reserved. Use is subject to license terms.
- *
- * This file is available and licensed under the following license:
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- *  - Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- *  - Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in
- *    the documentation and/or other materials provided with the distribution.
- *  - Neither the name of Oracle Corporation nor the names of its
- *    contributors may be used to endorse or promote products derived
- *    from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-package com.oracle.javafx.scenebuilder.kit.metadata.property.value;
-
-import com.oracle.javafx.scenebuilder.kit.metadata.util.InspectorPath;
-import com.oracle.javafx.scenebuilder.kit.metadata.util.PropertyName;
-import javafx.scene.effect.Effect;
-
-/**
- *
- * 
- */
-public class EffectPropertyMetadata extends ComplexPropertyMetadata<Effect> {
-
-    public EffectPropertyMetadata(PropertyName name, boolean readWrite, 
-            Effect defaultValue, InspectorPath inspectorPath) {
-        super(name, Effect.class, readWrite, defaultValue, inspectorPath);
-    }
-
-    @Override
-    protected Effect castValue(Object value) {
-        return (Effect) value;
-    }
-    
-}
--- a/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/metadata/property/value/ImagePropertyMetadata.java	Mon Jan 06 11:23:36 2014 +0200
+++ b/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/metadata/property/value/ImagePropertyMetadata.java	Tue Jan 07 12:06:59 2014 +0100
@@ -34,7 +34,10 @@
 import com.oracle.javafx.scenebuilder.kit.fxom.FXOMInstance;
 import com.oracle.javafx.scenebuilder.kit.util.Deprecation;
 import com.oracle.javafx.scenebuilder.kit.metadata.util.InspectorPath;
+import com.oracle.javafx.scenebuilder.kit.metadata.util.PrefixedValue;
 import com.oracle.javafx.scenebuilder.kit.metadata.util.PropertyName;
+import java.net.MalformedURLException;
+import java.net.URL;
 import javafx.scene.image.Image;
 
 /**
@@ -57,7 +60,7 @@
             true /* readWrite */, false /* defaultValue */, InspectorPath.UNUSED);
     private final BooleanPropertyMetadata smoothMetadata
             = new BooleanPropertyMetadata(new PropertyName("smooth"),
-            true /* readWrite */, true /* defaultValue */, InspectorPath.UNUSED);
+            true /* readWrite */, false /* defaultValue */, InspectorPath.UNUSED);
     private final BooleanPropertyMetadata backgroundLoading
             = new BooleanPropertyMetadata(new PropertyName("backgroundLoading"),
             true /* readWrite */, false /* defaultValue */, InspectorPath.UNUSED);
@@ -78,7 +81,26 @@
     
     @Override
     protected void updateFxomInstanceWithValue(FXOMInstance valueInstance, Image value) {
-        urlMetadata.setValue(valueInstance, Deprecation.getUrl(value));
+        /*
+         * Image location is expressed as an absolute url.
+         * If the fxom document has a location, then we convert this location
+         * as a relative path expression (ie starting with @). If not, then
+         * we keep the absolute url.
+         */
+        final URL documentURL = valueInstance.getFxomDocument().getLocation();
+        final String imageLocation;
+        if (documentURL != null) {
+            try {
+                final URL imageURL = new URL(Deprecation.getUrl(value));
+                final PrefixedValue pv = PrefixedValue.makePrefixedValue(imageURL, documentURL);
+                imageLocation = pv.toString();
+            } catch(MalformedURLException|IllegalArgumentException x) {
+                throw new RuntimeException("Bug", x); // NOI18N
+            }
+        } else {
+            imageLocation = Deprecation.getUrl(value);
+        }
+        urlMetadata.setValue(valueInstance, imageLocation);
         requestedWidthMetadata.setValue(valueInstance, value.getRequestedWidth());
         requestedHeightMetadata.setValue(valueInstance, value.getRequestedHeight());
         preserveRatioMetadata.setValue(valueInstance, value.isPreserveRatio());
--- a/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/metadata/property/value/KeyCombinationPropertyMetadata.java	Mon Jan 06 11:23:36 2014 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,53 +0,0 @@
-/*
- * Copyright (c) 2012, 2013, Oracle and/or its affiliates.
- * All rights reserved. Use is subject to license terms.
- *
- * This file is available and licensed under the following license:
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- *  - Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- *  - Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in
- *    the documentation and/or other materials provided with the distribution.
- *  - Neither the name of Oracle Corporation nor the names of its
- *    contributors may be used to endorse or promote products derived
- *    from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-package com.oracle.javafx.scenebuilder.kit.metadata.property.value;
-
-import com.oracle.javafx.scenebuilder.kit.metadata.util.InspectorPath;
-import com.oracle.javafx.scenebuilder.kit.metadata.util.PropertyName;
-import javafx.scene.input.KeyCombination;
-
-/**
- *
- */
-public class KeyCombinationPropertyMetadata extends ComplexPropertyMetadata<KeyCombination> {
-
-    public KeyCombinationPropertyMetadata(PropertyName name, boolean readWrite, 
-            KeyCombination defaultValue, InspectorPath inspectorPath) {
-        super(name, KeyCombination.class, readWrite, defaultValue, inspectorPath);
-    }
-
-    @Override
-    protected KeyCombination castValue(Object value) {
-        return (KeyCombination) value;
-    }
-    
-}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/metadata/property/value/effect/BlendPropertyMetadata.java	Tue Jan 07 12:06:59 2014 +0100
@@ -0,0 +1,83 @@
+/*
+ * Copyright (c) 2012, 2014, Oracle and/or its affiliates.
+ * All rights reserved. Use is subject to license terms.
+ *
+ * This file is available and licensed under the following license:
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *  - Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ *  - Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in
+ *    the documentation and/or other materials provided with the distribution.
+ *  - Neither the name of Oracle Corporation nor the names of its
+ *    contributors may be used to endorse or promote products derived
+ *    from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package com.oracle.javafx.scenebuilder.kit.metadata.property.value.effect;
+
+import com.oracle.javafx.scenebuilder.kit.fxom.FXOMInstance;
+import com.oracle.javafx.scenebuilder.kit.metadata.property.value.ComplexPropertyMetadata;
+import com.oracle.javafx.scenebuilder.kit.metadata.property.value.DoublePropertyMetadata;
+import com.oracle.javafx.scenebuilder.kit.metadata.property.value.EnumerationPropertyMetadata;
+import com.oracle.javafx.scenebuilder.kit.metadata.util.InspectorPath;
+import com.oracle.javafx.scenebuilder.kit.metadata.util.PropertyName;
+import javafx.scene.effect.Blend;
+import javafx.scene.effect.BlendMode;
+
+/**
+ *
+ */
+public class BlendPropertyMetadata extends ComplexPropertyMetadata<Blend> {
+    
+    private final EffectPropertyMetadata bottomInputMetadata
+            = new EffectPropertyMetadata(new PropertyName("bottomInput"), //NOI18N
+            true /* readWrite */, null, InspectorPath.UNUSED);
+    private final EffectPropertyMetadata topInputMetadata
+            = new EffectPropertyMetadata(new PropertyName("topInput"), //NOI18N
+            true /* readWrite */, null, InspectorPath.UNUSED);
+    private final DoublePropertyMetadata opacityMetadata
+            = new DoublePropertyMetadata(new PropertyName("opacity"), //NOI18N
+            DoublePropertyMetadata.DoubleKind.OPACITY, true /* readWrite */, 1.0, InspectorPath.UNUSED);
+    private final EnumerationPropertyMetadata modeMetadata
+            = new EnumerationPropertyMetadata(new PropertyName("mode"), //NOI18N
+            BlendMode.class, true, BlendMode.SRC_OVER, InspectorPath.UNUSED);
+
+    public BlendPropertyMetadata(PropertyName name, boolean readWrite, 
+            Blend defaultValue, InspectorPath inspectorPath) {
+        super(name, Blend.class, readWrite, defaultValue, inspectorPath);
+    }
+
+    /*
+     * ComplexPropertyMetadata
+     */
+    
+    @Override
+    protected Blend castValue(Object value) {
+        return (Blend) value;
+    }
+    
+    @Override
+    public void updateFxomInstanceWithValue(FXOMInstance valueInstance, Blend value) {
+        bottomInputMetadata.setValue(valueInstance, value.getBottomInput());
+        topInputMetadata.setValue(valueInstance, value.getTopInput());
+        opacityMetadata.setValue(valueInstance, value.getOpacity());
+        modeMetadata.setValue(valueInstance, value.getMode().toString());
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/metadata/property/value/effect/BloomPropertyMetadata.java	Tue Jan 07 12:06:59 2014 +0100
@@ -0,0 +1,73 @@
+/*
+ * Copyright (c) 2012, 2014, Oracle and/or its affiliates.
+ * All rights reserved. Use is subject to license terms.
+ *
+ * This file is available and licensed under the following license:
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *  - Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ *  - Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in
+ *    the documentation and/or other materials provided with the distribution.
+ *  - Neither the name of Oracle Corporation nor the names of its
+ *    contributors may be used to endorse or promote products derived
+ *    from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package com.oracle.javafx.scenebuilder.kit.metadata.property.value.effect;
+
+import com.oracle.javafx.scenebuilder.kit.fxom.FXOMInstance;
+import com.oracle.javafx.scenebuilder.kit.metadata.property.value.ComplexPropertyMetadata;
+import com.oracle.javafx.scenebuilder.kit.metadata.property.value.DoublePropertyMetadata;
+import com.oracle.javafx.scenebuilder.kit.metadata.util.InspectorPath;
+import com.oracle.javafx.scenebuilder.kit.metadata.util.PropertyName;
+import javafx.scene.effect.Bloom;
+
+/**
+ *
+ */
+public class BloomPropertyMetadata extends ComplexPropertyMetadata<Bloom> {
+    
+    private final EffectPropertyMetadata inputMetadata
+            = new EffectPropertyMetadata(new PropertyName("input"), //NOI18N
+            true /* readWrite */, null, InspectorPath.UNUSED);
+    private final DoublePropertyMetadata thresholdMetadata
+            = new DoublePropertyMetadata(new PropertyName("threshold"), //NOI18N
+            DoublePropertyMetadata.DoubleKind.OPACITY, true /* readWrite */, 0.3, InspectorPath.UNUSED);
+
+    public BloomPropertyMetadata(PropertyName name, boolean readWrite, 
+            Bloom defaultValue, InspectorPath inspectorPath) {
+        super(name, Bloom.class, readWrite, defaultValue, inspectorPath);
+    }
+
+    /*
+     * ComplexPropertyMetadata
+     */
+    
+    @Override
+    protected Bloom castValue(Object value) {
+        return (Bloom) value;
+    }
+    
+    @Override
+    public void updateFxomInstanceWithValue(FXOMInstance valueInstance, Bloom value) {
+        inputMetadata.setValue(valueInstance, value.getInput());
+        thresholdMetadata.setValue(valueInstance, value.getThreshold());
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/metadata/property/value/effect/BoxBlurPropertyMetadata.java	Tue Jan 07 12:06:59 2014 +0100
@@ -0,0 +1,82 @@
+/*
+ * Copyright (c) 2012, 2014, Oracle and/or its affiliates.
+ * All rights reserved. Use is subject to license terms.
+ *
+ * This file is available and licensed under the following license:
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *  - Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ *  - Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in
+ *    the documentation and/or other materials provided with the distribution.
+ *  - Neither the name of Oracle Corporation nor the names of its
+ *    contributors may be used to endorse or promote products derived
+ *    from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package com.oracle.javafx.scenebuilder.kit.metadata.property.value.effect;
+
+import com.oracle.javafx.scenebuilder.kit.fxom.FXOMInstance;
+import com.oracle.javafx.scenebuilder.kit.metadata.property.value.ComplexPropertyMetadata;
+import com.oracle.javafx.scenebuilder.kit.metadata.property.value.DoublePropertyMetadata;
+import com.oracle.javafx.scenebuilder.kit.metadata.property.value.IntegerPropertyMetadata;
+import com.oracle.javafx.scenebuilder.kit.metadata.util.InspectorPath;
+import com.oracle.javafx.scenebuilder.kit.metadata.util.PropertyName;
+import javafx.scene.effect.BoxBlur;
+
+/**
+ *
+ */
+public class BoxBlurPropertyMetadata extends ComplexPropertyMetadata<BoxBlur> {
+    
+    private final EffectPropertyMetadata inputMetadata
+            = new EffectPropertyMetadata(new PropertyName("input"), //NOI18N
+            true /* readWrite */, null, InspectorPath.UNUSED);
+    private final DoublePropertyMetadata heightMetadata
+            = new DoublePropertyMetadata(new PropertyName("height"), //NOI18N
+            DoublePropertyMetadata.DoubleKind.EFFECT_SIZE, true /* readWrite */, 5.0, InspectorPath.UNUSED);
+    private final DoublePropertyMetadata widthMetadata
+            = new DoublePropertyMetadata(new PropertyName("width"), //NOI18N
+            DoublePropertyMetadata.DoubleKind.EFFECT_SIZE, true /* readWrite */, 5.0, InspectorPath.UNUSED);
+    private final IntegerPropertyMetadata iterationsMetadata
+            = new IntegerPropertyMetadata(new PropertyName("iterations"), //NOI18N
+             true /* readWrite */, 1, InspectorPath.UNUSED);
+
+    public BoxBlurPropertyMetadata(PropertyName name, boolean readWrite, 
+            BoxBlur defaultValue, InspectorPath inspectorPath) {
+        super(name, BoxBlur.class, readWrite, defaultValue, inspectorPath);
+    }
+
+    /*
+     * ComplexPropertyMetadata
+     */
+    
+    @Override
+    protected BoxBlur castValue(Object value) {
+        return (BoxBlur) value;
+    }
+    
+    @Override
+    public void updateFxomInstanceWithValue(FXOMInstance valueInstance, BoxBlur value) {
+        inputMetadata.setValue(valueInstance, value.getInput());
+        heightMetadata.setValue(valueInstance, value.getHeight());
+        widthMetadata.setValue(valueInstance, value.getWidth());
+        iterationsMetadata.setValue(valueInstance, value.getIterations());
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/metadata/property/value/effect/ColorAdjustPropertyMetadata.java	Tue Jan 07 12:06:59 2014 +0100
@@ -0,0 +1,85 @@
+/*
+ * Copyright (c) 2012, 2014, Oracle and/or its affiliates.
+ * All rights reserved. Use is subject to license terms.
+ *
+ * This file is available and licensed under the following license:
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *  - Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ *  - Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in
+ *    the documentation and/or other materials provided with the distribution.
+ *  - Neither the name of Oracle Corporation nor the names of its
+ *    contributors may be used to endorse or promote products derived
+ *    from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package com.oracle.javafx.scenebuilder.kit.metadata.property.value.effect;
+
+import com.oracle.javafx.scenebuilder.kit.fxom.FXOMInstance;
+import com.oracle.javafx.scenebuilder.kit.metadata.property.value.ComplexPropertyMetadata;
+import com.oracle.javafx.scenebuilder.kit.metadata.property.value.DoublePropertyMetadata;
+import com.oracle.javafx.scenebuilder.kit.metadata.util.InspectorPath;
+import com.oracle.javafx.scenebuilder.kit.metadata.util.PropertyName;
+import javafx.scene.effect.ColorAdjust;
+
+/**
+ *
+ */
+public class ColorAdjustPropertyMetadata extends ComplexPropertyMetadata<ColorAdjust> {
+    
+    private final EffectPropertyMetadata inputMetadata
+            = new EffectPropertyMetadata(new PropertyName("input"), //NOI18N
+            true /* readWrite */, null, InspectorPath.UNUSED);
+    private final DoublePropertyMetadata brightnessMetadata
+            = new DoublePropertyMetadata(new PropertyName("brightness"), //NOI18N
+            DoublePropertyMetadata.DoubleKind.COORDINATE, true /* readWrite */, 0.0, InspectorPath.UNUSED);
+    private final DoublePropertyMetadata contrastMetadata
+            = new DoublePropertyMetadata(new PropertyName("contrast"), //NOI18N
+            DoublePropertyMetadata.DoubleKind.COORDINATE, true /* readWrite */, 0.0, InspectorPath.UNUSED);
+    private final DoublePropertyMetadata hueMetadata
+            = new DoublePropertyMetadata(new PropertyName("hue"), //NOI18N
+            DoublePropertyMetadata.DoubleKind.COORDINATE, true /* readWrite */, 0.0, InspectorPath.UNUSED);
+    private final DoublePropertyMetadata saturationMetadata
+            = new DoublePropertyMetadata(new PropertyName("saturation"), //NOI18N
+            DoublePropertyMetadata.DoubleKind.COORDINATE, true /* readWrite */, 0.0, InspectorPath.UNUSED);
+
+    public ColorAdjustPropertyMetadata(PropertyName name, boolean readWrite, 
+            ColorAdjust defaultValue, InspectorPath inspectorPath) {
+        super(name, ColorAdjust.class, readWrite, defaultValue, inspectorPath);
+    }
+
+    /*
+     * ComplexPropertyMetadata
+     */
+    
+    @Override
+    protected ColorAdjust castValue(Object value) {
+        return (ColorAdjust) value;
+    }
+    
+    @Override
+    public void updateFxomInstanceWithValue(FXOMInstance valueInstance, ColorAdjust value) {
+        inputMetadata.setValue(valueInstance, value.getInput());
+        brightnessMetadata.setValue(valueInstance, value.getBrightness());
+        contrastMetadata.setValue(valueInstance, value.getContrast());
+        hueMetadata.setValue(valueInstance, value.getHue());
+        saturationMetadata.setValue(valueInstance, value.getSaturation());
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/metadata/property/value/effect/ColorInputPropertyMetadata.java	Tue Jan 07 12:06:59 2014 +0100
@@ -0,0 +1,87 @@
+/*
+ * Copyright (c) 2012, 2014, Oracle and/or its affiliates.
+ * All rights reserved. Use is subject to license terms.
+ *
+ * This file is available and licensed under the following license:
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *  - Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ *  - Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in
+ *    the documentation and/or other materials provided with the distribution.
+ *  - Neither the name of Oracle Corporation nor the names of its
+ *    contributors may be used to endorse or promote products derived
+ *    from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package com.oracle.javafx.scenebuilder.kit.metadata.property.value.effect;
+
+import com.oracle.javafx.scenebuilder.kit.fxom.FXOMInstance;
+import com.oracle.javafx.scenebuilder.kit.metadata.property.value.ComplexPropertyMetadata;
+import com.oracle.javafx.scenebuilder.kit.metadata.property.value.DoublePropertyMetadata;
+import com.oracle.javafx.scenebuilder.kit.metadata.property.value.paint.PaintPropertyMetadata;
+import com.oracle.javafx.scenebuilder.kit.metadata.util.InspectorPath;
+import com.oracle.javafx.scenebuilder.kit.metadata.util.PropertyName;
+import javafx.scene.effect.ColorInput;
+import javafx.scene.paint.Color;
+
+/**
+ *
+ */
+public class ColorInputPropertyMetadata extends ComplexPropertyMetadata<ColorInput> {
+    
+    private final DoublePropertyMetadata heightMetadata
+            = new DoublePropertyMetadata(new PropertyName("height"), //NOI18N
+            DoublePropertyMetadata.DoubleKind.COORDINATE, true /* readWrite */, 0.0, InspectorPath.UNUSED);
+    private final DoublePropertyMetadata widthMetadata
+            = new DoublePropertyMetadata(new PropertyName("width"), //NOI18N
+            DoublePropertyMetadata.DoubleKind.COORDINATE, true /* readWrite */, 0.0, InspectorPath.UNUSED);
+    private final DoublePropertyMetadata xMetadata
+            = new DoublePropertyMetadata(new PropertyName("x"), //NOI18N
+            DoublePropertyMetadata.DoubleKind.COORDINATE, true /* readWrite */, 0.0, InspectorPath.UNUSED);
+    private final DoublePropertyMetadata yMetadata
+            = new DoublePropertyMetadata(new PropertyName("y"), //NOI18N
+            DoublePropertyMetadata.DoubleKind.COORDINATE, true /* readWrite */, 0.0, InspectorPath.UNUSED);
+    private final PaintPropertyMetadata paintMetadata
+            = new PaintPropertyMetadata(new PropertyName("paint"), //NOI18N
+            true /* readWrite */, Color.RED, InspectorPath.UNUSED);
+
+    public ColorInputPropertyMetadata(PropertyName name, boolean readWrite, 
+            ColorInput defaultValue, InspectorPath inspectorPath) {
+        super(name, ColorInput.class, readWrite, defaultValue, inspectorPath);
+    }
+
+    /*
+     * ComplexPropertyMetadata
+     */
+    
+    @Override
+    protected ColorInput castValue(Object value) {
+        return (ColorInput) value;
+    }
+    
+    @Override
+    public void updateFxomInstanceWithValue(FXOMInstance valueInstance, ColorInput value) {
+        paintMetadata.setValue(valueInstance, value.getPaint());
+        heightMetadata.setValue(valueInstance, value.getHeight());
+        widthMetadata.setValue(valueInstance, value.getWidth());
+        xMetadata.setValue(valueInstance, value.getX());
+        yMetadata.setValue(valueInstance, value.getY());
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/metadata/property/value/effect/DropShadowPropertyMetadata.java	Tue Jan 07 12:06:59 2014 +0100
@@ -0,0 +1,105 @@
+/*
+ * Copyright (c) 2012, 2014, Oracle and/or its affiliates.
+ * All rights reserved. Use is subject to license terms.
+ *
+ * This file is available and licensed under the following license:
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *  - Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ *  - Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in
+ *    the documentation and/or other materials provided with the distribution.
+ *  - Neither the name of Oracle Corporation nor the names of its
+ *    contributors may be used to endorse or promote products derived
+ *    from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package com.oracle.javafx.scenebuilder.kit.metadata.property.value.effect;
+
+import com.oracle.javafx.scenebuilder.kit.fxom.FXOMInstance;
+import com.oracle.javafx.scenebuilder.kit.metadata.property.value.ComplexPropertyMetadata;
+import com.oracle.javafx.scenebuilder.kit.metadata.property.value.DoublePropertyMetadata;
+import com.oracle.javafx.scenebuilder.kit.metadata.property.value.EnumerationPropertyMetadata;
+import com.oracle.javafx.scenebuilder.kit.metadata.property.value.paint.ColorPropertyMetadata;
+import com.oracle.javafx.scenebuilder.kit.metadata.util.InspectorPath;
+import com.oracle.javafx.scenebuilder.kit.metadata.util.PropertyName;
+import javafx.scene.effect.BlurType;
+import javafx.scene.effect.DropShadow;
+import javafx.scene.paint.Color;
+
+/**
+ *
+ */
+public class DropShadowPropertyMetadata extends ComplexPropertyMetadata<DropShadow> {
+    
+    private final EnumerationPropertyMetadata blurTypeMetadata
+            = new EnumerationPropertyMetadata(new PropertyName("blurType"), //NOI18N
+            BlurType.class, true, BlurType.THREE_PASS_BOX, InspectorPath.UNUSED);
+    private final ColorPropertyMetadata colorMetadata
+            = new ColorPropertyMetadata(new PropertyName("color"), //NOI18N
+            true /* readWrite */, Color.BLACK, InspectorPath.UNUSED);
+    private final DoublePropertyMetadata heightMetadata
+            = new DoublePropertyMetadata(new PropertyName("height"), //NOI18N
+            DoublePropertyMetadata.DoubleKind.SIZE, true /* readWrite */, 21.0, InspectorPath.UNUSED);
+    private final EffectPropertyMetadata inputMetadata
+            = new EffectPropertyMetadata(new PropertyName("input"), //NOI18N
+            true /* readWrite */, null, InspectorPath.UNUSED);
+    private final DoublePropertyMetadata offsetXMetadata
+            = new DoublePropertyMetadata(new PropertyName("offsetX"), //NOI18N
+            DoublePropertyMetadata.DoubleKind.COORDINATE, true /* readWrite */, 0.0, InspectorPath.UNUSED);
+    private final DoublePropertyMetadata offsetYMetadata
+            = new DoublePropertyMetadata(new PropertyName("offsetY"), //NOI18N
+            DoublePropertyMetadata.DoubleKind.COORDINATE, true /* readWrite */, 0.0, InspectorPath.UNUSED);
+    private final DoublePropertyMetadata radiusMetadata
+            = new DoublePropertyMetadata(new PropertyName("radius"), //NOI18N
+            DoublePropertyMetadata.DoubleKind.COORDINATE, true /* readWrite */, 10.0, InspectorPath.UNUSED);
+    private final DoublePropertyMetadata spreadMetadata
+            = new DoublePropertyMetadata(new PropertyName("spread"), //NOI18N
+            DoublePropertyMetadata.DoubleKind.OPACITY, true /* readWrite */, 0.0, InspectorPath.UNUSED);
+    private final DoublePropertyMetadata widthMetadata
+            = new DoublePropertyMetadata(new PropertyName("width"), //NOI18N
+            DoublePropertyMetadata.DoubleKind.OPACITY, true /* readWrite */, 21.0, InspectorPath.UNUSED);
+
+    public DropShadowPropertyMetadata(PropertyName name, boolean readWrite, 
+            DropShadow defaultValue, InspectorPath inspectorPath) {
+        super(name, DropShadow.class, readWrite, defaultValue, inspectorPath);
+    }
+
+    /*
+     * ComplexPropertyMetadata
+     */
+    
+    @Override
+    protected DropShadow castValue(Object value) {
+        return (DropShadow) value;
+    }
+    
+    @Override
+    public void updateFxomInstanceWithValue(FXOMInstance valueInstance, DropShadow value) {
+        blurTypeMetadata.setValue(valueInstance, value.getBlurType().toString());
+        colorMetadata.setValue(valueInstance, value.getColor());
+        heightMetadata.setValue(valueInstance, value.getHeight());
+        inputMetadata.setValue(valueInstance, value.getInput());
+        offsetXMetadata.setValue(valueInstance, value.getOffsetX());
+        offsetYMetadata.setValue(valueInstance, value.getOffsetY());
+        radiusMetadata.setValue(valueInstance, value.getRadius());
+        spreadMetadata.setValue(valueInstance, value.getSpread());
+        widthMetadata.setValue(valueInstance, value.getWidth());
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/metadata/property/value/effect/EffectPropertyMetadata.java	Tue Jan 07 12:06:59 2014 +0100
@@ -0,0 +1,154 @@
+/*
+ * Copyright (c) 2012, 2014, Oracle and/or its affiliates.
+ * All rights reserved. Use is subject to license terms.
+ *
+ * This file is available and licensed under the following license:
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *  - Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ *  - Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in
+ *    the documentation and/or other materials provided with the distribution.
+ *  - Neither the name of Oracle Corporation nor the names of its
+ *    contributors may be used to endorse or promote products derived
+ *    from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+package com.oracle.javafx.scenebuilder.kit.metadata.property.value.effect;
+
+import com.oracle.javafx.scenebuilder.kit.fxom.FXOMInstance;
+import com.oracle.javafx.scenebuilder.kit.metadata.property.value.ComplexPropertyMetadata;
+import com.oracle.javafx.scenebuilder.kit.metadata.util.InspectorPath;
+import com.oracle.javafx.scenebuilder.kit.metadata.util.PropertyName;
+import javafx.scene.effect.Blend;
+import javafx.scene.effect.Bloom;
+import javafx.scene.effect.BoxBlur;
+import javafx.scene.effect.ColorAdjust;
+import javafx.scene.effect.ColorInput;
+import javafx.scene.effect.DisplacementMap;
+import javafx.scene.effect.DropShadow;
+import javafx.scene.effect.Effect;
+import javafx.scene.effect.GaussianBlur;
+import javafx.scene.effect.Glow;
+import javafx.scene.effect.ImageInput;
+import javafx.scene.effect.InnerShadow;
+import javafx.scene.effect.Lighting;
+import javafx.scene.effect.MotionBlur;
+import javafx.scene.effect.PerspectiveTransform;
+import javafx.scene.effect.Reflection;
+import javafx.scene.effect.SepiaTone;
+import javafx.scene.effect.Shadow;
+
+/**
+ *
+ * 
+ */
+public class EffectPropertyMetadata extends ComplexPropertyMetadata<Effect> {
+
+    public EffectPropertyMetadata(PropertyName name, boolean readWrite, 
+            Effect defaultValue, InspectorPath inspectorPath) {
+        super(name, Effect.class, readWrite, defaultValue, inspectorPath);
+        
+    }
+
+    /*
+     * ComplexPropertyMetadata
+     */
+
+    @Override
+    protected Effect castValue(Object value) {
+        return (Effect) value;
+    }
+
+    @Override
+    protected void updateFxomInstanceWithValue(FXOMInstance valueInstance, Effect value) {
+        assert value != null;
+        
+        if (value instanceof Blend) {
+            final BlendPropertyMetadata subclassMetadata 
+                    = new BlendPropertyMetadata(getName(), isReadWrite(), null, getInspectorPath());
+            subclassMetadata.updateFxomInstanceWithValue(valueInstance, (Blend) value);
+        } else if (value instanceof Bloom) {
+            final BloomPropertyMetadata subclassMetadata 
+                    = new BloomPropertyMetadata(getName(), isReadWrite(), null, getInspectorPath());
+            subclassMetadata.updateFxomInstanceWithValue(valueInstance, (Bloom) value);
+        } else if (value instanceof BoxBlur) {
+            final BoxBlurPropertyMetadata subclassMetadata 
+                    = new BoxBlurPropertyMetadata(getName(), isReadWrite(), null, getInspectorPath());
+            subclassMetadata.updateFxomInstanceWithValue(valueInstance, (BoxBlur) value);
+        } else if (value instanceof ColorAdjust) {
+            final ColorAdjustPropertyMetadata subclassMetadata 
+                    = new ColorAdjustPropertyMetadata(getName(), isReadWrite(), null, getInspectorPath());
+            subclassMetadata.updateFxomInstanceWithValue(valueInstance, (ColorAdjust) value);
+        } else if (value instanceof ColorInput) {
+            final ColorInputPropertyMetadata subclassMetadata 
+                    = new ColorInputPropertyMetadata(getName(), isReadWrite(), null, getInspectorPath());
+            subclassMetadata.updateFxomInstanceWithValue(valueInstance, (ColorInput) value);
+        } else if (value instanceof DisplacementMap) {
+            // DisplacementMap cannot be encoded in FXML
+            assert false;
+        } else if (value instanceof DropShadow) {
+            final DropShadowPropertyMetadata subclassMetadata 
+                    = new DropShadowPropertyMetadata(getName(), isReadWrite(), null, getInspectorPath());
+            subclassMetadata.updateFxomInstanceWithValue(valueInstance, (DropShadow) value);
+        } else if (value instanceof GaussianBlur) {
+            final GaussianBlurPropertyMetadata subclassMetadata 
+                    = new GaussianBlurPropertyMetadata(getName(), isReadWrite(), null, getInspectorPath());
+            subclassMetadata.updateFxomInstanceWithValue(valueInstance, (GaussianBlur) value);
+        } else if (value instanceof Glow) {
+            final GlowPropertyMetadata subclassMetadata 
+                    = new GlowPropertyMetadata(getName(), isReadWrite(), null, getInspectorPath());
+            subclassMetadata.updateFxomInstanceWithValue(valueInstance, (Glow) value);
+        } else if (value instanceof ImageInput) {
+            final ImageInputPropertyMetadata subclassMetadata 
+                    = new ImageInputPropertyMetadata(getName(), isReadWrite(), null, getInspectorPath());
+            subclassMetadata.updateFxomInstanceWithValue(valueInstance, (ImageInput) value);
+        } else if (value instanceof InnerShadow) {
+            final InnerShadowPropertyMetadata subclassMetadata 
+                    = new InnerShadowPropertyMetadata(getName(), isReadWrite(), null, getInspectorPath());
+            subclassMetadata.updateFxomInstanceWithValue(valueInstance, (InnerShadow) value);
+        } else if (value instanceof Lighting) {
+            final LightingPropertyMetadata subclassMetadata 
+                    = new LightingPropertyMetadata(getName(), isReadWrite(), null, getInspectorPath());
+            subclassMetadata.updateFxomInstanceWithValue(valueInstance, (Lighting) value);
+        } else if (value instanceof MotionBlur) {
+            final MotionBlurPropertyMetadata subclassMetadata 
+                    = new MotionBlurPropertyMetadata(getName(), isReadWrite(), null, getInspectorPath());
+            subclassMetadata.updateFxomInstanceWithValue(valueInstance, (MotionBlur) value);
+        } else if (value instanceof PerspectiveTransform) {
+            final PerspectiveTransformPropertyMetadata subclassMetadata 
+                    = new PerspectiveTransformPropertyMetadata(getName(), isReadWrite(), null, getInspectorPath());
+            subclassMetadata.updateFxomInstanceWithValue(valueInstance, (PerspectiveTransform) value);
+        } else if (value instanceof Reflection) {
+            final ReflectionPropertyMetadata subclassMetadata 
+                    = new ReflectionPropertyMetadata(getName(), isReadWrite(), null, getInspectorPath());
+            subclassMetadata.updateFxomInstanceWithValue(valueInstance, (Reflection) value);
+        } else if (value instanceof SepiaTone) {
+            final SepiaTonePropertyMetadata subclassMetadata 
+                    = new SepiaTonePropertyMetadata(getName(), isReadWrite(), null, getInspectorPath());
+            subclassMetadata.updateFxomInstanceWithValue(valueInstance, (SepiaTone) value);
+        } else if (value instanceof Shadow) {
+            final ShadowPropertyMetadata subclassMetadata 
+                    = new ShadowPropertyMetadata(getName(), isReadWrite(), null, getInspectorPath());
+            subclassMetadata.updateFxomInstanceWithValue(valueInstance, (Shadow) value);
+        } else {
+            assert false : "unexpected effect class = " + value.getClass().getSimpleName(); //NOI18N
+        }
+    }
+    
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/metadata/property/value/effect/GaussianBlurPropertyMetadata.java	Tue Jan 07 12:06:59 2014 +0100
@@ -0,0 +1,73 @@
+/*
+ * Copyright (c) 2012, 2014, Oracle and/or its affiliates.
+ * All rights reserved. Use is subject to license terms.
+ *
+ * This file is available and licensed under the following license:
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *  - Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ *  - Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in
+ *    the documentation and/or other materials provided with the distribution.
+ *  - Neither the name of Oracle Corporation nor the names of its
+ *    contributors may be used to endorse or promote products derived
+ *    from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package com.oracle.javafx.scenebuilder.kit.metadata.property.value.effect;
+
+import com.oracle.javafx.scenebuilder.kit.fxom.FXOMInstance;
+import com.oracle.javafx.scenebuilder.kit.metadata.property.value.ComplexPropertyMetadata;
+import com.oracle.javafx.scenebuilder.kit.metadata.property.value.DoublePropertyMetadata;
+import com.oracle.javafx.scenebuilder.kit.metadata.util.InspectorPath;
+import com.oracle.javafx.scenebuilder.kit.metadata.util.PropertyName;
+import javafx.scene.effect.GaussianBlur;
+
+/**
+ *
+ */
+public class GaussianBlurPropertyMetadata extends ComplexPropertyMetadata<GaussianBlur> {
+    
+    private final EffectPropertyMetadata inputMetadata
+            = new EffectPropertyMetadata(new PropertyName("input"), //NOI18N
+            true /* readWrite */, null, InspectorPath.UNUSED);
+    private final DoublePropertyMetadata radiusMetadata
+            = new DoublePropertyMetadata(new PropertyName("radius"), //NOI18N
+            DoublePropertyMetadata.DoubleKind.COORDINATE, true /* readWrite */, 10.0, InspectorPath.UNUSED);
+
+    public GaussianBlurPropertyMetadata(PropertyName name, boolean readWrite, 
+            GaussianBlur defaultValue, InspectorPath inspectorPath) {
+        super(name, GaussianBlur.class, readWrite, defaultValue, inspectorPath);
+    }
+
+    /*
+     * ComplexPropertyMetadata
+     */
+    
+    @Override
+    protected GaussianBlur castValue(Object value) {
+        return (GaussianBlur) value;
+    }
+    
+    @Override
+    public void updateFxomInstanceWithValue(FXOMInstance valueInstance, GaussianBlur value) {
+        inputMetadata.setValue(valueInstance, value.getInput());
+        radiusMetadata.setValue(valueInstance, value.getRadius());
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/metadata/property/value/effect/GlowPropertyMetadata.java	Tue Jan 07 12:06:59 2014 +0100
@@ -0,0 +1,73 @@
+/*
+ * Copyright (c) 2012, 2014, Oracle and/or its affiliates.
+ * All rights reserved. Use is subject to license terms.
+ *
+ * This file is available and licensed under the following license:
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *  - Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ *  - Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in
+ *    the documentation and/or other materials provided with the distribution.
+ *  - Neither the name of Oracle Corporation nor the names of its
+ *    contributors may be used to endorse or promote products derived
+ *    from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package com.oracle.javafx.scenebuilder.kit.metadata.property.value.effect;
+
+import com.oracle.javafx.scenebuilder.kit.fxom.FXOMInstance;
+import com.oracle.javafx.scenebuilder.kit.metadata.property.value.ComplexPropertyMetadata;
+import com.oracle.javafx.scenebuilder.kit.metadata.property.value.DoublePropertyMetadata;
+import com.oracle.javafx.scenebuilder.kit.metadata.util.InspectorPath;
+import com.oracle.javafx.scenebuilder.kit.metadata.util.PropertyName;
+import javafx.scene.effect.Glow;
+
+/**
+ *
+ */
+public class GlowPropertyMetadata extends ComplexPropertyMetadata<Glow> {
+    
+    private final EffectPropertyMetadata inputMetadata
+            = new EffectPropertyMetadata(new PropertyName("input"), //NOI18N
+            true /* readWrite */, null, InspectorPath.UNUSED);
+    private final DoublePropertyMetadata levelMetadata
+            = new DoublePropertyMetadata(new PropertyName("level"), //NOI18N
+            DoublePropertyMetadata.DoubleKind.OPACITY, true /* readWrite */, 0.3, InspectorPath.UNUSED);
+
+    public GlowPropertyMetadata(PropertyName name, boolean readWrite, 
+            Glow defaultValue, InspectorPath inspectorPath) {
+        super(name, Glow.class, readWrite, defaultValue, inspectorPath);
+    }
+
+    /*
+     * ComplexPropertyMetadata
+     */
+    
+    @Override
+    protected Glow castValue(Object value) {
+        return (Glow) value;
+    }
+    
+    @Override
+    public void updateFxomInstanceWithValue(FXOMInstance valueInstance, Glow value) {
+        inputMetadata.setValue(valueInstance, value.getInput());
+        levelMetadata.setValue(valueInstance, value.getLevel());
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/metadata/property/value/effect/ImageInputPropertyMetadata.java	Tue Jan 07 12:06:59 2014 +0100
@@ -0,0 +1,78 @@
+/*
+ * Copyright (c) 2012, 2014, Oracle and/or its affiliates.
+ * All rights reserved. Use is subject to license terms.
+ *
+ * This file is available and licensed under the following license:
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *  - Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ *  - Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in
+ *    the documentation and/or other materials provided with the distribution.
+ *  - Neither the name of Oracle Corporation nor the names of its
+ *    contributors may be used to endorse or promote products derived
+ *    from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package com.oracle.javafx.scenebuilder.kit.metadata.property.value.effect;
+
+import com.oracle.javafx.scenebuilder.kit.fxom.FXOMInstance;
+import com.oracle.javafx.scenebuilder.kit.metadata.property.value.ComplexPropertyMetadata;
+import com.oracle.javafx.scenebuilder.kit.metadata.property.value.DoublePropertyMetadata;
+import com.oracle.javafx.scenebuilder.kit.metadata.property.value.ImagePropertyMetadata;
+import com.oracle.javafx.scenebuilder.kit.metadata.util.InspectorPath;
+import com.oracle.javafx.scenebuilder.kit.metadata.util.PropertyName;
+import javafx.scene.effect.ImageInput;
+
+/**
+ *
+ */
+public class ImageInputPropertyMetadata extends ComplexPropertyMetadata<ImageInput> {
+    
+    private final ImagePropertyMetadata sourceMetadata
+            = new ImagePropertyMetadata(new PropertyName("source"), //NOI18N
+            true /* readWrite */, null, InspectorPath.UNUSED);
+    private final DoublePropertyMetadata xMetadata
+            = new DoublePropertyMetadata(new PropertyName("x"), //NOI18N
+            DoublePropertyMetadata.DoubleKind.COORDINATE, true /* readWrite */, 0.0, InspectorPath.UNUSED);
+    private final DoublePropertyMetadata yMetadata
+            = new DoublePropertyMetadata(new PropertyName("y"), //NOI18N
+            DoublePropertyMetadata.DoubleKind.COORDINATE, true /* readWrite */, 0.0, InspectorPath.UNUSED);
+
+    public ImageInputPropertyMetadata(PropertyName name, boolean readWrite, 
+            ImageInput defaultValue, InspectorPath inspectorPath) {
+        super(name, ImageInput.class, readWrite, defaultValue, inspectorPath);
+    }
+
+    /*
+     * ComplexPropertyMetadata
+     */
+    
+    @Override
+    protected ImageInput castValue(Object value) {
+        return (ImageInput) value;
+    }
+    
+    @Override
+    public void updateFxomInstanceWithValue(FXOMInstance valueInstance, ImageInput value) {
+        sourceMetadata.setValue(valueInstance, value.getSource());
+        xMetadata.setValue(valueInstance, value.getX());
+        yMetadata.setValue(valueInstance, value.getY());
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/metadata/property/value/effect/InnerShadowPropertyMetadata.java	Tue Jan 07 12:06:59 2014 +0100
@@ -0,0 +1,105 @@
+/*
+ * Copyright (c) 2012, 2014, Oracle and/or its affiliates.
+ * All rights reserved. Use is subject to license terms.
+ *
+ * This file is available and licensed under the following license:
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *  - Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ *  - Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in
+ *    the documentation and/or other materials provided with the distribution.
+ *  - Neither the name of Oracle Corporation nor the names of its
+ *    contributors may be used to endorse or promote products derived
+ *    from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package com.oracle.javafx.scenebuilder.kit.metadata.property.value.effect;
+
+import com.oracle.javafx.scenebuilder.kit.fxom.FXOMInstance;
+import com.oracle.javafx.scenebuilder.kit.metadata.property.value.ComplexPropertyMetadata;
+import com.oracle.javafx.scenebuilder.kit.metadata.property.value.DoublePropertyMetadata;
+import com.oracle.javafx.scenebuilder.kit.metadata.property.value.EnumerationPropertyMetadata;
+import com.oracle.javafx.scenebuilder.kit.metadata.property.value.paint.ColorPropertyMetadata;
+import com.oracle.javafx.scenebuilder.kit.metadata.util.InspectorPath;
+import com.oracle.javafx.scenebuilder.kit.metadata.util.PropertyName;
+import javafx.scene.effect.BlurType;
+import javafx.scene.effect.InnerShadow;
+import javafx.scene.paint.Color;
+
+/**
+ *
+ */
+public class InnerShadowPropertyMetadata extends ComplexPropertyMetadata<InnerShadow> {
+    
+    private final EnumerationPropertyMetadata blurTypeMetadata
+            = new EnumerationPropertyMetadata(new PropertyName("blurType"), //NOI18N
+            BlurType.class, true, BlurType.THREE_PASS_BOX, InspectorPath.UNUSED);
+    private final DoublePropertyMetadata chokeMetadata
+            = new DoublePropertyMetadata(new PropertyName("choke"), //NOI18N
+            DoublePropertyMetadata.DoubleKind.OPACITY, true /* readWrite */, 0.0, InspectorPath.UNUSED);
+    private final ColorPropertyMetadata colorMetadata
+            = new ColorPropertyMetadata(new PropertyName("color"), //NOI18N
+            true /* readWrite */, Color.BLACK, InspectorPath.UNUSED);
+    private final DoublePropertyMetadata heightMetadata
+            = new DoublePropertyMetadata(new PropertyName("height"), //NOI18N
+            DoublePropertyMetadata.DoubleKind.SIZE, true /* readWrite */, 21.0, InspectorPath.UNUSED);
+    private final EffectPropertyMetadata inputMetadata
+            = new EffectPropertyMetadata(new PropertyName("input"), //NOI18N
+            true /* readWrite */, null, InspectorPath.UNUSED);
+    private final DoublePropertyMetadata offsetXMetadata
+            = new DoublePropertyMetadata(new PropertyName("offsetX"), //NOI18N
+            DoublePropertyMetadata.DoubleKind.COORDINATE, true /* readWrite */, 0.0, InspectorPath.UNUSED);
+    private final DoublePropertyMetadata offsetYMetadata
+            = new DoublePropertyMetadata(new PropertyName("offsetY"), //NOI18N
+            DoublePropertyMetadata.DoubleKind.COORDINATE, true /* readWrite */, 0.0, InspectorPath.UNUSED);
+    private final DoublePropertyMetadata radiusMetadata
+            = new DoublePropertyMetadata(new PropertyName("radius"), //NOI18N
+            DoublePropertyMetadata.DoubleKind.COORDINATE, true /* readWrite */, 10.0, InspectorPath.UNUSED);
+    private final DoublePropertyMetadata widthMetadata
+            = new DoublePropertyMetadata(new PropertyName("width"), //NOI18N
+            DoublePropertyMetadata.DoubleKind.OPACITY, true /* readWrite */, 21.0, InspectorPath.UNUSED);
+
+    public InnerShadowPropertyMetadata(PropertyName name, boolean readWrite, 
+            InnerShadow defaultValue, InspectorPath inspectorPath) {
+        super(name, InnerShadow.class, readWrite, defaultValue, inspectorPath);
+    }
+
+    /*
+     * ComplexPropertyMetadata
+     */
+    
+    @Override
+    protected InnerShadow castValue(Object value) {
+        return (InnerShadow) value;
+    }
+    
+    @Override
+    public void updateFxomInstanceWithValue(FXOMInstance valueInstance, InnerShadow value) {
+        blurTypeMetadata.setValue(valueInstance, value.getBlurType().toString());
+        chokeMetadata.setValue(valueInstance, value.getChoke());
+        colorMetadata.setValue(valueInstance, value.getColor());
+        heightMetadata.setValue(valueInstance, value.getHeight());
+        inputMetadata.setValue(valueInstance, value.getInput());
+        offsetXMetadata.setValue(valueInstance, value.getOffsetX());
+        offsetYMetadata.setValue(valueInstance, value.getOffsetY());
+        radiusMetadata.setValue(valueInstance, value.getRadius());
+        widthMetadata.setValue(valueInstance, value.getWidth());
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/metadata/property/value/effect/LightingPropertyMetadata.java	Tue Jan 07 12:06:59 2014 +0100
@@ -0,0 +1,93 @@
+/*
+ * Copyright (c) 2012, 2014, Oracle and/or its affiliates.
+ * All rights reserved. Use is subject to license terms.
+ *
+ * This file is available and licensed under the following license:
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *  - Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ *  - Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in
+ *    the documentation and/or other materials provided with the distribution.
+ *  - Neither the name of Oracle Corporation nor the names of its
+ *    contributors may be used to endorse or promote products derived
+ *    from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package com.oracle.javafx.scenebuilder.kit.metadata.property.value.effect;
+
+import com.oracle.javafx.scenebuilder.kit.fxom.FXOMInstance;
+import com.oracle.javafx.scenebuilder.kit.metadata.property.value.ComplexPropertyMetadata;
+import com.oracle.javafx.scenebuilder.kit.metadata.property.value.DoublePropertyMetadata;
+import com.oracle.javafx.scenebuilder.kit.metadata.util.InspectorPath;
+import com.oracle.javafx.scenebuilder.kit.metadata.util.PropertyName;
+import javafx.scene.effect.Lighting;
+
+/**
+ *
+ */
+public class LightingPropertyMetadata extends ComplexPropertyMetadata<Lighting> {
+    
+    private final EffectPropertyMetadata bumpInputMetadata
+            = new EffectPropertyMetadata(new PropertyName("bumpInput"), //NOI18N
+            true /* readWrite */, null, InspectorPath.UNUSED);
+    private final EffectPropertyMetadata contentInputMetadata
+            = new EffectPropertyMetadata(new PropertyName("contentInput"), //NOI18N
+            true /* readWrite */, null, InspectorPath.UNUSED);
+    private final DoublePropertyMetadata diffuseConstantMetadata
+            = new DoublePropertyMetadata(new PropertyName("diffuseConstant"), //NOI18N
+            DoublePropertyMetadata.DoubleKind.COORDINATE, true /* readWrite */, 1.0, InspectorPath.UNUSED);
+//    private final LightPropertyMetadata lightMetadata
+//            = new LightPropertyMetadata(new PropertyName("light"), //NOI18N
+//            true /* readWrite */, null, InspectorPath.UNUSED);
+    private final DoublePropertyMetadata specularConstantMetadata
+            = new DoublePropertyMetadata(new PropertyName("specularConstant"), //NOI18N
+            DoublePropertyMetadata.DoubleKind.COORDINATE, true /* readWrite */, 0.3, InspectorPath.UNUSED);
+    private final DoublePropertyMetadata specularExponentMetadata
+            = new DoublePropertyMetadata(new PropertyName("specularExponent"), //NOI18N
+            DoublePropertyMetadata.DoubleKind.COORDINATE, true /* readWrite */, 20.0, InspectorPath.UNUSED);
+    private final DoublePropertyMetadata surfaceScaleMetadata
+            = new DoublePropertyMetadata(new PropertyName("surfaceScale"), //NOI18N
+            DoublePropertyMetadata.DoubleKind.COORDINATE, true /* readWrite */, 1.5, InspectorPath.UNUSED);
+
+    public LightingPropertyMetadata(PropertyName name, boolean readWrite, 
+            Lighting defaultValue, InspectorPath inspectorPath) {
+        super(name, Lighting.class, readWrite, defaultValue, inspectorPath);
+    }
+
+    /*
+     * ComplexPropertyMetadata
+     */
+    
+    @Override
+    protected Lighting castValue(Object value) {
+        return (Lighting) value;
+    }
+    
+    @Override
+    public void updateFxomInstanceWithValue(FXOMInstance valueInstance, Lighting value) {
+        bumpInputMetadata.setValue(valueInstance, value.getBumpInput());
+        contentInputMetadata.setValue(valueInstance, value.getContentInput());
+        diffuseConstantMetadata.setValue(valueInstance, value.getDiffuseConstant());
+//        lightMetadata.setValue(valueInstance, value.getLight());
+        specularConstantMetadata.setValue(valueInstance, value.getSpecularConstant());
+        specularExponentMetadata.setValue(valueInstance, value.getSpecularExponent());
+        surfaceScaleMetadata.setValue(valueInstance, value.getSurfaceScale());
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/metadata/property/value/effect/MotionBlurPropertyMetadata.java	Tue Jan 07 12:06:59 2014 +0100
@@ -0,0 +1,77 @@
+/*
+ * Copyright (c) 2012, 2014, Oracle and/or its affiliates.
+ * All rights reserved. Use is subject to license terms.
+ *
+ * This file is available and licensed under the following license:
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *  - Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ *  - Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in
+ *    the documentation and/or other materials provided with the distribution.
+ *  - Neither the name of Oracle Corporation nor the names of its
+ *    contributors may be used to endorse or promote products derived
+ *    from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package com.oracle.javafx.scenebuilder.kit.metadata.property.value.effect;
+
+import com.oracle.javafx.scenebuilder.kit.fxom.FXOMInstance;
+import com.oracle.javafx.scenebuilder.kit.metadata.property.value.ComplexPropertyMetadata;
+import com.oracle.javafx.scenebuilder.kit.metadata.property.value.DoublePropertyMetadata;
+import com.oracle.javafx.scenebuilder.kit.metadata.util.InspectorPath;
+import com.oracle.javafx.scenebuilder.kit.metadata.util.PropertyName;
+import javafx.scene.effect.MotionBlur;
+
+/**
+ *
+ */
+public class MotionBlurPropertyMetadata extends ComplexPropertyMetadata<MotionBlur> {
+    
+    private final DoublePropertyMetadata angleMetadata
+            = new DoublePropertyMetadata(new PropertyName("angle"), //NOI18N
+            DoublePropertyMetadata.DoubleKind.ANGLE, true /* readWrite */, 0.0, InspectorPath.UNUSED);
+    private final EffectPropertyMetadata inputMetadata
+            = new EffectPropertyMetadata(new PropertyName("input"), //NOI18N
+            true /* readWrite */, null, InspectorPath.UNUSED);
+    private final DoublePropertyMetadata radiusMetadata
+            = new DoublePropertyMetadata(new PropertyName("radius"), //NOI18N
+            DoublePropertyMetadata.DoubleKind.SIZE, true /* readWrite */, 10.0, InspectorPath.UNUSED);
+
+    public MotionBlurPropertyMetadata(PropertyName name, boolean readWrite, 
+            MotionBlur defaultValue, InspectorPath inspectorPath) {
+        super(name, MotionBlur.class, readWrite, defaultValue, inspectorPath);
+    }
+
+    /*
+     * ComplexPropertyMetadata
+     */
+    
+    @Override
+    protected MotionBlur castValue(Object value) {
+        return (MotionBlur) value;
+    }
+    
+    @Override
+    public void updateFxomInstanceWithValue(FXOMInstance valueInstance, MotionBlur value) {
+        angleMetadata.setValue(valueInstance, value.getAngle());
+        inputMetadata.setValue(valueInstance, value.getInput());
+        radiusMetadata.setValue(valueInstance, value.getRadius());
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/metadata/property/value/effect/PerspectiveTransformPropertyMetadata.java	Tue Jan 07 12:06:59 2014 +0100
@@ -0,0 +1,101 @@
+/*
+ * Copyright (c) 2012, 2014, Oracle and/or its affiliates.
+ * All rights reserved. Use is subject to license terms.
+ *
+ * This file is available and licensed under the following license:
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *  - Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ *  - Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in
+ *    the documentation and/or other materials provided with the distribution.
+ *  - Neither the name of Oracle Corporation nor the names of its
+ *    contributors may be used to endorse or promote products derived
+ *    from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package com.oracle.javafx.scenebuilder.kit.metadata.property.value.effect;
+
+import com.oracle.javafx.scenebuilder.kit.fxom.FXOMInstance;
+import com.oracle.javafx.scenebuilder.kit.metadata.property.value.ComplexPropertyMetadata;
+import com.oracle.javafx.scenebuilder.kit.metadata.property.value.DoublePropertyMetadata;
+import com.oracle.javafx.scenebuilder.kit.metadata.util.InspectorPath;
+import com.oracle.javafx.scenebuilder.kit.metadata.util.PropertyName;
+import javafx.scene.effect.PerspectiveTransform;
+
+/**
+ *
+ */
+public class PerspectiveTransformPropertyMetadata extends ComplexPropertyMetadata<PerspectiveTransform> {
+    
+    private final EffectPropertyMetadata inputMetadata
+            = new EffectPropertyMetadata(new PropertyName("input"), //NOI18N
+            true /* readWrite */, null, InspectorPath.UNUSED);
+    private final DoublePropertyMetadata llxMetadata
+            = new DoublePropertyMetadata(new PropertyName("llx"), //NOI18N
+            DoublePropertyMetadata.DoubleKind.COORDINATE, true /* readWrite */, 0.0, InspectorPath.UNUSED);
+    private final DoublePropertyMetadata llyMetadata
+            = new DoublePropertyMetadata(new PropertyName("lly"), //NOI18N
+            DoublePropertyMetadata.DoubleKind.COORDINATE, true /* readWrite */, 0.0, InspectorPath.UNUSED);
+    private final DoublePropertyMetadata lrxMetadata
+            = new DoublePropertyMetadata(new PropertyName("lrx"), //NOI18N
+            DoublePropertyMetadata.DoubleKind.COORDINATE, true /* readWrite */, 0.0, InspectorPath.UNUSED);
+    private final DoublePropertyMetadata lryMetadata
+            = new DoublePropertyMetadata(new PropertyName("lry"), //NOI18N
+            DoublePropertyMetadata.DoubleKind.COORDINATE, true /* readWrite */, 0.0, InspectorPath.UNUSED);
+    private final DoublePropertyMetadata ulxMetadata
+            = new DoublePropertyMetadata(new PropertyName("ulx"), //NOI18N
+            DoublePropertyMetadata.DoubleKind.COORDINATE, true /* readWrite */, 0.0, InspectorPath.UNUSED);
+    private final DoublePropertyMetadata ulyMetadata
+            = new DoublePropertyMetadata(new PropertyName("uly"), //NOI18N
+            DoublePropertyMetadata.DoubleKind.COORDINATE, true /* readWrite */, 0.0, InspectorPath.UNUSED);
+    private final DoublePropertyMetadata urxMetadata
+            = new DoublePropertyMetadata(new PropertyName("urx"), //NOI18N
+            DoublePropertyMetadata.DoubleKind.COORDINATE, true /* readWrite */, 0.0, InspectorPath.UNUSED);
+    private final DoublePropertyMetadata uryMetadata
+            = new DoublePropertyMetadata(new PropertyName("ury"), //NOI18N
+            DoublePropertyMetadata.DoubleKind.COORDINATE, true /* readWrite */, 0.0, InspectorPath.UNUSED);
+
+    public PerspectiveTransformPropertyMetadata(PropertyName name, boolean readWrite, 
+            PerspectiveTransform defaultValue, InspectorPath inspectorPath) {
+        super(name, PerspectiveTransform.class, readWrite, defaultValue, inspectorPath);
+    }
+
+    /*
+     * ComplexPropertyMetadata
+     */
+    
+    @Override
+    protected PerspectiveTransform castValue(Object value) {
+        return (PerspectiveTransform) value;
+    }
+    
+    @Override
+    public void updateFxomInstanceWithValue(FXOMInstance valueInstance, PerspectiveTransform value) {
+        inputMetadata.setValue(valueInstance, value.getInput());
+        llxMetadata.setValue(valueInstance, value.getLlx());
+        llyMetadata.setValue(valueInstance, value.getLly());
+        lrxMetadata.setValue(valueInstance, value.getLrx());
+        lryMetadata.setValue(valueInstance, value.getLry());
+        ulxMetadata.setValue(valueInstance, value.getUlx());
+        ulyMetadata.setValue(valueInstance, value.getUly());
+        urxMetadata.setValue(valueInstance, value.getUrx());
+        uryMetadata.setValue(valueInstance, value.getUry());
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/metadata/property/value/effect/ReflectionPropertyMetadata.java	Tue Jan 07 12:06:59 2014 +0100
@@ -0,0 +1,85 @@
+/*
+ * Copyright (c) 2012, 2014, Oracle and/or its affiliates.
+ * All rights reserved. Use is subject to license terms.
+ *
+ * This file is available and licensed under the following license:
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *  - Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ *  - Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in
+ *    the documentation and/or other materials provided with the distribution.
+ *  - Neither the name of Oracle Corporation nor the names of its
+ *    contributors may be used to endorse or promote products derived
+ *    from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package com.oracle.javafx.scenebuilder.kit.metadata.property.value.effect;
+
+import com.oracle.javafx.scenebuilder.kit.fxom.FXOMInstance;
+import com.oracle.javafx.scenebuilder.kit.metadata.property.value.ComplexPropertyMetadata;
+import com.oracle.javafx.scenebuilder.kit.metadata.property.value.DoublePropertyMetadata;
+import com.oracle.javafx.scenebuilder.kit.metadata.util.InspectorPath;
+import com.oracle.javafx.scenebuilder.kit.metadata.util.PropertyName;
+import javafx.scene.effect.Reflection;
+
+/**
+ *
+ */
+public class ReflectionPropertyMetadata extends ComplexPropertyMetadata<Reflection> {
+    
+    private final DoublePropertyMetadata bottomOpacityMetadata
+            = new DoublePropertyMetadata(new PropertyName("bottomOpacity"), //NOI18N
+            DoublePropertyMetadata.DoubleKind.OPACITY, true /* readWrite */, 0.0, InspectorPath.UNUSED);
+    private final DoublePropertyMetadata fractionMetadata
+            = new DoublePropertyMetadata(new PropertyName("fraction"), //NOI18N
+            DoublePropertyMetadata.DoubleKind.OPACITY, true /* readWrite */, 0.75, InspectorPath.UNUSED);
+    private final EffectPropertyMetadata inputMetadata
+            = new EffectPropertyMetadata(new PropertyName("input"), //NOI18N
+            true /* readWrite */, null, InspectorPath.UNUSED);
+    private final DoublePropertyMetadata topOffsetMetadata
+            = new DoublePropertyMetadata(new PropertyName("topOffset"), //NOI18N
+            DoublePropertyMetadata.DoubleKind.COORDINATE, true /* readWrite */, 0.0, InspectorPath.UNUSED);
+    private final DoublePropertyMetadata topOpacityMetadata
+            = new DoublePropertyMetadata(new PropertyName("topOpacity"), //NOI18N
+            DoublePropertyMetadata.DoubleKind.OPACITY, true /* readWrite */, 0.5, InspectorPath.UNUSED);
+
+    public ReflectionPropertyMetadata(PropertyName name, boolean readWrite, 
+            Reflection defaultValue, InspectorPath inspectorPath) {
+        super(name, Reflection.class, readWrite, defaultValue, inspectorPath);
+    }
+
+    /*
+     * ComplexPropertyMetadata
+     */
+    
+    @Override
+    protected Reflection castValue(Object value) {
+        return (Reflection) value;
+    }
+    
+    @Override
+    public void updateFxomInstanceWithValue(FXOMInstance valueInstance, Reflection value) {
+        bottomOpacityMetadata.setValue(valueInstance, value.getBottomOpacity());
+        fractionMetadata.setValue(valueInstance, value.getFraction());
+        inputMetadata.setValue(valueInstance, value.getInput());
+        topOffsetMetadata.setValue(valueInstance, value.getTopOffset());
+        topOpacityMetadata.setValue(valueInstance, value.getTopOpacity());
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/metadata/property/value/effect/SepiaTonePropertyMetadata.java	Tue Jan 07 12:06:59 2014 +0100
@@ -0,0 +1,73 @@
+/*
+ * Copyright (c) 2012, 2014, Oracle and/or its affiliates.
+ * All rights reserved. Use is subject to license terms.
+ *
+ * This file is available and licensed under the following license:
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *  - Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ *  - Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in
+ *    the documentation and/or other materials provided with the distribution.
+ *  - Neither the name of Oracle Corporation nor the names of its
+ *    contributors may be used to endorse or promote products derived
+ *    from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package com.oracle.javafx.scenebuilder.kit.metadata.property.value.effect;
+
+import com.oracle.javafx.scenebuilder.kit.fxom.FXOMInstance;
+import com.oracle.javafx.scenebuilder.kit.metadata.property.value.ComplexPropertyMetadata;
+import com.oracle.javafx.scenebuilder.kit.metadata.property.value.DoublePropertyMetadata;
+import com.oracle.javafx.scenebuilder.kit.metadata.util.InspectorPath;
+import com.oracle.javafx.scenebuilder.kit.metadata.util.PropertyName;
+import javafx.scene.effect.SepiaTone;
+
+/**
+ *
+ */
+public class SepiaTonePropertyMetadata extends ComplexPropertyMetadata<SepiaTone> {
+    
+    private final EffectPropertyMetadata inputMetadata
+            = new EffectPropertyMetadata(new PropertyName("input"), //NOI18N
+            true /* readWrite */, null, InspectorPath.UNUSED);
+    private final DoublePropertyMetadata levelMetadata
+            = new DoublePropertyMetadata(new PropertyName("level"), //NOI18N
+            DoublePropertyMetadata.DoubleKind.EFFECT_SIZE, true /* readWrite */, 1.0, InspectorPath.UNUSED);
+
+    public SepiaTonePropertyMetadata(PropertyName name, boolean readWrite, 
+            SepiaTone defaultValue, InspectorPath inspectorPath) {
+        super(name, SepiaTone.class, readWrite, defaultValue, inspectorPath);
+    }
+
+    /*
+     * ComplexPropertyMetadata
+     */
+    
+    @Override
+    protected SepiaTone castValue(Object value) {
+        return (SepiaTone) value;
+    }
+    
+    @Override
+    public void updateFxomInstanceWithValue(FXOMInstance valueInstance, SepiaTone value) {
+        inputMetadata.setValue(valueInstance, value.getInput());
+        levelMetadata.setValue(valueInstance, value.getLevel());
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/metadata/property/value/effect/ShadowPropertyMetadata.java	Tue Jan 07 12:06:59 2014 +0100
@@ -0,0 +1,93 @@
+/*
+ * Copyright (c) 2012, 2014, Oracle and/or its affiliates.
+ * All rights reserved. Use is subject to license terms.
+ *
+ * This file is available and licensed under the following license:
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *  - Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ *  - Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in
+ *    the documentation and/or other materials provided with the distribution.
+ *  - Neither the name of Oracle Corporation nor the names of its
+ *    contributors may be used to endorse or promote products derived
+ *    from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package com.oracle.javafx.scenebuilder.kit.metadata.property.value.effect;
+
+import com.oracle.javafx.scenebuilder.kit.fxom.FXOMInstance;
+import com.oracle.javafx.scenebuilder.kit.metadata.property.value.ComplexPropertyMetadata;
+import com.oracle.javafx.scenebuilder.kit.metadata.property.value.DoublePropertyMetadata;
+import com.oracle.javafx.scenebuilder.kit.metadata.property.value.EnumerationPropertyMetadata;
+import com.oracle.javafx.scenebuilder.kit.metadata.property.value.paint.ColorPropertyMetadata;
+import com.oracle.javafx.scenebuilder.kit.metadata.util.InspectorPath;
+import com.oracle.javafx.scenebuilder.kit.metadata.util.PropertyName;
+import javafx.scene.effect.BlurType;
+import javafx.scene.effect.Shadow;
+import javafx.scene.paint.Color;
+
+/**
+ *
+ */
+public class ShadowPropertyMetadata extends ComplexPropertyMetadata<Shadow> {
+    
+    private final EnumerationPropertyMetadata blurTypeMetadata
+            = new EnumerationPropertyMetadata(new PropertyName("blurType"), //NOI18N
+            BlurType.class, true, BlurType.THREE_PASS_BOX, InspectorPath.UNUSED);
+    private final ColorPropertyMetadata colorMetadata
+            = new ColorPropertyMetadata(new PropertyName("color"), //NOI18N
+            true /* readWrite */, Color.BLACK, InspectorPath.UNUSED);
+    private final DoublePropertyMetadata heightMetadata
+            = new DoublePropertyMetadata(new PropertyName("height"), //NOI18N
+            DoublePropertyMetadata.DoubleKind.SIZE, true /* readWrite */, 21.0, InspectorPath.UNUSED);
+    private final EffectPropertyMetadata inputMetadata
+            = new EffectPropertyMetadata(new PropertyName("input"), //NOI18N
+            true /* readWrite */, null, InspectorPath.UNUSED);
+    private final DoublePropertyMetadata widthMetadata
+            = new DoublePropertyMetadata(new PropertyName("width"), //NOI18N
+            DoublePropertyMetadata.DoubleKind.SIZE, true /* readWrite */, 21.0, InspectorPath.UNUSED);
+    private final DoublePropertyMetadata radiusMetadata
+            = new DoublePropertyMetadata(new PropertyName("radius"), //NOI18N
+            DoublePropertyMetadata.DoubleKind.SIZE, true /* readWrite */, 10.0, InspectorPath.UNUSED);
+
+    public ShadowPropertyMetadata(PropertyName name, boolean readWrite, 
+            Shadow defaultValue, InspectorPath inspectorPath) {
+        super(name, Shadow.class, readWrite, defaultValue, inspectorPath);
+    }
+
+    /*
+     * ComplexPropertyMetadata
+     */
+    
+    @Override
+    protected Shadow castValue(Object value) {
+        return (Shadow) value;
+    }
+    
+    @Override
+    public void updateFxomInstanceWithValue(FXOMInstance valueInstance, Shadow value) {
+        blurTypeMetadata.setValue(valueInstance, value.getBlurType().toString());
+        colorMetadata.setValue(valueInstance, value.getColor());
+        heightMetadata.setValue(valueInstance, value.getHeight());
+        inputMetadata.setValue(valueInstance, value.getInput());
+        radiusMetadata.setValue(valueInstance, value.getRadius());
+        widthMetadata.setValue(valueInstance, value.getWidth());
+    }
+}
--- a/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/metadata/util/GradientEncoder.java	Mon Jan 06 11:23:36 2014 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,108 +0,0 @@
-/*
- * Copyright (c) 2012, 2013, Oracle and/or its affiliates.
- * All rights reserved. Use is subject to license terms.
- *
- * This file is available and licensed under the following license:
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- *  - Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- *  - Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in
- *    the documentation and/or other materials provided with the distribution.
- *  - Neither the name of Oracle Corporation nor the names of its
- *    contributors may be used to endorse or promote products derived
- *    from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-package com.oracle.javafx.scenebuilder.kit.metadata.util;
-
-import javafx.scene.paint.LinearGradient;
-import javafx.scene.paint.RadialGradient;
-import javafx.scene.paint.Stop;
-
-/**
- * Encoder for the gradient color
- */
-public class GradientEncoder {
-
-    public static String encodeLinearGradient(LinearGradient gradient) {
-        // For now, simple case is handled. Is there any other cases ?
-        // Need to check all possible syntaxes.
-        final StringBuilder sb = new StringBuilder();
-        sb.append("linear-gradient("); //NOI18N
-        sb.append("from "); //NOI18N
-        sb.append(gradient.getStartX() * 100);
-        sb.append("% "); //NOI18N
-        sb.append(gradient.getStartY() * 100);
-        sb.append("% "); //NOI18N
-        sb.append("to "); //NOI18N
-        sb.append(gradient.getEndX()* 100);
-        sb.append("% "); //NOI18N
-        sb.append(gradient.getEndY() * 100);
-        sb.append("%, "); //NOI18N
-
-        int index = 1;
-        for (Stop stop : gradient.getStops()) {
-            final String color = ColorEncoder.encodeColor(stop.getColor());
-            sb.append(color);
-            sb.append(" ");
-            sb.append(stop.getOffset() * 100);
-            sb.append("%");
-            if (index++ < gradient.getStops().size()) {
-                sb.append(", ");
-            }
-        }
-        sb.append(")"); //NOI18N
-        return sb.toString();
-    }
-
-    public static String encodeRadialGradient(RadialGradient gradient) {
-        // For now, simple case is handled. Is there any other cases ?
-        // Need to check all possible syntaxes.
-        final StringBuilder sb = new StringBuilder();
-        sb.append("radial-gradient("); //NOI18N
-        sb.append("focus-angle "); //NOI18N
-        sb.append(gradient.getFocusAngle() * 100);
-        sb.append("deg, "); //NOI18N
-        sb.append("focus-distance "); //NOI18N
-        sb.append(gradient.getFocusDistance() * 100);
-        sb.append("%, "); //NOI18N
-        sb.append("center "); //NOI18N
-        sb.append(gradient.getCenterX() * 100);
-        sb.append("% "); //NOI18N
-        sb.append(gradient.getCenterY() * 100);
-        sb.append("%, "); //NOI18N
-        sb.append("radius "); //NOI18N
-        sb.append(gradient.getRadius() * 100);
-        sb.append("%, "); //NOI18N
-
-        int index = 1;
-        for (Stop stop : gradient.getStops()) {
-            final String color = ColorEncoder.encodeColor(stop.getColor());
-            sb.append(color);
-            sb.append(" ");
-            sb.append(stop.getOffset() * 100);
-            sb.append("%");
-            if (index++ < gradient.getStops().size()) {
-                sb.append(", ");
-            }
-        }
-        sb.append(")"); //NOI18N
-        return sb.toString();
-    }
-}
--- a/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/metadata/util/PrefixedValue.java	Mon Jan 06 11:23:36 2014 +0200
+++ b/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/metadata/util/PrefixedValue.java	Tue Jan 07 12:06:59 2014 +0100
@@ -32,7 +32,9 @@
 
 package com.oracle.javafx.scenebuilder.kit.metadata.util;
 
+import java.io.File;
 import java.net.MalformedURLException;
+import java.net.URISyntaxException;
 import java.net.URL;
 import java.nio.file.Path;
 import java.nio.file.Paths;
@@ -272,15 +274,20 @@
     
     public static PrefixedValue makePrefixedValue(URL assetURL, URL documentURL) {
         
-        final Path documentPath = Paths.get(documentURL.getPath());
-        final Path assetPath = Paths.get(assetURL.getPath());
-        final Path parentPath = documentPath.getParent();
+        final File assetFile, documentFile;
+        try {
+            assetFile = new File(assetURL.toURI());
+            documentFile = new File(documentURL.toURI());
+        } catch(URISyntaxException x) {
+            throw new IllegalArgumentException(x);
+        }
+        final File parentFile = documentFile.getParentFile();
         
         final PrefixedValue result;
-        if ((parentPath == null) || parentPath.equals(assetPath)) {
+        if ((parentFile == null) || parentFile.equals(assetFile)) {
             throw new IllegalArgumentException(documentURL.toString());
         } else {
-            final Path relativePath = parentPath.relativize(assetPath);
+            final Path relativePath = parentFile.toPath().relativize(assetFile.toPath());
             result = new PrefixedValue(Type.DOCUMENT_RELATIVE_PATH, relativePath.toString());
         }
         
--- a/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/util/Deprecation.java	Mon Jan 06 11:23:36 2014 +0200
+++ b/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/util/Deprecation.java	Tue Jan 07 12:06:59 2014 +0100
@@ -34,9 +34,7 @@
 import com.sun.glass.ui.Application;
 import com.sun.glass.ui.Application.EventHandler;
 import com.sun.javafx.css.Style;
-import com.sun.javafx.geom.PickRay;
 import com.sun.javafx.scene.control.skin.MenuBarSkin;
-import com.sun.javafx.scene.input.PickResultChooser;
 import java.net.URL;
 import java.util.List;
 import javafx.collections.ObservableMap;
@@ -44,11 +42,10 @@
 import javafx.css.Styleable;
 import javafx.css.StyleableProperty;
 import javafx.fxml.FXMLLoader;
+import javafx.fxml.JavaFXBuilderFactory;
 import javafx.geometry.Bounds;
-import javafx.geometry.Point2D;
 import javafx.scene.Group;
 import javafx.scene.Node;
-import javafx.scene.Parent;
 import javafx.scene.control.MenuBar;
 import javafx.scene.control.MenuItem;
 import javafx.scene.control.PopupControl;
@@ -193,40 +190,53 @@
         return result;
     }
     
-    
     public static URL getCaspianStylesheetURL() {
         final String resourceName = "com/sun/javafx/scene/control/skin/caspian/caspian.bss"; //NOI18N
         return ClassLoader.getSystemResource(resourceName);
     }
     
-    
     public static URL getCaspianHighContrastStylesheetURL() {
         final String resourceName = "com/sun/javafx/scene/control/skin/caspian/highcontrast.bss"; //NOI18N
         return ClassLoader.getSystemResource(resourceName);
     }
     
-    
     public static URL getCaspianEmbeddedStylesheetURL() {
         final String resourceName = "com/sun/javafx/scene/control/skin/caspian/embedded.bss"; //NOI18N
         return ClassLoader.getSystemResource(resourceName);
     }
     
-    
     public static URL getCaspianEmbeddedQVGAStylesheetURL() {
         final String resourceName = "com/sun/javafx/scene/control/skin/caspian/embedded-qvga.bss"; //NOI18N
         return ClassLoader.getSystemResource(resourceName);
     }
     
-    
     public static URL getModenaStylesheetURL() {
         final String resourceName = "com/sun/javafx/scene/control/skin/modena/modena.bss"; //NOI18N
         return ClassLoader.getSystemResource(resourceName);
     }
     
-    
     public static URL getModenaTouchStylesheetURL() {
         final String resourceName = "com/sun/javafx/scene/control/skin/modena/touch.bss"; //NOI18N
         return ClassLoader.getSystemResource(resourceName);
     }
+    
+    public static URL getModenaHighContrastBlackonwhiteStylesheetURL() {
+        final String resourceName = "com/sun/javafx/scene/control/skin/modena/blackOnWhite.css"; //NOI18N
+        return ClassLoader.getSystemResource(resourceName);
+    }
 
+    public static URL getModenaHighContrastWhiteonblackStylesheetURL() {
+        final String resourceName = "com/sun/javafx/scene/control/skin/modena/whiteOnBlack.css"; //NOI18N
+        return ClassLoader.getSystemResource(resourceName);
+    }
+
+    public static URL getModenaHighContrastYellowonblackStylesheetURL() {
+        final String resourceName = "com/sun/javafx/scene/control/skin/modena/yellowOnBlack.css"; //NOI18N
+        return ClassLoader.getSystemResource(resourceName);
+    }
+
+    // RT-21230 : Promote JavaFXBuilderFactory(ClassLoader classLoader, boolean alwaysUseBuilders) constructor to public API
+    public static JavaFXBuilderFactory newJavaFXBuilderFactory(ClassLoader classLoader) {
+        return new JavaFXBuilderFactory(classLoader, false /* alwaysUseBuilders */);
+    }
 }
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/util/URLUtils.java	Tue Jan 07 12:06:59 2014 +0100
@@ -0,0 +1,63 @@
+/*
+ * Copyright (c) 2012, 2014, Oracle and/or its affiliates.
+ * All rights reserved. Use is subject to license terms.
+ *
+ * This file is available and licensed under the following license:
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *  - Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ *  - Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in
+ *    the documentation and/or other materials provided with the distribution.
+ *  - Neither the name of Oracle Corporation nor the names of its
+ *    contributors may be used to endorse or promote products derived
+ *    from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package com.oracle.javafx.scenebuilder.kit.util;
+
+import java.net.URI;
+import java.net.URISyntaxException;
+import java.net.URL;
+
+/**
+ *
+ */
+public class URLUtils {
+    
+    public static boolean equals(URL url1, URL url2) {
+        boolean result;
+        
+        if (url1 == url2) {
+            result = true;
+        } else if ((url1 == null) || (url2 == null)) {
+            result = false;
+        } else {
+            try {
+                final URI uri1 = url1.toURI();
+                final URI uri2 = url2.toURI();
+                result = uri1.equals(uri2);
+            } catch(URISyntaxException x) {
+                result = false; // Emergency code
+            }
+        }
+        
+        return result;
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/util/control/effectpicker/BlendPathItem.java	Tue Jan 07 12:06:59 2014 +0100
@@ -0,0 +1,135 @@
+/*
+ * Copyright (c) 2012, 2014, Oracle and/or its affiliates.
+ * All rights reserved. Use is subject to license terms.
+ *
+ * This file is available and licensed under the following license:
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *  - Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ *  - Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in
+ *    the documentation and/or other materials provided with the distribution.
+ *  - Neither the name of Oracle Corporation nor the names of its
+ *    contributors may be used to endorse or promote products derived
+ *    from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+package com.oracle.javafx.scenebuilder.kit.util.control.effectpicker;
+
+import javafx.event.ActionEvent;
+import javafx.event.EventHandler;
+import javafx.scene.control.Menu;
+import javafx.scene.control.RadioMenuItem;
+import javafx.scene.control.SeparatorMenuItem;
+import javafx.scene.control.ToggleGroup;
+import javafx.scene.effect.Blend;
+import javafx.scene.effect.Effect;
+
+/**
+ * Effect path item for the blend effect.
+ */
+public class BlendPathItem extends EffectPathItem {
+
+    private final RadioMenuItem topMenuItem = new RadioMenuItem("TopInput"); //NOI18N
+    private final RadioMenuItem bottomMenuItem = new RadioMenuItem("BottomInput"); //NOI18N
+    private final ToggleGroup inputToggleGroup = new ToggleGroup();
+    private EffectPathItem topInputPathItem;
+    private EffectPathItem bottomInputPathItem;
+
+    public BlendPathItem(EffectPickerController epc, Effect effect, EffectPathItem hostPathItem) {
+        super(epc, effect, hostPathItem);
+        assert effect instanceof javafx.scene.effect.Blend;
+        initialize();
+    }
+
+    @Override
+    public EffectPathItem getSelectedInputPathItem() {
+        if (topMenuItem.isSelected()) {
+            return topInputPathItem;
+        } else {
+            assert bottomMenuItem.isSelected() == true;
+            return bottomInputPathItem;
+        }
+    }
+
+    @Override
+    public void setSelectedInput(Effect input) {
+        if (topMenuItem.isSelected()) {
+            setTopInput(input);
+        } else {
+            assert bottomMenuItem.isSelected() == true;
+            setBottomInput(input);
+        }
+    }
+
+    public void setTopInputPathItem(EffectPathItem epi) {
+        topInputPathItem = epi;
+    }
+
+    public void setBottomInputPathItem(EffectPathItem epi) {
+        bottomInputPathItem = epi;
+    }
+
+    public Effect getTopInput() {
+        return ((Blend) effect).getTopInput();
+    }
+
+    public void setTopInput(Effect input) {
+        ((Blend) effect).setTopInput(input);
+    }
+
+    public Effect getBottomInput() {
+        return ((Blend) effect).getBottomInput();
+    }
+
+    public void setBottomInput(Effect input) {
+        ((Blend) effect).setBottomInput(input);
+    }
+
+    private void initialize() {
+        // Add Select Input Menu
+        final Menu inputMenu = new Menu("Select Input"); //NOI18N
+        topMenuItem.setToggleGroup(inputToggleGroup);
+        topMenuItem.setOnAction(new EventHandler<ActionEvent>() {
+
+            @Override
+            public void handle(ActionEvent event) {
+                toggle_button.setText(getSimpleName() + " (TopInput)"); //NOI18N
+                effectPickerController.updateUI(BlendPathItem.this);
+            }
+        });
+        bottomMenuItem.setToggleGroup(inputToggleGroup);
+        bottomMenuItem.setOnAction(new EventHandler<ActionEvent>() {
+
+            @Override
+            public void handle(ActionEvent event) {
+                toggle_button.setText(getSimpleName() + " (BottomInput)"); //NOI18N
+                effectPickerController.updateUI(BlendPathItem.this);
+            }
+        });
+
+        inputMenu.getItems().addAll(topMenuItem, bottomMenuItem);
+        menu_button.getItems().add(0, inputMenu);
+        menu_button.getItems().add(1, new SeparatorMenuItem());
+
+        // TopInput selected at init time
+        toggle_button.setText(getSimpleName() + " (TopInput)"); //NOI18N
+        topMenuItem.setSelected(true);
+        bottomMenuItem.setSelected(false);
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/util/control/effectpicker/ColorInputPathItem.java	Tue Jan 07 12:06:59 2014 +0100
@@ -0,0 +1,65 @@
+/*
+ * Copyright (c) 2012, 2014, Oracle and/or its affiliates.
+ * All rights reserved. Use is subject to license terms.
+ *
+ * This file is available and licensed under the following license:
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *  - Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ *  - Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in
+ *    the documentation and/or other materials provided with the distribution.
+ *  - Neither the name of Oracle Corporation nor the names of its
+ *    contributors may be used to endorse or promote products derived
+ *    from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+package com.oracle.javafx.scenebuilder.kit.util.control.effectpicker;
+
+import javafx.scene.effect.Effect;
+import javafx.scene.paint.Paint;
+
+/**
+ * Effect path item for the color input effect.
+ */
+public class ColorInputPathItem extends EffectPathItem {
+
+    private Paint paint;
+
+    public ColorInputPathItem(EffectPickerController epc, Effect effect, EffectPathItem hostPathItem) {
+        super(epc, effect, hostPathItem);
+        assert effect instanceof javafx.scene.effect.ColorInput;
+        initialize();
+    }
+
+    @Override
+    public EffectPathItem getSelectedInputPathItem() {
+        return null;
+    }
+
+    @Override
+    public void setSelectedInput(Effect input) {
+        // No input
+    }
+
+    private void initialize() {
+        // Remove replace/delete input Menu
+        menu_button.getItems().remove(delete_input_menuitem);
+        menu_button.getItems().remove(replace_input_menu);
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/util/control/effectpicker/EffectPathItem.fxml	Tue Jan 07 12:06:59 2014 +0100
@@ -0,0 +1,101 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<!--
+  Copyright (c) 2012, 2014, Oracle and/or its affiliates.
+  All rights reserved. Use is subject to license terms.
+
+  This file is available and licensed under the following license:
+
+  Redistribution and use in source and binary forms, with or without
+  modification, are permitted provided that the following conditions
+  are met:
+
+  - Redistributions of source code must retain the above copyright
+    notice, this list of conditions and the following disclaimer.
+  - Redistributions in binary form must reproduce the above copyright
+    notice, this list of conditions and the following disclaimer in
+    the documentation and/or other materials provided with the distribution.
+  - Neither the name of Oracle Corporation nor the names of its
+    contributors may be used to endorse or promote products derived
+    from this software without specific prior written permission.
+
+  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+  "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+  LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+  A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+  OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+  SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+  LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+  DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+  THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+  OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+-->
+<?import java.lang.*?>
+<?import java.util.*?>
+<?import javafx.scene.control.*?>
+<?import javafx.scene.image.*?>
+<?import javafx.scene.layout.*?>
+<?import javafx.scene.paint.*?>
+
+<fx:root type="javafx.scene.layout.HBox" id="CONTENT" alignment="CENTER" maxWidth="-1.0" prefHeight="-1.0" prefWidth="-1.0" spacing="2.0" style="" visible="true" xmlns:fx="http://javafx.com/fxml/1" xmlns="http://javafx.com/javafx/2.2">
+  <children>
+    <ToggleButton fx:id="toggle_button" ellipsisString="" mnemonicParsing="false" onAction="#selectEffect" text="Blend (TopInput)">
+      <graphic>
+        <ImageView fx:id="image_view" />
+      </graphic>
+      <tooltip>
+        <Tooltip text="Blend (Input 1)" fx:id="tool_tip" />
+      </tooltip>
+    </ToggleButton>
+    <MenuButton fx:id="menu_button" minWidth="23.0" mnemonicParsing="false" prefWidth="23.0" text="">
+      <items>
+        <Menu mnemonicParsing="false" text="Replace Effect">
+          <items>
+            <MenuItem mnemonicParsing="false" onAction="#replaceEffect" text="Blend" />
+            <MenuItem mnemonicParsing="false" onAction="#replaceEffect" text="Bloom" />
+            <MenuItem mnemonicParsing="false" onAction="#replaceEffect" text="BoxBlur" />
+            <MenuItem mnemonicParsing="false" onAction="#replaceEffect" text="ColorAdjust" />
+            <MenuItem mnemonicParsing="false" onAction="#replaceEffect" text="ColorInput" />
+            <MenuItem mnemonicParsing="false" onAction="#replaceEffect" text="DisplacementMap" />
+            <MenuItem mnemonicParsing="false" onAction="#replaceEffect" text="DropShadow" />
+            <MenuItem mnemonicParsing="false" onAction="#replaceEffect" text="GaussianBlur" />
+            <MenuItem mnemonicParsing="false" onAction="#replaceEffect" text="Glow" />
+            <MenuItem mnemonicParsing="false" onAction="#replaceEffect" text="ImageInput" />
+            <MenuItem mnemonicParsing="false" onAction="#replaceEffect" text="InnerShadow" />
+            <MenuItem mnemonicParsing="false" onAction="#replaceEffect" text="Lighting" />
+            <MenuItem mnemonicParsing="false" onAction="#replaceEffect" text="MotionBlur" />
+            <MenuItem mnemonicParsing="false" onAction="#replaceEffect" text="PerspectiveTransform" />
+            <MenuItem mnemonicParsing="false" onAction="#replaceEffect" text="Reflection" />
+            <MenuItem mnemonicParsing="false" onAction="#replaceEffect" text="SepiaTone" />
+            <MenuItem mnemonicParsing="false" onAction="#replaceEffect" text="Shadow" />
+          </items>
+        </Menu>
+        <Menu mnemonicParsing="false" text="Replace Effect Input" fx:id="replace_input_menu">
+          <items>
+            <MenuItem mnemonicParsing="false" onAction="#replaceEffectInput" text="Blend" />
+            <MenuItem mnemonicParsing="false" onAction="#replaceEffectInput" text="Bloom" />
+            <MenuItem mnemonicParsing="false" onAction="#replaceEffectInput" text="BoxBlur" />
+            <MenuItem mnemonicParsing="false" onAction="#replaceEffectInput" text="ColorAdjust" />
+            <MenuItem mnemonicParsing="false" onAction="#replaceEffectInput" text="ColorInput" />
+            <MenuItem mnemonicParsing="false" onAction="#replaceEffectInput" text="DisplacementMap" />
+            <MenuItem mnemonicParsing="false" onAction="#replaceEffectInput" text="DropShadow" />
+            <MenuItem mnemonicParsing="false" onAction="#replaceEffectInput" text="GaussianBlur" />
+            <MenuItem mnemonicParsing="false" onAction="#replaceEffectInput" text="Glow" />
+            <MenuItem mnemonicParsing="false" onAction="#replaceEffectInput" text="ImageInput" />
+            <MenuItem mnemonicParsing="false" onAction="#replaceEffectInput" text="InnerShadow" />
+            <MenuItem mnemonicParsing="false" onAction="#replaceEffectInput" text="Lighting" />
+            <MenuItem mnemonicParsing="false" onAction="#replaceEffectInput" text="MotionBlur" />
+            <MenuItem mnemonicParsing="false" onAction="#replaceEffectInput" text="PerspectiveTransform" />
+            <MenuItem mnemonicParsing="false" onAction="#replaceEffectInput" text="Reflection" />
+            <MenuItem mnemonicParsing="false" onAction="#replaceEffectInput" text="SepiaTone" />
+            <MenuItem mnemonicParsing="false" onAction="#replaceEffectInput" text="Shadow" />
+          </items>
+        </Menu>
+        <SeparatorMenuItem mnemonicParsing="false" />
+        <MenuItem mnemonicParsing="false" onAction="#deleteEffect" text="Delete Effect" />
+        <MenuItem mnemonicParsing="false" onAction="#deleteEffectInput" text="Delete Effect Input" fx:id="delete_input_menuitem" />
+      </items>
+    </MenuButton>
+  </children>
+</fx:root>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/util/control/effectpicker/EffectPathItem.java	Tue Jan 07 12:06:59 2014 +0100
@@ -0,0 +1,209 @@
+/*
+ * Copyright (c) 2012, 2014, Oracle and/or its affiliates.
+ * All rights reserved. Use is subject to license terms.
+ *
+ * This file is available and licensed under the following license:
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *  - Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ *  - Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in
+ *    the documentation and/or other materials provided with the distribution.
+ *  - Neither the name of Oracle Corporation nor the names of its
+ *    contributors may be used to endorse or promote products derived
+ *    from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+package com.oracle.javafx.scenebuilder.kit.util.control.effectpicker;
+
+import java.io.IOException;
+import java.net.URL;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+import javafx.event.ActionEvent;
+import javafx.fxml.FXML;
+import javafx.fxml.FXMLLoader;
+import javafx.scene.control.Menu;
+import javafx.scene.control.MenuButton;
+import javafx.scene.control.MenuItem;
+import javafx.scene.control.ToggleButton;
+import javafx.scene.control.ToggleGroup;
+import javafx.scene.control.Tooltip;
+import javafx.scene.effect.Effect;
+import javafx.scene.image.Image;
+import javafx.scene.image.ImageView;
+import javafx.scene.layout.HBox;
+
+/**
+ * Effect path item.
+ */
+public abstract class EffectPathItem extends HBox {
+
+    @FXML
+    protected ImageView image_view;
+    @FXML
+    protected MenuButton menu_button;
+    @FXML
+    protected ToggleButton toggle_button;
+    @FXML
+    protected Tooltip tool_tip;
+    @FXML
+    public MenuItem delete_input_menuitem;
+    @FXML
+    public Menu replace_input_menu;
+
+    protected final Effect effect;
+    protected final EffectPathItem hostPathItem;
+    protected final EffectPickerController effectPickerController;
+
+    public EffectPathItem(EffectPickerController epc, Effect effect, EffectPathItem hostPathItem) {
+        assert epc != null;
+        assert effect != null;
+        this.effectPickerController = epc;
+        this.hostPathItem = hostPathItem;
+        this.effect = effect;
+        initialize();
+    }
+
+    public Effect getValue() {
+        return effect;
+    }
+
+    public ToggleButton getToggleButton() {
+        return toggle_button;
+    }
+
+    public EffectPathItem getHostPathItem() {
+        return hostPathItem;
+    }
+
+    public abstract EffectPathItem getSelectedInputPathItem();
+
+    public abstract void setSelectedInput(Effect input);
+
+    public String getSimpleName() {
+        return effect.getClass().getSimpleName();
+    }
+
+    @FXML
+    void deleteEffect(ActionEvent event) {
+        // Update model
+        //---------------------------------------------
+        if (getHostPathItem() != null) {
+            // Delete this effect from the chain but relink it's input to its parent effect
+            if (getSelectedInputPathItem() != null) {
+                final Effect input = getSelectedInputPathItem().getValue();
+                getHostPathItem().setSelectedInput(input);
+            } else {
+                getHostPathItem().setSelectedInput(null);
+            }
+
+        } else {
+            // This is the root effect
+            effectPickerController.setRootEffectProperty(null);
+        }
+
+        // Update UI
+        //---------------------------------------------
+        effectPickerController.updateUI();
+    }
+
+    @FXML
+    void deleteEffectInput(ActionEvent event) {
+        // Update model
+        //---------------------------------------------
+        setSelectedInput(null);
+
+        // Update UI
+        //---------------------------------------------
+        effectPickerController.updateUI();
+    }
+
+    @FXML
+    void replaceEffect(ActionEvent event) {
+        final MenuItem menuItem = (MenuItem) event.getSource();
+        final String text = menuItem.getText();
+        // Update model
+        //---------------------------------------------
+        final Effect new_effect = Utils.newInstance(text);
+        // Update effect input if any
+        if (getSelectedInputPathItem() != null) {
+            final Effect input = getSelectedInputPathItem().getValue();
+            Utils.setDefaultInput(new_effect, input);
+        }
+        // Update effect host if any
+        if (getHostPathItem() != null) {
+            getHostPathItem().setSelectedInput(new_effect);
+        } else {
+            // This is the root effect
+            effectPickerController.setRootEffectProperty(new_effect);
+        }
+
+        // Update UI
+        //---------------------------------------------
+        effectPickerController.updateUI();
+    }
+
+    @FXML
+    void replaceEffectInput(ActionEvent event) {
+        final MenuItem menuItem = (MenuItem) event.getSource();
+        final String text = menuItem.getText();
+        // Update model
+        //---------------------------------------------
+        final Effect new_effect = Utils.newInstance(text);
+        setSelectedInput(new_effect);
+
+        // Update UI
+        //---------------------------------------------
+        effectPickerController.updateUI();
+    }
+
+    @FXML
+    void selectEffect(ActionEvent event) {
+        effectPickerController.selectEffectPathItem(this);
+    }
+
+    private void initialize() {
+        final FXMLLoader loader = new FXMLLoader();
+        loader.setLocation(EffectPathItem.class.getResource("EffectPathItem.fxml")); //NOI18N
+        loader.setController(this);
+        loader.setRoot(this);
+        try {
+            loader.load();
+        } catch (IOException ex) {
+            Logger.getLogger(EffectPathItem.class.getName()).log(Level.SEVERE, null, ex);
+        }
+
+        assert image_view != null;
+        assert menu_button != null;
+        assert toggle_button != null;
+        assert tool_tip != null;
+        assert delete_input_menuitem != null;
+        assert replace_input_menu != null;
+
+        // Update ToggleButton
+        final ToggleGroup toggleGroup = effectPickerController.getEffectToggleGroup();
+        toggle_button.setToggleGroup(toggleGroup);
+        toggle_button.setText(getSimpleName());
+
+        // Update ImageView
+        final URL url = EffectPathItem.class.getResource("images/" + effect.getClass().getSimpleName() + ".png"); //NOI18N
+        final Image img = new Image(url.toExternalForm());
+        image_view.setImage(img);
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/util/control/effectpicker/EffectPicker.css	Tue Jan 07 12:06:59 2014 +0100
@@ -0,0 +1,31 @@
+/*
+ * Copyright (c) 2012, 2014, Oracle and/or its affiliates.
+ * All rights reserved. Use is subject to license terms.
+ *
+ * This file is available and licensed under the following license:
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *  - Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ *  - Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in
+ *    the documentation and/or other materials provided with the distribution.
+ *  - Neither the name of Oracle Corporation nor the names of its
+ *    contributors may be used to endorse or promote products derived
+ *    from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/util/control/effectpicker/EffectPicker.fxml	Tue Jan 07 12:06:59 2014 +0100
@@ -0,0 +1,51 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<!--
+  Copyright (c) 2012, 2014, Oracle and/or its affiliates.
+  All rights reserved. Use is subject to license terms.
+
+  This file is available and licensed under the following license:
+
+  Redistribution and use in source and binary forms, with or without
+  modification, are permitted provided that the following conditions
+  are met:
+
+  - Redistributions of source code must retain the above copyright
+    notice, this list of conditions and the following disclaimer.
+  - Redistributions in binary form must reproduce the above copyright
+    notice, this list of conditions and the following disclaimer in
+    the documentation and/or other materials provided with the distribution.
+  - Neither the name of Oracle Corporation nor the names of its
+    contributors may be used to endorse or promote products derived
+    from this software without specific prior written permission.
+
+  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+  "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+  LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+  A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+  OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+  SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+  LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+  DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+  THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+  OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+-->
+<?import java.lang.*?>
+<?import java.net.*?>
+<?import java.util.*?>
+<?import javafx.geometry.*?>
+<?import javafx.scene.control.*?>
+<?import javafx.scene.image.*?>
+<?import javafx.scene.layout.*?>
+<?import javafx.scene.paint.*?>
+
+<VBox fx:id="root_vbox" alignment="TOP_LEFT" maxWidth="-1.0" prefWidth="-1.0" spacing="8.0" style="" xmlns:fx="http://javafx.com/fxml/1" xmlns="http://javafx.com/javafx/2.2" fx:controller="com.oracle.javafx.scenebuilder.kit.util.control.effectpicker.EffectPickerController">
+  <children>
+    <HBox fx:id="effects_path_hbox" alignment="CENTER_LEFT" maxWidth="-1.0" minWidth="100.0" spacing="4.0" />
+    <VBox fx:id="props_vbox" />
+  </children>
+  <stylesheets>
+    <URL value="@EffectPicker.css" />
+  </stylesheets>
+</VBox>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/util/control/effectpicker/EffectPicker.java	Tue Jan 07 12:06:59 2014 +0100
@@ -0,0 +1,147 @@
+/*
+ * Copyright (c) 2012, 2014, Oracle and/or its affiliates.
+ * All rights reserved. Use is subject to license terms.
+ *
+ * This file is available and licensed under the following license:
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *  - Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ *  - Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in
+ *    the documentation and/or other materials provided with the distribution.
+ *  - Neither the name of Oracle Corporation nor the names of its
+ *    contributors may be used to endorse or promote products derived
+ *    from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+package com.oracle.javafx.scenebuilder.kit.util.control.effectpicker;
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+import javafx.beans.property.ObjectProperty;
+import javafx.event.ActionEvent;
+import javafx.event.EventHandler;
+import javafx.fxml.FXMLLoader;
+import javafx.scene.Node;
+import javafx.scene.control.MenuItem;
+import javafx.scene.effect.Blend;
+import javafx.scene.effect.Bloom;
+import javafx.scene.effect.BoxBlur;
+import javafx.scene.effect.ColorAdjust;
+import javafx.scene.effect.ColorInput;
+import javafx.scene.effect.DisplacementMap;
+import javafx.scene.effect.DropShadow;
+import javafx.scene.effect.Effect;
+import javafx.scene.effect.GaussianBlur;
+import javafx.scene.effect.Glow;
+import javafx.scene.effect.ImageInput;
+import javafx.scene.effect.InnerShadow;
+import javafx.scene.effect.Lighting;
+import javafx.scene.effect.MotionBlur;
+import javafx.scene.effect.PerspectiveTransform;
+import javafx.scene.effect.Reflection;
+import javafx.scene.effect.SepiaTone;
+import javafx.scene.effect.Shadow;
+import javafx.scene.layout.Pane;
+
+/**
+ * Effects editor control.
+ */
+public class EffectPicker extends Pane {
+
+    private final EffectPickerController controller;
+
+    private final Class<?>[] effectClasses = {
+        Blend.class,
+        Bloom.class,
+        BoxBlur.class,
+        ColorAdjust.class,
+        ColorInput.class,
+        DisplacementMap.class,
+        DropShadow.class,
+        GaussianBlur.class,
+        Glow.class,
+        ImageInput.class,
+        InnerShadow.class,
+        Lighting.class,
+        MotionBlur.class,
+        PerspectiveTransform.class,
+        Reflection.class,
+        SepiaTone.class,
+        Shadow.class};
+
+    public EffectPicker() {
+        final FXMLLoader loader = new FXMLLoader();
+        loader.setLocation(EffectPicker.class.getResource("EffectPicker.fxml")); //NOI18N
+
+        try {
+            // Loading
+            final Object rootObject = loader.load();
+            assert rootObject instanceof Node;
+            final Node rootNode = (Node) rootObject;
+            getChildren().add(rootNode);
+
+            // Retrieving the controller
+            final Object ctl = loader.getController();
+            assert ctl instanceof EffectPickerController;
+            this.controller = (EffectPickerController) ctl;
+        } catch (IOException ex) {
+            throw new IllegalStateException(ex);
+        }
+    }
+
+    public final ObjectProperty<Effect> rootEffectProperty() {
+        return controller.rootEffectProperty();
+    }
+
+    public final void setRootEffectProperty(Effect value) {
+        // Update model
+        controller.setRootEffectProperty(value);
+        // Update UI
+        controller.updateUI();
+    }
+
+    public final Effect getRootEffectProperty() {
+        return controller.getRootEffectProperty();
+    }
+
+    public void reset() {
+        controller.reset();
+    }
+
+    public String getEffectPath() {
+        return controller.getEffectPath();
+    }
+
+    public List<MenuItem> getMenuItems() {
+        final List<MenuItem> menuItems = new ArrayList<>();
+        for (final Class<?> clazz : effectClasses) {
+            final MenuItem mi = new MenuItem(clazz.getSimpleName());
+            mi.setOnAction(new EventHandler<ActionEvent>() {
+                @Override
+                public void handle(ActionEvent t) {
+                    final Effect effect = Utils.newInstance(clazz);
+                    setRootEffectProperty(effect);
+                }
+            });
+            menuItems.add(mi);
+        }
+        return menuItems;
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/util/control/effectpicker/EffectPickerController.java	Tue Jan 07 12:06:59 2014 +0100
@@ -0,0 +1,829 @@
+/*
+ * Copyright (c) 2012, 2014, Oracle and/or its affiliates.
+ * All rights reserved. Use is subject to license terms.
+ *
+ * This file is available and licensed under the following license:
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *  - Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ *  - Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in
+ *    the documentation and/or other materials provided with the distribution.
+ *  - Neither the name of Oracle Corporation nor the names of its
+ *    contributors may be used to endorse or promote products derived
+ *    from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+package com.oracle.javafx.scenebuilder.kit.util.control.effectpicker;
+
+import com.oracle.javafx.scenebuilder.kit.util.control.effectpicker.editors.CheckBoxEditor;
+import com.oracle.javafx.scenebuilder.kit.util.control.effectpicker.editors.EnumEditor;
+import com.oracle.javafx.scenebuilder.kit.util.control.effectpicker.editors.ImageEditor;
+import com.oracle.javafx.scenebuilder.kit.util.control.effectpicker.editors.NumFieldEditor;
+import com.oracle.javafx.scenebuilder.kit.util.control.effectpicker.editors.SliderEditor;
+import com.oracle.javafx.scenebuilder.kit.util.control.paintpicker.PaintPicker;
+import com.oracle.javafx.scenebuilder.kit.util.control.paintpicker.PaintPickerController.Mode;
+import java.net.URL;
+import javafx.beans.property.ObjectProperty;
+import javafx.beans.property.SimpleObjectProperty;
+import javafx.beans.value.ChangeListener;
+import javafx.beans.value.ObservableValue;
+import javafx.fxml.FXML;
+import javafx.scene.control.Label;
+import javafx.scene.control.Slider;
+import javafx.scene.control.ToggleButton;
+import javafx.scene.control.ToggleGroup;
+import javafx.scene.effect.Blend;
+import javafx.scene.effect.BlendMode;
+import javafx.scene.effect.Bloom;
+import javafx.scene.effect.BlurType;
+import javafx.scene.effect.BoxBlur;
+import javafx.scene.effect.ColorAdjust;
+import javafx.scene.effect.ColorInput;
+import javafx.scene.effect.DisplacementMap;
+import javafx.scene.effect.DropShadow;
+import javafx.scene.effect.Effect;
+import javafx.scene.effect.GaussianBlur;
+import javafx.scene.effect.Glow;
+import javafx.scene.effect.ImageInput;
+import javafx.scene.effect.InnerShadow;
+import javafx.scene.effect.Lighting;
+import javafx.scene.effect.MotionBlur;
+import javafx.scene.effect.PerspectiveTransform;
+import javafx.scene.effect.Reflection;
+import javafx.scene.effect.SepiaTone;
+import javafx.scene.effect.Shadow;
+import javafx.scene.image.Image;
+import javafx.scene.image.ImageView;
+import javafx.scene.layout.HBox;
+import javafx.scene.layout.VBox;
+import javafx.scene.paint.Color;
+import javafx.scene.paint.Paint;
+
+/**
+ * Controller class for the effects editor.
+ */
+public class EffectPickerController {
+
+    @FXML
+    private VBox root_vbox;
+    @FXML
+    private VBox props_vbox;
+    @FXML
+    private HBox effects_path_hbox;
+
+    private final ToggleGroup effectToggleGroup = new ToggleGroup();
+    private final Image selectionChevronImage;
+
+    private final ObjectProperty<Effect> rootEffect = new SimpleObjectProperty<>();
+
+    public EffectPickerController() {
+        // Initialize selection chevron image
+        final URL selectionChevronURL = EffectPickerController.class.getResource("images/selection-chevron.png"); //NOI18N
+        assert selectionChevronURL != null;
+        selectionChevronImage = new Image(selectionChevronURL.toExternalForm());
+    }
+
+    public final ObjectProperty<Effect> rootEffectProperty() {
+        return rootEffect;
+    }
+
+    public final Effect getRootEffectProperty() {
+        return rootEffect.get();
+    }
+
+    public final void setRootEffectProperty(Effect value) {
+        rootEffect.setValue(value);
+    }
+
+    public void reset() {
+    }
+
+    /**
+     * Update the effect path items starting from the root effect path item.
+     */
+    public void updateUI() {
+        effects_path_hbox.getChildren().clear();
+        if (getRootEffectProperty() != null) {
+            final EffectPathItem rootEffectPathItem = makeEffectPathItem(getRootEffectProperty(), null);
+            assert rootEffectPathItem != null;
+            EffectPathItem epi = rootEffectPathItem;
+            while (epi != null) {
+                effects_path_hbox.getChildren().add(epi);
+                if (epi.getSelectedInputPathItem() != null) {
+                    final ImageView img = new ImageView(selectionChevronImage);
+                    effects_path_hbox.getChildren().add(img);
+                    epi = epi.getSelectedInputPathItem();
+                } else {
+                    epi = null;
+                }
+            }
+            selectEffectPathItem(rootEffectPathItem);
+        }
+    }
+
+    /**
+     * Update the effect path items starting from the specified effect path item.
+     *
+     * @param effectPathItem
+     */
+    public void updateUI(EffectPathItem effectPathItem) {
+        assert effectPathItem != null;
+        int index = effects_path_hbox.getChildren().indexOf(effectPathItem);
+        // Remove sub items if any
+        if (index + 1 < effects_path_hbox.getChildren().size()) {
+            effects_path_hbox.getChildren().remove(index + 1, effects_path_hbox.getChildren().size());
+        }
+        // Add new sub items if any
+        EffectPathItem epi = effectPathItem.getSelectedInputPathItem();
+        while (epi != null) {
+            effects_path_hbox.getChildren().add(epi);
+            if (epi.getSelectedInputPathItem() != null) {
+                final ImageView img = new ImageView(selectionChevronImage);
+                effects_path_hbox.getChildren().add(img);
+                epi = epi.getSelectedInputPathItem();
+            } else {
+                epi = null;
+            }
+        }
+    }
+
+    public ToggleGroup getEffectToggleGroup() {
+        return effectToggleGroup;
+    }
+
+    public String getEffectPath() {
+        final EffectPathItem rootEffectPathItem = makeEffectPathItem(getRootEffectProperty(), null);
+        if (rootEffectPathItem == null) {
+            return "+"; //NOI18N
+        } else {
+            final StringBuilder sb = new StringBuilder();
+            EffectPathItem epi = rootEffectPathItem;
+            while (epi != null) {
+                sb.append(epi.getSimpleName());
+                if (epi.getSelectedInputPathItem() != null) {
+                    sb.append(", "); //NOI18N
+                    epi = epi.getSelectedInputPathItem();
+                } else {
+                    epi = null;
+                }
+            }
+            return sb.toString();
+        }
+    }
+
+    @FXML
+    void initialize() {
+        assert root_vbox != null;
+        assert effects_path_hbox != null;
+        assert props_vbox != null;
+    }
+
+    private EffectPathItem makeEffectPathItem(Effect effect, EffectPathItem hostPathItem) {
+        final EffectPathItem epi;
+        if (effect == null) {
+            return null;
+        }
+        if (effect instanceof Blend) {
+            epi = makeBlendPathItem(effect, hostPathItem);
+        } else if (effect instanceof ColorInput) {
+            epi = makeColorInputPathItem(effect, hostPathItem);
+        } else if (effect instanceof ImageInput) {
+            epi = makeImageInputPathItem(effect, hostPathItem);
+        } else if (effect instanceof Lighting) {
+            epi = makeLightingPathItem(effect, hostPathItem);
+        } else {
+            epi = makeSingleInputPathItem(effect, hostPathItem);
+        }
+        return epi;
+    }
+
+    private EffectPathItem makeBlendPathItem(Effect effect, EffectPathItem hostPathItem) {
+        assert effect != null;
+        final BlendPathItem epi = new BlendPathItem(this, effect, hostPathItem);
+        final Effect topInput = epi.getTopInput();
+        final EffectPathItem topInputPathItem
+                = topInput == null ? null : makeEffectPathItem(topInput, epi);
+        epi.setTopInputPathItem(topInputPathItem);
+        final Effect bottomInput = epi.getBottomInput();
+        final EffectPathItem bottomInputPathItem
+                = bottomInput == null ? null : makeEffectPathItem(bottomInput, epi);
+        epi.setBottomInputPathItem(bottomInputPathItem);
+        return epi;
+    }
+
+    private EffectPathItem makeColorInputPathItem(Effect effect, EffectPathItem hostPathItem) {
+        assert effect != null;
+        final ColorInputPathItem epi = new ColorInputPathItem(this, effect, hostPathItem);
+        return epi;
+    }
+
+    private EffectPathItem makeImageInputPathItem(Effect effect, EffectPathItem hostPathItem) {
+        assert effect != null;
+        final ImageInputPathItem epi = new ImageInputPathItem(this, effect, hostPathItem);
+        return epi;
+    }
+
+    private EffectPathItem makeLightingPathItem(Effect effect, EffectPathItem hostPathItem) {
+        assert effect != null;
+        final LightingPathItem epi = new LightingPathItem(this, effect, hostPathItem);
+        final Effect bumpInput = epi.getBumpInput();
+        final EffectPathItem bumpInputPathItem
+                = bumpInput == null ? null : makeEffectPathItem(bumpInput, epi);
+        epi.setBumpInputPathItem(bumpInputPathItem);
+        final Effect contentInput = epi.getContentInput();
+        final EffectPathItem contentInputPathItem
+                = contentInput == null ? null : makeEffectPathItem(contentInput, epi);
+        epi.setContentInputPathItem(contentInputPathItem);
+        return epi;
+    }
+
+    private EffectPathItem makeSingleInputPathItem(Effect effect, EffectPathItem hostPathItem) {
+        assert effect != null;
+        final SingleInputPathItem epi = new SingleInputPathItem(this, effect, hostPathItem);
+        final Effect input = epi.getInput();
+        final EffectPathItem inputPathItem
+                = input == null ? null : makeEffectPathItem(input, epi);
+        epi.setInputPathItem(inputPathItem);
+        return epi;
+    }
+
+    public void selectEffectPathItem(EffectPathItem epi) {
+        assert epi != null;
+        final ToggleButton tb = epi.getToggleButton();
+        final Effect effect = epi.getValue();
+        tb.setSelected(true);
+        props_vbox.getChildren().clear();
+        if (effect != null) {
+            makeEffectUI(effect);
+        }
+    }
+
+    ////////////////////////////////////////////////////////////////////////////
+    //////////////////////////////// Effects UI ////////////////////////////////
+    ////////////////////////////////////////////////////////////////////////////
+    private void makeEffectUI(Effect effect) {
+        if (effect instanceof Blend) {
+            makeBlendUI(effect);
+        } else if (effect instanceof Bloom) {
+            makeBloomUI(effect);
+        } else if (effect instanceof BoxBlur) {
+            makeBoxBlurUI(effect);
+        } else if (effect instanceof ColorAdjust) {
+            makeColorAdjustUI(effect);
+        } else if (effect instanceof ColorInput) {
+            makeColorInputUI(effect);
+        } else if (effect instanceof DisplacementMap) {
+            makeDisplacementMapUI(effect);
+        } else if (effect instanceof DropShadow) {
+            makeDropShadowUI(effect);
+        } else if (effect instanceof GaussianBlur) {
+            makeGaussianBlurUI(effect);
+        } else if (effect instanceof Glow) {
+            makeGlowUI(effect);
+        } else if (effect instanceof ImageInput) {
+            makeImageInputUI(effect);
+        } else if (effect instanceof InnerShadow) {
+            makeInnerShadowUI(effect);
+        } else if (effect instanceof Lighting) {
+            makeLightingUI(effect);
+        } else if (effect instanceof MotionBlur) {
+            makeMotionBlurUI(effect);
+        } else if (effect instanceof PerspectiveTransform) {
+            makePerspectiveTransformUI(effect);
+        } else if (effect instanceof Reflection) {
+            makeReflectionUI(effect);
+        } else if (effect instanceof SepiaTone) {
+            makeSepiaToneUI(effect);
+        } else {
+            assert effect instanceof Shadow;
+            makeShadowUI(effect);
+        }
+    }
+
+    private void makeBlendUI(Effect effect) {
+        assert effect instanceof Blend;
+        final Blend blend = (Blend) effect;
+        final VBox vBox = new VBox(8.0);
+
+        final EnumEditor<BlendMode> modeEditor = new EnumEditor<>(
+                "mode", BlendMode.values(), blend.getMode()); //NOI18N
+        blend.modeProperty().bind(modeEditor.getValueProperty());
+        vBox.getChildren().add(modeEditor);
+
+        final SliderEditor opacityEditor = new SliderEditor(
+                "opacity", 0, 1.0, blend.getOpacity(), 1.0, false); //NOI18N
+        blend.opacityProperty().bind(opacityEditor.getValueProperty());
+        vBox.getChildren().add(opacityEditor);
+
+        props_vbox.getChildren().add(vBox);
+    }
+
+    private void makeBloomUI(Effect effect) {
+        assert effect instanceof Bloom;
+        final Bloom bloom = (Bloom) effect;
+        VBox vBox = new VBox(8.0);
+
+        final SliderEditor thresholdEditor = new SliderEditor(
+                "threshold", 0, 1.0, bloom.getThreshold(), 0.1, false); //NOI18N
+        bloom.thresholdProperty().bind(thresholdEditor.getValueProperty());
+        vBox.getChildren().add(thresholdEditor);
+
+        props_vbox.getChildren().add(vBox);
+    }
+
+    private void makeBoxBlurUI(Effect effect) {
+        assert effect instanceof BoxBlur;
+        final BoxBlur boxBlur = (BoxBlur) effect;
+        VBox vBox = new VBox(8.0);
+
+        final SliderEditor widthEditor = new SliderEditor(
+                "width", 0, 255.0, boxBlur.getWidth(), 1.0, false); //NOI18N
+        boxBlur.widthProperty().bind(widthEditor.getValueProperty());
+        vBox.getChildren().add(widthEditor);
+
+        final SliderEditor heightEditor = new SliderEditor(
+                "height", 0, 255.0, boxBlur.getHeight(), 1.0, false); //NOI18N
+        boxBlur.heightProperty().bind(heightEditor.getValueProperty());
+        vBox.getChildren().add(heightEditor);
+
+        final SliderEditor iterationsEditor = new SliderEditor(
+                "iterations", 0, 3.0, boxBlur.getIterations(), 1.0, true); //NOI18N
+        final Slider slider = iterationsEditor.getSlider();
+        slider.setBlockIncrement(1.0);
+        slider.setMajorTickUnit(1.0);
+        slider.setMinorTickCount(0);
+        slider.setSnapToTicks(true);
+        slider.setShowTickMarks(true);
+        boxBlur.iterationsProperty().bind(iterationsEditor.getValueProperty());
+        vBox.getChildren().add(iterationsEditor);
+
+        props_vbox.getChildren().add(vBox);
+    }
+
+    private void makeColorAdjustUI(Effect effect) {
+        assert effect instanceof ColorAdjust;
+        final ColorAdjust colorAdjust = (ColorAdjust) effect;
+        VBox vBox = new VBox(8.0);
+
+        final SliderEditor brightnessEditor = new SliderEditor(
+                "brightness", -1.0, 1.0, colorAdjust.getBrightness(), 0.1, false); //NOI18N
+        colorAdjust.brightnessProperty().bind(brightnessEditor.getValueProperty());
+        vBox.getChildren().add(brightnessEditor);
+
+        final SliderEditor contrastEditor = new SliderEditor(
+                "contrast", -1.0, 1.0, colorAdjust.getContrast(), 0.1, false); //NOI18N
+        colorAdjust.contrastProperty().bind(contrastEditor.getValueProperty());
+        vBox.getChildren().add(contrastEditor);
+
+        final SliderEditor hueEditor = new SliderEditor(
+                "hue", -1.0, 1.0, colorAdjust.getHue(), 0.1, false); //NOI18N
+        colorAdjust.hueProperty().bind(hueEditor.getValueProperty());
+        vBox.getChildren().add(hueEditor);
+
+        final SliderEditor saturationEditor = new SliderEditor(
+                "saturation", -1.0, 1.0, colorAdjust.getSaturation(), 0.1, false); //NOI18N
+        colorAdjust.saturationProperty().bind(saturationEditor.getValueProperty());
+        vBox.getChildren().add(saturationEditor);
+
+        props_vbox.getChildren().add(vBox);
+    }
+
+    private void makeColorInputUI(Effect effect) {
+        assert effect instanceof ColorInput;
+        final ColorInput colorInput = (ColorInput) effect;
+        VBox vBox = new VBox(8.0);
+
+        final SliderEditor widthEditor = new SliderEditor(
+                "width", 0, 255.0, colorInput.getWidth(), 1.0, false); //NOI18N
+        colorInput.widthProperty().bind(widthEditor.getValueProperty());
+        vBox.getChildren().add(widthEditor);
+
+        final SliderEditor heightEditor = new SliderEditor(
+                "height", 0, 255.0, colorInput.getHeight(), 1.0, false); //NOI18N
+        colorInput.heightProperty().bind(heightEditor.getValueProperty());
+        vBox.getChildren().add(heightEditor);
+
+        final NumFieldEditor xEditor = new NumFieldEditor(
+                "x", -10.0, 10.0, colorInput.getX(), 1.0, false); //NOI18N
+        colorInput.xProperty().bind(xEditor.getValueProperty());
+        vBox.getChildren().add(xEditor);
+
+        final NumFieldEditor yEditor = new NumFieldEditor(
+                "y", -10.0, 10.0, colorInput.getY(), 1.0, false); //NOI18N
+        colorInput.yProperty().bind(yEditor.getValueProperty());
+        vBox.getChildren().add(yEditor);
+
+        final PaintPicker colorPicker = new PaintPicker();
+        colorPicker.setPaintProperty(colorInput.getPaint());
+        colorPicker.paintProperty().addListener(new PaintChangeListener(colorInput));
+        vBox.getChildren().add(colorPicker);
+
+        props_vbox.getChildren().add(vBox);
+    }
+
+    private void makeDisplacementMapUI(Effect effect) {
+        assert effect instanceof DisplacementMap;
+        final DisplacementMap displacementMap = (DisplacementMap) effect;
+        VBox vBox = new VBox(8.0);
+
+        final NumFieldEditor offsetXEditor = new NumFieldEditor(
+                "offsetX", -10.0, 10.0, displacementMap.getOffsetX(), 1.0, false); //NOI18N
+        displacementMap.offsetXProperty().bind(offsetXEditor.getValueProperty());
+        vBox.getChildren().add(offsetXEditor);
+
+        final NumFieldEditor offsetYEditor = new NumFieldEditor(
+                "offsetY", -10.0, 10.0, displacementMap.getOffsetY(), 1.0, false); //NOI18N
+        displacementMap.offsetYProperty().bind(offsetYEditor.getValueProperty());
+        vBox.getChildren().add(offsetYEditor);
+
+        final NumFieldEditor scaleXEditor = new NumFieldEditor(
+                "scaleX", -10.0, 10.0, displacementMap.getScaleX(), 1.0, false); //NOI18N
+        displacementMap.scaleXProperty().bind(scaleXEditor.getValueProperty());
+        vBox.getChildren().add(scaleXEditor);
+
+        final NumFieldEditor scaleYEditor = new NumFieldEditor(
+                "scaleY", -10.0, 10.0, displacementMap.getScaleY(), 1.0, false); //NOI18N
+        displacementMap.scaleYProperty().bind(scaleYEditor.getValueProperty());
+        vBox.getChildren().add(scaleYEditor);
+
+        final CheckBoxEditor wrapEditor = new CheckBoxEditor(
+                "wrap", displacementMap.isWrap()); //NOI18N
+        displacementMap.wrapProperty().bind(wrapEditor.getValueProperty());
+        vBox.getChildren().add(wrapEditor);
+
+        props_vbox.getChildren().add(vBox);
+    }
+
+    private void makeDropShadowUI(Effect effect) {
+        assert effect instanceof DropShadow;
+        final DropShadow dropShadow = (DropShadow) effect;
+        VBox vBox = new VBox(8.0);
+
+        final EnumEditor<BlurType> blurTypeEditor = new EnumEditor<>(
+                "blurType", BlurType.values(), dropShadow.getBlurType()); //NOI18N
+        dropShadow.blurTypeProperty().bind(blurTypeEditor.getValueProperty());
+        vBox.getChildren().add(blurTypeEditor);
+
+        final SliderEditor widthEditor = new SliderEditor(
+                "width", 0, 255.0, dropShadow.getWidth(), 1.0, false); //NOI18N
+        dropShadow.widthProperty().bind(widthEditor.getValueProperty());
+        vBox.getChildren().add(widthEditor);
+
+        final SliderEditor heightEditor = new SliderEditor(
+                "height", 0, 255.0, dropShadow.getHeight(), 1.0, false); //NOI18N
+        dropShadow.heightProperty().bind(heightEditor.getValueProperty());
+        vBox.getChildren().add(heightEditor);
+
+        final NumFieldEditor offsetXEditor = new NumFieldEditor(
+                "offsetX", -10.0, 10.0, dropShadow.getOffsetX(), 1.0, false); //NOI18N
+        dropShadow.offsetXProperty().bind(offsetXEditor.getValueProperty());
+        vBox.getChildren().add(offsetXEditor);
+
+        final NumFieldEditor offsetYEditor = new NumFieldEditor(
+                "offsetY", -10.0, 10.0, dropShadow.getOffsetY(), 1.0, false); //NOI18N
+        dropShadow.offsetYProperty().bind(offsetYEditor.getValueProperty());
+        vBox.getChildren().add(offsetYEditor);
+
+        // setting radius equivalent to setting both width and height attributes to value of (2 * radius + 1)
+//        SliderEditor e6 = (new SliderEditor("radius", 0, 127.0 , dropShadow.getRadius(), 1.0, false ) );
+//        dropShadow.radiusProperty().bind(e6.value);
+//        vBox.getChildren().add(e6);
+        final SliderEditor spreadEditor = new SliderEditor(
+                "spread", 0, 1.0, dropShadow.getSpread(), 0.1, false); //NOI18N
+        dropShadow.spreadProperty().bind(spreadEditor.getValueProperty());
+        vBox.getChildren().add(spreadEditor);
+
+        final PaintPicker colorPicker = new PaintPicker(Mode.COLOR);
+        colorPicker.setPaintProperty(dropShadow.getColor());
+        colorPicker.paintProperty().addListener(new ColorChangeListener(dropShadow));
+        vBox.getChildren().add(colorPicker);
+
+        props_vbox.getChildren().add(vBox);
+    }
+
+    private void makeGaussianBlurUI(Effect effect) {
+        assert effect instanceof GaussianBlur;
+        final GaussianBlur gaussianBlur = (GaussianBlur) effect;
+        VBox vBox = new VBox(8.0);
+
+        final SliderEditor radiusEditor = new SliderEditor(
+                "radius", 0, 63.0, gaussianBlur.getRadius(), 0.1, false); //NOI18N
+        gaussianBlur.radiusProperty().bind(radiusEditor.getValueProperty());
+        vBox.getChildren().add(radiusEditor);
+
+        props_vbox.getChildren().add(vBox);
+    }
+
+    private void makeGlowUI(Effect effect) {
+        assert effect instanceof Glow;
+        final Glow glow = (Glow) effect;
+        VBox vBox = new VBox(8.0);
+
+        final SliderEditor levelEditor = new SliderEditor(
+                "level", 0, 1.0, glow.getLevel(), 0.1, false); //NOI18N
+        glow.levelProperty().bind(levelEditor.getValueProperty());
+        vBox.getChildren().add(levelEditor);
+
+        props_vbox.getChildren().add(vBox);
+    }
+
+    private void makeImageInputUI(Effect effect) {
+        assert effect instanceof ImageInput;
+        final ImageInput imageInput = (ImageInput) effect;
+        VBox vBox = new VBox(8.0);
+
+        final NumFieldEditor xEditor = new NumFieldEditor(
+                "x", -10.0, 10.0, imageInput.getX(), 1.0, false); //NOI18N
+        imageInput.xProperty().bind(xEditor.getValueProperty());
+        vBox.getChildren().add(xEditor);
+
+        final NumFieldEditor yEditor = new NumFieldEditor(
+                "y", -10.0, 10.0, imageInput.getY(), 1.0, false); //NOI18N
+        imageInput.yProperty().bind(yEditor.getValueProperty());
+        vBox.getChildren().add(yEditor);
+
+        final ImageEditor imageEditor = new ImageEditor(
+                "source", imageInput.getSource()); //NOI18N
+        imageInput.sourceProperty().bind(imageEditor.getValueProperty());
+        vBox.getChildren().add(imageEditor);
+
+        props_vbox.getChildren().add(vBox);
+    }
+
+    private void makeInnerShadowUI(Effect effect) {
+        assert effect instanceof InnerShadow;
+        final InnerShadow innerShadow = (InnerShadow) effect;
+        VBox vBox = new VBox(8.0);
+
+        final EnumEditor<BlurType> blurTypeEditor = new EnumEditor<>(
+                "blurType", BlurType.values(), innerShadow.getBlurType()); //NOI18N
+        innerShadow.blurTypeProperty().bind(blurTypeEditor.getValueProperty());
+        vBox.getChildren().add(blurTypeEditor);
+
+        final SliderEditor chokeEditor = new SliderEditor(
+                "choke", 0, 1.0, innerShadow.getChoke(), 0.1, false); //NOI18N
+        innerShadow.chokeProperty().bind(chokeEditor.getValueProperty());
+        vBox.getChildren().add(chokeEditor);
+
+        final SliderEditor widthEditor = new SliderEditor(
+                "width", 0, 255.0, innerShadow.getWidth(), 0.1, false); //NOI18N
+        innerShadow.widthProperty().bind(widthEditor.getValueProperty());
+        vBox.getChildren().add(widthEditor);
+
+        final SliderEditor heightEditor = new SliderEditor(
+                "height", 0, 255.0, innerShadow.getHeight(), 0.1, false); //NOI18N
+        innerShadow.heightProperty().bind(heightEditor.getValueProperty());
+        vBox.getChildren().add(heightEditor);
+
+        final NumFieldEditor offsetXEditor = new NumFieldEditor(
+                "offsetX", -10.0, 10.0, innerShadow.getOffsetX(), 1.0, false); //NOI18N
+        innerShadow.offsetXProperty().bind(offsetXEditor.getValueProperty());
+        vBox.getChildren().add(offsetXEditor);
+
+        final NumFieldEditor offsetYEditor = new NumFieldEditor(
+                "offsetY", -10.0, 10.0, innerShadow.getOffsetY(), 1.0, false); //NOI18N
+        innerShadow.offsetYProperty().bind(offsetYEditor.getValueProperty());
+        vBox.getChildren().add(offsetYEditor);
+
+        // setting radius equivalent to setting both width and height attributes to value of (2 * radius + 1)
+//        SliderEditor e7 = (new SliderEditor("radius", 0, 127.0 , innerShadow.getRadius(), 1.0, false ) );
+//        innerShadow.radiusProperty().bind(e7.value);
+//        vBox.getChildren().add(e7);
+        final PaintPicker colorPicker = new PaintPicker(Mode.COLOR);
+        colorPicker.setPaintProperty(innerShadow.getColor());
+        colorPicker.paintProperty().addListener(new ColorChangeListener(innerShadow));
+        vBox.getChildren().add(colorPicker);
+
+        props_vbox.getChildren().add(vBox);
+    }
+
+    private void makeLightingUI(Effect effect) {
+        assert effect instanceof Lighting;
+        final Lighting lighting = (Lighting) effect;
+        VBox vBox = new VBox(8.0);
+
+        final SliderEditor diffuseConstantEditor = new SliderEditor(
+                "diffuseConstant", 0, 2.0, lighting.getDiffuseConstant(), 0.1, false); //NOI18N
+        lighting.diffuseConstantProperty().bind(diffuseConstantEditor.getValueProperty());
+        vBox.getChildren().add(diffuseConstantEditor);
+
+        final SliderEditor specularConstantEditor = new SliderEditor(
+                "specularConstant", 0, 2.0, lighting.getSpecularConstant(), 0.1, false); //NOI18N
+        lighting.specularConstantProperty().bind(specularConstantEditor.getValueProperty());
+        vBox.getChildren().add(specularConstantEditor);
+
+        final SliderEditor specularExponentEditor = new SliderEditor(
+                "specularExponent", 0, 40.0, lighting.getSpecularExponent(), 0.1, false); //NOI18N
+        lighting.specularExponentProperty().bind(specularExponentEditor.getValueProperty());
+        vBox.getChildren().add(specularExponentEditor);
+
+        final SliderEditor surfaceScaleEditor = new SliderEditor(
+                "surfaceScale", 0, 10.0, lighting.getSurfaceScale(), 0.1, false); //NOI18N
+        lighting.surfaceScaleProperty().bind(surfaceScaleEditor.getValueProperty());
+        vBox.getChildren().add(surfaceScaleEditor);
+
+        // need editor for this
+        vBox.getChildren().add(new Label("Light Editor here")); //NOI18N
+
+        props_vbox.getChildren().add(vBox);
+    }
+
+    private void makeMotionBlurUI(Effect effect) {
+        assert effect instanceof MotionBlur;
+        final MotionBlur motionBlur = (MotionBlur) effect;
+        VBox vBox = new VBox(8.0);
+
+        // need editor for this
+        vBox.getChildren().add(new Label("Angle editor here")); //NOI18N
+
+        final SliderEditor radiusEditor = new SliderEditor(
+                "radius", 0, 63.0, motionBlur.getRadius(), 0.1, false); //NOI18N
+        motionBlur.radiusProperty().bind(radiusEditor.getValueProperty());
+        vBox.getChildren().add(radiusEditor);
+
+        props_vbox.getChildren().add(vBox);
+    }
+
+    private void makePerspectiveTransformUI(Effect effect) {
+        assert effect instanceof PerspectiveTransform;
+        final PerspectiveTransform perspectiveTransform = (PerspectiveTransform) effect;
+        VBox vBox = new VBox(8.0);
+
+        final NumFieldEditor llxEditor = new NumFieldEditor(
+                "llx", -10.0, 10.0, perspectiveTransform.getLlx(), 1.0, false); //NOI18N
+        perspectiveTransform.llxProperty().bind(llxEditor.getValueProperty());
+        vBox.getChildren().add(llxEditor);
+
+        final NumFieldEditor llyEditor = new NumFieldEditor(
+                "lly", -10.0, 10.0, perspectiveTransform.getLly(), 1.0, false); //NOI18N
+        perspectiveTransform.llyProperty().bind(llyEditor.getValueProperty());
+        vBox.getChildren().add(llyEditor);
+
+        final NumFieldEditor lrxEditor = new NumFieldEditor(
+                "lrx", -10.0, 10.0, perspectiveTransform.getLrx(), 1.0, false); //NOI18N
+        perspectiveTransform.lrxProperty().bind(lrxEditor.getValueProperty());
+        vBox.getChildren().add(lrxEditor);
+
+        final NumFieldEditor lryEditor = new NumFieldEditor(
+                "lry", -10.0, 10.0, perspectiveTransform.getLry(), 1.0, false); //NOI18N
+        perspectiveTransform.lryProperty().bind(lryEditor.getValueProperty());
+        vBox.getChildren().add(lryEditor);
+
+        final NumFieldEditor ulxEditor = new NumFieldEditor(
+                "ulx", -10.0, 10.0, perspectiveTransform.getUlx(), 1.0, false); //NOI18N
+        perspectiveTransform.ulxProperty().bind(ulxEditor.getValueProperty());
+        vBox.getChildren().add(ulxEditor);
+
+        final NumFieldEditor ulyEditor = new NumFieldEditor(
+                "uly", -10.0, 10.0, perspectiveTransform.getUly(), 1.0, false); //NOI18N
+        perspectiveTransform.ulyProperty().bind(ulyEditor.getValueProperty());
+        vBox.getChildren().add(ulyEditor);
+
+        final NumFieldEditor urxEditor = new NumFieldEditor(
+                "urx", -10.0, 10.0, perspectiveTransform.getUrx(), 1.0, false); //NOI18N
+        perspectiveTransform.urxProperty().bind(urxEditor.getValueProperty());
+        vBox.getChildren().add(urxEditor);
+
+        final NumFieldEditor uryEditor = new NumFieldEditor(
+                "ury", -10.0, 10.0, perspectiveTransform.getUry(), 1.0, false); //NOI18N
+        perspectiveTransform.uryProperty().bind(uryEditor.getValueProperty());
+        vBox.getChildren().add(uryEditor);
+
+        props_vbox.getChildren().add(vBox);
+    }
+
+    private void makeReflectionUI(Effect effect) {
+        assert effect instanceof Reflection;
+        final Reflection reflection = (Reflection) effect;
+        VBox vBox = new VBox(8.0);
+
+        final SliderEditor bottomOpacityEditor = new SliderEditor(
+                "bottomOpacity", 0, 1.0, reflection.getBottomOpacity(), 0.1, false); //NOI18N
+        reflection.bottomOpacityProperty().bind(bottomOpacityEditor.getValueProperty());
+        vBox.getChildren().add(bottomOpacityEditor);
+
+        final SliderEditor topOpacityEditor = new SliderEditor(
+                "topOpacity", 0, 1.0, reflection.getTopOpacity(), 0.1, false); //NOI18N
+        reflection.topOpacityProperty().bind(topOpacityEditor.getValueProperty());
+        vBox.getChildren().add(topOpacityEditor);
+
+        final NumFieldEditor topOffsetEditor = new NumFieldEditor(
+                "topOffset", -10.0, 10.0, reflection.getTopOffset(), 1.0, false); //NOI18N
+        reflection.topOffsetProperty().bind(topOffsetEditor.getValueProperty());
+        vBox.getChildren().add(topOffsetEditor);
+
+        final SliderEditor fractionEditor = new SliderEditor(
+                "fraction", 0, 1.0, reflection.getFraction(), 0.1, false); //NOI18N
+        reflection.fractionProperty().bind(fractionEditor.getValueProperty());
+        vBox.getChildren().add(fractionEditor);
+
+        props_vbox.getChildren().add(vBox);
+    }
+
+    private void makeSepiaToneUI(Effect effect) {
+        assert effect instanceof SepiaTone;
+        final SepiaTone sepiaTone = (SepiaTone) effect;
+        VBox vBox = new VBox(8.0);
+
+        final SliderEditor levelEditor = new SliderEditor(
+                "level", 0, 1.0, sepiaTone.getLevel(), 0.1, false); //NOI18N
+        sepiaTone.levelProperty().bind(levelEditor.getValueProperty());
+        vBox.getChildren().add(levelEditor);
+
+        props_vbox.getChildren().add(vBox);
+    }
+
+    private void makeShadowUI(Effect effect) {
+        assert effect instanceof Shadow;
+        final Shadow shadow = (Shadow) effect;
+        VBox vBox = new VBox(8.0);
+
+        final EnumEditor<BlurType> blurTypeEditor = new EnumEditor<>(
+                "blurType", BlurType.values(), shadow.getBlurType()); //NOI18N
+        shadow.blurTypeProperty().bind(blurTypeEditor.getValueProperty());
+        vBox.getChildren().add(blurTypeEditor);
+
+        final SliderEditor widthEditor = new SliderEditor(
+                "width", 0, 255.0, shadow.getWidth(), 0.1, false); //NOI18N
+        shadow.widthProperty().bind(widthEditor.getValueProperty());
+        vBox.getChildren().add(widthEditor);
+
+        final SliderEditor heightEditor = new SliderEditor(
+                "height", 0, 255.0, shadow.getHeight(), 0.1, false); //NOI18N
+        shadow.heightProperty().bind(heightEditor.getValueProperty());
+        vBox.getChildren().add(heightEditor);
+
+        final SliderEditor radiusEditor = new SliderEditor(
+                "radius", 0, 127.0, shadow.getRadius(), 0.1, false); //NOI18N
+        shadow.radiusProperty().bind(radiusEditor.getValueProperty());
+        vBox.getChildren().add(radiusEditor);
+
+        final PaintPicker colorPicker = new PaintPicker(Mode.COLOR);
+        colorPicker.setPaintProperty(shadow.getColor());
+        colorPicker.paintProperty().addListener(new ColorChangeListener(shadow));
+        vBox.getChildren().add(colorPicker);
+
+        props_vbox.getChildren().add(vBox);
+    }
+
+    /**
+     * *************************************************************************
+     * Static inner class
+     * *************************************************************************
+     */
+    private static class ColorChangeListener implements ChangeListener<Paint> {
+
+        private final Effect effect;
+
+        public ColorChangeListener(Effect effect) {
+            assert effect instanceof DropShadow
+                    || effect instanceof InnerShadow
+                    || effect instanceof Shadow;
+            this.effect = effect;
+        }
+
+        @Override
+        public void changed(ObservableValue<? extends Paint> ov, Paint oldValue, Paint newValue) {
+            assert newValue instanceof Color;
+            final Color color = (Color) newValue;
+            if (effect instanceof DropShadow) {
+                ((DropShadow) effect).setColor(color);
+            } else if (effect instanceof InnerShadow) {
+                ((InnerShadow) effect).setColor(color);
+            } else {
+                assert effect instanceof Shadow;
+                ((Shadow) effect).setColor(color);
+            }
+        }
+    }
+
+    private static class PaintChangeListener implements ChangeListener<Paint> {
+
+        private final ColorInput colorInput;
+
+        public PaintChangeListener(ColorInput colorInput) {
+            this.colorInput = colorInput;
+        }
+
+        @Override
+        public void changed(ObservableValue<? extends Paint> ov, Paint oldValue, Paint newValue) {
+            colorInput.setPaint(newValue);
+        }
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/util/control/effectpicker/ImageInputPathItem.java	Tue Jan 07 12:06:59 2014 +0100
@@ -0,0 +1,65 @@
+/*
+ * Copyright (c) 2012, 2014, Oracle and/or its affiliates.
+ * All rights reserved. Use is subject to license terms.
+ *
+ * This file is available and licensed under the following license:
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *  - Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ *  - Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in
+ *    the documentation and/or other materials provided with the distribution.
+ *  - Neither the name of Oracle Corporation nor the names of its
+ *    contributors may be used to endorse or promote products derived
+ *    from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+package com.oracle.javafx.scenebuilder.kit.util.control.effectpicker;
+
+import javafx.scene.effect.Effect;
+import javafx.scene.image.Image;
+
+/**
+ * Effect path item for the image input effect.
+ */
+public class ImageInputPathItem extends EffectPathItem {
+    
+    private Image image;
+
+    public ImageInputPathItem(EffectPickerController epc, Effect effect, EffectPathItem hostPathItem) {
+        super(epc, effect, hostPathItem);
+        assert effect instanceof javafx.scene.effect.ImageInput;
+        initialize();
+    }
+
+    @Override
+    public EffectPathItem getSelectedInputPathItem() {
+        return null;
+    }
+
+    @Override
+    public void setSelectedInput(Effect input) {
+        // No input
+    }
+
+    private void initialize() {
+        // Remove replace/delete input Menu
+        menu_button.getItems().remove(delete_input_menuitem);
+        menu_button.getItems().remove(replace_input_menu);
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/util/control/effectpicker/LightingPathItem.java	Tue Jan 07 12:06:59 2014 +0100
@@ -0,0 +1,135 @@
+/*
+ * Copyright (c) 2012, 2014, Oracle and/or its affiliates.
+ * All rights reserved. Use is subject to license terms.
+ *
+ * This file is available and licensed under the following license:
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *  - Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ *  - Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in
+ *    the documentation and/or other materials provided with the distribution.
+ *  - Neither the name of Oracle Corporation nor the names of its
+ *    contributors may be used to endorse or promote products derived
+ *    from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+package com.oracle.javafx.scenebuilder.kit.util.control.effectpicker;
+
+import javafx.event.ActionEvent;
+import javafx.event.EventHandler;
+import javafx.scene.control.Menu;
+import javafx.scene.control.RadioMenuItem;
+import javafx.scene.control.SeparatorMenuItem;
+import javafx.scene.control.ToggleGroup;
+import javafx.scene.effect.Effect;
+import javafx.scene.effect.Lighting;
+
+/**
+ * Effect path item for the lighting effect.
+ */
+public class LightingPathItem extends EffectPathItem {
+
+    private final RadioMenuItem bumpMenuItem = new RadioMenuItem("BumpInput"); //NOI18N
+    private final RadioMenuItem contentMenuItem = new RadioMenuItem("ContentInput"); //NOI18N
+    private final ToggleGroup inputToggleGroup = new ToggleGroup();
+    private EffectPathItem bumpInputPathItem;
+    private EffectPathItem contentInputPathItem;
+
+    public LightingPathItem(EffectPickerController epc, Effect effect, EffectPathItem hostPathItem) {
+        super(epc, effect, hostPathItem);
+        assert effect instanceof javafx.scene.effect.Lighting;
+        initialize();
+    }
+
+    @Override
+    public EffectPathItem getSelectedInputPathItem() {
+        if (bumpMenuItem.isSelected()) {
+            return bumpInputPathItem;
+        } else {
+            assert contentMenuItem.isSelected() == true;
+            return contentInputPathItem;
+        }
+    }
+    
+    @Override
+    public void setSelectedInput(Effect input) {
+        if (bumpMenuItem.isSelected()) {
+            setBumpInput(input);
+        } else {
+            assert contentMenuItem.isSelected() == true;
+            setContentInput(input);
+        }
+    }
+
+    public void setBumpInputPathItem(EffectPathItem epi) {
+        bumpInputPathItem = epi;
+    }
+
+    public void setContentInputPathItem(EffectPathItem epi) {
+        contentInputPathItem = epi;
+    }
+
+    public Effect getBumpInput() {
+        return ((Lighting) effect).getBumpInput();
+    }
+
+    public void setBumpInput(Effect input) {
+        ((Lighting) effect).setBumpInput(input);
+    }
+
+    public Effect getContentInput() {
+        return ((Lighting) effect).getContentInput();
+    }
+
+    public void setContentInput(Effect input) {
+        ((Lighting) effect).setContentInput(input);
+    }
+
+    private void initialize() {
+        // Add Select Input Menu
+        final Menu inputMenu = new Menu("Select Input"); //NOI18N
+        bumpMenuItem.setToggleGroup(inputToggleGroup);
+        bumpMenuItem.setOnAction(new EventHandler<ActionEvent>() {
+
+            @Override
+            public void handle(ActionEvent event) {
+                toggle_button.setText(getSimpleName() + " (BumpInput)"); //NOI18N
+                effectPickerController.updateUI(LightingPathItem.this);
+            }
+        });
+        contentMenuItem.setToggleGroup(inputToggleGroup);
+        contentMenuItem.setOnAction(new EventHandler<ActionEvent>() {
+
+            @Override
+            public void handle(ActionEvent event) {
+                toggle_button.setText(getSimpleName() + " (ContentInput)"); //NOI18N
+                effectPickerController.updateUI(LightingPathItem.this);
+            }
+        });
+
+        inputMenu.getItems().addAll(bumpMenuItem, contentMenuItem);
+        menu_button.getItems().add(0, inputMenu);
+        menu_button.getItems().add(1, new SeparatorMenuItem());
+
+        // BumpInput selected at init time
+        toggle_button.setText(getSimpleName() + " (BumpInput)"); //NOI18N
+        bumpMenuItem.setSelected(true);
+        contentMenuItem.setSelected(false);
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/util/control/effectpicker/SingleInputPathItem.java	Tue Jan 07 12:06:59 2014 +0100
@@ -0,0 +1,144 @@
+/*
+ * Copyright (c) 2012, 2014, Oracle and/or its affiliates.
+ * All rights reserved. Use is subject to license terms.
+ *
+ * This file is available and licensed under the following license:
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ *  - Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ *  - Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in
+ *    the documentation and/or other materials provided with the distribution.
+ *  - Neither the name of Oracle Corporation nor the names of its
+ *    contributors may be used to endorse or promote products derived
+ *    from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+package com.oracle.javafx.scenebuilder.kit.util.control.effectpicker;
+
+import javafx.scene.effect.Bloom;
+import javafx.scene.effect.BoxBlur;
+import javafx.scene.effect.ColorAdjust;
+import javafx.scene.effect.DisplacementMap;
+import javafx.scene.effect.DropShadow;
+import javafx.scene.effect.Effect;
+import javafx.scene.effect.GaussianBlur;
+import javafx.scene.effect.Glow;
+import javafx.scene.effect.InnerShadow;