From fb5ad5b2be71541014044e7175a3f42d3ae63374 Mon Sep 17 00:00:00 2001 From: peter Date: Fri, 20 Sep 2013 12:27:10 +0200 Subject: [PATCH] IDEA-113638 ChooseByName restart on write action spawns a new thread --- .../ide/util/gotoByName/ChooseByNameBase.java | 23 +++++++++++-------- 1 file changed, 13 insertions(+), 10 deletions(-) diff --git a/platform/lang-impl/src/com/intellij/ide/util/gotoByName/ChooseByNameBase.java b/platform/lang-impl/src/com/intellij/ide/util/gotoByName/ChooseByNameBase.java index f4886f4931a5..63bc2d9e31bf 100644 --- a/platform/lang-impl/src/com/intellij/ide/util/gotoByName/ChooseByNameBase.java +++ b/platform/lang-impl/src/com/intellij/ide/util/gotoByName/ChooseByNameBase.java @@ -898,15 +898,6 @@ public abstract class ChooseByNameBase { cancelCalcElementsThread(); } }); - ApplicationManager.getApplication().addApplicationListener(new ApplicationAdapter() { - @Override - public void beforeWriteActionStart(Object action) { - CalcElementsThread prevThread = cancelCalcElementsThread(); - if (prevThread != null) { - prevThread.scheduleRestart(); - } - } - }, myTextPopup); myTextPopup.show(layeredPane); } @@ -1503,7 +1494,7 @@ public abstract class ChooseByNameBase { private final Alarm myShowCardAlarm = new Alarm(); - void scheduleRestart() { + private void scheduleRestart() { scheduleCalcElements(new CalcElementsThread(myPattern, myCheckboxState, myCallback, myModalityState, myCanCancel, myScopeExpanded)); } @@ -1520,6 +1511,15 @@ public abstract class ChooseByNameBase { ApplicationManager.getApplication().runReadAction(new Runnable() { @Override public void run() { + ApplicationAdapter listener = new ApplicationAdapter() { + @Override + public void beforeWriteActionStart(Object action) { + cancel(); + scheduleRestart(); + ApplicationManager.getApplication().removeApplicationListener(this); + } + }; + ApplicationManager.getApplication().addApplicationListener(listener); try { boolean everywhere = myCheckboxState; if (!ourLoadNamesEachTime) ensureNamesLoaded(everywhere); @@ -1528,6 +1528,9 @@ public abstract class ChooseByNameBase { catch (ProcessCanceledException e) { //OK } + finally { + ApplicationManager.getApplication().removeApplicationListener(listener); + } } }); }