changeset 7931:8fa9c7b3b5c8

[SCENEBUILDER] Going on fixing DTL-6783: Rationalize job implementation between Hierarchy and Content Panels => Move jobs that do not define a list of other jobs in the new xxx.job.atomic package
author slions
date Mon, 01 Sep 2014 09:42:26 +0200
parents 60e8da40fca3
children 31335892f770
files apps/scenebuilder/SceneBuilderApp/src/com/oracle/javafx/scenebuilder/app/info/InfoPanelController.java apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/EditorController.java apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/drag/DragController.java apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/drag/target/AccessoryDropTarget.java apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/drag/target/ContainerXYDropTarget.java apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/drag/target/ContainerZDropTarget.java apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/drag/target/GridPaneDropTarget.java apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/drag/target/ImageViewDropTarget.java apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/job/BringForwardJob.java apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/job/BringToFrontJob.java apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/job/DeleteObjectJob.java apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/job/DuplicateSelectionJob.java apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/job/FitToParentObjectJob.java apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/job/InsertAsAccessoryJob.java apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/job/InsertAsSubComponentJob.java apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/job/ModifyFxControllerJob.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/ModifyObjectJob.java apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/job/ModifySelectionJob.java apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/job/PasteJob.java apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/job/PrunePropertiesJob.java apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/job/ReIndexObjectJob.java apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/job/RelocateNodeJob.java apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/job/RelocateSelectionJob.java apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/job/SendBackwardJob.java apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/job/SendToBackJob.java apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/job/ToggleFxRootJob.java apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/job/TrimSelectionJob.java apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/job/UseComputedSizesObjectJob.java apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/job/UsePredefinedSizeJob.java apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/job/atomic/AddPropertyJob.java apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/job/atomic/AddPropertyValueJob.java apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/job/atomic/BackupSelectionJob.java apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/job/atomic/ClearSelectionJob.java apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/job/atomic/ModifyFxControllerJob.java apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/job/atomic/ModifyFxIdJob.java apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/job/atomic/ModifyObjectJob.java apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/job/atomic/ReIndexObjectJob.java apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/job/atomic/RelocateNodeJob.java apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/job/atomic/RemoveCollectionItemJob.java apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/job/atomic/RemoveFxControllerJob.java apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/job/atomic/RemoveNodeJob.java apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/job/atomic/RemoveObjectJob.java apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/job/atomic/RemovePropertyJob.java apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/job/atomic/RemovePropertyValueJob.java apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/job/atomic/ToggleFxRootJob.java apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/job/atomic/UpdateSelectionJob.java apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/job/gridpane/AddColumnConstraintsJob.java apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/job/gridpane/AddRowConstraintsJob.java apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/job/gridpane/MoveColumnJob.java apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/job/gridpane/MoveRowJob.java apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/job/gridpane/ReIndexColumnContentJob.java apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/job/gridpane/ReIndexRowContentJob.java apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/job/gridpane/v2/SpanJob.java apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/job/togglegroup/AdjustToggleGroupJob.java apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/job/togglegroup/ModifySelectionToggleGroupJob.java apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/job/togglegroup/ModifyToggleGroupJob.java apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/job/v2/AddPropertyJob.java apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/job/v2/AddPropertyValueJob.java apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/job/v2/BackupSelectionJob.java apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/job/v2/ClearSelectionJob.java apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/job/v2/RemoveCollectionItemJob.java apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/job/v2/RemoveFxControllerJob.java apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/job/v2/RemoveNodeJob.java apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/job/v2/RemoveObjectJob.java apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/job/v2/RemovePropertyJob.java apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/job/v2/RemovePropertyValueJob.java apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/job/v2/UpdateSelectionJob.java apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/job/wrap/AbstractWrapInContentJob.java apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/job/wrap/AbstractWrapInJob.java apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/job/wrap/AbstractWrapInSubComponentJob.java apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/job/wrap/UnwrapJob.java apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/job/wrap/WrapInGridPaneJob.java apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/job/wrap/WrapInTabPaneJob.java apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/job/wrap/WrapJobUtils.java apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/panel/content/gesture/mouse/AdjustDividerGesture.java apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/panel/content/gesture/mouse/ResizeColumnGesture.java apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/panel/content/gesture/mouse/ResizeGesture.java apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/panel/content/gesture/mouse/ResizeRowGesture.java apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/panel/content/gesture/mouse/ResizeTableColumnGesture.java apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/panel/content/gesture/mouse/ResizeTreeTableColumnGesture.java apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/panel/content/mode/EditModeController.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
diffstat 84 files changed, 1939 insertions(+), 1918 deletions(-) [+]
line wrap: on
line diff
--- a/apps/scenebuilder/SceneBuilderApp/src/com/oracle/javafx/scenebuilder/app/info/InfoPanelController.java	Mon Sep 01 09:19:43 2014 +0200
+++ b/apps/scenebuilder/SceneBuilderApp/src/com/oracle/javafx/scenebuilder/app/info/InfoPanelController.java	Mon Sep 01 09:42:26 2014 +0200
@@ -33,8 +33,8 @@
 
 import com.oracle.javafx.scenebuilder.app.i18n.I18N;
 import com.oracle.javafx.scenebuilder.kit.editor.EditorController;
-import com.oracle.javafx.scenebuilder.kit.editor.job.ModifyFxControllerJob;
-import com.oracle.javafx.scenebuilder.kit.editor.job.ToggleFxRootJob;
+import com.oracle.javafx.scenebuilder.kit.editor.job.atomic.ModifyFxControllerJob;
+import com.oracle.javafx.scenebuilder.kit.editor.job.atomic.ToggleFxRootJob;
 import com.oracle.javafx.scenebuilder.kit.editor.panel.inspector.editors.ControllerClassEditor;
 import com.oracle.javafx.scenebuilder.kit.editor.panel.util.AbstractFxmlPanelController;
 import com.oracle.javafx.scenebuilder.kit.editor.selection.GridSelectionGroup;
--- a/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/EditorController.java	Mon Sep 01 09:19:43 2014 +0200
+++ b/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/EditorController.java	Mon Sep 01 09:42:26 2014 +0200
@@ -61,7 +61,7 @@
 import com.oracle.javafx.scenebuilder.kit.editor.job.gridpane.MoveColumnJob;
 import com.oracle.javafx.scenebuilder.kit.editor.job.gridpane.MoveRowJob;
 import com.oracle.javafx.scenebuilder.kit.editor.job.gridpane.v2.SpanJob;
-import com.oracle.javafx.scenebuilder.kit.editor.job.v2.UpdateSelectionJob;
+import com.oracle.javafx.scenebuilder.kit.editor.job.atomic.UpdateSelectionJob;
 import com.oracle.javafx.scenebuilder.kit.editor.job.wrap.AbstractWrapInJob;
 import com.oracle.javafx.scenebuilder.kit.editor.job.wrap.UnwrapJob;
 import com.oracle.javafx.scenebuilder.kit.editor.messagelog.MessageLog;
--- a/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/drag/DragController.java	Mon Sep 01 09:19:43 2014 +0200
+++ b/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/drag/DragController.java	Mon Sep 01 09:42:26 2014 +0200
@@ -48,8 +48,8 @@
 import com.oracle.javafx.scenebuilder.kit.editor.drag.target.RootDropTarget;
 import com.oracle.javafx.scenebuilder.kit.editor.job.BatchJob;
 import com.oracle.javafx.scenebuilder.kit.editor.job.Job;
-import com.oracle.javafx.scenebuilder.kit.editor.job.v2.BackupSelectionJob;
-import com.oracle.javafx.scenebuilder.kit.editor.job.v2.UpdateSelectionJob;
+import com.oracle.javafx.scenebuilder.kit.editor.job.atomic.BackupSelectionJob;
+import com.oracle.javafx.scenebuilder.kit.editor.job.atomic.UpdateSelectionJob;
 import com.oracle.javafx.scenebuilder.kit.fxom.FXOMObject;
 import com.oracle.javafx.scenebuilder.kit.metadata.util.DesignHierarchyPath;
 
--- a/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/drag/target/AccessoryDropTarget.java	Mon Sep 01 09:19:43 2014 +0200
+++ b/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/drag/target/AccessoryDropTarget.java	Mon Sep 01 09:42:26 2014 +0200
@@ -37,7 +37,7 @@
 import com.oracle.javafx.scenebuilder.kit.editor.job.BatchJob;
 import com.oracle.javafx.scenebuilder.kit.editor.job.DeleteObjectJob;
 import com.oracle.javafx.scenebuilder.kit.editor.job.InsertAsAccessoryJob;
-import com.oracle.javafx.scenebuilder.kit.editor.job.ModifyObjectJob;
+import com.oracle.javafx.scenebuilder.kit.editor.job.atomic.ModifyObjectJob;
 import com.oracle.javafx.scenebuilder.kit.editor.job.togglegroup.AdjustAllToggleGroupJob;
 import com.oracle.javafx.scenebuilder.kit.fxom.FXOMInstance;
 import com.oracle.javafx.scenebuilder.kit.fxom.FXOMObject;
--- a/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/drag/target/ContainerXYDropTarget.java	Mon Sep 01 09:19:43 2014 +0200
+++ b/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/drag/target/ContainerXYDropTarget.java	Mon Sep 01 09:42:26 2014 +0200
@@ -37,7 +37,7 @@
 import com.oracle.javafx.scenebuilder.kit.editor.job.DeleteObjectJob;
 import com.oracle.javafx.scenebuilder.kit.editor.job.InsertAsSubComponentJob;
 import com.oracle.javafx.scenebuilder.kit.editor.job.Job;
-import com.oracle.javafx.scenebuilder.kit.editor.job.RelocateNodeJob;
+import com.oracle.javafx.scenebuilder.kit.editor.job.atomic.RelocateNodeJob;
 import com.oracle.javafx.scenebuilder.kit.editor.job.togglegroup.AdjustAllToggleGroupJob;
 import com.oracle.javafx.scenebuilder.kit.fxom.FXOMInstance;
 import com.oracle.javafx.scenebuilder.kit.fxom.FXOMIntrinsic;
--- a/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/drag/target/ContainerZDropTarget.java	Mon Sep 01 09:19:43 2014 +0200
+++ b/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/drag/target/ContainerZDropTarget.java	Mon Sep 01 09:42:26 2014 +0200
@@ -37,7 +37,7 @@
 import com.oracle.javafx.scenebuilder.kit.editor.job.BatchJob;
 import com.oracle.javafx.scenebuilder.kit.editor.job.DeleteObjectJob;
 import com.oracle.javafx.scenebuilder.kit.editor.job.InsertAsSubComponentJob;
-import com.oracle.javafx.scenebuilder.kit.editor.job.ReIndexObjectJob;
+import com.oracle.javafx.scenebuilder.kit.editor.job.atomic.ReIndexObjectJob;
 import com.oracle.javafx.scenebuilder.kit.editor.job.togglegroup.AdjustAllToggleGroupJob;
 import com.oracle.javafx.scenebuilder.kit.fxom.FXOMInstance;
 import com.oracle.javafx.scenebuilder.kit.fxom.FXOMObject;
--- a/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/drag/target/GridPaneDropTarget.java	Mon Sep 01 09:19:43 2014 +0200
+++ b/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/drag/target/GridPaneDropTarget.java	Mon Sep 01 09:42:26 2014 +0200
@@ -43,8 +43,8 @@
 import com.oracle.javafx.scenebuilder.kit.editor.job.gridpane.v2.InsertRowJob;
 import com.oracle.javafx.scenebuilder.kit.editor.job.gridpane.v2.MoveCellContentJob;
 import com.oracle.javafx.scenebuilder.kit.editor.job.togglegroup.AdjustAllToggleGroupJob;
-import com.oracle.javafx.scenebuilder.kit.editor.job.v2.ClearSelectionJob;
-import com.oracle.javafx.scenebuilder.kit.editor.job.v2.UpdateSelectionJob;
+import com.oracle.javafx.scenebuilder.kit.editor.job.atomic.ClearSelectionJob;
+import com.oracle.javafx.scenebuilder.kit.editor.job.atomic.UpdateSelectionJob;
 import com.oracle.javafx.scenebuilder.kit.fxom.FXOMInstance;
 import com.oracle.javafx.scenebuilder.kit.fxom.FXOMObject;
 import com.oracle.javafx.scenebuilder.kit.metadata.util.DesignHierarchyMask;
--- a/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/drag/target/ImageViewDropTarget.java	Mon Sep 01 09:19:43 2014 +0200
+++ b/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/drag/target/ImageViewDropTarget.java	Mon Sep 01 09:42:26 2014 +0200
@@ -36,9 +36,9 @@
 import com.oracle.javafx.scenebuilder.kit.editor.drag.source.AbstractDragSource;
 import com.oracle.javafx.scenebuilder.kit.editor.job.BatchJob;
 import com.oracle.javafx.scenebuilder.kit.editor.job.Job;
-import com.oracle.javafx.scenebuilder.kit.editor.job.ModifyObjectJob;
-import com.oracle.javafx.scenebuilder.kit.editor.job.v2.BackupSelectionJob;
-import com.oracle.javafx.scenebuilder.kit.editor.job.v2.UpdateSelectionJob;
+import com.oracle.javafx.scenebuilder.kit.editor.job.atomic.ModifyObjectJob;
+import com.oracle.javafx.scenebuilder.kit.editor.job.atomic.BackupSelectionJob;
+import com.oracle.javafx.scenebuilder.kit.editor.job.atomic.UpdateSelectionJob;
 import com.oracle.javafx.scenebuilder.kit.fxom.FXOMInstance;
 import com.oracle.javafx.scenebuilder.kit.fxom.FXOMObject;
 import com.oracle.javafx.scenebuilder.kit.metadata.Metadata;
--- a/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/job/BringForwardJob.java	Mon Sep 01 09:19:43 2014 +0200
+++ b/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/job/BringForwardJob.java	Mon Sep 01 09:42:26 2014 +0200
@@ -31,6 +31,7 @@
  */
 package com.oracle.javafx.scenebuilder.kit.editor.job;
 
+import com.oracle.javafx.scenebuilder.kit.editor.job.atomic.ReIndexObjectJob;
 import com.oracle.javafx.scenebuilder.kit.editor.EditorController;
 import com.oracle.javafx.scenebuilder.kit.editor.job.togglegroup.AdjustAllToggleGroupJob;
 import com.oracle.javafx.scenebuilder.kit.editor.selection.GridSelectionGroup;
--- a/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/job/BringToFrontJob.java	Mon Sep 01 09:19:43 2014 +0200
+++ b/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/job/BringToFrontJob.java	Mon Sep 01 09:42:26 2014 +0200
@@ -31,6 +31,7 @@
  */
 package com.oracle.javafx.scenebuilder.kit.editor.job;
 
+import com.oracle.javafx.scenebuilder.kit.editor.job.atomic.ReIndexObjectJob;
 import com.oracle.javafx.scenebuilder.kit.editor.EditorController;
 import com.oracle.javafx.scenebuilder.kit.editor.job.togglegroup.AdjustAllToggleGroupJob;
 import com.oracle.javafx.scenebuilder.kit.editor.selection.GridSelectionGroup;
--- a/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/job/DeleteObjectJob.java	Mon Sep 01 09:19:43 2014 +0200
+++ b/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/job/DeleteObjectJob.java	Mon Sep 01 09:42:26 2014 +0200
@@ -32,7 +32,7 @@
 package com.oracle.javafx.scenebuilder.kit.editor.job;
 
 import com.oracle.javafx.scenebuilder.kit.editor.EditorController;
-import com.oracle.javafx.scenebuilder.kit.editor.job.v2.RemoveObjectJob;
+import com.oracle.javafx.scenebuilder.kit.editor.job.atomic.RemoveObjectJob;
 import com.oracle.javafx.scenebuilder.kit.fxom.FXOMCollection;
 import com.oracle.javafx.scenebuilder.kit.fxom.FXOMInstance;
 import com.oracle.javafx.scenebuilder.kit.fxom.FXOMIntrinsic;
--- a/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/job/DuplicateSelectionJob.java	Mon Sep 01 09:19:43 2014 +0200
+++ b/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/job/DuplicateSelectionJob.java	Mon Sep 01 09:42:26 2014 +0200
@@ -31,6 +31,7 @@
  */
 package com.oracle.javafx.scenebuilder.kit.editor.job;
 
+import com.oracle.javafx.scenebuilder.kit.editor.job.atomic.RelocateNodeJob;
 import com.oracle.javafx.scenebuilder.kit.editor.EditorController;
 import com.oracle.javafx.scenebuilder.kit.editor.i18n.I18N;
 import com.oracle.javafx.scenebuilder.kit.editor.job.togglegroup.AdjustAllToggleGroupJob;
--- a/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/job/FitToParentObjectJob.java	Mon Sep 01 09:19:43 2014 +0200
+++ b/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/job/FitToParentObjectJob.java	Mon Sep 01 09:42:26 2014 +0200
@@ -31,6 +31,7 @@
  */
 package com.oracle.javafx.scenebuilder.kit.editor.job;
 
+import com.oracle.javafx.scenebuilder.kit.editor.job.atomic.ModifyObjectJob;
 import com.oracle.javafx.scenebuilder.kit.editor.EditorController;
 import com.oracle.javafx.scenebuilder.kit.fxom.FXOMInstance;
 import com.oracle.javafx.scenebuilder.kit.fxom.FXOMPropertyC;
--- a/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/job/InsertAsAccessoryJob.java	Mon Sep 01 09:19:43 2014 +0200
+++ b/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/job/InsertAsAccessoryJob.java	Mon Sep 01 09:42:26 2014 +0200
@@ -32,8 +32,8 @@
 package com.oracle.javafx.scenebuilder.kit.editor.job;
 
 import com.oracle.javafx.scenebuilder.kit.editor.EditorController;
