/* * Copyright 2000-2009 JetBrains s.r.o. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.intellij.execution.util; import com.intellij.icons.AllIcons; import com.intellij.idea.ActionsBundle; import com.intellij.openapi.actionSystem.AnActionEvent; import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.ide.CopyPasteManager; import com.intellij.openapi.util.Condition; import com.intellij.openapi.util.text.StringUtil; import com.intellij.ui.AnActionButton; import com.intellij.util.containers.ContainerUtil; import com.intellij.util.ui.ColumnInfo; import com.intellij.util.ui.ListTableModel; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import javax.swing.table.TableCellEditor; import java.awt.datatransfer.DataFlavor; import java.awt.datatransfer.StringSelection; import java.util.ArrayList; import java.util.List; public class EnvVariablesTable extends ListTableWithButtons<EnvironmentVariable> { public EnvVariablesTable() { getTableView().getEmptyText().setText("No variables"); } @Override protected ListTableModel createListModel() { final ColumnInfo name = new ElementsColumnInfoBase<EnvironmentVariable>("Name") { @Override public String valueOf(EnvironmentVariable environmentVariable) { return environmentVariable.getName(); } @Override public boolean isCellEditable(EnvironmentVariable environmentVariable) { return environmentVariable.getNameIsWriteable(); } @Override public void setValue(EnvironmentVariable environmentVariable, String s) { if (s.equals(valueOf(environmentVariable))) { return; } environmentVariable.setName(s); setModified(); } @Override protected String getDescription(EnvironmentVariable environmentVariable) { return environmentVariable.getDescription(); } }; final ColumnInfo value = new ElementsColumnInfoBase<EnvironmentVariable>("Value") { @Override public String valueOf(EnvironmentVariable environmentVariable) { return environmentVariable.getValue(); } @Override public boolean isCellEditable(EnvironmentVariable environmentVariable) { return !environmentVariable.getIsPredefined(); } @Override public void setValue(EnvironmentVariable environmentVariable, String s) { if (s.equals(valueOf(environmentVariable))) { return; } environmentVariable.setValue(s); setModified(); } @Nullable @Override protected String getDescription(EnvironmentVariable environmentVariable) { return environmentVariable.getDescription(); } @Nullable @Override public TableCellEditor getEditor(EnvironmentVariable variable) { StringWithNewLinesCellEditor editor = new StringWithNewLinesCellEditor(); editor.setClickCountToStart(1); return editor; } }; return new ListTableModel((new ColumnInfo[]{name, value})); } public void editVariableName(final EnvironmentVariable environmentVariable) { ApplicationManager.getApplication().invokeLater(() -> { final EnvironmentVariable actualEnvVar = ContainerUtil.find(getElements(), item -> StringUtil.equals(environmentVariable.getName(), item.getName())); if (actualEnvVar == null) { return; } setSelection(actualEnvVar); if (actualEnvVar.getNameIsWriteable()) { editSelection(0); } }); } public List<EnvironmentVariable> getEnvironmentVariables() { return getElements(); } @Override protected EnvironmentVariable createElement() { return new EnvironmentVariable("", "", false); } @Override protected boolean isEmpty(EnvironmentVariable element) { return element.getName().isEmpty() && element.getValue().isEmpty(); } @NotNull @Override protected AnActionButton[] createExtraActions() { AnActionButton copyButton = new AnActionButton(ActionsBundle.message("action.EditorCopy.text"), AllIcons.Actions.Copy) { @Override public void actionPerformed(@NotNull AnActionEvent e) { stopEditing(); StringBuilder sb = new StringBuilder(); List<EnvironmentVariable> variables = getSelection(); for (EnvironmentVariable environmentVariable : variables) { if (environmentVariable.getIsPredefined() || isEmpty(environmentVariable)) continue; if (sb.length() > 0) sb.append('\n'); sb.append(StringUtil.escapeChar(environmentVariable.getName(), '=')).append('=') .append(StringUtil.escapeChar(environmentVariable.getValue(), '=')); } CopyPasteManager.getInstance().setContents(new StringSelection(sb.toString())); } @Override public boolean isEnabled() { return super.isEnabled() && !getSelection().isEmpty(); } }; AnActionButton pasteButton = new AnActionButton(ActionsBundle.message("action.EditorPaste.text"), AllIcons.Actions.Menu_paste) { @Override public void actionPerformed(@NotNull AnActionEvent e) { removeSelected(); stopEditing(); String content = CopyPasteManager.getInstance().getContents(DataFlavor.stringFlavor); if (content == null || !content.contains("=")) return; List<EnvironmentVariable> parsed = new ArrayList<>(); List<String> lines = StringUtil.split(content, "\n"); for (String line : lines) { int pos = line.indexOf('='); if (pos == -1) continue; while (pos > 0 && line.charAt(pos - 1) == '\\') { pos = line.indexOf('=', pos + 1); } line = line.replaceAll("[\\\\]{1}","\\\\\\\\"); parsed.add(new EnvironmentVariable( StringUtil.unescapeStringCharacters(line.substring(0, pos)), StringUtil.unescapeStringCharacters(line.substring(pos + 1)), false)); } List<EnvironmentVariable> variables = new ArrayList<>(getEnvironmentVariables()); variables.addAll(parsed); setValues(variables); } }; return new AnActionButton[]{copyButton, pasteButton}; } @Override protected EnvironmentVariable cloneElement(EnvironmentVariable envVariable) { return envVariable.clone(); } @Override protected boolean canDeleteElement(EnvironmentVariable selection) { return !selection.getIsPredefined(); } }