/***************************************************
*
* cismet GmbH, Saarbruecken, Germany
*
* ... and it just works.
*
****************************************************/
package Sirius.navigator.ui.progress;
import Sirius.navigator.method.MultithreadedMethod;
import org.apache.log4j.Logger;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.SwingUtilities;
import javax.swing.Timer;
import javax.swing.event.SwingPropertyChangeSupport;
/**
* DOCUMENT ME!
*
* @author Peter Alzheimer
* @version $Revision$, $Date$
*/
public class ProgressPanel extends javax.swing.JPanel {
//~ Instance fields --------------------------------------------------------
protected final Logger logger;
private final Timer progressTimer;
private ProgressObserver progressObserver;
private boolean locked = false;
private SwingPropertyChangeSupport propertyChangeSupport = new SwingPropertyChangeSupport(this);
// Variables declaration - do not modify//GEN-BEGIN:variables
private javax.swing.JPanel buttonPanel;
private javax.swing.JButton cancelButton;
private javax.swing.JProgressBar progressBar;
private javax.swing.JLabel progressLabel;
private javax.swing.JPanel progressPanel;
private javax.swing.JButton restartButton;
private javax.swing.JLabel titleLabel;
// End of variables declaration//GEN-END:variables
//~ Constructors -----------------------------------------------------------
/**
* Creates new form ProgressPanel.
*/
public ProgressPanel() {
this.progressTimer = new Timer(500, new TimerListener());
this.logger = Logger.getLogger(this.getClass());
initComponents();
}
//~ Methods ----------------------------------------------------------------
/**
* DOCUMENT ME!
*
* @param method DOCUMENT ME!
*/
public void invokeMethod(final MultithreadedMethod method) // throws Exception
{
this.invokeMethod(method, null);
}
/**
* DOCUMENT ME!
*
* @param method DOCUMENT ME!
* @param arguments DOCUMENT ME!
*
* @throws RuntimeException DOCUMENT ME!
*/
public void invokeMethod(final MultithreadedMethod method, final Object arguments) // throws Exception
{
if (logger.isDebugEnabled()) {
logger.debug("invoking new multithreaded method"); // NOI18N
}
if (!isLocked() && !progressTimer.isRunning() && (method.getProgressObserver() != null)) {
method.invoke(arguments);
this.start(method.getProgressObserver());
} else {
logger.error("can not invoke method: progress panel is locked (" + isLocked()
+ "), progress timer is running (" + progressTimer.isRunning()
+ ") or progress observer is null (" + method.getProgressObserver() + ")"); // NOI18N
throw new RuntimeException("can not invoke method: progress panel is locked (" + isLocked()
+ "), progress timer is running (" + progressTimer.isRunning()
+ ") or progress observer is null (" + method.getProgressObserver() + ")"); // NOI18N
}
}
/**
* DOCUMENT ME!
*
* @param progressObserver DOCUMENT ME!
*/
public void start(final ProgressObserver progressObserver) {
if (logger.isDebugEnabled()) {
logger.debug("starting progress observer '" + progressObserver.getName() + "' ("
+ progressObserver.getMessage() + ")"); // NOI18N
}
if (!isLocked() && !progressTimer.isRunning()) {
setLocked(true);
this.progressObserver = progressObserver;
if (SwingUtilities.isEventDispatchThread()) {
this.reset();
} else {
try {
if (logger.isDebugEnabled()) {
logger.debug("synchronizing method 'reset'"); // NOI18N
}
SwingUtilities.invokeAndWait(new Runnable() {
@Override
public void run() {
reset();
}
});
} catch (Exception exp) {
logger.warn("could not synchronize method 'reset':\n" + exp.getMessage()); // NOI18N
this.reset();
}
}
progressTimer.setDelay(progressObserver.getDelay());
progressTimer.start();
} else {
logger.error("can not start: progress panel is locked (" + isLocked() + ") or progress timer is running ("
+ progressTimer.isRunning() + ")"); // NOI18N
}
}
/**
* DOCUMENT ME!
*/
private void reset() {
if (logger.isDebugEnabled()) {
logger.debug("resetting progress panel"); // NOI18N
}
progressBar.setMinimum(0);
progressBar.setMaximum(progressObserver.getMaxProgress());
progressBar.setValue(0);
progressBar.setString(null);
progressBar.setIndeterminate(progressObserver.isIndeterminate());
progressBar.setStringPainted(!progressObserver.isIndeterminate());
titleLabel.setText(progressObserver.getName());
progressLabel.setText(progressObserver.getMessage());
cancelButton.setEnabled(progressObserver.isInterruptible());
restartButton.setEnabled(progressObserver.isRestartable());
}
/**
* DOCUMENT ME!
*/
protected void interrupted() {
logger.warn("progress observer interrupted"); // NOI18N
progressBar.setIndeterminate(false);
progressTimer.stop();
this.setProgress();
setLocked(false);
propertyChangeSupport.firePropertyChange("interrupted", new Boolean(false), new Boolean(true)); // NOI18N
}
/**
* DOCUMENT ME!
*/
protected void finished() {
if (logger.isDebugEnabled()) {
logger.debug("progress observer finished"); // NOI18N
}
progressBar.setIndeterminate(false);
progressTimer.stop();
this.setProgress();
setLocked(false);
propertyChangeSupport.firePropertyChange("finished", new Boolean(false), new Boolean(true)); // NOI18N
}
/**
* DOCUMENT ME!
*/
protected void setProgress() {
progressLabel.setText(progressObserver.getMessage());
if (!progressObserver.isIndeterminate()) {
progressBar.setValue(progressObserver.getProgress());
}
}
/**
* DOCUMENT ME!
*
* @return DOCUMENT ME!
*/
protected boolean isLocked() {
return this.locked;
}
/**
* DOCUMENT ME!
*
* @param locked DOCUMENT ME!
*/
private void setLocked(final boolean locked) {
this.locked = locked;
}
/**
* 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;
progressPanel = new javax.swing.JPanel();
progressBar = new javax.swing.JProgressBar();
progressLabel = new javax.swing.JLabel();
buttonPanel = new javax.swing.JPanel();
restartButton = new javax.swing.JButton();
cancelButton = new javax.swing.JButton();
titleLabel = new javax.swing.JLabel();
setMinimumSize(new java.awt.Dimension(400, 175));
setPreferredSize(new java.awt.Dimension(400, 175));
setLayout(new java.awt.GridBagLayout());
progressPanel.setBorder(javax.swing.BorderFactory.createCompoundBorder(
javax.swing.BorderFactory.createEmptyBorder(5, 5, 5, 5),
javax.swing.BorderFactory.createEtchedBorder()));
progressPanel.setLayout(new java.awt.GridBagLayout());
progressBar.setStringPainted(true);
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 0;
gridBagConstraints.gridy = 1;
gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
gridBagConstraints.weightx = 1.0;
gridBagConstraints.insets = new java.awt.Insets(5, 20, 15, 20);
progressPanel.add(progressBar, gridBagConstraints);
progressLabel.setHorizontalAlignment(javax.swing.SwingConstants.CENTER);
progressLabel.setText(org.openide.util.NbBundle.getMessage(
ProgressPanel.class,
"ProgressPanel.progressLabel.initialText")); // NOI18N
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 0;
gridBagConstraints.gridy = 0;
gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
gridBagConstraints.weightx = 1.0;
gridBagConstraints.weighty = 1.0;
gridBagConstraints.insets = new java.awt.Insets(15, 15, 1, 15);
progressPanel.add(progressLabel, gridBagConstraints);
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridy = 1;
gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH;
gridBagConstraints.weightx = 1.0;
gridBagConstraints.weighty = 1.0;
add(progressPanel, gridBagConstraints);
buttonPanel.setLayout(new java.awt.GridLayout(1, 1, 5, 0));
restartButton.setText(org.openide.util.NbBundle.getMessage(
ProgressPanel.class,
"ProgressPanel.restartButton.text")); // NOI18N
restartButton.addActionListener(new java.awt.event.ActionListener() {
@Override
public void actionPerformed(final java.awt.event.ActionEvent evt) {
restartButtonActionPerformed(evt);
}
});
buttonPanel.add(restartButton);
cancelButton.setText(org.openide.util.NbBundle.getMessage(
ProgressPanel.class,
"ProgressPanel.cancelButton.text")); // NOI18N
cancelButton.addActionListener(new java.awt.event.ActionListener() {
@Override
public void actionPerformed(final java.awt.event.ActionEvent evt) {
cancelButtonActionPerformed(evt);
}
});
buttonPanel.add(cancelButton);
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridy = 2;
gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
gridBagConstraints.insets = new java.awt.Insets(1, 5, 5, 5);
add(buttonPanel, gridBagConstraints);
titleLabel.setHorizontalAlignment(javax.swing.SwingConstants.CENTER);
titleLabel.setText(org.openide.util.NbBundle.getMessage(ProgressPanel.class, "ProgressPanel.titleLabel.text")); // NOI18N
titleLabel.setBorder(javax.swing.BorderFactory.createEtchedBorder());
titleLabel.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER);
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
gridBagConstraints.ipadx = 15;
gridBagConstraints.ipady = 15;
gridBagConstraints.weightx = 1.0;
gridBagConstraints.insets = new java.awt.Insets(5, 5, 5, 5);
add(titleLabel, gridBagConstraints);
} // </editor-fold>//GEN-END:initComponents
/**
* DOCUMENT ME!
*
* @param evt DOCUMENT ME!
*/
private void cancelButtonActionPerformed(final java.awt.event.ActionEvent evt) //GEN-FIRST:event_cancelButtonActionPerformed
{ //GEN-HEADEREND:event_cancelButtonActionPerformed
if (logger.isDebugEnabled()) {
logger.debug("interrupting progess observer"); // NOI18N
}
if (isLocked()) {
progressTimer.stop();
progressLabel.setText(org.openide.util.NbBundle.getMessage(
ProgressPanel.class,
"ProgressPanel.progressLabel.canceldText")); // NOI18N
progressBar.setValue(progressObserver.getProgress());
progressObserver.setInterrupted(true);
} else {
logger.warn("can not cancel: progress panel is not locked (" + isLocked()
+ ") or progress timer is not running (" + progressTimer.isRunning() + ")"); // NOI18N
}
} //GEN-LAST:event_cancelButtonActionPerformed
/**
* DOCUMENT ME!
*
* @param evt DOCUMENT ME!
*/
private void restartButtonActionPerformed(final java.awt.event.ActionEvent evt) //GEN-FIRST:event_restartButtonActionPerformed
{ //GEN-HEADEREND:event_restartButtonActionPerformed
if (logger.isDebugEnabled()) {
logger.debug("restarting progess observer"); // NOI18N
}
if (isLocked()) {
progressTimer.stop();
progressLabel.setText(""); // NOI18N
progressBar.setValue(0);
progressBar.setString(null);
progressObserver.setInterrupted(true);
} else {
logger.warn("can not cancel: progress panel is not locked (" + isLocked()
+ ") or progress timer is not running (" + progressTimer.isRunning() + ")"); // NOI18N
}
} //GEN-LAST:event_restartButtonActionPerformed
/**
* Adds a PropertyChangeListener to the listener list.
*
* @param l The listener to add.
*/
@Override
public void addPropertyChangeListener(final java.beans.PropertyChangeListener l) {
propertyChangeSupport.addPropertyChangeListener(l);
}
/**
* Removes a PropertyChangeListener from the listener list.
*
* @param l The listener to remove.
*/
@Override
public void removePropertyChangeListener(final java.beans.PropertyChangeListener l) {
propertyChangeSupport.removePropertyChangeListener(l);
}
/**
* Getter for property finished.
*
* @return Value of property finished.
*/
protected boolean isFinished() {
return this.progressObserver.isFinished();
}
/**
* Getter for property interrupted.
*
* @return Value of property interrupted.
*/
protected boolean isInterrupted() {
return this.progressObserver.isInterrupted();
}
//~ Inner Classes ----------------------------------------------------------
/**
* DOCUMENT ME!
*
* @version $Revision$, $Date$
*/
private class TimerListener implements ActionListener {
//~ Methods ------------------------------------------------------------
@Override
public void actionPerformed(final ActionEvent evt) {
setLocked(true);
if (progressObserver != null) {
if (progressObserver.isInterrupted()) {
interrupted();
} else if (progressObserver.isFinished()) {
finished();
} else if ((progressObserver.getMaxProgress() - progressObserver.getProgress()) <= 0) {
finished();
} else {
setProgress();
}
}
}
}
}