From 0e5cd44be63da9bb16cfc8abe15d378f62762357 Mon Sep 17 00:00:00 2001 From: Kirill Kalishev Date: Thu, 28 Jan 2010 13:22:29 +0300 Subject: [PATCH] dialogs: showAndAndGetOk() for notifiyng when focus is settled after the show --- .../src/com/intellij/openapi/ui/DialogWrapper.java | 15 ++++++++++++++- .../com/intellij/openapi/ui/DialogWrapperPeer.java | 3 ++- .../openapi/ui/impl/DialogWrapperPeerImpl.java | 19 +++++++++++++++---- .../openapi/ui/impl/GlassPaneDialogWrapperPeer.java | 5 ++++- 4 files changed, 35 insertions(+), 7 deletions(-) diff --git a/platform/platform-api/src/com/intellij/openapi/ui/DialogWrapper.java b/platform/platform-api/src/com/intellij/openapi/ui/DialogWrapper.java index 352035aea5..b3992ccefc 100644 --- a/platform/platform-api/src/com/intellij/openapi/ui/DialogWrapper.java +++ b/platform/platform-api/src/com/intellij/openapi/ui/DialogWrapper.java @@ -23,6 +23,7 @@ import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.help.HelpManager; import com.intellij.openapi.project.Project; import com.intellij.openapi.ui.popup.StackingPopupDispatcher; +import com.intellij.openapi.util.AsyncResult; import com.intellij.openapi.util.Disposer; import com.intellij.openapi.util.IconLoader; import com.intellij.openapi.util.SystemInfo; @@ -940,6 +941,12 @@ public abstract class DialogWrapper { * @throws IllegalStateException if the dialog is invoked not on the event dispatch thread */ public void show() { + showAndGetOk(); + } + + public AsyncResult showAndGetOk() { + final AsyncResult result = new AsyncResult(); + ensureEventDispatchThread(); registerKeyboardShortcuts(); @@ -949,7 +956,13 @@ public abstract class DialogWrapper { Disposer.register(uiParent, myDisposable); // ensure everything is disposed on app quit } - myPeer.show(); + myPeer.show().doWhenProcessed(new Runnable() { + public void run() { + result.setDone(isOK()); + } + }); + + return result; } /** diff --git a/platform/platform-api/src/com/intellij/openapi/ui/DialogWrapperPeer.java b/platform/platform-api/src/com/intellij/openapi/ui/DialogWrapperPeer.java index fc81a7273c..c501a19e7d 100644 --- a/platform/platform-api/src/com/intellij/openapi/ui/DialogWrapperPeer.java +++ b/platform/platform-api/src/com/intellij/openapi/ui/DialogWrapperPeer.java @@ -15,6 +15,7 @@ */ package com.intellij.openapi.ui; +import com.intellij.openapi.util.ActionCallback; import org.jetbrains.annotations.Nullable; import javax.swing.*; @@ -138,7 +139,7 @@ public abstract class DialogWrapperPeer { */ public abstract void setLocation(int x, int y); - public abstract void show(); + public abstract ActionCallback show(); public abstract void setContentPane(JComponent content); diff --git a/platform/platform-impl/src/com/intellij/openapi/ui/impl/DialogWrapperPeerImpl.java b/platform/platform-impl/src/com/intellij/openapi/ui/impl/DialogWrapperPeerImpl.java index 898848d82d..c6355f4538 100644 --- a/platform/platform-impl/src/com/intellij/openapi/ui/impl/DialogWrapperPeerImpl.java +++ b/platform/platform-impl/src/com/intellij/openapi/ui/impl/DialogWrapperPeerImpl.java @@ -348,7 +348,9 @@ public class DialogWrapperPeerImpl extends DialogWrapperPeer implements FocusTra myDialog.setLocation(x, y); } - public void show() { + public ActionCallback show() { + final ActionCallback result = new ActionCallback(); + LOG.assertTrue(EventQueue.isDispatchThread(), "Access is allowed from event dispatch thread only"); final AnCancelAction anCancelAction = new AnCancelAction(); @@ -397,7 +399,15 @@ public class DialogWrapperPeerImpl extends DialogWrapperPeer implements FocusTra LaterInvocator.leaveModal(myDialog); } } + + myDialog.getFocusManager().doWhenFocusSettlesDown(new Runnable() { + public void run() { + result.setDone(); + } + }); } + + return result; } //[kirillk] for now it only deals with the TaskWindow under Mac OS X: modal dialogs are shown behind JBPopup @@ -674,15 +684,16 @@ public class DialogWrapperPeerImpl extends DialogWrapperPeer implements FocusTra @Deprecated public void hide() { super.hide(); - if (myFocusTrackback != null) { + if (myFocusTrackback != null && !(myFocusTrackback.isSheduledForRestore() || myFocusTrackback.isWillBeSheduledForRestore())) { myFocusTrackback.setWillBeSheduledForRestore(); IdeFocusManager mgr = getFocusManager(); - mgr.doWhenFocusSettlesDown(new Runnable() { + Runnable r = new Runnable() { public void run() { myFocusTrackback.restoreFocus(); myFocusTrackback = null; } - }); + }; + mgr.doWhenFocusSettlesDown(r); } } diff --git a/platform/platform-impl/src/com/intellij/openapi/ui/impl/GlassPaneDialogWrapperPeer.java b/platform/platform-impl/src/com/intellij/openapi/ui/impl/GlassPaneDialogWrapperPeer.java index 0f30bbb7c3..e53703a439 100644 --- a/platform/platform-impl/src/com/intellij/openapi/ui/impl/GlassPaneDialogWrapperPeer.java +++ b/platform/platform-impl/src/com/intellij/openapi/ui/impl/GlassPaneDialogWrapperPeer.java @@ -29,6 +29,7 @@ import com.intellij.openapi.project.Project; import com.intellij.openapi.ui.DialogWrapper; import com.intellij.openapi.ui.DialogWrapperDialog; import com.intellij.openapi.ui.DialogWrapperPeer; +import com.intellij.openapi.util.ActionCallback; import com.intellij.openapi.util.Disposer; import com.intellij.openapi.util.SystemInfo; import com.intellij.openapi.wm.IdeFrame; @@ -275,12 +276,14 @@ public class GlassPaneDialogWrapperPeer extends DialogWrapperPeer implements Foc myDialog.setLocation(_x, _y); } - public void show() { + public ActionCallback show() { LOG.assertTrue(EventQueue.isDispatchThread(), "Access is allowed from event dispatch thread only"); hidePopupsIfNeeded(); myDialog.setVisible(true); + + return new ActionCallback.Done(); } public void setContentPane(final JComponent content) { -- 2.11.4.GIT