/*
* The MIT License (MIT)
*
* Copyright (c) 2007-2015 Broad Institute
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*/
package org.broad.igv.ui.util;
import javax.swing.*;
import java.awt.*;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
/**
* Panel showing a progress bar, which can optionally close parent window when finished
* @author eflakes
*/
public class ProgressBar extends JPanel
implements PropertyChangeListener {
private boolean isReady = false;
private JProgressBar progressBar;
private boolean closeOnCompletion = false;
private Window progressParentWindow;
private ProgressMonitor monitor;
public ProgressBar(Window progressParentWindow, int minimumProgress, int maximumProgress, boolean closeOnCompletion, ProgressMonitor monitor) {
this.progressParentWindow = progressParentWindow;
this.closeOnCompletion = closeOnCompletion;
this.monitor = monitor;
setLayout(new BorderLayout());
progressBar = new JProgressBar(minimumProgress, maximumProgress);
progressBar.setIndeterminate(true); // Indeterminate by default
this.add(progressBar);
setReady(true);
}
public void setIndeterminate(boolean value) {
progressBar.setIndeterminate(value);
}
public void propertyChange(PropertyChangeEvent evt) {
if (isReady()) {
if (ProgressMonitor.PROGRESS_PROPERTY.equalsIgnoreCase(evt.getPropertyName())) {
int value = (Integer) evt.getNewValue();
final int progress;
if (value > progressBar.getMaximum()) {
progress = 100;
} else {
progress = value;
}
progressBar.setValue(progress);
if (progress == 100 && closeOnCompletion) {
setReady(false); // Accept no more input
progressParentWindow.setVisible(false);
}
}
} else {
Object source = evt.getSource();
if (source instanceof ProgressMonitor) {
((ProgressMonitor) source).setReady(false);
}
}
}
static public class ProgressDialog extends JDialog {
private ProgressBar progressBar = null;
public ProgressDialog() {
super();
}
public ProgressDialog(Frame frame) {
super(frame);
}
public ProgressBar getProgressBar() {
return progressBar;
}
public void setProgressBar(ProgressBar progressBar) {
if(this.progressBar != null) throw new IllegalStateException("ProgressBar already set");
this.progressBar = progressBar;
getContentPane().add(progressBar);
}
}
/**
* Initialize a ProgressDialog but do not show it
* @param dialogsParent
* @param title
* @param monitor
* @param closeOnCompletion
* @return
*/
private static ProgressDialog createProgressDialog(Frame dialogsParent, String title, ProgressMonitor monitor, boolean closeOnCompletion) {
ProgressDialog progressDialog = null;
if (dialogsParent == null) {
progressDialog = new ProgressDialog();
progressDialog.setSize(500, 25);
// Center on screen
UIUtilities.centerWindow(progressDialog);
} else {
progressDialog = new ProgressDialog(dialogsParent);
progressDialog.setSize(500, 25);
if (dialogsParent.isVisible()) {
progressDialog.setLocationRelativeTo(dialogsParent);
} else {
// Center on screen
UIUtilities.centerWindow(progressDialog);
}
}
final ProgressBar bar = new ProgressBar(progressDialog, 0, 100, closeOnCompletion, monitor);
bar.setSize(500, 25);
bar.setPreferredSize(bar.getSize());
progressDialog.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
progressDialog.addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) {
bar.setReady(false);
}
});
progressDialog.setModal(false);
progressDialog.setTitle(title);
progressDialog.setProgressBar(bar);
monitor.addPropertyChangeListener(bar);
progressDialog.setModalExclusionType(Dialog.ModalExclusionType.APPLICATION_EXCLUDE);
return progressDialog;
}
/**
* Create and show a ProgressDialog
* @param dialogsParent
* @param title
* @param monitor
* @param closeOnCompletion
* @return
*/
public static ProgressDialog showProgressDialog(Frame dialogsParent, String title, ProgressMonitor monitor, boolean closeOnCompletion){
ProgressDialog progressDialog = createProgressDialog(dialogsParent, title, monitor, closeOnCompletion);
progressDialog.pack();
progressDialog.setVisible(true);
progressDialog.toFront();
return progressDialog;
}
/**
* Set the progress bars value.
*
* @param value The new value set on the progress bar.
*/
public void setValue(int value) {
progressBar.setValue(value);
if (value > 99 && closeOnCompletion) {
setReady(false); // Accept no more input
if(progressParentWindow != null){
progressParentWindow.setVisible(false);
}
}
}
/**
* Get the current progress amount from the progress bar.
*
* @return
*/
public int getValue() {
return progressBar.getValue();
}
/**
* Reset the progress bar to 0.
*/
public void reset() {
progressBar.setValue(0);
}
/**
* Sets whether or not this class will respond to progress requests.
*
* @param ready
*/
public void setReady(boolean ready) {
isReady = ready;
if (monitor != null) {
monitor.setReady(ready);
}
}
/**
* returns whether or not this class will respond to progress requests.
*
* @return
*/
public boolean isReady() {
return isReady;
}
}