package de.janthomae.leiningenplugin.project;
import com.intellij.openapi.components.PersistentStateComponent;
import com.intellij.openapi.components.State;
import com.intellij.openapi.components.Storage;
import com.intellij.openapi.module.Module;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.openapi.vfs.VirtualFileManager;
import de.janthomae.leiningenplugin.LeiningenConstants;
import de.janthomae.leiningenplugin.LeiningenUtil;
import de.janthomae.leiningenplugin.SimpleProjectComponent;
import java.util.ArrayList;
import java.util.List;
/**
* @author <a href="janthomae@janthomae.de">Jan Thomä</a>
* @version $Id:$
*/
@State(name = "LeiningenProjectsManager", storages = {@Storage(id = "default", file = "$PROJECT_FILE$")})
public class LeiningenProjectsManager extends SimpleProjectComponent implements PersistentStateComponent<LeiningenProjectsManagerState> {
private List<LeiningenProject> leiningenProjects = new ArrayList<LeiningenProject>();
private LeiningenProjectsManagerWatcher watcher;
private List<LeiningenProjectsManagerListener> listeners = new ArrayList<LeiningenProjectsManagerListener>();
public static LeiningenProjectsManager getInstance(Project p) {
return p.getComponent(LeiningenProjectsManager.class);
}
/**
* Determine if this file is a leiningen project file.
*
* @param file The virtual file.
* @return True if it is a leiningen project file.
*/
public static boolean isProjectFile(VirtualFile file) {
return file != null && !file.isDirectory() && file.exists() &&
file.getName().equals(LeiningenConstants.PROJECT_CLJ);
}
protected LeiningenProjectsManager(Project project) {
super(project);
}
@Override
public void initComponent() {
LeiningenUtil.runWhenInitialized(myProject, new Runnable() {
public void run() {
watcher = new LeiningenProjectsManagerWatcher(myProject, LeiningenProjectsManager.this);
watcher.start();
}
});
}
public void addProjectsManagerListener(LeiningenProjectsManagerListener listener) {
listeners.add(listener);
}
public LeiningenProject byPath(String path) {
for (LeiningenProject leiningenProject : leiningenProjects) {
if (leiningenProject.getVirtualFile().getPath().equals(path)) {
return leiningenProject;
}
}
return null;
}
public boolean hasProjects() {
return !leiningenProjects.isEmpty();
}
public List<Module> importLeiningenProject(VirtualFile projectFile, Project project) {
List<Module> result = new ArrayList<Module>();
LeiningenProject leiningenProject = null;
try {
leiningenProject = LeiningenProject.create(projectFile);
/** Side effect - adds to the project's module list */
leiningenProject.reimport(project);
if ( !hasProject( leiningenProject) ) {
addLeiningenProject(leiningenProject);
}
} catch (LeiningenProjectException e) {
// Just do nothing for now
}
return result;
}
public boolean hasProject(LeiningenProject project) {
return leiningenProjects.contains(project);
}
private void addLeiningenProject(LeiningenProject leiningenProject) {
leiningenProjects.add(leiningenProject);
notifyListeners();
}
/**
* Determine if file represents a leiningen project that we're already managing.
*
* @param file The virtual file to check.
* @return true if we're managing this file already, false if not.
*/
public boolean isManagedFile(VirtualFile file) {
for (LeiningenProject myLeiningenProject : leiningenProjects) {
if (myLeiningenProject.getVirtualFile().equals(file)) {
return true;
}
}
return false;
}
public void removeProjectsManagerListener(LeiningenProjectsManagerListener listener) {
listeners.remove(listener);
}
public List<LeiningenProject> getLeiningenProjects() {
return leiningenProjects;
}
// private void findProjectFiles() {
// leiningenProjects.clear();
// VirtualFile projectFile = myProject.getBaseDir().findChild(LeiningenConstants.PROJECT_CLJ);
// if (projectFile != null) {
// addLeiningenProject(new LeiningenProject(projectFile, myProject));
// }
// }
private void removeLeiningenProject(LeiningenProject leiningenProject) {
leiningenProjects.remove(leiningenProject);
notifyListeners();
}
private void notifyListeners() {
for (LeiningenProjectsManagerListener listener : listeners) {
listener.projectsChanged();
}
}
public LeiningenProjectsManagerState getState() {
LeiningenProjectsManagerState state = new LeiningenProjectsManagerState();
for (LeiningenProject leiningenProject : leiningenProjects) {
state.projectFiles.add(leiningenProject.getVirtualFile().getUrl());
}
return state;
}
public void loadState(LeiningenProjectsManagerState leiningenProjectsManagerState) {
final List<LeiningenProject> result = new ArrayList<LeiningenProject>();
for (String projectFile : leiningenProjectsManagerState.projectFiles) {
VirtualFile vf = VirtualFileManager.getInstance().findFileByUrl(projectFile);
if ( vf != null ) {
LeiningenProject forReimport = LeiningenProject.create(vf);
result.add(forReimport);
}
}
LeiningenUtil.runWhenInitialized(myProject, new Runnable() {
public void run() {
for (LeiningenProject leiningenProject : result) {
try {
leiningenProject.reimport(myProject);
} catch (LeiningenProjectException e) {
// Do nothing for now
}
addLeiningenProject(leiningenProject);
}
}
});
}
}