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 = 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(), '='));
153 CopyPasteManager.getInstance().setContents(new StringSelection(sb.toString()));
157 public boolean isEnabled() {
158 return super.isEnabled() && !getSelection().isEmpty();
161 AnActionButton pasteButton = new AnActionButton(ActionsBundle.message("action.EditorPaste.text"), AllIcons.Actions.Menu_paste) {
163 public void actionPerformed(@NotNull AnActionEvent e) {
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);
176 line = line.replaceAll("[\\\\]{1}","\\\\\\\\");
177 parsed.add(new EnvironmentVariable(
178 StringUtil.unescapeStringCharacters(line.substring(0, pos)),
179 StringUtil.unescapeStringCharacters(line.substring(pos + 1)),
182 List<EnvironmentVariable> variables = new ArrayList<EnvironmentVariable>(getEnvironmentVariables());
183 variables.addAll(parsed);
184 setValues(variables);
187 return new AnActionButton[]{copyButton, pasteButton};
191 protected EnvironmentVariable cloneElement(EnvironmentVariable envVariable) {
192 return envVariable.clone();
196 protected boolean canDeleteElement(EnvironmentVariable selection) {
197 return !selection.getIsPredefined();