| /* |
| * Copyright (C) 2011 The Android Open Source Project |
| * |
| * Licensed under the Eclipse Public License, Version 1.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.eclipse.org/org/documents/epl-v10.php |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| package com.android.ide.common.api; |
| |
| import com.android.annotations.NonNull; |
| import com.android.annotations.Nullable; |
| import com.google.common.annotations.Beta; |
| |
| /** A segment type describes the different roles or positions a segment can have in a node |
| * <p> |
| * <b>NOTE: This is not a public or final API; if you rely on this be prepared |
| * to adjust your code for the next tools release.</b> |
| */ |
| @Beta |
| public enum SegmentType { |
| /** Segment is on the left edge */ |
| @NonNull LEFT, |
| /** Segment is on the top edge */ |
| @NonNull TOP, |
| /** Segment is on the right edge */ |
| @NonNull RIGHT, |
| /** Segment is on the bottom edge */ |
| @NonNull BOTTOM, |
| /** Segment is along the baseline */ |
| @NonNull BASELINE, |
| /** Segment is along the center vertically */ |
| @NonNull CENTER_VERTICAL, |
| /** Segment is along the center horizontally */ |
| @NonNull CENTER_HORIZONTAL, |
| /** Segment is on an unknown edge */ |
| @NonNull UNKNOWN; |
| |
| public boolean isHorizontal() { |
| return this == TOP || this == BOTTOM || this == BASELINE || this == CENTER_HORIZONTAL; |
| } |
| |
| /** |
| * Returns the X coordinate for an edge of this type given its bounds |
| * |
| * @param node the node containing the edge |
| * @param bounds the bounds of the node |
| * @return the X coordinate for an edge of this type given its bounds |
| */ |
| public int getX(@Nullable INode node, @NonNull Rect bounds) { |
| // We pass in the bounds rather than look it up via node.getBounds() because |
| // during a resize or move operation, we call this method to look up proposed |
| // bounds rather than actual bounds |
| switch (this) { |
| case RIGHT: |
| return bounds.x + bounds.w; |
| case TOP: |
| case BOTTOM: |
| case CENTER_VERTICAL: |
| return bounds.x + bounds.w / 2; |
| case UNKNOWN: |
| assert false; |
| return bounds.x; |
| case LEFT: |
| case BASELINE: |
| default: |
| return bounds.x; |
| } |
| } |
| |
| /** |
| * Returns the Y coordinate for an edge of this type given its bounds |
| * |
| * @param node the node containing the edge |
| * @param bounds the bounds of the node |
| * @return the Y coordinate for an edge of this type given its bounds |
| */ |
| public int getY(@Nullable INode node, @NonNull Rect bounds) { |
| switch (this) { |
| case TOP: |
| return bounds.y; |
| case BOTTOM: |
| return bounds.y + bounds.h; |
| case BASELINE: { |
| int baseline = node != null ? node.getBaseline() : -1; |
| if (node == null) { |
| // This happens when you are dragging an element and we don't have |
| // a node (only an IDragElement) such as on a palette drag. |
| // For now just hack it. |
| baseline = (int) (bounds.h * 0.8f); // HACK |
| } |
| return bounds.y + baseline; |
| } |
| case UNKNOWN: |
| assert false; |
| return bounds.y; |
| case RIGHT: |
| case LEFT: |
| case CENTER_HORIZONTAL: |
| default: |
| return bounds.y + bounds.h / 2; |
| } |
| } |
| |
| @Override |
| public String toString() { |
| return name(); |
| } |
| } |