    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     * RefineryUtilities.java
    029     * ----------------------
    030     * (C) Copyright 2000-2005, by Object Refinery Limited.
    031     *
    032     * Original Author:  David Gilbert (for Object Refinery Limited);
    033     * Contributor(s):   Jon Iles;
    034     *
    035     * $Id: RefineryUtilities.java,v 1.8 2005/10/18 13:18:34 mungady Exp $
    036     *
    037     * Changes (from 26-Oct-2001)
    038     * --------------------------
    039     * 26-Oct-2001 : Changed package to com.jrefinery.ui.*;
    040     * 26-Nov-2001 : Changed name to SwingRefinery.java to make it obvious that this is not part of
    041     *               the Java APIs (DG);
    042     * 10-Dec-2001 : Changed name (again) to JRefineryUtilities.java (DG);
    043     * 28-Feb-2002 : Moved system properties classes into com.jrefinery.ui.about (DG);
    044     * 19-Apr-2002 : Renamed JRefineryUtilities-->RefineryUtilities.  Added drawRotatedString()
    045     *               method (DG);
    046     * 21-May-2002 : Changed frame positioning methods to accept Window parameters, as suggested by
    047     *               Laurence Vanhelsuwe (DG);
    048     * 27-May-2002 : Added getPointInRectangle method (DG);
    049     * 26-Jun-2002 : Removed unnecessary imports (DG);
    050     * 12-Jul-2002 : Added workaround for rotated text (JI);
    051     * 14-Oct-2002 : Fixed errors reported by Checkstyle (DG);
    052     * 08-May-2003 : Added a new drawRotatedString() method (DG);
    053     * 09-May-2003 : Added a drawRotatedShape() method (DG);
    054     * 10-Jun-2003 : Updated aligned and rotated string methods (DG);
    055     * 29-Oct-2003 : Added workaround for font alignment in PDF output (DG);
    056     * 07-Nov-2003 : Added rotateShape() method (DG);
    057     * 16-Mar-2004 : Moved rotateShape() method to ShapeUtils.java (DG);
    058     * 07-Apr-2004 : Modified text bounds calculation with TextUtilities.getTextBounds() (DG);
    059     * 21-May-2004 : Fixed bug 951870 - precision in drawAlignedString() method (DG);
    060     * 30-Sep-2004 : Deprecated and moved a number of methods to the TextUtilities class (DG);
    061     * 04-Oct-2004 : Renamed ShapeUtils --> ShapeUtilities (DG);
    062     * 11-Jan-2005 : Removed deprecated code in preparation for the 1.0.0 release (DG);
    063     *
    064     */
    065
    066    package org.jfree.ui;
    067
    068    import java.awt.BorderLayout;
    069    import java.awt.Color;
    070    import java.awt.Container;
    071    import java.awt.Dialog;
    072    import java.awt.Dimension;
    073    import java.awt.Font;
    074    import java.awt.Toolkit;
    075    import java.awt.Window;
    076
    077    import javax.swing.JButton;
    078    import javax.swing.JLabel;
    079    import javax.swing.JPanel;
    080    import javax.swing.JScrollPane;
    081    import javax.swing.JTable;
    082    import javax.swing.table.TableColumn;
    083    import javax.swing.table.TableModel;
    084
    085    import org.jfree.util.Log;
    086    import org.jfree.util.LogContext;
    087
    088    /**
    089     * A collection of utility methods relating to user interfaces.
    090     *
    091     * @author David Gilbert
    092     */
    093    public abstract class RefineryUtilities {
    094
    095        /** Access to logging facilities. */
    096        protected static final LogContext logger = Log.createContext(RefineryUtilities.class);
    097
    098        /**
    099         * Positions the specified frame in the middle of the screen.
    100         *
    101         * @param frame  the frame to be centered on the screen.
    102         */
    103        public static void centerFrameOnScreen(final Window frame) {
    104            positionFrameOnScreen(frame, 0.5, 0.5);
    105        }
    106
    107        /**
    108         * Positions the specified frame at a relative position in the screen, where 50% is considered
    109         * to be the center of the screen.
    110         *
    111         * @param frame  the frame.
    112         * @param horizontalPercent  the relative horizontal position of the frame (0.0 to 1.0,
    113         *                           where 0.5 is the center of the screen).
    114         * @param verticalPercent  the relative vertical position of the frame (0.0 to 1.0, where
    115         *                         0.5 is the center of the screen).
    116         */
    117        public static void positionFrameOnScreen(final Window frame,
    118                                                 final double horizontalPercent,
    119                                                 final double verticalPercent) {
    120
    121            final Dimension s = Toolkit.getDefaultToolkit().getScreenSize();
    122            final Dimension f = frame.getSize();
    123            final int w = Math.max(s.width - f.width, 0);
    124            final int h = Math.max(s.height - f.height, 0);
    125            final int x = (int) (horizontalPercent * w);
    126            final int y = (int) (verticalPercent * h);
    127            frame.setBounds(x, y, f.width, f.height);
    128
    129        }
    130
    131        /**
    132         * Positions the specified frame at a random location on the screen while ensuring that the
    133         * entire frame is visible (provided that the frame is smaller than the screen).
    134         *
    135         * @param frame  the frame.
    136         */
    137        public static void positionFrameRandomly(final Window frame) {
    138            positionFrameOnScreen(frame, Math.random(), Math.random());
    139        }
    140
    141        /**
    142         * Positions the specified dialog within its parent.
    143         *
    144         * @param dialog  the dialog to be positioned on the screen.
    145         */
    146        public static void centerDialogInParent(final Dialog dialog) {
    147            positionDialogRelativeToParent(dialog, 0.5, 0.5);
    148        }
    149
    150        /**
    151         * Positions the specified dialog at a position relative to its parent.
    152         *
    153         * @param dialog  the dialog to be positioned.
    154         * @param horizontalPercent  the relative location.
    155         * @param verticalPercent  the relative location.
    156         */
    157        public static void positionDialogRelativeToParent(final Dialog dialog,
    158                                                          final double horizontalPercent,
    159                                                          final double verticalPercent) {
    160            final Dimension d = dialog.getSize();
    161            final Container parent = dialog.getParent();
    162            final Dimension p = parent.getSize();
    163
    164            final int baseX = parent.getX() - d.width;
    165            final int baseY = parent.getY() - d.height;
    166            final int w = d.width + p.width;
    167            final int h = d.height + p.height;
    168            int x = baseX + (int) (horizontalPercent * w);
    169            int y = baseY + (int) (verticalPercent * h);
    170
    171            // make sure the dialog fits completely on the screen...
    172            final Dimension s = Toolkit.getDefaultToolkit().getScreenSize();
    173            x = Math.min(x, (s.width - d.width));
    174            x = Math.max(x, 0);
    175            y = Math.min(y, (s.height - d.height));
    176            y = Math.max(y, 0);
    177
    178            dialog.setBounds(x, y, d.width, d.height);
    179
    180        }
    181
    182        /**
    183         * Creates a panel that contains a table based on the specified table model.
    184         *
    185         * @param model  the table model to use when constructing the table.
    186         *
    187         * @return The panel.
    188         */
    189        public static JPanel createTablePanel(final TableModel model) {
    190
    191            final JPanel panel = new JPanel(new BorderLayout());
    192            final JTable table = new JTable(model);
    193            for (int columnIndex = 0; columnIndex < model.getColumnCount(); columnIndex++) {
    194                final TableColumn column = table.getColumnModel().getColumn(columnIndex);
    195                final Class c = model.getColumnClass(columnIndex);
    196                if (c.equals(Number.class)) {
    197                    column.setCellRenderer(new NumberCellRenderer());
    198                }
    199            }
    200            panel.add(new JScrollPane(table));
    201            return panel;
    202
    203        }
    204
    205        /**
    206         * Creates a label with a specific font.
    207         *
    208         * @param text  the text for the label.
    209         * @param font  the font.
    210         *
    211         * @return The label.
    212         */
    213        public static JLabel createJLabel(final String text, final Font font) {
    214
    215            final JLabel result = new JLabel(text);
    216            result.setFont(font);
    217            return result;
    218
    219        }
    220
    221        /**
    222         * Creates a label with a specific font and color.
    223         *
    224         * @param text  the text for the label.
    225         * @param font  the font.
    226         * @param color  the color.
    227         *
    228         * @return The label.
    229         */
    230        public static JLabel createJLabel(final String text, final Font font, final Color color) {
    231
    232            final JLabel result = new JLabel(text);
    233            result.setFont(font);
    234            result.setForeground(color);
    235            return result;
    236
    237        }
    238
    239        /**
    240         * Creates a {@link JButton}.
    241         *
    242         * @param label  the label.
    243         * @param font  the font.
    244         *
    245         * @return The button.
    246         */
    247        public static JButton createJButton(final String label, final Font font) {
    248
    249            final JButton result = new JButton(label);
    250            result.setFont(font);
    251            return result;
    252
    253        }
    254
    255    }
    256
    257