001: /*
002: This library is free software; you can redistribute it and/or
003: modify it under the terms of the GNU General Public
004: License as published by the Free Software Foundation; either
005: version 2 of the license, or (at your option) any later version.
006: */
007:
008: package org.gjt.jclasslib.util;
009:
010: import javax.swing.*;
011: import java.awt.*;
012: import java.awt.event.ComponentAdapter;
013: import java.awt.event.ComponentEvent;
014:
015: /**
016: Dialog which displays indeterminate progress.
017:
018: @author <a href="mailto:jclasslib@ej-technologies.com">Ingo Kegel</a>
019: @version $Revision: 1.1 $ $Date: 2003/08/18 07:46:43 $
020: */
021: public class ProgressDialog extends JDialog {
022:
023: private static final int PROGRESS_BAR_WIDTH = 200;
024:
025: private Runnable runnable;
026:
027: private JProgressBar progressBar;
028: private JLabel lblMessage;
029:
030: /**
031: * Constructor.
032: * @param parent the parent frame.
033: * @param runnable the <tt>Runnable</tt> to be started on <tt>setVisible</tt>.
034: * @param message the initial status message.
035: */
036: public ProgressDialog(JFrame parent, Runnable runnable,
037: String message) {
038: super (parent);
039: init(runnable, message);
040: }
041:
042: /**
043: * Constructor.
044: * @param parent the parent dialog.
045: * @param runnable the <tt>Runnable</tt> to be started on <tt>setVisible</tt>.
046: * @param message the initial status message.
047: */
048: public ProgressDialog(JDialog parent, Runnable runnable,
049: String message) {
050: super (parent);
051: init(runnable, message);
052: }
053:
054: /**
055: * Set the current status message.
056: * @param message the message.
057: */
058: public void setMessage(String message) {
059: lblMessage.setText(message);
060: }
061:
062: /**
063: * Set the <tt>Runnable</tt> to be started on <tt>setVisible</tt>.
064: * @param runnable the <tt>Runnable</tt>.
065: */
066: public void setRunnable(Runnable runnable) {
067: this .runnable = runnable;
068: }
069:
070: public void setVisible(boolean visible) {
071: if (visible) {
072: progressBar.setIndeterminate(true);
073: GUIHelper.centerOnParentWindow(this , getOwner());
074: } else {
075: progressBar.setIndeterminate(false);
076: }
077: super .setVisible(visible);
078: }
079:
080: private void init(Runnable runnable, String message) {
081: setupControls();
082: setupComponent();
083: setupEventHandlers();
084: setMessage(message);
085: setRunnable(runnable);
086: }
087:
088: private void setupControls() {
089:
090: progressBar = new JProgressBar();
091: Dimension preferredSize = progressBar.getPreferredSize();
092: preferredSize.width = PROGRESS_BAR_WIDTH;
093: progressBar.setPreferredSize(preferredSize);
094: lblMessage = new JLabel(" ");
095: }
096:
097: private void setupComponent() {
098:
099: JPanel contentPane = (JPanel) getContentPane();
100: contentPane.setBorder(BorderFactory.createEmptyBorder(5, 5, 5,
101: 5));
102: contentPane.setLayout(new GridBagLayout());
103: GridBagConstraints gc = new GridBagConstraints();
104: gc.gridx = 0;
105: gc.gridy = GridBagConstraints.RELATIVE;
106: gc.anchor = GridBagConstraints.NORTHWEST;
107: contentPane.add(lblMessage, gc);
108: gc.weightx = 1;
109: gc.fill = GridBagConstraints.HORIZONTAL;
110: contentPane.add(progressBar, gc);
111:
112: setTitle(GUIHelper.MESSAGE_TITLE);
113: setModal(true);
114: pack();
115:
116: }
117:
118: private void setupEventHandlers() {
119:
120: addComponentListener(new ComponentAdapter() {
121: public void componentShown(ComponentEvent event) {
122: final Thread task = new Thread(runnable);
123: task.start();
124: new Thread() {
125: public void run() {
126: try {
127: task.join();
128: } catch (InterruptedException e) {
129: }
130: SwingUtilities.invokeLater(new Runnable() {
131: public void run() {
132: setVisible(false);
133: }
134: });
135: }
136: }.start();
137: }
138: });
139: }
140:
141: }
|