package com.google.jstestdriver.idea.execution.settings.ui; import com.google.jstestdriver.idea.execution.settings.JstdRunSettings; import com.google.jstestdriver.idea.execution.settings.ServerType; import com.google.jstestdriver.idea.server.JstdServerFetchResult; import com.google.jstestdriver.idea.server.JstdServerInfo; import com.google.jstestdriver.idea.server.JstdServerUtils; import com.google.jstestdriver.idea.ui.ToolPanel; import com.google.jstestdriver.idea.util.ObjectUtils; import com.google.jstestdriver.idea.util.SwingUtils; import com.google.jstestdriver.idea.util.TextChangeListener; import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.application.ModalityState; import com.intellij.openapi.util.text.StringUtil; import com.intellij.util.Consumer; import org.jetbrains.annotations.NotNull; import javax.swing.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; class ServerConfigurationForm extends AbstractRunSettingsSection { private JPanel myRootComponent; private JRadioButton myRunningInIDERadioButton; private JRadioButton myAtAddressRadioButton; private JTextField myServerAddress; private JButton myTestConnectionButton; private JLabel myTestConnectionResult; public ServerConfigurationForm() { myRunningInIDERadioButton.addActionListener(createSwitchServerTypeAction(ServerType.INTERNAL)); myAtAddressRadioButton.addActionListener(createSwitchServerTypeAction(ServerType.EXTERNAL)); myTestConnectionResult.setText(""); myTestConnectionButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { String serverUrl = myAtAddressRadioButton.isSelected() ? myServerAddress.getText() : "http://localhost:" + ToolPanel.serverPort; myTestConnectionButton.setEnabled(false); myTestConnectionResult.setText("Connecting to " + serverUrl + " ..."); final ModalityState currentModalityState = ModalityState.current(); JstdServerUtils.asyncFetchServerInfo(serverUrl, new Consumer<JstdServerFetchResult>() { @Override public void consume(final JstdServerFetchResult serverFetchResult) { ApplicationManager.getApplication().invokeLater(new Runnable() { @Override public void run() { StringBuilder str = new StringBuilder("<html>"); if (serverFetchResult.isError()) { str.append(buildErrorTextParagraph(serverFetchResult.getErrorMessage())); } else { JstdServerInfo serverInfo = serverFetchResult.getServerInfo(); int capturedBrowsers = serverInfo.getCapturedBrowsers().size(); final String browserMessage; if (capturedBrowsers == 0) { browserMessage = "no captured browsers"; } else if (capturedBrowsers == 1) { browserMessage = "1 captured browser"; } else { browserMessage = capturedBrowsers + " captured browsers"; } str.append(buildOKTextParagraph("Connection to " + serverInfo.getServerUrl() + " is OK, " + browserMessage)); } str.append("</html>"); myTestConnectionResult.setText(str.toString()); myTestConnectionButton.setEnabled(true); } }, currentModalityState); } }); } }); SwingUtils.addTextChangeListener(myServerAddress, new TextChangeListener() { @Override public void textChanged(String oldText, @NotNull String newText) { myTestConnectionResult.setText(""); } }); } private String buildTextParagraph(String color, String text) { return "<p style='color:" + StringUtil.escapeXml(color) + "'>" + StringUtil.escapeXml(text) + "</p>"; } private String buildErrorTextParagraph(String text) { return buildTextParagraph("red", text); } private String buildOKTextParagraph(String text) { return buildTextParagraph("green", text); } private ActionListener createSwitchServerTypeAction(final ServerType serverType) { return new ActionListener() { @Override public void actionPerformed(ActionEvent e) { myTestConnectionResult.setText(""); selectServerType(serverType); } }; } private void selectServerType(ServerType serverType) { myServerAddress.setEnabled(serverType == ServerType.EXTERNAL); myAtAddressRadioButton.setSelected(serverType == ServerType.EXTERNAL); } @NotNull @Override protected JComponent createComponent(@NotNull CreationContext creationContext) { return myRootComponent; } @Override public void resetFrom(JstdRunSettings runSettings) { selectServerType(runSettings.getServerType()); if (runSettings.isExternalServerType()) { myServerAddress.setText(runSettings.getServerAddress()); } } @Override public void applyTo(JstdRunSettings.Builder runSettingsBuilder) { if (myAtAddressRadioButton.isSelected()) { runSettingsBuilder.setServerType(ServerType.EXTERNAL); runSettingsBuilder.setServerAddress(ObjectUtils.notNull(myServerAddress.getText(), "")); } else { runSettingsBuilder.setServerType(ServerType.INTERNAL); } } }