public Bounds snapBounds()

in kit/src/main/java/com/oracle/javafx/scenebuilder/kit/editor/panel/content/util/CardinalPoint.java [237:342]


    public Bounds snapBounds(Bounds bounds, double ratio) {
        /*
         * 
         *        NW                N                NE
         *         *----------------*----------------*
         *         |                                 |
         *         |                                 |
         *         |                                 |
         *       W *                                 * E
         *         |                                 |
         *         |                                 |
         *         |                                 |
         *         *----------------*----------------*
         *        SW                S                SE
         * 
         * 
         */
        
        final double minX = bounds.getMinX();
        final double minY = bounds.getMinY();
        final double maxX = bounds.getMaxX();
        final double maxY = bounds.getMaxY();
        final double snapWidth = bounds.getHeight() / ratio;
        final double snapDX = snapWidth - bounds.getWidth();
        final double snapHeight = bounds.getWidth() * ratio;
        final double snapDY = snapHeight - bounds.getHeight();
        final double newMinX, newMinY, newMaxX, newMaxY;

        // x axis
        switch(this) {
            case N:
            case S:
                newMinX = minX - snapDX / 2.0;
                newMaxX = maxX + snapDX / 2.0;
                break;
            case E:
            case W:
                newMinX = minX;
                newMaxX = maxX;
                break;
            case NW:
            case SW:
                if (Math.abs(snapDX) >= Math.abs(snapDY)) {
                    newMinX = minX - snapDX;
                } else {
                    newMinX = minX;
                }
                newMaxX = maxX;
                break;
            case NE:
            case SE:
                newMinX = minX;
                if (Math.abs(snapDX) >= Math.abs(snapDY)) {
                    newMaxX = maxX + snapDX;
                } else {
                    newMaxX = maxX;
                }
                break;
            default:
                // Emergency code
                assert false : "Unexpected " + this;
                newMinX = minX;
                newMaxX = maxX;
                break;
        }

        // y axis
        switch(this) {
            case N:
            case S:
                newMinY = minY;
                newMaxY = maxY;
                break;
            case E:
            case W:
                newMinY = minY - snapDY / 2.0;
                newMaxY = maxY + snapDY / 2.0;
                break;
            case NW:
            case NE:
                if (Math.abs(snapDY) > Math.abs(snapDX)) {
                    newMinY = minY - snapDY;
                } else {
                    newMinY = minY;
                }
                newMaxY = maxY;
                break;
            case SW:
            case SE:
                newMinY = minY;
                if (Math.abs(snapDY) > Math.abs(snapDX)) {
                    newMaxY = maxY + snapDY;
                } else {
                    newMaxY = maxY;
                }
                break;
            default:
                // Emergency code
                assert false : "Unexpected " + this;
                newMinY = minY;
                newMaxY = maxY;
                break;
        }

        return new BoundingBox(newMinX, newMinY, newMaxX - newMinX, newMaxY - newMinY);
    }