@Override public void dispose() { if (isShowing()) { hide(); } if (myWindowListener != null) { myWindowListener.saveSize(); removeWindowListener(myWindowListener); myWindowListener = null; } if (myComponentListener != null) { removeComponentListener(myComponentListener); myComponentListener = null; } if (myFocusTrackback != null && !(myFocusTrackback.isSheduledForRestore() || myFocusTrackback.isWillBeSheduledForRestore())) { myFocusTrackback.dispose(); myFocusTrackback = null; } final BufferStrategy strategy = getBufferStrategy(); if (strategy != null) { strategy.dispose(); } super.dispose(); if (rootPane != null) { // Workaround for bug in native code to hold rootPane try { Field field = rootPane.getClass().getDeclaredField("glassPane"); field.setAccessible(true); field.set(rootPane, null); field = rootPane.getClass().getDeclaredField("contentPane"); field.setAccessible(true); field.set(rootPane, null); rootPane = null; field = Window.class.getDeclaredField("windowListener"); field.setAccessible(true); field.set(this, null); } catch (Exception ignored) { } } // http://bugs.sun.com/view_bug.do?bug_id=6614056 try { final Field field = Dialog.class.getDeclaredField("modalDialogs"); field.setAccessible(true); final List<?> list = (List<?>) field.get(null); list.remove(this); } catch (final Exception ignored) { } }
private void disposeFocusTrackbackIfNoChildWindowFocused( @Nullable IdeFocusManager focusManager) { if (myFocusTrackback == null) return; final DialogWrapper wrapper = myDialogWrapper.get(); if (wrapper == null || !wrapper.isShowing()) { myFocusTrackback.dispose(); return; } if (focusManager != null) { final Component c = focusManager.getFocusedDescendantFor(wrapper.getContentPane()); if (c == null) { myFocusTrackback.dispose(); } } else { final Component owner = KeyboardFocusManager.getCurrentKeyboardFocusManager().getFocusOwner(); if (owner == null || !SwingUtilities.isDescendingFrom(owner, wrapper.getContentPane())) { myFocusTrackback.dispose(); } } }