public void connect()

in designer/src/com/android/tools/idea/uibuilder/handlers/constraint/model/ConstraintWidget.java [710:879]


    public void connect(ConstraintAnchorConstants.Type constraintFrom,
                        ConstraintWidget target,
                        ConstraintAnchorConstants.Type constraintTo, int margin,
                        ConstraintAnchorConstants.Strength strength, int creator) {
        if (constraintFrom == ConstraintAnchorConstants.Type.CENTER) {
            // If we have center, we connect instead to the corresponding
            // left/right or top/bottom pairs
            if (constraintTo == ConstraintAnchorConstants.Type.CENTER) {
                ConstraintAnchor left = getAnchor(ConstraintAnchorConstants.Type.LEFT);
                ConstraintAnchor right = getAnchor(ConstraintAnchorConstants.Type.RIGHT);
                ConstraintAnchor top = getAnchor(ConstraintAnchorConstants.Type.TOP);
                ConstraintAnchor bottom = getAnchor(ConstraintAnchorConstants.Type.BOTTOM);
                boolean centerX = false;
                boolean centerY = false;
                if ((left != null && left.isConnected())
                    || (right != null && right.isConnected())) {
                    // don't apply center here
                }
                else {
                    connect(ConstraintAnchorConstants.Type.LEFT, target,
                            ConstraintAnchorConstants.Type.LEFT, 0, strength, creator);
                    connect(ConstraintAnchorConstants.Type.RIGHT, target,
                            ConstraintAnchorConstants.Type.RIGHT, 0, strength, creator);
                    centerX = true;
                }
                if ((top != null && top.isConnected())
                    || (bottom != null && bottom.isConnected())) {
                    // don't apply center here
                }
                else {
                    connect(ConstraintAnchorConstants.Type.TOP, target,
                            ConstraintAnchorConstants.Type.TOP, 0, strength, creator);
                    connect(ConstraintAnchorConstants.Type.BOTTOM, target,
                            ConstraintAnchorConstants.Type.BOTTOM, 0, strength, creator);
                    centerY = true;
                }
                if (centerX && centerY) {
                    ConstraintAnchor center = getAnchor(ConstraintAnchorConstants.Type.CENTER);
                    center.connect(target.getAnchor(ConstraintAnchorConstants.Type.CENTER), 0, creator);
                }
                else if (centerX) {
                    ConstraintAnchor center = getAnchor(ConstraintAnchorConstants.Type.CENTER_X);
                    center.connect(target.getAnchor(ConstraintAnchorConstants.Type.CENTER_X), 0, creator);
                }
                else if (centerY) {
                    ConstraintAnchor center = getAnchor(ConstraintAnchorConstants.Type.CENTER_Y);
                    center.connect(target.getAnchor(ConstraintAnchorConstants.Type.CENTER_Y), 0, creator);
                }
            }
            else if ((constraintTo == ConstraintAnchorConstants.Type.LEFT)
                     || (constraintTo == ConstraintAnchorConstants.Type.RIGHT)) {
                connect(ConstraintAnchorConstants.Type.LEFT, target,
                        constraintTo, 0, strength, creator);
                connect(ConstraintAnchorConstants.Type.RIGHT, target,
                        constraintTo, 0, strength, creator);
                ConstraintAnchor center = getAnchor(ConstraintAnchorConstants.Type.CENTER);
                center.connect(target.getAnchor(constraintTo), 0, creator);
            }
            else if ((constraintTo == ConstraintAnchorConstants.Type.TOP)
                     || (constraintTo == ConstraintAnchorConstants.Type.BOTTOM)) {
                connect(ConstraintAnchorConstants.Type.TOP, target,
                        constraintTo, 0, strength, creator);
                connect(ConstraintAnchorConstants.Type.BOTTOM, target,
                        constraintTo, 0, strength, creator);
                ConstraintAnchor center = getAnchor(ConstraintAnchorConstants.Type.CENTER);
                center.connect(target.getAnchor(constraintTo), 0, creator);
            }
        }
        else if (constraintFrom == ConstraintAnchorConstants.Type.CENTER_X
                 && (constraintTo == ConstraintAnchorConstants.Type.LEFT
                     || constraintTo == ConstraintAnchorConstants.Type.RIGHT)) {
            ConstraintAnchor left = getAnchor(ConstraintAnchorConstants.Type.LEFT);
            ConstraintAnchor targetAnchor = target.getAnchor(constraintTo);
            ConstraintAnchor right = getAnchor(ConstraintAnchorConstants.Type.RIGHT);
            left.connect(targetAnchor, 0, creator);
            right.connect(targetAnchor, 0, creator);
            ConstraintAnchor centerX = getAnchor(ConstraintAnchorConstants.Type.CENTER_X);
            centerX.connect(targetAnchor, 0, creator);
        }
        else if (constraintFrom == ConstraintAnchorConstants.Type.CENTER_Y
                 && (constraintTo == ConstraintAnchorConstants.Type.TOP
                     || constraintTo == ConstraintAnchorConstants.Type.BOTTOM)) {
            ConstraintAnchor targetAnchor = target.getAnchor(constraintTo);
            ConstraintAnchor top = getAnchor(ConstraintAnchorConstants.Type.TOP);
            top.connect(targetAnchor, 0, creator);
            ConstraintAnchor bottom = getAnchor(ConstraintAnchorConstants.Type.BOTTOM);
            bottom.connect(targetAnchor, 0, creator);
            ConstraintAnchor centerY = getAnchor(ConstraintAnchorConstants.Type.CENTER_Y);
            centerY.connect(targetAnchor, 0, creator);
        }
        else if (constraintFrom == ConstraintAnchorConstants.Type.CENTER_X
                 && constraintTo == ConstraintAnchorConstants.Type.CENTER_X) {
            // Center X connection will connect left & right
            ConstraintAnchor left = getAnchor(ConstraintAnchorConstants.Type.LEFT);
            ConstraintAnchor leftTarget = target.getAnchor(ConstraintAnchorConstants.Type.LEFT);
            left.connect(leftTarget, 0, creator);
            ConstraintAnchor right = getAnchor(ConstraintAnchorConstants.Type.RIGHT);
            ConstraintAnchor rightTarget = target.getAnchor(ConstraintAnchorConstants.Type.RIGHT);
            right.connect(rightTarget, 0, creator);
            ConstraintAnchor centerX = getAnchor(ConstraintAnchorConstants.Type.CENTER_X);
            centerX.connect(target.getAnchor(constraintTo), 0, creator);
        }
        else if (constraintFrom == ConstraintAnchorConstants.Type.CENTER_Y
                 && constraintTo == ConstraintAnchorConstants.Type.CENTER_Y) {
            // Center Y connection will connect top & bottom.
            ConstraintAnchor top = getAnchor(ConstraintAnchorConstants.Type.TOP);
            ConstraintAnchor topTarget = target.getAnchor(ConstraintAnchorConstants.Type.TOP);
            top.connect(topTarget, 0, creator);
            ConstraintAnchor bottom = getAnchor(ConstraintAnchorConstants.Type.BOTTOM);
            ConstraintAnchor bottomTarget = target.getAnchor(ConstraintAnchorConstants.Type.BOTTOM);
            bottom.connect(bottomTarget, 0, creator);
            ConstraintAnchor centerY = getAnchor(ConstraintAnchorConstants.Type.CENTER_Y);
            centerY.connect(target.getAnchor(constraintTo), 0, creator);
        }
        else {
            ConstraintAnchor fromAnchor = getAnchor(constraintFrom);
            ConstraintAnchor toAnchor = target.getAnchor(constraintTo);
            if (fromAnchor.isValidConnection(toAnchor)) {
                // make sure that the baseline takes precedence over top/bottom
                // and reversely, reset the baseline if we are connecting top/bottom
                if (constraintFrom == ConstraintAnchorConstants.Type.BASELINE) {
                    ConstraintAnchor top = getAnchor(ConstraintAnchorConstants.Type.TOP);
                    ConstraintAnchor bottom = getAnchor(ConstraintAnchorConstants.Type.BOTTOM);
                    if (top != null) {
                        top.reset();
                    }
                    if (bottom != null) {
                        bottom.reset();
                    }
                    margin = 0;
                }
                else if ((constraintFrom == ConstraintAnchorConstants.Type.TOP)
                         || (constraintFrom == ConstraintAnchorConstants.Type.BOTTOM)) {
                    ConstraintAnchor baseline = getAnchor(ConstraintAnchorConstants.Type.BASELINE);
                    if (baseline != null) {
                        baseline.reset();
                    }
                    ConstraintAnchor center = getAnchor(ConstraintAnchorConstants.Type.CENTER);
                    if (center.getTarget() != toAnchor) {
                        center.reset();
                    }
                    ConstraintAnchor opposite = getAnchor(constraintFrom).getOpposite();
                    ConstraintAnchor centerY = getAnchor(ConstraintAnchorConstants.Type.CENTER_Y);
                    if (centerY.isConnected()) {
                        if (opposite != null) {
                          opposite.reset();
                        }
                        centerY.reset();
                    }
                }
                else if ((constraintFrom == ConstraintAnchorConstants.Type.LEFT)
                         || (constraintFrom == ConstraintAnchorConstants.Type.RIGHT)) {
                    ConstraintAnchor center = getAnchor(ConstraintAnchorConstants.Type.CENTER);
                    if (center.getTarget() != toAnchor) {
                        center.reset();
                    }
                    ConstraintAnchor opposite = getAnchor(constraintFrom).getOpposite();
                    ConstraintAnchor centerX = getAnchor(ConstraintAnchorConstants.Type.CENTER_X);
                    if (centerX.isConnected()) {
                      if (opposite != null) {
                        opposite.reset();
                      }
                      centerX.reset();
                    }
                }
                fromAnchor.connect(toAnchor, margin, strength, creator);
                toAnchor.getOwner().connectedTo(fromAnchor.getOwner());
            }
        }
    }