package org.ripple.power.utils;
import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.Color;
import java.awt.Container;
import java.awt.Dialog;
import java.awt.Dialog.ModalityType;
import java.awt.Font;
import java.awt.FontFormatException;
import java.awt.Frame;
import java.awt.Graphics2D;
import java.awt.GraphicsConfiguration;
import java.awt.GraphicsDevice;
import java.awt.GraphicsEnvironment;
import java.awt.Insets;
import java.awt.Point;
import java.awt.Rectangle;
import java.awt.Toolkit;
import java.awt.Window;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.HierarchyEvent;
import java.awt.event.HierarchyListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.awt.event.WindowListener;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.io.InputStream;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.SwingUtilities;
import javax.swing.Timer;
public class SwingUtils {
static public Window getParentContainer(Component component) {
if (component instanceof Window) {
return (Window) component;
}
while (component.getParent() != null) {
component = component.getParent();
if (component instanceof Window) {
return (Window) component;
}
}
if (component instanceof Window) {
return (Window) component;
} else {
return null;
}
}
static public JDialog addModelessWindow(Component jpanel, String title) {
return addModelessWindow((Window) null, jpanel, title);
}
static public JDialog addModelessWindow(Window mainWindow,
Component jpanel, String title) {
JDialog dialog;
if (mainWindow != null) {
dialog = new JDialog(mainWindow, title);
} else {
dialog = new JDialog();
dialog.setTitle(title);
}
dialog.getContentPane().setLayout(new BorderLayout());
dialog.getContentPane().add(jpanel, BorderLayout.CENTER);
dialog.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
dialog.pack();
dialog.setLocationRelativeTo(mainWindow);
dialog.setModalityType(ModalityType.MODELESS);
dialog.setSize(jpanel.getPreferredSize());
dialog.setVisible(true);
return dialog;
}
static public JDialog addModelessWindow(Frame mainWindow, Component jpanel,
String title) {
JDialog dialog = new JDialog(mainWindow, title, true);
dialog.getContentPane().setLayout(new BorderLayout());
dialog.getContentPane().add(jpanel, BorderLayout.CENTER);
dialog.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
dialog.pack();
dialog.setLocationRelativeTo(mainWindow);
dialog.setModalityType(ModalityType.MODELESS);
dialog.setSize(jpanel.getPreferredSize());
dialog.setVisible(true);
return dialog;
}
static public JDialog addDialogWindow(Frame mainWindow, Component jpanel,
String title) {
JDialog dialog = new JDialog(mainWindow, title, true);
dialog.getContentPane().setLayout(new BorderLayout());
dialog.getContentPane().add(jpanel, BorderLayout.CENTER);
dialog.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
dialog.pack();
dialog.setLocationRelativeTo(mainWindow);
dialog.setSize(jpanel.getPreferredSize());
dialog.setVisible(true);
return dialog;
}
public static void fadeIn(final Dialog win) {
if (!win.isUndecorated()) {
return;
}
final Timer timer = new Timer(30, null);
timer.setRepeats(true);
timer.addActionListener(new ActionListener() {
private float opacity = 0;
@Override
public void actionPerformed(ActionEvent e) {
opacity += 0.05f;
win.setOpacity(Math.min(opacity, 1f));
if (opacity >= 1) {
timer.stop();
}
}
});
win.setOpacity(0);
timer.start();
win.setVisible(true);
}
public static void fadeOut(final Dialog win, final boolean close) {
if (!win.isUndecorated()) {
if (close) {
SwingUtils.close(win);
}
return;
}
final Timer timer = new Timer(30, null);
timer.setRepeats(true);
timer.addActionListener(new ActionListener() {
private float opacity = 1;
@Override
public void actionPerformed(ActionEvent e) {
opacity -= 0.05f;
win.setOpacity(Math.max(opacity, 0f));
if (opacity <= 0) {
timer.stop();
if (close) {
SwingUtils.close(win);
} else {
win.setVisible(false);
}
}
}
});
win.setOpacity(1);
timer.start();
}
public static void close(Window win) {
if (win != null) {
win.setVisible(false);
win.dispose();
}
}
public static Rectangle getScreenSize(Window win) {
Rectangle sb;
if (win == null) {
sb = GraphicsEnvironment.getLocalGraphicsEnvironment()
.getDefaultScreenDevice().getDefaultConfiguration()
.getBounds();
} else {
sb = win.getGraphicsConfiguration().getBounds();
}
return sb;
}
public static Insets getScreenInsets(Window win) {
Insets si;
if (win == null) {
si = Toolkit.getDefaultToolkit()
.getScreenInsets(
GraphicsEnvironment.getLocalGraphicsEnvironment()
.getDefaultScreenDevice()
.getDefaultConfiguration());
} else {
si = win.getToolkit().getScreenInsets(
win.getGraphicsConfiguration());
}
return si;
}
public static void fullScreen(Window win) {
Rectangle screenBounds = SwingUtils.getScreenSize(win);
win.setBounds(screenBounds);
}
public static void centerOnScreen(Window win) {
Rectangle screenBounds = SwingUtils.getScreenSize(win);
win.setBounds((int) (screenBounds.getWidth() - win.getWidth()) / 2,
(int) (screenBounds.getHeight() - win.getHeight()) / 2,
win.getWidth(), win.getHeight());
}
public static void centerOnParent(Window win) {
Container parent = win.getParent();
if (parent != null) {
Point parentPosition = parent.getLocationOnScreen();
win.setLocation(
parentPosition.x + (parent.getWidth() - win.getWidth()) / 2,
parentPosition.y + (parent.getHeight() - win.getHeight())
/ 2);
} else {
centerOnScreen(win);
}
}
public static boolean isTranslucentSupported() {
GraphicsEnvironment ge = GraphicsEnvironment
.getLocalGraphicsEnvironment();
GraphicsDevice gd = ge.getDefaultScreenDevice();
boolean isUniformTranslucencySupported = gd
.isWindowTranslucencySupported(GraphicsDevice.WindowTranslucency.TRANSLUCENT);
return isUniformTranslucencySupported;
}
public static void setWindowTransparent(Window win) {
if (SwingUtils.isTranslucentSupported()) {
win.setBackground(new Color(0, 0, 0, 0));
}
}
public BufferedImage toCompatibleImage(BufferedImage image) {
GraphicsConfiguration gfx_config = GraphicsEnvironment
.getLocalGraphicsEnvironment().getDefaultScreenDevice()
.getDefaultConfiguration();
if (image.getColorModel().equals(gfx_config.getColorModel())) {
return image;
}
BufferedImage new_image = gfx_config.createCompatibleImage(
image.getWidth(), image.getHeight(), image.getTransparency());
Graphics2D g2d = (Graphics2D) new_image.getGraphics();
g2d.drawImage(image, 0, 0, null);
g2d.dispose();
return new_image;
}
public static void addWindowListener(final Component source,
final WindowListener listener) {
if (source instanceof Window) {
((Window) source).addWindowListener(listener);
} else {
source.addHierarchyListener(new HierarchyListener() {
@Override
public void hierarchyChanged(HierarchyEvent e) {
if ((e.getChangeFlags() & HierarchyEvent.SHOWING_CHANGED) == HierarchyEvent.SHOWING_CHANGED) {
SwingUtilities.getWindowAncestor(source)
.addWindowListener(listener);
}
}
});
}
}
public static JFrame getJFrame(Component cmp) {
return (JFrame) SwingUtilities.getWindowAncestor(cmp);
}
public static void packLater(final Window win, final Component parent) {
win.pack();
win.setLocationRelativeTo(parent);
win.addWindowListener(new WindowAdapter() {
@Override
public void windowOpened(WindowEvent e) {
win.pack();
win.setLocationRelativeTo(parent);
}
});
}
public static void importFont(InputStream stream) {
try {
Font font1 = Font.createFont(Font.TRUETYPE_FONT, stream);
GraphicsEnvironment.getLocalGraphicsEnvironment().registerFont(
font1);
} catch (FontFormatException ex) {
throw new RuntimeException(ex);
} catch (IOException ex) {
throw new RuntimeException(ex);
}
}
}