GitComplexProcess: don't change "save on frame deactivation" and "sync on frame activation" settings. Instead block save/sync programmatically.

This commit is contained in:
Kirill Likhodedov
2011-09-14 12:47:50 +04:00
parent ae4a47f95b
commit 00c98ddcde
3 changed files with 34 additions and 18 deletions
@@ -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();
}
}
@@ -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
@@ -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) {