1 /* 2 * Copyright (C) 2011 The Android Open Source Project 3 * 4 * Licensed under the Eclipse Public License, Version 1.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.eclipse.org/org/documents/epl-v10.php 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 package com.android.ide.common.layout.relative; 17 18 import static com.android.SdkConstants.ATTR_ID; 19 import static com.android.SdkConstants.VALUE_TRUE; 20 21 22 import com.android.SdkConstants; 23 import static com.android.SdkConstants.ANDROID_URI; 24 import com.android.ide.common.api.Segment; 25 26 /** A match is a potential pairing of two segments with a given {@link ConstraintType}. */ 27 class Match { 28 /** the edge of the dragged node that is matched */ 29 public final Segment with; 30 31 /** the "other" edge that the dragged edge is matched with */ 32 public final Segment edge; 33 34 /** the signed distance between the matched edges */ 35 public final int delta; 36 37 /** the type of constraint this is a match for */ 38 public final ConstraintType type; 39 40 /** whether this {@link Match} results in a cycle */ 41 public boolean cycle; 42 43 /** The associated {@link GuidelineHander} which performed the match */ 44 private final GuidelineHandler mHandler; 45 46 /** 47 * Create a new match. 48 * 49 * @param handler the handler which performed the match 50 * @param edge the "other" edge that the dragged edge is matched with 51 * @param with the edge of the dragged node that is matched 52 * @param type the type of constraint this is a match for 53 * @param delta the signed distance between the matched edges 54 */ Match(GuidelineHandler handler, Segment edge, Segment with, ConstraintType type, int delta)55 public Match(GuidelineHandler handler, Segment edge, Segment with, 56 ConstraintType type, int delta) { 57 mHandler = handler; 58 59 this.edge = edge; 60 this.with = with; 61 this.type = type; 62 this.delta = delta; 63 } 64 65 /** 66 * Returns the XML constraint attribute value for this match 67 * 68 * @param generateId whether an id should be generated if one is missing 69 * @return the XML constraint attribute value for this match 70 */ getConstraint(boolean generateId)71 public String getConstraint(boolean generateId) { 72 if (type.targetParent) { 73 return type.name + '=' + VALUE_TRUE; 74 } else { 75 String id = edge.id; 76 if (id == null || id.length() == -1) { 77 if (!generateId) { 78 // Placeholder to display for the user during dragging 79 id = "<generated>"; 80 } else { 81 // Must generate an id on the fly! 82 // See if it's been set by a different constraint we've already applied 83 // to this same node 84 id = edge.node.getStringAttr(ANDROID_URI, ATTR_ID); 85 if (id == null || id.length() == 0) { 86 id = mHandler.getRulesEngine().getUniqueId(edge.node.getFqcn()); 87 edge.node.setAttribute(ANDROID_URI, ATTR_ID, id); 88 } 89 } 90 } 91 return type.name + '=' + id; 92 } 93 } 94 95 @Override toString()96 public String toString() { 97 return "Match [type=" + type + ", delta=" + delta + ", edge=" + edge 98 + "]"; 99 } 100 } 101