package com.google.jstestdriver.idea.server.ui;
import com.google.jstestdriver.idea.server.JstdServer;
import com.google.jstestdriver.idea.server.JstdServerLifeCycleAdapter;
import com.google.jstestdriver.idea.server.JstdServerRegistry;
import com.google.jstestdriver.idea.server.JstdServerSettings;
import com.intellij.ide.browsers.BrowserSettings;
import com.intellij.openapi.actionSystem.*;
import com.intellij.openapi.application.ApplicationManager;
import com.intellij.openapi.options.ShowSettingsUtil;
import com.intellij.openapi.project.Project;
import com.intellij.ui.IdeBorderFactory;
import com.intellij.ui.JBColor;
import com.intellij.ui.TabbedPaneWrapper;
import com.intellij.ui.border.CustomLineBorder;
import com.intellij.ui.tabs.TabInfo;
import com.intellij.util.PlatformIcons;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.concurrency.Promise;
import javax.swing.*;
import java.awt.*;
public class JstdToolWindowSession {
private final Project myProject;
private final ActionToolbar myToolbar;
private final TabbedPaneWrapper myTabs;
private final JPanel myRootPanel;
private final JstdServerSettingsTab mySettingsTab;
private JstdServerConsoleTab myConsoleTab;
public JstdToolWindowSession(@NotNull Project project) {
myProject = project;
myToolbar = createActionToolbar();
myTabs = new TabbedPaneWrapper(myProject);
myTabs.getComponent().setBorder(IdeBorderFactory.createEmptyBorder(0, 2, 0, 0));
mySettingsTab = new JstdServerSettingsTab(myProject);
addTab(mySettingsTab.getTabInfo());
JstdServer server = JstdServerRegistry.getInstance().getServer();
if (server != null && server.isProcessRunning()) {
attachToServer(server);
}
myRootPanel = new JPanel(new BorderLayout(0, 0));
myToolbar.getComponent().setBorder(new CustomLineBorder(JBColor.border(), 0, 0, 0, 1));
myRootPanel.add(myToolbar.getComponent(), BorderLayout.WEST);
myRootPanel.add(myTabs.getComponent(), BorderLayout.CENTER);
}
private void addTab(@NotNull TabInfo tabInfo) {
myTabs.addTab(tabInfo.getText(), tabInfo.getComponent());
}
@NotNull
public JComponent getComponent() {
return myRootPanel;
}
@NotNull
private ActionToolbar createActionToolbar() {
DefaultActionGroup actionGroup = new DefaultActionGroup();
actionGroup.add(new JstdServerRestartAction(this));
actionGroup.add(new JstdServerStopAction());
actionGroup.add(new AnAction("Configure paths to local web browsers", null, PlatformIcons.WEB_ICON) {
@Override
public void actionPerformed(AnActionEvent e) {
ShowSettingsUtil settingsUtil = ShowSettingsUtil.getInstance();
settingsUtil.editConfigurable(e.getProject(), new BrowserSettings());
}
});
return ActionManager.getInstance().createActionToolbar(ActionPlaces.UNKNOWN, actionGroup, false);
}
@NotNull
public Project getProject() {
return myProject;
}
public void saveSettings() {
mySettingsTab.saveSettings();
}
@NotNull
private JstdServerConsoleTab getOrRegisterConsoleContent() {
if (myConsoleTab == null) {
myConsoleTab = new JstdServerConsoleTab(myProject, myProject);
addTab(myConsoleTab.getTabInfo());
}
return myConsoleTab;
}
private void attachToServer(@NotNull JstdServer server) {
ApplicationManager.getApplication().assertIsDispatchThread();
myToolbar.updateActionsImmediately();
server.addLifeCycleListener(new JstdServerLifeCycleAdapter() {
@Override
public void onServerStopped() {
myToolbar.updateActionsImmediately();
}
}, myProject);
JstdServerConsoleTab consoleTab = getOrRegisterConsoleContent();
consoleTab.attachToServer(server);
myTabs.setSelectedTitle(consoleTab.getTabInfo().getText());
}
private void showServerStartupError(@NotNull Throwable error) {
JstdServerConsoleTab consoleView = getOrRegisterConsoleContent();
consoleView.showServerStartupError(error);
}
@NotNull
public Promise<JstdServer> restart(@NotNull JstdServerSettings settings) {
return JstdServerRegistry.getInstance().restartServer(settings)
.rejected(this::showServerStartupError)
.then(server -> {
attachToServer(server);
return server;
});
}
}