180d9301c2e874b29889c41adb0623666cf534fa0Tor Norbye/* 280d9301c2e874b29889c41adb0623666cf534fa0Tor Norbye * Copyright (C) 2011 The Android Open Source Project 380d9301c2e874b29889c41adb0623666cf534fa0Tor Norbye * 480d9301c2e874b29889c41adb0623666cf534fa0Tor Norbye * Licensed under the Eclipse Public License, Version 1.0 (the "License"); 580d9301c2e874b29889c41adb0623666cf534fa0Tor Norbye * you may not use this file except in compliance with the License. 680d9301c2e874b29889c41adb0623666cf534fa0Tor Norbye * You may obtain a copy of the License at 780d9301c2e874b29889c41adb0623666cf534fa0Tor Norbye * 880d9301c2e874b29889c41adb0623666cf534fa0Tor Norbye * http://www.eclipse.org/org/documents/epl-v10.php 980d9301c2e874b29889c41adb0623666cf534fa0Tor Norbye * 1080d9301c2e874b29889c41adb0623666cf534fa0Tor Norbye * Unless required by applicable law or agreed to in writing, software 1180d9301c2e874b29889c41adb0623666cf534fa0Tor Norbye * distributed under the License is distributed on an "AS IS" BASIS, 1280d9301c2e874b29889c41adb0623666cf534fa0Tor Norbye * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1380d9301c2e874b29889c41adb0623666cf534fa0Tor Norbye * See the License for the specific language governing permissions and 1480d9301c2e874b29889c41adb0623666cf534fa0Tor Norbye * limitations under the License. 1580d9301c2e874b29889c41adb0623666cf534fa0Tor Norbye */ 1680d9301c2e874b29889c41adb0623666cf534fa0Tor Norbyepackage com.android.ide.common.layout.relative; 1780d9301c2e874b29889c41adb0623666cf534fa0Tor Norbye 1812d4581faa6438941e65a9dc83213be34c6ca970Tor Norbyeimport static com.android.SdkConstants.ATTR_ID; 1912d4581faa6438941e65a9dc83213be34c6ca970Tor Norbyeimport static com.android.SdkConstants.VALUE_TRUE; 2080d9301c2e874b29889c41adb0623666cf534fa0Tor Norbye 2112d4581faa6438941e65a9dc83213be34c6ca970Tor Norbye 2212d4581faa6438941e65a9dc83213be34c6ca970Tor Norbyeimport com.android.SdkConstants; 2312d4581faa6438941e65a9dc83213be34c6ca970Tor Norbyeimport static com.android.SdkConstants.ANDROID_URI; 2480d9301c2e874b29889c41adb0623666cf534fa0Tor Norbyeimport com.android.ide.common.api.Segment; 2580d9301c2e874b29889c41adb0623666cf534fa0Tor Norbye 2680d9301c2e874b29889c41adb0623666cf534fa0Tor Norbye/** A match is a potential pairing of two segments with a given {@link ConstraintType}. */ 2780d9301c2e874b29889c41adb0623666cf534fa0Tor Norbyeclass Match { 2880d9301c2e874b29889c41adb0623666cf534fa0Tor Norbye /** the edge of the dragged node that is matched */ 2980d9301c2e874b29889c41adb0623666cf534fa0Tor Norbye public final Segment with; 3080d9301c2e874b29889c41adb0623666cf534fa0Tor Norbye 3180d9301c2e874b29889c41adb0623666cf534fa0Tor Norbye /** the "other" edge that the dragged edge is matched with */ 3280d9301c2e874b29889c41adb0623666cf534fa0Tor Norbye public final Segment edge; 3380d9301c2e874b29889c41adb0623666cf534fa0Tor Norbye 3480d9301c2e874b29889c41adb0623666cf534fa0Tor Norbye /** the signed distance between the matched edges */ 3580d9301c2e874b29889c41adb0623666cf534fa0Tor Norbye public final int delta; 3680d9301c2e874b29889c41adb0623666cf534fa0Tor Norbye 3780d9301c2e874b29889c41adb0623666cf534fa0Tor Norbye /** the type of constraint this is a match for */ 3880d9301c2e874b29889c41adb0623666cf534fa0Tor Norbye public final ConstraintType type; 3980d9301c2e874b29889c41adb0623666cf534fa0Tor Norbye 4080d9301c2e874b29889c41adb0623666cf534fa0Tor Norbye /** whether this {@link Match} results in a cycle */ 4180d9301c2e874b29889c41adb0623666cf534fa0Tor Norbye public boolean cycle; 4280d9301c2e874b29889c41adb0623666cf534fa0Tor Norbye 430b95acc1693f67140e988567211c13ca2eb9f926Tor Norbye /** The associated {@link GuidelineHander} which performed the match */ 440b95acc1693f67140e988567211c13ca2eb9f926Tor Norbye private final GuidelineHandler mHandler; 450b95acc1693f67140e988567211c13ca2eb9f926Tor Norbye 4680d9301c2e874b29889c41adb0623666cf534fa0Tor Norbye /** 4780d9301c2e874b29889c41adb0623666cf534fa0Tor Norbye * Create a new match. 4880d9301c2e874b29889c41adb0623666cf534fa0Tor Norbye * 490b95acc1693f67140e988567211c13ca2eb9f926Tor Norbye * @param handler the handler which performed the match 5080d9301c2e874b29889c41adb0623666cf534fa0Tor Norbye * @param edge the "other" edge that the dragged edge is matched with 5180d9301c2e874b29889c41adb0623666cf534fa0Tor Norbye * @param with the edge of the dragged node that is matched 5280d9301c2e874b29889c41adb0623666cf534fa0Tor Norbye * @param type the type of constraint this is a match for 5380d9301c2e874b29889c41adb0623666cf534fa0Tor Norbye * @param delta the signed distance between the matched edges 5480d9301c2e874b29889c41adb0623666cf534fa0Tor Norbye */ 550b95acc1693f67140e988567211c13ca2eb9f926Tor Norbye public Match(GuidelineHandler handler, Segment edge, Segment with, 560b95acc1693f67140e988567211c13ca2eb9f926Tor Norbye ConstraintType type, int delta) { 570b95acc1693f67140e988567211c13ca2eb9f926Tor Norbye mHandler = handler; 580b95acc1693f67140e988567211c13ca2eb9f926Tor Norbye 5980d9301c2e874b29889c41adb0623666cf534fa0Tor Norbye this.edge = edge; 6080d9301c2e874b29889c41adb0623666cf534fa0Tor Norbye this.with = with; 6180d9301c2e874b29889c41adb0623666cf534fa0Tor Norbye this.type = type; 6280d9301c2e874b29889c41adb0623666cf534fa0Tor Norbye this.delta = delta; 6380d9301c2e874b29889c41adb0623666cf534fa0Tor Norbye } 6480d9301c2e874b29889c41adb0623666cf534fa0Tor Norbye 6580d9301c2e874b29889c41adb0623666cf534fa0Tor Norbye /** 6680d9301c2e874b29889c41adb0623666cf534fa0Tor Norbye * Returns the XML constraint attribute value for this match 6780d9301c2e874b29889c41adb0623666cf534fa0Tor Norbye * 680b95acc1693f67140e988567211c13ca2eb9f926Tor Norbye * @param generateId whether an id should be generated if one is missing 6980d9301c2e874b29889c41adb0623666cf534fa0Tor Norbye * @return the XML constraint attribute value for this match 7080d9301c2e874b29889c41adb0623666cf534fa0Tor Norbye */ 710b95acc1693f67140e988567211c13ca2eb9f926Tor Norbye public String getConstraint(boolean generateId) { 7280d9301c2e874b29889c41adb0623666cf534fa0Tor Norbye if (type.targetParent) { 7380d9301c2e874b29889c41adb0623666cf534fa0Tor Norbye return type.name + '=' + VALUE_TRUE; 7480d9301c2e874b29889c41adb0623666cf534fa0Tor Norbye } else { 7580d9301c2e874b29889c41adb0623666cf534fa0Tor Norbye String id = edge.id; 760b95acc1693f67140e988567211c13ca2eb9f926Tor Norbye if (id == null || id.length() == -1) { 770b95acc1693f67140e988567211c13ca2eb9f926Tor Norbye if (!generateId) { 780b95acc1693f67140e988567211c13ca2eb9f926Tor Norbye // Placeholder to display for the user during dragging 790b95acc1693f67140e988567211c13ca2eb9f926Tor Norbye id = "<generated>"; 800b95acc1693f67140e988567211c13ca2eb9f926Tor Norbye } else { 810b95acc1693f67140e988567211c13ca2eb9f926Tor Norbye // Must generate an id on the fly! 820b95acc1693f67140e988567211c13ca2eb9f926Tor Norbye // See if it's been set by a different constraint we've already applied 830b95acc1693f67140e988567211c13ca2eb9f926Tor Norbye // to this same node 840b95acc1693f67140e988567211c13ca2eb9f926Tor Norbye id = edge.node.getStringAttr(ANDROID_URI, ATTR_ID); 850b95acc1693f67140e988567211c13ca2eb9f926Tor Norbye if (id == null || id.length() == 0) { 860b95acc1693f67140e988567211c13ca2eb9f926Tor Norbye id = mHandler.getRulesEngine().getUniqueId(edge.node.getFqcn()); 870b95acc1693f67140e988567211c13ca2eb9f926Tor Norbye edge.node.setAttribute(ANDROID_URI, ATTR_ID, id); 880b95acc1693f67140e988567211c13ca2eb9f926Tor Norbye } 890b95acc1693f67140e988567211c13ca2eb9f926Tor Norbye } 900b95acc1693f67140e988567211c13ca2eb9f926Tor Norbye } 9180d9301c2e874b29889c41adb0623666cf534fa0Tor Norbye return type.name + '=' + id; 9280d9301c2e874b29889c41adb0623666cf534fa0Tor Norbye } 9380d9301c2e874b29889c41adb0623666cf534fa0Tor Norbye } 9480d9301c2e874b29889c41adb0623666cf534fa0Tor Norbye 9580d9301c2e874b29889c41adb0623666cf534fa0Tor Norbye @Override 9680d9301c2e874b29889c41adb0623666cf534fa0Tor Norbye public String toString() { 9780d9301c2e874b29889c41adb0623666cf534fa0Tor Norbye return "Match [type=" + type + ", delta=" + delta + ", edge=" + edge 9880d9301c2e874b29889c41adb0623666cf534fa0Tor Norbye + "]"; 9980d9301c2e874b29889c41adb0623666cf534fa0Tor Norbye } 100a881b0b34678ad76c9f5eba62fac7a00a22ac606Tor Norbye} 101