/* * org.openmicroscopy.shoola.util.ui.tdialog.TinyWindowUI * *------------------------------------------------------------------------------ * Copyright (C) 2006-2014 University of Dundee. All rights reserved. * * * This program 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 2 of the License, or * (at your option) any later version. * This program 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 this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * *------------------------------------------------------------------------------ */ package org.openmicroscopy.shoola.util.ui.tdialog; //Java imports import java.awt.BorderLayout; import java.awt.Color; import java.awt.Component; import java.awt.Container; import java.awt.Dimension; import java.awt.Insets; import java.awt.event.ActionListener; import java.awt.event.MouseListener; import java.awt.event.MouseMotionListener; import java.awt.event.MouseWheelListener; import java.awt.image.BufferedImage; import java.util.List; import javax.swing.BorderFactory; import javax.swing.JButton; import javax.swing.JComponent; import javax.swing.JRootPane; import javax.swing.border.BevelBorder; //Third-party libraries //Application-internal dependencies /** * The UI delegate for the {@link TinyDialog}. * A delegate can't be shared among different instances of {@link TinyDialog} * and has a life-time dependency with its owning frame. * * * @author Jean-Marie Burel      * <a href="mailto:j.burel@dundee.ac.uk">j.burel@dundee.ac.uk</a> * @author <br>Andrea Falconi      * <a href="mailto:a.falconi@dundee.ac.uk"> * a.falconi@dundee.ac.uk</a> * @version 2.2 * <small> * (<b>Internal version:</b> $Revision: 4724 $ $Date: 2007-01-17 08:46:48 +0000 (Wed, 17 Jan 2007) $) * </small> * @since OME2.2 */ public class TinyDialogUI { /** The maximum of width of the window. */ public static final int MAX_WIDTH = 300; /** The maximum of height of the window. */ public static final int MAX_HEIGHT = 300; /** The thickness of the frame's border. */ static final int BORDER_THICKNESS = 2; /** The color of the frame's border. */ static final Color BORDER_COLOR = new Color(99, 130, 191); /** * The highlight color to use for the inner border surrounding the * frame's contents. */ static final Color INNER_BORDER_HIGHLIGHT = new Color(240, 240, 240); /** * The shadow color to use for the inner border surrounding the * frame's contents. */ static final Color INNER_BORDER_SHADOW = new Color(200, 200, 200); /** The inner padding value. */ static final int INNER_PADDING = 1; /** The window that owns this UI delegate. */ private TinyDialog window; /** The component that draws the window's title bar. */ private TitleBar titleBar; /** The component that displays the image. */ private JComponent canvas; /** Creates and sets the window and its content's borders. */ void makeBorders(int increment) { JRootPane rootPane = window.getRootPane(); rootPane.setBorder( BorderFactory.createLineBorder(BORDER_COLOR, BORDER_THICKNESS+increment)); if (canvas != null) { canvas.setBorder(BorderFactory.createBevelBorder( BevelBorder.LOWERED, INNER_BORDER_HIGHLIGHT, INNER_BORDER_SHADOW)); } } /** * Sets the size and preferred size of the canvas. * * @param w The width of the image. * @param h The height of the image. */ private void makeComponentsSize(int w, int h) { if (canvas == null) return; Insets i = canvas.getInsets(); int width = w+i.right+i.left; int height = h+i.top+i.bottom; Dimension d = new Dimension(width, height); canvas.setPreferredSize(d); canvas.setSize(d); } /** Builds and lays out the UI. */ private void buildUI() { Container container = window.getContentPane(); container.add(titleBar, BorderLayout.NORTH); if (canvas != null) container.add(canvas, BorderLayout.CENTER); } /** * Adds the specified component to the container. * * @param c The component to add. */ private void addComponent(JComponent c) { Container container = window.getContentPane(); Component[] comps = container.getComponents(); boolean in = false; for (int i = 0; i < comps.length; i++) { if (comps[i].equals(c)) { in = true; break; } } if (!in) { container.add(c, BorderLayout.CENTER); window.repaint(); } } /** * Removes the specified component from the container. * * @param c The component to remove. */ private void removeComponent(JComponent c) { window.getContentPane().remove(c); } /** * Attaches the <code>controller</code> and sets an action command * to the specified button. * * @param controller An instance of {@link ActionListener}. * @param b The button. * @param id Action command ID. */ private void attachButtonListener(ActionListener controller, JButton b, int id) { if (b == null) return; b.addActionListener(controller); b.setActionCommand(""+id); } /** * Sets the window and initializes the title bar. * * @param window The window to set. */ private void initialize(TinyDialog window) { if (window == null) throw new NullPointerException("No window."); this.window = window; titleBar = new TitleBar(window.getTitle(), window.getButtonIndex()); } /** * Creates a new UI delegate for the specified <code>window</code>. * * @param window The window that will own this UI delegate. * Mustn't be <code>null</code>. * @param image The bufferedImage to display. * Mustn't be <code>null</code>. */ TinyDialogUI(TinyDialog window, BufferedImage image) { initialize(window); canvas = new ThumbnailCanvas(image); canvas.setToolTipText(window.title); makeComponentsSize(image.getWidth(), image.getHeight()); makeBorders(0); buildUI(); } /** * Creates a new UI delegate for the specified <code>window</code>. * * @param window The window that will own this UI delegate. * Mustn't be <code>null</code>. * @param c The component to display. * Mustn't be <code>null</code>. */ TinyDialogUI(TinyDialog window, JComponent c) { if (c == null) throw new NullPointerException("No component."); initialize(window); canvas = c; makeBorders(0); buildUI(); } /** * Creates a new UI delegate for the specified <code>window</code>. * * @param window The window that will own this UI delegate. * Mustn't be <code>null</code>. */ TinyDialogUI(TinyDialog window) { initialize(window); makeBorders(0); buildUI(); } /** * Sets the image to paint if the canvas is an instance of * <code>ThumbnailCanvas</code>. * * @param image The image to paint. */ void setImage(BufferedImage image) { if (canvas instanceof ThumbnailCanvas) { makeComponentsSize(image.getWidth(), image.getHeight()); ((ThumbnailCanvas) canvas).setImage(image); //window.getContentPane().removeAll(); //buildUI(); window.pack(); } } /** * Adds a {@link MouseWheelListener} to the canvas if the canvas is * an instance of <code>ThumbnailCanvas</code>. * * @param controller The listener to add. */ void attachMouseWheelListener(MouseWheelListener controller) { if (canvas instanceof ThumbnailCanvas) canvas.addMouseWheelListener(controller); } /** * Attaches the <code>controller</code> to the buttons of the titleBar. * * @param controller An instance of {@link DialogControl}. */ void attachActionListener(ActionListener controller) { attachButtonListener(controller, titleBar.getButton(TitleBar.SIZE_BUTTON), DialogControl.SIZE); attachButtonListener(controller, titleBar.getButton(TitleBar.CLOSE_BUTTON), DialogControl.CLOSE); } /** * Attaches the <code>controller</code> to the titleBar. * * @param controller An instance of {@link DialogControl}. */ void attachMouseMotionListener(MouseMotionListener controller) { titleBar.addMouseMotionListener(controller); } /** Updates and repaints the title bar. */ void updateTitleBar() { titleBar.update(window.getTitle()); } /** * Repaints the window according to whether the window is currently * collapsed or expanded. */ void updateCollapsedState() { SizeButton button = (SizeButton) titleBar.getButton(TitleBar.SIZE_BUTTON); if (window.isCollapsed()) { removeComponent(canvas); Dimension d = new Dimension(window.getWidth(), TitleBar.HEIGHT+2*BORDER_THICKNESS); titleBar.setPreferredSize(d); button.setActionType(SizeButton.EXPAND); window.setSize(d.width, d.height); } else { addComponent(canvas); button.setActionType(SizeButton.COLLAPSE); Dimension dT = titleBar.getPreferredSize(); Dimension dW = window.getRestoreSize(); window.setSize(dT.width, dW.height); } window.validate(); window.repaint(); } /** Hides and disposes depending on the state of the window. */ void updateClosedState() { if (window.isClosed()) { window.setVisible(false); window.dispose(); } } /** * Sets the node's decoration. * * @param l The collection of <code>component</code>s to add to the * <code>TitleBar</code>. */ void setDecoration(List l) { if (titleBar == null) return; titleBar.setDecoration(l, window.getButtonIndex()); } /** * Sets the canvas. * * @param c The component to set. */ void setCanvas(JComponent c) { canvas = c; addComponent(canvas); } /** * Returns the canvas. * * @return See above. */ JComponent getCanvas() { return canvas; } /** * Derives the default font of the title bar. * * @param style The new style to set. */ void setFontStyle(int style) { titleBar.setFontStyle(style); } /** * Attaches the <code>controller</code> to the buttons of the titleBar. * * @param controller An instance of {@link DialogControl}. */ public void attachMouseListener(MouseListener controller) { titleBar.addMouseListener(controller); if (canvas instanceof ThumbnailCanvas) canvas.addMouseListener(controller); } }