package com.explodingpixels.widgets.plaf;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.Point;
import java.awt.Rectangle;
import javax.swing.SwingConstants;
/**
* An orientation corresponding to a {@link javax.swing.JScrollBar}. The methods in this enumeration
* allow for orentation-agnostic calculations, which can be used when laying out a scroll bar. A
* scroll bar, regargless of it's orientation, has a length and thickness. These values correspond
* to different dimensions (x or y) depending on the orientation.
*/
public enum ScrollBarOrientation {
HORIZONTAL {
int getThickness(Dimension size) {
return size.height;
}
int getLength(Dimension size) {
return size.width;
}
int getPosition(Point point) {
return point.x;
}
Rectangle updateBoundsPosition(Rectangle bounds, int newPosition) {
bounds.setLocation(newPosition, bounds.y);
return bounds;
}
Rectangle createBounds(Component container, int position, int length) {
return new Rectangle(position, 0, length, container.getHeight());
}
Rectangle createCenteredBounds(Component container, int position, int thickness, int length) {
int y = container.getHeight() / 2 - thickness / 2;
return new Rectangle(position, y, length, thickness);
}
},
VERTICAL {
int getThickness(Dimension size) {
return size.width;
}
int getLength(Dimension size) {
return size.height;
}
int getPosition(Point point) {
return point.y;
}
Rectangle updateBoundsPosition(Rectangle bounds, int newPosition) {
bounds.setLocation(bounds.x, newPosition);
return bounds;
}
Rectangle createBounds(Component container, int position, int length) {
return new Rectangle(0, position, container.getWidth(), length);
}
Rectangle createCenteredBounds(Component container, int position, int thickness, int length) {
int x = container.getWidth() / 2 - thickness / 2;
return new Rectangle(x, position, thickness, length);
}
};
/**
* Converts a Swing scroll bar orientation (either {@link javax.swing.SwingConstants#HORIZONTAL} or
* {@link javax.swing.SwingConstants#VERTICAL} to a {@code ScrollBarOrientation}.
*
* @param swingScrollBarOrientation the Swing scroll bar orientation, either
* {@link javax.swing.SwingConstants#HORIZONTAL} or {@link javax.swing.SwingConstants#VERTICAL}
* @return the {@code ScrollBarOrientation} to the corresponding Swing scroll bar orientation.
* @throws IllegalArgumentException if the given Swing scroll bar orientation is not valid.
*/
public static ScrollBarOrientation getOrientation(int swingScrollBarOrientation) {
if (swingScrollBarOrientation != SwingConstants.HORIZONTAL
&& swingScrollBarOrientation != SwingConstants.VERTICAL) {
throw new IllegalArgumentException("The given value is not a valid scroll bar orientation.");
}
return swingScrollBarOrientation == SwingConstants.HORIZONTAL ? HORIZONTAL : VERTICAL;
}
/**
* Get's the thickness of the given size. Thickness corresponds to the dimension that does not
* vary in size. That is, a horizontal scroll bar's thickness corresponds to the y dimension,
* while a vertical scroll bar's thickness corresponds to the x dimension.
*
* @param size the 2-dimensional size to extract the thickness from.
* @return the thickness of the given size.
*/
abstract int getThickness(Dimension size);
/**
* Get's the length of the given size. Length corresponds to the dimension that varies in size.
* That is, a horizontal scroll bar's length corresponds to the x dimension, while a vertical
* scroll bar's length corresponds to the y dimension.
*
* @param size the 2-dimensional size to extract the length from.
* @return the length of the given size.
*/
abstract int getLength(Dimension size);
/**
* Get's the position from the given {@link java.awt.Point}. Position refers to the dimension of a point
* on which the scroll bar scrolls. That is, a horiztonal scroll bar's position corresponds to
* the x dimension, while a vertical scroll bar's position corresponds to the y dimension.
*
* @param point the {@code Point} from which to extrac the position from.
* @return the position value of the given {@code Point}.
*/
abstract int getPosition(Point point);
/**
* Moves the given bounds to the given position. For a horiztonal scroll bar this translates
* into {@code bounds.x = newPosition}, while for a vertical scroll bar this translates into
* {@code bounds.y = newPosition}.
*
* @param bounds the bounds to update with the new position.
* @param newPosition the new position to set the bounds to.
* @return the updated bounds.
*/
abstract Rectangle updateBoundsPosition(Rectangle bounds, int newPosition);
/**
* <p>
* Creates bounds based on the given {@link java.awt.Component}, position and length. The supplied
* component will be used to determine the thickness of the bounds. The position will be used
* to locate the bounds along the scrollable axis. The length will be used to determine the
* length of the bounds along the scrollable axis.
* </p><p>
* Horizontal scroll bars, the bounds will be derived like this:
* <pre>new Rectangle(position, 0, length, container.getHeigth())</pre>
* </p><p>
* Vertical scroll bar bounds will be derived like this:
* <pre>new Rectangle(0, container.getWidth(), position, length)</pre>
* </p>
*
* @param container the {@code Component} to use to determine the thickness of the bounds.
* @param position the position of the bounds.
* @param length the length of the bounds.
* @return the created bounds.
*/
abstract Rectangle createBounds(Component container, int position, int length);
/**
* <p>
* Creates bounds centered in the given {@link java.awt.Component} located at the given position, with
* the given thickness and length.
* </p><p>
* Horizontal scroll bars, the bounds will be derived like this:
* <pre>new Rectangle(position, container.getHeight()/2 - thickness/2, length, thickness)</pre>
* </p><p>
* Vertical scroll bars, the bounds will be derived like this:
* <pre>new Rectangle(container.getWidth()/2 - thickness/2, position, thickness, length)</pre>
*
* @param container the {@code Component} to use to determine the thickness of the bounds.
* @param position the position of the bounds.
* @param thickness the thickness of the given bounds.
* @param length the length of the bounds.
* @return the created bounds.
*/
abstract Rectangle createCenteredBounds(Component container, int position, int thickness, int length);
}