WEB-19727 rsa key as env variable not working
[idea/community.git] / platform / lang-api / src / com / intellij / execution / util / EnvVariablesTable.java
1 /*
2  * Copyright 2000-2009 JetBrains s.r.o.
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16
17 package com.intellij.execution.util;
18
19 import com.intellij.icons.AllIcons;
20 import com.intellij.idea.ActionsBundle;
21 import com.intellij.openapi.actionSystem.AnActionEvent;
22 import com.intellij.openapi.application.ApplicationManager;
23 import com.intellij.openapi.ide.CopyPasteManager;
24 import com.intellij.openapi.util.Condition;
25 import com.intellij.openapi.util.text.StringUtil;
26 import com.intellij.ui.AnActionButton;
27 import com.intellij.util.containers.ContainerUtil;
28 import com.intellij.util.ui.ColumnInfo;
29 import com.intellij.util.ui.ListTableModel;
30 import org.jetbrains.annotations.NotNull;
31 import org.jetbrains.annotations.Nullable;
32
33 import javax.swing.table.TableCellEditor;
34 import java.awt.datatransfer.DataFlavor;
35 import java.awt.datatransfer.StringSelection;
36 import java.util.ArrayList;
37 import java.util.List;
38
39 public class EnvVariablesTable extends ListTableWithButtons<EnvironmentVariable> {
40   public EnvVariablesTable() {
41     getTableView().getEmptyText().setText("No variables");
42   }
43   
44   @Override
45   protected ListTableModel createListModel() {
46     final ColumnInfo name = new ElementsColumnInfoBase<EnvironmentVariable>("Name") {
47       @Override
48       public String valueOf(EnvironmentVariable environmentVariable) {
49         return environmentVariable.getName();
50       }
51
52       @Override
53       public boolean isCellEditable(EnvironmentVariable environmentVariable) {
54         return environmentVariable.getNameIsWriteable();
55       }
56
57       @Override
58       public void setValue(EnvironmentVariable environmentVariable, String s) {
59         if (s.equals(valueOf(environmentVariable))) {
60           return;
61         }
62         environmentVariable.setName(s);
63         setModified();
64       }
65
66       @Override
67       protected String getDescription(EnvironmentVariable environmentVariable) {
68         return environmentVariable.getDescription();
69       }
70     };
71
72     final ColumnInfo value = new ElementsColumnInfoBase<EnvironmentVariable>("Value") {
73       @Override
74       public String valueOf(EnvironmentVariable environmentVariable) {
75         return environmentVariable.getValue();
76       }
77
78       @Override
79       public boolean isCellEditable(EnvironmentVariable environmentVariable) {
80         return !environmentVariable.getIsPredefined();
81       }
82
83       @Override
84       public void setValue(EnvironmentVariable environmentVariable, String s) {
85         if (s.equals(valueOf(environmentVariable))) {
86           return;
87         }
88         environmentVariable.setValue(s);
89         setModified();
90       }
91
92       @Nullable
93       @Override
94       protected String getDescription(EnvironmentVariable environmentVariable) {
95         return environmentVariable.getDescription();
96       }
97
98       @Nullable
99       @Override
100       public TableCellEditor getEditor(EnvironmentVariable variable) {
101         StringWithNewLinesCellEditor editor = new StringWithNewLinesCellEditor();
102         editor.setClickCountToStart(1);
103         return editor;
104       }
105     };
106
107     return new ListTableModel((new ColumnInfo[]{name, value}));
108   }
109
110   public void editVariableName(final EnvironmentVariable environmentVariable) {
111     ApplicationManager.getApplication().invokeLater(new Runnable() {
112
113       @Override
114       public void run() {
115         final EnvironmentVariable actualEnvVar = ContainerUtil.find(getElements(), new Condition<EnvironmentVariable>() {
116           @Override
117           public boolean value(EnvironmentVariable item) {
118             return StringUtil.equals(environmentVariable.getName(), item.getName());
119           }
120         });
121         if (actualEnvVar == null) {
122           return;
123         }
124
125         setSelection(actualEnvVar);
126         if (actualEnvVar.getNameIsWriteable()) {
127           editSelection(0);
128         }
129       }
130     });
131   }
132
133   public List<EnvironmentVariable> getEnvironmentVariables() {
134     return getElements();
135   }
136
137   @Override
138   protected EnvironmentVariable createElement() {
139     return new EnvironmentVariable("", "", false);
140   }
141
142   @Override
143   protected boolean isEmpty(EnvironmentVariable element) {
144     return element.getName().isEmpty() && element.getValue().isEmpty();
145   }
146
147   @NotNull
148   @Override
149   protected AnActionButton[] createExtraActions() {
150     AnActionButton copyButton = new AnActionButton(ActionsBundle.message("action.EditorCopy.text"), AllIcons.Actions.Copy) {
151       @Override
152       public void actionPerformed(@NotNull AnActionEvent e) {
153         stopEditing();
154         StringBuilder sb = new StringBuilder();
155         List<EnvironmentVariable> variables = getSelection();
156         for (EnvironmentVariable environmentVariable : variables) {
157           if (environmentVariable.getIsPredefined() || isEmpty(environmentVariable)) continue;
158           if (sb.length() > 0) sb.append('\n');
159           sb.append(StringUtil.escapeChar(environmentVariable.getName(), '=')).append('=')
160             .append(StringUtil.escapeChar(environmentVariable.getValue(), '='));
161         }
162         CopyPasteManager.getInstance().setContents(new StringSelection(sb.toString()));
163       }
164
165       @Override
166       public boolean isEnabled() {
167         return super.isEnabled() && !getSelection().isEmpty();
168       }
169     };
170     AnActionButton pasteButton = new AnActionButton(ActionsBundle.message("action.EditorPaste.text"), AllIcons.Actions.Menu_paste) {
171       @Override
172       public void actionPerformed(@NotNull AnActionEvent e) {
173         removeSelected();
174         stopEditing();
175         String content = CopyPasteManager.getInstance().getContents(DataFlavor.stringFlavor);
176         if (content == null || !content.contains("=")) return;
177         List<EnvironmentVariable> parsed = new ArrayList<EnvironmentVariable>();
178         List<String> lines = StringUtil.split(content, "\n");
179         for (String line : lines) {
180           int pos = line.indexOf('=');
181           if (pos == -1) continue;
182           while (pos > 0 && line.charAt(pos - 1) == '\\') {
183             pos = line.indexOf('=', pos + 1);
184           }
185           line = line.replaceAll("[\\\\]{1}","\\\\\\\\");
186           parsed.add(new EnvironmentVariable(
187             StringUtil.unescapeStringCharacters(line.substring(0, pos)),
188             StringUtil.unescapeStringCharacters(line.substring(pos + 1)),
189             false));
190         }
191         List<EnvironmentVariable> variables = new ArrayList<EnvironmentVariable>(getEnvironmentVariables());
192         variables.addAll(parsed);
193         setValues(variables);
194       }
195     };
196     return new AnActionButton[]{copyButton, pasteButton};
197   }
198
199   @Override
200   protected EnvironmentVariable cloneElement(EnvironmentVariable envVariable) {
201     return envVariable.clone();
202   }
203
204   @Override
205   protected boolean canDeleteElement(EnvironmentVariable selection) {
206     return !selection.getIsPredefined();
207   }
208 }