Ignore:
Timestamp:
2009-07-19T17:38:55+02:00 (15 years ago)
Author:
jttt
Message:

PleaseWait refactoring. Progress is now reported using ProgressMonitor interface, that is available through PleaseWaitRunnable.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/org/openstreetmap/josm/gui/PleaseWaitRunnable.java

    r1733 r1811  
    55
    66import java.awt.EventQueue;
    7 import java.awt.event.ActionEvent;
    8 import java.awt.event.ActionListener;
    9 import java.awt.event.WindowAdapter;
    10 import java.awt.event.WindowEvent;
    11 import java.awt.event.WindowListener;
    127import java.io.FileNotFoundException;
    138import java.io.IOException;
    14 import java.lang.reflect.InvocationTargetException;
    159
    16 import javax.swing.JOptionPane;
    1710import javax.swing.SwingUtilities;
    1811
    19 import org.openstreetmap.josm.Main;
     12import org.openstreetmap.josm.gui.progress.PleaseWaitProgressMonitor;
     13import org.openstreetmap.josm.gui.progress.ProgressMonitor;
     14import org.openstreetmap.josm.gui.progress.ProgressMonitor.CancelListener;
    2015import org.openstreetmap.josm.io.OsmTransferException;
    2116import org.xml.sax.SAXException;
     
    2722 * @author Imi
    2823 */
    29 public abstract class PleaseWaitRunnable implements Runnable {
    30     public boolean silent = false;
    31     public String errorMessage;
     24public abstract class PleaseWaitRunnable implements Runnable, CancelListener {
    3225
    33     private boolean closeDialogCalled = false;
    3426    private boolean cancelled = false;
    3527    private boolean ignoreException;
    36 
    3728    private final String title;
    3829
    39     private ActionListener cancelListener = new ActionListener(){
    40         public void actionPerformed(ActionEvent e) {
    41             if (!cancelled) {
    42                 cancelled = true;
    43                 cancel();
    44             }
    45         }
    46     };
    47 
    48     private WindowListener windowListener = new WindowAdapter(){
    49         @Override public void windowClosing(WindowEvent e) {
    50             if (!closeDialogCalled) {
    51                 if (!cancelled) {
    52                     cancelled = true;
    53                     cancel();
    54                 }
    55                 closeDialog();
    56             }
    57         }
    58     };
     30    protected final ProgressMonitor progressMonitor;
    5931
    6032    /**
     
    7345     */
    7446    public PleaseWaitRunnable(String title, boolean ignoreException) {
    75         this.title = title;
    76         this.ignoreException = ignoreException;
     47        this(title, new PleaseWaitProgressMonitor(), ignoreException);
    7748    }
    7849
    79     private void prepareDialog() {
    80         // reset dialog state
    81         errorMessage = null;
    82         closeDialogCalled = false;
    83 
    84         Main.pleaseWaitDlg.setTitle(title);
    85         Main.pleaseWaitDlg.cancel.setEnabled(true);
    86         Main.pleaseWaitDlg.setCustomText("");
    87         Main.pleaseWaitDlg.cancel.addActionListener(cancelListener);
    88         Main.pleaseWaitDlg.addWindowListener(windowListener);
    89         Main.pleaseWaitDlg.setVisible(true);
     50    public PleaseWaitRunnable(String title, ProgressMonitor progressMonitor, boolean ignoreException) {
     51        this.title = title;
     52        this.progressMonitor = progressMonitor == null?new PleaseWaitProgressMonitor():progressMonitor;
     53        this.ignoreException = ignoreException;
     54        this.progressMonitor.addCancelListener(this);
    9055    }
    9156
     
    9358        try {
    9459            try {
    95                 realRun();
     60                progressMonitor.beginTask(title);
     61                try {
     62                    realRun();
     63                } finally {
     64                    if (EventQueue.isDispatchThread()) {
     65                        finish();
     66                    } else {
     67                        EventQueue.invokeAndWait(new Runnable() {
     68                            public void run() {
     69                                finish();
     70                            }
     71                        });
     72                    }
     73                }
    9674            } catch (SAXException x) {
    9775                x.printStackTrace();
    98                 errorMessage = tr("Error while parsing")+": "+x.getMessage();
     76                progressMonitor.setErrorMessage(tr("Error while parsing")+": "+x.getMessage());
    9977            } catch (FileNotFoundException x) {
    10078                x.printStackTrace();
    101                 errorMessage = tr("File not found")+": "+x.getMessage();
     79                progressMonitor.setErrorMessage(tr("File not found")+": "+x.getMessage());
    10280            } catch (IOException x) {
    10381                x.printStackTrace();
    104                 errorMessage = x.getMessage();
     82                progressMonitor.setErrorMessage(x.getMessage());
    10583            } catch(OsmTransferException x) {
    10684                x.printStackTrace();
    10785                if (x.getCause() != null) {
    108                     errorMessage = x.getCause().getMessage();
     86                    progressMonitor.setErrorMessage(x.getCause().getMessage());
    10987                } else {
    110                     errorMessage = x.getMessage();
     88                    progressMonitor.setErrorMessage(x.getMessage());
    11189                }
    11290            } finally {
    113                 closeDialog();
     91                progressMonitor.finishTask();
    11492            }
    11593        } catch (final Throwable e) {
     
    135113                }
    136114            }).start();
    137             prepareDialog();
    138115        } else {
    139             EventQueue.invokeLater(new Runnable() {
    140                 public void run() {
    141                     prepareDialog();
    142                 }
    143             });
    144116            doRealRun();
    145117        }
     118    }
     119
     120    public void operationCanceled() {
     121        cancel();
    146122    }
    147123
     
    164140    protected abstract void finish();
    165141
    166     /**
    167      * Close the dialog. Usually called from worker thread.
    168      */
    169     public void closeDialog() {
    170         if (closeDialogCalled)
    171             return;
    172         closeDialogCalled  = true;
    173         try {
    174             Runnable runnable = new Runnable(){
    175                 public void run() {
    176                     try {
    177                         finish();
    178                     } finally {
    179                         Main.pleaseWaitDlg.setVisible(false);
    180                         Main.pleaseWaitDlg.dispose();
    181                         Main.pleaseWaitDlg.removeWindowListener(windowListener);
    182                         Main.pleaseWaitDlg.cancel.removeActionListener(cancelListener);
    183                     }
    184                     if (errorMessage != null && !silent) {
    185                         JOptionPane.showMessageDialog(Main.parent, errorMessage);
    186                     }
    187                 }
    188             };
    189 
    190             // make sure, this is called in the dispatcher thread ASAP
    191             if (EventQueue.isDispatchThread()) {
    192                 runnable.run();
    193             } else {
    194                 EventQueue.invokeAndWait(runnable);
    195             }
    196 
    197         } catch (InterruptedException e) {
    198         } catch (InvocationTargetException e) {
    199             throw new RuntimeException(e);
    200         }
     142    public ProgressMonitor getProgressMonitor() {
     143        return progressMonitor;
    201144    }
    202145}
Note: See TracChangeset for help on using the changeset viewer.