001    /*
002     * LAPIS lightweight structured text processing system
003     *
004     * Copyright (C) 1998-2002 Carnegie Mellon University,
005     * Copyright (C) 2003 Massachusetts Institute of Technology.
006     * All rights reserved.
007     *
008     * This library is free software; you can redistribute it
009     * and/or modify it under the terms of the GNU General
010     * Public License as published by the Free Software
011     * Foundation, version 2.
012     *
013     * LAPIS homepage: http://graphics.lcs.mit.edu/lapis/
014     */
015    package lapisx.progress.swing;
016    
017    import java.awt.*;
018    import java.awt.event.*;
019    import javax.swing.*;
020    import lapisx.swing.Win;
021    import lapisx.progress.*;
022    
023    public class SwingProgressBar extends JProgressBar implements ProgressListener {
024    
025        boolean cancelled = false;
026        JDialog dialog = null;
027    
028        public SwingProgressBar () {
029            setStringPainted (true);
030            setBorderPainted (true);
031        }
032    
033        public JDialog makeDialog (Component parent, String title, boolean modal) {
034            if (dialog != null)
035                return dialog;
036    
037            dialog = new JDialog (Win.findFrameOrMakeFrame (parent),
038                                  title, modal);
039            Container contentPane = dialog.getContentPane ();
040    
041            contentPane.setLayout (new BorderLayout ());
042            contentPane.add (this);
043    
044            Panel bottom = new Panel ();
045            Button cancelButton = new Button ("Cancel");
046            cancelButton.addActionListener (new ActionListener () {
047                public void actionPerformed (ActionEvent event) {
048                    cancel ();
049                }
050            });
051            bottom.add (cancelButton);
052            contentPane.add (bottom, BorderLayout.SOUTH);
053    
054            dialog.pack ();
055            Win.center (dialog, parent);
056    
057            return dialog;
058        }
059    
060        public void cancel () {
061            cancelled = true;
062            if (dialog != null)
063                dialog.dispose ();
064        }
065    
066        public void startProgress (ProgressEvent event) {
067            handle (event);
068        }
069    
070        public void makeProgress (ProgressEvent event) {
071            handle (event);
072        }
073    
074        public void doneProgress (ProgressEvent event) {
075            handle (event);
076        }
077    
078        private void handle (final ProgressEvent event) {
079            if (cancelled)
080                throw new CancelException ();
081            SwingUtilities.invokeLater (new Runnable () {
082                public void run () {
083                    setString (event.getLabel ());
084                    setMinimum (event.getMinimum ());
085                    setMaximum (event.getMaximum ());
086                    setValue (event.getValue ());
087                }
088            });
089        }
090    
091        public static void main (String[] args) throws Exception {
092            SwingProgressBar pb = new SwingProgressBar ();
093            JDialog dlg = pb.makeDialog (null, "Progress", false);
094            dlg.show ();
095    
096            BasicProgressGenerator gen = new BasicProgressGenerator (dlg);
097            gen.addProgressListener (pb);
098            gen.fireStartProgress ("Counting to infinity", 1000);
099            Thread.currentThread ().setPriority (4);
100            try {
101                for (int i = 0; dlg != null && i < 20; ++i) {
102                    Thread.sleep (500);
103                    gen.fireProgress ();
104                }
105                gen.fireDoneProgress ();
106            } catch (CancelException e) {
107                System.err.println (e);
108            } finally {
109                dlg.dispose ();
110            } 
111            
112            System.exit (0);
113        }
114    
115    }