浏览代码

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 年前
父节点
当前提交
00b7926810

+ 1
- 1
src/com/dmdirc/addons/ui_swing/components/addonbrowser/AddonTable.java 查看文件

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

+ 6
- 9
src/com/dmdirc/addons/ui_swing/components/addonbrowser/BrowserWindow.java 查看文件

22
 
22
 
23
 package com.dmdirc.addons.ui_swing.components.addonbrowser;
23
 package com.dmdirc.addons.ui_swing.components.addonbrowser;
24
 
24
 
25
-import com.dmdirc.addons.ui_swing.components.text.TextLabel;
26
-
27
 import java.awt.Window;
25
 import java.awt.Window;
28
 import java.awt.event.ActionEvent;
26
 import java.awt.event.ActionEvent;
29
 import java.awt.event.ActionListener;
27
 import java.awt.event.ActionListener;
97
         setResizable(false);
95
         setResizable(false);
98
         setLayout(new MigLayout("fill, wmin 650, hmin 600"));
96
         setLayout(new MigLayout("fill, wmin 650, hmin 600"));
99
         scrollPane.getVerticalScrollBar().setUnitIncrement(15);
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
         JPanel panel = new JPanel(new MigLayout("fill"));
99
         JPanel panel = new JPanel(new MigLayout("fill"));
