/*
* org.openmicroscopy.shoola.agents.treeviewer.view.LoadingWindow
*
*------------------------------------------------------------------------------
* Copyright (C) 2006 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.agents.treeviewer.view;
//Java imports
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import javax.swing.BorderFactory;
import javax.swing.Box;
import javax.swing.BoxLayout;
import javax.swing.Icon;
import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JProgressBar;
//Third-party libraries
//Application-internal dependencies
import org.openmicroscopy.shoola.util.ui.MultilineLabel;
/**
* The window brought up on screen during data loading.
*
* @author Jean-Marie Burel
* <a href="mailto:j.burel@dundee.ac.uk">j.burel@dundee.ac.uk</a>
* @version 2.2
* <small>
* (<b>Internal version:</b> $Revision$ $Date$)
* </small>
* @since OME2.2
*/
public class LoadingWindow
extends JDialog
{
/** The default message displayed during the saving process. */
private static final String SAVING_MSG = "Saving the data and " +
"Updating the display.";
/** The default message displayed during the loading process */
private static final String LOADING_MSG = "Loading Data and " +
"Building the display.";
/** The default title for this window. */
private static final String LOADING_TITLE = "Loading Data";
/**
* The preferred size of the widget that displays the notification message.
* Only the part of text that fits into this display area will be displayed.
*/
private static final Dimension MSG_AREA_SIZE = new Dimension(300, 50);
/**
* The size of the invisible components used to separate widgets
* horizontally.
*/
private static final Dimension H_SPACER_SIZE = new Dimension(20, 1);
/**
* The size of the invisible components used to separate widgets
* vertically.
*/
private static final Dimension V_SPACER_SIZE = new Dimension(1, 20);
/** The panel hosting the message. */
private JPanel messagePanel;
/** The {@link MultilineLabel} hosting the message. */
private MultilineLabel messageLabel;
/** Hides and disposes of the dialog. */
private JButton cancelButton;
/** The bar notifying the user for the data retrieval progress. */
private JProgressBar progressBar;
/** Creates the various UI components that make up the dialog. */
private void createComponents()
{
cancelButton = new JButton("Cancel");
progressBar = new JProgressBar();
progressBar.setVisible(true);
progressBar.setIndeterminate(true);
messageLabel = new MultilineLabel(LOADING_MSG);
messageLabel.setPreferredSize(MSG_AREA_SIZE);
messageLabel.setAlignmentY(TOP_ALIGNMENT);
}
/**
* Binds the {@link #close() close} action to the exit event generated
* either by the close icon or by the {@link #cancelButton}.
*/
private void attachListeners()
{
addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent we) { close(); }
});
cancelButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) { close(); }
});
}
/**
* Hides the dialog and fires an event to cancel any ongoing
* data retrieval.
*/
private void close()
{
setVisible(false);
firePropertyChange(TreeViewer.CANCEL_LOADING_PROPERTY, Boolean.FALSE,
Boolean.TRUE);
}
/**
* Builds and lays out the panel hosting the buttons.
*
* @return See above.
*/
private JPanel buildButtonsPanel()
{
JPanel buttonsPanel = new JPanel();
buttonsPanel.setLayout(new BoxLayout(buttonsPanel, BoxLayout.X_AXIS));
buttonsPanel.add(Box.createHorizontalGlue());
buttonsPanel.add(cancelButton);
buttonsPanel.add(Box.createRigidArea(H_SPACER_SIZE));
return buttonsPanel;
}
/**
* Builds and lays out the panel hosting the message.
*
* @return See above.
*/
private JPanel buildMessagePanel()
{
messagePanel = new JPanel();
messagePanel.setLayout(new BoxLayout(messagePanel, BoxLayout.X_AXIS));
Icon icon = null;
JLabel iconLabel = new JLabel(icon);
iconLabel.setAlignmentY(TOP_ALIGNMENT);
messagePanel.add(iconLabel);
messagePanel.add(Box.createRigidArea(H_SPACER_SIZE));
messagePanel.add(messageLabel);
messagePanel.setOpaque(true);
return messagePanel;
}
/** Builds and lays out the GUI. */
private void buildGUI()
{
JPanel contentPanel = new JPanel();
contentPanel.setBorder(BorderFactory.createCompoundBorder(
BorderFactory.createEtchedBorder(),
BorderFactory.createEmptyBorder(5, 5, 15, 10)));
contentPanel.setLayout(new BoxLayout(contentPanel, BoxLayout.Y_AXIS));
contentPanel.add(buildMessagePanel());
contentPanel.add(Box.createRigidArea(V_SPACER_SIZE));
contentPanel.add(progressBar);
contentPanel.add(Box.createRigidArea(V_SPACER_SIZE));
contentPanel.add(buildButtonsPanel());
contentPanel.setOpaque(true);
getContentPane().add(contentPanel);
}
/**
* Creates a new instance.
*
* @param owner The owner of the frame.
*/
public LoadingWindow(JFrame owner)
{
super(owner, LOADING_TITLE, true);
setResizable(false);
createComponents();
attachListeners();
buildGUI();
pack();
}
/**
* Overrides the method to set the message corresponding to the title.
* @see JDialog#setTitle(String)
*/
public void setTitle(String title)
{
super.setTitle(title);
if (title.equals(TreeViewer.SAVING_TITLE))
messageLabel.setText(SAVING_MSG);
else if (title.equals(LOADING_TITLE)) messageLabel.setText(LOADING_MSG);
}
/**
* Overridden to reset the default message and title when the window
* is closed.
* @see JDialog#setVisible(boolean)
*/
public void setVisible(boolean b)
{
super.setVisible(b);
if (!b) setTitle(LOADING_TITLE);
}
}