    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
    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.GraphicsEnvironment;
    075    import java.awt.Point;
    076    import java.awt.Rectangle;
    077    import java.awt.Toolkit;
    078    import java.awt.Window;
    079    import java.lang.reflect.Method;
    080    import javax.swing.JButton;
    081    import javax.swing.JLabel;
    082    import javax.swing.JPanel;
    083    import javax.swing.JScrollPane;
    084    import javax.swing.JTable;
    085    import javax.swing.table.TableColumn;
    086    import javax.swing.table.TableModel;
    087
    088    /**
    089     * A collection of utility methods relating to user interfaces.
    090     *
    091     * @author David Gilbert
    092     */
    093    public 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