/*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package jpa.tools.swing;
import java.awt.AWTException;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.Point;
import java.awt.Rectangle;
import java.awt.Robot;
import java.awt.Toolkit;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.util.Enumeration;
import java.util.concurrent.TimeUnit;
import javax.imageio.ImageIO;
import javax.swing.AbstractButton;
import javax.swing.ButtonGroup;
import javax.swing.UIDefaults;
import javax.swing.UIManager;
import javax.swing.plaf.FontUIResource;
/**
* Assorted utility methods.
*
* @author Pinaki Poddar
*
*/
public class SwingHelper {
/**
* Position the given component at the center of the given parent component or physical screen.
*
* @param c the component to be positioned
* @param parent the component whose center will match the center of the given component.
* If null, the given component will match the screen center.
*
*/
public static void position(Component c, Component parent) {
Dimension d = c.getPreferredSize();
if (parent == null) {
Dimension s = Toolkit.getDefaultToolkit().getScreenSize();
c.setLocation(s.width/2 - d.width/2, s.height/2 - d.height/2);
} else {
Point p = parent.getLocationOnScreen();
int pw = parent.getWidth();
int ph = parent.getHeight();
c.setLocation(p.x + pw/2 - d.width/2, p.y + ph/2 - d.height/2);
}
}
private static int[] factors = {1000, 1000, 1000, 1000, 60, 60, 24};
public static String getTimeString(long value, TimeUnit unit) {
if (value <= 0)
return "";
int i = unit.ordinal();
TimeUnit[] units = TimeUnit.values();
TimeUnit next = null;
int factor = -1;
if (i < factors.length -1) {
next = units[i+1];
factor = factors[i+1];
long nextValue = value/factor;
if (nextValue > 0)
return getTimeString(value/factor, next) + " " + getTimeString(value%factor, unit);
}
return value + toString(unit);
}
public static String toString(TimeUnit unit) {
switch (unit) {
case HOURS:
case DAYS:
case MINUTES:
case SECONDS:
return unit.toString().substring(0,1).toLowerCase();
case MILLISECONDS:
return "ms";
case MICROSECONDS:
return "micros";
case NANOSECONDS:
return "ns";
}
return "";
}
public static void print(Component c, String format, File output) {
try {
Robot robot = new Robot();
Point root = c.getLocationOnScreen();
BufferedImage shot = robot.createScreenCapture(new Rectangle(root.x, root.y, c.getWidth(), c.getHeight()));
ImageIO.write(shot, format, output);
} catch (AWTException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public static AbstractButton getSelectedButton(ButtonGroup group) {
Enumeration<AbstractButton> buttons = group.getElements();
while (buttons.hasMoreElements()) {
AbstractButton b = buttons.nextElement();
if (b.isSelected()) {
return b;
}
}
return null;
}
public static void setLookAndFeel(int fontSize) throws Exception {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
UIDefaults defaults = UIManager.getDefaults();
Enumeration<Object> keys = defaults.keys();
while (keys.hasMoreElements()) {
Object key = keys.nextElement();
if ((key instanceof String) && (((String) key).endsWith(".font"))) {
FontUIResource font = (FontUIResource) UIManager.get(key);
defaults.put (key, new FontUIResource(font.getFontName(), font.getStyle(), fontSize));
}
}
}
}