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.java222
1 files changed, 222 insertions, 0 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
new file mode 100644
index 000000000000..aab46e76a3c7
--- /dev/null
+++ b/platform/remote-servers/impl/src/com/intellij/remoteServer/util/CloudAccountSelectionEditor.java
@@ -0,0 +1,222 @@
+/*
+ * Copyright 2000-2014 JetBrains s.r.o.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+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.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.project.Project;
+import com.intellij.openapi.util.Condition;
+import com.intellij.remoteServer.ServerType;
+import com.intellij.remoteServer.configuration.RemoteServer;
+import com.intellij.remoteServer.configuration.RemoteServersManager;
+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.text.UniqueNameGenerator;
+
+import javax.swing.*;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+
+/**
+ * @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());
+
+ private JComboBox myServerComboBox;
+ private JPanel myServerConfigurablePanel;
+ private JPanel myMainPanel;
+
+ private final ST myCloudType;
+
+ private RemoteServer<SC> myNewServer;
+ private RemoteServerConfigurable myServerConfigurable;
+
+ protected CloudAccountSelectionEditor(ST cloudType) {
+ myCloudType = cloudType;
+ }
+
+ private void createUIComponents() {
+ myServerConfigurablePanel = createServerConfigurablePanel();
+ }
+
+ public void initUI() {
+ myServerComboBox.addActionListener(new ActionListener() {
+
+ @Override
+ public void actionPerformed(ActionEvent e) {
+ onAccountSelectionChanged();
+ }
+ });
+
+ for (RemoteServer<SC> server : RemoteServersManager.getInstance().getServers(myCloudType)) {
+ myServerComboBox.addItem(new ServerItem(server));
+ }
+ myServerComboBox.addItem(new ServerItem(myNewServer));
+ }
+
+ private void onAccountSelectionChanged() {
+ myServerConfigurablePanel.setVisible(getSelectedServerItem().isNew());
+ }
+
+ protected JPanel createServerConfigurablePanel() {
+ myNewServer = RemoteServersManager.getInstance().createServer(myCloudType, generateServerName());
+ myServerConfigurable = new RemoteServerConfigurable(myNewServer, null, true);
+ myServerConfigurablePanel = (JPanel)myServerConfigurable.createComponent();
+ return myServerConfigurablePanel;
+ }
+
+ private String generateServerName() {
+ return UniqueNameGenerator.generateUniqueName(myCloudType.getPresentableName(), new Condition<String>() {
+
+ @Override
+ public boolean value(String s) {
+ for (RemoteServer<?> server : RemoteServersManager.getInstance().getServers()) {
+ if (server.getName().equals(s)) {
+ return false;
+ }
+ }
+ return true;
+ }
+ });
+ }
+
+ public DeployToServerRunConfiguration<SC, DC> createRunConfiguration(Module module, DC deploymentConfiguration) {
+ Project project = module.getProject();
+
+ RemoteServer<SC> server = getServer();
+ if (server == null) {
+ return null;
+ }
+
+ if (getSelectedServerItem().isNew()) {
+ RemoteServersManager.getInstance().addServer(server);
+ }
+
+ String serverName = server.getName();
+
+ String name = generateRunConfigurationName(serverName, module.getName());
+
+ final RunManagerEx runManager = RunManagerEx.getInstanceEx(project);
+ final RunnerAndConfigurationSettings runSettings
+ = runManager.createRunConfiguration(name, getRunConfigurationType().getConfigurationFactories()[0]);
+
+ final DeployToServerRunConfiguration<SC, DC> result = (DeployToServerRunConfiguration<SC, DC>)runSettings.getConfiguration();
+
+ runManager.addConfiguration(runSettings, false);
+ runManager.setSelectedConfiguration(runSettings);
+
+ result.setServerName(serverName);
+
+ final ModulePointer modulePointer = ModulePointerManager.getInstance(project).create(module);
+ result.setDeploymentSource(new ModuleDeploymentSourceImpl(modulePointer));
+
+ result.setDeploymentConfiguration(deploymentConfiguration);
+
+ 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);
+ for (ConfigurationType configurationType : ConfigurationType.CONFIGURATION_TYPE_EP.getExtensions()) {
+ if (configurationType instanceof DeployToServerConfigurationType) {
+ DeployToServerConfigurationType deployConfigurationType = (DeployToServerConfigurationType)configurationType;
+ if (deployConfigurationType.getId().equals(id)) {
+ return deployConfigurationType;
+ }
+ }
+ }
+ return null;
+ }
+
+ public JPanel getMainPanel() {
+ return myMainPanel;
+ }
+
+ @Override
+ public void dispose() {
+ myServerConfigurable.disposeUIResources();
+ }
+
+ private class ServerItem {
+
+ private final RemoteServer<SC> myServer;
+
+ public ServerItem(RemoteServer<SC> server) {
+ myServer = server;
+ }
+
+ public boolean isNew() {
+ return myServer == myNewServer;
+ }
+
+ public RemoteServer<SC> getServer() {
+ return myServer;
+ }
+
+ @Override
+ public String toString() {
+ return isNew() ? "New account..." : myServer.getName();
+ }
+ }
+}