105
         panel.setBorder(BorderFactory.createTitledBorder(UIManager.getBorder(
100
         panel.setBorder(BorderFactory.createTitledBorder(UIManager.getBorder(
151
         list.setRowSorter(sorter);
146
         list.setRowSorter(sorter);
152
         list.setShowGrid(false);
147
         list.setShowGrid(false);
153
 
148
 
154
-        scrollPane.setViewportView(loadingPanel);
155
-        loadData();
149
+        loadData(true);
156
 
150
 
157
         pack();
151
         pack();
158
         setLocationRelativeTo(parentWindow);
152
         setLocationRelativeTo(parentWindow);
189
 
183
 
190
     /**
184
     /**
191
      * Loads addon data from the locally cached feed file.
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 查看文件

23
 package com.dmdirc.addons.ui_swing.components.addonbrowser;
23
 package com.dmdirc.addons.ui_swing.components.addonbrowser;
24
 
24
 
25
 import com.dmdirc.Main;
25
 import com.dmdirc.Main;
26
+import com.dmdirc.addons.ui_swing.UIUtilities;
26
 import com.dmdirc.addons.ui_swing.components.LoggingSwingWorker;
27
 import com.dmdirc.addons.ui_swing.components.LoggingSwingWorker;
28
+import com.dmdirc.addons.ui_swing.components.text.TextLabel;
27
 import com.dmdirc.logger.ErrorLevel;
29
 import com.dmdirc.logger.ErrorLevel;
28
 import com.dmdirc.logger.Logger;
30
 import com.dmdirc.logger.Logger;
29
 import com.dmdirc.util.ConfigFile;
31
 import com.dmdirc.util.ConfigFile;
32
+import com.dmdirc.util.DownloadListener;
33
+import com.dmdirc.util.Downloader;
30
 import com.dmdirc.util.InvalidConfigFileException;
34
 import com.dmdirc.util.InvalidConfigFileException;
31
 
35
 
32
 import java.io.File;
36
 import java.io.File;
33
 import java.io.IOException;
37
 import java.io.IOException;
38
+import java.util.ArrayList;
34
 import java.util.Collection;
39
 import java.util.Collection;
35
 import java.util.Collections;
40
 import java.util.Collections;
41
+import java.util.List;
36
 import java.util.Map;
42
 import java.util.Map;
37
 import java.util.concurrent.ExecutionException;
43
 import java.util.concurrent.ExecutionException;
44
+import javax.swing.Box;
45
+
46
+import javax.swing.JPanel;
47
+import javax.swing.JProgressBar;
38
 import javax.swing.JScrollPane;
48
 import javax.swing.JScrollPane;
49
+import javax.swing.text.StyleConstants;
50
+
51
+import net.miginfocom.swing.MigLayout;
39
 
52
 
40
 /**
53
 /**
41
  * Loads the addon data feed into the addon browser.
54
  * Loads the addon data feed into the addon browser.
42
  */
55
  */
43
 public class DataLoaderWorker
56
 public class DataLoaderWorker
44
-        extends LoggingSwingWorker<Collection<Map<String, String>>, Object> {
57
+        extends LoggingSwingWorker<Collection<AddonInfo>, Object>
58
+        implements DownloadListener {
45
 
59
 
46
     /** List to load data into. */
60
     /** List to load data into. */
47
     private final AddonTable table;
61
     private final AddonTable table;
49
     private final BrowserWindow browserWindow;
63
     private final BrowserWindow browserWindow;
50
     /** Table's parent scrollpane. */
64
     /** Table's parent scrollpane. */
51
     private final JScrollPane scrollPane;
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
      * Creates a new data loader worker.
72
      * Creates a new data loader worker.
55
      *
73
      *
56
      * @param table Table to load data into
74
      * @param table Table to load data into
75
+     * @param download Download new addons feed?
57
      * @param browserWindow Browser window to pass to table objects
76
      * @param browserWindow Browser window to pass to table objects
58
      * @param scrollPane Table's parent scrollpane
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
             final BrowserWindow browserWindow, final JScrollPane scrollPane) {
80
             final BrowserWindow browserWindow, final JScrollPane scrollPane) {
62
         super();
81
         super();
63
 
82
 
83
+        this.download = download;
64
         this.table = table;
84
         this.table = table;
65
         this.browserWindow = browserWindow;
85
         this.browserWindow = browserWindow;
66
         this.scrollPane = scrollPane;
86
         this.scrollPane = scrollPane;
68
 
88
 
69
     /** {@inheritDoc} */
89
     /** {@inheritDoc} */
70
     @Override
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
         final ConfigFile data = new ConfigFile(Main.getConfigDir()
116
         final ConfigFile data = new ConfigFile(Main.getConfigDir()
73
                 + File.separator + "addons.feed");
117
                 + File.separator + "addons.feed");
74
         try {
118
         try {
75
             data.read();
119
             data.read();
76
         } catch (IOException ex) {
120
         } catch (IOException ex) {
77
-            return Collections.<Map<String, String>>emptyList();
121
+            return Collections.<AddonInfo>emptyList();
78
         } catch (InvalidConfigFileException ex) {
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
     /** {@inheritDoc} */
133
     /** {@inheritDoc} */
87
         if (isCancelled()) {
136
         if (isCancelled()) {
88
             return;
137
             return;
89
         }
138
         }
90
-        Collection<Map<String, String>> data;
139
+
140
+        Collection<AddonInfo> data;
91
         try {
141
         try {
92
             data = get();
142
             data = get();
93
         } catch (InterruptedException ex) {
143
         } catch (InterruptedException ex) {
94
-            data = Collections.<Map<String, String>>emptyList();
144
+            data = Collections.<AddonInfo>emptyList();
95
         } catch (ExecutionException ex) {
145
         } catch (ExecutionException ex) {
96
             Logger.appError(ErrorLevel.MEDIUM, ex.getMessage(), ex);
146
             Logger.appError(ErrorLevel.MEDIUM, ex.getMessage(), ex);
97
-            data = Collections.<Map<String, String>>emptyList();
147
+            data = Collections.<AddonInfo>emptyList();
98
         }
148
         }
99
         final int selectedRow;
149
         final int selectedRow;
100
         if (table.getRowCount() > 0 && table.getSelectedRow() > 0) {
150
         if (table.getRowCount() > 0 && table.getSelectedRow() > 0) {
103
             selectedRow = 0;
153
             selectedRow = 0;
104
         }
154
         }
105
         table.getModel().setRowCount(0);
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
             table.getModel().addRow(new Object[]{
157
             table.getModel().addRow(new Object[]{
109
                 new AddonInfoLabel(info, browserWindow),
158
                 new AddonInfoLabel(info, browserWindow),
110
             });
159
             });
112
         table.getSelectionModel().setSelectionInterval(selectedRow, selectedRow);
161
         table.getSelectionModel().setSelectionInterval(selectedRow, selectedRow);
113
         scrollPane.setViewportView(table);
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 查看文件

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 查看文件

106
         jpb.setValue(100);
106
         jpb.setValue(100);
107
         getOkButton().setEnabled(true);
107
         getOkButton().setEnabled(true);
108
         pack();
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 查看文件

24
 
24
 
25
 import com.dmdirc.addons.ui_swing.SwingController;
25
 import com.dmdirc.addons.ui_swing.SwingController;
26
 import com.dmdirc.addons.ui_swing.components.LoggingSwingWorker;
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
 import com.dmdirc.addons.ui_swing.components.renderers.AddonCellRenderer;
28
 import com.dmdirc.addons.ui_swing.components.renderers.AddonCellRenderer;
29
 import com.dmdirc.addons.ui_swing.components.text.TextLabel;
29
 import com.dmdirc.addons.ui_swing.components.text.TextLabel;
30
 import com.dmdirc.config.prefs.PreferencesInterface;
30
 import com.dmdirc.config.prefs.PreferencesInterface;
211
 
211
 
212
             addonList.repaint();
212
             addonList.repaint();
213
         } else if (e.getSource() != toggleButton) {
213
         } else if (e.getSource() != toggleButton) {
214
-            new DownloaderWindow(parentWindow, controller);
214
+            new BrowserWindow(parentWindow);
215
         }
215
         }
216
     }
216
     }
217
 
217
 

正在加载...
取消
保存