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