Ver código fonte

Don't load remote images in the EDT

Change-Id: I79be69a80ab38e9d5d4aed0634e96dabdecb7b68
Reviewed-on: http://gerrit.dmdirc.com/1979
Reviewed-by: Greg Holmes <greg@dmdirc.com>
Automatic-Compile: DMDirc Build Manager
tags/0.7rc1
Greg Holmes 13 anos atrás
pai
commit
00b7926810

+ 1
- 1
src/com/dmdirc/addons/ui_swing/components/addonbrowser/AddonTable.java Ver arquivo

@@ -87,7 +87,7 @@ public class AddonTable extends JTable {
87 87
     /** {@inheritDoc} */
88 88
     @Override
89 89
     public void setRowSorter(final RowSorter<? extends TableModel> sorter) {
90
-        if (!(sorter instanceof AddonSorter)) {
90
+        if (sorter != null && !(sorter instanceof AddonSorter)) {
91 91
             throw new IllegalArgumentException(
92 92
                     "Row sorter must be of type AddonSorter");
93 93
         }

+ 6
- 9
src/com/dmdirc/addons/ui_swing/components/addonbrowser/BrowserWindow.java Ver arquivo

@@ -22,8 +22,6 @@
22 22
 
23 23
 package com.dmdirc.addons.ui_swing.components.addonbrowser;
24 24
 
25
-import com.dmdirc.addons.ui_swing.components.text.TextLabel;
26
-
27 25
 import java.awt.Window;
28 26
 import java.awt.event.ActionEvent;
29 27
 import java.awt.event.ActionListener;
@@ -97,9 +95,6 @@ public class BrowserWindow extends JDialog implements ActionListener {
97 95
         setResizable(false);
98 96
         setLayout(new MigLayout("fill, wmin 650, hmin 600"));
99 97
         scrollPane.getVerticalScrollBar().setUnitIncrement(15);
100
-        final JPanel loadingPanel = new JPanel(
101
-                new MigLayout("filly, alignx 50%"));
102
-        loadingPanel.add(new TextLabel("Loading addons, please wait."));
103 98
 
104 99
         JPanel panel = new JPanel(new MigLayout("fill"));
105 100
         panel.setBorder(BorderFactory.createTitledBorder(UIManager.getBorder(
@@ -151,8 +146,7 @@ public class BrowserWindow extends JDialog implements ActionListener {
151 146
         list.setRowSorter(sorter);
152 147
         list.setShowGrid(false);
153 148
 
154
-        scrollPane.setViewportView(loadingPanel);
155
-        loadData();
149
+        loadData(true);
156 150
 
157 151
         pack();
158 152
         setLocationRelativeTo(parentWindow);
@@ -189,9 +183,12 @@ public class BrowserWindow extends JDialog implements ActionListener {
189 183
 
190 184
     /**
191 185
      * Loads addon data from the locally cached feed file.
186
+     *
187
+     * @param download Download new addon feed?
192 188
      */
193
-    public final void loadData() {
194
-        new DataLoaderWorker(list, this, scrollPane).executeInExecutor();
189
+    public final void loadData(final boolean download) {
190
+        new DataLoaderWorker(list, download, this, scrollPane)
191
+                .executeInExecutor();
195 192
     }
196 193
 
197 194
     /**

+ 87
- 11
src/com/dmdirc/addons/ui_swing/components/addonbrowser/DataLoaderWorker.java Ver arquivo

@@ -23,25 +23,39 @@
23 23
 package com.dmdirc.addons.ui_swing.components.addonbrowser;
24 24
 
25 25
 import com.dmdirc.Main;
26
+import com.dmdirc.addons.ui_swing.UIUtilities;
26 27
 import com.dmdirc.addons.ui_swing.components.LoggingSwingWorker;
28
+import com.dmdirc.addons.ui_swing.components.text.TextLabel;
27 29
 import com.dmdirc.logger.ErrorLevel;
28 30
 import com.dmdirc.logger.Logger;
29 31
 import com.dmdirc.util.ConfigFile;
32
+import com.dmdirc.util.DownloadListener;
33
+import com.dmdirc.util.Downloader;
30 34
 import com.dmdirc.util.InvalidConfigFileException;
31 35
 
32 36
 import java.io.File;
33 37
 import java.io.IOException;
38
+import java.util.ArrayList;
34 39
 import java.util.Collection;
35 40
 import java.util.Collections;
41
+import java.util.List;
36 42
 import java.util.Map;
37 43
 import java.util.concurrent.ExecutionException;
44
+import javax.swing.Box;
45
+
46
+import javax.swing.JPanel;
47
+import javax.swing.JProgressBar;
38 48
 import javax.swing.JScrollPane;
49
+import javax.swing.text.StyleConstants;
50
+
51
+import net.miginfocom.swing.MigLayout;
39 52
 
40 53
 /**
41 54
  * Loads the addon data feed into the addon browser.
42 55
  */
43 56
 public class DataLoaderWorker
44
-        extends LoggingSwingWorker<Collection<Map<String, String>>, Object> {
57
+        extends LoggingSwingWorker<Collection<AddonInfo>, Object>
58
+        implements DownloadListener {
45 59
 
46 60
     /** List to load data into. */
47 61
     private final AddonTable table;
@@ -49,18 +63,24 @@ public class DataLoaderWorker
49 63
     private final BrowserWindow browserWindow;
50 64
     /** Table's parent scrollpane. */
51 65
     private final JScrollPane scrollPane;
66
+    /** Downloader progress bar. */
67
+    private final JProgressBar jpb = new JProgressBar(0, 100);
68
+    /** Refresh addons feed? */
69
+    private final boolean download;
52 70
 
53 71
     /**
54 72
      * Creates a new data loader worker.
55 73
      *
56 74
      * @param table Table to load data into
75
+     * @param download Download new addons feed?
57 76
      * @param browserWindow Browser window to pass to table objects
58 77
      * @param scrollPane Table's parent scrollpane
59 78
      */
60
-    public DataLoaderWorker(final AddonTable table,
79
+    public DataLoaderWorker(final AddonTable table, final boolean download,
61 80
             final BrowserWindow browserWindow, final JScrollPane scrollPane) {
62 81
         super();
63 82
 
83
+        this.download = download;
64 84
         this.table = table;
65 85
         this.browserWindow = browserWindow;
66 86
         this.scrollPane = scrollPane;
@@ -68,17 +88,46 @@ public class DataLoaderWorker
68 88
 
69 89
     /** {@inheritDoc} */
70 90
     @Override
71
-    protected Collection<Map<String, String>> doInBackground() {
91
+    protected Collection<AddonInfo> doInBackground() {
92
+        final JPanel loadingPanel = new JPanel(
93
+                new MigLayout("fill, alignx 50%, aligny 50%"));
94
+        scrollPane.setViewportView(loadingPanel);
95
+        if (download) {
96
+            final TextLabel label = new TextLabel(
97
+                    "Downloading addon info, please wait...");
98
+            label.setAlignment(StyleConstants.ALIGN_CENTER);
99
+            loadingPanel.add(Box.createVerticalGlue(), "growy, pushy, wrap");
100
+            loadingPanel.add(label, "growx, wrap");
101
+            loadingPanel.add(jpb, "growx, wrap");
102
+            loadingPanel.add(Box.createVerticalGlue(), "growy, pushy");
103
+            try {
104
+                Downloader.downloadPage("http://addons.dmdirc.com/feed",
105
+                        Main.getConfigDir() + File.separator + "addons.feed",
106
+                        this);
107
+            } catch (IOException ex) {
108
+                loadingPanel.removeAll();
109
+                loadingPanel.add(new TextLabel("Unable to download feeds."));
110
+                return Collections.<AddonInfo>emptyList();
111
+            }
112
+        }
113
+
114
+        loadingPanel.removeAll();
115
+        loadingPanel.add(new TextLabel("Loading addon info, please wait."));
72 116
         final ConfigFile data = new ConfigFile(Main.getConfigDir()
73 117
                 + File.separator + "addons.feed");
74 118
         try {
75 119
             data.read();
76 120
         } catch (IOException ex) {
77
-            return Collections.<Map<String, String>>emptyList();
121
+            return Collections.<AddonInfo>emptyList();
78 122
         } catch (InvalidConfigFileException ex) {
79
-            return Collections.<Map<String, String>>emptyList();
123
+            return Collections.<AddonInfo>emptyList();
80 124
         }
81
-        return data.getKeyDomains().values();
125
+
126
+        final List<AddonInfo> list = new ArrayList<AddonInfo>();
127
+        for (Map<String, String> entry : data.getKeyDomains().values()) {
128
+            list.add(new AddonInfo(entry));
129
+        }
130
+        return list;
82 131
     }
83 132
 
84 133
     /** {@inheritDoc} */
@@ -87,14 +136,15 @@ public class DataLoaderWorker
87 136
         if (isCancelled()) {
88 137
             return;
89 138
         }
90
-        Collection<Map<String, String>> data;
139
+
140
+        Collection<AddonInfo> data;
91 141
         try {
92 142
             data = get();
93 143
         } catch (InterruptedException ex) {
94
-            data = Collections.<Map<String, String>>emptyList();
144
+            data = Collections.<AddonInfo>emptyList();
95 145
         } catch (ExecutionException ex) {
96 146
             Logger.appError(ErrorLevel.MEDIUM, ex.getMessage(), ex);
97
-            data = Collections.<Map<String, String>>emptyList();
147
+            data = Collections.<AddonInfo>emptyList();
98 148
         }
99 149
         final int selectedRow;
100 150
         if (table.getRowCount() > 0 && table.getSelectedRow() > 0) {
@@ -103,8 +153,7 @@ public class DataLoaderWorker
103 153
             selectedRow = 0;
104 154
         }
105 155
         table.getModel().setRowCount(0);
106
-        for (Map<String, String> entry : data) {
107
-            final AddonInfo info = new AddonInfo(entry);
156
+        for (AddonInfo info : data) {
108 157
             table.getModel().addRow(new Object[]{
109 158
                 new AddonInfoLabel(info, browserWindow),
110 159
             });
@@ -112,4 +161,31 @@ public class DataLoaderWorker
112 161
         table.getSelectionModel().setSelectionInterval(selectedRow, selectedRow);
113 162
         scrollPane.setViewportView(table);
114 163
     }
164
+
165
+    /** {@inheritDoc} */
166
+    @Override
167
+    public void downloadProgress(final float percent) {
168
+        UIUtilities.invokeLater(new Runnable() {
169
+
170
+            /** {@inheritDoc} */
171
+            @Override
172
+            public void run() {
173
+                jpb.setValue((int) percent);
174
+            }
175
+        });
176
+    }
177
+
178
+    /** {@inheritDoc} */
179
+    @Override
180
+    public void setIndeterminate(final boolean indeterminate) {
181
+        UIUtilities.invokeLater(new Runnable() {
182
+
183
+            /** {@inheritDoc} */
184
+            @Override
185
+            public void run() {
186
+                jpb.setIndeterminate(indeterminate);
187
+            }
188
+        });
189
+   }
190
+
115 191
 }

+ 0
- 112
src/com/dmdirc/addons/ui_swing/components/addonbrowser/DownloaderWindow.java Ver arquivo

@@ -1,112 +0,0 @@
1
-/*
2
- * To change this template, choose Tools | Templates
3
- * and open the template in the editor.
4
- */
5
-
6
-package com.dmdirc.addons.ui_swing.components.addonbrowser;
7
-
8
-import com.dmdirc.Main;
9
-import com.dmdirc.addons.ui_swing.SwingController;
10
-import com.dmdirc.addons.ui_swing.UIUtilities;
11
-import com.dmdirc.ui.CoreUIUtils;
12
-import com.dmdirc.ui.IconManager;
13
-import com.dmdirc.util.DownloadListener;
14
-import com.dmdirc.util.Downloader;
15
-
16
-import java.awt.Window;
17
-import java.io.File;
18
-import java.io.IOException;
19
-
20
-import javax.swing.JDialog;
21
-import javax.swing.JLabel;
22
-import javax.swing.JProgressBar;
23
-
24
-import net.miginfocom.swing.MigLayout;
25
-
26
-/**
27
- * Simple window to show download progress on addon feed.
28
- */
29
-public class DownloaderWindow extends JDialog implements Runnable, DownloadListener {
30
-
31
-    /**
32
-     * A version number for this class. It should be changed whenever the class
33
-     * structure is changed (or anything else that would prevent serialized
34
-     * objects being unserialized with the new class).
35
-     */
36
-    private static final long serialVersionUID = 1;
37
-    /** Downloader progress bar. */
38
-    private final JProgressBar jpb = new JProgressBar(0, 100);
39
-    /** Parent window. */
40
-    private final Window parentWindow;
41
-
42
-    /**
43
-     * Instantiates a new downloader window.
44
-     *
45
-     * @param parentWindow Parent window
46
-     * @param controller Swing controller
47
-     */
48
-    public DownloaderWindow(final Window parentWindow,
49
-            final SwingController controller) {
50
-        super(parentWindow, "DMDirc Addon Browser", ModalityType.MODELESS);
51
-        this.parentWindow = parentWindow;
52
-        setTitle("Downloading addon information...");
53
-        setLayout(new MigLayout("fill"));
54
-        add(jpb, "grow");
55
-        pack();
56
-        setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
57
-        CoreUIUtils.centreWindow(this);
58
-        setIconImage(IconManager.getIconManager().getImage("icon"));
59
-        setVisible(true);
60
-
61
-        new Thread(this, "Addon downloader thread").start();
62
-    }
63
-
64
-    /** {@inheritDoc} */
65
-    @Override
66
-    public void run() {
67
-        try {
68
-            Downloader.downloadPage("http://addons.dmdirc.com/feed",
69
-                    Main.getConfigDir() + File.separator + "addons.feed", this);
70
-            UIUtilities.invokeLater(new Runnable() {
71
-
72
-                /** {@inheritDoc} */
73
-                @Override
74
-                public void run() {
75
-                    new BrowserWindow(parentWindow);
76
-                }
77
-            });
78
-        } catch (IOException ex) {
79
-            removeAll();
80
-            add(new JLabel("Unable to download feed."));
81
-        }
82
-
83
-        dispose();
84
-    }
85
-
86
-    /** {@inheritDoc} */
87
-    @Override
88
-    public void downloadProgress(final float percent) {
89
-        UIUtilities.invokeLater(new Runnable() {
90
-
91
-            /** {@inheritDoc} */
92
-            @Override
93
-            public void run() {
94
-                jpb.setValue((int) percent);
95
-            }
96
-        });
97
-    }
98
-
99
-    /** {@inheritDoc} */
100
-    @Override
101
-    public void setIndeterminate(final boolean indeterminate) {
102
-        UIUtilities.invokeLater(new Runnable() {
103
-
104
-            /** {@inheritDoc} */
105
-            @Override
106
-            public void run() {
107
-                jpb.setIndeterminate(indeterminate);
108
-            }
109
-        });
110
-    }
111
-
112
-}

+ 1
- 1
src/com/dmdirc/addons/ui_swing/components/addonbrowser/InstallerWindow.java Ver arquivo

@@ -106,6 +106,6 @@ public class InstallerWindow extends StandardDialog implements ActionListener {
106 106
         jpb.setValue(100);
107 107
         getOkButton().setEnabled(true);
108 108
         pack();
109
-        parentWindow.loadData();
109
+        parentWindow.loadData(false);
110 110
     }
111 111
 }

+ 2
- 2
src/com/dmdirc/addons/ui_swing/components/addonpanel/AddonPanel.java Ver arquivo

@@ -24,7 +24,7 @@ package com.dmdirc.addons.ui_swing.components.addonpanel;
24 24
 
25 25
 import com.dmdirc.addons.ui_swing.SwingController;
26 26
 import com.dmdirc.addons.ui_swing.components.LoggingSwingWorker;
27
-import com.dmdirc.addons.ui_swing.components.addonbrowser.DownloaderWindow;
27
+import com.dmdirc.addons.ui_swing.components.addonbrowser.BrowserWindow;
28 28
 import com.dmdirc.addons.ui_swing.components.renderers.AddonCellRenderer;
29 29
 import com.dmdirc.addons.ui_swing.components.text.TextLabel;
30 30
 import com.dmdirc.config.prefs.PreferencesInterface;
@@ -211,7 +211,7 @@ public abstract class AddonPanel extends JPanel implements
211 211
 
212 212
             addonList.repaint();
213 213
         } else if (e.getSource() != toggleButton) {
214
-            new DownloaderWindow(parentWindow, controller);
214
+            new BrowserWindow(parentWindow);
215 215
         }
216 216
     }
217 217
 

Carregando…
Cancelar
Salvar