protected boolean canUnwrap()

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;
                }
            }
        }
    }