Ticket #2775: plugindownload.patch
File plugindownload.patch, 9.3 KB (added by , 16 years ago) |
---|
-
src/org/openstreetmap/josm/actions/PreferencesAction.java
36 36 * Launch the preferences dialog. 37 37 */ 38 38 public void actionPerformed(ActionEvent e) { 39 new Thread(this).start();39 run(); 40 40 } 41 41 42 42 public void run() { … … 74 74 75 75 dlg.setBounds(targetX, targetY, targetWidth, targetHeight); 76 76 77 dlg.setModal(true); 77 78 dlg.setVisible(true); 78 79 if (pane.getValue() instanceof Integer && (Integer)pane.getValue() == JOptionPane.OK_OPTION) 79 80 prefDlg.ok(); -
src/org/openstreetmap/josm/plugins/PluginDownloader.java
10 10 import java.io.BufferedReader; 11 11 import java.io.BufferedWriter; 12 12 import java.io.File; 13 import java.io.FileNotFoundException;14 13 import java.io.FileOutputStream; 15 import java.io.FileWriter;16 14 import java.io.FilenameFilter; 17 15 import java.io.IOException; 18 16 import java.io.InputStream; 19 17 import java.io.InputStreamReader; 20 18 import java.io.OutputStream; 21 19 import java.io.OutputStreamWriter; 22 import java.net.MalformedURLException;23 20 import java.net.URL; 24 21 import java.util.Arrays; 25 import java.util.concurrent.Future;26 22 import java.util.Collection; 27 23 import java.util.LinkedList; 28 24 29 25 import javax.swing.JOptionPane; 30 26 31 import org.openstreetmap.josm.actions.AboutAction;32 27 import org.openstreetmap.josm.Main; 28 import org.openstreetmap.josm.actions.AboutAction; 33 29 import org.openstreetmap.josm.gui.ExtendedDialog; 34 30 import org.openstreetmap.josm.gui.PleaseWaitRunnable; 35 31 import org.xml.sax.SAXException; … … 65 61 File pluginDir = Main.pref.getPluginsDirFile(); 66 62 if (!pluginDir.exists()) 67 63 pluginDir.mkdirs(); 64 Main.pleaseWaitDlg.progress.setMaximum(toUpdate.size()); 65 int progressValue = 0; 68 66 for (PluginInformation d : toUpdate) { 67 Main.pleaseWaitDlg.progress.setValue(progressValue++); 69 68 Main.pleaseWaitDlg.currentAction.setText(tr("Downloading Plugin {0}...", d.name)); 70 69 File pluginFile = new File(pluginDir, d.name + ".jar.new"); 71 70 if(download(d, pluginFile)) … … 144 143 } 145 144 146 145 public Collection<PluginInformation> download(Collection<PluginInformation> download) { 146 // Execute task in current thread instead of executing it in other thread and waiting for result 147 // Waiting for result is not a good idea because the waiting thread will probably be either EDT 148 // or worker thread. Blocking one of these threads will cause deadlock 147 149 UpdateTask t = new UpdateTask(download, false); 148 try { 149 Future<UpdateTask> ta = Main.worker.submit(t, t); 150 t = ta.get(); 151 return t.failed; 152 } 153 catch(java.lang.InterruptedException e) {e.printStackTrace();} 154 catch(java.util.concurrent.ExecutionException e) {e.printStackTrace();} 155 return download; 150 t.run(); 151 return t.failed; 156 152 } 157 153 158 154 public static boolean moveUpdatedPlugins() { -
src/org/openstreetmap/josm/plugins/PluginSelection.java
8 8 import java.awt.Insets; 9 9 import java.awt.event.ActionEvent; 10 10 import java.awt.event.ActionListener; 11 12 11 import java.io.BufferedReader; 13 12 import java.io.ByteArrayInputStream; 14 13 import java.io.File; 15 14 import java.io.FileInputStream; 16 15 import java.io.InputStreamReader; 17 import java.io.IOException;18 16 import java.util.Arrays; 19 17 import java.util.Collection; 20 18 import java.util.Collections; … … 96 94 drawPanel(pluginPanel); 97 95 } 98 96 99 public Boolean finish() {97 public boolean finish() { 100 98 Collection<PluginInformation> toDownload = new LinkedList<PluginInformation>(); 101 99 String msg = ""; 102 100 for (Entry<String, Boolean> entry : pluginMap.entrySet()) { -
src/org/openstreetmap/josm/gui/PleaseWaitRunnable.java
8 8 import java.awt.event.ActionListener; 9 9 import java.awt.event.WindowAdapter; 10 10 import java.awt.event.WindowEvent; 11 import java.awt.event.WindowListener; 11 12 import java.io.FileNotFoundException; 12 13 import java.io.IOException; 13 14 import java.lang.reflect.InvocationTargetException; … … 35 36 36 37 private final String title; 37 38 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 }; 59 38 60 /** 39 61 * Create the runnable object with a given message for the user. 40 62 */ … … 52 74 public PleaseWaitRunnable(String title, boolean ignoreException) { 53 75 this.title = title; 54 76 this.ignoreException = ignoreException; 55 Main.pleaseWaitDlg.cancel.addActionListener(new ActionListener(){56 public void actionPerformed(ActionEvent e) {57 if (!cancelled) {58 cancelled = true;59 cancel();60 }61 }62 });63 Main.pleaseWaitDlg.addWindowListener(new WindowAdapter(){64 @Override public void windowClosing(WindowEvent e) {65 if (!closeDialogCalled) {66 if (!cancelled) {67 cancelled = true;68 cancel();69 }70 closeDialog();71 }72 }73 });74 77 } 75 78 76 public final void run() { 77 try { 78 try { 79 if (cancelled) 80 return; // since realRun isn't executed, do not call to finish 79 private void prepareDialog() { 80 // reset dialog state 81 errorMessage = null; 82 closeDialogCalled = false; 81 83 82 // reset dialog state 83 Main.pleaseWaitDlg.setTitle(title); 84 Main.pleaseWaitDlg.cancel.setEnabled(true); 85 Main.pleaseWaitDlg.setCustomText(""); 86 errorMessage = null; 87 closeDialogCalled = false; 88 89 // show the dialog 90 synchronized (this) { 91 EventQueue.invokeLater(new Runnable() { 92 public void run() { 93 synchronized (PleaseWaitRunnable.this) { 94 PleaseWaitRunnable.this.notifyAll(); 95 } 96 Main.pleaseWaitDlg.setVisible(true); 97 } 98 }); 99 try {wait();} catch (InterruptedException e) {} 100 } 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); 90 } 101 91 92 private void doRealRun() { 93 try { 94 try { 102 95 realRun(); 103 96 } catch (SAXException x) { 104 97 x.printStackTrace(); … … 131 124 } 132 125 } 133 126 127 public final void run() { 128 if (cancelled) 129 return; // since realRun isn't executed, do not call to finish 130 131 if (EventQueue.isDispatchThread()) { 132 new Thread(new Runnable() { 133 public void run() { 134 doRealRun(); 135 } 136 }).start(); 137 prepareDialog(); 138 } else { 139 EventQueue.invokeLater(new Runnable() { 140 public void run() { 141 prepareDialog(); 142 } 143 }); 144 doRealRun(); 145 } 146 } 147 134 148 /** 135 149 * User pressed cancel button. 136 150 */ … … 164 178 } finally { 165 179 Main.pleaseWaitDlg.setVisible(false); 166 180 Main.pleaseWaitDlg.dispose(); 181 Main.pleaseWaitDlg.removeWindowListener(windowListener); 182 Main.pleaseWaitDlg.cancel.removeActionListener(cancelListener); 167 183 } 168 184 if (errorMessage != null && !silent) { 169 185 JOptionPane.showMessageDialog(Main.parent, errorMessage);