-import com.oracle.javafx.scenebuilder.kit.editor.job.v2.AddPropertyJob;
-import com.oracle.javafx.scenebuilder.kit.editor.job.v2.AddPropertyValueJob;
+import com.oracle.javafx.scenebuilder.kit.editor.job.atomic.AddPropertyJob;
+import com.oracle.javafx.scenebuilder.kit.editor.job.atomic.AddPropertyValueJob;
 import com.oracle.javafx.scenebuilder.kit.editor.selection.AbstractSelectionGroup;
 import com.oracle.javafx.scenebuilder.kit.editor.selection.ObjectSelectionGroup;
 import com.oracle.javafx.scenebuilder.kit.fxom.FXOMCollection;
--- a/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/job/InsertAsSubComponentJob.java	Mon Sep 01 09:19:43 2014 +0200
+++ b/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/job/InsertAsSubComponentJob.java	Mon Sep 01 09:42:26 2014 +0200
@@ -32,9 +32,9 @@
 package com.oracle.javafx.scenebuilder.kit.editor.job;
 
 import com.oracle.javafx.scenebuilder.kit.editor.EditorController;
-import com.oracle.javafx.scenebuilder.kit.editor.job.v2.AddPropertyJob;
-import com.oracle.javafx.scenebuilder.kit.editor.job.v2.AddPropertyValueJob;
-import com.oracle.javafx.scenebuilder.kit.editor.job.v2.RemovePropertyJob;
+import com.oracle.javafx.scenebuilder.kit.editor.job.atomic.AddPropertyJob;
+import com.oracle.javafx.scenebuilder.kit.editor.job.atomic.AddPropertyValueJob;
+import com.oracle.javafx.scenebuilder.kit.editor.job.atomic.RemovePropertyJob;
 import com.oracle.javafx.scenebuilder.kit.editor.selection.AbstractSelectionGroup;
 import com.oracle.javafx.scenebuilder.kit.editor.selection.ObjectSelectionGroup;
 import com.oracle.javafx.scenebuilder.kit.fxom.FXOMCollection;
--- a/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/job/ModifyFxControllerJob.java	Mon Sep 01 09:19:43 2014 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,94 +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.editor.job;
-
-import com.oracle.javafx.scenebuilder.kit.editor.EditorController;
-import com.oracle.javafx.scenebuilder.kit.fxom.FXOMObject;
-import java.util.Objects;
-
-/**
- * Job used to modify the FX controller class.
- *
- */
-public class ModifyFxControllerJob extends Job {
-
-    private final FXOMObject fxomObject;
-    private final String newValue;
-    private final String oldValue;
-
-    public ModifyFxControllerJob(FXOMObject fxomObject, String newValue, EditorController editorController) {
-        super(editorController);
-
-        assert fxomObject != null;
-
-        this.fxomObject = fxomObject;
-        this.newValue = newValue;
-        this.oldValue = fxomObject.getFxController();
-    }
-
-    /*
-     * Job
-     */
-    @Override
-    public boolean isExecutable() {
-        return Objects.equals(oldValue, newValue) == false;
-    }
-
-    @Override
-    public void execute() {
-        redo();
-    }
-
-    @Override
-    public void undo() {
-        getEditorController().getFxomDocument().beginUpdate();
-        this.fxomObject.setFxController(oldValue);
-        getEditorController().getFxomDocument().endUpdate();
-        assert Objects.equals(fxomObject.getFxController(), oldValue);
-    }
-
-    @Override
-    public void redo() {
-        getEditorController().getFxomDocument().beginUpdate();
-        this.fxomObject.setFxController(newValue);
-        getEditorController().getFxomDocument().endUpdate();
-        assert Objects.equals(fxomObject.getFxController(), newValue);
-    }
-
-    @Override
-    public String getDescription() {
-        final StringBuilder result = new StringBuilder();
-        result.append("Set controller class on ");
-        result.append(fxomObject.getGlueElement().getTagName());
-        return result.toString();
-    }
-}
--- a/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/job/ModifyFxIdJob.java	Mon Sep 01 09:19:43 2014 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,104 +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.editor.job;
-
-import com.oracle.javafx.scenebuilder.kit.editor.EditorController;
-import com.oracle.javafx.scenebuilder.kit.editor.i18n.I18N;
-import com.oracle.javafx.scenebuilder.kit.fxom.FXOMObject;
-import com.oracle.javafx.scenebuilder.kit.util.JavaLanguage;
-import java.util.Objects;
-
-/**
- * Job used to modify an fx:id.
- *
- */
-public class ModifyFxIdJob extends Job {
-
-    private final FXOMObject fxomObject;
-    private final String newValue;
-    private final String oldValue;
-
-    public ModifyFxIdJob(FXOMObject fxomObject, String newValue, EditorController editorController) {
-        super(editorController);
-
-        assert fxomObject != null;
-        assert fxomObject.getSceneGraphObject() != null;
-
-        this.fxomObject = fxomObject;
-        this.newValue = newValue;
-        this.oldValue = fxomObject.getFxId();
-    }
-
-    /*
-     * Job
-     */
-    @Override
-    public boolean isExecutable() {
-        return Objects.equals(oldValue, newValue) == false
-                && ((newValue == null) || JavaLanguage.isIdentifier(newValue));
-    }
-
-    @Override
-    public void execute() {
-        redo();
-    }
-
-    @Override
-    public void undo() {
-        getEditorController().getFxomDocument().beginUpdate();
-        this.fxomObject.setFxId(oldValue);
-        getEditorController().getFxomDocument().endUpdate();
-        assert Objects.equals(fxomObject.getFxId(), oldValue);
-    }
-
-    @Override
-    public void redo() {
-        getEditorController().getFxomDocument().beginUpdate();
-        this.fxomObject.setFxId(newValue);
-        getEditorController().getFxomDocument().endUpdate();
-        assert Objects.equals(fxomObject.getFxId(), newValue);
-    }
-
-    @Override
-    public String getDescription() {
-        final String result;
-        
-        if (newValue == null) {
-            assert oldValue != null;
-            result = I18N.getString("job.remove.fxid", oldValue);
-        } else {
-            result = I18N.getString("job.set.fxid", newValue);
-        }
-        
-        return result;
-    }
-}
--- a/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/job/ModifyObjectJob.java	Mon Sep 01 09:19:43 2014 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,123 +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.editor.job;
-
-import com.oracle.javafx.scenebuilder.kit.editor.EditorController;
-import com.oracle.javafx.scenebuilder.kit.editor.i18n.I18N;
-import com.oracle.javafx.scenebuilder.kit.fxom.FXOMInstance;
-import com.oracle.javafx.scenebuilder.kit.metadata.property.ValuePropertyMetadata;
-import java.util.Objects;
-
-/**
- *
- */
-public class ModifyObjectJob extends Job {
-
-    private final FXOMInstance fxomInstance;
-    private final ValuePropertyMetadata propertyMetadata;
-    private final Object newValue;
-    private final Object oldValue;
-    private final String description;
-
-    public ModifyObjectJob(
-            FXOMInstance fxomInstance, 
-            ValuePropertyMetadata propertyMetadata, 
-            Object newValue, 
-            EditorController editorController) {
-        super(editorController);
-
-        assert fxomInstance != null;
-        assert fxomInstance.getSceneGraphObject() != null;
-        assert propertyMetadata != null;
-
-        this.fxomInstance = fxomInstance;
-        this.propertyMetadata = propertyMetadata;
-        this.newValue = newValue;
-        this.oldValue = propertyMetadata.getValueObject(fxomInstance);
-        this.description = I18N.getString("label.action.edit.set.1",
-                propertyMetadata.getName().toString(),
-                fxomInstance.getSceneGraphObject().getClass().getSimpleName());
-    }
-
-    public ModifyObjectJob(
-            FXOMInstance fxomInstance,
-            ValuePropertyMetadata propertyMetadata,
-            Object newValue,
-            EditorController editorController,
-            String description) {
-        super(editorController);
-
-        assert fxomInstance != null;
-        assert fxomInstance.getSceneGraphObject() != null;
-        assert propertyMetadata != null;
-
-        this.fxomInstance = fxomInstance;
-        this.propertyMetadata = propertyMetadata;
-        this.newValue = newValue;
-        this.oldValue = propertyMetadata.getValueObject(fxomInstance);
-        this.description = description;
-    }
-
-    /*
-     * Job
-     */
-    @Override
-    public boolean isExecutable() {
-        final Object currentValue = propertyMetadata.getValueObject(fxomInstance);
-        return Objects.equals(newValue, currentValue) == false;
-    }
-
-    @Override
-    public void execute() {
-        redo();
-    }
-
-    @Override
-    public void undo() {
-        getEditorController().getFxomDocument().beginUpdate();
-        this.propertyMetadata.setValueObject(fxomInstance, oldValue);
-        getEditorController().getFxomDocument().endUpdate();
-    }
-
-    @Override
-    public void redo() {
-        getEditorController().getFxomDocument().beginUpdate();
-        this.propertyMetadata.setValueObject(fxomInstance, newValue);
-        getEditorController().getFxomDocument().endUpdate();
-    }
-
-    @Override
-    public String getDescription() {
-        return description;
-    }
-
-}
--- a/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/job/ModifySelectionJob.java	Mon Sep 01 09:19:43 2014 +0200
+++ b/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/job/ModifySelectionJob.java	Mon Sep 01 09:42:26 2014 +0200
@@ -31,10 +31,11 @@
  */
 package com.oracle.javafx.scenebuilder.kit.editor.job;
 
+import com.oracle.javafx.scenebuilder.kit.editor.job.atomic.ModifyObjectJob;
 import com.oracle.javafx.scenebuilder.kit.editor.EditorController;
 import com.oracle.javafx.scenebuilder.kit.editor.i18n.I18N;
-import com.oracle.javafx.scenebuilder.kit.editor.job.v2.BackupSelectionJob;
-import com.oracle.javafx.scenebuilder.kit.editor.job.v2.UpdateSelectionJob;
+import com.oracle.javafx.scenebuilder.kit.editor.job.atomic.BackupSelectionJob;
+import com.oracle.javafx.scenebuilder.kit.editor.job.atomic.UpdateSelectionJob;
 import com.oracle.javafx.scenebuilder.kit.editor.selection.GridSelectionGroup;
 import com.oracle.javafx.scenebuilder.kit.editor.selection.ObjectSelectionGroup;
 import com.oracle.javafx.scenebuilder.kit.editor.selection.Selection;
--- a/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/job/PasteJob.java	Mon Sep 01 09:19:43 2014 +0200
+++ b/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/job/PasteJob.java	Mon Sep 01 09:42:26 2014 +0200
@@ -31,6 +31,7 @@
  */
 package com.oracle.javafx.scenebuilder.kit.editor.job;
 
+import com.oracle.javafx.scenebuilder.kit.editor.job.atomic.RelocateNodeJob;
 import com.oracle.javafx.scenebuilder.kit.editor.EditorController;
 import com.oracle.javafx.scenebuilder.kit.editor.i18n.I18N;
 import com.oracle.javafx.scenebuilder.kit.editor.job.togglegroup.AdjustAllToggleGroupJob;
--- a/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/job/PrunePropertiesJob.java	Mon Sep 01 09:19:43 2014 +0200
+++ b/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/job/PrunePropertiesJob.java	Mon Sep 01 09:42:26 2014 +0200
@@ -33,8 +33,8 @@
 package com.oracle.javafx.scenebuilder.kit.editor.job;
 
 import com.oracle.javafx.scenebuilder.kit.editor.EditorController;
-import com.oracle.javafx.scenebuilder.kit.editor.job.v2.RemoveFxControllerJob;
-import com.oracle.javafx.scenebuilder.kit.editor.job.v2.RemovePropertyJob;
+import com.oracle.javafx.scenebuilder.kit.editor.job.atomic.RemoveFxControllerJob;
+import com.oracle.javafx.scenebuilder.kit.editor.job.atomic.RemovePropertyJob;
 import com.oracle.javafx.scenebuilder.kit.fxom.FXOMCollection;
 import com.oracle.javafx.scenebuilder.kit.fxom.FXOMInstance;
 import com.oracle.javafx.scenebuilder.kit.fxom.FXOMObject;
