From d972a0e47e05b91d056d04564a36fe7d1d8a1256 Mon Sep 17 00:00:00 2001 From: "Vassiliy.Kudryashov" Date: Fri, 30 Jan 2015 19:58:26 +0300 Subject: [PATCH] CPP-2091 Illogical behavior of copy-paste on the CMake page of the Settings/Preferences dialog --- .../execution/util/EnvVariablesTable.java | 16 ++-- .../execution/util/ListTableWithButtons.java | 75 ++++++++++++------- 2 files changed, 57 insertions(+), 34 deletions(-) diff --git a/platform/lang-api/src/com/intellij/execution/util/EnvVariablesTable.java b/platform/lang-api/src/com/intellij/execution/util/EnvVariablesTable.java index 8a355d263a07..552d7563a2f2 100644 --- a/platform/lang-api/src/com/intellij/execution/util/EnvVariablesTable.java +++ b/platform/lang-api/src/com/intellij/execution/util/EnvVariablesTable.java @@ -143,7 +143,7 @@ public class EnvVariablesTable extends ListTableWithButtons public void actionPerformed(@NotNull AnActionEvent e) { stopEditing(); StringBuilder sb = new StringBuilder(); - List variables = getEnvironmentVariables(); + List variables = getSelection(); for (EnvironmentVariable environmentVariable : variables) { if (environmentVariable.getIsPredefined() || isEmpty(environmentVariable)) continue; if (sb.length() > 0) sb.append('\n'); @@ -152,10 +152,16 @@ public class EnvVariablesTable extends ListTableWithButtons } 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; @@ -172,13 +178,7 @@ public class EnvVariablesTable extends ListTableWithButtons StringUtil.unescapeStringCharacters(line.substring(pos + 1)), false)); } - List variables = - new ArrayList(ContainerUtil.filter(getEnvironmentVariables(), new Condition() { - @Override - public boolean value(EnvironmentVariable variable) { - return variable.getIsPredefined(); - } - })); + List variables = new ArrayList(getEnvironmentVariables()); variables.addAll(parsed); setValues(variables); } diff --git a/platform/lang-api/src/com/intellij/execution/util/ListTableWithButtons.java b/platform/lang-api/src/com/intellij/execution/util/ListTableWithButtons.java index 71ed67719cb9..5ea5a2ae5ac7 100644 --- a/platform/lang-api/src/com/intellij/execution/util/ListTableWithButtons.java +++ b/platform/lang-api/src/com/intellij/execution/util/ListTableWithButtons.java @@ -16,6 +16,7 @@ package com.intellij.execution.util; import com.intellij.openapi.actionSystem.AnActionEvent; +import com.intellij.openapi.util.Condition; import com.intellij.ui.*; import com.intellij.ui.table.TableView; import com.intellij.util.containers.ContainerUtil; @@ -30,6 +31,7 @@ import javax.swing.table.DefaultTableCellRenderer; import javax.swing.table.TableCellRenderer; import java.awt.event.KeyAdapter; import java.awt.event.KeyEvent; +import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.Observable; @@ -110,31 +112,19 @@ public abstract class ListTableWithButtons extends Observable { }).setRemoveAction(new AnActionButtonRunnable() { @Override public void run(AnActionButton button) { - myTableView.stopEditing(); - setModified(); - T selected = getSelection(); - if (selected != null) { - int selectedIndex = myElements.indexOf(selected); - myTableView.scrollRectToVisible(myTableView.getCellRect(selectedIndex, 0, true)); - myElements.remove(selected); - myTableView.getTableViewModel().setItems(myElements); - - int prev = selectedIndex - 1; - if (prev >= 0) { - myTableView.getComponent().getSelectionModel().setSelectionInterval(prev, prev); - } - else if (selectedIndex < myElements.size()) { - myTableView.getComponent().getSelectionModel().setSelectionInterval(selectedIndex, selectedIndex); - } - } + removeSelected(); } }).disableUpDownActions().addExtraActions(createExtraActions()).createPanel(); ToolbarDecorator.findRemoveButton(myPanel).addCustomUpdater(new AnActionButtonUpdater() { @Override public boolean isEnabled(AnActionEvent e) { - T selection = getSelection(); - return selection != null && myIsEnabled && canDeleteElement(selection); + List selection = getSelection(); + if (selection.isEmpty() || !myIsEnabled) return false; + for (T t : selection) { + if (!canDeleteElement(t)) return false; + } + return true; } }); ToolbarDecorator.findAddButton(myPanel).addCustomUpdater(new AnActionButtonUpdater() { @@ -146,7 +136,33 @@ public abstract class ListTableWithButtons extends Observable { myActionsPanel = decorator.getActionsPanel(); - myTableView.getComponent().setSelectionMode(ListSelectionModel.SINGLE_SELECTION); + myTableView.getComponent().setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION); + } + + protected void removeSelected() { + List selected = getSelection(); + if (!selected.isEmpty()) { + myTableView.stopEditing(); + setModified(); + int selectedIndex = myTableView.getSelectionModel().getLeadSelectionIndex(); + myTableView.scrollRectToVisible(myTableView.getCellRect(selectedIndex, 0, true)); + selected = ContainerUtil.filter(selected, new Condition() { + @Override + public boolean value(T t) { + return canDeleteElement(t); + } + }); + myElements.removeAll(selected); + myTableView.getTableViewModel().setItems(myElements); + + int prev = selectedIndex - 1; + if (prev >= 0) { + myTableView.getComponent().getSelectionModel().setSelectionInterval(prev, prev); + } + else if (selectedIndex < myElements.size()) { + myTableView.getComponent().getSelectionModel().setSelectionInterval(selectedIndex, selectedIndex); + } + } } @NotNull @@ -197,7 +213,9 @@ public abstract class ListTableWithButtons extends Observable { } protected void editSelection(int column) { - int row = myElements.indexOf(getSelection()); + List selection = getSelection(); + if (selection.size() != 1) return; + int row = myElements.indexOf(selection.get(0)); if (row != -1) { TableUtil.editCellAt(myTableView, row, column); } @@ -213,13 +231,18 @@ public abstract class ListTableWithButtons extends Observable { } - protected T getSelection() { - int selIndex = myTableView.getComponent().getSelectionModel().getMinSelectionIndex(); - if (selIndex < 0) { - return null; + @NotNull + protected List getSelection() { + int[] selection = myTableView.getComponent().getSelectedRows(); + if (selection.length == 0) { + return Collections.emptyList(); } else { - return myElements.get(selIndex); + List result = new ArrayList(selection.length); + for (int row : selection) { + result.add(myElements.get(row)); + } + return result; } }