// Copyright 2017 Pants project contributors (see CONTRIBUTORS.md).
// Licensed under the Apache License, Version 2.0 (see LICENSE).
package com.twitter.intellij.pants.ui;
import com.intellij.execution.filters.TextConsoleBuilderFactory;
import com.intellij.execution.ui.ConsoleView;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.util.Disposer;
import com.intellij.openapi.wm.ToolWindow;
import com.intellij.openapi.wm.ToolWindowAnchor;
import com.intellij.openapi.wm.ToolWindowManager;
import com.intellij.ui.content.Content;
import com.intellij.ui.content.ContentFactory;
import com.twitter.intellij.pants.util.PantsConstants;
import icons.PantsIcons;
import org.jetbrains.annotations.TestOnly;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
public class PantsConsoleManager {
private static ConcurrentHashMap<Project, ConsoleView> mapper = new ConcurrentHashMap<>();
public static void registerConsole(Project project) {
// Create the toolWindow
ToolWindow window =
ToolWindowManager.getInstance(project).registerToolWindow(
PantsConstants.PANTS_CONSOLE_NAME,
true,
ToolWindowAnchor.BOTTOM,
project,
true
);
window.setIcon(PantsIcons.Icon);
// Have the toolWindow contain the view panel.
PantsConsoleViewPanel pantsConsoleViewPanel = new PantsConsoleViewPanel(project);
final boolean isLockable = true;
final String displayName = "";
Content pantsConsoleContent = ContentFactory.SERVICE.getInstance().createContent(pantsConsoleViewPanel, displayName, isLockable);
window.getContentManager().addContent(pantsConsoleContent);
}
/**
* Creates a `ConsoleView` for the current project, and register it under `PantsConsole` tool window,
* or just retrieve one if there is already one registered.
*
* @param project current project
* @return Pants ConsoleView for the project
*/
public static ConsoleView getOrMakeNewConsole(Project project) {
ConsoleView console = mapper.get(project);
if (console != null) {
return console;
}
ConsoleView newConsole = TextConsoleBuilderFactory.getInstance().createBuilder(project).getConsole();
mapper.put(project, newConsole);
Disposer.register(project, newConsole);
return newConsole;
}
/**
* Close the console for a project.
*
* @param project current project
*/
public static void unregisterConsole(Project project) {
mapper.remove(project);
}
/**
* TestOnly because some test library is not tearing down properly.
*/
@TestOnly
public static void disposeAll() {
for (Map.Entry<Project, ConsoleView> entrySet : mapper.entrySet()) {
entrySet.getValue().dispose();
}
}
}