in kit/src/main/java/com/oracle/javafx/scenebuilder/kit/editor/job/wrap/UnwrapJob.java [149:256]
protected List<Job> makeSubJobs() {
final List<Job> result = new ArrayList<>();
if (canUnwrap()) { // (1)
final Selection selection = getEditorController().getSelection();
final AbstractSelectionGroup asg = selection.getGroup();
assert asg instanceof ObjectSelectionGroup; // Because of (1)
final ObjectSelectionGroup osg = (ObjectSelectionGroup) asg;
assert osg.getItems().size() == 1; // Because of (1)
// Retrieve the old container (container to unwrap)
oldContainer = (FXOMInstance) osg.getItems().iterator().next();
// Retrieve the children of the old container
oldContainerChildren = getChildren(oldContainer);
// Retrieve the old container property name in use
final PropertyName oldContainerPropertyName
= WrapJobUtils.getContainerPropertyName(oldContainer, oldContainerChildren);
// Retrieve the old container property (already defined and not null)
final FXOMPropertyC oldContainerProperty
= (FXOMPropertyC) oldContainer.getProperties().get(oldContainerPropertyName);
assert oldContainerProperty != null
&& oldContainerProperty.getParentInstance() != null;
// Retrieve the parent of the old container (aka new container)
newContainer = (FXOMInstance) oldContainer.getParentObject();
// Remove the old container property from the old container instance
final Job removePropertyJob = new RemovePropertyJob(
oldContainerProperty,
getEditorController());
result.add(removePropertyJob);
// Remove the children from the old container property
final List<Job> removeChildrenJobs
= removeChildrenJobs(oldContainerProperty, oldContainerChildren);
result.addAll(removeChildrenJobs);
//------------------------------------------------------------------
// If the target object is NOT the FXOM root :
// - we update the new container bounds and add it to the old container
// - we update the children bounds and remove them from the old container
//------------------------------------------------------------------
if (newContainer != null) {
// Retrieve the new container property name in use
final List<FXOMObject> newContainerChildren = new ArrayList<>();
newContainerChildren.add(oldContainer);
final PropertyName newContainerPropertyName
= WrapJobUtils.getContainerPropertyName(newContainer, newContainerChildren);
// Retrieve the new container property (already defined and not null)
final FXOMPropertyC newContainerProperty
= (FXOMPropertyC) newContainer.getProperties().get(newContainerPropertyName);
assert newContainerProperty != null
&& newContainerProperty.getParentInstance() != null;
// Update children bounds before adding them to the new container
result.addAll(modifyChildrenJobs(oldContainerChildren));
// Add the children to the new container
int index = oldContainer.getIndexInParentProperty();
final List<Job> addChildrenJobs
= addChildrenJobs(newContainerProperty, index, oldContainerChildren);
result.addAll(addChildrenJobs);
// Remove the old container from the new container property
final Job removeValueJob = new RemovePropertyValueJob(
oldContainer,
getEditorController());
result.add(removeValueJob);
} //
//------------------------------------------------------------------
// If the target object is the FXOM root :
// - we update the document root with the single child of the root node
//------------------------------------------------------------------
else {
assert oldContainerChildren.size() == 1; // Because of (1)
boolean isFxRoot = oldContainer.isFxRoot();
final String fxController = oldContainer.getFxController();
// First remove the fx:controller/fx:root from the old root object
if (isFxRoot) {
final ToggleFxRootJob fxRootJob = new ToggleFxRootJob(getEditorController());
result.add(fxRootJob);
}
if (fxController != null) {
final ModifyFxControllerJob fxControllerJob
= new ModifyFxControllerJob(oldContainer, null, getEditorController());
result.add(fxControllerJob);
}
// Then set the new container as root object
final FXOMObject child = oldContainerChildren.iterator().next();
final Job setDocumentRoot = new SetDocumentRootJob(
child, getEditorController());
result.add(setDocumentRoot);
// Finally add the fx:controller/fx:root to the new root object
if (isFxRoot) {
final ToggleFxRootJob fxRootJob = new ToggleFxRootJob(getEditorController());
result.add(fxRootJob);
}
if (fxController != null) {
final ModifyFxControllerJob fxControllerJob
= new ModifyFxControllerJob(child, fxController, getEditorController());
result.add(fxControllerJob);
}
}
}
return result;
}