/* * Copyright 2010-2015 Institut Pasteur. * * This file is part of Icy. * * Icy is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Icy is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Icy. If not, see <http://www.gnu.org/licenses/>. */ package icy.gui.util; import icy.gui.frame.IcyFrame; import icy.gui.frame.IcyFrameAdapter; import icy.gui.frame.IcyFrameEvent; import icy.gui.frame.TitledFrame; import icy.util.GraphicsUtil; import java.awt.BorderLayout; import java.awt.Component; import java.awt.Container; import java.awt.Cursor; import java.awt.Dialog; import java.awt.Dimension; import java.awt.Font; import java.awt.Frame; import java.awt.Graphics; import java.awt.GridLayout; import java.awt.Image; import java.awt.Window; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import java.awt.event.WindowListener; import java.awt.geom.Rectangle2D; import javax.swing.BorderFactory; import javax.swing.Box; import javax.swing.BoxLayout; import javax.swing.JDialog; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JMenuBar; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JTextArea; import javax.swing.SwingConstants; import javax.swing.border.TitledBorder; /** * This class is a toolbox with many simple GUI routines. * * @author Fabrice & Stephane */ public class GuiUtil { public static JPanel createLoweredPanel(Component comp) { final JPanel result = new JPanel(); result.setBorder(BorderFactory.createLoweredBevelBorder()); if (comp != null) { result.setLayout(new BorderLayout()); result.add(comp, BorderLayout.CENTER); } result.validate(); return result; } public static JPanel createRaisedPanel(Component comp) { final JPanel result = new JPanel(); result.setBorder(BorderFactory.createRaisedBevelBorder()); if (comp != null) { result.setLayout(new BorderLayout()); result.add(comp, BorderLayout.CENTER); } result.validate(); return result; } public static JLabel createBoldLabel(String text) { final JLabel label = new JLabel(text); ComponentUtil.setFontBold(label); return label; } public static JLabel createBigBoldLabel(String text, int incSize) { final JLabel label = createBoldLabel(text); ComponentUtil.increaseFontSize(label, incSize); return label; } public static JPanel createCenteredLabel(String text) { return createCenteredLabel(new JLabel(text)); } public static JPanel createCenteredLabel(JLabel label) { return createLineBoxPanel(Box.createHorizontalGlue(), label, Box.createHorizontalGlue()); } public static JPanel createCenteredBoldLabel(String text) { return createCenteredLabel(createBoldLabel(text)); } public static JLabel createFixedWidthLabel(String text, int w) { final JLabel result = new JLabel(text); ComponentUtil.setFixedWidth(result, w); return result; } public static JLabel createFixedWidthBoldLabel(String text, int w) { final JLabel result = createBoldLabel(text); ComponentUtil.setFixedWidth(result, w); return result; } public static JLabel createFixedWidthRightAlignedLabel(String text, int w) { final JLabel result = new JLabel(text); ComponentUtil.setFixedWidth(result, w); result.setHorizontalAlignment(SwingConstants.RIGHT); return result; } public static JPanel createTabLabel(String text, int width) { return createTabLabel(new JLabel(text), width); } public static JPanel createTabLabel(JLabel label, int width) { label.setVerticalTextPosition(SwingConstants.TOP); label.setHorizontalTextPosition(SwingConstants.LEADING); final JPanel panel = new JPanel(); panel.setLayout(new BoxLayout(panel, BoxLayout.LINE_AXIS)); if (width > 0) panel.add(Box.createHorizontalStrut(width)); panel.add(label); panel.add(Box.createHorizontalGlue()); panel.validate(); return panel; } public static JPanel createTabBoldLabel(String text, int width) { return createTabLabel(createBoldLabel(text), width); } public static JPanel createTabArea(String text, int width) { return createTabArea(new JTextArea(text), width); } public static JPanel createTabArea(JTextArea area, int width) { area.setEditable(false); area.setOpaque(false); area.setLineWrap(true); final JPanel panel = new JPanel(); panel.setLayout(new BoxLayout(panel, BoxLayout.LINE_AXIS)); if (width > 0) panel.add(Box.createHorizontalStrut(width)); panel.add(area); panel.validate(); return panel; } public static JPanel createTabArea(String text, int width, int height) { return createTabArea(new JTextArea(text), width, height); } public static JPanel createTabArea(JTextArea area, int width, int height) { area.setEditable(false); area.setOpaque(false); area.setLineWrap(true); area.setWrapStyleWord(true); final JScrollPane scrollArea = new JScrollPane(area); scrollArea.setPreferredSize(new Dimension(320, height)); scrollArea.setBorder(null); final JPanel panel = new JPanel(); panel.setLayout(new BoxLayout(panel, BoxLayout.LINE_AXIS)); if (width > 0) panel.add(Box.createHorizontalStrut(width)); panel.add(scrollArea); panel.validate(); return panel; } public static JPanel createLineBoxPanel(Component... componentArray) { final JPanel result = new JPanel(); result.setLayout(new BoxLayout(result, BoxLayout.LINE_AXIS)); for (Component c : componentArray) result.add(c); result.validate(); return result; } public static JPanel createPageBoxPanel(Component... componentArray) { final JPanel result = new JPanel(); result.setLayout(new BoxLayout(result, BoxLayout.PAGE_AXIS)); for (Component c : componentArray) result.add(c); result.validate(); return result; } /** * Creates a jpanel with a gridlayout of 1,2 with the given arguments, and * force the width of the secon columns. Should be use for list of label * beside parameters */ public static JPanel besidesPanel(Component jc1, Component jc2, int widthOfSecondComponent) { JPanel panel = new JPanel(); panel.setLayout(new BorderLayout()); panel.add(jc1, BorderLayout.CENTER); panel.add(jc2, BorderLayout.EAST); jc2.setPreferredSize(new Dimension(widthOfSecondComponent, jc2.getPreferredSize().height)); panel.validate(); return panel; } /** * Creates a jpanel with a gridlayout of 1,2 with the given arguments. */ public static JPanel besidesPanel(Component... componentArray) { JPanel panel = new JPanel(); panel.setLayout(new GridLayout(1, componentArray.length)); for (int i = 0; i < componentArray.length; i++) panel.add(componentArray[i]); panel.validate(); return panel; } /** * This generate a panel with an empty border on the side, so that it is * quite pretty. Generated with a boxLayout * * @return a JPanel */ public static JPanel generatePanel() { JPanel panel = new JPanel(); panel.setLayout(new BoxLayout(panel, BoxLayout.PAGE_AXIS)); panel.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5)); return panel; } public static JPanel generatePanel(String string) { JPanel panel = generatePanel(); panel.setBorder(new TitledBorder(string)); panel.setLayout(new BoxLayout(panel, BoxLayout.PAGE_AXIS)); return panel; } public static JPanel generatePanelWithoutBorder() { JPanel panel = new JPanel(); panel.setLayout(new BoxLayout(panel, BoxLayout.PAGE_AXIS)); return panel; } /** * Allow to enable/Disable all the content of a container ( such as a JPanel * for instance ) * * @deprecated what was the goal of this method ??? */ @Deprecated public static void setEnableContainer(Container container, boolean enable) { for (Component c : container.getComponents()) { if (c instanceof Container) setEnableContainer((Container) c, enable); c.setEnabled(enable); } } public static TitledFrame generateTitleFrame(String title, JPanel panel, Dimension titleDimension, boolean resizable, boolean closable, boolean maximizable, boolean iconifiable) { final Dimension dim; if (titleDimension == null) dim = new Dimension(400, 70); else dim = titleDimension; final TitledFrame result = new TitledFrame(title, dim, resizable, closable, maximizable, iconifiable); result.getMainPanel().add(panel); result.setVisible(true); return result; } /** * @param window * the window to convert in IcyFrame * @return an IcyFrame with the content of specified window (same properties and components)<br/> * The returned frame windows event (opened, closing, closed) are forwarded to the original window to * maintain original event behaviors<br/> * Only the <code>closed</code> event is listened from the original window which will automatically call the * close() method of the returned IcyFrame. */ public static IcyFrame createIcyFrameFromWindow(final Window window) { String title; Component content; JMenuBar menuBar; if (window instanceof Frame) { final Frame f = (Frame) window; title = f.getTitle(); if (f instanceof JFrame) { content = ((JFrame) f).getContentPane(); menuBar = ((JFrame) f).getJMenuBar(); } else { content = f.getComponent(0); menuBar = SwingUtil.getJMenuBar(f.getMenuBar(), false); } } else if (window instanceof Dialog) { final Dialog d = (Dialog) window; title = d.getTitle(); if (d instanceof JDialog) { content = ((JDialog) d).getContentPane(); menuBar = ((JDialog) d).getJMenuBar(); } else { content = d.getComponent(0); menuBar = null; } } else { title = window.getName(); content = window.getComponent(0); menuBar = null; } final IcyFrame frame = new IcyFrame(title, true, true, false, false); frame.setLayout(new BorderLayout()); frame.add(content, BorderLayout.CENTER); frame.setJMenuBar(menuBar); // keep this property if (window instanceof JFrame) frame.setDefaultCloseOperation(((JFrame) window).getDefaultCloseOperation()); else if (window instanceof JDialog) frame.setDefaultCloseOperation(((JDialog) window).getDefaultCloseOperation()); frame.pack(); frame.getIcyExternalFrame().setSize(window.getSize()); frame.getIcyInternalFrame().setSize(window.getSize()); frame.center(); frame.setFocusable(window.isFocusable()); frame.setResizable(false); frame.addFrameListener(new IcyFrameAdapter() { @Override public void icyFrameOpened(IcyFrameEvent e) { for (WindowListener l : window.getWindowListeners()) l.windowOpened(new WindowEvent(window, e.getEvent().getID())); } @Override public void icyFrameClosing(IcyFrameEvent e) { // ensure we are not doing recursing 'close' calls if (window.isVisible()) { window.setLocation(frame.getLocation()); for (WindowListener l : window.getWindowListeners()) l.windowClosing(new WindowEvent(window, e.getEvent().getID())); } } @Override public void icyFrameClosed(IcyFrameEvent e) { // ensure we are not doing recursing 'close' calls if (window.isVisible()) { for (WindowListener l : window.getWindowListeners()) l.windowClosed(new WindowEvent(window, e.getEvent().getID())); } } }); window.addWindowListener(new WindowAdapter() { @Override public void windowClosed(WindowEvent e) { super.windowClosed(e); frame.close(); } }); return frame; } public static void setCursor(Component c, int cursor) { if (c == null) return; if (c.getCursor().getType() != cursor) c.setCursor(Cursor.getPredefinedCursor(cursor)); } /** * @deprecated Use {@link GraphicsUtil#paintIcyBackGround(int, int, Graphics)} instead */ @Deprecated public static void paintBackGround(int width, int height, Graphics g) { GraphicsUtil.paintIcyBackGround(width, height, g); } /** * @deprecated Use {@link GraphicsUtil#paintIcyBackGround(Component, Graphics)} instead */ @Deprecated public static void paintBackGround(Component component, Graphics g) { GraphicsUtil.paintIcyBackGround(component, g); } /** * @deprecated Use {@link GraphicsUtil#paintIcyBackGround(Component, Graphics)} instead */ @Deprecated public static void paintBackGround(Image image) { GraphicsUtil.paintIcyBackGround(image); } /** * @deprecated Use {@link GraphicsUtil#getStringBounds(Graphics, Font, String)} instead */ @Deprecated public static Rectangle2D getStringBounds(Graphics g, Font f, String s) { return GraphicsUtil.getStringBounds(g, f, s); } /** * @deprecated Use {@link GraphicsUtil#getStringBounds(Component, String)} instead */ @Deprecated public static Rectangle2D getStringBounds(Component c, String s) { return GraphicsUtil.getStringBounds(c, s); } /** * @deprecated Use {@link GraphicsUtil#getStringBounds(Graphics, String)} instead */ @Deprecated public static Rectangle2D getStringBounds(Graphics g, String s) { return GraphicsUtil.getStringBounds(g, s); } /** * @deprecated uses {@link GraphicsUtil#drawHCenteredString(Graphics, String, int, int, boolean)} instead */ @Deprecated public static void drawHCenteredText(Graphics g, String string, int w, int y) { GraphicsUtil.drawHCenteredString(g, string, w / 2, y, false); } /** * @deprecated Use {@link GraphicsUtil#drawCenteredString(Graphics, String, int, int, boolean)} instead */ @Deprecated public static void drawCenteredText(Graphics g, String string, int w, int h) { GraphicsUtil.drawCenteredString(g, string, w / 2, h / 2, false); } }