/*
* Copyright 2000-2016 Vaadin Ltd.
*
* 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.vaadin.shared.ui;
import java.io.Serializable;
/**
* Describes the margin settings for each edge of a Component.
*
* @author Vaadin Ltd
*/
public class MarginInfo implements Serializable {
private static final int TOP = 1;
private static final int RIGHT = 2;
private static final int BOTTOM = 4;
private static final int LEFT = 8;
private static final int ALL = TOP | RIGHT | BOTTOM | LEFT;
private int bitMask;
/**
* Creates a MarginInfo object with all edges set to either enabled or
* disabled.
*
* @param enabled
* the value to set for all edges
*/
public MarginInfo(boolean enabled) {
setMargins(enabled);
}
/**
* Creates a MarginInfo object from a bit mask.
*
* @param bitMask
* bits to set
* @deprecated use other constructors instead of this one
*/
@Deprecated
public MarginInfo(int bitMask) {
this.bitMask = bitMask;
}
/**
* Creates a MarginInfo object by having each edge specified in clockwise
* order (analogous to CSS).
*
* @param top
* enable or disable top margin
* @param right
* enable or disable right margin
* @param bottom
* enable or disable bottom margin
* @param left
* enable or disable left margin
*/
public MarginInfo(boolean top, boolean right, boolean bottom,
boolean left) {
doSetMargins(top, right, bottom, left);
}
/**
* Creates a MarginInfo object by having horizontal and vertical margins
* specified (analogous to CSS).
*
* @since 7.6.5
*
* @param vertical
* enable or disable top and bottom margins
* @param horizontal
* enable or disable left and right margins
*/
public MarginInfo(boolean vertical, boolean horizontal) {
this(vertical, horizontal, vertical, horizontal);
}
/**
* Creates a MarginInfo with the same values as another MarginInfo object.
*
* @param other
* another MarginInfo object
*/
public MarginInfo(MarginInfo other) {
setMargins(other);
}
/**
* Enables or disables margins on all edges simultaneously.
*
* @param enabled
* if true, enables margins on all edges. If false, disables
* margins on all edges.
*/
public void setMargins(boolean enabled) {
bitMask = enabled ? ALL : 0;
}
/**
* Sets margins on all edges individually.
*
* @param top
* enable or disable top margin
* @param right
* enable or disable right margin
* @param bottom
* enable or disable bottom margin
* @param left
* enable or disable left margin
*/
public void setMargins(boolean top, boolean right, boolean bottom,
boolean left) {
doSetMargins(top, right, bottom, left);
}
/**
* Copies margin values from another MarginInfo object.
*
* @param marginInfo
* another marginInfo object
*/
public void setMargins(MarginInfo marginInfo) {
bitMask = marginInfo.bitMask;
}
/**
* Checks if this MarginInfo object has margins on all edges enabled.
*
* @since 7.5.0
*
* @return true if all edges have margins enabled
*/
public boolean hasAll() {
return (bitMask & ALL) == ALL;
}
/**
* Checks if this MarginInfo object has no margins enabled.
*
* @since 8.0
*
* @return true if all edges have margins disabled
*/
public boolean hasNone() {
return (bitMask & ALL) == 0;
}
/**
* Checks if this MarginInfo object has the left edge margin enabled.
*
* @return true if left edge margin is enabled
*/
public boolean hasLeft() {
return (bitMask & LEFT) == LEFT;
}
/**
* Checks if this MarginInfo object has the right edge margin enabled.
*
* @return true if right edge margin is enabled
*/
public boolean hasRight() {
return (bitMask & RIGHT) == RIGHT;
}
/**
* Checks if this MarginInfo object has the top edge margin enabled.
*
* @return true if top edge margin is enabled
*/
public boolean hasTop() {
return (bitMask & TOP) == TOP;
}
/**
* Checks if this MarginInfo object has the bottom edge margin enabled.
*
* @return true if bottom edge margin is enabled
*/
public boolean hasBottom() {
return (bitMask & BOTTOM) == BOTTOM;
}
/**
* Returns the current bit mask that make up the margin settings.
* <p>
* This method is for internal use by the framework.
*
* @return an integer bit mask
*/
@Deprecated
public int getBitMask() {
return bitMask;
}
@Override
public boolean equals(Object obj) {
if (!(obj instanceof MarginInfo)) {
return false;
}
return ((MarginInfo) obj).bitMask == bitMask;
}
@Override
public int hashCode() {
return bitMask;
}
@Override
public String toString() {
return "MarginInfo(" + hasTop() + ", " + hasRight() + ", " + hasBottom()
+ ", " + hasLeft() + ")";
}
private void doSetMargins(boolean top, boolean right, boolean bottom,
boolean left) {
bitMask = top ? TOP : 0;
bitMask += right ? RIGHT : 0;
bitMask += bottom ? BOTTOM : 0;
bitMask += left ? LEFT : 0;
}
}