From 777bf85b5fb45ce1ac3be32ed534be36c67b2dcf Mon Sep 17 00:00:00 2001 From: Kirill Likhodedov Date: Wed, 28 Mar 2012 15:12:27 +0400 Subject: [PATCH] Better fix for IDEA-78716 Master password prompt is "hidden" Don't call invoke and wait in AWT, just run in that case. Introduced GuiUtils.invokeAndWaitIfNeeded for this purpose, since we don't have a fair method in utils which invokes Application#invokeAndWait. It still leads to an assertion error in Settings | GitHub, the fix for the assertion will follow in the next commit. --- .../src/com/intellij/ui/GuiUtils.java | 15 +++++++++++++++ .../masterKey/MasterKeyPasswordSafe.java | 3 ++- .../passwordSafe/ui/PasswordSafePromptDialog.java | 4 ++-- 3 files changed, 19 insertions(+), 3 deletions(-) diff --git a/platform/platform-api/src/com/intellij/ui/GuiUtils.java b/platform/platform-api/src/com/intellij/ui/GuiUtils.java index 6abc627f752f..68c970d04780 100644 --- a/platform/platform-api/src/com/intellij/ui/GuiUtils.java +++ b/platform/platform-api/src/com/intellij/ui/GuiUtils.java @@ -17,6 +17,7 @@ package com.intellij.ui; import com.intellij.openapi.application.Application; import com.intellij.openapi.application.ApplicationManager; +import com.intellij.openapi.application.ModalityState; import com.intellij.openapi.fileChooser.FileChooser; import com.intellij.openapi.fileChooser.FileChooserDescriptor; import com.intellij.openapi.fileChooser.FileChooserDescriptorFactory; @@ -382,4 +383,18 @@ public class GuiUtils { invokeAndWait(runnable); } } + + /** + * Runs the runnable, if called from the dispatch thread. + * Otherwise calls {@link Application#invokeAndWait(Runnable, com.intellij.openapi.application.ModalityState)} + */ + public static void invokeAndWaitIfNeeded(@NotNull Runnable runnable, @NotNull ModalityState modalityState) { + Application application = ApplicationManager.getApplication(); + if (application.isDispatchThread()) { + runnable.run(); + } + else { + application.invokeAndWait(runnable, modalityState); + } + } } diff --git a/platform/platform-impl/src/com/intellij/ide/passwordSafe/impl/providers/masterKey/MasterKeyPasswordSafe.java b/platform/platform-impl/src/com/intellij/ide/passwordSafe/impl/providers/masterKey/MasterKeyPasswordSafe.java index 82fad28a4996..c632778b2646 100644 --- a/platform/platform-impl/src/com/intellij/ide/passwordSafe/impl/providers/masterKey/MasterKeyPasswordSafe.java +++ b/platform/platform-impl/src/com/intellij/ide/passwordSafe/impl/providers/masterKey/MasterKeyPasswordSafe.java @@ -26,6 +26,7 @@ import com.intellij.openapi.application.ModalityState; import com.intellij.openapi.project.Project; import com.intellij.openapi.util.Ref; import com.intellij.openapi.util.SystemInfo; +import com.intellij.ui.GuiUtils; import java.io.UnsupportedEncodingException; import java.util.HashMap; @@ -182,7 +183,7 @@ public class MasterKeyPasswordSafe extends BasePasswordSafeProvider { } if (key.get() == null) { final Ref ex = new Ref(); - ApplicationManager.getApplication().invokeAndWait(new Runnable() { + GuiUtils.invokeAndWaitIfNeeded(new Runnable() { public void run() { if (key.get() == null) { try { diff --git a/platform/platform-impl/src/com/intellij/ide/passwordSafe/ui/PasswordSafePromptDialog.java b/platform/platform-impl/src/com/intellij/ide/passwordSafe/ui/PasswordSafePromptDialog.java index 21254efc1ba6..798875c744f9 100644 --- a/platform/platform-impl/src/com/intellij/ide/passwordSafe/ui/PasswordSafePromptDialog.java +++ b/platform/platform-impl/src/com/intellij/ide/passwordSafe/ui/PasswordSafePromptDialog.java @@ -18,12 +18,12 @@ package com.intellij.ide.passwordSafe.ui; import com.intellij.ide.passwordSafe.PasswordSafe; import com.intellij.ide.passwordSafe.PasswordSafeException; import com.intellij.ide.passwordSafe.impl.PasswordSafeImpl; -import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.application.ModalityState; import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.project.Project; import com.intellij.openapi.ui.DialogWrapper; import com.intellij.openapi.ui.Messages; +import com.intellij.ui.GuiUtils; import com.intellij.util.ui.UIUtil; import javax.swing.*; @@ -273,7 +273,7 @@ public class PasswordSafePromptDialog extends DialogWrapper { } } final AtomicReference pw = new AtomicReference(null); - ApplicationManager.getApplication().invokeAndWait(new Runnable() { + GuiUtils.invokeAndWaitIfNeeded(new Runnable() { public void run() { final PasswordSafePromptDialog d = new PasswordSafePromptDialog(project, ps, title, message); if (promptLabel != null) {