2 * Copyright 2000-2009 JetBrains s.r.o.
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
8 * http://www.apache.org/licenses/LICENSE-2.0
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.
17 package com.intellij.execution.util;
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;
33 import java.awt.datatransfer.DataFlavor;
34 import java.awt.datatransfer.StringSelection;
35 import java.util.ArrayList;
36 import java.util.List;
38 public class EnvVariablesTable extends ListTableWithButtons<EnvironmentVariable> {
39 public EnvVariablesTable() {
40 getTableView().getEmptyText().setText("No variables");
44 protected ListTableModel createListModel() {
45 final ColumnInfo name = new ElementsColumnInfoBase<EnvironmentVariable>("Name") {
47 public String valueOf(EnvironmentVariable environmentVariable) {
48 return environmentVariable.getName();
52 public boolean isCellEditable(EnvironmentVariable environmentVariable) {
53 return environmentVariable.getNameIsWriteable();
57 public void setValue(EnvironmentVariable environmentVariable, String s) {
58 if (s.equals(valueOf(environmentVariable))) {
61 environmentVariable.setName(s);
66 protected String getDescription(EnvironmentVariable environmentVariable) {
67 return environmentVariable.getDescription();
71 final ColumnInfo value = new ElementsColumnInfoBase<EnvironmentVariable>("Value") {
73 public String valueOf(EnvironmentVariable environmentVariable) {
74 return environmentVariable.getValue();
78 public boolean isCellEditable(EnvironmentVariable environmentVariable) {
79 return !environmentVariable.getIsPredefined();
83 public void setValue(EnvironmentVariable environmentVariable, String s) {
84 if (s.equals(valueOf(environmentVariable))) {
87 environmentVariable.setValue(s);
93 protected String getDescription(EnvironmentVariable environmentVariable) {
94 return environmentVariable.getDescription();
98 return new ListTableModel((new ColumnInfo[]{name, value}));
101 public void editVariableName(final EnvironmentVariable environmentVariable) {
102 ApplicationManager.getApplication().invokeLater(new Runnable() {
106 final EnvironmentVariable actualEnvVar = ContainerUtil.find(getElements(), new Condition<EnvironmentVariable>() {
108 public boolean value(EnvironmentVariable item) {
109 return StringUtil.equals(environmentVariable.getName(), item.getName());
112 if (actualEnvVar == null) {
116 setSelection(actualEnvVar);
117 if (actualEnvVar.getNameIsWriteable()) {
124 public List<EnvironmentVariable> getEnvironmentVariables() {
125 return getElements();
129 protected EnvironmentVariable createElement() {
130 return new EnvironmentVariable("", "", false);
134 protected boolean isEmpty(EnvironmentVariable element) {
135 return element.getName().isEmpty() && element.getValue().isEmpty();
140 protected AnActionButton[] createExtraActions() {
141 AnActionButton copyButton = new AnActionButton(ActionsBundle.message("action.EditorCopy.text"), AllIcons.Actions.Copy) {
143 public void actionPerformed(@NotNull AnActionEvent e) {
145 StringBuilder sb = new StringBuilder();
146 List<EnvironmentVariable> variables = getEnvironmentVariables();
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(), '='));
153 CopyPasteManager.getInstance().setContents(new StringSelection(sb.toString()));
156 AnActionButton pasteButton = new AnActionButton(ActionsBundle.message("action.EditorPaste.text"), AllIcons.Actions.Menu_paste) {
158 public void actionPerformed(@NotNull AnActionEvent e) {
160 String content = CopyPasteManager.getInstance().getContents(DataFlavor.stringFlavor);
161 if (content == null || !content.contains("=")) return;
162 List<EnvironmentVariable> parsed = new ArrayList<EnvironmentVariable>();
163 List<String> lines = StringUtil.split(content, "\n");
164 for (String line : lines) {
165 int pos = line.indexOf('=');
166 if (pos == -1) continue;
167 while (pos > 0 && line.charAt(pos - 1) == '\\') {
168 pos = line.indexOf('=', pos + 1);
170 parsed.add(new EnvironmentVariable(
171 StringUtil.unescapeStringCharacters(line.substring(0, pos)),
172 StringUtil.unescapeStringCharacters(line.substring(pos + 1)),
175 List<EnvironmentVariable> variables =
176 new ArrayList<EnvironmentVariable>(ContainerUtil.filter(getEnvironmentVariables(), new Condition<EnvironmentVariable>() {
178 public boolean value(EnvironmentVariable variable) {
179 return variable.getIsPredefined();
182 variables.addAll(parsed);
183 setValues(variables);
186 return new AnActionButton[]{copyButton, pasteButton};
190 protected EnvironmentVariable cloneElement(EnvironmentVariable envVariable) {
191 return envVariable.clone();
195 protected boolean canDeleteElement(EnvironmentVariable selection) {
196 return !selection.getIsPredefined();