--- a/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/job/ReIndexObjectJob.java	Mon Sep 01 09:19:43 2014 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,123 +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.editor.job;
-
-import com.oracle.javafx.scenebuilder.kit.editor.EditorController;
-import com.oracle.javafx.scenebuilder.kit.fxom.FXOMCollection;
-import com.oracle.javafx.scenebuilder.kit.fxom.FXOMDocument;
-import com.oracle.javafx.scenebuilder.kit.fxom.FXOMInstance;
-import com.oracle.javafx.scenebuilder.kit.fxom.FXOMObject;
-
-/**
- *
- */
-public class ReIndexObjectJob extends Job {
-
-    private final FXOMObject reindexedObject;
-    private final FXOMObject beforeObject;
-    private final FXOMObject oldBeforeObject;
-    private String description;
-    
-
-    public ReIndexObjectJob(
-            FXOMObject reindexedObject, 
-            FXOMObject beforeObject, 
-            EditorController editorController) {
-        super(editorController);
-        assert reindexedObject != null;
-        
-        this.reindexedObject = reindexedObject;
-        this.beforeObject = beforeObject;
-        this.oldBeforeObject = reindexedObject.getNextSlibing();
-    }
-    
-    
-    /*
-     * Job
-     */
-    
-    @Override
-    public boolean isExecutable() {
-        return (beforeObject != oldBeforeObject);
-    }
-
-    @Override
-    public void execute() {
-        redo();
-    }
-
-    @Override
-    public void undo() {
-        assert isExecutable();
-
-        final FXOMDocument fxomDocument = getEditorController().getFxomDocument();
-        fxomDocument.beginUpdate();
-        reindexedObject.moveBeforeSibling(oldBeforeObject);
-        fxomDocument.endUpdate();
-    }
-
-    @Override
-    public void redo() {
-        assert isExecutable();
-
-        final FXOMDocument fxomDocument = getEditorController().getFxomDocument();
-        fxomDocument.beginUpdate();
-        reindexedObject.moveBeforeSibling(beforeObject);
-        fxomDocument.endUpdate();
-    }
-
-    @Override
-    public String getDescription() {
-        if (description == null) {
-            final StringBuilder sb = new StringBuilder();
-
-            sb.append("Move ");
-
-            if (reindexedObject instanceof FXOMInstance) {
-                final Object sceneGraphObject = reindexedObject.getSceneGraphObject();
-                if (sceneGraphObject != null) {
-                    sb.append(sceneGraphObject.getClass().getSimpleName());
-                } else {
-                    sb.append("Unresolved Object");
-                }
-            } else if (reindexedObject instanceof FXOMCollection) {
-                sb.append("Collection");
-            } else {
-                assert false;
-                sb.append(reindexedObject.getClass().getSimpleName());
-            }
-            description = sb.toString();
-        }
-        return description;
-    }
-    
-}
--- a/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/job/RelocateNodeJob.java	Mon Sep 01 09:19:43 2014 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,224 +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.editor.job;
-
-import com.oracle.javafx.scenebuilder.kit.editor.EditorController;
-import com.oracle.javafx.scenebuilder.kit.editor.panel.content.driver.relocater.AnchorPaneRelocater;
-import com.oracle.javafx.scenebuilder.kit.fxom.FXOMInstance;
-import com.oracle.javafx.scenebuilder.kit.metadata.Metadata;
-import com.oracle.javafx.scenebuilder.kit.metadata.property.value.DoublePropertyMetadata;
-import com.oracle.javafx.scenebuilder.kit.metadata.util.PropertyName;
-import com.oracle.javafx.scenebuilder.kit.util.MathUtils;
-import javafx.geometry.Bounds;
-import javafx.scene.Node;
-import javafx.scene.layout.AnchorPane;
-
-/**
- *
- */
-public class RelocateNodeJob extends Job {
-
-    private final FXOMInstance fxomInstance;
-    private double oldLayoutX;
-    private double oldLayoutY;
-    private Double oldLeftAnchor;
-    private Double oldRightAnchor;
-    private Double oldTopAnchor;
-    private Double oldBottomAnchor;
-    
-    private double newLayoutX;
-    private double newLayoutY;
-    private Double newLeftAnchor;
-    private Double newRightAnchor;
-    private Double newTopAnchor;
-    private Double newBottomAnchor;
-    
-    private final DoublePropertyMetadata layoutXMeta;
-    private final DoublePropertyMetadata layoutYMeta;
-    private final DoublePropertyMetadata leftAnchorMeta;
-    private final DoublePropertyMetadata rightAnchorMeta;
-    private final DoublePropertyMetadata topAnchorMeta;
-    private final DoublePropertyMetadata bottomAnchorMeta;
-    
-    public RelocateNodeJob(FXOMInstance fxomInstance, double newLayoutX, double newLayoutY, EditorController editorController) {
-        super(editorController);
-        
-        assert fxomInstance != null;
-        assert fxomInstance.getSceneGraphObject() instanceof Node;
-        
-        this.fxomInstance = fxomInstance;
-        this.newLayoutX = newLayoutX;
-        this.newLayoutY = newLayoutY;
-        
-        final Metadata metadata = Metadata.getMetadata();
-        final Class<?> sgoClass = fxomInstance.getSceneGraphObject().getClass();
-        final PropertyName layoutXName = new PropertyName("layoutX"); //NOI18N
-        final PropertyName layoutYName = new PropertyName("layoutY"); //NOI18N
-        final PropertyName leftAnchorName   = new PropertyName("leftAnchor",   AnchorPane.class); //NOI18N
-        final PropertyName rightAnchorName  = new PropertyName("rightAnchor",  AnchorPane.class); //NOI18N
-        final PropertyName topAnchorName    = new PropertyName("topAnchor",    AnchorPane.class); //NOI18N
-        final PropertyName bottomAnchorName = new PropertyName("bottomAnchor", AnchorPane.class); //NOI18N
-        this.layoutXMeta = (DoublePropertyMetadata) metadata.queryProperty(sgoClass, layoutXName);
-        this.layoutYMeta = (DoublePropertyMetadata) metadata.queryProperty(sgoClass, layoutYName);
-        this.leftAnchorMeta   = (DoublePropertyMetadata) metadata.queryProperty(sgoClass, leftAnchorName  );
-        this.rightAnchorMeta  = (DoublePropertyMetadata) metadata.queryProperty(sgoClass, rightAnchorName );
-        this.topAnchorMeta    = (DoublePropertyMetadata) metadata.queryProperty(sgoClass, topAnchorName   );
-        this.bottomAnchorMeta = (DoublePropertyMetadata) metadata.queryProperty(sgoClass, bottomAnchorName);
-    }
-
-    public FXOMInstance getFxomInstance() {
-        return fxomInstance;
-    }
-
-    public double getNewLayoutX() {
-        return newLayoutX;
-    }
-
-    public double getNewLayoutY() {
-        return newLayoutY;
-    }
-    
-    public void mergeWith(RelocateNodeJob youngerJob) {
-        assert ! (MathUtils.equals(this.newLayoutX, youngerJob.newLayoutX) 
-               && MathUtils.equals(this.newLayoutY, youngerJob.newLayoutY));
-        this.newLayoutX = youngerJob.newLayoutX;
-        this.newLayoutY = youngerJob.newLayoutY;
-        updateNewAnchors();
-    }
-    
-    /*
-     * Job
-     */
-    @Override
-    public boolean isExecutable() {
-        return true;
-    }
-
-    @Override
-    public void execute() {
-        this.oldLayoutX = layoutXMeta.getValue(fxomInstance);
-        this.oldLayoutY = layoutYMeta.getValue(fxomInstance);
-        this.oldLeftAnchor   = leftAnchorMeta.getValue(fxomInstance);
-        this.oldRightAnchor  = rightAnchorMeta.getValue(fxomInstance);
-        this.oldTopAnchor    = topAnchorMeta.getValue(fxomInstance);
-        this.oldBottomAnchor = bottomAnchorMeta.getValue(fxomInstance);
-        
-        updateNewAnchors();
-        
-        redo();
-    }
-
-    @Override
-    public void undo() {
-        this.layoutXMeta.setValue(fxomInstance, oldLayoutX);
-        this.layoutYMeta.setValue(fxomInstance, oldLayoutY);
-        if (oldLeftAnchor != null) {
-            leftAnchorMeta.setValue(fxomInstance, oldLeftAnchor);
-        }
-        if (oldRightAnchor != null) {
-            rightAnchorMeta.setValue(fxomInstance, oldRightAnchor);
-        }
-        if (oldTopAnchor != null) {
-            topAnchorMeta.setValue(fxomInstance, oldTopAnchor);
-        }
-        if (oldBottomAnchor != null) {
-            bottomAnchorMeta.setValue(fxomInstance, oldBottomAnchor);
-        }
-    }
-
-    @Override
-    public void redo() {
-        this.layoutXMeta.setValue(fxomInstance, newLayoutX);
-        this.layoutYMeta.setValue(fxomInstance, newLayoutY);
-        if (newLeftAnchor != null) {
-            leftAnchorMeta.setValue(fxomInstance, newLeftAnchor);
-        }
-        if (newRightAnchor != null) {
-            rightAnchorMeta.setValue(fxomInstance, newRightAnchor);
-        }
-        if (newTopAnchor != null) {
-            topAnchorMeta.setValue(fxomInstance, newTopAnchor);
-        }
-        if (newBottomAnchor != null) {
-            bottomAnchorMeta.setValue(fxomInstance, newBottomAnchor);
-        }
-    }
-
-    @Override
-    public String getDescription() {
-        return getClass().getSimpleName(); // Not expected to reach the user
-    }
-    
-    
-    /*
-     * Private
-     */
-    
-    private void updateNewAnchors() {
-        if ((this.oldLeftAnchor == null) && (this.oldRightAnchor == null)) {
-            this.newLeftAnchor = null;
-            this.newRightAnchor = null;
-        } else {
-            final Node sceneGraphNode = (Node)fxomInstance.getSceneGraphObject();
-            final Bounds nodeLayoutBounds = sceneGraphNode.getLayoutBounds();
-            final Bounds parentLayoutBounds = sceneGraphNode.getParent().getLayoutBounds();
-            if (this.oldLeftAnchor != null) {
-                this.newLeftAnchor = AnchorPaneRelocater.computeLeftAnchor(parentLayoutBounds, nodeLayoutBounds, newLayoutX);
-            } else {
-                this.newLeftAnchor = null;
-            }
-            if (this.oldRightAnchor != null) {
-                this.newRightAnchor = AnchorPaneRelocater.computeRightAnchor(parentLayoutBounds, nodeLayoutBounds, newLayoutX);
-            } else {
-                this.newRightAnchor = null;
-            }
-        }
-        if ((this.oldTopAnchor == null) && (this.oldBottomAnchor == null)) {
-            this.newTopAnchor = null;
-            this.newBottomAnchor = null;
-        } else {
-            final Node sceneGraphNode = (Node)fxomInstance.getSceneGraphObject();
-            final Bounds nodeLayoutBounds = sceneGraphNode.getLayoutBounds();
-            final Bounds parentLayoutBounds = sceneGraphNode.getParent().getLayoutBounds();
-            if (this.oldTopAnchor != null) {
-                this.newTopAnchor = AnchorPaneRelocater.computeTopAnchor(parentLayoutBounds, nodeLayoutBounds, newLayoutY);
-            } else {
-                this.newTopAnchor = null;
-            }
-            if (this.oldBottomAnchor != null) {
-                this.newBottomAnchor = AnchorPaneRelocater.computeBottomAnchor(parentLayoutBounds, nodeLayoutBounds, newLayoutY);
-            } else {
-                this.newBottomAnchor = null;
-            }
-        }
-    }
-}
--- a/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/job/RelocateSelectionJob.java	Mon Sep 01 09:19:43 2014 +0200
+++ b/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/job/RelocateSelectionJob.java	Mon Sep 01 09:42:26 2014 +0200
@@ -32,6 +32,7 @@
 
 package com.oracle.javafx.scenebuilder.kit.editor.job;
 
+import com.oracle.javafx.scenebuilder.kit.editor.job.atomic.RelocateNodeJob;
 import com.oracle.javafx.scenebuilder.kit.editor.EditorController;
 import com.oracle.javafx.scenebuilder.kit.editor.i18n.I18N;
 import com.oracle.javafx.scenebuilder.kit.editor.selection.ObjectSelectionGroup;
--- a/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/job/SendBackwardJob.java	Mon Sep 01 09:19:43 2014 +0200
+++ b/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/job/SendBackwardJob.java	Mon Sep 01 09:42:26 2014 +0200
@@ -31,6 +31,7 @@
  */
 package com.oracle.javafx.scenebuilder.kit.editor.job;
 
+import com.oracle.javafx.scenebuilder.kit.editor.job.atomic.ReIndexObjectJob;
 import com.oracle.javafx.scenebuilder.kit.editor.EditorController;
 import com.oracle.javafx.scenebuilder.kit.editor.job.togglegroup.AdjustAllToggleGroupJob;
 import com.oracle.javafx.scenebuilder.kit.editor.selection.GridSelectionGroup;
--- a/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/job/SendToBackJob.java	Mon Sep 01 09:19:43 2014 +0200
+++ b/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/job/SendToBackJob.java	Mon Sep 01 09:42:26 2014 +0200
@@ -31,6 +31,7 @@
  */
 package com.oracle.javafx.scenebuilder.kit.editor.job;
 
+import com.oracle.javafx.scenebuilder.kit.editor.job.atomic.ReIndexObjectJob;
 import com.oracle.javafx.scenebuilder.kit.editor.EditorController;
 import com.oracle.javafx.scenebuilder.kit.editor.job.togglegroup.AdjustAllToggleGroupJob;
 import com.oracle.javafx.scenebuilder.kit.editor.selection.GridSelectionGroup;
--- a/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/job/ToggleFxRootJob.java	Mon Sep 01 09:19:43 2014 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,82 +0,0 @@
-/*
- * 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.i18n.I18N;
-import com.oracle.javafx.scenebuilder.kit.fxom.FXOMDocument;
-import com.oracle.javafx.scenebuilder.kit.fxom.FXOMInstance;
-
-/**
- * Job used to enable/disable fx:root on the fxom document associated
- * to the editor controller (if any).
- */
-public class ToggleFxRootJob extends Job {
-
-    public ToggleFxRootJob(EditorController editorController) {
-        super(editorController);
-    }
-
-    /*
-     * Job
-     */
-    @Override
-    public boolean isExecutable() {
-        final FXOMDocument fxomDocument = getEditorController().getFxomDocument();
-        return (fxomDocument != null) && (fxomDocument.getFxomRoot() instanceof FXOMInstance);
-    }
-
-    @Override
-    public void execute() {
-        redo();
-    }
-
-    @Override
-    public void undo() {
-        redo();
-    }
-
-    @Override
-    public void redo() {
-        assert getEditorController().getFxomDocument() != null;
-        assert getEditorController().getFxomDocument().getFxomRoot() instanceof FXOMInstance;
-
-        final FXOMDocument fxomDocument = getEditorController().getFxomDocument();
-        final FXOMInstance rootInstance = (FXOMInstance) fxomDocument.getFxomRoot();
-        rootInstance.toggleFxRoot();
-    }
-
-    @Override
-    public String getDescription() {
-        return I18N.getString("job.toggle.fx.root");
-    }
-}
--- a/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/job/TrimSelectionJob.java	Mon Sep 01 09:19:43 2014 +0200
+++ b/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/job/TrimSelectionJob.java	Mon Sep 01 09:42:26 2014 +0200
@@ -31,6 +31,8 @@
  */
 package com.oracle.javafx.scenebuilder.kit.editor.job;
 
+import com.oracle.javafx.scenebuilder.kit.editor.job.atomic.ToggleFxRootJob;
+import com.oracle.javafx.scenebuilder.kit.editor.job.atomic.ModifyFxControllerJob;
 import com.oracle.javafx.scenebuilder.kit.editor.EditorController;
 import com.oracle.javafx.scenebuilder.kit.editor.i18n.I18N;
 import com.oracle.javafx.scenebuilder.kit.editor.job.togglegroup.AdjustAllToggleGroupJob;
--- a/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/job/UseComputedSizesObjectJob.java	Mon Sep 01 09:19:43 2014 +0200
+++ b/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/job/UseComputedSizesObjectJob.java	Mon Sep 01 09:42:26 2014 +0200
@@ -31,6 +31,7 @@
  */
 package com.oracle.javafx.scenebuilder.kit.editor.job;
 
+import com.oracle.javafx.scenebuilder.kit.editor.job.atomic.ModifyObjectJob;
 import com.oracle.javafx.scenebuilder.kit.editor.EditorController;
 import com.oracle.javafx.scenebuilder.kit.fxom.FXOMInstance;
 import com.oracle.javafx.scenebuilder.kit.fxom.FXOMObject;
--- a/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/job/UsePredefinedSizeJob.java	Mon Sep 01 09:19:43 2014 +0200
+++ b/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/job/UsePredefinedSizeJob.java	Mon Sep 01 09:42:26 2014 +0200
@@ -31,6 +31,7 @@
  */
 package com.oracle.javafx.scenebuilder.kit.editor.job;
 
