Bläddra i källkod

Make swing UI detach on unload

Fixes CLIENT-11

Change-Id: I192562e176615f337df2f7686d0f6c50e00d9b27
Reviewed-on: http://gerrit.dmdirc.com/1969
Reviewed-by: Chris Smith <chris@dmdirc.com>
Automatic-Compile: DMDirc Build Manager
tags/0.7rc1
Greg Holmes 13 år sedan
förälder
incheckning
a115066bfa

+ 6
- 0
src/com/dmdirc/addons/ui_swing/DMDircEventQueue.java Visa fil

@@ -149,4 +149,10 @@ public class DMDircEventQueue extends EventQueue {
149 149
             }
150 150
         }
151 151
     }
152
+
153
+    /** {@inheritDoc} */
154
+    @Override
155
+    public void pop() { //NOPMD
156
+        super.pop();
157
+    }
152 158
 }

+ 8
- 0
src/com/dmdirc/addons/ui_swing/MainFrame.java Visa fil

@@ -730,4 +730,12 @@ public final class MainFrame extends JFrame implements WindowListener,
730 730
     public void notificationCleared(final FrameContainer window) {
731 731
         //Ignore
732 732
     }
733
+
734
+    /** {@inheritDoc} */
735
+    @Override
736
+    public void dispose() {
737
+        removeWindowListener(this);
738
+        IdentityManager.getGlobalConfig().removeListener(this);
739
+        super.dispose();
740
+    }
733 741
 }

+ 20
- 4
src/com/dmdirc/addons/ui_swing/SwingController.java Visa fil

@@ -110,6 +110,10 @@ public class SwingController extends BasePlugin implements UIController {
110 110
     private final List<java.awt.Window> windows;
111 111
     /** Error dialog. */
112 112
     private ErrorListDialog errorDialog;
113
+    /** DMDirc event queue. */
114
+    private DMDircEventQueue eventQueue;
115
+    /** Key listener to handle dialog key events. */
116
+    private DialogKeyListener keyListener;
113 117
 
114 118
     /** Instantiates a new SwingController. */
115 119
     public SwingController() {
@@ -460,10 +464,11 @@ public class SwingController extends BasePlugin implements UIController {
460 464
                     "Swing UI can't be run in a headless environment");
461 465
         }
462 466
 
463
-        Toolkit.getDefaultToolkit().getSystemEventQueue().
464
-                push(new DMDircEventQueue(this));
467
+        eventQueue = new DMDircEventQueue(this);
468
+        keyListener = new DialogKeyListener();
469
+        Toolkit.getDefaultToolkit().getSystemEventQueue().push(eventQueue);
465 470
         KeyboardFocusManager.getCurrentKeyboardFocusManager().
466
-                addKeyEventDispatcher(new DialogKeyListener());
471
+                addKeyEventDispatcher(keyListener);
467 472
 
468 473
         UIUtilities.invokeAndWait(new Runnable() {
469 474
 
@@ -492,7 +497,18 @@ public class SwingController extends BasePlugin implements UIController {
492 497
     /** {@inheritDoc} */
493 498
     @Override
494 499
     public void onUnload() {
495
-        // Do nothing
500
+        errorDialog.dispose();
501
+        WindowManager.removeFrameListener(windowFactory);
502
+        mainFrameCreated.set(false);
503
+        me.dispose();
504
+        windowFactory.dispose();
505
+        StatusBarManager.getStatusBarManager().registerStatusBar(statusBar);
506
+        eventQueue.pop();
507
+        KeyboardFocusManager.getCurrentKeyboardFocusManager().
508
+                removeKeyEventDispatcher(keyListener);
509
+        for (java.awt.Window window : getTopLevelWindows()) {
510
+            window.dispose();
511
+        }
496 512
     }
497 513
 
498 514
     /** {@inheritDoc} */

+ 11
- 0
src/com/dmdirc/addons/ui_swing/SwingWindowFactory.java Visa fil

@@ -206,4 +206,15 @@ public class SwingWindowFactory implements FrameListener {
206 206
             }
207 207
         });
208 208
     }
209
+
210
+    /** Disposes of this window factory, removing all listeners. */
211
+    public void dispose() {
212
+        for (SwingWindowListener listener : listeners.get(
213
+                SwingWindowListener.class)) {
214
+            listeners.remove(SwingWindowListener.class, listener);
215
+        }
216
+        for (TextFrame frame : windows.values()) {
217
+            frame.dispose();
218
+        }
219
+    }
209 220
 }

+ 9
- 1
src/com/dmdirc/addons/ui_swing/components/frames/ChannelFrame.java Visa fil

@@ -73,7 +73,7 @@ public final class ChannelFrame extends InputTextFrame implements ActionListener
73 73
     /** Topic bar. */
74 74
     private TopicBar topicBar;
75 75
     /** UI controller. */
76
-    private SwingController controller;
76
+    private final SwingController controller;
77 77
 
