IDEA-103464 Adding environment variables to a Tomcat server is a UX nightmare
[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.ide.CopyPasteManager;
23 import com.intellij.openapi.util.Condition;
24 import com.intellij.openapi.util.text.StringUtil;
25 import com.intellij.ui.AnActionButton;
26 import com.intellij.util.containers.ContainerUtil;
27 import com.intellij.util.ui.ColumnInfo;
28 import com.intellij.util.ui.ListTableModel;
29 import org.jetbrains.annotations.NotNull;
30 import org.jetbrains.annotations.Nullable;
31
32 import java.awt.datatransfer.DataFlavor;
33 import java.awt.datatransfer.StringSelection;
34 import java.util.ArrayList;
35 import java.util.List;
36
37 public class EnvVariablesTable extends ListTableWithButtons<EnvironmentVariable> {
38   @Override
39   protected ListTableModel createListModel() {
40     final ColumnInfo name = new ElementsColumnInfoBase<EnvironmentVariable>("Name") {
41       @Override
42       public String valueOf(EnvironmentVariable environmentVariable) {
43         return environmentVariable.getName();
44       }
45
46       @Override
47       public boolean isCellEditable(EnvironmentVariable environmentVariable) {
48         return environmentVariable.getNameIsWriteable();
49       }
50
51       @Override
52       public void setValue(EnvironmentVariable environmentVariable, String s) {
53         if (s.equals(valueOf(environmentVariable))) {
54           return;
55         }
56         environmentVariable.setName(s);
57         setModified();
58       }
59
60       @Override
61       protected String getDescription(EnvironmentVariable environmentVariable) {
62         return environmentVariable.getDescription();
63       }
64     };
65
66     final ColumnInfo value = new ElementsColumnInfoBase<EnvironmentVariable>("Value") {
67       @Override
68       public String valueOf(EnvironmentVariable environmentVariable) {
69         return environmentVariable.getValue();
70       }
71
72       @Override
73       public boolean isCellEditable(EnvironmentVariable environmentVariable) {
74         return !environmentVariable.getIsPredefined();
75       }
76
77       @Override
78       public void setValue(EnvironmentVariable environmentVariable, String s) {
79         if (s.equals(valueOf(environmentVariable))) {
80           return;
81         }
82         environmentVariable.setValue(s);
83         setModified();
84       }
85
86       @Nullable
87       @Override
88       protected String getDescription(EnvironmentVariable environmentVariable) {
89         return environmentVariable.getDescription();
90       }
91     };
92
93     return new ListTableModel((new ColumnInfo[]{name, value}));
94   }
95
96
97   public List<EnvironmentVariable> getEnvironmentVariables() {
98     return getElements();
99   }
100
101   @Override
102   protected EnvironmentVariable createElement() {
103     return new EnvironmentVariable("", "", false);
104   }
105
106   @Override
107   protected boolean isEmpty(EnvironmentVariable element) {
108     return element.getName().isEmpty() && element.getValue().isEmpty();
109   }
110
111   @Override
112   protected AnActionButton[] createExtraActions() {
113     AnActionButton copyButton = new AnActionButton(ActionsBundle.message("action.EditorCopy.text"), AllIcons.Actions.Copy) {
114       @Override
115       public void actionPerformed(@NotNull AnActionEvent e) {
116         stopEditing();
117         StringBuilder sb = new StringBuilder();
118         List<EnvironmentVariable> variables = getEnvironmentVariables();
119         for (EnvironmentVariable environmentVariable : variables) {
120           if (environmentVariable.getIsPredefined() || isEmpty(environmentVariable)) continue;
121           if (sb.length() > 0) sb.append('\n');
122           sb.append(StringUtil.escapeChar(environmentVariable.getName(), '=')).append('=')
123             .append(StringUtil.escapeChar(environmentVariable.getValue(), '='));
124         }
125         CopyPasteManager.getInstance().setContents(new StringSelection(sb.toString()));
126       }
127     };
128     AnActionButton pasteButton = new AnActionButton(ActionsBundle.message("action.EditorPaste.text"), AllIcons.Actions.Menu_paste) {
129       @Override
130       public void actionPerformed(@NotNull AnActionEvent e) {
131         stopEditing();
132         String content = CopyPasteManager.getInstance().getContents(DataFlavor.stringFlavor);
133         if (content == null || !content.contains("=")) return;
134         List<EnvironmentVariable> parsed = new ArrayList<EnvironmentVariable>();
135         List<String> lines = StringUtil.split(content, "\n");
136         for (String line : lines) {
137           int pos = line.indexOf('=');
138           if (pos == -1) continue;
139           while (pos > 0 && line.charAt(pos - 1) == '\\') {
140             pos = line.indexOf('=', pos + 1);
141           }
142           parsed.add(new EnvironmentVariable(
143             StringUtil.unescapeStringCharacters(line.substring(0, pos)),
144             StringUtil.unescapeStringCharacters(line.substring(pos + 1)),
145             false));
146         }
147         List<EnvironmentVariable> variables =
148           new ArrayList<EnvironmentVariable>(ContainerUtil.filter(getEnvironmentVariables(), new Condition<EnvironmentVariable>() {
149             @Override
150             public boolean value(EnvironmentVariable variable) {
151               return variable.getIsPredefined();
152             }
153           }));
154         variables.addAll(parsed);
155         setValues(variables);
156       }
157     };
158     return new AnActionButton[]{copyButton, pasteButton};
159   }
160
161   @Override
162   protected EnvironmentVariable cloneElement(EnvironmentVariable envVariable) {
163     return envVariable.clone();
164   }
165
166   @Override
167   protected boolean canDeleteElement(EnvironmentVariable selection) {
168     return !selection.getIsPredefined();
169   }
170 }