changeset 256:6b46e55a8854

Fix undisposed window problem. It was causing AWT to never shut down.
author Denis Lila <dlila@redhat.com>
date Fri, 10 Jun 2011 13:13:02 -0400
parents 6ffc4d00a43f
children 0398f63d1b21
files ChangeLog netx/net/sourceforge/jnlp/cache/DefaultDownloadIndicator.java
diffstat 2 files changed, 44 insertions(+), 25 deletions(-) [+]
line wrap: on
line diff
--- a/ChangeLog	Thu Jun 09 17:11:34 2011 -0400
+++ b/ChangeLog	Fri Jun 10 13:13:02 2011 -0400
@@ -1,3 +1,12 @@
+2011-06-10  Denis Lila  <dlila@redhat.com>
+
+	* netx/net/sourceforge/jnlp/cache/DefaultDownloadIndicator.java:
+	(frameMutex): New mutex to synchronize accesses to "frame".
+	(getListener): Make almost all of it synchronized on frameMutex.
+	(disposeListener): Sync hider's body around frameMutex and call
+	dispose on the frame so that the awt threads die when they should.
+	(addProgressPanel): Sync "frame" usage.
+
 2011-06-08  Saad Mohammad  <smohammad@redhat.com>
 
 	* AUTHORS: Updated
--- a/netx/net/sourceforge/jnlp/cache/DefaultDownloadIndicator.java	Thu Jun 09 17:11:34 2011 -0400
+++ b/netx/net/sourceforge/jnlp/cache/DefaultDownloadIndicator.java	Fri Jun 10 13:13:02 2011 -0400
@@ -57,6 +57,7 @@
 
     /** the display window */
     private static JFrame frame;
+    private static final Object frameMutex = new Object();
 
     /** shared constraint */
     static GridBagConstraints vertical;
@@ -97,30 +98,32 @@
     public DownloadServiceListener getListener(ApplicationInstance app, String downloadName, URL resources[]) {
         DownloadPanel result = new DownloadPanel(downloadName);
 
-        if (frame == null) {
-            frame = new JFrame(downloading + "...");
-            frame.getContentPane().setLayout(new GridBagLayout());
-        }
+        synchronized (frameMutex) {
+            if (frame == null) {
+                frame = new JFrame(downloading + "...");
+                frame.getContentPane().setLayout(new GridBagLayout());
+            }
 
-        if (resources != null)
-            for (int i = 0; i < resources.length; i++)
-                result.addProgressPanel(resources[i], null);
+            if (resources != null)
+                for (int i = 0; i < resources.length; i++)
+                    result.addProgressPanel(resources[i], null);
 
-        frame.getContentPane().add(result, vertical);
-        frame.pack();
+            frame.getContentPane().add(result, vertical);
+            frame.pack();
 
-        if (!frame.isVisible()) {
-            Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
-            Insets insets = Toolkit.getDefaultToolkit().getScreenInsets(frame.getGraphicsConfiguration());
-            Dimension screen = new Dimension(screenSize.width - insets.left,
-                    screenSize.height - insets.top);
-            frame.setLocation(screen.width - frame.getWidth(),
-                              screen.height - frame.getHeight());
+            if (!frame.isVisible()) {
+                Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
+                Insets insets = Toolkit.getDefaultToolkit().getScreenInsets(frame.getGraphicsConfiguration());
+                Dimension screen = new Dimension(screenSize.width - insets.left,
+                        screenSize.height - insets.top);
+                frame.setLocation(screen.width - frame.getWidth(),
+                        screen.height - frame.getHeight());
+            }
+
+            frame.setVisible(true);
+
+            return result;
         }
-
-        frame.setVisible(true);
-
-        return result;
     }
 
     /**
@@ -134,11 +137,16 @@
 
         ActionListener hider = new ActionListener() {
             public void actionPerformed(ActionEvent evt) {
-                if (frame.getContentPane().getComponentCount() == 1)
-                    frame.setVisible(false);
+                synchronized(frameMutex) {
+                    frame.getContentPane().remove((DownloadPanel) listener);
+                    frame.pack();
 
-                frame.getContentPane().remove((DownloadPanel) listener);
-                frame.pack();
+                    if (frame.getContentPane().getComponentCount() == 0) {
+                        frame.setVisible(false);
+                        frame.dispose();
+                        frame = null;
+                    }
+                }
             }
         };
 
@@ -186,7 +194,9 @@
                 ProgressPanel panel = new ProgressPanel(url, version);
 
                 add(panel, verticalIndent);
-                frame.pack();
+                synchronized (frameMutex) {
+                    frame.pack();
+                }
 
                 urls.add(url);
                 panels.add(panel);