/* * Copyright (C) 2011 The Android Open Source Project * * Licensed under the Eclipse Public License, Version 1.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.eclipse.org/org/documents/epl-v10.php * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.android.ide.common.layout.relative; import static com.android.SdkConstants.ATTR_ID; import static com.android.SdkConstants.VALUE_TRUE; import com.android.SdkConstants; import static com.android.SdkConstants.ANDROID_URI; import com.android.ide.common.api.Segment; /** A match is a potential pairing of two segments with a given {@link ConstraintType}. */ class Match { /** the edge of the dragged node that is matched */ public final Segment with; /** the "other" edge that the dragged edge is matched with */ public final Segment edge; /** the signed distance between the matched edges */ public final int delta; /** the type of constraint this is a match for */ public final ConstraintType type; /** whether this {@link Match} results in a cycle */ public boolean cycle; /** The associated {@link GuidelineHander} which performed the match */ private final GuidelineHandler mHandler; /** * Create a new match. * * @param handler the handler which performed the match * @param edge the "other" edge that the dragged edge is matched with * @param with the edge of the dragged node that is matched * @param type the type of constraint this is a match for * @param delta the signed distance between the matched edges */ public Match(GuidelineHandler handler, Segment edge, Segment with, ConstraintType type, int delta) { mHandler = handler; this.edge = edge; this.with = with; this.type = type; this.delta = delta; } /** * Returns the XML constraint attribute value for this match * * @param generateId whether an id should be generated if one is missing * @return the XML constraint attribute value for this match */ public String getConstraint(boolean generateId) { if (type.targetParent) { return type.name + '=' + VALUE_TRUE; } else { String id = edge.id; if (id == null || id.length() == -1) { if (!generateId) { // Placeholder to display for the user during dragging id = "<generated>"; } else { // Must generate an id on the fly! // See if it's been set by a different constraint we've already applied // to this same node id = edge.node.getStringAttr(ANDROID_URI, ATTR_ID); if (id == null || id.length() == 0) { id = mHandler.getRulesEngine().getUniqueId(edge.node.getFqcn()); edge.node.setAttribute(ANDROID_URI, ATTR_ID, id); } } } return type.name + '=' + id; } } @Override public String toString() { return "Match [type=" + type + ", delta=" + delta + ", edge=" + edge + "]"; } }