package zielu.gittoolbox.ui.projectView;
import com.intellij.dvcs.repo.Repository;
import com.intellij.dvcs.repo.VcsRepositoryManager;
import com.intellij.ide.projectView.PresentationData;
import com.intellij.ide.projectView.ProjectViewNode;
import com.intellij.ide.projectView.ProjectViewNodeDecorator;
import com.intellij.ide.projectView.impl.ProjectRootsUtil;
import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.packageDependencies.ui.PackageDependenciesNode;
import com.intellij.ui.ColoredTreeCellRenderer;
import git4idea.GitVcs;
import git4idea.repo.GitRepository;
import org.jetbrains.annotations.Nullable;
import zielu.gittoolbox.GitToolBoxConfig;
import zielu.gittoolbox.GitToolBoxProject;
import zielu.gittoolbox.cache.PerRepoInfoCache;
import zielu.gittoolbox.status.GitAheadBehindCount;
import zielu.gittoolbox.util.LogWatch;
public class ProjectViewDecorator implements ProjectViewNodeDecorator {
private final Logger LOG = Logger.getInstance(getClass());
private final NodeDecorationFactory decorationFactory = NodeDecorationFactory.getInstance();
private boolean isModuleNode(ProjectViewNode node) {
LogWatch moduleCheckWatch = LogWatch.createStarted(LOG, "Module check");
VirtualFile file = node.getVirtualFile();
Project project = node.getProject();
boolean isModule = file != null && project != null
&& file.isDirectory() && ProjectRootsUtil.isModuleContentRoot(file, project);
moduleCheckWatch.elapsed("[", node.getName(), "]").finish();
return isModule;
}
@Override
public void decorate(ProjectViewNode projectViewNode, PresentationData presentation) {
LogWatch decorateWatch = LogWatch.createStarted(LOG, "Decorate");
GitToolBoxConfig config = GitToolBoxConfig.getInstance();
if (config.showProjectViewStatus && isModuleNode(projectViewNode)) {
Project project = projectViewNode.getProject();
VirtualFile file = projectViewNode.getVirtualFile();
if (project != null && file != null) {
GitRepository repo = getRepoForFile(project, file);
decorateWatch.elapsed("Repo find", file);
if (repo != null) {
applyDecoration(project, repo, projectViewNode, presentation);
decorateWatch.elapsed("Decoration ", "[", projectViewNode.getName() + "]");
} else {
if (LOG.isDebugEnabled()) {
LOG.debug("No git repo for: " + file);
}
}
}
}
decorateWatch.finish();
}
@Nullable
private GitRepository getRepoForFile(Project project, VirtualFile file) {
VcsRepositoryManager repoManager = VcsRepositoryManager.getInstance(project);
Repository repo = repoManager.getRepositoryForFile(file, true);
if (repo != null && GitVcs.NAME.equals(repo.getVcs().getName())) {
return (GitRepository) repo;
}
return null;
}
private void applyDecoration(Project project, GitRepository repo, ProjectViewNode projectViewNode, PresentationData presentation) {
final LogWatch decorateApplyWatch = LogWatch.createStarted(LOG, "Decorate apply");
PerRepoInfoCache cache = GitToolBoxProject.getInstance(project).perRepoStatusCache();
GitAheadBehindCount countOptional = cache.getInfo(repo).count;
NodeDecoration decoration = decorationFactory.decorationFor(repo, countOptional);
boolean applied = decoration.apply(projectViewNode, presentation);
decorateApplyWatch.elapsed("for ", repo).finish();
presentation.setChanged(applied);
}
@Override
public void decorate(PackageDependenciesNode packageDependenciesNode, ColoredTreeCellRenderer coloredTreeCellRenderer) {
if (LOG.isDebugEnabled()) {
LOG.debug("Decorate package dependencies");
}
}
}