summaryrefslogtreecommitdiff
path: root/platform/remote-servers/impl/src/com/intellij/remoteServer/util/CloudAccountSelectionEditor.java
diff options
context:
space:
mode:
Diffstat (limited to 'platform/remote-servers/impl/src/com/intellij/remoteServer/util/CloudAccountSelectionEditor.java')
-rw-r--r--platform/remote-servers/impl/src/com/intellij/remoteServer/util/CloudAccountSelectionEditor.java304
1 files changed, 160 insertions, 144 deletions
diff --git a/platform/remote-servers/impl/src/com/intellij/remoteServer/util/CloudAccountSelectionEditor.java b/platform/remote-servers/impl/src/com/intellij/remoteServer/util/CloudAccountSelectionEditor.java
index 7bd38b481cbb..fa4355eb356c 100644
--- a/platform/remote-servers/impl/src/com/intellij/remoteServer/util/CloudAccountSelectionEditor.java
+++ b/platform/remote-servers/impl/src/com/intellij/remoteServer/util/CloudAccountSelectionEditor.java
@@ -18,133 +18,164 @@ package com.intellij.remoteServer.util;
import com.intellij.execution.RunManagerEx;
import com.intellij.execution.RunnerAndConfigurationSettings;
import com.intellij.execution.configurations.ConfigurationType;
-import com.intellij.openapi.Disposable;
-import com.intellij.openapi.diagnostic.Logger;
+import com.intellij.ide.DataManager;
+import com.intellij.ide.actions.ShowSettingsUtilImpl;
+import com.intellij.ide.util.projectWizard.WizardContext;
+import com.intellij.openapi.actionSystem.AnAction;
+import com.intellij.openapi.actionSystem.AnActionEvent;
+import com.intellij.openapi.actionSystem.DefaultActionGroup;
import com.intellij.openapi.module.Module;
import com.intellij.openapi.module.ModulePointer;
import com.intellij.openapi.module.ModulePointerManager;
import com.intellij.openapi.options.ConfigurationException;
+import com.intellij.openapi.options.ex.SingleConfigurableEditor;
import com.intellij.openapi.project.Project;
+import com.intellij.openapi.ui.ComboBox;
+import com.intellij.openapi.ui.popup.JBPopupFactory;
import com.intellij.openapi.util.Condition;
-import com.intellij.openapi.util.Disposer;
+import com.intellij.openapi.util.Key;
+import com.intellij.openapi.util.Ref;
import com.intellij.remoteServer.ServerType;
import com.intellij.remoteServer.configuration.RemoteServer;
import com.intellij.remoteServer.configuration.RemoteServersManager;
+import com.intellij.remoteServer.configuration.ServerConfiguration;
+import com.intellij.remoteServer.configuration.deployment.DeploymentConfiguration;
import com.intellij.remoteServer.impl.configuration.RemoteServerConfigurable;
import com.intellij.remoteServer.impl.configuration.deployment.DeployToServerConfigurationType;
import com.intellij.remoteServer.impl.configuration.deployment.DeployToServerRunConfiguration;
import com.intellij.remoteServer.impl.configuration.deployment.ModuleDeploymentSourceImpl;
+import com.intellij.util.Consumer;
+import com.intellij.util.containers.ContainerUtil;
+import com.intellij.util.containers.hash.HashMap;
import com.intellij.util.text.UniqueNameGenerator;
+import org.jetbrains.annotations.Nullable;
import javax.swing.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
+import java.util.List;
+import java.util.Map;
-/**
- * @author michael.golubev
- */
-public class CloudAccountSelectionEditor<SC extends CloudConfigurationBase,
- DC extends CloudDeploymentNameConfiguration,
- ST extends ServerType<SC>> implements Disposable {
- private static final Logger LOG = Logger.getInstance("#" + CloudAccountSelectionEditor.class.getName());
+public class CloudAccountSelectionEditor {
- private JComboBox myServerComboBox;
- private JPanel myServerConfigurablePanel;
- private JPanel myMainPanel;
+ private static final Map<ServerType<?>, Key<RemoteServer<?>>> ourCloudType2AccountKey
+ = new HashMap<ServerType<?>, Key<RemoteServer<?>>>();
- private final ST myCloudType;
- private RemoteServer<SC> myNewServer;
- private RemoteServerConfigurable myServerConfigurable;
+ private JButton myNewButton;
+ private ComboBox myAccountComboBox;
+ private JPanel myMainPanel;
+ private final List<ServerType<?>> myCloudTypes;
- private DelayedRunner myRunner;
+ private Runnable myServerSelectionListener;
- private CloudDataLoader myDataLoader = CloudDataLoader.NULL;
+ public CloudAccountSelectionEditor(List<ServerType<?>> cloudTypes) {
+ myCloudTypes = cloudTypes;
- public CloudAccountSelectionEditor(ST cloudType) {
- myCloudType = cloudType;
- }
+ for (ServerType<?> cloudType : cloudTypes) {
+ for (RemoteServer<?> account : RemoteServersManager.getInstance().getServers(cloudType)) {
+ myAccountComboBox.addItem(new AccountItem(account));
+ }
+ }
- private void createUIComponents() {
- myServerConfigurablePanel = createServerConfigurablePanel();
- myServerConfigurablePanel.setVisible(false);
- }
+ myNewButton.addActionListener(new ActionListener() {
- public void initUI() {
- myServerComboBox.addActionListener(new ActionListener() {
+ @Override
+ public void actionPerformed(ActionEvent e) {
+ onNewButton();
+ }
+ });
+
+ myAccountComboBox.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
- onAccountSelectionChanged();
+ if (myServerSelectionListener != null) {
+ myServerSelectionListener.run();
+ }
}
});
+ }
- for (RemoteServer<SC> server : RemoteServersManager.getInstance().getServers(myCloudType)) {
- myServerComboBox.addItem(new ServerItem(server));
+ public void setAccountSelectionListener(Runnable listener) {
+ myServerSelectionListener = listener;
+ }
+
+ private void onNewButton() {
+ if (myCloudTypes.size() == 1) {
+ createAccount(ContainerUtil.getFirstItem(myCloudTypes));
+ return;
}
- myServerComboBox.addItem(new ServerItem(myNewServer));
- myRunner= new DelayedRunner(myMainPanel) {
+ DefaultActionGroup group = new DefaultActionGroup();
+ for (final ServerType<?> cloudType : myCloudTypes) {
+ group.add(new AnAction(cloudType.getPresentableName(), cloudType.getPresentableName(), cloudType.getIcon()) {
- private ServerItem myPreviousServerItem;
+ @Override
+ public void actionPerformed(AnActionEvent e) {
+ createAccount(cloudType);
+ }
+ });
+ }
+ JBPopupFactory.getInstance().createActionGroupPopup("New Account", group, DataManager.getInstance().getDataContext(myMainPanel),
+ JBPopupFactory.ActionSelectionAid.SPEEDSEARCH, false)
+ .showUnderneathOf(myNewButton);
+ }
+
+ private void createAccount(ServerType<?> cloudType) {
+ RemoteServer<?> newAccount = RemoteServersManager.getInstance().createServer(cloudType, generateServerName(cloudType));
+
+ final Ref<Consumer<String>> errorConsumerRef = new Ref<Consumer<String>>();
+
+ RemoteServerConfigurable configurable = new RemoteServerConfigurable(newAccount, null, true) {
@Override
- protected boolean wasChanged() {
- ServerItem currentServerItem = getSelectedServerItem();
- boolean result = myPreviousServerItem != currentServerItem;
- if (result) {
- myPreviousServerItem = currentServerItem;
- myDataLoader.clearCloudData();
- }
- return result;
+ protected void setConnectionStatusText(boolean error, String text) {
+ super.setConnectionStatusText(error, error ? "" : text);
+ errorConsumerRef.get().consume(error ? text : null);
}
+ };
- @Override
- protected void run() {
- if (getSelectedServerItem().isNew()) {
- myServerConfigurable.setDataLoader(new CloudDataLoader() {
-
- @Override
- public void clearCloudData() {
- if (getSelectedServerItem().isNew()) {
- myDataLoader.clearCloudData();
- }
- }
-
- @Override
- public void loadCloudData() {
- if (getSelectedServerItem().isNew()) {
- myDataLoader.loadCloudData();
- }
- }
- });
- }
- else {
- myDataLoader.loadCloudData();
- }
+ final SingleConfigurableEditor configurableEditor
+ = new SingleConfigurableEditor(myMainPanel, configurable, ShowSettingsUtilImpl.createDimensionKey(configurable), false) {
+
+ {
+ errorConsumerRef.set(new Consumer<String>() {
+
+ @Override
+ public void consume(String s) {
+ setErrorText(s);
+ }
+ });
}
};
- }
- public void setDataLoader(CloudDataLoader dataLoader) {
- myDataLoader = dataLoader;
+ if (!configurableEditor.showAndGet()) {
+ return;
+ }
+
+ newAccount.setName(configurable.getDisplayName());
+
+ RemoteServersManager.getInstance().addServer(newAccount);
+ AccountItem newAccountItem = new AccountItem(newAccount);
+ myAccountComboBox.addItem(newAccountItem);
+ myAccountComboBox.setSelectedItem(newAccountItem);
}
- private void onAccountSelectionChanged() {
- myServerConfigurablePanel.setVisible(getSelectedServerItem().isNew());
+ public JComponent getMainPanel() {
+ return myMainPanel;
}
- protected JPanel createServerConfigurablePanel() {
- myNewServer = RemoteServersManager.getInstance().createServer(myCloudType, generateServerName());
- myServerConfigurable = new RemoteServerConfigurable(myNewServer, null, true);
- myServerConfigurablePanel = (JPanel)myServerConfigurable.createComponent();
- return myServerConfigurablePanel;
+ @Nullable
+ public RemoteServer<?> getSelectedAccount() {
+ AccountItem selectedItem = (AccountItem)myAccountComboBox.getSelectedItem();
+ return selectedItem == null ? null : selectedItem.getAccount();
}
- private String generateServerName() {
- return UniqueNameGenerator.generateUniqueName(myCloudType.getPresentableName(), new Condition<String>() {
+ private static String generateServerName(ServerType<?> cloudType) {
+ return UniqueNameGenerator.generateUniqueName(cloudType.getPresentableName(), new Condition<String>() {
@Override
public boolean value(String s) {
@@ -158,30 +189,60 @@ public class CloudAccountSelectionEditor<SC extends CloudConfigurationBase,
});
}
- public DeployToServerRunConfiguration<SC, DC> createRunConfiguration(Module module, DC deploymentConfiguration) {
- Project project = module.getProject();
+ public void validate() throws ConfigurationException {
+ if (getSelectedAccount() == null) {
+ throw new ConfigurationException("Account required");
+ }
+ }
- RemoteServer<SC> server = getServer();
- if (server == null) {
- return null;
+ public void setAccountOnContext(WizardContext context) {
+ RemoteServer<?> account = getSelectedAccount();
+ if (account == null) {
+ return;
}
+ context.putUserData(getKey(account.getType()), account);
+ }
+
+ public static void unsetAccountOnContext(WizardContext context, ServerType<?> cloudType) {
+ context.putUserData(getKey(cloudType), null);
+ }
+
+ private static Key<RemoteServer<?>> getKey(ServerType<?> cloudType) {
+ Key<RemoteServer<?>> result = ourCloudType2AccountKey.get(cloudType);
+ if (result == null) {
+ result = new Key<RemoteServer<?>>("cloud-account-" + cloudType.getId());
+ ourCloudType2AccountKey.put(cloudType, result);
+ }
+ return result;
+ }
- if (getSelectedServerItem().isNew()) {
- RemoteServersManager.getInstance().addServer(server);
- myNewServer = null;
+ public static void createRunConfiguration(WizardContext context,
+ ServerType<?> cloudType,
+ Module module,
+ CloudDeploymentNameConfiguration configuration) {
+ RemoteServer<?> account = context.getUserData(getKey(cloudType));
+ if (account == null) {
+ return;
}
+ createRunConfiguration(account, module, configuration);
+ }
+
+ public static <SC extends ServerConfiguration, DC extends DeploymentConfiguration>
+ DeployToServerRunConfiguration<SC, DC> createRunConfiguration(RemoteServer<SC> account, Module module, DC deploymentConfiguration) {
- String serverName = server.getName();
+ Project project = module.getProject();
- String name = generateRunConfigurationName(serverName, module.getName());
+ String accountName = account.getName();
+
+ String name = generateRunConfigurationName(accountName, module.getName());
final RunManagerEx runManager = RunManagerEx.getInstanceEx(project);
final RunnerAndConfigurationSettings runSettings
- = runManager.createRunConfiguration(name, getRunConfigurationType().getConfigurationFactories()[0]);
+ = runManager.createRunConfiguration(name, getRunConfigurationType(account.getType()).getConfigurationFactories()[0]);
final DeployToServerRunConfiguration<SC, DC> result = (DeployToServerRunConfiguration<SC, DC>)runSettings.getConfiguration();
- result.setServerName(serverName);
+ result.setServerName(accountName);
final ModulePointer modulePointer = ModulePointerManager.getInstance(project).create(module);
result.setDeploymentSource(new ModuleDeploymentSourceImpl(modulePointer));
@@ -194,43 +255,8 @@ public class CloudAccountSelectionEditor<SC extends CloudConfigurationBase,
return result;
}
- protected String generateRunConfigurationName(String serverName, String moduleName) {
- return CloudBundle.getText("run.configuration.name", serverName, moduleName);
- }
-
- protected void handleError(ConfigurationException e) {
- LOG.info(e);
- }
-
- public RemoteServer<SC> getServer() {
- try {
- return doGetServer();
- }
- catch (ConfigurationException e) {
- handleError(e);
- return null;
- }
- }
-
- private RemoteServer<SC> doGetServer() throws ConfigurationException {
- ServerItem serverItem = getSelectedServerItem();
- if (serverItem.isNew()) {
- myServerConfigurable.apply();
- myNewServer.setName(myServerConfigurable.getDisplayName());
- }
- return serverItem.getServer();
- }
-
- public void validate() throws ConfigurationException {
- doGetServer();
- }
-
- private ServerItem getSelectedServerItem() {
- return (ServerItem)myServerComboBox.getSelectedItem();
- }
-
- private DeployToServerConfigurationType getRunConfigurationType() {
- String id = DeployToServerConfigurationType.getId(myCloudType);
+ private static DeployToServerConfigurationType getRunConfigurationType(ServerType<?> cloudType) {
+ String id = DeployToServerConfigurationType.getId(cloudType);
for (ConfigurationType configurationType : ConfigurationType.CONFIGURATION_TYPE_EP.getExtensions()) {
if (configurationType instanceof DeployToServerConfigurationType) {
DeployToServerConfigurationType deployConfigurationType = (DeployToServerConfigurationType)configurationType;
@@ -242,35 +268,25 @@ public class CloudAccountSelectionEditor<SC extends CloudConfigurationBase,
return null;
}
- public JPanel getMainPanel() {
- return myMainPanel;
- }
-
- @Override
- public void dispose() {
- myServerConfigurable.disposeUIResources();
- Disposer.dispose(myRunner);
+ private static String generateRunConfigurationName(String serverName, String moduleName) {
+ return CloudBundle.getText("run.configuration.name", serverName, moduleName);
}
- private class ServerItem {
+ private static class AccountItem {
- private final RemoteServer<SC> myServer;
-
- public ServerItem(RemoteServer<SC> server) {
- myServer = server;
- }
+ private final RemoteServer<?> myAccount;
- public boolean isNew() {
- return myServer == myNewServer;
+ public AccountItem(RemoteServer<?> account) {
+ myAccount = account;
}
- public RemoteServer<SC> getServer() {
- return myServer;
+ public RemoteServer<?> getAccount() {
+ return myAccount;
}
@Override
public String toString() {
- return isNew() ? "New account..." : myServer.getName();
+ return myAccount.getName();
}
}
}