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