X-Git-Url: http://git.nikiroo.be/?a=blobdiff_plain;f=ui%2FUIUtils.java;h=892c6cbb02ee3268853d9895c38d94fc045684f3;hb=refs%2Fheads%2Fsubtree;hp=5861d00fc3a6e3a254230c8bd5d43a17d26299db;hpb=0be7870ff411c1ddbe4641c4b90e0c7939d5104c;p=nikiroo-utils.git diff --git a/ui/UIUtils.java b/ui/UIUtils.java index 5861d00..892c6cb 100644 --- a/ui/UIUtils.java +++ b/ui/UIUtils.java @@ -1,17 +1,36 @@ package be.nikiroo.utils.ui; import java.awt.Color; +import java.awt.Component; +import java.awt.Desktop; import java.awt.GradientPaint; import java.awt.Graphics; import java.awt.Graphics2D; +import java.awt.GraphicsConfiguration; +import java.awt.GraphicsDevice; +import java.awt.GraphicsEnvironment; import java.awt.Paint; +import java.awt.Point; import java.awt.RadialGradientPaint; +import java.awt.Rectangle; import java.awt.RenderingHints; +import java.awt.Window; +import java.io.IOException; +import java.net.URISyntaxException; +import javax.swing.JButton; import javax.swing.JComponent; +import javax.swing.JEditorPane; +import javax.swing.JLabel; +import javax.swing.JOptionPane; import javax.swing.JScrollPane; import javax.swing.UIManager; import javax.swing.UnsupportedLookAndFeelException; +import javax.swing.event.HyperlinkEvent; +import javax.swing.event.HyperlinkListener; + +import be.nikiroo.utils.Version; +import be.nikiroo.utils.VersionCheck; /** * Some Java Swing utilities. @@ -19,25 +38,49 @@ import javax.swing.UnsupportedLookAndFeelException; * @author niki */ public class UIUtils { + static private Color buttonNormal; + static private Color buttonPressed; + /** - * Set a fake "native look & feel" for the application if possible + * Set a fake "native Look & Feel" for the application if possible * (check for the one currently in use, then try GTK). *