78 78
     /**
79 79
      * Creates a new instance of ChannelFrame. Sets up callbacks and handlers,
@@ -279,4 +279,12 @@ public final class ChannelFrame extends InputTextFrame implements ActionListener
279 279
 
280 280
         super.windowClosing(window);
281 281
     }
282
+
283
+    /** {@inheritDoc} */
284
+    @Override
285
+    public void dispose() {
286
+        ActionManager.getActionManager().unregisterListener(this);
287
+        IdentityManager.getGlobalConfig().removeListener(this);
288
+        super.dispose();
289
+    }
282 290
 }

+ 7
- 0
src/com/dmdirc/addons/ui_swing/components/frames/InputTextFrame.java Visa fil

@@ -404,4 +404,11 @@ public abstract class InputTextFrame extends TextFrame implements InputWindow,
404 404
         super.activateFrame();
405 405
         inputField.requestFocusInWindow();
406 406
     }
407
+
408
+    /** {@inheritDoc} */
409
+    @Override
410
+    public void dispose() {
411
+        frameParent.getConfigManager().removeListener(this);
412
+        super.dispose();
413
+    }
407 414
 }

+ 7
- 2
src/com/dmdirc/addons/ui_swing/components/frames/ServerFrame.java Visa fil

@@ -57,10 +57,8 @@ public final class ServerFrame extends InputTextFrame implements
57 57
      * objects being unserialized with the new class).
58 58
      */
59 59
     private static final long serialVersionUID = 9;
60
-
61 60
     /** popup menu item. */
62 61
     private JMenuItem settingsMI;
63
-
64 62
     /** The SSL certificate dialog we're displaying for this server, if any. */
65 63
     private SSLCertificateDialog sslDialog = null;
66 64
 
@@ -175,4 +173,11 @@ public final class ServerFrame extends InputTextFrame implements
175 173
 
176 174
         super.windowClosing(window);
177 175
     }
176
+
177
+    /** {@inheritDoc} */
178
+    @Override
179
+    public void dispose() {
180
+        ((Server) frameParent).removeCertificateProblemListener(this);
181
+        super.dispose();
182
+    }
178 183
 }

+ 6
- 0
src/com/dmdirc/addons/ui_swing/components/frames/TextFrame.java Visa fil

@@ -495,4 +495,10 @@ public abstract class TextFrame extends JPanel implements Window,
495 495
         getTextPane().setBackground(getContainer().getConfigManager()
496 496
                 .getOptionColour("ui", "backgroundcolour"));
497 497
     }
498
+
499
+    /** Disposes of this window, removing any listeners. */
500
+    public void dispose() {
501
+        frameParent.getConfigManager().removeListener(this);
502
+        frameParent.removeCloseListener(this);
503
+    }
498 504
 }

+ 7
- 0
src/com/dmdirc/addons/ui_swing/dialogs/error/ErrorListDialog.java Visa fil

@@ -290,4 +290,11 @@ public final class ErrorListDialog extends StandardDialog implements
290 290
         super.display();
291 291
         setSize(new Dimension(600, 550));
292 292
     }
293
+
294
+    /** {@inheritDoc} */
295
+    @Override
296
+    public void dispose() {
297
+        tableModel.dispose();
298
+        super.dispose();
299
+    }
293 300
 }

+ 12
- 1
src/com/dmdirc/addons/ui_swing/dialogs/error/ErrorTableModel.java Visa fil

@@ -48,6 +48,8 @@ public final class ErrorTableModel extends AbstractTableModel implements
48 48
     private static final long serialVersionUID = 2;
49 49
     /** Data list. */
50 50
     private final List<ProgramError> errors;
51
+    /** Are we ready? */
52
+    private boolean ready = false;
51 53
 
52 54
     /** Creates a new instance of ErrorTableModel. */
53 55
     public ErrorTableModel() {
@@ -65,6 +67,7 @@ public final class ErrorTableModel extends AbstractTableModel implements
65 67
         this.errors = Collections.synchronizedList(errors);
66 68
 
67 69
         ErrorManager.getErrorManager().addErrorListener(this);
70
+        ready = true;
68 71
     }
69 72
 
70 73
     /**
@@ -294,6 +297,14 @@ public final class ErrorTableModel extends AbstractTableModel implements
294 297
     /** {@inheritDoc} */
295 298
     @Override
296 299
     public boolean isReady() {
297
-        return true;
300
+        return ready;
301
+    }
302
+
303
+    /**
304
+     * Disposes of this model, removing any added listeners.
305
+     */
306
+    public void dispose() {
307
+        ErrorManager.getErrorManager().removeErrorListener(this);
308
+        ready = false;
298 309
     }
299 310
 }

+ 0
- 1
src/com/dmdirc/addons/ui_swing/plugin.config Visa fil

@@ -15,7 +15,6 @@ metadata:
15 15
   description=The standard DMDirc user interface
16 16
   name=ui_swing
17 17
   nicename=Swing UI
18
-  unloadable=no
19 18
 
20 19
 updates:
21 20
   id=42

Laddar…
Avbryt
Spara