From 841fb737eb4a7cb800b2416cb94aec2889462148 Mon Sep 17 00:00:00 2001 From: Vladimir Krivosheev Date: Mon, 3 Sep 2012 19:27:24 +0400 Subject: [PATCH] refactor as prepare to fix WI-12979 --- ...cutor.java => DelayedDocumentWatcher.java} | 86 +++++++++++-------- 1 file changed, 48 insertions(+), 38 deletions(-) rename platform/platform-impl/src/com/intellij/execution/{AutoExecutor.java => DelayedDocumentWatcher.java} (73%) diff --git a/platform/platform-impl/src/com/intellij/execution/AutoExecutor.java b/platform/platform-impl/src/com/intellij/execution/DelayedDocumentWatcher.java similarity index 73% rename from platform/platform-impl/src/com/intellij/execution/AutoExecutor.java rename to platform/platform-impl/src/com/intellij/execution/DelayedDocumentWatcher.java index 5ce33781662a..0a23afa63803 100644 --- a/platform/platform-impl/src/com/intellij/execution/AutoExecutor.java +++ b/platform/platform-impl/src/com/intellij/execution/DelayedDocumentWatcher.java @@ -8,8 +8,6 @@ import com.intellij.openapi.fileEditor.FileDocumentManager; import com.intellij.openapi.project.Project; import com.intellij.openapi.util.Condition; import com.intellij.openapi.vfs.VirtualFile; -import com.intellij.openapi.vfs.VirtualFileAdapter; -import com.intellij.openapi.vfs.VirtualFileEvent; import com.intellij.openapi.vfs.VirtualFileManager; import com.intellij.openapi.vfs.newvfs.BulkFileListener; import com.intellij.openapi.vfs.newvfs.events.VFileDeleteEvent; @@ -17,6 +15,7 @@ import com.intellij.openapi.vfs.newvfs.events.VFileEvent; import com.intellij.problems.WolfTheProblemSolver; import com.intellij.util.Alarm; import com.intellij.util.Consumer; +import com.intellij.util.messages.MessageBusConnection; import gnu.trove.THashSet; import org.jetbrains.annotations.NotNull; @@ -24,21 +23,26 @@ import java.util.Collections; import java.util.List; import java.util.Set; -public class AutoExecutor implements Runnable { +public class DelayedDocumentWatcher implements Runnable { private final Project project; private final Alarm alarm; private final Consumer consumer; private final int delay; private final MyDocumentAdapter listener; - private boolean listenerAttached; private final Set changedFiles = new THashSet(); private boolean wasRequested; private final Condition documentChangedFilter; - public AutoExecutor(Project project, Alarm alarm, int delay, Consumer consumer, Condition documentChangedFilter) { + private MessageBusConnection messageBusConnection; + + public DelayedDocumentWatcher(Project project, + Alarm alarm, + int delay, + Consumer consumer, + Condition documentChangedFilter) { this.project = project; this.alarm = alarm; this.delay = delay; @@ -46,34 +50,14 @@ public class AutoExecutor implements Runnable { this.documentChangedFilter = documentChangedFilter; listener = new MyDocumentAdapter(); - - project.getMessageBus().connect().subscribe(VirtualFileManager.VFS_CHANGES, new BulkFileListener() { - @Override - public void before(@NotNull List events) { - } - - @Override - public void after(@NotNull List events) { - for (VFileEvent event : events) { - if (event instanceof VFileDeleteEvent) { - synchronized (changedFiles) { - changedFiles.remove(event.getFile()); - } - } - } - } - }); } - private void addVfsListener() { - VirtualFileManager.getInstance().addVirtualFileListener(new VirtualFileAdapter() { - @Override - public void fileDeleted(VirtualFileEvent event) { - synchronized (changedFiles) { - changedFiles.remove(event.getFile()); - } - } - }); + public DelayedDocumentWatcher(Project project, + Alarm alarm, + int delay, + Consumer consumer) { + //noinspection unchecked + this(project, alarm, delay, consumer, Condition.TRUE); } @Override @@ -107,17 +91,43 @@ public class AutoExecutor implements Runnable { } public void activate() { - if (!listenerAttached) { - listenerAttached = true; - EditorFactory.getInstance().getEventMulticaster().addDocumentListener(listener, project); + if (messageBusConnection != null) { + return; } + + messageBusConnection = project.getMessageBus().connect(); + messageBusConnection.subscribe(VirtualFileManager.VFS_CHANGES, new BulkFileListener() { + @Override + public void before(@NotNull List events) { + } + + @Override + public void after(@NotNull List events) { + for (VFileEvent event : events) { + if (event instanceof VFileDeleteEvent) { + synchronized (changedFiles) { + changedFiles.remove(event.getFile()); + } + } + } + } + }); + + EditorFactory.getInstance().getEventMulticaster().addDocumentListener(listener, project); } public void deactivate() { - if (listenerAttached) { - listenerAttached = false; + if (messageBusConnection == null) { + return; + } + + try { EditorFactory.getInstance().getEventMulticaster().removeDocumentListener(listener); } + finally { + messageBusConnection.disconnect(); + messageBusConnection = null; + } } private class MyDocumentAdapter extends DocumentAdapter { @@ -135,8 +145,8 @@ public class AutoExecutor implements Runnable { } } - alarm.cancelRequest(AutoExecutor.this); - alarm.addRequest(AutoExecutor.this, delay); + alarm.cancelRequest(DelayedDocumentWatcher.this); + alarm.addRequest(DelayedDocumentWatcher.this, delay); } } } \ No newline at end of file