+import com.oracle.javafx.scenebuilder.kit.editor.job.atomic.ModifyObjectJob;
 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;
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/job/atomic/AddPropertyJob.java	Mon Sep 01 09:42:26 2014 +0200
@@ -0,0 +1,106 @@
+/*
+ * 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.job.atomic;
+
+import com.oracle.javafx.scenebuilder.kit.editor.EditorController;
+import com.oracle.javafx.scenebuilder.kit.editor.job.Job;
+import com.oracle.javafx.scenebuilder.kit.fxom.FXOMInstance;
+import com.oracle.javafx.scenebuilder.kit.fxom.FXOMProperty;
+
+/**
+ *
+ */
+public class AddPropertyJob extends Job {
+
+    private final FXOMProperty property;
+    private final FXOMInstance targetInstance;
+    private final int targetIndex;
+    
+    public AddPropertyJob(FXOMProperty property, 
+            FXOMInstance targetInstance,
+            int targetIndex,
+            EditorController editorController) {
+        super(editorController);
+        
+        assert property != null;
+        assert targetInstance != null;
+        assert targetIndex >= -1;
+        
+        this.property = property;
+        this.targetInstance = targetInstance;
+        this.targetIndex = targetIndex;
+    }
+
+    /*
+     * Job
+     */
+    
+    @Override
+    public boolean isExecutable() {
+        return property.getParentInstance() == null;
+    }
+
+    @Override
+    public void execute() {
+        redo();
+    }
+
+    @Override
+    public void undo() {
+        assert property.getParentInstance() == targetInstance;
+        
+        getEditorController().getSelection().clear();
+        getEditorController().getFxomDocument().beginUpdate();
+        property.removeFromParentInstance();
+        getEditorController().getFxomDocument().endUpdate();
+        
+        assert property.getParentInstance() == null;
+    }
+
+    @Override
+    public void redo() {
+        assert property.getParentInstance() == null;
+        
+        getEditorController().getFxomDocument().beginUpdate();
+        property.addToParentInstance(targetIndex, targetInstance);
+        getEditorController().getFxomDocument().endUpdate();
+        
+        assert property.getParentInstance() == targetInstance;
+    }
+
+    @Override
+    public String getDescription() {
+        // Should normally not reach the user
+        return getClass().getSimpleName();
+    }
+    
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/job/atomic/AddPropertyValueJob.java	Mon Sep 01 09:42:26 2014 +0200
@@ -0,0 +1,110 @@
+/*
+ * 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.job.atomic;
+
+import com.oracle.javafx.scenebuilder.kit.editor.EditorController;
+import com.oracle.javafx.scenebuilder.kit.editor.job.Job;
+import com.oracle.javafx.scenebuilder.kit.fxom.FXOMObject;
+import com.oracle.javafx.scenebuilder.kit.fxom.FXOMPropertyC;
+
+/**
+ *
+ */
+public class AddPropertyValueJob extends Job {
+
+    private final FXOMObject value;
+    private final FXOMPropertyC targetProperty;
+    private final int targetIndex;
+    
+    public AddPropertyValueJob(FXOMObject value, FXOMPropertyC targetProperty, 
+            int targetIndex, EditorController editorController) {
+        super(editorController);
+        
+        assert value != null;
+        assert targetProperty != null;
+        assert targetIndex >= -1;
+        
+        this.value = value;
+        this.targetProperty = targetProperty;
+        this.targetIndex = targetIndex;
+    }
+
+    /*
+     * AddPropertyValueJob
+     */
+    
+    @Override
+    public boolean isExecutable() {
+        return (value.getParentProperty() == null)
+                && (value.getParentCollection() == null);
+    }
+
+    @Override
+    public void execute() {
+        assert targetIndex <= targetProperty.getValues().size();
+        redo();
+    }
+
+    @Override
+    public void undo() {
+        assert value.getParentProperty() == targetProperty;
+        assert value.getParentCollection() == null;
+        
+        getEditorController().getSelection().clear();
+        getEditorController().getFxomDocument().beginUpdate();
+        value.removeFromParentProperty();
+        getEditorController().getFxomDocument().endUpdate();
+        
+        assert value.getParentProperty() == null;
+        assert value.getParentCollection() == null;
+    }
+
+    @Override
+    public void redo() {
+        assert value.getParentProperty() == null;
+        assert value.getParentCollection() == null;
+        
+        getEditorController().getFxomDocument().beginUpdate();
+        value.addToParentProperty(targetIndex, targetProperty);
+        getEditorController().getFxomDocument().endUpdate();
+        
+        assert value.getParentProperty() == targetProperty;
+        assert value.getParentCollection() == null;
+    }
+
+    @Override
+    public String getDescription() {
+        // Should normally not reach the user
+        return getClass().getSimpleName();
+    }
+    
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/job/atomic/BackupSelectionJob.java	Mon Sep 01 09:42:26 2014 +0200
@@ -0,0 +1,96 @@
+/*
+ * 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.atomic;
+
+import com.oracle.javafx.scenebuilder.kit.editor.EditorController;
+import com.oracle.javafx.scenebuilder.kit.editor.job.Job;
+import com.oracle.javafx.scenebuilder.kit.editor.selection.AbstractSelectionGroup;
+import com.oracle.javafx.scenebuilder.kit.editor.selection.Selection;
+
+/**
+ *
+ */
+public class BackupSelectionJob extends Job {
+
+    private final AbstractSelectionGroup oldSelectionGroup;
+
+    public BackupSelectionJob(EditorController editorController) {
+        super(editorController);
+        
+        // Saves the current selection
+        final Selection selection = getEditorController().getSelection();
+        try {
+            if (selection.getGroup() == null) {
+                this.oldSelectionGroup = null;
+            } else {
+                this.oldSelectionGroup = selection.getGroup().clone();
+            }
+        } catch(CloneNotSupportedException x) {
+            throw new RuntimeException("Bug", x); //NOI18N
+        }
+    }
+
+    /*
+     * Job
+     */
+
+    @Override
+    public boolean isExecutable() {
+        return true;
+    }
+
+    @Override
+    public void execute() {
+        // Now same as redo()
+        redo();
+    }
+
+    @Override
+    public void undo() {
+        final Selection selection = getEditorController().getSelection();
+        selection.select(oldSelectionGroup);
+        assert selection.isValid(getEditorController().getFxomDocument());
+    }
+
+    @Override
+    public void redo() {
+        // Nothing to do :)
+    }
+
+    @Override
+    public String getDescription() {
+        // Not expected to reach the user
+        return getClass().getSimpleName();
+    }
+    
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/job/atomic/ClearSelectionJob.java	Mon Sep 01 09:42:26 2014 +0200
@@ -0,0 +1,46 @@
+/*
+ * 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.job.atomic;
+
+import com.oracle.javafx.scenebuilder.kit.editor.EditorController;
+import java.util.Collections;
+
+/**
+ *
+ */
+public class ClearSelectionJob extends UpdateSelectionJob {
+    
+    public ClearSelectionJob(EditorController editorController) {
+        super(Collections.emptyList(), editorController);
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/job/atomic/ModifyFxControllerJob.java	Mon Sep 01 09:42:26 2014 +0200
@@ -0,0 +1,95 @@
+/*
+ * 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.job.atomic;
+
+import com.oracle.javafx.scenebuilder.kit.editor.EditorController;
+import com.oracle.javafx.scenebuilder.kit.editor.job.Job;
+import com.oracle.javafx.scenebuilder.kit.fxom.FXOMObject;
+import java.util.Objects;
+
+/**
+ * Job used to modify the FX controller class.
+ *
+ */
+public class ModifyFxControllerJob extends Job {
+
+    private final FXOMObject fxomObject;
+    private final String newValue;
+    private final String oldValue;
+
+    public ModifyFxControllerJob(FXOMObject fxomObject, String newValue, EditorController editorController) {
+        super(editorController);
+
+        assert fxomObject != null;
+
+        this.fxomObject = fxomObject;
+        this.newValue = newValue;
+        this.oldValue = fxomObject.getFxController();
+    }
+
+    /*
+     * Job
+     */
+    @Override
+    public boolean isExecutable() {
+        return Objects.equals(oldValue, newValue) == false;
+    }
+
+    @Override
+    public void execute() {
+        redo();
+    }
+
+    @Override
+    public void undo() {
+        getEditorController().getFxomDocument().beginUpdate();
+        this.fxomObject.setFxController(oldValue);
+        getEditorController().getFxomDocument().endUpdate();
+        assert Objects.equals(fxomObject.getFxController(), oldValue);
+    }
+
+    @Override
+    public void redo() {
+        getEditorController().getFxomDocument().beginUpdate();
+        this.fxomObject.setFxController(newValue);
+        getEditorController().getFxomDocument().endUpdate();
+        assert Objects.equals(fxomObject.getFxController(), newValue);
+    }
+
+    @Override
+    public String getDescription() {
+        final StringBuilder result = new StringBuilder();
+        result.append("Set controller class on ");
+        result.append(fxomObject.getGlueElement().getTagName());
+        return result.toString();
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/job/atomic/ModifyFxIdJob.java	Mon Sep 01 09:42:26 2014 +0200
@@ -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.editor.job.atomic;
+
+import com.oracle.javafx.scenebuilder.kit.editor.EditorController;
+import com.oracle.javafx.scenebuilder.kit.editor.i18n.I18N;
+import com.oracle.javafx.scenebuilder.kit.editor.job.Job;
+import com.oracle.javafx.scenebuilder.kit.fxom.FXOMObject;
+import com.oracle.javafx.scenebuilder.kit.util.JavaLanguage;
+import java.util.Objects;
+
+/**
+ * Job used to modify an fx:id.
+ *
+ */
+public class ModifyFxIdJob extends Job {
+
+    private final FXOMObject fxomObject;
+    private final String newValue;
+    private final String oldValue;
+
+    public ModifyFxIdJob(FXOMObject fxomObject, String newValue, EditorController editorController) {
+        super(editorController);
+
+        assert fxomObject != null;
+        assert fxomObject.getSceneGraphObject() != null;
+
+        this.fxomObject = fxomObject;
+        this.newValue = newValue;
+        this.oldValue = fxomObject.getFxId();
+    }
+
+    /*
+     * Job
+     */
+    @Override
+    public boolean isExecutable() {
+        return Objects.equals(oldValue, newValue) == false
+                && ((newValue == null) || JavaLanguage.isIdentifier(newValue));
+    }
+
+    @Override
+    public void execute() {
+        redo();
+    }
+
+    @Override
+    public void undo() {
+        getEditorController().getFxomDocument().beginUpdate();
+        this.fxomObject.setFxId(oldValue);
+        getEditorController().getFxomDocument().endUpdate();
+        assert Objects.equals(fxomObject.getFxId(), oldValue);
+    }
+
+    @Override
+    public void redo() {
+        getEditorController().getFxomDocument().beginUpdate();
+        this.fxomObject.setFxId(newValue);
+        getEditorController().getFxomDocument().endUpdate();
+        assert Objects.equals(fxomObject.getFxId(), newValue);
+    }
+
+    @Override
+    public String getDescription() {
+        final String result;
+        
+        if (newValue == null) {
+            assert oldValue != null;
+            result = I18N.getString("job.remove.fxid", oldValue);
+        } else {
+            result = I18N.getString("job.set.fxid", newValue);
+        }
+        
+        return result;
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/job/atomic/ModifyObjectJob.java	Mon Sep 01 09:42:26 2014 +0200
@@ -0,0 +1,124 @@
+/*
+ * 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.job.atomic;
+
+import com.oracle.javafx.scenebuilder.kit.editor.EditorController;
+import com.oracle.javafx.scenebuilder.kit.editor.i18n.I18N;
+import com.oracle.javafx.scenebuilder.kit.editor.job.Job;
+import com.oracle.javafx.scenebuilder.kit.fxom.FXOMInstance;
+import com.oracle.javafx.scenebuilder.kit.metadata.property.ValuePropertyMetadata;
+import java.util.Objects;
+
+/**
+ *
+ */
+public class ModifyObjectJob extends Job {
+
+    private final FXOMInstance fxomInstance;
+    private final ValuePropertyMetadata propertyMetadata;
+    private final Object newValue;
+    private final Object oldValue;
+    private final String description;
+
+    public ModifyObjectJob(
+            FXOMInstance fxomInstance, 
+            ValuePropertyMetadata propertyMetadata, 
+            Object newValue, 
+            EditorController editorController) {
+        super(editorController);
+
+        assert fxomInstance != null;
+        assert fxomInstance.getSceneGraphObject() != null;
+        assert propertyMetadata != null;
+
+        this.fxomInstance = fxomInstance;
+        this.propertyMetadata = propertyMetadata;
+        this.newValue = newValue;
+        this.oldValue = propertyMetadata.getValueObject(fxomInstance);
+        this.description = I18N.getString("label.action.edit.set.1",
+                propertyMetadata.getName().toString(),
+                fxomInstance.getSceneGraphObject().getClass().getSimpleName());
+    }
+
+    public ModifyObjectJob(
+            FXOMInstance fxomInstance,
+            ValuePropertyMetadata propertyMetadata,
+            Object newValue,
+            EditorController editorController,
+            String description) {
+        super(editorController);
+
+        assert fxomInstance != null;
+        assert fxomInstance.getSceneGraphObject() != null;
+        assert propertyMetadata != null;
+
+        this.fxomInstance = fxomInstance;
+        this.propertyMetadata = propertyMetadata;
+        this.newValue = newValue;
+        this.oldValue = propertyMetadata.getValueObject(fxomInstance);
+        this.description = description;
+    }
+
+    /*
+     * Job
+     */
+    @Override
+    public boolean isExecutable() {
+        final Object currentValue = propertyMetadata.getValueObject(fxomInstance);
+        return Objects.equals(newValue, currentValue) == false;
+    }
+
+    @Override
+    public void execute() {
+        redo();
+    }
+
+    @Override
+    public void undo() {
+        getEditorController().getFxomDocument().beginUpdate();
+        this.propertyMetadata.setValueObject(fxomInstance, oldValue);
+        getEditorController().getFxomDocument().endUpdate();
+    }
+
+    @Override
+    public void redo() {
+        getEditorController().getFxomDocument().beginUpdate();
+        this.propertyMetadata.setValueObject(fxomInstance, newValue);
+        getEditorController().getFxomDocument().endUpdate();
+    }
+
+    @Override
+    public String getDescription() {
+        return description;
+    }
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/job/atomic/ReIndexObjectJob.java	Mon Sep 01 09:42:26 2014 +0200
@@ -0,0 +1,124 @@
+/*
+ * 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.job.atomic;
+
+import com.oracle.javafx.scenebuilder.kit.editor.EditorController;
+import com.oracle.javafx.scenebuilder.kit.editor.job.Job;
+import com.oracle.javafx.scenebuilder.kit.fxom.FXOMCollection;
+import com.oracle.javafx.scenebuilder.kit.fxom.FXOMDocument;
+import com.oracle.javafx.scenebuilder.kit.fxom.FXOMInstance;
+import com.oracle.javafx.scenebuilder.kit.fxom.FXOMObject;
+
+/**
+ *
+ */
+public class ReIndexObjectJob extends Job {
+
+    private final FXOMObject reindexedObject;
+    private final FXOMObject beforeObject;
+    private final FXOMObject oldBeforeObject;
+    private String description;
+    
+
+    public ReIndexObjectJob(
+            FXOMObject reindexedObject, 
+            FXOMObject beforeObject, 
+            EditorController editorController) {
+        super(editorController);
+        assert reindexedObject != null;
+        
+        this.reindexedObject = reindexedObject;
+        this.beforeObject = beforeObject;
+        this.oldBeforeObject = reindexedObject.getNextSlibing();
+    }
+    
+    
+    /*
+     * Job
+     */
+    
+    @Override
+    public boolean isExecutable() {
+        return (beforeObject != oldBeforeObject);
+    }
+
+    @Override
+    public void execute() {
+        redo();
+    }
+
+    @Override
+    public void undo() {
+        assert isExecutable();
+
+        final FXOMDocument fxomDocument = getEditorController().getFxomDocument();
+        fxomDocument.beginUpdate();
+        reindexedObject.moveBeforeSibling(oldBeforeObject);
+        fxomDocument.endUpdate();
+    }
+
+    @Override
+    public void redo() {
+        assert isExecutable();
+
+        final FXOMDocument fxomDocument = getEditorController().getFxomDocument();
+        fxomDocument.beginUpdate();
+        reindexedObject.moveBeforeSibling(beforeObject);
+        fxomDocument.endUpdate();
+    }
+
+    @Override
+    public String getDescription() {
+        if (description == null) {
+            final StringBuilder sb = new StringBuilder();
+
+            sb.append("Move ");
+
+            if (reindexedObject instanceof FXOMInstance) {
+                final Object sceneGraphObject = reindexedObject.getSceneGraphObject();
+                if (sceneGraphObject != null) {
+                    sb.append(sceneGraphObject.getClass().getSimpleName());
+                } else {
+                    sb.append("Unresolved Object");
+                }
+            } else if (reindexedObject instanceof FXOMCollection) {
+                sb.append("Collection");
+            } else {
+                assert false;
+                sb.append(reindexedObject.getClass().getSimpleName());
+            }
+            description = sb.toString();
+        }
+        return description;
+    }
+    
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/job/atomic/RelocateNodeJob.java	Mon Sep 01 09:42:26 2014 +0200
@@ -0,0 +1,225 @@
+/*
+ * 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.job.atomic;
+
+import com.oracle.javafx.scenebuilder.kit.editor.EditorController;
+import com.oracle.javafx.scenebuilder.kit.editor.job.Job;
+import com.oracle.javafx.scenebuilder.kit.editor.panel.content.driver.relocater.AnchorPaneRelocater;
+import com.oracle.javafx.scenebuilder.kit.fxom.FXOMInstance;
+import com.oracle.javafx.scenebuilder.kit.metadata.Metadata;
+import com.oracle.javafx.scenebuilder.kit.metadata.property.value.DoublePropertyMetadata;
+import com.oracle.javafx.scenebuilder.kit.metadata.util.PropertyName;
+import com.oracle.javafx.scenebuilder.kit.util.MathUtils;
+import javafx.geometry.Bounds;
+import javafx.scene.Node;
+import javafx.scene.layout.AnchorPane;
+
+/**
+ *
+ */
+public class RelocateNodeJob extends Job {
+
+    private final FXOMInstance fxomInstance;
+    private double oldLayoutX;
+    private double oldLayoutY;
+    private Double oldLeftAnchor;
+    private Double oldRightAnchor;
+    private Double oldTopAnchor;
+    private Double oldBottomAnchor;
+    
+    private double newLayoutX;
+    private double newLayoutY;
+    private Double newLeftAnchor;
+    private Double newRightAnchor;
+    private Double newTopAnchor;
+    private Double newBottomAnchor;
+    
+    private final DoublePropertyMetadata layoutXMeta;
+    private final DoublePropertyMetadata layoutYMeta;
+    private final DoublePropertyMetadata leftAnchorMeta;
+    private final DoublePropertyMetadata rightAnchorMeta;
+    private final DoublePropertyMetadata topAnchorMeta;
+    private final DoublePropertyMetadata bottomAnchorMeta;
+    
+    public RelocateNodeJob(FXOMInstance fxomInstance, double newLayoutX, double newLayoutY, EditorController editorController) {
+        super(editorController);
+        
+        assert fxomInstance != null;
+        assert fxomInstance.getSceneGraphObject() instanceof Node;
+        
+        this.fxomInstance = fxomInstance;
+        this.newLayoutX = newLayoutX;
+        this.newLayoutY = newLayoutY;
+        
+        final Metadata metadata = Metadata.getMetadata();
+        final Class<?> sgoClass = fxomInstance.getSceneGraphObject().getClass();
+        final PropertyName layoutXName = new PropertyName("layoutX"); //NOI18N
+        final PropertyName layoutYName = new PropertyName("layoutY"); //NOI18N
+        final PropertyName leftAnchorName   = new PropertyName("leftAnchor",   AnchorPane.class); //NOI18N
+        final PropertyName rightAnchorName  = new PropertyName("rightAnchor",  AnchorPane.class); //NOI18N
+        final PropertyName topAnchorName    = new PropertyName("topAnchor",    AnchorPane.class); //NOI18N
+        final PropertyName bottomAnchorName = new PropertyName("bottomAnchor", AnchorPane.class); //NOI18N
+        this.layoutXMeta = (DoublePropertyMetadata) metadata.queryProperty(sgoClass, layoutXName);
+        this.layoutYMeta = (DoublePropertyMetadata) metadata.queryProperty(sgoClass, layoutYName);
+        this.leftAnchorMeta   = (DoublePropertyMetadata) metadata.queryProperty(sgoClass, leftAnchorName  );
+        this.rightAnchorMeta  = (DoublePropertyMetadata) metadata.queryProperty(sgoClass, rightAnchorName );
+        this.topAnchorMeta    = (DoublePropertyMetadata) metadata.queryProperty(sgoClass, topAnchorName   );
+        this.bottomAnchorMeta = (DoublePropertyMetadata) metadata.queryProperty(sgoClass, bottomAnchorName);
+    }
+
+    public FXOMInstance getFxomInstance() {
+        return fxomInstance;
+    }
+
+    public double getNewLayoutX() {
+        return newLayoutX;
+    }
+
+    public double getNewLayoutY() {
+        return newLayoutY;
+    }
+    
+    public void mergeWith(RelocateNodeJob youngerJob) {
+        assert ! (MathUtils.equals(this.newLayoutX, youngerJob.newLayoutX) 
+               && MathUtils.equals(this.newLayoutY, youngerJob.newLayoutY));
+        this.newLayoutX = youngerJob.newLayoutX;
+        this.newLayoutY = youngerJob.newLayoutY;
+        updateNewAnchors();
+    }
+    
+    /*
+     * Job
+     */
+    @Override
+    public boolean isExecutable() {
+        return true;
+    }
+
+    @Override
+    public void execute() {
+        this.oldLayoutX = layoutXMeta.getValue(fxomInstance);
+        this.oldLayoutY = layoutYMeta.getValue(fxomInstance);
+        this.oldLeftAnchor   = leftAnchorMeta.getValue(fxomInstance);
+        this.oldRightAnchor  = rightAnchorMeta.getValue(fxomInstance);
+        this.oldTopAnchor    = topAnchorMeta.getValue(fxomInstance);
+        this.oldBottomAnchor = bottomAnchorMeta.getValue(fxomInstance);
+        
+        updateNewAnchors();
+        
+        redo();
+    }
+
+    @Override
+    public void undo() {
+        this.layoutXMeta.setValue(fxomInstance, oldLayoutX);
+        this.layoutYMeta.setValue(fxomInstance, oldLayoutY);
+        if (oldLeftAnchor != null) {
+            leftAnchorMeta.setValue(fxomInstance, oldLeftAnchor);
+        }
+        if (oldRightAnchor != null) {
+            rightAnchorMeta.setValue(fxomInstance, oldRightAnchor);
+        }
+        if (oldTopAnchor != null) {
+            topAnchorMeta.setValue(fxomInstance, oldTopAnchor);
+        }
+        if (oldBottomAnchor != null) {
+            bottomAnchorMeta.setValue(fxomInstance, oldBottomAnchor);
+        }
+    }
+
+    @Override
+    public void redo() {
+        this.layoutXMeta.setValue(fxomInstance, newLayoutX);
+        this.layoutYMeta.setValue(fxomInstance, newLayoutY);
+        if (newLeftAnchor != null) {
+            leftAnchorMeta.setValue(fxomInstance, newLeftAnchor);
+        }
+        if (newRightAnchor != null) {
+            rightAnchorMeta.setValue(fxomInstance, newRightAnchor);
+        }
+        if (newTopAnchor != null) {
+            topAnchorMeta.setValue(fxomInstance, newTopAnchor);
+        }
+        if (newBottomAnchor != null) {
+            bottomAnchorMeta.setValue(fxomInstance, newBottomAnchor);
+        }
+    }
+
+    @Override
+    public String getDescription() {
+        return getClass().getSimpleName(); // Not expected to reach the user
+    }
+    
+    
+    /*
+     * Private
+     */
+    
+    private void updateNewAnchors() {
+        if ((this.oldLeftAnchor == null) && (this.oldRightAnchor == null)) {
+            this.newLeftAnchor = null;
+            this.newRightAnchor = null;
+        } else {
+            final Node sceneGraphNode = (Node)fxomInstance.getSceneGraphObject();
+            final Bounds nodeLayoutBounds = sceneGraphNode.getLayoutBounds();
+            final Bounds parentLayoutBounds = sceneGraphNode.getParent().getLayoutBounds();
+            if (this.oldLeftAnchor != null) {
+                this.newLeftAnchor = AnchorPaneRelocater.computeLeftAnchor(parentLayoutBounds, nodeLayoutBounds, newLayoutX);
+            } else {
+                this.newLeftAnchor = null;
+            }
+            if (this.oldRightAnchor != null) {
+                this.newRightAnchor = AnchorPaneRelocater.computeRightAnchor(parentLayoutBounds, nodeLayoutBounds, newLayoutX);
+            } else {
+                this.newRightAnchor = null;
+            }
+        }
+        if ((this.oldTopAnchor == null) && (this.oldBottomAnchor == null)) {
+            this.newTopAnchor = null;
+            this.newBottomAnchor = null;
+        } else {
+            final Node sceneGraphNode = (Node)fxomInstance.getSceneGraphObject();
+            final Bounds nodeLayoutBounds = sceneGraphNode.getLayoutBounds();
+            final Bounds parentLayoutBounds = sceneGraphNode.getParent().getLayoutBounds();
+            if (this.oldTopAnchor != null) {
+                this.newTopAnchor = AnchorPaneRelocater.computeTopAnchor(parentLayoutBounds, nodeLayoutBounds, newLayoutY);
+            } else {
+                this.newTopAnchor = null;
+            }
+            if (this.oldBottomAnchor != null) {
+                this.newBottomAnchor = AnchorPaneRelocater.computeBottomAnchor(parentLayoutBounds, nodeLayoutBounds, newLayoutY);
+            } else {
+                this.newBottomAnchor = null;
+            }
+        }
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/job/atomic/RemoveCollectionItemJob.java	Mon Sep 01 09:42:26 2014 +0200
@@ -0,0 +1,109 @@
+/*
+ * 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.job.atomic;
+
+import com.oracle.javafx.scenebuilder.kit.editor.EditorController;
+import com.oracle.javafx.scenebuilder.kit.editor.job.Job;
+import com.oracle.javafx.scenebuilder.kit.fxom.FXOMCollection;
+import com.oracle.javafx.scenebuilder.kit.fxom.FXOMObject;
+
+/**
+ *
+ */
+public class RemoveCollectionItemJob extends Job {
+
+    private final FXOMObject targetValue;
+    
+    private FXOMCollection parentCollection;
+    private int indexInParentCollection;
+
+    public RemoveCollectionItemJob(FXOMObject value, EditorController editorController) {
+        super(editorController);
+        this.targetValue = value;
+    }
+    
+    
+    /*
+     * Job
+     */
+    
+    @Override
+    public boolean isExecutable() {
+        return targetValue.getParentCollection() != null;
+    }
+
+    @Override
+    public void execute() {
+        assert parentCollection == null;
+        assert isExecutable();
+        
+        parentCollection = targetValue.getParentCollection();
+        indexInParentCollection = targetValue.getIndexInParentCollection();
+        
+        // Now same as redo()
+        redo();
+    }
+
+    @Override
+    public void undo() {
+        assert targetValue.getParentCollection() == null;
+        
+        getEditorController().getFxomDocument().beginUpdate();
+        targetValue.addToParentCollection(indexInParentCollection, parentCollection);
+        getEditorController().getFxomDocument().endUpdate();
+
+        assert targetValue.getParentCollection() == parentCollection;
+        assert targetValue.getIndexInParentCollection() == indexInParentCollection;
+    }
+
+    @Override
+    public void redo() {
+        assert targetValue.getParentCollection() == parentCollection;
+        assert targetValue.getIndexInParentCollection() == indexInParentCollection;
+        
+        getEditorController().getFxomDocument().beginUpdate();
+        targetValue.removeFromParentCollection();
+        getEditorController().getFxomDocument().endUpdate();
+
+        assert targetValue.getParentCollection() == null;
+    }
+
+    @Override
+    public String getDescription() {
+        // Should normally not reach the user
+        return getClass().getSimpleName() 
+                + "[" //NOI18N
+                + targetValue.getGlueElement().getTagName()
+                + "]"; //NOI18N
+    }
+    
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/job/atomic/RemoveFxControllerJob.java	Mon Sep 01 09:42:26 2014 +0200
@@ -0,0 +1,87 @@
+/*
+ * 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.atomic;
+
+import com.oracle.javafx.scenebuilder.kit.editor.EditorController;
+import com.oracle.javafx.scenebuilder.kit.editor.job.Job;
+import com.oracle.javafx.scenebuilder.kit.fxom.FXOMObject;
+
+/**
+ *
+ */
+public class RemoveFxControllerJob extends Job {
+    
+    private final FXOMObject fxomObject;
+    private String oldFxController;
+
+    public RemoveFxControllerJob(FXOMObject fxomObject, EditorController editorController) {
+        super(editorController);
+        assert fxomObject != null;
+        this.fxomObject = fxomObject;
+    }
+
+    /*
+     * Job
+     */
+    
+    @Override
+    public boolean isExecutable() {
+        return fxomObject.getFxController() != null;
+    }
+
+    @Override
+    public void execute() {
+        assert oldFxController == null;
+        oldFxController = fxomObject.getFxController();
+        // Now like redo()
+        redo();
+    }
+
+    @Override
+    public void undo() {
+        assert oldFxController != null;
+        fxomObject.setFxController(oldFxController);
+    }
+
+    @Override
+    public void redo() {
+        assert oldFxController != null;
+        fxomObject.setFxController(null);
+    }
+
+    @Override
+    public String getDescription() {
+        return getClass().getSimpleName(); // Should not reach user
+    }
+    
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/job/atomic/RemoveNodeJob.java	Mon Sep 01 09:42:26 2014 +0200
@@ -0,0 +1,91 @@
+/*
+ * 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.job.atomic;
+
+import com.oracle.javafx.scenebuilder.kit.editor.EditorController;
+import com.oracle.javafx.scenebuilder.kit.editor.job.Job;
+import com.oracle.javafx.scenebuilder.kit.fxom.FXOMNode;
+import com.oracle.javafx.scenebuilder.kit.fxom.FXOMObject;
+import com.oracle.javafx.scenebuilder.kit.fxom.FXOMProperty;
+
+/**
+ *
+ */
+public class RemoveNodeJob extends Job {
+    
+    private final Job subJob;
+    
+    public RemoveNodeJob(FXOMNode targetNode, EditorController editorController) {
+        super(editorController);
+        
+        assert (targetNode instanceof FXOMObject) || (targetNode instanceof FXOMProperty);
+        
+        if (targetNode instanceof FXOMObject) {
+            subJob = new RemoveObjectJob((FXOMObject)targetNode, editorController);
+        } else {
+            assert targetNode instanceof FXOMProperty;
+            subJob = new RemovePropertyJob((FXOMProperty)targetNode, editorController);
+        }
+    }
+    
+    
+    /*
+     * Job
+     */
+
+    @Override
+    public boolean isExecutable() {
+        return subJob.isExecutable();
+    }
+
+    @Override
+    public void execute() {
+        subJob.execute();
+    }
+
+    @Override
+    public void undo() {
+        subJob.undo();
+    }
+
+    @Override
+    public void redo() {
+        subJob.redo();
+    }
+
+    @Override
+    public String getDescription() {
+        return getClass().getSimpleName(); // Should not reach end user
+    }
+    
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/job/atomic/RemoveObjectJob.java	Mon Sep 01 09:42:26 2014 +0200
@@ -0,0 +1,91 @@
+/*
+ * 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.job.atomic;
+
+import com.oracle.javafx.scenebuilder.kit.editor.job.atomic.RemoveCollectionItemJob;
+import com.oracle.javafx.scenebuilder.kit.editor.EditorController;
+import com.oracle.javafx.scenebuilder.kit.editor.job.Job;
+import com.oracle.javafx.scenebuilder.kit.fxom.FXOMObject;
+
+/**
+ *
+ */
+public class RemoveObjectJob extends Job {
+    
+    private final Job subJob;
+    
+    public RemoveObjectJob(FXOMObject targetObject, EditorController editorController) {
+        super(editorController);
+        
+        assert targetObject != null;
+        assert (targetObject.getParentProperty() != null) || (targetObject.getParentCollection() != null);
+        
+        if (targetObject.getParentProperty() != null) {
+            subJob = new RemovePropertyValueJob(targetObject, editorController);
+        } else {
+            assert targetObject.getParentCollection() != null;
+            subJob = new RemoveCollectionItemJob(targetObject, editorController);
+        }
+    }
+    
+    
+    /*
+     * Job
+     */
+
+    @Override
+    public boolean isExecutable() {
+        return subJob.isExecutable();
+    }
+
+    @Override
+    public void execute() {
+        subJob.execute();
+    }
+
+    @Override
+    public void undo() {
+        subJob.undo();
+    }
+
+    @Override
+    public void redo() {
+        subJob.redo();
+    }
+
+    @Override
+    public String getDescription() {
+        return getClass().getSimpleName(); // Should not reach end user
+    }
+    
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/job/atomic/RemovePropertyJob.java	Mon Sep 01 09:42:26 2014 +0200
@@ -0,0 +1,114 @@
+/*
+ * 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.job.atomic;
+
+import com.oracle.javafx.scenebuilder.kit.editor.EditorController;
+import com.oracle.javafx.scenebuilder.kit.editor.job.Job;
+import com.oracle.javafx.scenebuilder.kit.fxom.FXOMInstance;
+import com.oracle.javafx.scenebuilder.kit.fxom.FXOMProperty;
+
+/**
+ *
+ */
+public class RemovePropertyJob extends Job {
+
+    private final FXOMProperty targetProperty;
+    
+    private FXOMInstance parentInstance;
+    private int indexInParentInstance;
+    
+    public RemovePropertyJob(FXOMProperty targetProperty, EditorController editorController) {
+        super(editorController);
+        
+        assert targetProperty != null;
+        this.targetProperty = targetProperty;
+    }
+    
+    public FXOMProperty getTargetProperty() {
+        return targetProperty;
+    }
+
+
+    /*
+     * Job
+     */
+    
+    @Override
+    public boolean isExecutable() {
+        return targetProperty.getParentInstance() != null;
+    }
+
+    @Override
+    public void execute() {
+        assert parentInstance == null;
+        assert isExecutable();
+        
+        parentInstance = targetProperty.getParentInstance();
+        indexInParentInstance = targetProperty.getIndexInParentInstance();
+        redo();
+    }
+
+    @Override
+    public void undo() {
+        assert targetProperty.getParentInstance() == null;
+        
+        getEditorController().getFxomDocument().beginUpdate();
+        targetProperty.addToParentInstance(indexInParentInstance, parentInstance);
+        getEditorController().getFxomDocument().endUpdate();
+        
+        assert targetProperty.getParentInstance() == parentInstance;
+        assert targetProperty.getIndexInParentInstance() == indexInParentInstance;
+    }
+
+    @Override
+    public void redo() {
+        assert targetProperty.getParentInstance() == parentInstance;
+        assert targetProperty.getIndexInParentInstance() == indexInParentInstance;
+        
+        getEditorController().getSelection().clear();
+        getEditorController().getFxomDocument().beginUpdate();
+        targetProperty.removeFromParentInstance();
+        getEditorController().getFxomDocument().endUpdate();
+        
+        assert targetProperty.getParentInstance() == null;
+    }
+
+    @Override
+    public String getDescription() {
+        // Should normally not reach the user
+        return getClass().getSimpleName() 
+                + "[" 
+                + targetProperty.getName()
+                + "]";
+    }
+    
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/job/atomic/RemovePropertyValueJob.java	Mon Sep 01 09:42:26 2014 +0200
@@ -0,0 +1,128 @@
+/*
+ * 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.job.atomic;
+
+import com.oracle.javafx.scenebuilder.kit.editor.job.atomic.RemovePropertyJob;
+import com.oracle.javafx.scenebuilder.kit.editor.EditorController;
+import com.oracle.javafx.scenebuilder.kit.editor.job.Job;
+import com.oracle.javafx.scenebuilder.kit.fxom.FXOMObject;
+import com.oracle.javafx.scenebuilder.kit.fxom.FXOMPropertyC;
+
+/**
+ *
+ */
+public class RemovePropertyValueJob extends Job {
+
+    private final FXOMObject targetValue;
+    
+    private FXOMPropertyC parentProperty;
+    private int indexInParentProperty;
+    private RemovePropertyJob removePropertyJob;
+
+    public RemovePropertyValueJob(FXOMObject value, EditorController editorController) {
+        super(editorController);
+        this.targetValue = value;
+    }
+    
+    
+    /*
+     * Job
+     */
+    
+    @Override
+    public boolean isExecutable() {
+        return targetValue.getParentProperty() != null;
+    }
+
+    @Override
+    public void execute() {
+        assert parentProperty == null;
+        assert isExecutable();
+        
+        parentProperty = targetValue.getParentProperty();
+        indexInParentProperty = targetValue.getIndexInParentProperty();
+        if ((parentProperty.getValues().size() == 1) && (parentProperty.getParentInstance() != null)) {
+            // targetValue is the last value of its parent property
+            // => parent property must also be removed from its parent instance
+            removePropertyJob = new RemovePropertyJob(parentProperty, getEditorController());
+        }
+        
+        // Note : below we may have to run removePropertyJob.execute() so
+        // we cannot re-use redo() here.
+        getEditorController().getFxomDocument().beginUpdate();
+        if (removePropertyJob != null) {
+            removePropertyJob.execute();
+        }
+        targetValue.removeFromParentProperty();
+        getEditorController().getFxomDocument().endUpdate();
+    }
+
+    @Override
+    public void undo() {
+        assert targetValue.getParentProperty() == null;
+        
+        getEditorController().getFxomDocument().beginUpdate();
+        targetValue.addToParentProperty(indexInParentProperty, parentProperty);
+        if (removePropertyJob != null) {
+            removePropertyJob.undo();
+        }
+        getEditorController().getFxomDocument().endUpdate();
+
+        assert targetValue.getParentProperty() == parentProperty;
+        assert targetValue.getIndexInParentProperty() == indexInParentProperty;
+    }
+
+    @Override
+    public void redo() {
+        assert targetValue.getParentProperty() == parentProperty;
+        assert targetValue.getIndexInParentProperty() == indexInParentProperty;
+        
+        getEditorController().getFxomDocument().beginUpdate();
+        if (removePropertyJob != null) {
+            removePropertyJob.redo();
+        }
+        targetValue.removeFromParentProperty();
+        getEditorController().getFxomDocument().endUpdate();
+
+        assert targetValue.getParentProperty() == null;
+    }
+
+    @Override
+    public String getDescription() {
+        // Should normally not reach the user
+        return getClass().getSimpleName() 
+                + "[" 
+                + targetValue.getGlueElement().getTagName()
+                + "]";
+    }
+    
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/job/atomic/ToggleFxRootJob.java	Mon Sep 01 09:42:26 2014 +0200
@@ -0,0 +1,83 @@
+/*
+ * 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.atomic;
+
+import com.oracle.javafx.scenebuilder.kit.editor.EditorController;
+import com.oracle.javafx.scenebuilder.kit.editor.i18n.I18N;
+import com.oracle.javafx.scenebuilder.kit.editor.job.Job;
+import com.oracle.javafx.scenebuilder.kit.fxom.FXOMDocument;
+import com.oracle.javafx.scenebuilder.kit.fxom.FXOMInstance;
+
+/**
+ * Job used to enable/disable fx:root on the fxom document associated
+ * to the editor controller (if any).
+ */
+public class ToggleFxRootJob extends Job {
+
+    public ToggleFxRootJob(EditorController editorController) {
+        super(editorController);
+    }
+
+    /*
+     * Job
+     */
+    @Override
+    public boolean isExecutable() {
+        final FXOMDocument fxomDocument = getEditorController().getFxomDocument();
+        return (fxomDocument != null) && (fxomDocument.getFxomRoot() instanceof FXOMInstance);
+    }
+
+    @Override
+    public void execute() {
+        redo();
+    }
+
+    @Override
+    public void undo() {
+        redo();
+    }
+
+    @Override
+    public void redo() {
+        assert getEditorController().getFxomDocument() != null;
+        assert getEditorController().getFxomDocument().getFxomRoot() instanceof FXOMInstance;
+
+        final FXOMDocument fxomDocument = getEditorController().getFxomDocument();
+        final FXOMInstance rootInstance = (FXOMInstance) fxomDocument.getFxomRoot();
+        rootInstance.toggleFxRoot();
+    }
+
+    @Override
+    public String getDescription() {
+        return I18N.getString("job.toggle.fx.root");
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/job/atomic/UpdateSelectionJob.java	Mon Sep 01 09:42:26 2014 +0200
@@ -0,0 +1,126 @@
+/*
+ * 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.job.atomic;
+
+import com.oracle.javafx.scenebuilder.kit.editor.EditorController;
+import com.oracle.javafx.scenebuilder.kit.editor.job.Job;
+import com.oracle.javafx.scenebuilder.kit.editor.selection.AbstractSelectionGroup;
+import com.oracle.javafx.scenebuilder.kit.editor.selection.ObjectSelectionGroup;
+import com.oracle.javafx.scenebuilder.kit.editor.selection.Selection;
+import com.oracle.javafx.scenebuilder.kit.fxom.FXOMObject;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+
+/**
+ *
+ */
+public class UpdateSelectionJob extends Job {
+
+    private AbstractSelectionGroup oldSelectionGroup;
+    private final AbstractSelectionGroup newSelectionGroup;
+
+    public UpdateSelectionJob(AbstractSelectionGroup group, EditorController editorController) {
+        super(editorController);
+        newSelectionGroup = group;
+    }
+
+    public UpdateSelectionJob(FXOMObject newSelectedObject, EditorController editorController) {
+        super(editorController);
+
+        assert newSelectedObject != null;
+        final List<FXOMObject> newSelectedObjects = new ArrayList<>();
+        newSelectedObjects.add(newSelectedObject);
+        newSelectionGroup = new ObjectSelectionGroup(newSelectedObjects, newSelectedObject, null);
+    }
+
+    public UpdateSelectionJob(Collection<FXOMObject> newSelectedObjects, EditorController editorController) {
+        super(editorController);
+
+        assert newSelectedObjects != null; // But possibly empty
+        if (newSelectedObjects.isEmpty()) {
+            newSelectionGroup = null;
+        } else {
+            newSelectionGroup = new ObjectSelectionGroup(newSelectedObjects, newSelectedObjects.iterator().next(), null);
+        }
+    }
+
+    /*
+     * Job
+     */
+
+    @Override
+    public boolean isExecutable() {
+        return true;
+    }
+
+    @Override
+    public void execute() {
+        final Selection selection = getEditorController().getSelection();
+        
+        // Saves the current selection
+        try {
+            if (selection.getGroup() == null) {
+                this.oldSelectionGroup = null;
+            } else {
+                this.oldSelectionGroup = selection.getGroup().clone();
+            }
+        } catch(CloneNotSupportedException x) {
+            throw new RuntimeException("Bug", x);
+        }
+        
+        // Now same as redo()
+        redo();
+    }
+
+    @Override
+    public void undo() {
+        final Selection selection = getEditorController().getSelection();
+        selection.select(oldSelectionGroup);
+        assert selection.isValid(getEditorController().getFxomDocument());
+    }
+
+    @Override
+    public void redo() {
+        final Selection selection = getEditorController().getSelection();
+        selection.select(newSelectionGroup);
+        assert selection.isValid(getEditorController().getFxomDocument());
+    }
+
+    @Override
+    public String getDescription() {
+        // Not expected to reach the user
+        return getClass().getSimpleName();
+    }
+    
+}
--- a/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/job/gridpane/AddColumnConstraintsJob.java	Mon Sep 01 09:19:43 2014 +0200
+++ b/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/job/gridpane/AddColumnConstraintsJob.java	Mon Sep 01 09:42:26 2014 +0200
@@ -36,8 +36,8 @@
 import com.oracle.javafx.scenebuilder.kit.editor.job.Job;
 import com.oracle.javafx.scenebuilder.kit.editor.job.JobUtils;
 import com.oracle.javafx.scenebuilder.kit.editor.job.gridpane.GridPaneJobUtils.Position;
-import com.oracle.javafx.scenebuilder.kit.editor.job.v2.AddPropertyJob;
-import com.oracle.javafx.scenebuilder.kit.editor.job.v2.AddPropertyValueJob;
+import com.oracle.javafx.scenebuilder.kit.editor.job.atomic.AddPropertyJob;
+import com.oracle.javafx.scenebuilder.kit.editor.job.atomic.AddPropertyValueJob;
 import com.oracle.javafx.scenebuilder.kit.fxom.FXOMDocument;
 import com.oracle.javafx.scenebuilder.kit.fxom.FXOMInstance;
 import com.oracle.javafx.scenebuilder.kit.fxom.FXOMObject;
--- a/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/job/gridpane/AddRowConstraintsJob.java	Mon Sep 01 09:19:43 2014 +0200
+++ b/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/job/gridpane/AddRowConstraintsJob.java	Mon Sep 01 09:42:26 2014 +0200
@@ -36,8 +36,8 @@
 import com.oracle.javafx.scenebuilder.kit.editor.job.Job;
 import com.oracle.javafx.scenebuilder.kit.editor.job.JobUtils;
 import com.oracle.javafx.scenebuilder.kit.editor.job.gridpane.GridPaneJobUtils.Position;
-import com.oracle.javafx.scenebuilder.kit.editor.job.v2.AddPropertyJob;
-import com.oracle.javafx.scenebuilder.kit.editor.job.v2.AddPropertyValueJob;
+import com.oracle.javafx.scenebuilder.kit.editor.job.atomic.AddPropertyJob;
+import com.oracle.javafx.scenebuilder.kit.editor.job.atomic.AddPropertyValueJob;
 import com.oracle.javafx.scenebuilder.kit.fxom.FXOMDocument;
 import com.oracle.javafx.scenebuilder.kit.fxom.FXOMInstance;
 import com.oracle.javafx.scenebuilder.kit.fxom.FXOMObject;
--- a/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/job/gridpane/MoveColumnJob.java	Mon Sep 01 09:19:43 2014 +0200
+++ b/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/job/gridpane/MoveColumnJob.java	Mon Sep 01 09:42:26 2014 +0200
@@ -36,7 +36,7 @@
 import com.oracle.javafx.scenebuilder.kit.editor.job.DeleteObjectJob;
 import com.oracle.javafx.scenebuilder.kit.editor.job.Job;
 import com.oracle.javafx.scenebuilder.kit.editor.job.gridpane.GridPaneJobUtils.Position;
-import com.oracle.javafx.scenebuilder.kit.editor.job.v2.AddPropertyValueJob;
+import com.oracle.javafx.scenebuilder.kit.editor.job.atomic.AddPropertyValueJob;
 import com.oracle.javafx.scenebuilder.kit.editor.selection.AbstractSelectionGroup;
 import com.oracle.javafx.scenebuilder.kit.editor.selection.GridSelectionGroup;
 import com.oracle.javafx.scenebuilder.kit.editor.selection.Selection;
--- a/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/job/gridpane/MoveRowJob.java	Mon Sep 01 09:19:43 2014 +0200
+++ b/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/job/gridpane/MoveRowJob.java	Mon Sep 01 09:42:26 2014 +0200
@@ -36,7 +36,7 @@
 import com.oracle.javafx.scenebuilder.kit.editor.job.DeleteObjectJob;
 import com.oracle.javafx.scenebuilder.kit.editor.job.Job;
 import com.oracle.javafx.scenebuilder.kit.editor.job.gridpane.GridPaneJobUtils.Position;
-import com.oracle.javafx.scenebuilder.kit.editor.job.v2.AddPropertyValueJob;
+import com.oracle.javafx.scenebuilder.kit.editor.job.atomic.AddPropertyValueJob;
 import com.oracle.javafx.scenebuilder.kit.editor.selection.AbstractSelectionGroup;
 import com.oracle.javafx.scenebuilder.kit.editor.selection.GridSelectionGroup;
 import com.oracle.javafx.scenebuilder.kit.editor.selection.Selection;
--- a/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/job/gridpane/ReIndexColumnContentJob.java	Mon Sep 01 09:19:43 2014 +0200
+++ b/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/job/gridpane/ReIndexColumnContentJob.java	Mon Sep 01 09:42:26 2014 +0200
@@ -34,7 +34,7 @@
 import com.oracle.javafx.scenebuilder.kit.editor.EditorController;
 import com.oracle.javafx.scenebuilder.kit.editor.job.BatchJob;
 import com.oracle.javafx.scenebuilder.kit.editor.job.Job;
-import com.oracle.javafx.scenebuilder.kit.editor.job.ModifyObjectJob;
+import com.oracle.javafx.scenebuilder.kit.editor.job.atomic.ModifyObjectJob;
 import com.oracle.javafx.scenebuilder.kit.fxom.FXOMDocument;
 import com.oracle.javafx.scenebuilder.kit.fxom.FXOMInstance;
 import com.oracle.javafx.scenebuilder.kit.fxom.FXOMObject;
--- a/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/job/gridpane/ReIndexRowContentJob.java	Mon Sep 01 09:19:43 2014 +0200
+++ b/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/job/gridpane/ReIndexRowContentJob.java	Mon Sep 01 09:42:26 2014 +0200
@@ -34,7 +34,7 @@
 import com.oracle.javafx.scenebuilder.kit.editor.EditorController;
 import com.oracle.javafx.scenebuilder.kit.editor.job.BatchJob;
 import com.oracle.javafx.scenebuilder.kit.editor.job.Job;
-import com.oracle.javafx.scenebuilder.kit.editor.job.ModifyObjectJob;
+import com.oracle.javafx.scenebuilder.kit.editor.job.atomic.ModifyObjectJob;
 import com.oracle.javafx.scenebuilder.kit.fxom.FXOMDocument;
 import com.oracle.javafx.scenebuilder.kit.fxom.FXOMInstance;
 import com.oracle.javafx.scenebuilder.kit.fxom.FXOMObject;
--- a/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/job/gridpane/v2/SpanJob.java	Mon Sep 01 09:19:43 2014 +0200
+++ b/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/job/gridpane/v2/SpanJob.java	Mon Sep 01 09:42:26 2014 +0200
@@ -36,7 +36,7 @@
 import com.oracle.javafx.scenebuilder.kit.editor.i18n.I18N;
 import com.oracle.javafx.scenebuilder.kit.editor.job.BatchDocumentJob;
 import com.oracle.javafx.scenebuilder.kit.editor.job.Job;
-import com.oracle.javafx.scenebuilder.kit.editor.job.ModifyObjectJob;
+import com.oracle.javafx.scenebuilder.kit.editor.job.atomic.ModifyObjectJob;
 import com.oracle.javafx.scenebuilder.kit.editor.selection.AbstractSelectionGroup;
 import com.oracle.javafx.scenebuilder.kit.editor.selection.ObjectSelectionGroup;
 import com.oracle.javafx.scenebuilder.kit.fxom.FXOMInstance;
--- a/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/job/togglegroup/AdjustToggleGroupJob.java	Mon Sep 01 09:19:43 2014 +0200
+++ b/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/job/togglegroup/AdjustToggleGroupJob.java	Mon Sep 01 09:42:26 2014 +0200
@@ -35,8 +35,8 @@
 import com.oracle.javafx.scenebuilder.kit.editor.EditorController;
 import com.oracle.javafx.scenebuilder.kit.editor.job.BatchJob;
 import com.oracle.javafx.scenebuilder.kit.editor.job.Job;
-import com.oracle.javafx.scenebuilder.kit.editor.job.v2.AddPropertyJob;
-import com.oracle.javafx.scenebuilder.kit.editor.job.v2.RemovePropertyJob;
+import com.oracle.javafx.scenebuilder.kit.editor.job.atomic.AddPropertyJob;
+import com.oracle.javafx.scenebuilder.kit.editor.job.atomic.RemovePropertyJob;
 import com.oracle.javafx.scenebuilder.kit.fxom.FXOMDocument;
 import com.oracle.javafx.scenebuilder.kit.fxom.FXOMInstance;
 import com.oracle.javafx.scenebuilder.kit.fxom.FXOMNodes;
--- a/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/job/togglegroup/ModifySelectionToggleGroupJob.java	Mon Sep 01 09:19:43 2014 +0200
+++ b/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/job/togglegroup/ModifySelectionToggleGroupJob.java	Mon Sep 01 09:42:26 2014 +0200
@@ -35,9 +35,9 @@
 import com.oracle.javafx.scenebuilder.kit.editor.EditorController;
 import com.oracle.javafx.scenebuilder.kit.editor.i18n.I18N;
 import com.oracle.javafx.scenebuilder.kit.editor.job.Job;
-import com.oracle.javafx.scenebuilder.kit.editor.job.v2.ClearSelectionJob;
+import com.oracle.javafx.scenebuilder.kit.editor.job.atomic.ClearSelectionJob;
 import com.oracle.javafx.scenebuilder.kit.editor.job.v2.CompositeJob;
-import com.oracle.javafx.scenebuilder.kit.editor.job.v2.UpdateSelectionJob;
+import com.oracle.javafx.scenebuilder.kit.editor.job.atomic.UpdateSelectionJob;
 import com.oracle.javafx.scenebuilder.kit.editor.selection.ObjectSelectionGroup;
 import com.oracle.javafx.scenebuilder.kit.editor.selection.Selection;
 import com.oracle.javafx.scenebuilder.kit.fxom.FXOMDocument;
--- a/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/job/togglegroup/ModifyToggleGroupJob.java	Mon Sep 01 09:19:43 2014 +0200
+++ b/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/job/togglegroup/ModifyToggleGroupJob.java	Mon Sep 01 09:42:26 2014 +0200
@@ -34,9 +34,9 @@
 
 import com.oracle.javafx.scenebuilder.kit.editor.EditorController;
 import com.oracle.javafx.scenebuilder.kit.editor.job.Job;
-import com.oracle.javafx.scenebuilder.kit.editor.job.v2.AddPropertyJob;
+import com.oracle.javafx.scenebuilder.kit.editor.job.atomic.AddPropertyJob;
 import com.oracle.javafx.scenebuilder.kit.editor.job.v2.CompositeJob;
-import com.oracle.javafx.scenebuilder.kit.editor.job.v2.RemovePropertyJob;
+import com.oracle.javafx.scenebuilder.kit.editor.job.atomic.RemovePropertyJob;
 import com.oracle.javafx.scenebuilder.kit.fxom.FXOMDocument;
 import com.oracle.javafx.scenebuilder.kit.fxom.FXOMInstance;
 import com.oracle.javafx.scenebuilder.kit.fxom.FXOMObject;
--- a/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/job/v2/AddPropertyJob.java	Mon Sep 01 09:19:43 2014 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,106 +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.editor.job.v2;
-
-import com.oracle.javafx.scenebuilder.kit.editor.EditorController;
-import com.oracle.javafx.scenebuilder.kit.editor.job.Job;
-import com.oracle.javafx.scenebuilder.kit.fxom.FXOMInstance;
-import com.oracle.javafx.scenebuilder.kit.fxom.FXOMProperty;
-
-/**
- *
- */
-public class AddPropertyJob extends Job {
-
-    private final FXOMProperty property;
-    private final FXOMInstance targetInstance;
-    private final int targetIndex;
-    
-    public AddPropertyJob(FXOMProperty property, 
-            FXOMInstance targetInstance,
-            int targetIndex,
-            EditorController editorController) {
-        super(editorController);
-        
-        assert property != null;
-        assert targetInstance != null;
-        assert targetIndex >= -1;
-        
-        this.property = property;
-        this.targetInstance = targetInstance;
-        this.targetIndex = targetIndex;
-    }
-
-    /*
-     * Job
-     */
-    
-    @Override
-    public boolean isExecutable() {
-        return property.getParentInstance() == null;
-    }
-
-    @Override
-    public void execute() {
-        redo();
-    }
-
-    @Override
-    public void undo() {
-        assert property.getParentInstance() == targetInstance;
-        
-        getEditorController().getSelection().clear();
-        getEditorController().getFxomDocument().beginUpdate();
-        property.removeFromParentInstance();
-        getEditorController().getFxomDocument().endUpdate();
-        
-        assert property.getParentInstance() == null;
-    }
-
-    @Override
-    public void redo() {
-        assert property.getParentInstance() == null;
-        
-        getEditorController().getFxomDocument().beginUpdate();
-        property.addToParentInstance(targetIndex, targetInstance);
-        getEditorController().getFxomDocument().endUpdate();
-        
-        assert property.getParentInstance() == targetInstance;
-    }
-
-    @Override
-    public String getDescription() {
-        // Should normally not reach the user
-        return getClass().getSimpleName();
-    }
-    
-}
--- a/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/job/v2/AddPropertyValueJob.java	Mon Sep 01 09:19:43 2014 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,110 +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.editor.job.v2;
-
-import com.oracle.javafx.scenebuilder.kit.editor.EditorController;
-import com.oracle.javafx.scenebuilder.kit.editor.job.Job;
-import com.oracle.javafx.scenebuilder.kit.fxom.FXOMObject;
-import com.oracle.javafx.scenebuilder.kit.fxom.FXOMPropertyC;
-
-/**
- *
- */
-public class AddPropertyValueJob extends Job {
-
-    private final FXOMObject value;
-    private final FXOMPropertyC targetProperty;
-    private final int targetIndex;
-    
-    public AddPropertyValueJob(FXOMObject value, FXOMPropertyC targetProperty, 
-            int targetIndex, EditorController editorController) {
-        super(editorController);
-        
-        assert value != null;
-        assert targetProperty != null;
-        assert targetIndex >= -1;
-        
-        this.value = value;
-        this.targetProperty = targetProperty;
-        this.targetIndex = targetIndex;
-    }
-
-    /*
-     * AddPropertyValueJob
-     */
-    
-    @Override
-    public boolean isExecutable() {
-        return (value.getParentProperty() == null)
-                && (value.getParentCollection() == null);
-    }
-
-    @Override
-    public void execute() {
-        assert targetIndex <= targetProperty.getValues().size();
-        redo();
-    }
-
-    @Override
-    public void undo() {
-        assert value.getParentProperty() == targetProperty;
-        assert value.getParentCollection() == null;
-        
-        getEditorController().getSelection().clear();
-        getEditorController().getFxomDocument().beginUpdate();
-        value.removeFromParentProperty();
-        getEditorController().getFxomDocument().endUpdate();
-        
-        assert value.getParentProperty() == null;
-        assert value.getParentCollection() == null;
-    }
-
-    @Override
-    public void redo() {
-        assert value.getParentProperty() == null;
-        assert value.getParentCollection() == null;
-        
-        getEditorController().getFxomDocument().beginUpdate();
-        value.addToParentProperty(targetIndex, targetProperty);
-        getEditorController().getFxomDocument().endUpdate();
-        
-        assert value.getParentProperty() == targetProperty;
-        assert value.getParentCollection() == null;
-    }
-
-    @Override
-    public String getDescription() {
-        // Should normally not reach the user
-        return getClass().getSimpleName();
-    }
-    
-}
--- a/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/job/v2/BackupSelectionJob.java	Mon Sep 01 09:19:43 2014 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,96 +0,0 @@
-/*
- * 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.v2;
-
-import com.oracle.javafx.scenebuilder.kit.editor.EditorController;
-import com.oracle.javafx.scenebuilder.kit.editor.job.Job;
-import com.oracle.javafx.scenebuilder.kit.editor.selection.AbstractSelectionGroup;
-import com.oracle.javafx.scenebuilder.kit.editor.selection.Selection;
-
-/**
- *
- */
-public class BackupSelectionJob extends Job {
-
-    private final AbstractSelectionGroup oldSelectionGroup;
-
-    public BackupSelectionJob(EditorController editorController) {
-        super(editorController);
-        
-        // Saves the current selection
-        final Selection selection = getEditorController().getSelection();
-        try {
-            if (selection.getGroup() == null) {
-                this.oldSelectionGroup = null;
-            } else {
-                this.oldSelectionGroup = selection.getGroup().clone();
-            }
-        } catch(CloneNotSupportedException x) {
-            throw new RuntimeException("Bug", x); //NOI18N
-        }
-    }
-
-    /*
-     * Job
-     */
-
-    @Override
-    public boolean isExecutable() {
-        return true;
-    }
-
-    @Override
-    public void execute() {
-        // Now same as redo()
-        redo();
-    }
-
-    @Override
-    public void undo() {
-        final Selection selection = getEditorController().getSelection();
-        selection.select(oldSelectionGroup);
-        assert selection.isValid(getEditorController().getFxomDocument());
-    }
-
-    @Override
-    public void redo() {
-        // Nothing to do :)
-    }
-
-    @Override
-    public String getDescription() {
-        // Not expected to reach the user
-        return getClass().getSimpleName();
-    }
-    
-}
--- a/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/job/v2/ClearSelectionJob.java	Mon Sep 01 09:19:43 2014 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,46 +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.editor.job.v2;
-
-import com.oracle.javafx.scenebuilder.kit.editor.EditorController;
-import java.util.Collections;
-
-/**
- *
- */
-public class ClearSelectionJob extends UpdateSelectionJob {
-    
-    public ClearSelectionJob(EditorController editorController) {
-        super(Collections.emptyList(), editorController);
-    }
-}
--- a/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/job/v2/RemoveCollectionItemJob.java	Mon Sep 01 09:19:43 2014 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,109 +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.editor.job.v2;
-
-import com.oracle.javafx.scenebuilder.kit.editor.EditorController;
-import com.oracle.javafx.scenebuilder.kit.editor.job.Job;
-import com.oracle.javafx.scenebuilder.kit.fxom.FXOMCollection;
-import com.oracle.javafx.scenebuilder.kit.fxom.FXOMObject;
-
-/**
- *
- */
-public class RemoveCollectionItemJob extends Job {
-
-    private final FXOMObject targetValue;
-    
-    private FXOMCollection parentCollection;
-    private int indexInParentCollection;
-
-    public RemoveCollectionItemJob(FXOMObject value, EditorController editorController) {
-        super(editorController);
-        this.targetValue = value;
-    }
-    
-    
-    /*
-     * Job
-     */
-    
-    @Override
-    public boolean isExecutable() {
-        return targetValue.getParentCollection() != null;
-    }
-
-    @Override
-    public void execute() {
-        assert parentCollection == null;
-        assert isExecutable();
-        
-        parentCollection = targetValue.getParentCollection();
-        indexInParentCollection = targetValue.getIndexInParentCollection();
-        
-        // Now same as redo()
-        redo();
-    }
-
-    @Override
-    public void undo() {
-        assert targetValue.getParentCollection() == null;
-        
-        getEditorController().getFxomDocument().beginUpdate();
-        targetValue.addToParentCollection(indexInParentCollection, parentCollection);
-        getEditorController().getFxomDocument().endUpdate();
-
-        assert targetValue.getParentCollection() == parentCollection;
-        assert targetValue.getIndexInParentCollection() == indexInParentCollection;
-    }
-
-    @Override
-    public void redo() {
-        assert targetValue.getParentCollection() == parentCollection;
-        assert targetValue.getIndexInParentCollection() == indexInParentCollection;
-        
-        getEditorController().getFxomDocument().beginUpdate();
-        targetValue.removeFromParentCollection();
-        getEditorController().getFxomDocument().endUpdate();
-
-        assert targetValue.getParentCollection() == null;
-    }
-
-    @Override
-    public String getDescription() {
-        // Should normally not reach the user
-        return getClass().getSimpleName() 
-                + "[" //NOI18N
-                + targetValue.getGlueElement().getTagName()
-                + "]"; //NOI18N
-    }
-    
-}
--- a/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/job/v2/RemoveFxControllerJob.java	Mon Sep 01 09:19:43 2014 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,87 +0,0 @@
-/*
- * 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.v2;
-
-import com.oracle.javafx.scenebuilder.kit.editor.EditorController;
-import com.oracle.javafx.scenebuilder.kit.editor.job.Job;
-import com.oracle.javafx.scenebuilder.kit.fxom.FXOMObject;
-
-/**
- *
- */
-public class RemoveFxControllerJob extends Job {
-    
-    private final FXOMObject fxomObject;
-    private String oldFxController;
-
-    public RemoveFxControllerJob(FXOMObject fxomObject, EditorController editorController) {
-        super(editorController);
-        assert fxomObject != null;
-        this.fxomObject = fxomObject;
-    }
-
-    /*
-     * Job
-     */
-    
-    @Override
-    public boolean isExecutable() {
-        return fxomObject.getFxController() != null;
-    }
-
-    @Override
-    public void execute() {
-        assert oldFxController == null;
-        oldFxController = fxomObject.getFxController();
-        // Now like redo()
-        redo();
-    }
-
-    @Override
-    public void undo() {
-        assert oldFxController != null;
-        fxomObject.setFxController(oldFxController);
-    }
-
-    @Override
-    public void redo() {
-        assert oldFxController != null;
-        fxomObject.setFxController(null);
-    }
-
-    @Override
-    public String getDescription() {
-        return getClass().getSimpleName(); // Should not reach user
-    }
-    
-}
--- a/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/job/v2/RemoveNodeJob.java	Mon Sep 01 09:19:43 2014 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,91 +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.editor.job.v2;
-
-import com.oracle.javafx.scenebuilder.kit.editor.EditorController;
-import com.oracle.javafx.scenebuilder.kit.editor.job.Job;
-import com.oracle.javafx.scenebuilder.kit.fxom.FXOMNode;
-import com.oracle.javafx.scenebuilder.kit.fxom.FXOMObject;
-import com.oracle.javafx.scenebuilder.kit.fxom.FXOMProperty;
-
-/**
- *
- */
-public class RemoveNodeJob extends Job {
-    
-    private final Job subJob;
-    
-    public RemoveNodeJob(FXOMNode targetNode, EditorController editorController) {
-        super(editorController);
-        
-        assert (targetNode instanceof FXOMObject) || (targetNode instanceof FXOMProperty);
-        
-        if (targetNode instanceof FXOMObject) {
-            subJob = new RemoveObjectJob((FXOMObject)targetNode, editorController);
-        } else {
-            assert targetNode instanceof FXOMProperty;
-            subJob = new RemovePropertyJob((FXOMProperty)targetNode, editorController);
-        }
-    }
-    
-    
-    /*
-     * Job
-     */
-
-    @Override
-    public boolean isExecutable() {
-        return subJob.isExecutable();
-    }
-
-    @Override
-    public void execute() {
-        subJob.execute();
-    }
-
-    @Override
-    public void undo() {
-        subJob.undo();
-    }
-
-    @Override
-    public void redo() {
-        subJob.redo();
-    }
-
-    @Override
-    public String getDescription() {
-        return getClass().getSimpleName(); // Should not reach end user
-    }
-    
-}
--- a/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/job/v2/RemoveObjectJob.java	Mon Sep 01 09:19:43 2014 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,90 +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.editor.job.v2;
-
-import com.oracle.javafx.scenebuilder.kit.editor.EditorController;
-import com.oracle.javafx.scenebuilder.kit.editor.job.Job;
-import com.oracle.javafx.scenebuilder.kit.fxom.FXOMObject;
-
-/**
- *
- */
-public class RemoveObjectJob extends Job {
-    
-    private final Job subJob;
-    
-    public RemoveObjectJob(FXOMObject targetObject, EditorController editorController) {
-        super(editorController);
-        
-        assert targetObject != null;
-        assert (targetObject.getParentProperty() != null) || (targetObject.getParentCollection() != null);
-        
-        if (targetObject.getParentProperty() != null) {
-            subJob = new RemovePropertyValueJob(targetObject, editorController);
-        } else {
-            assert targetObject.getParentCollection() != null;
-            subJob = new RemoveCollectionItemJob(targetObject, editorController);
-        }
-    }
-    
-    
-    /*
-     * Job
-     */
-
-    @Override
-    public boolean isExecutable() {
-        return subJob.isExecutable();
-    }
-
-    @Override
-    public void execute() {
-        subJob.execute();
-    }
-
-    @Override
-    public void undo() {
-        subJob.undo();
-    }
-
-    @Override
-    public void redo() {
-        subJob.redo();
-    }
-
-    @Override
-    public String getDescription() {
-        return getClass().getSimpleName(); // Should not reach end user
-    }
-    
-}
--- a/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/job/v2/RemovePropertyJob.java	Mon Sep 01 09:19:43 2014 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,114 +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.editor.job.v2;
-
-import com.oracle.javafx.scenebuilder.kit.editor.EditorController;
-import com.oracle.javafx.scenebuilder.kit.editor.job.Job;
-import com.oracle.javafx.scenebuilder.kit.fxom.FXOMInstance;
-import com.oracle.javafx.scenebuilder.kit.fxom.FXOMProperty;
-
-/**
- *
- */
-public class RemovePropertyJob extends Job {
-
-    private final FXOMProperty targetProperty;
-    
-    private FXOMInstance parentInstance;
-    private int indexInParentInstance;
-    
-    public RemovePropertyJob(FXOMProperty targetProperty, EditorController editorController) {
-        super(editorController);
-        
-        assert targetProperty != null;
-        this.targetProperty = targetProperty;
-    }
-    
-    public FXOMProperty getTargetProperty() {
-        return targetProperty;
-    }
-
-
-    /*
-     * Job
-     */
-    
-    @Override
-    public boolean isExecutable() {
-        return targetProperty.getParentInstance() != null;
-    }
-
-    @Override
-    public void execute() {
-        assert parentInstance == null;
-        assert isExecutable();
-        
-        parentInstance = targetProperty.getParentInstance();
-        indexInParentInstance = targetProperty.getIndexInParentInstance();
-        redo();
-    }
-
-    @Override
-    public void undo() {
-        assert targetProperty.getParentInstance() == null;
-        
-        getEditorController().getFxomDocument().beginUpdate();
-        targetProperty.addToParentInstance(indexInParentInstance, parentInstance);
-        getEditorController().getFxomDocument().endUpdate();
-        
-        assert targetProperty.getParentInstance() == parentInstance;
-        assert targetProperty.getIndexInParentInstance() == indexInParentInstance;
-    }
-
-    @Override
-    public void redo() {
-        assert targetProperty.getParentInstance() == parentInstance;
-        assert targetProperty.getIndexInParentInstance() == indexInParentInstance;
-        
-        getEditorController().getSelection().clear();
-        getEditorController().getFxomDocument().beginUpdate();
-        targetProperty.removeFromParentInstance();
-        getEditorController().getFxomDocument().endUpdate();
-        
-        assert targetProperty.getParentInstance() == null;
-    }
-
-    @Override
-    public String getDescription() {
-        // Should normally not reach the user
-        return getClass().getSimpleName() 
-                + "[" 
-                + targetProperty.getName()
-                + "]";
-    }
-    
-}
--- a/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/job/v2/RemovePropertyValueJob.java	Mon Sep 01 09:19:43 2014 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,127 +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.editor.job.v2;
-
-import com.oracle.javafx.scenebuilder.kit.editor.EditorController;
-import com.oracle.javafx.scenebuilder.kit.editor.job.Job;
-import com.oracle.javafx.scenebuilder.kit.fxom.FXOMObject;
-import com.oracle.javafx.scenebuilder.kit.fxom.FXOMPropertyC;
-
-/**
- *
- */
-public class RemovePropertyValueJob extends Job {
-
-    private final FXOMObject targetValue;
-    
-    private FXOMPropertyC parentProperty;
-    private int indexInParentProperty;
-    private RemovePropertyJob removePropertyJob;
-
-    public RemovePropertyValueJob(FXOMObject value, EditorController editorController) {
-        super(editorController);
-        this.targetValue = value;
-    }
-    
-    
-    /*
-     * Job
-     */
-    
-    @Override
-    public boolean isExecutable() {
-        return targetValue.getParentProperty() != null;
-    }
-
-    @Override
-    public void execute() {
-        assert parentProperty == null;
-        assert isExecutable();
-        
-        parentProperty = targetValue.getParentProperty();
-        indexInParentProperty = targetValue.getIndexInParentProperty();
-        if ((parentProperty.getValues().size() == 1) && (parentProperty.getParentInstance() != null)) {
-            // targetValue is the last value of its parent property
-            // => parent property must also be removed from its parent instance
-            removePropertyJob = new RemovePropertyJob(parentProperty, getEditorController());
-        }
-        
-        // Note : below we may have to run removePropertyJob.execute() so
-        // we cannot re-use redo() here.
-        getEditorController().getFxomDocument().beginUpdate();
-        if (removePropertyJob != null) {
-            removePropertyJob.execute();
-        }
-        targetValue.removeFromParentProperty();
-        getEditorController().getFxomDocument().endUpdate();
-    }
-
-    @Override
-    public void undo() {
-        assert targetValue.getParentProperty() == null;
-        
-        getEditorController().getFxomDocument().beginUpdate();
-        targetValue.addToParentProperty(indexInParentProperty, parentProperty);
-        if (removePropertyJob != null) {
-            removePropertyJob.undo();
-        }
-        getEditorController().getFxomDocument().endUpdate();
-
-        assert targetValue.getParentProperty() == parentProperty;
-        assert targetValue.getIndexInParentProperty() == indexInParentProperty;
-    }
-
-    @Override
-    public void redo() {
-        assert targetValue.getParentProperty() == parentProperty;
-        assert targetValue.getIndexInParentProperty() == indexInParentProperty;
-        
-        getEditorController().getFxomDocument().beginUpdate();
-        if (removePropertyJob != null) {
-            removePropertyJob.redo();
-        }
-        targetValue.removeFromParentProperty();
-        getEditorController().getFxomDocument().endUpdate();
-
-        assert targetValue.getParentProperty() == null;
-    }
-
-    @Override
-    public String getDescription() {
-        // Should normally not reach the user
-        return getClass().getSimpleName() 
-                + "[" 
-                + targetValue.getGlueElement().getTagName()
-                + "]";
-    }
-    
-}
--- a/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/job/v2/UpdateSelectionJob.java	Mon Sep 01 09:19:43 2014 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,126 +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.editor.job.v2;
-
-import com.oracle.javafx.scenebuilder.kit.editor.EditorController;
-import com.oracle.javafx.scenebuilder.kit.editor.job.Job;
-import com.oracle.javafx.scenebuilder.kit.editor.selection.AbstractSelectionGroup;
-import com.oracle.javafx.scenebuilder.kit.editor.selection.ObjectSelectionGroup;
-import com.oracle.javafx.scenebuilder.kit.editor.selection.Selection;
-import com.oracle.javafx.scenebuilder.kit.fxom.FXOMObject;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.List;
-
-/**
- *
- */
-public class UpdateSelectionJob extends Job {
-
-    private AbstractSelectionGroup oldSelectionGroup;
-    private final AbstractSelectionGroup newSelectionGroup;
-
-    public UpdateSelectionJob(AbstractSelectionGroup group, EditorController editorController) {
-        super(editorController);
-        newSelectionGroup = group;
-    }
-
-    public UpdateSelectionJob(FXOMObject newSelectedObject, EditorController editorController) {
-        super(editorController);
-
-        assert newSelectedObject != null;
-        final List<FXOMObject> newSelectedObjects = new ArrayList<>();
-        newSelectedObjects.add(newSelectedObject);
-        newSelectionGroup = new ObjectSelectionGroup(newSelectedObjects, newSelectedObject, null);
-    }
-
-    public UpdateSelectionJob(Collection<FXOMObject> newSelectedObjects, EditorController editorController) {
-        super(editorController);
-
-        assert newSelectedObjects != null; // But possibly empty
-        if (newSelectedObjects.isEmpty()) {
-            newSelectionGroup = null;
-        } else {
-            newSelectionGroup = new ObjectSelectionGroup(newSelectedObjects, newSelectedObjects.iterator().next(), null);
-        }
-    }
-
-    /*
-     * Job
-     */
-
-    @Override
-    public boolean isExecutable() {
-        return true;
-    }
-
-    @Override
-    public void execute() {
-        final Selection selection = getEditorController().getSelection();
-        
-        // Saves the current selection
-        try {
-            if (selection.getGroup() == null) {
-                this.oldSelectionGroup = null;
-            } else {
-                this.oldSelectionGroup = selection.getGroup().clone();
-            }
-        } catch(CloneNotSupportedException x) {
-            throw new RuntimeException("Bug", x);
-        }
-        
-        // Now same as redo()
-        redo();
-    }
-
-    @Override
-    public void undo() {
-        final Selection selection = getEditorController().getSelection();
-        selection.select(oldSelectionGroup);
-        assert selection.isValid(getEditorController().getFxomDocument());
-    }
-
-    @Override
-    public void redo() {
-        final Selection selection = getEditorController().getSelection();
-        selection.select(newSelectionGroup);
-        assert selection.isValid(getEditorController().getFxomDocument());
-    }
-
-    @Override
-    public String getDescription() {
-        // Not expected to reach the user
-        return getClass().getSimpleName();
-    }
-    
-}
--- a/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/job/wrap/AbstractWrapInContentJob.java	Mon Sep 01 09:19:43 2014 +0200
+++ b/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/job/wrap/AbstractWrapInContentJob.java	Mon Sep 01 09:42:26 2014 +0200
@@ -33,8 +33,8 @@
 
 import com.oracle.javafx.scenebuilder.kit.editor.EditorController;
 import com.oracle.javafx.scenebuilder.kit.editor.job.Job;
-import com.oracle.javafx.scenebuilder.kit.editor.job.v2.AddPropertyJob;
-import com.oracle.javafx.scenebuilder.kit.editor.job.v2.AddPropertyValueJob;
+import com.oracle.javafx.scenebuilder.kit.editor.job.atomic.AddPropertyJob;
+import com.oracle.javafx.scenebuilder.kit.editor.job.atomic.AddPropertyValueJob;
 import com.oracle.javafx.scenebuilder.kit.fxom.FXOMInstance;
 import com.oracle.javafx.scenebuilder.kit.fxom.FXOMObject;
 import com.oracle.javafx.scenebuilder.kit.fxom.FXOMPropertyC;
--- a/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/job/wrap/AbstractWrapInJob.java	Mon Sep 01 09:19:43 2014 +0200
+++ b/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/job/wrap/AbstractWrapInJob.java	Mon Sep 01 09:42:26 2014 +0200
@@ -35,12 +35,12 @@
 import com.oracle.javafx.scenebuilder.kit.editor.job.BatchSelectionJob;
 import com.oracle.javafx.scenebuilder.kit.editor.job.Job;
 import com.oracle.javafx.scenebuilder.kit.editor.job.JobUtils;
-import com.oracle.javafx.scenebuilder.kit.editor.job.ModifyFxControllerJob;
-import com.oracle.javafx.scenebuilder.kit.editor.job.ModifyObjectJob;
+import com.oracle.javafx.scenebuilder.kit.editor.job.atomic.ModifyFxControllerJob;
+import com.oracle.javafx.scenebuilder.kit.editor.job.atomic.ModifyObjectJob;
 import com.oracle.javafx.scenebuilder.kit.editor.job.SetDocumentRootJob;
-import com.oracle.javafx.scenebuilder.kit.editor.job.ToggleFxRootJob;
-import com.oracle.javafx.scenebuilder.kit.editor.job.v2.AddPropertyValueJob;
-import com.oracle.javafx.scenebuilder.kit.editor.job.v2.RemovePropertyValueJob;
+import com.oracle.javafx.scenebuilder.kit.editor.job.atomic.ToggleFxRootJob;
+import com.oracle.javafx.scenebuilder.kit.editor.job.atomic.AddPropertyValueJob;
+import com.oracle.javafx.scenebuilder.kit.editor.job.atomic.RemovePropertyValueJob;
 import com.oracle.javafx.scenebuilder.kit.editor.selection.AbstractSelectionGroup;
 import com.oracle.javafx.scenebuilder.kit.editor.selection.ObjectSelectionGroup;
 import com.oracle.javafx.scenebuilder.kit.editor.selection.Selection;
--- a/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/job/wrap/AbstractWrapInSubComponentJob.java	Mon Sep 01 09:19:43 2014 +0200
+++ b/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/job/wrap/AbstractWrapInSubComponentJob.java	Mon Sep 01 09:42:26 2014 +0200
@@ -33,7 +33,7 @@
 
 import com.oracle.javafx.scenebuilder.kit.editor.EditorController;
 import com.oracle.javafx.scenebuilder.kit.editor.job.Job;
-import com.oracle.javafx.scenebuilder.kit.editor.job.v2.AddPropertyJob;
+import com.oracle.javafx.scenebuilder.kit.editor.job.atomic.AddPropertyJob;
 import com.oracle.javafx.scenebuilder.kit.fxom.FXOMObject;
 import com.oracle.javafx.scenebuilder.kit.fxom.FXOMPropertyC;
 import com.oracle.javafx.scenebuilder.kit.metadata.util.DesignHierarchyMask;
--- a/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/job/wrap/UnwrapJob.java	Mon Sep 01 09:19:43 2014 +0200
+++ b/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/job/wrap/UnwrapJob.java	Mon Sep 01 09:42:26 2014 +0200
@@ -34,13 +34,13 @@
 import com.oracle.javafx.scenebuilder.kit.editor.EditorController;
 import com.oracle.javafx.scenebuilder.kit.editor.job.BatchSelectionJob;
 import com.oracle.javafx.scenebuilder.kit.editor.job.Job;
-import com.oracle.javafx.scenebuilder.kit.editor.job.ModifyFxControllerJob;
-import com.oracle.javafx.scenebuilder.kit.editor.job.ModifyObjectJob;
+import com.oracle.javafx.scenebuilder.kit.editor.job.atomic.ModifyFxControllerJob;
+import com.oracle.javafx.scenebuilder.kit.editor.job.atomic.ModifyObjectJob;
 import com.oracle.javafx.scenebuilder.kit.editor.job.SetDocumentRootJob;
-import com.oracle.javafx.scenebuilder.kit.editor.job.ToggleFxRootJob;
-import com.oracle.javafx.scenebuilder.kit.editor.job.v2.AddPropertyValueJob;
-import com.oracle.javafx.scenebuilder.kit.editor.job.v2.RemovePropertyJob;
-import com.oracle.javafx.scenebuilder.kit.editor.job.v2.RemovePropertyValueJob;
+import com.oracle.javafx.scenebuilder.kit.editor.job.atomic.ToggleFxRootJob;
+import com.oracle.javafx.scenebuilder.kit.editor.job.atomic.AddPropertyValueJob;
+import com.oracle.javafx.scenebuilder.kit.editor.job.atomic.RemovePropertyJob;
+import com.oracle.javafx.scenebuilder.kit.editor.job.atomic.RemovePropertyValueJob;
 import com.oracle.javafx.scenebuilder.kit.editor.selection.AbstractSelectionGroup;
 import com.oracle.javafx.scenebuilder.kit.editor.selection.ObjectSelectionGroup;
 import com.oracle.javafx.scenebuilder.kit.editor.selection.Selection;
--- a/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/job/wrap/WrapInGridPaneJob.java	Mon Sep 01 09:19:43 2014 +0200
+++ b/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/job/wrap/WrapInGridPaneJob.java	Mon Sep 01 09:42:26 2014 +0200
@@ -34,7 +34,7 @@
 import com.oracle.javafx.scenebuilder.kit.editor.EditorController;
 import com.oracle.javafx.scenebuilder.kit.editor.job.Job;
 import com.oracle.javafx.scenebuilder.kit.editor.job.JobUtils;
-import com.oracle.javafx.scenebuilder.kit.editor.job.ModifyObjectJob;
+import com.oracle.javafx.scenebuilder.kit.editor.job.atomic.ModifyObjectJob;
 import com.oracle.javafx.scenebuilder.kit.editor.job.wrap.FXOMObjectCourseComparator.BidimensionalComparator;
 import com.oracle.javafx.scenebuilder.kit.editor.job.wrap.FXOMObjectCourseComparator.GridCourse;
 import static com.oracle.javafx.scenebuilder.kit.editor.job.wrap.FXOMObjectCourseComparator.OVERLAP_FUZZ;
--- a/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/job/wrap/WrapInTabPaneJob.java	Mon Sep 01 09:19:43 2014 +0200
+++ b/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/job/wrap/WrapInTabPaneJob.java	Mon Sep 01 09:42:26 2014 +0200
@@ -33,8 +33,8 @@
 
 import com.oracle.javafx.scenebuilder.kit.editor.EditorController;
 import com.oracle.javafx.scenebuilder.kit.editor.job.Job;
-import com.oracle.javafx.scenebuilder.kit.editor.job.v2.AddPropertyJob;
-import com.oracle.javafx.scenebuilder.kit.editor.job.v2.AddPropertyValueJob;
+import com.oracle.javafx.scenebuilder.kit.editor.job.atomic.AddPropertyJob;
+import com.oracle.javafx.scenebuilder.kit.editor.job.atomic.AddPropertyValueJob;
 import com.oracle.javafx.scenebuilder.kit.fxom.FXOMInstance;
 import com.oracle.javafx.scenebuilder.kit.fxom.FXOMObject;
 import com.oracle.javafx.scenebuilder.kit.fxom.FXOMPropertyC;
--- a/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/job/wrap/WrapJobUtils.java	Mon Sep 01 09:19:43 2014 +0200
+++ b/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/job/wrap/WrapJobUtils.java	Mon Sep 01 09:42:26 2014 +0200
@@ -32,7 +32,7 @@
 package com.oracle.javafx.scenebuilder.kit.editor.job.wrap;
 
 import com.oracle.javafx.scenebuilder.kit.editor.EditorController;
-import com.oracle.javafx.scenebuilder.kit.editor.job.ModifyObjectJob;
+import com.oracle.javafx.scenebuilder.kit.editor.job.atomic.ModifyObjectJob;
 import com.oracle.javafx.scenebuilder.kit.editor.selection.AbstractSelectionGroup;
 import com.oracle.javafx.scenebuilder.kit.editor.selection.ObjectSelectionGroup;
 import com.oracle.javafx.scenebuilder.kit.editor.selection.Selection;
--- a/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/panel/content/gesture/mouse/AdjustDividerGesture.java	Mon Sep 01 09:19:43 2014 +0200
+++ b/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/panel/content/gesture/mouse/AdjustDividerGesture.java	Mon Sep 01 09:42:26 2014 +0200
@@ -32,7 +32,7 @@
 package com.oracle.javafx.scenebuilder.kit.editor.panel.content.gesture.mouse;
 
 import com.oracle.javafx.scenebuilder.kit.editor.EditorController;
-import com.oracle.javafx.scenebuilder.kit.editor.job.ModifyObjectJob;
+import com.oracle.javafx.scenebuilder.kit.editor.job.atomic.ModifyObjectJob;
 import com.oracle.javafx.scenebuilder.kit.editor.panel.content.ContentPanelController;
 import com.oracle.javafx.scenebuilder.kit.editor.panel.content.HudWindowController;
 import com.oracle.javafx.scenebuilder.kit.editor.panel.content.driver.SplitPaneDesignInfoX;
--- a/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/panel/content/gesture/mouse/ResizeColumnGesture.java	Mon Sep 01 09:19:43 2014 +0200
+++ b/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/panel/content/gesture/mouse/ResizeColumnGesture.java	Mon Sep 01 09:42:26 2014 +0200
@@ -34,7 +34,7 @@
 
 import com.oracle.javafx.scenebuilder.kit.editor.EditorController;
 import com.oracle.javafx.scenebuilder.kit.editor.i18n.I18N;
-import com.oracle.javafx.scenebuilder.kit.editor.job.ModifyObjectJob;
+import com.oracle.javafx.scenebuilder.kit.editor.job.atomic.ModifyObjectJob;
 import com.oracle.javafx.scenebuilder.kit.editor.panel.content.driver.gridpane.GridPaneHandles;
 import com.oracle.javafx.scenebuilder.kit.editor.panel.content.driver.resizer.GridPaneColumnResizer;
 import com.oracle.javafx.scenebuilder.kit.fxom.FXOMInstance;
--- a/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/panel/content/gesture/mouse/ResizeGesture.java	Mon Sep 01 09:19:43 2014 +0200
+++ b/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/panel/content/gesture/mouse/ResizeGesture.java	Mon Sep 01 09:42:26 2014 +0200
@@ -32,7 +32,7 @@
 package com.oracle.javafx.scenebuilder.kit.editor.panel.content.gesture.mouse;
 
 import com.oracle.javafx.scenebuilder.kit.editor.EditorController;
-import com.oracle.javafx.scenebuilder.kit.editor.job.ModifyObjectJob;
+import com.oracle.javafx.scenebuilder.kit.editor.job.atomic.ModifyObjectJob;
 import com.oracle.javafx.scenebuilder.kit.editor.panel.content.ContentPanelController;
 import com.oracle.javafx.scenebuilder.kit.editor.panel.content.HudWindowController;
 import com.oracle.javafx.scenebuilder.kit.editor.panel.content.driver.relocater.AbstractRelocater;
--- a/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/panel/content/gesture/mouse/ResizeRowGesture.java	Mon Sep 01 09:19:43 2014 +0200
+++ b/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/panel/content/gesture/mouse/ResizeRowGesture.java	Mon Sep 01 09:42:26 2014 +0200
@@ -34,7 +34,7 @@
 
 import com.oracle.javafx.scenebuilder.kit.editor.EditorController;
 import com.oracle.javafx.scenebuilder.kit.editor.i18n.I18N;
-import com.oracle.javafx.scenebuilder.kit.editor.job.ModifyObjectJob;
+import com.oracle.javafx.scenebuilder.kit.editor.job.atomic.ModifyObjectJob;
 import com.oracle.javafx.scenebuilder.kit.editor.panel.content.driver.gridpane.GridPaneHandles;
 import com.oracle.javafx.scenebuilder.kit.editor.panel.content.driver.resizer.GridPaneRowResizer;
 import com.oracle.javafx.scenebuilder.kit.fxom.FXOMInstance;
--- a/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/panel/content/gesture/mouse/ResizeTableColumnGesture.java	Mon Sep 01 09:19:43 2014 +0200
+++ b/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/panel/content/gesture/mouse/ResizeTableColumnGesture.java	Mon Sep 01 09:42:26 2014 +0200
@@ -36,7 +36,7 @@
 import com.oracle.javafx.scenebuilder.kit.editor.i18n.I18N;
 import com.oracle.javafx.scenebuilder.kit.editor.job.BatchJob;
 import com.oracle.javafx.scenebuilder.kit.editor.job.Job;
-import com.oracle.javafx.scenebuilder.kit.editor.job.ModifyObjectJob;
+import com.oracle.javafx.scenebuilder.kit.editor.job.atomic.ModifyObjectJob;
 import com.oracle.javafx.scenebuilder.kit.editor.panel.content.ContentPanelController;
 import com.oracle.javafx.scenebuilder.kit.editor.panel.content.driver.resizer.TableColumnResizer;
 import com.oracle.javafx.scenebuilder.kit.fxom.FXOMInstance;
--- a/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/panel/content/gesture/mouse/ResizeTreeTableColumnGesture.java	Mon Sep 01 09:19:43 2014 +0200
+++ b/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/panel/content/gesture/mouse/ResizeTreeTableColumnGesture.java	Mon Sep 01 09:42:26 2014 +0200
@@ -36,7 +36,7 @@
 import com.oracle.javafx.scenebuilder.kit.editor.i18n.I18N;
 import com.oracle.javafx.scenebuilder.kit.editor.job.BatchJob;
 import com.oracle.javafx.scenebuilder.kit.editor.job.Job;
-import com.oracle.javafx.scenebuilder.kit.editor.job.ModifyObjectJob;
+import com.oracle.javafx.scenebuilder.kit.editor.job.atomic.ModifyObjectJob;
 import com.oracle.javafx.scenebuilder.kit.editor.panel.content.ContentPanelController;
 import com.oracle.javafx.scenebuilder.kit.editor.panel.content.driver.resizer.TreeTableColumnResizer;
 import com.oracle.javafx.scenebuilder.kit.fxom.FXOMInstance;
--- a/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/panel/content/mode/EditModeController.java	Mon Sep 01 09:19:43 2014 +0200
+++ b/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/panel/content/mode/EditModeController.java	Mon Sep 01 09:42:26 2014 +0200
@@ -36,7 +36,7 @@
 import com.oracle.javafx.scenebuilder.kit.editor.drag.target.AbstractDropTarget;
 import com.oracle.javafx.scenebuilder.kit.editor.drag.target.GridPaneDropTarget;
 import com.oracle.javafx.scenebuilder.kit.editor.drag.target.RootDropTarget;
-import com.oracle.javafx.scenebuilder.kit.editor.job.ModifyObjectJob;
+import com.oracle.javafx.scenebuilder.kit.editor.job.atomic.ModifyObjectJob;
 import com.oracle.javafx.scenebuilder.kit.editor.job.RelocateSelectionJob;
 import com.oracle.javafx.scenebuilder.kit.editor.messagelog.MessageLog;
 import com.oracle.javafx.scenebuilder.kit.editor.panel.content.AbstractDecoration;
--- a/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/panel/hierarchy/treeview/HierarchyTreeCell.java	Mon Sep 01 09:19:43 2014 +0200
+++ b/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/panel/hierarchy/treeview/HierarchyTreeCell.java	Mon Sep 01 09:42:26 2014 +0200
@@ -40,8 +40,8 @@
 import com.oracle.javafx.scenebuilder.kit.editor.drag.target.RootDropTarget;
 import com.oracle.javafx.scenebuilder.kit.editor.i18n.I18N;
 import com.oracle.javafx.scenebuilder.kit.editor.images.ImageUtils;
-import com.oracle.javafx.scenebuilder.kit.editor.job.ModifyFxIdJob;
-import com.oracle.javafx.scenebuilder.kit.editor.job.ModifyObjectJob;
+import com.oracle.javafx.scenebuilder.kit.editor.job.atomic.ModifyFxIdJob;
+import com.oracle.javafx.scenebuilder.kit.editor.job.atomic.ModifyObjectJob;
 import com.oracle.javafx.scenebuilder.kit.editor.panel.hierarchy.HierarchyDNDController;
 import com.oracle.javafx.scenebuilder.kit.editor.panel.hierarchy.HierarchyItem;
 import com.oracle.javafx.scenebuilder.kit.editor.panel.hierarchy.AbstractHierarchyPanelController;
--- a/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/panel/inspector/InspectorPanelController.java	Mon Sep 01 09:19:43 2014 +0200
+++ b/apps/scenebuilder/SceneBuilderKit/src/com/oracle/javafx/scenebuilder/kit/editor/panel/inspector/InspectorPanelController.java	Mon Sep 01 09:42:26 2014 +0200
@@ -36,7 +36,7 @@
 import com.oracle.javafx.scenebuilder.kit.editor.i18n.I18N;
 import com.oracle.javafx.scenebuilder.kit.editor.job.ModifySelectionJob;
 import com.oracle.javafx.scenebuilder.kit.editor.job.Job;
-import com.oracle.javafx.scenebuilder.kit.editor.job.ModifyFxIdJob;
+import com.oracle.javafx.scenebuilder.kit.editor.job.atomic.ModifyFxIdJob;
 import com.oracle.javafx.scenebuilder.kit.editor.job.togglegroup.ModifySelectionToggleGroupJob;
 import com.oracle.javafx.scenebuilder.kit.editor.panel.inspector.editors.AnchorPaneConstraintsEditor;
 import com.oracle.javafx.scenebuilder.kit.editor.panel.inspector.editors.BooleanEditor;