8424662d824fc6d75918f365a62c88d960835cc4
[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 java.awt.datatransfer.DataFlavor;
34 import java.awt.datatransfer.StringSelection;
35 import java.util.ArrayList;
36 import java.util.List;
37
38 public class EnvVariablesTable extends ListTableWithButtons<EnvironmentVariable> {
39   public EnvVariablesTable() {
40     getTableView().getEmptyText().setText("No variables");
41   }
42   
43   @Override
44   protected ListTableModel createListModel() {
45     final ColumnInfo name = new ElementsColumnInfoBase<EnvironmentVariable>("Name") {
46       @Override
47       public String valueOf(EnvironmentVariable environmentVariable) {
48         return environmentVariable.getName();
49       }
50
51       @Override
52       public boolean isCellEditable(EnvironmentVariable environmentVariable) {
53         return environmentVariable.getNameIsWriteable();
54       }
55
56       @Override
57       public void setValue(EnvironmentVariable environmentVariable, String s) {
58         if (s.equals(valueOf(environmentVariable))) {
59           return;
60         }
61         environmentVariable.setName(s);
62         setModified();
63       }
64
65       @Override
66       protected String getDescription(EnvironmentVariable environmentVariable) {
67         return environmentVariable.getDescription();
68       }
69     };
70
71     final ColumnInfo value = new ElementsColumnInfoBase<EnvironmentVariable>("Value") {
72       @Override
73       public String valueOf(EnvironmentVariable environmentVariable) {
74         return environmentVariable.getValue();
75       }
76
77       @Override
78       public boolean isCellEditable(EnvironmentVariable environmentVariable) {
79         return !environmentVariable.getIsPredefined();
80       }
81
82       @Override
83       public void setValue(EnvironmentVariable environmentVariable, String s) {
84         if (s.equals(valueOf(environmentVariable))) {
85           return;
86         }
87         environmentVariable.setValue(s);
88         setModified();
89       }
90
91       @Nullable
92       @Override
93       protected String getDescription(EnvironmentVariable environmentVariable) {
94         return environmentVariable.getDescription();
95       }
96     };
97
98     return new ListTableModel((new ColumnInfo[]{name, value}));
99   }
100
101   public void editVariableName(final EnvironmentVariable environmentVariable) {
102     ApplicationManager.getApplication().invokeLater(new Runnable() {
103
104       @Override
105       public void run() {
106         final EnvironmentVariable actualEnvVar = ContainerUtil.find(getElements(), new Condition<EnvironmentVariable>() {
107           @Override
108           public boolean value(EnvironmentVariable item) {
109             return StringUtil.equals(environmentVariable.getName(), item.getName());
110           }
111         });
112         if (actualEnvVar == null) {
113           return;
114         }
115
116         setSelection(actualEnvVar);
117         if (actualEnvVar.getNameIsWriteable()) {
118           editSelection(0);
119         }
120       }
121     });
122   }
123
124   public List<EnvironmentVariable> getEnvironmentVariables() {
125     return getElements();
126   }
127
128   @Override
129   protected EnvironmentVariable createElement() {
130     return new EnvironmentVariable("", "", false);
131   }
132
133   @Override
134   protected boolean isEmpty(EnvironmentVariable element) {
135     return element.getName().isEmpty() && element.getValue().isEmpty();
136   }
137
138   @NotNull
139   @Override
140   protected AnActionButton[] createExtraActions() {
141     AnActionButton copyButton = new AnActionButton(ActionsBundle.message("action.EditorCopy.text"), AllIcons.Actions.Copy) {
142       @Override
143       public void actionPerformed(@NotNull AnActionEvent e) {
144         stopEditing();
145         StringBuilder sb = new StringBuilder();
146         List<EnvironmentVariable> variables = getSelection();
147         for (EnvironmentVariable environmentVariable : variables) {
148           if (environmentVariable.getIsPredefined() || isEmpty(environmentVariable)) continue;
149           if (sb.length() > 0) sb.append('\n');
150           sb.append(StringUtil.escapeChar(environmentVariable.getName(), '=')).append('=')
151             .append(StringUtil.escapeChar(environmentVariable.getValue(), '='));
152         }
153         CopyPasteManager.getInstance().setContents(new StringSelection(sb.toString()));
154       }
155
156       @Override
157       public boolean isEnabled() {
158         return super.isEnabled() && !getSelection().isEmpty();
159       }
160     };
161     AnActionButton pasteButton = new AnActionButton(ActionsBundle.message("action.EditorPaste.text"), AllIcons.Actions.Menu_paste) {
162       @Override
163       public void actionPerformed(@NotNull AnActionEvent e) {
164         removeSelected();
165         stopEditing();
166         String content = CopyPasteManager.getInstance().getContents(DataFlavor.stringFlavor);
167         if (content == null || !content.contains("=")) return;
168         List<EnvironmentVariable> parsed = new ArrayList<EnvironmentVariable>();
169         List<String> lines = StringUtil.split(content, "\n");
170         for (String line : lines) {
171           int pos = line.indexOf('=');
172           if (pos == -1) continue;
173           while (pos > 0 && line.charAt(pos - 1) == '\\') {
174             pos = line.indexOf('=', pos + 1);
175           }
176           line = line.replaceAll("[\\\\]{1}","\\\\\\\\");
177           parsed.add(new EnvironmentVariable(
178             StringUtil.unescapeStringCharacters(line.substring(0, pos)),
179             StringUtil.unescapeStringCharacters(line.substring(pos + 1)),
180             false));
181         }
182         List<EnvironmentVariable> variables = new ArrayList<EnvironmentVariable>(getEnvironmentVariables());
183         variables.addAll(parsed);
184         setValues(variables);
185       }
186     };
187     return new AnActionButton[]{copyButton, pasteButton};
188   }
189
190   @Override
191   protected EnvironmentVariable cloneElement(EnvironmentVariable envVariable) {
192     return envVariable.clone();
193   }
194
195   @Override
196   protected boolean canDeleteElement(EnvironmentVariable selection) {
197     return !selection.getIsPredefined();
198   }
199 }