    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.12 2010/08/19 13:09:51 taqua 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
    066package org.jfree.ui;
    067
    068import java.awt.BorderLayout;
    069import java.awt.Color;
    070import java.awt.Container;
    071import java.awt.Dialog;
    072import java.awt.Dimension;
    073import java.awt.Font;
    074import java.awt.GraphicsEnvironment;
    075import java.awt.Point;
    076import java.awt.Rectangle;
    077import java.awt.Toolkit;
    078import java.awt.Window;
    079import java.lang.reflect.Method;
    080import javax.swing.JButton;
    081import javax.swing.JLabel;
    082import javax.swing.JPanel;
    083import javax.swing.JScrollPane;
    084import javax.swing.JTable;
    085import javax.swing.table.TableColumn;
    086import javax.swing.table.TableModel;
    087
    088/**
    089 * A collection of utility methods relating to user interfaces.
    090 *
    091 * @author David Gilbert
    092 */
    093public class RefineryUtilities {
    094
    095    private RefineryUtilities() {
    096    }
    097
    098    /**
    099     * Computes the center point of the current screen device. If this method is called on JDK 1.4, Xinerama-aware
    100     * results are returned. (See Sun-Bug-ID 4463949 for details).
    101     *
    102     * @return the center point of the current screen.
    103     * @deprecated this method is not useful in multi-screen environments.
    104     */
    105    public static Point getCenterPoint ()
    106    {
    107      final GraphicsEnvironment localGraphicsEnvironment = GraphicsEnvironment.getLocalGraphicsEnvironment();
    108      try
    109      {
    110        final Method method = GraphicsEnvironment.class.getMethod("getCenterPoint", (Class[]) null);
    111        return (Point) method.invoke(localGraphicsEnvironment, (Object[]) null);
    112      }
    113      catch(Exception e)
    114      {
    115        // ignore ... will fail if this is not a JDK 1.4 ..
    116      }
    117
    118      final Dimension s = Toolkit.getDefaultToolkit().getScreenSize();
    119      return new Point (s.width / 2, s.height / 2);
    120    }
    121
    122  /**
    123   * Computes the maximum bounds of the current screen device. If this method is called on JDK 1.4, Xinerama-aware
    124   * results are returned. (See Sun-Bug-ID 4463949 for details).
    125   *
    126   * @return the maximum bounds of the current screen.
    127   * @deprecated this method is not useful in multi-screen environments.
    128   */
    129    public static Rectangle getMaximumWindowBounds ()
    130    {
    131      final GraphicsEnvironment localGraphicsEnvironment = GraphicsEnvironment.getLocalGraphicsEnvironment();
    132      try
    133      {
    134        final Method method = GraphicsEnvironment.class.getMethod("getMaximumWindowBounds", (Class[]) null);
    135        return (Rectangle) method.invoke(localGraphicsEnvironment, (Object[]) null);
    136      }
    137      catch(Exception e)
    138      {
    139        // ignore ... will fail if this is not a JDK 1.4 ..
    140      }
    141
    142      final Dimension s = Toolkit.getDefaultToolkit().getScreenSize();
    143      return new Rectangle (0, 0, s.width, s.height);
    144    }
    145
    146    /**
    147     * Positions the specified frame in the middle of the screen.
    148     *
    149     * @param frame  the frame to be centered on the screen.
    150     */
    151    public static void centerFrameOnScreen(final Window frame) {
    152        positionFrameOnScreen(frame, 0.5, 0.5);
    153    }
    154
    155    /**
    156     * Positions the specified frame at a relative position in the screen, where 50% is considered
    157     * to be the center of the screen.
    158     *
    159     * @param frame  the frame.
    160     * @param horizontalPercent  the relative horizontal position of the frame (0.0 to 1.0,
    161     *                           where 0.5 is the center of the screen).
    162     * @param verticalPercent  the relative vertical position of the frame (0.0 to 1.0, where
    163     *                         0.5 is the center of the screen).
    164     */
    165    public static void positionFrameOnScreen(final Window frame,
    166                                             final double horizontalPercent,
    167                                             final double verticalPercent) {
    168
    169        final Rectangle s = frame.getGraphicsConfiguration().getBounds();
    170        final Dimension f = frame.getSize();
    171        final int w = Math.max(s.width - f.width, 0);
    172        final int h = Math.max(s.height - f.height, 0);
    173        final int x = (int) (horizontalPercent * w) + s.x;
    174        final int y = (int) (verticalPercent * h) + s.y;
    175        frame.setBounds(x, y, f.width, f.height);
    176
    177    }
    178
    179    /**
    180     * Positions the specified frame at a random location on the screen while ensuring that the
    181     * entire frame is visible (provided that the frame is smaller than the screen).
    182     *
    183     * @param frame  the frame.
    184     */
    185    public static void positionFrameRandomly(final Window frame) {
    186        positionFrameOnScreen(frame, Math.random(), Math.random());
    187    }
    188
    189    /**
    190     * Positions the specified dialog within its parent.
    191     *
    192     * @param dialog  the dialog to be positioned on the screen.
    193     */
    194    public static void centerDialogInParent(final Dialog dialog) {
    195        positionDialogRelativeToParent(dialog, 0.5, 0.5);
    196    }
    197
    198    /**
    199     * Positions the specified dialog at a position relative to its parent.
    200     *
    201     * @param dialog  the dialog to be positioned.
    202     * @param horizontalPercent  the relative location.
    203     * @param verticalPercent  the relative location.
    204     */
    205    public static void positionDialogRelativeToParent(final Dialog dialog,
    206                                                      final double horizontalPercent,
    207                                                      final double verticalPercent) {
    208      final Container parent = dialog.getParent();
    209      if (parent == null)
    210      {
    211        centerFrameOnScreen(dialog);
    212        return;
    213      }
    214
    215      final Dimension d = dialog.getSize();
    216      final Dimension p = parent.getSize();
    217
    218      final int baseX = parent.getX();
    219      final int baseY = parent.getY();
    220
    221      final int x = baseX + (int) (horizontalPercent * p.width);
    222      final int y = baseY + (int) (verticalPercent * p.height);
    223
    224      // make sure the dialog fits completely on the screen...
    225      final Rectangle s = parent.getGraphicsConfiguration().getBounds();
    226      final Rectangle r = new Rectangle(x, y, d.width, d.height);
    227      dialog.setBounds(r.intersection(s));
    228    }
    229
    230    /**
    231     * Creates a panel that contains a table based on the specified table model.
    232     *
    233     * @param model  the table model to use when constructing the table.
    234     *
    235     * @return The panel.
    236     */
    237    public static JPanel createTablePanel(final TableModel model) {
    238
    239        final JPanel panel = new JPanel(new BorderLayout());
    240        final JTable table = new JTable(model);
    241        for (int columnIndex = 0; columnIndex < model.getColumnCount(); columnIndex++) {
    242            final TableColumn column = table.getColumnModel().getColumn(columnIndex);
    243            final Class c = model.getColumnClass(columnIndex);
    244            if (c.equals(Number.class)) {
    245                column.setCellRenderer(new NumberCellRenderer());
    246            }
    247        }
    248        panel.add(new JScrollPane(table));
    249        return panel;
    250
    251    }
    252
    253    /**
    254     * Creates a label with a specific font.
    255     *
    256     * @param text  the text for the label.
    257     * @param font  the font.
    258     *
    259     * @return The label.
    260     */
    261    public static JLabel createJLabel(final String text, final Font font) {
    262
    263        final JLabel result = new JLabel(text);
    264        result.setFont(font);
    265        return result;
    266
    267    }
    268
    269    /**
    270     * Creates a label with a specific font and color.
    271     *
    272     * @param text  the text for the label.
    273     * @param font  the font.
    274     * @param color  the color.
    275     *
    276     * @return The label.
    277     */
    278    public static JLabel createJLabel(final String text, final Font font, final Color color) {
    279
    280        final JLabel result = new JLabel(text);
    281        result.setFont(font);
    282        result.setForeground(color);
    283        return result;
    284
    285    }
    286
    287    /**
    288     * Creates a {@link JButton}.
    289     *
    290     * @param label  the label.
    291     * @param font  the font.
    292     *
    293     * @return The button.
    294     */
    295    public static JButton createJButton(final String label, final Font font) {
    296
    297        final JButton result = new JButton(label);
    298        result.setFont(font);
    299        return result;
    300
    301    }
    302
    303}
    304
    305