Changeset 1811 in josm for trunk/src/org/openstreetmap/josm/gui/PleaseWaitRunnable.java
- Timestamp:
- 2009-07-19T17:38:55+02:00 (15 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/org/openstreetmap/josm/gui/PleaseWaitRunnable.java
r1733 r1811 5 5 6 6 import 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;12 7 import java.io.FileNotFoundException; 13 8 import java.io.IOException; 14 import java.lang.reflect.InvocationTargetException;15 9 16 import javax.swing.JOptionPane;17 10 import javax.swing.SwingUtilities; 18 11 19 import org.openstreetmap.josm.Main; 12 import org.openstreetmap.josm.gui.progress.PleaseWaitProgressMonitor; 13 import org.openstreetmap.josm.gui.progress.ProgressMonitor; 14 import org.openstreetmap.josm.gui.progress.ProgressMonitor.CancelListener; 20 15 import org.openstreetmap.josm.io.OsmTransferException; 21 16 import org.xml.sax.SAXException; … … 27 22 * @author Imi 28 23 */ 29 public abstract class PleaseWaitRunnable implements Runnable { 30 public boolean silent = false; 31 public String errorMessage; 24 public abstract class PleaseWaitRunnable implements Runnable, CancelListener { 32 25 33 private boolean closeDialogCalled = false;34 26 private boolean cancelled = false; 35 27 private boolean ignoreException; 36 37 28 private final String title; 38 29 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; 59 31 60 32 /** … … 73 45 */ 74 46 public PleaseWaitRunnable(String title, boolean ignoreException) { 75 this.title = title; 76 this.ignoreException = ignoreException; 47 this(title, new PleaseWaitProgressMonitor(), ignoreException); 77 48 } 78 49 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); 90 55 } 91 56 … … 93 58 try { 94 59 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 } 96 74 } catch (SAXException x) { 97 75 x.printStackTrace(); 98 errorMessage = tr("Error while parsing")+": "+x.getMessage();76 progressMonitor.setErrorMessage(tr("Error while parsing")+": "+x.getMessage()); 99 77 } catch (FileNotFoundException x) { 100 78 x.printStackTrace(); 101 errorMessage = tr("File not found")+": "+x.getMessage();79 progressMonitor.setErrorMessage(tr("File not found")+": "+x.getMessage()); 102 80 } catch (IOException x) { 103 81 x.printStackTrace(); 104 errorMessage = x.getMessage();82 progressMonitor.setErrorMessage(x.getMessage()); 105 83 } catch(OsmTransferException x) { 106 84 x.printStackTrace(); 107 85 if (x.getCause() != null) { 108 errorMessage = x.getCause().getMessage();86 progressMonitor.setErrorMessage(x.getCause().getMessage()); 109 87 } else { 110 errorMessage = x.getMessage();88 progressMonitor.setErrorMessage(x.getMessage()); 111 89 } 112 90 } finally { 113 closeDialog();91 progressMonitor.finishTask(); 114 92 } 115 93 } catch (final Throwable e) { … … 135 113 } 136 114 }).start(); 137 prepareDialog();138 115 } else { 139 EventQueue.invokeLater(new Runnable() {140 public void run() {141 prepareDialog();142 }143 });144 116 doRealRun(); 145 117 } 118 } 119 120 public void operationCanceled() { 121 cancel(); 146 122 } 147 123 … … 164 140 protected abstract void finish(); 165 141 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; 201 144 } 202 145 }
Note:
See TracChangeset
for help on using the changeset viewer.