* Must be called prior to any GUI work. + * + * @return TRUE if it succeeded */ - static public void setLookAndFeel() { + static public boolean setLookAndFeel() { // native look & feel + String noLF = "javax.swing.plaf.metal.MetalLookAndFeel"; + String lf = UIManager.getSystemLookAndFeelClassName(); + if (lf.equals(noLF)) + lf = "com.sun.java.swing.plaf.gtk.GTKLookAndFeel"; + + return setLookAndFeel(lf); + } + + /** + * Switch to the given Look & Feel for the application if possible + * (check for the one currently in use, then try GTK). + *

+ * Must be called prior to any GUI work. + * + * @param laf + * the Look & Feel to use + * + * @return TRUE if it succeeded + */ + static public boolean setLookAndFeel(String laf) { try { - String noLF = "javax.swing.plaf.metal.MetalLookAndFeel"; - String lf = UIManager.getSystemLookAndFeelClassName(); - if (lf.equals(noLF)) - lf = "com.sun.java.swing.plaf.gtk.GTKLookAndFeel"; - UIManager.setLookAndFeel(lf); + UIManager.setLookAndFeel(laf); + return true; } catch (InstantiationException e) { } catch (ClassNotFoundException e) { } catch (UnsupportedLookAndFeelException e) { } catch (IllegalAccessException e) { } + + return false; } /** @@ -73,9 +116,9 @@ public class UIUtils { * @param color * the base colour * @param x - * the X coordinate + * the X coordinate of the upper left corner * @param y - * the Y coordinate + * the Y coordinate of the upper left corner * @param width * the width radius * @param height @@ -203,14 +246,179 @@ public class UIUtils { scroll.getHorizontalScrollBar().setUnitIncrement(16); if (!allowHorizontal) { - scroll.setHorizontalScrollBarPolicy( - JScrollPane.HORIZONTAL_SCROLLBAR_NEVER); + scroll.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER); } if (!allowVertical) { - scroll.setVerticalScrollBarPolicy( - JScrollPane.VERTICAL_SCROLLBAR_NEVER); + scroll.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_NEVER); } return scroll; } + + /** + * Show a confirmation message to the user to show him the changes since + * last version. + *

+ * HTML 3.2 supported, links included (the user browser will be launched if + * possible). + *

+ * If this is already the latest version, a message will still be displayed. + * + * @param parentComponent + * determines the {@link java.awt.Frame} in which the dialog is + * displayed; if null, or if the + * parentComponent has no {@link java.awt.Frame}, a + * default {@link java.awt.Frame} is used + * @param updates + * the new version + * @param introText + * an introduction text before the list of changes + * @param title + * the title of the dialog + * + * @return TRUE if the user clicked on OK, false if the dialog was dismissed + */ + static public boolean showUpdatedDialog(Component parentComponent, + VersionCheck updates, String introText, String title) { + + StringBuilder builder = new StringBuilder(); + final JEditorPane updateMessage = new JEditorPane("text/html", ""); + if (introText != null && !introText.isEmpty()) { + builder.append(introText); + builder.append("
"); + builder.append("
"); + } + for (Version v : updates.getNewer()) { + builder.append("\t" // + + "Version " + v.toString() // + + ""); + builder.append("
"); + builder.append("

"); + } + + // html content + updateMessage.setText("" // + + builder// + + ""); + + // handle link events + updateMessage.addHyperlinkListener(new HyperlinkListener() { + @Override + public void hyperlinkUpdate(HyperlinkEvent e) { + if (e.getEventType().equals(HyperlinkEvent.EventType.ACTIVATED)) + try { + Desktop.getDesktop().browse(e.getURL().toURI()); + } catch (IOException ee) { + ee.printStackTrace(); + } catch (URISyntaxException ee) { + ee.printStackTrace(); + } + } + }); + updateMessage.setEditable(false); + updateMessage.setBackground(new JLabel().getBackground()); + updateMessage.addHyperlinkListener(new HyperlinkListener() { + @Override + public void hyperlinkUpdate(HyperlinkEvent evn) { + if (evn.getEventType() == HyperlinkEvent.EventType.ACTIVATED) { + if (Desktop.isDesktopSupported()) { + try { + Desktop.getDesktop().browse(evn.getURL().toURI()); + } catch (IOException e) { + } catch (URISyntaxException e) { + } + } + } + } + }); + + return JOptionPane.showConfirmDialog(parentComponent, updateMessage, + title, JOptionPane.DEFAULT_OPTION) == JOptionPane.OK_OPTION; + } + + /** + * Set the given {@link JButton} as "pressed" (selected, but with more UI + * visibility). + *

+ * The {@link JButton} will answer {@link JButton#isSelected()} if it is + * pressed. + * + * @param button + * the button to select/press + * @param pressed + * the new "pressed" state + */ + static public void setButtonPressed(JButton button, boolean pressed) { + if (buttonNormal == null) { + JButton defButton = new JButton(" "); + buttonNormal = defButton.getBackground(); + if (buttonNormal.getBlue() >= 128) { + buttonPressed = new Color( // + Math.max(buttonNormal.getRed() - 100, 0), // + Math.max(buttonNormal.getGreen() - 100, 0), // + Math.max(buttonNormal.getBlue() - 100, 0)); + } else { + buttonPressed = new Color( // + Math.min(buttonNormal.getRed() + 100, 255), // + Math.min(buttonNormal.getGreen() + 100, 255), // + Math.min(buttonNormal.getBlue() + 100, 255)); + } + } + + button.setSelected(pressed); + button.setBackground(pressed ? buttonPressed : buttonNormal); + } + + /** + * Set the given {@link Window} to full screen mode, on the desktop it + * currently resides on. + *

+ * Can be cancelled by calling again with a NULL value. + * + * @param win + * the window to set to full screen + */ + static public void setFullscreenWindow(Window win) { + GraphicsEnvironment env = GraphicsEnvironment + .getLocalGraphicsEnvironment(); + GraphicsDevice[] screens = env.getScreenDevices(); + + if (win == null) { + for (GraphicsDevice screen : screens) { + if (win == null) { + screen.setFullScreenWindow(null); + } + } + + return; + } + + Rectangle r = win.getBounds(); + Point center = new Point(r.x + r.width / 2, r.y + r.height / 2); + + GraphicsDevice current = null; + for (GraphicsDevice screen : screens) { + GraphicsConfiguration[] confs = screen.getConfigurations(); + for (GraphicsConfiguration conf : confs) { + if (conf.getBounds().contains(center)) { + current = screen; + break; + } + } + + if (current != null) + break; + } + + if (current == null) { + current = GraphicsEnvironment.getLocalGraphicsEnvironment() + .getDefaultScreenDevice(); + } + + current.setFullScreenWindow(win); + } }