/* * org.openmicroscopy.shoola.util.ui.tdialog.TinyWindow * *------------------------------------------------------------------------------ * Copyright (C) 2006-2015 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.Dimension; import java.awt.Frame; import java.awt.Point; import java.awt.event.WindowEvent; import java.awt.event.WindowFocusListener; import java.awt.image.BufferedImage; import java.util.List; import javax.swing.JComponent; import javax.swing.JDialog; import org.openmicroscopy.shoola.util.ui.UIUtilities; //Third-party libraries //Application-internal dependencies /** * A tiny-looking non-modal and non-resizable JDialog without decoration. * <p>This window has a small title bar and an JComponent to display the * image. * <p>The window behaves mostly like a regular window, but has a close and * sizing button allowing to collapse/expand the window contents.</p> * * @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 * @since OME2.2 */ public class TinyDialog extends JDialog { /** Bound property name indicating if the window is collapsed. */ public final static String COLLAPSED_PROPERTY = "collapsed"; /** Bound property name indicating if the window is closed. */ public final static String CLOSED_PROPERTY = "closedDialog"; /** Bound property name indicating if the window's title has changed. */ public final static String TITLE_PROPERTY = "title"; /** Indicates to show both the close and size buttons. */ public final static int BOTH = 0; /** Indicates to only show the close button. */ public final static int CLOSE_ONLY = 1; /** Indicates to only show the size button. */ public final static int SIZE_ONLY = 2; /** Indicates to only show the size button. */ public final static int NO_BUTTON = 3; /** The minimum magnification value. */ final static int MINIMUM_ZOOM = 1; /** The maximum magnification value. */ final static int MAXIMUM_ZOOM = 2; /** The size of the frame before the last collapse request. */ private Dimension restoreSize; /** The View component that renders this frame. */ protected TinyDialogUI uiDelegate; /** The Controller component that renders this frame. */ protected DialogControl controller; /** Tells if this window is expanded or collapsed. */ private boolean collapsed; /** Tells if this window is closed or not. */ private boolean closed; /** The image to display. */ private BufferedImage originalImage; /** The magnification factor. */ private float zoomFactor; /** * One of the following: {@link #BOTH}, {@link #CLOSE_ONLY} or * {@link #SIZE_ONLY}. */ private int buttonIndex; /** The title displayed in this window's title bar. */ protected String title; /** Sets the property of the dialog window. */ private void setProperties() { setModal(false); setResizable(false); setUndecorated(true); setRestoreSize(new Dimension(getWidth(), getHeight())); zoomFactor = MINIMUM_ZOOM; addWindowFocusListener(new WindowFocusListener() { /** * Closes the dialog when the window loses focus. * * @see WindowFocusListener#windowLostFocus(WindowEvent) */ public void windowLostFocus(WindowEvent evt) { TinyDialog d = (TinyDialog) evt.getSource(); d.setClosed(true); d.closeWindow(); } /** * Required by the I/F but no-operation in our case. * * @see WindowFocusListener#windowGainedFocus(WindowEvent) */ public void windowGainedFocus(WindowEvent evt) { } }); } /** * Returns the original image to display. * * @return See above. */ BufferedImage getOriginalImage() { return originalImage; } /** * Returns the magnification factor. * * @return See above. */ float getZoomFactor() { return zoomFactor; } /** * Sets the magnification factor. * * @param v The value to set. */ void setZoomFactor(float v) { zoomFactor = v; } /** * Sets the size to used to restore the size of the component * when the frame is expanded. * * @param d The size to set. */ void setRestoreSize(Dimension d) { restoreSize = d; } /** * Returns the size used to restore the size of the component * when the frame is expanded. * * @return See above. */ Dimension getRestoreSize() { return restoreSize; } /** * Returns the type of buttons to display in the tool bar. * * @return See above. */ int getButtonIndex() { return buttonIndex; } /** * Creates a new window with the specified owner frame. * * @param owner The parent's of the window. Mustn't be <code>null</code>. * @param image The bufferedImage to display. Mustn't be <code>null</code>. */ public TinyDialog(Frame owner, BufferedImage image) { this(owner, image, null); } /** * Creates a new window with the specified owner frame. * * @param owner The parent's of the window. Mustn't be <code>null</code>. * @param image The bufferedImage to display. Mustn't be <code>null</code>. * @param title The window's title. */ public TinyDialog(Frame owner, BufferedImage image, String title) { super(owner); setProperties(); if (image == null) throw new NullPointerException("No image."); this.title = title; originalImage = image; zoomFactor = MINIMUM_ZOOM; buttonIndex = BOTH; //Create the View and the Controller. uiDelegate = new TinyDialogUI(this, image); controller = new DialogControl(this, uiDelegate); uiDelegate.attachMouseWheelListener(controller); } /** * Creates a new window with the specified owner frame. * * @param owner The parent's of the window. Mustn't be <code>null</code>. * @param c The component to display. Mustn't be <code>null</code>. */ public TinyDialog(Frame owner, JComponent c) { this(owner, c, null); } /** * Creates a new window with the specified owner frame. * * @param owner The parent's of the window. Mustn't be <code>null</code>. * @param c The component to display. Mustn't be <code>null</code>. * @param index The type of button to display in the tool bar. */ public TinyDialog(Frame owner, JComponent c, int index) { this(owner, c, index, null); } /** * Creates a new window with the specified owner frame. * * @param owner The parent's of the window. Mustn't be <code>null</code>. * @param c The component to display. Mustn't be <code>null</code>. * @param index The type of button to display in the tool bar. * @param title The window's title. */ public TinyDialog(Frame owner, JComponent c, int index, String title) { super(owner); //if (owner == null) throw new NullPointerException("No owner."); this.title = title; buttonIndex = index; //Create the View and the Controller. if (c == null) uiDelegate = new TinyDialogUI(this); else uiDelegate = new TinyDialogUI(this, c); controller = new DialogControl(this, uiDelegate); setProperties(); } /** * Creates a new window with the specified owner frame. * * @param owner The parent's of the window. Mustn't be <code>null</code>. * @param c The component to display. Mustn't be <code>null</code>. * @param title The window's title. */ public TinyDialog(Frame owner, JComponent c, String title) { this(owner, c, BOTH, title); } /** * Creates a new window with the specified owner frame. * * @param owner The parent's of the window. Mustn't be <code>null</code>. * @param title The window's title. * @param index The type of button to display in the tool bar. */ public TinyDialog(Frame owner, String title, int index) { super(owner); this.title = title; this.buttonIndex = index; if (owner == null) throw new NullPointerException("No owner."); uiDelegate = new TinyDialogUI(this); controller = new DialogControl(this, uiDelegate); setProperties(); } /** * Returns the canvas. * * @return See above. */ public JComponent getCanvas() { return uiDelegate.getCanvas(); } /** Moves the window to the Front. */ public void moveToFront() { setVisible(true); } /** * Moves the window to the Front and sets the location. * * @param x The x-coordinate. * @param y The y-coordinate. */ public void moveToFront(int x, int y) { setLocation(x, y); setVisible(true); } /** * Moves the window and sets the location. * * @param p The new location. */ public void moveToFront(Point p) { moveToFront(p.x, p.y); } /** * Returns the title of the <code>TinyWindow</code>. * * @return a <code>String</code> containing this window's title * @see #setTitle */ public String getTitle() { return title; } /** * Sets the <code>TinyWindow</code> title. The <code>title</code> * may have a <code>null</code> value. * @see #getTitle * * @param title The <code>String</code> to display in the title bar. */ public void setTitle(String title) { String oldValue = this.title; this.title = title; firePropertyChange(TITLE_PROPERTY, oldValue, title); } /** * Collapses or expands this frame depending on the passed value. * This is a bound property; property change listeners are notified * of any change to this property. * * @param b Pass <code>true</code> to collapse, <code>false</code> to * expand. */ public void setCollapsed(boolean b) { if (b == collapsed) return; //We're already in the requested state. if (!collapsed) setRestoreSize(new Dimension(getWidth(), getHeight())); //Fire the state change. Boolean oldValue = collapsed ? Boolean.TRUE : Boolean.FALSE, newValue = b ? Boolean.TRUE : Boolean.FALSE; collapsed = b; firePropertyChange(COLLAPSED_PROPERTY, oldValue, newValue); } /** * Tells if this frame is expanded or collapsed. * * @return <code>true</code> if collapsed, <code>false</code> if expanded. */ public boolean isCollapsed() { return collapsed; } /** * Closes or opens this window depending on the passed value. * This is a bound property; property change listeners are notified * of any change to this property. * * @param b Pass <code>true</code> to close, <code>false</code> otherwise. */ public void setClosed(boolean b) { if (b == closed) return; //We're already in the requested state. //Fire the state change. Boolean oldValue = closed ? Boolean.TRUE : Boolean.FALSE, newValue = b ? Boolean.TRUE : Boolean.FALSE; closed = b; firePropertyChange(CLOSED_PROPERTY, oldValue, newValue); } /** * Sets the node's decoration. * * @param l The collection of <code>component</code>s to add to the * <code>TitleBar</code>. */ public void setDecoration(List l) { if (uiDelegate == null) return; uiDelegate.setDecoration(l); } /** * Sets the canvas. * * @param c The component to set. */ public void setCanvas(JComponent c) { if (uiDelegate == null || c == null) return; uiDelegate.setCanvas(c); } /** * Tells if this window is closed or not. * * @return <code>true</code> if closed, <code>false</code> otherwise. */ public boolean isClosed() { return closed; } /** Closes and disposes. */ public void closeWindow() { uiDelegate.updateClosedState(); } /** * Modifies the style of the font of the title. * * @param style The style to set. */ public void setFontTitleStyle(int style) { uiDelegate.setFontStyle(style); } /** * Overrides the method. * If the specified flag is <code>true</code>, we attach a * {@link BorderListener}. * @see JDialog#setResizable(boolean) */ public void setResizable(boolean b) { super.setResizable(b); if (b) { BorderListener l = new BorderListener(this); getRootPane().addMouseMotionListener(l); getRootPane().addMouseListener(l); //increase border. uiDelegate.makeBorders(4); } } /** * Overrides the method to make sure that we have no decoration. * @see JDialog#setUndecorated(boolean) */ public void setUndecorated(boolean b) { super.setUndecorated(true); } @Override public void setVisible(boolean b) { super.setVisible(b); if (b) UIUtilities.applyGnome3Workaround(this); } }