package ctagsinterface.projects; import java.util.Collection; import java.util.HashSet; import java.util.Iterator; import java.util.Set; import java.util.Vector; import javax.swing.JOptionPane; import org.gjt.sp.jedit.EditBus; import org.gjt.sp.jedit.View; import org.gjt.sp.jedit.jEdit; import org.gjt.sp.jedit.EditBus.EBHandler; import projectviewer.ProjectManager; import projectviewer.ProjectViewer; import projectviewer.event.ProjectUpdate; import projectviewer.event.StructureUpdate; import projectviewer.vpt.VPTFile; import projectviewer.vpt.VPTNode; import projectviewer.vpt.VPTProject; import ctagsinterface.index.TagIndex.OriginType; import ctagsinterface.main.CtagsInterfacePlugin; import ctagsinterface.main.Logger; import ctagsinterface.options.ProjectsOptionPane; public class ProjectWatcher { Set<String> watched; public ProjectWatcher() { watched = new HashSet<String>(); if (ProjectsOptionPane.getAutoUpdateProjects()) updateWatchers(); start(); } public void start() { EditBus.addToBus(this); } public void stop() { EditBus.removeFromBus(this); } public void updateWatchers() { Vector<String> projects = ProjectsOptionPane.getProjects(); Iterator<String> all = getProjects().iterator(); while (all.hasNext()) { String project = all.next(); if (projects.contains(project)) { if (! watched.contains(project)) { watchProject(project); watched.add(project); } } else if (watched.contains(project)) { unwatchProject(project); watched.remove(project); } } } public Vector<String> getFiles(String project) { ProjectManager pm = ProjectManager.getInstance(); VPTProject p = pm.getProject(project); if (p == null) return null; Vector<String> files = new Vector<String>(); Iterator<VPTNode> nodes = p.getOpenableNodes().iterator(); while (nodes.hasNext()) { VPTNode node = nodes.next(); files.add(node.getNodePath()); } return files; } public Vector<String> getProjects() { ProjectManager pm = ProjectManager.getInstance(); Vector<String> projects = new Vector<String>(); Iterator<VPTProject> it = pm.getProjects().iterator(); while (it.hasNext()) { VPTProject proj = it.next(); projects.add(proj.getName()); } return projects; } public String getActiveProject(View view) { VPTProject project = ProjectViewer.getActiveProject(view); if (project == null) return null; return project.getName(); } private void watchProject(String project) { VPTProject proj = ProjectManager.getInstance().getProject(project); if (proj == null) return; watched.add(project); } private void unwatchProject(String project) { VPTProject proj = ProjectManager.getInstance().getProject(project); if (proj == null) return; watched.remove(project); } // ProjectListener methods public void handleFilesChanged(ProjectUpdate pu) { Vector<String> removed = new Vector<String>(); Collection<VPTFile> nodes = pu.getRemovedFiles(); if (nodes != null) { for (VPTFile node: nodes) removed.add(node.getNodePath()); } Vector<String> added = new Vector<String>(); nodes = pu.getAddedFiles(); if (nodes != null) { for (VPTFile node: nodes) added.add(node.getNodePath()); } CtagsInterfacePlugin.updateProject(pu.getProject().getName(), added, removed); } public void handlePropertiesChanged(ProjectUpdate pu) { // TODO Auto-generated method stub } @EBHandler public void handleStructureUpdate(StructureUpdate su) { if (! ProjectsOptionPane.getTrackProjectList()) return; if (su.getType() == StructureUpdate.Type.PROJECT_ADDED) { String name = su.getNode().getName(); Logger logger = CtagsInterfacePlugin.getLogger(jEdit.getActiveView(), "project " + name); CtagsInterfacePlugin.insertOrigin(logger, OriginType.PROJECT, name); watched.add(name); } else if (su.getType() == StructureUpdate.Type.PROJECT_REMOVED) { Vector<String> projects = new Vector<String>(); CtagsInterfacePlugin.getIndex().getOrigins( OriginType.PROJECT, projects); String name = su.getNode().getName(); if (! projects.contains(name)) return; int res = JOptionPane.showConfirmDialog(jEdit.getActiveView(), "Remove tag index of project '" + name + "'?", "CtagsInterface plugin", JOptionPane.YES_NO_OPTION); if (res != JOptionPane.YES_OPTION) return; Logger logger = CtagsInterfacePlugin.getLogger(jEdit.getActiveView(), "project " + name); CtagsInterfacePlugin.deleteOrigin(logger, OriginType.PROJECT, name); watched.remove(name); } } @EBHandler public void handleProjectUpdate(ProjectUpdate pu) { String name = pu.getProject().getName(); if (! watched.contains(name)) return; if (pu.getType() == ProjectUpdate.Type.FILES_CHANGED) handleFilesChanged(pu); else if (pu.getType() == ProjectUpdate.Type.PROPERTIES_CHANGED) handlePropertiesChanged(pu); } }