package com.intellij.remoteServer.impl.configuration; import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.options.ConfigurationException; import com.intellij.openapi.options.UnnamedConfigurable; import com.intellij.openapi.progress.ProgressIndicator; import com.intellij.openapi.progress.Task; import com.intellij.openapi.ui.Messages; import com.intellij.openapi.ui.NamedConfigurable; import com.intellij.remoteServer.configuration.RemoteServer; import com.intellij.remoteServer.configuration.ServerConfiguration; import com.intellij.remoteServer.runtime.ConnectionStatus; import com.intellij.remoteServer.runtime.ServerConnection; import com.intellij.remoteServer.runtime.ServerConnectionManager; import com.intellij.util.concurrency.Semaphore; import com.intellij.util.ui.JBUI; import org.jetbrains.annotations.Nls; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import javax.swing.*; import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.util.concurrent.atomic.AtomicReference; /** * @author nik */ public class RemoteServerConfigurable extends NamedConfigurable<RemoteServer<?>> { private final UnnamedConfigurable myConfigurable; private final RemoteServer<?> myServer; private String myServerName; private boolean myNew; private JPanel myMainPanel; private JPanel mySettingsPanel; private JButton myTestConnectionButton; public <C extends ServerConfiguration> RemoteServerConfigurable(RemoteServer<C> server, Runnable treeUpdater, boolean isNew) { super(true, treeUpdater); myServer = server; myNew = isNew; myServerName = myServer.getName(); C c = server.getConfiguration(); myConfigurable = server.getType().createConfigurable(c); } @Override public RemoteServer<?> getEditableObject() { return myServer; } @Override public String getBannerSlogan() { return myServer.getName(); } @Override public JComponent createOptionsPanel() { mySettingsPanel.add(BorderLayout.CENTER, myConfigurable.createComponent()); myTestConnectionButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { try { myConfigurable.apply(); } catch (ConfigurationException exc) { Messages.showErrorDialog(myMainPanel, "Cannot test connection: " + exc.getMessage(), exc.getTitle()); return; } testConnection(); } }); myMainPanel.setBorder(JBUI.Borders.empty(0, 10, 0, 10)); return myMainPanel; } private void testConnection() { final ServerConnection connection = ServerConnectionManager.getInstance().getOrCreateConnection(myServer); final AtomicReference<Runnable> showResultRef = new AtomicReference<Runnable>(null); new Task.Modal(null, "Connecting...", true) { @Override public void run(@NotNull ProgressIndicator indicator) { indicator.setIndeterminate(true); final Semaphore semaphore = new Semaphore(); semaphore.down(); connection.connect(new Runnable() { @Override public void run() { showResultRef.set(new Runnable() { @Override public void run() { if (connection.getStatus() == ConnectionStatus.CONNECTED) { Messages.showInfoMessage(myMainPanel, "Connection successful", "Test Connection"); } else if (connection.getStatus() == ConnectionStatus.DISCONNECTED) { Messages.showErrorDialog(myMainPanel, "Cannot connect: " + connection.getStatusText(), "Test Connection"); } } }); semaphore.up(); } }); while (!indicator.isCanceled()) { if (semaphore.waitFor(500)) { break; } } Runnable showResult = showResultRef.get(); if (showResult != null) { ApplicationManager.getApplication().invokeLater(showResult); } } }.queue(); } @Nls @Override public String getDisplayName() { return myServerName; } @Nullable @Override public String getHelpTopic() { return null; } @Override public void setDisplayName(String name) { myServerName = name; } @Override public boolean isModified() { return myNew || myConfigurable.isModified() || !myServerName.equals(myServer.getName()); } @Override public void apply() throws ConfigurationException { myConfigurable.apply(); myNew = false; } @Override public void reset() { myConfigurable.reset(); } @Override public void disposeUIResources() { myConfigurable.disposeUIResources(); } @Nullable @Override public Icon getIcon(boolean expanded) { return myServer.getType().getIcon(); } }