package de.janthomae.leiningenplugin.project; import com.intellij.ProjectTopics; import com.intellij.openapi.project.Project; import com.intellij.openapi.roots.ModuleRootEvent; import com.intellij.openapi.roots.ModuleRootListener; import com.intellij.openapi.vfs.VirtualFileManager; import com.intellij.openapi.vfs.newvfs.BulkFileListener; import com.intellij.openapi.vfs.newvfs.events.VFileCreateEvent; import com.intellij.openapi.vfs.newvfs.events.VFileEvent; import com.intellij.util.messages.MessageBusConnection; import com.intellij.util.ui.update.MergingUpdateQueue; import de.janthomae.leiningenplugin.LeiningenConstants; import java.util.List; /** * @author <a href="janthomae@janthomae.de">Jan Thomä</a> * @version $Id:$ */ public class LeiningenProjectsManagerWatcher { private Project project; private final LeiningenProjectsManager manager; private MergingUpdateQueue myQueue; public LeiningenProjectsManagerWatcher(Project project, LeiningenProjectsManager manager) { this.project = project; this.manager = manager; myQueue = new MergingUpdateQueue(getClass() + ": Document changes queue", 1000, false, MergingUpdateQueue.ANY_COMPONENT); } public synchronized void start() { final MessageBusConnection myBusConnection = project.getMessageBus().connect(myQueue); myBusConnection.subscribe(VirtualFileManager.VFS_CHANGES, new BulkFileListener() { public void before(List<? extends VFileEvent> vFileEvents) { } public void after(List<? extends VFileEvent> vFileEvents) { for (VFileEvent vFileEvent : vFileEvents) { // if (vFileEvent instanceof VFileMoveEvent) { // if (isRelevant(vFileEvent.getPath())) { // LeiningenProject leiningenProject = manager.byPath(vFileEvent.getPath()); // if (leiningenProject != null) { // manager.removeLeiningenProject(leiningenProject); // } // // VirtualFile newProjectFile = ((VFileMoveEvent)vFileEvent).getNewParent().findFileByRelativePath(((VFileMoveEvent) vFileEvent).getFile().getName()); // if ( newProjectFile != null ) { // LeiningenProject newProject = new LeiningenProject(newProjectFile, theProject); // } // } // } // if (vFileEvent instanceof VFileDeleteEvent) { // if (isRelevant(vFileEvent.getPath())) { // LeiningenProject leiningenProject = manager.byPath(vFileEvent.getPath()); // if (leiningenProject != null) { // manager.removeLeiningenProject(leiningenProject); // } // } // } if (vFileEvent instanceof VFileCreateEvent) { if (isRelevant(vFileEvent.getPath())) { manager.importLeiningenProject( vFileEvent.getFileSystem().findFileByPath(vFileEvent.getPath()), project ); } } } } private boolean isRelevant(String path) { return path != null && path.endsWith(LeiningenConstants.PROJECT_CLJ); } }); myBusConnection.subscribe(ProjectTopics.PROJECT_ROOTS, new ModuleRootListener() { public void beforeRootsChange(ModuleRootEvent moduleRootEvent) { } public void rootsChanged(ModuleRootEvent moduleRootEvent) { } }); myQueue.activate(); } }