diff --git a/platform/platform-impl/src/com/intellij/ide/SaveAndSyncHandler.java b/platform/platform-impl/src/com/intellij/ide/SaveAndSyncHandler.java index 3f9534e82b61..14c87bd577d5 100644 --- a/platform/platform-impl/src/com/intellij/ide/SaveAndSyncHandler.java +++ b/platform/platform-impl/src/com/intellij/ide/SaveAndSyncHandler.java @@ -34,6 +34,7 @@ import org.jetbrains.annotations.NotNull; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; +import java.util.concurrent.atomic.AtomicInteger; /** * @author Anton Katilin @@ -44,6 +45,13 @@ public class SaveAndSyncHandler implements ApplicationComponent { private final Runnable myIdleListener; private final PropertyChangeListener myGeneralSettingsListener; private final ProgressManager myProgressManager; + + private final AtomicInteger myBlockSaveOnFrameDeactivationCount = new AtomicInteger(); + private final AtomicInteger myBlockSyncOnFrameActivationCount = new AtomicInteger(); + + public static SaveAndSyncHandler getInstance(){ + return ApplicationManager.getApplication().getComponent(SaveAndSyncHandler.class); + } public SaveAndSyncHandler(final FrameStateManager frameStateManager, final FileDocumentManager fileDocumentManager, @@ -109,13 +117,13 @@ public class SaveAndSyncHandler implements ApplicationComponent { } // made public for tests - public static void saveProjectsAndDocuments() { + public void saveProjectsAndDocuments() { if (LOG.isDebugEnabled()) { LOG.debug("enter: save()"); } if (ApplicationManager.getApplication().isDisposed()) return; - if (GeneralSettings.getInstance().isSaveOnFrameDeactivation()) { + if (myBlockSaveOnFrameDeactivationCount.get() == 0 && GeneralSettings.getInstance().isSaveOnFrameDeactivation()) { FileDocumentManager.getInstance().saveAllDocuments(); Project[] openProjects = ProjectManagerEx.getInstanceEx().getOpenProjects(); @@ -158,8 +166,8 @@ public class SaveAndSyncHandler implements ApplicationComponent { } } - public static void maybeRefresh(ModalityState modalityState) { - if (GeneralSettings.getInstance().isSyncOnFrameActivation()) { + public void maybeRefresh(ModalityState modalityState) { + if (myBlockSyncOnFrameActivationCount.get() == 0 && GeneralSettings.getInstance().isSyncOnFrameActivation()) { if (LOG.isDebugEnabled()) { LOG.debug("refresh VFS"); } @@ -182,4 +190,20 @@ public class SaveAndSyncHandler implements ApplicationComponent { session.launch(); } + + public void blockSaveOnFrameDeactivation() { + myBlockSaveOnFrameDeactivationCount.incrementAndGet(); + } + + public void unblockSaveOnFrameDeactivation() { + myBlockSaveOnFrameDeactivationCount.decrementAndGet(); + } + + public void blockSyncOnFrameActivation() { + myBlockSyncOnFrameActivationCount.incrementAndGet(); + } + + public void unblockSyncOnFrameActivation() { + myBlockSyncOnFrameActivationCount.decrementAndGet(); + } } \ No newline at end of file diff --git a/platform/platform-impl/src/com/intellij/openapi/fileChooser/ex/FileChooserDialogImpl.java b/platform/platform-impl/src/com/intellij/openapi/fileChooser/ex/FileChooserDialogImpl.java index 7f0e6a3551d2..449d7e8dc595 100644 --- a/platform/platform-impl/src/com/intellij/openapi/fileChooser/ex/FileChooserDialogImpl.java +++ b/platform/platform-impl/src/com/intellij/openapi/fileChooser/ex/FileChooserDialogImpl.java @@ -218,7 +218,7 @@ public class FileChooserDialogImpl extends DialogWrapper implements FileChooserD .subscribe(ApplicationActivationListener.TOPIC, new ApplicationActivationListener() { @Override public void applicationActivated(IdeFrame ideFrame) { - SaveAndSyncHandler.maybeRefresh(ModalityState.current()); + SaveAndSyncHandler.getInstance().maybeRefresh(ModalityState.current()); } @Override diff --git a/plugins/git4idea/src/git4idea/update/GitComplexProcess.java b/plugins/git4idea/src/git4idea/update/GitComplexProcess.java index 33a43a8dfa20..612133003765 100644 --- a/plugins/git4idea/src/git4idea/update/GitComplexProcess.java +++ b/plugins/git4idea/src/git4idea/update/GitComplexProcess.java @@ -15,7 +15,7 @@ */ package git4idea.update; -import com.intellij.ide.GeneralSettings; +import com.intellij.ide.SaveAndSyncHandler; import com.intellij.openapi.fileEditor.FileDocumentManager; import com.intellij.openapi.project.Project; import com.intellij.openapi.project.ex.ProjectManagerEx; @@ -50,20 +50,16 @@ public class GitComplexProcess { private final Operation myOperation; private final String myFreezeReason; - private final GeneralSettings myGeneralSettings; private final ProjectManagerEx myProjectManager; private final GitRepositoryManager myRepositoryManager; private final ChangeListManager myChangeListManager; - private final boolean mySaveOnFrameDeactivation; - private final boolean mySyncOnFrameDeactivation; - private final TaskDescriptor BLOCK = new TaskDescriptor("", Where.AWT) { @Override public void run(ContinuationContext context) { myProjectManager.blockReloadingProjectOnExternalChanges(); FileDocumentManager.getInstance().saveAllDocuments(); - myGeneralSettings.setSaveOnFrameDeactivation(false); - myGeneralSettings.setSyncOnFrameActivation(false); + SaveAndSyncHandler.getInstance().blockSaveOnFrameDeactivation(); + SaveAndSyncHandler.getInstance().blockSyncOnFrameActivation(); } }; @@ -82,8 +78,8 @@ public class GitComplexProcess { private final TaskDescriptor UNBLOCK = new TaskDescriptor("", Where.AWT) { @Override public void run(ContinuationContext context) { myProjectManager.unblockReloadingProjectOnExternalChanges(); - myGeneralSettings.setSaveOnFrameDeactivation(mySaveOnFrameDeactivation); - myGeneralSettings.setSyncOnFrameActivation(mySyncOnFrameDeactivation); + SaveAndSyncHandler.getInstance().unblockSaveOnFrameDeactivation(); + SaveAndSyncHandler.getInstance().unblockSyncOnFrameActivation(); } @Override public boolean isHaveMagicCure() { @@ -103,14 +99,10 @@ public class GitComplexProcess { myOperation = operation; myFreezeReason = "Local changes are not available until Git " + myTitle + " is finished."; - myGeneralSettings = GeneralSettings.getInstance(); myProjectManager = ProjectManagerEx.getInstanceEx(); myRepositoryManager = GitRepositoryManager.getInstance(project); myChangeListManager = ChangeListManager.getInstance(myProject); - mySaveOnFrameDeactivation = myGeneralSettings.isSaveOnFrameDeactivation(); - mySyncOnFrameDeactivation = myGeneralSettings.isSyncOnFrameActivation(); - // define tasks that need information from constructor FREEZE = new TaskDescriptor(myTitle, Where.POOLED) {