From 5e983fcdbc4f22c0dd77332f29dcaa54d238c893 Mon Sep 17 00:00:00 2001 From: "Denis.Zhdanov" Date: Thu, 16 Feb 2012 16:58:12 +0400 Subject: [PATCH] IDEA-76142: Gradle support - cannot update IDEA projects once one of build.gradle files changes Don't refresh gradle project on intellij project structure change while modal dialog is open (assuming that that modal dialog is 'project settings' dialog) --- ...GradleProjectStructureChangesDetector.java | 19 ++++++++++++++++++- .../plugins/gradle/util/GradleUtil.java | 10 +++++----- 2 files changed, 23 insertions(+), 6 deletions(-) diff --git a/plugins/gradle/src/org/jetbrains/plugins/gradle/sync/GradleProjectStructureChangesDetector.java b/plugins/gradle/src/org/jetbrains/plugins/gradle/sync/GradleProjectStructureChangesDetector.java index e46258ad1597..11baf98bbe71 100644 --- a/plugins/gradle/src/org/jetbrains/plugins/gradle/sync/GradleProjectStructureChangesDetector.java +++ b/plugins/gradle/src/org/jetbrains/plugins/gradle/sync/GradleProjectStructureChangesDetector.java @@ -1,11 +1,13 @@ package org.jetbrains.plugins.gradle.sync; import com.intellij.ProjectTopics; +import com.intellij.openapi.application.ModalityState; import com.intellij.openapi.components.AbstractProjectComponent; import com.intellij.openapi.project.Project; import com.intellij.openapi.roots.ModuleRootEvent; import com.intellij.openapi.roots.ModuleRootListener; import com.intellij.util.Alarm; +import com.intellij.util.ui.UIUtil; import org.jetbrains.annotations.NotNull; import org.jetbrains.plugins.gradle.util.GradleUtil; @@ -59,10 +61,25 @@ public class GradleProjectStructureChangesDetector extends AbstractProjectCompon myAlarm.cancelAllRequests(); final long diff = System.currentTimeMillis() - myStartRefreshTime.get(); if (diff < 0) { + myAlarm.cancelAllRequests(); myAlarm.addRequest(this, (int)-diff); return; } - GradleUtil.refreshProject(myProject); + + UIUtil.invokeAndWaitIfNeeded(new Runnable() { + @Override + public void run() { + if (ModalityState.current() != ModalityState.NON_MODAL) { + // There is a possible case that user performs intellij project structure modification and 'project settings' dialog + // is open. We want to perform the refresh when the editing is completely finished then. + myAlarm.cancelAllRequests(); + myAlarm.addRequest(RefreshRequest.this, REFRESH_DELAY_MILLIS); + return; + } + + GradleUtil.refreshProject(myProject); + } + }); } } } diff --git a/plugins/gradle/src/org/jetbrains/plugins/gradle/util/GradleUtil.java b/plugins/gradle/src/org/jetbrains/plugins/gradle/util/GradleUtil.java index b2327cf987f0..3977afeb7df3 100644 --- a/plugins/gradle/src/org/jetbrains/plugins/gradle/util/GradleUtil.java +++ b/plugins/gradle/src/org/jetbrains/plugins/gradle/util/GradleUtil.java @@ -157,10 +157,10 @@ public class GradleUtil { */ @Nullable public static GradleProject refreshProject(@NotNull final Project project, - @NotNull final String gradleProjectPath, - @NotNull final Ref errorHolder, - final boolean resolveLibraries, - final boolean modal) + @NotNull final String gradleProjectPath, + @NotNull final Ref errorHolder, + final boolean resolveLibraries, + final boolean modal) { final Ref gradleProject = new Ref(); final TaskUnderProgress task = new TaskUnderProgress() { @@ -196,7 +196,7 @@ public class GradleUtil { task.execute(indicator); } }); - } + } } }); return gradleProject.get();