package zielu.gittoolbox.ui.statusBar;
import com.intellij.openapi.Disposable;
import com.intellij.openapi.application.ApplicationManager;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.wm.StatusBar;
import com.intellij.openapi.wm.WindowManager;
import com.intellij.util.messages.MessageBusConnection;
import java.util.concurrent.atomic.AtomicBoolean;
import javax.swing.SwingUtilities;
import org.jetbrains.annotations.NotNull;
import zielu.gittoolbox.ConfigNotifier;
import zielu.gittoolbox.GitToolBoxConfig;
import zielu.gittoolbox.ProjectAware;
public class StatusBarManager implements Disposable, ProjectAware {
private final AtomicBoolean opened = new AtomicBoolean();
private final Project myProject;
private final MessageBusConnection myConnection;
private GitStatusWidget myStatusWidget;
private StatusBarManager(Project project) {
myProject = project;
myConnection = myProject.getMessageBus().connect();
myConnection.subscribe(ConfigNotifier.CONFIG_TOPIC, new ConfigNotifier.Adapter() {
@Override
public void configChanged(GitToolBoxConfig config) {
final boolean showStatusWidget = config.showStatusWidget;
SwingUtilities.invokeLater(() -> {
if (opened.get()) {
myStatusWidget.setVisible(showStatusWidget);
}
});
}
});
}
public static StatusBarManager create(@NotNull Project project) {
return new StatusBarManager(project);
}
private void install() {
StatusBar statusBar = WindowManager.getInstance().getStatusBar(myProject);
if (statusBar != null) {
statusBar.addWidget(myStatusWidget, myProject);
myStatusWidget.installed();
}
}
private void uninstall() {
StatusBar statusBar = WindowManager.getInstance().getStatusBar(myProject);
if (statusBar != null) {
statusBar.removeWidget(myStatusWidget.ID());
myStatusWidget.uninstalled();
}
}
@Override
public void opened() {
if (opened.compareAndSet(false, true)) {
if (!ApplicationManager.getApplication().isHeadlessEnvironment()) {
myStatusWidget = GitStatusWidget.create(myProject);
install();
myStatusWidget.setVisible(GitToolBoxConfig.getInstance().showStatusWidget);
}
}
}
@Override
public void closed() {
opened.compareAndSet(true, false);
}
@Override
public void dispose() {
if (!ApplicationManager.getApplication().isHeadlessEnvironment()) {
if (myStatusWidget != null) {
uninstall();
myStatusWidget = null;
}
}
myConnection.disconnect();
}
}