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