/*
* ProgressPanel.java
*
* Created on August 15, 2006, 12:18 PM
*/
package edu.oregonstate.cartography.gui;
import java.awt.event.ActionListener;
import javax.swing.Action;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.KeyStroke;
import javax.swing.SwingUtilities;
/**
* ProgressPanel displays a progress dialog for lengthy operations.
*
* @author Bernhard Jenny, Institute of Cartography, ETH Zurich.
*/
public class ProgressPanel extends JPanel {
/**
* Creates new ProgressPanel. Must be called from the Swing Event Dispatch
* Thread. Important: Call dispose() when the panel is no longer needed,
* otherwise memory is leaked.
*/
public ProgressPanel() {
assert (SwingUtilities.isEventDispatchThread());
this.initComponents();
}
/**
* removeActionListeners() must be called when the panel is no longer needed and the
* parent dialog is disposed. This is to avoid a memory leak that may fill
* up heap space when listeners are not removed (which make garbage
* collecting a Frame impossible). Must be called from the Swing Event
* Dispatch Thread.
*/
public void removeActionListeners() {
assert (SwingUtilities.isEventDispatchThread());
ActionListener[] als = cancelButton.getActionListeners();
for (ActionListener al : als) {
cancelButton.removeActionListener(al);
}
cancelButton.getInputMap().clear();
cancelButton.getActionMap().clear();
}
/**
* This method is called from within the constructor to initialize the form.
* WARNING: Do NOT modify this code. The content of this method is always
* regenerated by the Form Editor.
*/
// <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
private void initComponents() {
java.awt.GridBagConstraints gridBagConstraints;
messageLabel = new javax.swing.JLabel();
progressBar = new javax.swing.JProgressBar();
cancelButton = new javax.swing.JButton();
setLayout(new java.awt.GridBagLayout());
messageLabel.setText("Working. Please wait…");
messageLabel.setMinimumSize(new java.awt.Dimension(350, 45));
messageLabel.setPreferredSize(new java.awt.Dimension(350, 45));
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridwidth = 2;
gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST;
gridBagConstraints.insets = new java.awt.Insets(0, 0, 10, 0);
add(messageLabel, gridBagConstraints);
progressBar.setPreferredSize(new java.awt.Dimension(250, 20));
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 0;
gridBagConstraints.gridy = 1;
gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
add(progressBar, gridBagConstraints);
cancelButton.setText("Cancel");
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 1;
gridBagConstraints.gridy = 1;
gridBagConstraints.anchor = java.awt.GridBagConstraints.EAST;
gridBagConstraints.insets = new java.awt.Insets(0, 12, 0, 0);
add(cancelButton, gridBagConstraints);
}// </editor-fold>//GEN-END:initComponents
/**
* Removes the message field.
*/
public void removeMessageField() {
assert (SwingUtilities.isEventDispatchThread());
remove(messageLabel);
}
/**
* Removes the cancel button field.
*/
public void removeCancelButton() {
assert (SwingUtilities.isEventDispatchThread());
remove(cancelButton);
}
public void horizontalDesign() {
assert (SwingUtilities.isEventDispatchThread());
removeMessageField();
messageLabel = new JLabel();
java.awt.GridBagConstraints gridBagConstraints;
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 2;
gridBagConstraints.gridy = 1;
gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST;
gridBagConstraints.insets = new java.awt.Insets(0, 12, 0, 0);
add(messageLabel, gridBagConstraints);
revalidate(); //force panel to lay out components again
repaint();
}
/**
* Update the progress indicator. Switches to GUI with determinate length
* if the length is currently indeterminate.
* @param percentage Progress between 0 and 100.
*/
public void progress(final int percentage) {
assert (SwingUtilities.isEventDispatchThread());
progressBar.setIndeterminate(false);
progressBar.setValue(percentage);
}
/**
* @param cancelAction A callback handler that is called when the
* user presses the cancel button or the escape key.
*/
public void setCancelAction(Action cancelAction) {
assert (SwingUtilities.isEventDispatchThread());
cancelButton.addActionListener(cancelAction);
cancelButton.getInputMap().put(KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_ESCAPE,
0, true), "EscapeKey");
cancelButton.getActionMap().put("EscapeKey", cancelAction);
}
/**
* Enable or disable the cancel button
* @param cancellable If true the cancel button is enabled.
*/
public void setCancellable(boolean cancellable) {
assert (SwingUtilities.isEventDispatchThread());
cancelButton.setEnabled(cancellable);
}
/**
* Update the GUI message.
* @param msg The new message to display.
*/
public void setMessage(final String msg) {
assert (SwingUtilities.isEventDispatchThread());
messageLabel.setText(msg);
messageLabel.revalidate();
messageLabel.paintImmediately(messageLabel.getVisibleRect());
}
/**
* An indeterminate progress bar has not defined length.
* @param indeterminate
*/
public void setIndeterminate(boolean indeterminate) {
assert (SwingUtilities.isEventDispatchThread());
progressBar.setIndeterminate(indeterminate);
}
// Variables declaration - do not modify//GEN-BEGIN:variables
private javax.swing.JButton cancelButton;
private javax.swing.JLabel messageLabel;
private javax.swing.JProgressBar progressBar;
// End of variables declaration//GEN-END:variables
}