• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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.ide.common.layout.LayoutConstants.ANDROID_URI;
19 import static com.android.ide.common.layout.LayoutConstants.ATTR_ID;
20 import static com.android.ide.common.layout.LayoutConstants.VALUE_TRUE;
21 
22 import com.android.ide.common.api.Segment;
23 
24 /** A match is a potential pairing of two segments with a given {@link ConstraintType}. */
25 class Match {
26     /** the edge of the dragged node that is matched */
27     public final Segment with;
28 
29     /** the "other" edge that the dragged edge is matched with */
30     public final Segment edge;
31 
32     /** the signed distance between the matched edges */
33     public final int delta;
34 
35     /** the type of constraint this is a match for */
36     public final ConstraintType type;
37 
38     /** whether this {@link Match} results in a cycle */
39     public boolean cycle;
40 
41     /** The associated {@link GuidelineHander} which performed the match */
42     private final GuidelineHandler mHandler;
43 
44     /**
45      * Create a new match.
46      *
47      * @param handler the handler which performed the match
48      * @param edge the "other" edge that the dragged edge is matched with
49      * @param with the edge of the dragged node that is matched
50      * @param type the type of constraint this is a match for
51      * @param delta the signed distance between the matched edges
52      */
Match(GuidelineHandler handler, Segment edge, Segment with, ConstraintType type, int delta)53     public Match(GuidelineHandler handler, Segment edge, Segment with,
54             ConstraintType type, int delta) {
55         mHandler = handler;
56 
57         this.edge = edge;
58         this.with = with;
59         this.type = type;
60         this.delta = delta;
61     }
62 
63     /**
64      * Returns the XML constraint attribute value for this match
65      *
66      * @param generateId whether an id should be generated if one is missing
67      * @return the XML constraint attribute value for this match
68      */
getConstraint(boolean generateId)69     public String getConstraint(boolean generateId) {
70         if (type.targetParent) {
71             return type.name + '=' + VALUE_TRUE;
72         } else {
73             String id = edge.id;
74             if (id == null || id.length() == -1) {
75                 if (!generateId) {
76                     // Placeholder to display for the user during dragging
77                     id = "<generated>";
78                 } else {
79                     // Must generate an id on the fly!
80                     // See if it's been set by a different constraint we've already applied
81                     // to this same node
82                     id = edge.node.getStringAttr(ANDROID_URI, ATTR_ID);
83                     if (id == null || id.length() == 0) {
84                         id = mHandler.getRulesEngine().getUniqueId(edge.node.getFqcn());
85                         edge.node.setAttribute(ANDROID_URI, ATTR_ID, id);
86                     }
87                 }
88             }
89             return type.name + '=' + id;
90         }
91     }
92 
93     @Override
toString()94     public String toString() {
95         return "Match [type=" + type + ", delta=" + delta + ", edge=" + edge
96                 + "]";
97     }
98 }