001/* ========================================================================
002 * JCommon : a free general purpose class library for the Java(tm) platform
003 * ========================================================================
004 *
005 * (C) Copyright 2000-2005, by Object Refinery Limited and Contributors.
006 * 
007 * Project Info:  http://www.jfree.org/jcommon/index.html
008 *
009 * This library is free software; you can redistribute it and/or modify it 
010 * under the terms of the GNU Lesser General Public License as published by 
011 * the Free Software Foundation; either version 2.1 of the License, or 
012 * (at your option) any later version.
013 *
014 * This library is distributed in the hope that it will be useful, but 
015 * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY 
016 * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public 
017 * License for more details.
018 *
019 * You should have received a copy of the GNU Lesser General Public
020 * License along with this library; if not, write to the Free Software
021 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, 
022 * USA.  
023 *
024 * [Java is a trademark or registered trademark of Sun Microsystems, Inc. 
025 * in the United States and other countries.]
026 * 
027 * ----------
028 * Align.java
029 * ----------
030 * (C) Copyright 2000-2004, by Object Refinery Limited and Contributors.
031 *
032 * Original Author:  Christian W. Zuckschwerdt;
033 * Contributor(s):   David Gilbert (for Object Refinery Limited);
034 *
035 * $Id: Align.java,v 1.5 2005/10/18 13:18:34 mungady Exp $
036 *
037 * Changes (from 30-May-2002)
038 * --------------------------
039 * 30-May-2002 : Added title (DG);
040 * 13-Oct-2002 : Fixed errors reported by Checkstyle (DG);
041 *
042 */
043
044package org.jfree.ui;
045
046import java.awt.geom.Rectangle2D;
047
048/**
049 * A utility class for aligning rectangles.
050 *
051 * @author David Gilbert
052 */
053public final class Align {
054
055    /** Center alignment. */
056    public static final int CENTER = 0x00;
057
058    /** Top alignment. */
059    public static final int TOP = 0x01;
060
061    /** Bottom alignment. */
062    public static final int BOTTOM = 0x02;
063
064    /** Left alignment. */
065    public static final int LEFT = 0x04;
066
067    /** Right alignment. */
068    public static final int RIGHT = 0x08;
069
070    /** Top/Left alignment. */
071    public static final int TOP_LEFT = TOP | LEFT;
072
073    /** Top/Right alignment. */
074    public static final int TOP_RIGHT = TOP | RIGHT;
075
076    /** Bottom/Left alignment. */
077    public static final int BOTTOM_LEFT = BOTTOM | LEFT;
078
079    /** Bottom/Right alignment. */
080    public static final int BOTTOM_RIGHT = BOTTOM | RIGHT;
081
082    /** Horizontal fit. */
083    public static final int FIT_HORIZONTAL = LEFT | RIGHT;
084
085    /** Vertical fit. */
086    public static final int FIT_VERTICAL = TOP | BOTTOM;
087
088    /** Complete fit. */
089    public static final int FIT = FIT_HORIZONTAL | FIT_VERTICAL;
090
091    /** North alignment (same as TOP). */
092    public static final int NORTH = TOP;
093
094    /** South alignment (same as BOTTOM). */
095    public static final int SOUTH = BOTTOM;
096
097    /** West alignment (same as LEFT). */
098    public static final int WEST = LEFT;
099
100    /** East alignment (same as RIGHT). */
101    public static final int EAST = RIGHT;
102
103    /** North/West alignment (same as TOP_LEFT). */
104    public static final int NORTH_WEST = NORTH | WEST;
105
106    /** North/East alignment (same as TOP_RIGHT). */
107    public static final int NORTH_EAST = NORTH | EAST;
108
109    /** South/West alignment (same as BOTTOM_LEFT). */
110    public static final int SOUTH_WEST = SOUTH | WEST;
111
112    /** South/East alignment (same as BOTTOM_RIGHT). */
113    public static final int SOUTH_EAST = SOUTH | EAST;
114
115    /**
116     * Private constructor.
117     */
118    private Align() { 
119        super();
120    }
121    
122    /**
123     * Aligns one rectangle (<code>rect</code>) relative to another rectangle (<code>frame</code>).
124     *
125     * @param rect  the rectangle to be aligned (<code>null</code> not permitted).
126     * @param frame  the reference frame (<code>null</code> not permitted).
127     * @param align  the alignment code.
128     */
129    public static void align(final Rectangle2D rect, final Rectangle2D frame, final int align) {
130
131        double x = frame.getCenterX() - rect.getWidth() / 2.0;
132        double y = frame.getCenterY() - rect.getHeight() / 2.0;
133        double w = rect.getWidth();
134        double h = rect.getHeight();
135
136        if ((align & FIT_VERTICAL) == FIT_VERTICAL) {
137            h = frame.getHeight();
138        }
139
140        if ((align & FIT_HORIZONTAL) == FIT_HORIZONTAL) {
141            w = frame.getWidth();
142        }
143
144        if ((align & TOP) == TOP) {
145            y = frame.getMinY();
146        }
147
148        if ((align & BOTTOM) == BOTTOM) {
149            y = frame.getMaxY() - h;
150        }
151
152        if ((align & LEFT) == LEFT) {
153            x = frame.getX();
154        }
155
156        if ((align & RIGHT) == RIGHT) {
157            x = frame.getMaxX() - w;
158        }
159
160        rect.setRect(x, y, w, h);
161
162    }
163
164}