blob: 9da248a9fcac38a202857adbbf91095d0228a9b7 [file] [log] [blame]
/*
* 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();
}
}