blob: 4c98346b7d66397a7dfa3ca443846109f7728010 [file] [log] [blame]
/*
* Copyright (C) 2013 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.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.apache.org/licenses/LICENSE-2.0
*
* 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.tools.idea.designer;
import org.jetbrains.annotations.NotNull;
import java.awt.*;
/**
* Set of insets - distances to outer left, top, right and bottom edges. These objects
* can be used for both actual <b>margins</b> and <b>padding</b> -- and in general any
* deltas to the bounds of a rectangle.
*/
public class Insets {
public static final Insets NONE = new Insets(0, 0, 0, 0);
/**
* The left margin
*/
public final int left;
/**
* The top margin
*/
public final int top;
/**
* The right margin
*/
public final int right;
/**
* The bottom margin
*/
public final int bottom;
/**
* Creates a new {@link Insets} instance.
*
* @param left the left side margin
* @param top the top margin
* @param right the right side margin
* @param bottom the bottom margin
*/
public Insets(int left, int top, int right, int bottom) {
this.left = left;
this.right = right;
this.top = top;
this.bottom = bottom;
}
/**
* Returns true if this margin is empty
*
* @return true if empty
*/
public boolean isEmpty() {
return this == NONE || (left == 0 && top == 0 && right == 0 && bottom == 0);
}
/**
* Applies these insets to the given bounds rectangle by subtracting them. For example, for a view that has margins,
* you can subtract the margins to the bounds to find out the real bounds prior to the margins being applied.
*
* @param bounds the rectangle the be modified
* @return true if the rectangle was modified
*/
public boolean subtractFrom(Rectangle bounds) {
if (isEmpty()) {
return false;
}
bounds.x -= left;
bounds.width += left;
bounds.y -= top;
bounds.height += top;
bounds.width += right;
bounds.height += bottom;
return true;
}
/**
* Applies these insets to the given bounds rectangle by adding them. For example, for a view that has padding,
* you can add the padding to the bounds to find out the bounds of the child content.
*
* @param bounds the rectangle the be modified
* @return true if the rectangle was modified
*/
public boolean addTo(Rectangle bounds) {
if (isEmpty()) {
return false;
}
bounds.x += left;
bounds.width -= left;
bounds.y += top;
bounds.height -= top;
bounds.width -= right;
bounds.height -= bottom;
return true;
}
@NotNull
@Override
public String toString() {
return "Margins [left=" + left + ", right=" + right + ", top=" + top + ", bottom=" + bottom + "]";
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Insets insets = (Insets)o;
if (bottom != insets.bottom) return false;
if (left != insets.left) return false;
if (right != insets.right) return false;
if (top != insets.top) return false;
return true;
}
@Override
public int hashCode() {
int result = left;
result = 31 * result + top;
result = 31 * result + right;
result = 31 * result + bottom;
return result;
}
}