Home | History | Annotate | Download | only in relative
      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      */
     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      */
     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
     96     public String toString() {
     97         return "Match [type=" + type + ", delta=" + delta + ", edge=" + edge
     98                 + "]";
     99     }
    100 }
    101