package zielu.gittoolbox.ui.projectView;
import com.intellij.ide.projectView.ProjectView;
import com.intellij.openapi.Disposable;
import com.intellij.openapi.project.Project;
import com.intellij.util.messages.MessageBusConnection;
import git4idea.repo.GitRepository;
import java.util.concurrent.atomic.AtomicBoolean;
import org.jetbrains.annotations.NotNull;
import zielu.gittoolbox.ConfigNotifier;
import zielu.gittoolbox.GitToolBoxConfig;
import zielu.gittoolbox.ProjectAware;
import zielu.gittoolbox.cache.PerRepoInfoCache;
import zielu.gittoolbox.cache.PerRepoStatusCacheListener;
import zielu.gittoolbox.cache.RepoInfo;
import zielu.gittoolbox.ui.util.AppUtil;
public class ProjectViewManager implements Disposable, ProjectAware {
private final AtomicBoolean opened = new AtomicBoolean();
private final Project myProject;
private final MessageBusConnection myConnection;
private ProjectViewManager(Project project) {
this.myProject = project;
myConnection = myProject.getMessageBus().connect();
myConnection.subscribe(ConfigNotifier.CONFIG_TOPIC, new ConfigNotifier.Adapter() {
@Override
public void configChanged(GitToolBoxConfig config) {
refreshProjectView();
}
});
myConnection.subscribe(PerRepoInfoCache.CACHE_CHANGE, new PerRepoStatusCacheListener() {
@Override
public void stateChanged(@NotNull final RepoInfo info,
@NotNull final GitRepository repository) {
refreshProjectView();
}
});
}
private void refreshProjectView() {
if (opened.get()) {
AppUtil.invokeLaterIfNeeded(() -> {
if (opened.get()) {
ProjectView.getInstance(myProject).refresh();
}
});
}
}
public static ProjectViewManager create(Project project) {
return new ProjectViewManager(project);
}
@Override
public void opened() {
opened.compareAndSet(false, true);
}
@Override
public void closed() {
opened.compareAndSet(true, false);
}
@Override
public void dispose() {
myConnection.disconnect();
}
}