in designer/src/com/android/tools/idea/uibuilder/handlers/constraint/ConstraintLayoutHandler.java [825:1047]
public void perform(@NotNull ViewEditor editor,
@NotNull ViewHandler handler,
@NotNull NlComponent component,
@NotNull List<NlComponent> selectedChildren,
@InputEventMask int modifiers) {
NlComponent parent = component;
while (parent != null && !NlComponentHelperKt.isOrHasSuperclass(parent, CONSTRAINT_LAYOUT)) {
parent = parent.getParent();
}
if (parent != null) {
boolean useAndroidx = NlComponentHelperKt.isOrHasAndroidxSuperclass(parent);
ensureLayersAreShown(editor, 1000);
switch (myType) {
case HORIZONTAL_GUIDELINE: {
NlComponent guideline = NlComponentHelperKt
.createChild(parent, useAndroidx ? CONSTRAINT_LAYOUT_GUIDELINE.newName() : CONSTRAINT_LAYOUT_GUIDELINE.oldName(),
null, InsertType.CREATE);
assert guideline != null;
guideline.ensureId();
guideline.setAttribute(SHERPA_URI, LAYOUT_CONSTRAINT_GUIDE_BEGIN, "20dp");
getAnalyticsManager(editor).trackAddHorizontalGuideline();
guideline.setAttribute(ANDROID_URI, ATTR_ORIENTATION, ATTR_GUIDELINE_ORIENTATION_HORIZONTAL);
}
break;
case VERTICAL_GUIDELINE: {
NlComponent guideline = NlComponentHelperKt
.createChild(parent, useAndroidx ? CONSTRAINT_LAYOUT_GUIDELINE.newName() : CONSTRAINT_LAYOUT_GUIDELINE.oldName(),
null, InsertType.CREATE);
assert guideline != null;
guideline.ensureId();
guideline.setAttribute(SHERPA_URI, LAYOUT_CONSTRAINT_GUIDE_BEGIN, "20dp");
getAnalyticsManager(editor).trackAddVerticalGuideline();
guideline.setAttribute(ANDROID_URI, ATTR_ORIENTATION, ATTR_GUIDELINE_ORIENTATION_VERTICAL);
}
break;
case GROUP: {
NlComponent group = NlComponentHelperKt
.createChild(parent, useAndroidx ? CLASS_CONSTRAINT_LAYOUT_GROUP.newName() : CLASS_CONSTRAINT_LAYOUT_GROUP.oldName(),
null, InsertType.CREATE);
assert group != null;
String referencedIds = getSelectedIds(selectedChildren);
if (referencedIds != null) {
group.setAttribute(AUTO_URI, CONSTRAINT_REFERENCED_IDS, referencedIds);
}
group.ensureId();
}
break;
case CONSTRAINT_SET: {
NlComponent constraints =
NlComponentHelperKt.createChild(parent,useAndroidx
? CLASS_CONSTRAINT_LAYOUT_CONSTRAINTS.newName()
: CLASS_CONSTRAINT_LAYOUT_CONSTRAINTS.oldName(), null, InsertType.CREATE);
assert constraints != null;
constraints.ensureId();
ConstraintReferenceManagement.populateConstraints(constraints);
}
break;
case LAYER: {
NlComponent layer = NlComponentHelperKt
.createChild(parent, useAndroidx ? CLASS_CONSTRAINT_LAYOUT_LAYER.newName() : CLASS_CONSTRAINT_LAYOUT_LAYER.oldName(),
null, InsertType.CREATE);
assert layer != null;
removeAbsolutePositioning(selectedChildren);
String referencedIds = getSelectedIds(selectedChildren);
if (referencedIds != null) {
layer.setAttribute(AUTO_URI, CONSTRAINT_REFERENCED_IDS, referencedIds);
}
layer.ensureId();
}
break;
case FLOW: {
NlComponent layer = NlComponentHelperKt
.createChild(parent, useAndroidx ? CLASS_CONSTRAINT_LAYOUT_FLOW.newName() : CLASS_CONSTRAINT_LAYOUT_FLOW.oldName(),
null, InsertType.CREATE);
assert layer != null;
removeAbsolutePositioning(selectedChildren);
String referencedIds = getSelectedIds(selectedChildren);
if (referencedIds != null) {
layer.setAttribute(AUTO_URI, CONSTRAINT_REFERENCED_IDS, referencedIds);
}
layer.ensureId();
}
break;
case HORIZONTAL_BARRIER: {
int barriers = 0;
int other = 0;
for (NlComponent child : selectedChildren) {
if (NlComponentHelperKt.isOrHasSuperclass(child, CONSTRAINT_LAYOUT_BARRIER)) {
barriers++;
}
if (!ConstraintComponentUtilities.isLine(child)) {
other++;
}
}
if (barriers == 1 && other > 0) {
NlComponent barrier = null;
for (NlComponent child : selectedChildren) {
if (NlComponentHelperKt.isOrHasSuperclass(child, CONSTRAINT_LAYOUT_BARRIER)) {
barrier = child;
break;
}
}
if (ConstraintHelperHandler.USE_HELPER_TAGS) {
if (barrier != null) {
for (NlComponent child : selectedChildren) {
if (ConstraintComponentUtilities.isLine(child)) {
continue;
}
NlComponent tag = NlComponentHelperKt.createChild(barrier, TAG, null, InsertType.CREATE);
if (tag != null) {
tag.removeAndroidAttribute(ATTR_LAYOUT_WIDTH);
tag.removeAndroidAttribute(ATTR_LAYOUT_HEIGHT);
tag.setAttribute(ANDROID_URI, ATTR_ID, ID_PREFIX + child.getId());
tag.setAttribute(ANDROID_URI, ATTR_VALUE, VALUE_TRUE);
}
}
}
} // TODO: add views to the barrier when not using the tags approach
return;
}
NlComponent barrier = NlComponentHelperKt
.createChild(parent, useAndroidx ? CONSTRAINT_LAYOUT_BARRIER.newName() : CONSTRAINT_LAYOUT_BARRIER.oldName(), null,
InsertType.CREATE);
assert barrier != null;
String referencedIds = getSelectedIds(selectedChildren);
if (referencedIds != null) {
barrier.setAttribute(AUTO_URI, CONSTRAINT_REFERENCED_IDS, referencedIds);
}
barrier.ensureId();
barrier.setAttribute(SHERPA_URI, ATTR_BARRIER_DIRECTION, "top");
// TODO add getAnalyticsManager(editor).trackAddHorizontalBarrier
if (ConstraintHelperHandler.USE_HELPER_TAGS) {
if (!selectedChildren.isEmpty()) {
NlComponent tag = NlComponentHelperKt.createChild(barrier, TAG, null, InsertType.CREATE);
if (tag != null) {
tag.removeAndroidAttribute(ATTR_LAYOUT_WIDTH);
tag.removeAndroidAttribute(ATTR_LAYOUT_HEIGHT);
for (NlComponent child : selectedChildren) {
if (ConstraintComponentUtilities.isLine(child)) {
continue;
}
tag.setAttribute(ANDROID_URI, ATTR_ID, ID_PREFIX + child.getId());
tag.setAttribute(ANDROID_URI, ATTR_VALUE, VALUE_TRUE);
}
}
}
}
}
break;
case VERTICAL_BARRIER: {
int barriers = 0;
int other = 0;
for (NlComponent child : selectedChildren) {
if (NlComponentHelperKt.isOrHasSuperclass(child, CONSTRAINT_LAYOUT_BARRIER)) {
barriers++;
}
if (!ConstraintComponentUtilities.isLine(child)) {
other++;
}
}
if (barriers == 1 && other > 0) {
NlComponent barrier = null;
for (NlComponent child : selectedChildren) {
if (NlComponentHelperKt.isOrHasSuperclass(child, CONSTRAINT_LAYOUT_BARRIER)) {
barrier = child;
break;
}
}
if (ConstraintHelperHandler.USE_HELPER_TAGS) {
if (barrier != null) {
for (NlComponent child : selectedChildren) {
if (ConstraintComponentUtilities.isLine(child)) {
continue;
}
NlComponent tag = NlComponentHelperKt.createChild(barrier, TAG, null, InsertType.CREATE);
if (tag != null) {
tag.removeAndroidAttribute(ATTR_LAYOUT_WIDTH);
tag.removeAndroidAttribute(ATTR_LAYOUT_HEIGHT);
tag.setAttribute(ANDROID_URI, ATTR_ID, ID_PREFIX + child.getId());
tag.setAttribute(ANDROID_URI, ATTR_VALUE, VALUE_TRUE);
}
}
}
} // TODO: add views to the barrier when not using the tags approach
return;
}
NlComponent barrier = NlComponentHelperKt
.createChild(parent, useAndroidx ? CONSTRAINT_LAYOUT_BARRIER.newName() : CONSTRAINT_LAYOUT_BARRIER.oldName(), null,
InsertType.CREATE);
assert barrier != null;
String referencedIds = getSelectedIds(selectedChildren);
if (referencedIds != null) {
barrier.setAttribute(AUTO_URI, CONSTRAINT_REFERENCED_IDS, referencedIds);
}
barrier.ensureId();
barrier.setAttribute(SHERPA_URI, ATTR_BARRIER_DIRECTION, "left");
// TODO add getAnalyticsManager(editor).trackAddVerticalBarrier
if (ConstraintHelperHandler.USE_HELPER_TAGS) {
if (!selectedChildren.isEmpty()) {
for (NlComponent child : selectedChildren) {
if (ConstraintComponentUtilities.isLine(child)) {
continue;
}
NlComponent tag = NlComponentHelperKt.createChild(barrier, TAG, null, InsertType.CREATE);
if (tag != null) {
tag.removeAndroidAttribute(ATTR_LAYOUT_WIDTH);
tag.removeAndroidAttribute(ATTR_LAYOUT_HEIGHT);
tag.setAttribute(ANDROID_URI, ATTR_ID, ID_PREFIX + child.getId());
tag.setAttribute(ANDROID_URI, ATTR_VALUE, VALUE_TRUE);
}
}
}
}
}
}
}
}