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
1880d9301c2e874b29889c41adb0623666cf534fa0Tor Norbyeimport static com.android.ide.common.api.SegmentType.BASELINE;
1980d9301c2e874b29889c41adb0623666cf534fa0Tor Norbyeimport static com.android.ide.common.api.SegmentType.BOTTOM;
2080d9301c2e874b29889c41adb0623666cf534fa0Tor Norbyeimport static com.android.ide.common.api.SegmentType.CENTER_HORIZONTAL;
2180d9301c2e874b29889c41adb0623666cf534fa0Tor Norbyeimport static com.android.ide.common.api.SegmentType.CENTER_VERTICAL;
2280d9301c2e874b29889c41adb0623666cf534fa0Tor Norbyeimport static com.android.ide.common.api.SegmentType.LEFT;
2380d9301c2e874b29889c41adb0623666cf534fa0Tor Norbyeimport static com.android.ide.common.api.SegmentType.RIGHT;
2480d9301c2e874b29889c41adb0623666cf534fa0Tor Norbyeimport static com.android.ide.common.api.SegmentType.TOP;
2580d9301c2e874b29889c41adb0623666cf534fa0Tor Norbyeimport static com.android.ide.common.api.SegmentType.UNKNOWN;
2612d4581faa6438941e65a9dc83213be34c6ca970Tor Norbyeimport static com.android.SdkConstants.ATTR_LAYOUT_ABOVE;
2712d4581faa6438941e65a9dc83213be34c6ca970Tor Norbyeimport static com.android.SdkConstants.ATTR_LAYOUT_ALIGN_BASELINE;
2812d4581faa6438941e65a9dc83213be34c6ca970Tor Norbyeimport static com.android.SdkConstants.ATTR_LAYOUT_ALIGN_BOTTOM;
2912d4581faa6438941e65a9dc83213be34c6ca970Tor Norbyeimport static com.android.SdkConstants.ATTR_LAYOUT_ALIGN_LEFT;
3012d4581faa6438941e65a9dc83213be34c6ca970Tor Norbyeimport static com.android.SdkConstants.ATTR_LAYOUT_ALIGN_PARENT_BOTTOM;
3112d4581faa6438941e65a9dc83213be34c6ca970Tor Norbyeimport static com.android.SdkConstants.ATTR_LAYOUT_ALIGN_PARENT_LEFT;
3212d4581faa6438941e65a9dc83213be34c6ca970Tor Norbyeimport static com.android.SdkConstants.ATTR_LAYOUT_ALIGN_PARENT_RIGHT;
3312d4581faa6438941e65a9dc83213be34c6ca970Tor Norbyeimport static com.android.SdkConstants.ATTR_LAYOUT_ALIGN_PARENT_TOP;
3412d4581faa6438941e65a9dc83213be34c6ca970Tor Norbyeimport static com.android.SdkConstants.ATTR_LAYOUT_ALIGN_RIGHT;
3512d4581faa6438941e65a9dc83213be34c6ca970Tor Norbyeimport static com.android.SdkConstants.ATTR_LAYOUT_ALIGN_TOP;
3612d4581faa6438941e65a9dc83213be34c6ca970Tor Norbyeimport static com.android.SdkConstants.ATTR_LAYOUT_BELOW;
3712d4581faa6438941e65a9dc83213be34c6ca970Tor Norbyeimport static com.android.SdkConstants.ATTR_LAYOUT_CENTER_HORIZONTAL;
3812d4581faa6438941e65a9dc83213be34c6ca970Tor Norbyeimport static com.android.SdkConstants.ATTR_LAYOUT_CENTER_IN_PARENT;
3912d4581faa6438941e65a9dc83213be34c6ca970Tor Norbyeimport static com.android.SdkConstants.ATTR_LAYOUT_CENTER_VERTICAL;
4012d4581faa6438941e65a9dc83213be34c6ca970Tor Norbyeimport static com.android.SdkConstants.ATTR_LAYOUT_TO_LEFT_OF;
4112d4581faa6438941e65a9dc83213be34c6ca970Tor Norbyeimport static com.android.SdkConstants.ATTR_LAYOUT_TO_RIGHT_OF;
4280d9301c2e874b29889c41adb0623666cf534fa0Tor Norbye
430cb8e647ef345f5c2a6b7eb08b517421131bca4eTor Norbyeimport com.android.annotations.NonNull;
440cb8e647ef345f5c2a6b7eb08b517421131bca4eTor Norbyeimport com.android.annotations.Nullable;
4580d9301c2e874b29889c41adb0623666cf534fa0Tor Norbyeimport com.android.ide.common.api.SegmentType;
4680d9301c2e874b29889c41adb0623666cf534fa0Tor Norbye
4780d9301c2e874b29889c41adb0623666cf534fa0Tor Norbyeimport java.util.HashMap;
4880d9301c2e874b29889c41adb0623666cf534fa0Tor Norbyeimport java.util.Map;
4980d9301c2e874b29889c41adb0623666cf534fa0Tor Norbye
5080d9301c2e874b29889c41adb0623666cf534fa0Tor Norbye/**
5180d9301c2e874b29889c41adb0623666cf534fa0Tor Norbye * Each constraint type corresponds to a type of constraint available for the
5280d9301c2e874b29889c41adb0623666cf534fa0Tor Norbye * RelativeLayout; for example, {@link #LAYOUT_ABOVE} corresponds to the layout_above constraint.
5380d9301c2e874b29889c41adb0623666cf534fa0Tor Norbye */
5480d9301c2e874b29889c41adb0623666cf534fa0Tor Norbyeenum ConstraintType {
5580d9301c2e874b29889c41adb0623666cf534fa0Tor Norbye    LAYOUT_ABOVE(ATTR_LAYOUT_ABOVE,
5680d9301c2e874b29889c41adb0623666cf534fa0Tor Norbye            null /* sourceX */, BOTTOM, null /* targetX */, TOP,
5780d9301c2e874b29889c41adb0623666cf534fa0Tor Norbye            false /* targetParent */, true /* horizontalEdge */, false /* verticalEdge */,
5880d9301c2e874b29889c41adb0623666cf534fa0Tor Norbye            true /* relativeToMargin */),
5980d9301c2e874b29889c41adb0623666cf534fa0Tor Norbye
6080d9301c2e874b29889c41adb0623666cf534fa0Tor Norbye    LAYOUT_BELOW(ATTR_LAYOUT_BELOW, null, TOP, null, BOTTOM, false, true, false, true),
6180d9301c2e874b29889c41adb0623666cf534fa0Tor Norbye    ALIGN_TOP(ATTR_LAYOUT_ALIGN_TOP, null, TOP, null, TOP, false, true, false, false),
6280d9301c2e874b29889c41adb0623666cf534fa0Tor Norbye    ALIGN_BOTTOM(ATTR_LAYOUT_ALIGN_BOTTOM, null, BOTTOM, null, BOTTOM, false, true, false, false),
6380d9301c2e874b29889c41adb0623666cf534fa0Tor Norbye    ALIGN_LEFT(ATTR_LAYOUT_ALIGN_LEFT, LEFT, null, LEFT, null, false, false, true, false),
6480d9301c2e874b29889c41adb0623666cf534fa0Tor Norbye    ALIGN_RIGHT(ATTR_LAYOUT_ALIGN_RIGHT, RIGHT, null, RIGHT, null, false, false, true, false),
6580d9301c2e874b29889c41adb0623666cf534fa0Tor Norbye    LAYOUT_LEFT_OF(ATTR_LAYOUT_TO_LEFT_OF, RIGHT, null, LEFT, null, false, false, true, true),
6680d9301c2e874b29889c41adb0623666cf534fa0Tor Norbye    LAYOUT_RIGHT_OF(ATTR_LAYOUT_TO_RIGHT_OF, LEFT, null, RIGHT, null, false, false, true, true),
6780d9301c2e874b29889c41adb0623666cf534fa0Tor Norbye    ALIGN_PARENT_TOP(ATTR_LAYOUT_ALIGN_PARENT_TOP, null, TOP, null, TOP, true, true, false, false),
6880d9301c2e874b29889c41adb0623666cf534fa0Tor Norbye    ALIGN_BASELINE(ATTR_LAYOUT_ALIGN_BASELINE, null, BASELINE, null, BASELINE, false, true, false,
6980d9301c2e874b29889c41adb0623666cf534fa0Tor Norbye            false),
7080d9301c2e874b29889c41adb0623666cf534fa0Tor Norbye    ALIGN_PARENT_LEFT(ATTR_LAYOUT_ALIGN_PARENT_LEFT, LEFT, null, LEFT, null, true, false, true,
7180d9301c2e874b29889c41adb0623666cf534fa0Tor Norbye            false),
7280d9301c2e874b29889c41adb0623666cf534fa0Tor Norbye    ALIGN_PARENT_RIGHT(ATTR_LAYOUT_ALIGN_PARENT_RIGHT, RIGHT, null, RIGHT, null, true, false, true,
7380d9301c2e874b29889c41adb0623666cf534fa0Tor Norbye            false),
7480d9301c2e874b29889c41adb0623666cf534fa0Tor Norbye    ALIGN_PARENT_BOTTOM(ATTR_LAYOUT_ALIGN_PARENT_BOTTOM, null, BOTTOM, null, BOTTOM, true, true,
7580d9301c2e874b29889c41adb0623666cf534fa0Tor Norbye            false, false),
7680d9301c2e874b29889c41adb0623666cf534fa0Tor Norbye    LAYOUT_CENTER_HORIZONTAL(ATTR_LAYOUT_CENTER_HORIZONTAL, CENTER_VERTICAL, null, CENTER_VERTICAL,
7780d9301c2e874b29889c41adb0623666cf534fa0Tor Norbye            null, true, true, false, false),
7880d9301c2e874b29889c41adb0623666cf534fa0Tor Norbye    LAYOUT_CENTER_VERTICAL(ATTR_LAYOUT_CENTER_VERTICAL, null, CENTER_HORIZONTAL, null,
7980d9301c2e874b29889c41adb0623666cf534fa0Tor Norbye            CENTER_HORIZONTAL, true, false, true, false),
8080d9301c2e874b29889c41adb0623666cf534fa0Tor Norbye    LAYOUT_CENTER_IN_PARENT(ATTR_LAYOUT_CENTER_IN_PARENT, CENTER_VERTICAL, CENTER_HORIZONTAL,
8180d9301c2e874b29889c41adb0623666cf534fa0Tor Norbye            CENTER_VERTICAL, CENTER_HORIZONTAL, true, true, true, false);
8280d9301c2e874b29889c41adb0623666cf534fa0Tor Norbye
8380d9301c2e874b29889c41adb0623666cf534fa0Tor Norbye    private ConstraintType(String name, SegmentType sourceSegmentTypeX,
8480d9301c2e874b29889c41adb0623666cf534fa0Tor Norbye            SegmentType sourceSegmentTypeY, SegmentType targetSegmentTypeX,
8580d9301c2e874b29889c41adb0623666cf534fa0Tor Norbye            SegmentType targetSegmentTypeY, boolean targetParent, boolean horizontalEdge,
8680d9301c2e874b29889c41adb0623666cf534fa0Tor Norbye            boolean verticalEdge, boolean relativeToMargin) {
8780d9301c2e874b29889c41adb0623666cf534fa0Tor Norbye        assert horizontalEdge || verticalEdge;
8880d9301c2e874b29889c41adb0623666cf534fa0Tor Norbye
8980d9301c2e874b29889c41adb0623666cf534fa0Tor Norbye        this.name = name;
9080d9301c2e874b29889c41adb0623666cf534fa0Tor Norbye        this.sourceSegmentTypeX = sourceSegmentTypeX != null ? sourceSegmentTypeX : UNKNOWN;
9180d9301c2e874b29889c41adb0623666cf534fa0Tor Norbye        this.sourceSegmentTypeY = sourceSegmentTypeY != null ? sourceSegmentTypeY : UNKNOWN;
9280d9301c2e874b29889c41adb0623666cf534fa0Tor Norbye        this.targetSegmentTypeX = targetSegmentTypeX != null ? targetSegmentTypeX : UNKNOWN;
9380d9301c2e874b29889c41adb0623666cf534fa0Tor Norbye        this.targetSegmentTypeY = targetSegmentTypeY != null ? targetSegmentTypeY : UNKNOWN;
9480d9301c2e874b29889c41adb0623666cf534fa0Tor Norbye        this.targetParent = targetParent;
9580d9301c2e874b29889c41adb0623666cf534fa0Tor Norbye        this.horizontalEdge = horizontalEdge;
9680d9301c2e874b29889c41adb0623666cf534fa0Tor Norbye        this.verticalEdge = verticalEdge;
9780d9301c2e874b29889c41adb0623666cf534fa0Tor Norbye        this.relativeToMargin = relativeToMargin;
9880d9301c2e874b29889c41adb0623666cf534fa0Tor Norbye    }
9980d9301c2e874b29889c41adb0623666cf534fa0Tor Norbye
10080d9301c2e874b29889c41adb0623666cf534fa0Tor Norbye    /** The attribute name of the constraint */
10180d9301c2e874b29889c41adb0623666cf534fa0Tor Norbye    public final String name;
10280d9301c2e874b29889c41adb0623666cf534fa0Tor Norbye
10380d9301c2e874b29889c41adb0623666cf534fa0Tor Norbye    /** The horizontal position of the source of the constraint */
10480d9301c2e874b29889c41adb0623666cf534fa0Tor Norbye    public final SegmentType sourceSegmentTypeX;
10580d9301c2e874b29889c41adb0623666cf534fa0Tor Norbye
10680d9301c2e874b29889c41adb0623666cf534fa0Tor Norbye    /** The vertical position of the source of the constraint */
10780d9301c2e874b29889c41adb0623666cf534fa0Tor Norbye    public final SegmentType sourceSegmentTypeY;
10880d9301c2e874b29889c41adb0623666cf534fa0Tor Norbye
10980d9301c2e874b29889c41adb0623666cf534fa0Tor Norbye    /** The horizontal position of the target of the constraint */
11080d9301c2e874b29889c41adb0623666cf534fa0Tor Norbye    public final SegmentType targetSegmentTypeX;
11180d9301c2e874b29889c41adb0623666cf534fa0Tor Norbye
11280d9301c2e874b29889c41adb0623666cf534fa0Tor Norbye    /** The vertical position of the target of the constraint */
11380d9301c2e874b29889c41adb0623666cf534fa0Tor Norbye    public final SegmentType targetSegmentTypeY;
11480d9301c2e874b29889c41adb0623666cf534fa0Tor Norbye
11580d9301c2e874b29889c41adb0623666cf534fa0Tor Norbye    /**
11680d9301c2e874b29889c41adb0623666cf534fa0Tor Norbye     * If true, the constraint targets the parent layout, otherwise it targets another
11780d9301c2e874b29889c41adb0623666cf534fa0Tor Norbye     * view
11880d9301c2e874b29889c41adb0623666cf534fa0Tor Norbye     */
11980d9301c2e874b29889c41adb0623666cf534fa0Tor Norbye    public final boolean targetParent;
12080d9301c2e874b29889c41adb0623666cf534fa0Tor Norbye
12180d9301c2e874b29889c41adb0623666cf534fa0Tor Norbye    /** If true, this constraint affects the horizontal dimension */
12280d9301c2e874b29889c41adb0623666cf534fa0Tor Norbye    public final boolean horizontalEdge;
12380d9301c2e874b29889c41adb0623666cf534fa0Tor Norbye
12480d9301c2e874b29889c41adb0623666cf534fa0Tor Norbye    /** If true, this constraint affects the vertical dimension */
12580d9301c2e874b29889c41adb0623666cf534fa0Tor Norbye    public final boolean verticalEdge;
12680d9301c2e874b29889c41adb0623666cf534fa0Tor Norbye
12780d9301c2e874b29889c41adb0623666cf534fa0Tor Norbye    /**
12880d9301c2e874b29889c41adb0623666cf534fa0Tor Norbye     * Whether this constraint is relative to the margin bounds of the node rather than
12980d9301c2e874b29889c41adb0623666cf534fa0Tor Norbye     * the node's actual bounds
13080d9301c2e874b29889c41adb0623666cf534fa0Tor Norbye     */
13180d9301c2e874b29889c41adb0623666cf534fa0Tor Norbye    public final boolean relativeToMargin;
13280d9301c2e874b29889c41adb0623666cf534fa0Tor Norbye
13380d9301c2e874b29889c41adb0623666cf534fa0Tor Norbye    /** Map from attribute name to constraint type */
13480d9301c2e874b29889c41adb0623666cf534fa0Tor Norbye    private static Map<String, ConstraintType> sNameToType;
13580d9301c2e874b29889c41adb0623666cf534fa0Tor Norbye
13680d9301c2e874b29889c41adb0623666cf534fa0Tor Norbye    /**
13780d9301c2e874b29889c41adb0623666cf534fa0Tor Norbye     * Returns the {@link ConstraintType} corresponding to the given attribute name, or
13880d9301c2e874b29889c41adb0623666cf534fa0Tor Norbye     * null if not found.
13980d9301c2e874b29889c41adb0623666cf534fa0Tor Norbye     *
14080d9301c2e874b29889c41adb0623666cf534fa0Tor Norbye     * @param attribute the name of the attribute to look up
14180d9301c2e874b29889c41adb0623666cf534fa0Tor Norbye     * @return the corresponding {@link ConstraintType}
14280d9301c2e874b29889c41adb0623666cf534fa0Tor Norbye     */
1430cb8e647ef345f5c2a6b7eb08b517421131bca4eTor Norbye    @Nullable
1440cb8e647ef345f5c2a6b7eb08b517421131bca4eTor Norbye    public static ConstraintType fromAttribute(@NonNull String attribute) {
14580d9301c2e874b29889c41adb0623666cf534fa0Tor Norbye        if (sNameToType == null) {
14680d9301c2e874b29889c41adb0623666cf534fa0Tor Norbye            ConstraintType[] types = ConstraintType.values();
14742b2f34604a3f8e8ac191831d8f01a0498760d38Tor Norbye            Map<String, ConstraintType> map = new HashMap<String, ConstraintType>(types.length);
14880d9301c2e874b29889c41adb0623666cf534fa0Tor Norbye            for (ConstraintType type : types) {
14942b2f34604a3f8e8ac191831d8f01a0498760d38Tor Norbye                map.put(type.name, type);
15080d9301c2e874b29889c41adb0623666cf534fa0Tor Norbye            }
15142b2f34604a3f8e8ac191831d8f01a0498760d38Tor Norbye            sNameToType = map;
15280d9301c2e874b29889c41adb0623666cf534fa0Tor Norbye        }
15380d9301c2e874b29889c41adb0623666cf534fa0Tor Norbye        return sNameToType.get(attribute);
15480d9301c2e874b29889c41adb0623666cf534fa0Tor Norbye    }
15580d9301c2e874b29889c41adb0623666cf534fa0Tor Norbye
15680d9301c2e874b29889c41adb0623666cf534fa0Tor Norbye    /**
15780d9301c2e874b29889c41adb0623666cf534fa0Tor Norbye     * Returns true if this constraint type represents a constraint where the target edge
15880d9301c2e874b29889c41adb0623666cf534fa0Tor Norbye     * is one of the parent edges (actual edge, not center/baseline segments)
15980d9301c2e874b29889c41adb0623666cf534fa0Tor Norbye     *
16080d9301c2e874b29889c41adb0623666cf534fa0Tor Norbye     * @return true if the target segment is a parent edge
16180d9301c2e874b29889c41adb0623666cf534fa0Tor Norbye     */
16280d9301c2e874b29889c41adb0623666cf534fa0Tor Norbye    public boolean isRelativeToParentEdge() {
16380d9301c2e874b29889c41adb0623666cf534fa0Tor Norbye        return this == ALIGN_PARENT_LEFT || this == ALIGN_PARENT_RIGHT || this == ALIGN_PARENT_TOP
16480d9301c2e874b29889c41adb0623666cf534fa0Tor Norbye                || this == ALIGN_PARENT_BOTTOM;
16580d9301c2e874b29889c41adb0623666cf534fa0Tor Norbye    }
16680d9301c2e874b29889c41adb0623666cf534fa0Tor Norbye
16780d9301c2e874b29889c41adb0623666cf534fa0Tor Norbye    /**
16880d9301c2e874b29889c41adb0623666cf534fa0Tor Norbye     * Returns a {@link ConstraintType} for a potential match of edges.
16980d9301c2e874b29889c41adb0623666cf534fa0Tor Norbye     *
17080d9301c2e874b29889c41adb0623666cf534fa0Tor Norbye     * @param withParent if true, the target is the parent
17180d9301c2e874b29889c41adb0623666cf534fa0Tor Norbye     * @param from the source edge
17280d9301c2e874b29889c41adb0623666cf534fa0Tor Norbye     * @param to the target edge
17380d9301c2e874b29889c41adb0623666cf534fa0Tor Norbye     * @return a {@link ConstraintType}, or null
17480d9301c2e874b29889c41adb0623666cf534fa0Tor Norbye     */
1750cb8e647ef345f5c2a6b7eb08b517421131bca4eTor Norbye    @Nullable
17680d9301c2e874b29889c41adb0623666cf534fa0Tor Norbye    public static ConstraintType forMatch(boolean withParent, SegmentType from, SegmentType to) {
17780d9301c2e874b29889c41adb0623666cf534fa0Tor Norbye        // Attached to parent edge?
17880d9301c2e874b29889c41adb0623666cf534fa0Tor Norbye        if (withParent) {
17980d9301c2e874b29889c41adb0623666cf534fa0Tor Norbye            switch (from) {
18080d9301c2e874b29889c41adb0623666cf534fa0Tor Norbye                case TOP:
18180d9301c2e874b29889c41adb0623666cf534fa0Tor Norbye                    return ALIGN_PARENT_TOP;
18280d9301c2e874b29889c41adb0623666cf534fa0Tor Norbye                case BOTTOM:
18380d9301c2e874b29889c41adb0623666cf534fa0Tor Norbye                    return ALIGN_PARENT_BOTTOM;
18480d9301c2e874b29889c41adb0623666cf534fa0Tor Norbye                case LEFT:
18580d9301c2e874b29889c41adb0623666cf534fa0Tor Norbye                    return ALIGN_PARENT_LEFT;
18680d9301c2e874b29889c41adb0623666cf534fa0Tor Norbye                case RIGHT:
18780d9301c2e874b29889c41adb0623666cf534fa0Tor Norbye                    return ALIGN_PARENT_RIGHT;
18880d9301c2e874b29889c41adb0623666cf534fa0Tor Norbye                case CENTER_HORIZONTAL:
18980d9301c2e874b29889c41adb0623666cf534fa0Tor Norbye                    return LAYOUT_CENTER_VERTICAL;
19080d9301c2e874b29889c41adb0623666cf534fa0Tor Norbye                case CENTER_VERTICAL:
19180d9301c2e874b29889c41adb0623666cf534fa0Tor Norbye                    return LAYOUT_CENTER_HORIZONTAL;
19280d9301c2e874b29889c41adb0623666cf534fa0Tor Norbye            }
19380d9301c2e874b29889c41adb0623666cf534fa0Tor Norbye
19480d9301c2e874b29889c41adb0623666cf534fa0Tor Norbye            return null;
19580d9301c2e874b29889c41adb0623666cf534fa0Tor Norbye        }
19680d9301c2e874b29889c41adb0623666cf534fa0Tor Norbye
19780d9301c2e874b29889c41adb0623666cf534fa0Tor Norbye        // Attached to some other node.
19880d9301c2e874b29889c41adb0623666cf534fa0Tor Norbye        switch (from) {
19980d9301c2e874b29889c41adb0623666cf534fa0Tor Norbye            case TOP:
20080d9301c2e874b29889c41adb0623666cf534fa0Tor Norbye                switch (to) {
20180d9301c2e874b29889c41adb0623666cf534fa0Tor Norbye                    case TOP:
20280d9301c2e874b29889c41adb0623666cf534fa0Tor Norbye                        return ALIGN_TOP;
20380d9301c2e874b29889c41adb0623666cf534fa0Tor Norbye                    case BOTTOM:
20480d9301c2e874b29889c41adb0623666cf534fa0Tor Norbye                        return LAYOUT_BELOW;
20580d9301c2e874b29889c41adb0623666cf534fa0Tor Norbye                    case BASELINE:
20680d9301c2e874b29889c41adb0623666cf534fa0Tor Norbye                        return ALIGN_BASELINE;
20780d9301c2e874b29889c41adb0623666cf534fa0Tor Norbye                }
20880d9301c2e874b29889c41adb0623666cf534fa0Tor Norbye                break;
20980d9301c2e874b29889c41adb0623666cf534fa0Tor Norbye            case BOTTOM:
21080d9301c2e874b29889c41adb0623666cf534fa0Tor Norbye                switch (to) {
21180d9301c2e874b29889c41adb0623666cf534fa0Tor Norbye                    case TOP:
21280d9301c2e874b29889c41adb0623666cf534fa0Tor Norbye                        return LAYOUT_ABOVE;
21380d9301c2e874b29889c41adb0623666cf534fa0Tor Norbye                    case BOTTOM:
21480d9301c2e874b29889c41adb0623666cf534fa0Tor Norbye                        return ALIGN_BOTTOM;
21580d9301c2e874b29889c41adb0623666cf534fa0Tor Norbye                    case BASELINE:
21680d9301c2e874b29889c41adb0623666cf534fa0Tor Norbye                        return ALIGN_BASELINE;
21780d9301c2e874b29889c41adb0623666cf534fa0Tor Norbye                }
21880d9301c2e874b29889c41adb0623666cf534fa0Tor Norbye                break;
21980d9301c2e874b29889c41adb0623666cf534fa0Tor Norbye            case LEFT:
22080d9301c2e874b29889c41adb0623666cf534fa0Tor Norbye                switch (to) {
22180d9301c2e874b29889c41adb0623666cf534fa0Tor Norbye                    case LEFT:
22280d9301c2e874b29889c41adb0623666cf534fa0Tor Norbye                        return ALIGN_LEFT;
22380d9301c2e874b29889c41adb0623666cf534fa0Tor Norbye                    case RIGHT:
22480d9301c2e874b29889c41adb0623666cf534fa0Tor Norbye                        return LAYOUT_RIGHT_OF;
22580d9301c2e874b29889c41adb0623666cf534fa0Tor Norbye                }
22680d9301c2e874b29889c41adb0623666cf534fa0Tor Norbye                break;
22780d9301c2e874b29889c41adb0623666cf534fa0Tor Norbye            case RIGHT:
22880d9301c2e874b29889c41adb0623666cf534fa0Tor Norbye                switch (to) {
22980d9301c2e874b29889c41adb0623666cf534fa0Tor Norbye                    case LEFT:
23080d9301c2e874b29889c41adb0623666cf534fa0Tor Norbye                        return LAYOUT_LEFT_OF;
23180d9301c2e874b29889c41adb0623666cf534fa0Tor Norbye                    case RIGHT:
23280d9301c2e874b29889c41adb0623666cf534fa0Tor Norbye                        return ALIGN_RIGHT;
23380d9301c2e874b29889c41adb0623666cf534fa0Tor Norbye                }
23480d9301c2e874b29889c41adb0623666cf534fa0Tor Norbye                break;
23580d9301c2e874b29889c41adb0623666cf534fa0Tor Norbye            case BASELINE:
23680d9301c2e874b29889c41adb0623666cf534fa0Tor Norbye                return ALIGN_BASELINE;
23780d9301c2e874b29889c41adb0623666cf534fa0Tor Norbye        }
23880d9301c2e874b29889c41adb0623666cf534fa0Tor Norbye
23980d9301c2e874b29889c41adb0623666cf534fa0Tor Norbye        return null;
24080d9301c2e874b29889c41adb0623666cf534fa0Tor Norbye    }
24112d4581faa6438941e65a9dc83213be34c6ca970Tor Norbye}
242