Browse Source

Add QueueSizeListener to ImageManager and show number of queued images in status bar

master
Chris Smith 15 years ago
parent
commit
0270f07a41

+ 61
- 1
src/uk/co/md87/evetool/ImageManager.java View File

@@ -23,10 +23,19 @@
23 23
 package uk.co.md87.evetool;
24 24
 
25 25
 import java.awt.Image;
26
+import java.io.File;
26 27
 import java.io.IOException;
27 28
 import java.net.URL;
29
+import java.util.ArrayList;
30
+import java.util.List;
31
+import java.util.concurrent.atomic.AtomicInteger;
32
+import java.util.logging.Level;
33
+import java.util.logging.Logger;
34
+
28 35
 import javax.imageio.ImageIO;
29 36
 
37
+import uk.co.md87.evetool.api.io.QueueSizeListener;
38
+
30 39
 /**
31 40
  *
32 41
  * TODO: Document ImageManager
@@ -34,16 +43,67 @@ import javax.imageio.ImageIO;
34 43
  */
35 44
 public class ImageManager {
36 45
 
46
+    protected static final List<String> REQUESTS = new ArrayList<String>();
47
+
48
+    private static final List<QueueSizeListener> listeners = new ArrayList<QueueSizeListener>();
49
+
50
+    private static final AtomicInteger queueSize = new AtomicInteger(0);
51
+
37 52
     protected final String cacheDir;
38 53
 
39 54
     public ImageManager(final String cacheDir) {
40 55
         this.cacheDir = cacheDir;
56
+
57
+        final File dir = new File(cacheDir);
58
+        if (!dir.isDirectory() && !dir.mkdirs()) {
59
+            Logger.getLogger(ImageManager.class.getName()).log(Level.SEVERE,
60
+                    "Unable to create image cache directory");
61
+        }
41 62
     }
42 63
 
43 64
     public Image getImage(final ImageType type, final Object ... arguments) throws IOException {
44 65
         final String url = type.getUrl(arguments);
45
-        return ImageIO.read(new URL(url));
66
+
67
+        synchronized (REQUESTS) {
68
+            fireQueueSizeChange(queueSize.incrementAndGet());
69
+
70
+            while (REQUESTS.contains(url)) {
71
+                try {
72
+                    REQUESTS.wait();
73
+                } catch (InterruptedException ex) {
74
+                    // Ignore
75
+                }
76
+            }
77
+
78
+            REQUESTS.add(url);
79
+        }
80
+
81
+        try {
82
+            final Image res = ImageIO.read(new URL(url));
83
+            return res;
84
+        } finally {
85
+            synchronized (REQUESTS) {
86
+                fireQueueSizeChange(queueSize.decrementAndGet());
87
+                
88
+                REQUESTS.remove(url);
89
+                REQUESTS.notifyAll();
90
+            }
91
+        }
46 92
     }
47 93
 
94
+    public static void addQueueSizeListener(final QueueSizeListener listener) {
95
+        synchronized (listeners) {
96
+            listeners.add(listener);
97
+            listener.queueSizeUpdate(queueSize.get());
98
+        }
99
+    }
100
+
101
+    protected static void fireQueueSizeChange(final int queueSize) {
102
+        synchronized (listeners) {
103
+            for (QueueSizeListener listener : listeners) {
104
+                listener.queueSizeUpdate(queueSize);
105
+            }
106
+        }
107
+    }
48 108
     
49 109
 }

+ 32
- 7
src/uk/co/md87/evetool/ui/StatusPanel.java View File

@@ -30,6 +30,7 @@ import javax.swing.JPanel;
30 30
 
31 31
 import net.miginfocom.swing.MigLayout;
32 32
 
33
+import uk.co.md87.evetool.ImageManager;
33 34
 import uk.co.md87.evetool.Main;
34 35
 import uk.co.md87.evetool.api.io.ApiDownloader;
35 36
 import uk.co.md87.evetool.api.io.QueueSizeListener;
@@ -39,7 +40,7 @@ import uk.co.md87.evetool.api.io.QueueSizeListener;
39 40
  * 
40 41
  * @author chris
41 42
  */
42
-public class StatusPanel extends JPanel implements QueueSizeListener {
43
+public class StatusPanel extends JPanel {
43 44
 
44 45
     /**
45 46
      * A version number for this class. It should be changed whenever the class
@@ -51,6 +52,8 @@ public class StatusPanel extends JPanel implements QueueSizeListener {
51 52
     /** Labels used to display various pieces of information. */
52 53
     private final JLabel leftLabel, centreLabel, rightLabel;
53 54
 
55
+    private int apiSize = 0, imageSize = 0;
56
+
54 57
     /**
55 58
      * Creates a new status panel for the specified window.
56 59
      *
@@ -69,14 +72,36 @@ public class StatusPanel extends JPanel implements QueueSizeListener {
69 72
         add(centreLabel, "push, grow");
70 73
         add(rightLabel, "push, grow");
71 74
 
72
-        ApiDownloader.addQueueSizeListener(this);
75
+        ApiDownloader.addQueueSizeListener(new QueueSizeListener() {
76
+            /** {@inheritDoc} */
77
+            @Override
78
+            public void queueSizeUpdate(final int size) {
79
+                apiSize = size;
80
+                updateLabel();
81
+            }
82
+        });
83
+
84
+        ImageManager.addQueueSizeListener(new QueueSizeListener() {
85
+            /** {@inheritDoc} */
86
+            @Override
87
+            public void queueSizeUpdate(final int size) {
88
+                imageSize = size;
89
+                updateLabel();
90
+            }
91
+        });
73 92
     }
74 93
 
75
-    /** {@inheritDoc} */
76
-    @Override
77
-    public void queueSizeUpdate(final int size) {
78
-        centreLabel.setText(size == 0 ? "" : 
79
-            (size + " API quer" + (size == 1 ? "y" : "ies") + " pending"));
94
+    /**
95
+     * Updates the centre label to reflect the number of API and image requests
96
+     * pending.
97
+     */
98
+    protected void updateLabel() {
99
+        centreLabel.setText((apiSize == 0 ? "" :
100
+                (apiSize + " API quer" + (apiSize == 1 ? "y" : "ies")))
101
+                + (imageSize * apiSize > 0 ? " and " : "")
102
+                + (imageSize == 0 ? "" : (imageSize + " image request"
103
+                + (imageSize == 1 ? "" : "s")))
104
+                + (imageSize + apiSize > 0 ? " pending" : ""));
80 105
     }
81 106
 
82 107
 }

Loading…
Cancel
Save