in kit/src/main/java/com/oracle/javafx/scenebuilder/kit/editor/job/wrap/UnwrapJob.java [74:146]
protected boolean canUnwrap() {
final Selection selection = getEditorController().getSelection();
if (selection.isEmpty()) {
return false;
}
final AbstractSelectionGroup asg = selection.getGroup();
if ((asg instanceof ObjectSelectionGroup) == false) {
return false;
}
final ObjectSelectionGroup osg = (ObjectSelectionGroup) asg;
if (osg.getItems().size() != 1) {
return false;
}
final FXOMObject container = osg.getItems().iterator().next();
if (container instanceof FXOMInstance == false) {
return false;
}
final FXOMInstance containerInstance = (FXOMInstance) container;
// Unresolved custom type
if (container.getSceneGraphObject() == null) {
return false;
}
// Can unwrap ALL classes supporting wrapping
boolean isAssignableFrom = false;
for (Class<?> clazz : EditorController.getClassesSupportingWrapping()) {
isAssignableFrom |= clazz.isAssignableFrom(
containerInstance.getDeclaredClass());
}
if (isAssignableFrom == false) {
return false;
}
// Retrieve the children of the container to unwrap
final List<FXOMObject> children = getChildren(containerInstance);
int childrenCount = children.size();
// If the container to unwrap has no childen, it cannot be unwrapped
if (childrenCount == 0) {
return false;
}
// Retrieve the parent of the container to unwrap
final FXOMObject parentContainer = container.getParentObject();
// Unwrap the root node
if (parentContainer == null) {
return childrenCount == 1;
} else {
// Check that the num and type of children can be added to the parent container
final DesignHierarchyMask parentContainerMask
= new DesignHierarchyMask(parentContainer);
if (parentContainerMask.isAcceptingSubComponent()) {
return childrenCount >= 1;
} else {
assert parentContainerMask.isAcceptingAccessory(Accessory.CONTENT)
|| parentContainerMask.isAcceptingAccessory(Accessory.GRAPHIC)
|| parentContainerMask.isAcceptingAccessory(Accessory.ROOT)
|| parentContainerMask.isAcceptingAccessory(Accessory.SCENE)
|| parentContainerMask.getFxomObject().getSceneGraphObject() instanceof BorderPane
|| parentContainerMask.getFxomObject().getSceneGraphObject() instanceof DialogPane;
if (childrenCount != 1) {
return false;
}
final FXOMObject child = children.iterator().next();
if (parentContainerMask.isAcceptingAccessory(Accessory.SCENE)) {
return parentContainerMask.isAcceptingAccessory(Accessory.SCENE, child);
} else {
return true;
}
}
}
}