diff --git a/platform/lang-impl/src/com/intellij/application/options/codeStyle/arrangement/ArrangementConstants.java b/platform/lang-impl/src/com/intellij/application/options/codeStyle/arrangement/ArrangementConstants.java
index eed611df2891..3aab0156f8a8 100644
--- a/platform/lang-impl/src/com/intellij/application/options/codeStyle/arrangement/ArrangementConstants.java
+++ b/platform/lang-impl/src/com/intellij/application/options/codeStyle/arrangement/ArrangementConstants.java
@@ -48,8 +48,6 @@ public class ArrangementConstants {
public static final boolean LOG_RULE_MODIFICATION = Boolean.parseBoolean(System.getProperty("log.arrangement.rule.modification"));
- public static final DataKey> UPDATE_MOVE_RULE_FUNCTION_KEY
- = DataKey.create("Arrangement.Rule.Function.Update.Move");
public static final DataKey> MOVE_RULE_FUNCTION_KEY = DataKey.create("Arrangement.Rule.Function.Move");
private ArrangementConstants() {
diff --git a/platform/lang-impl/src/com/intellij/application/options/codeStyle/arrangement/action/MoveArrangementRuleDownAction.java b/platform/lang-impl/src/com/intellij/application/options/codeStyle/arrangement/action/MoveArrangementRuleDownAction.java
index 89caca22d280..d91f880ea9f5 100644
--- a/platform/lang-impl/src/com/intellij/application/options/codeStyle/arrangement/action/MoveArrangementRuleDownAction.java
+++ b/platform/lang-impl/src/com/intellij/application/options/codeStyle/arrangement/action/MoveArrangementRuleDownAction.java
@@ -36,8 +36,7 @@ public class MoveArrangementRuleDownAction extends AnAction implements DumbAware
@Override
public void update(AnActionEvent e) {
- Function function = ArrangementConstants.UPDATE_MOVE_RULE_FUNCTION_KEY.getData(e.getDataContext());
- e.getPresentation().setEnabled(function != null && function.fun(false));
+ // TODO den implement
}
@Override
diff --git a/platform/lang-impl/src/com/intellij/application/options/codeStyle/arrangement/action/MoveArrangementRuleUpAction.java b/platform/lang-impl/src/com/intellij/application/options/codeStyle/arrangement/action/MoveArrangementRuleUpAction.java
index 861c5721610b..1fa7f01385c1 100644
--- a/platform/lang-impl/src/com/intellij/application/options/codeStyle/arrangement/action/MoveArrangementRuleUpAction.java
+++ b/platform/lang-impl/src/com/intellij/application/options/codeStyle/arrangement/action/MoveArrangementRuleUpAction.java
@@ -16,12 +16,17 @@
package com.intellij.application.options.codeStyle.arrangement.action;
import com.intellij.application.options.codeStyle.arrangement.ArrangementConstants;
+import com.intellij.application.options.codeStyle.arrangement.match.ArrangementMatchingRulesControl;
+import com.intellij.application.options.codeStyle.arrangement.match.ArrangementMatchingRulesModel;
import com.intellij.openapi.actionSystem.AnAction;
import com.intellij.openapi.actionSystem.AnActionEvent;
import com.intellij.openapi.application.ApplicationBundle;
import com.intellij.openapi.project.DumbAware;
-import com.intellij.util.Consumer;
-import com.intellij.util.Function;
+import gnu.trove.TIntArrayList;
+
+import javax.swing.*;
+import java.util.ArrayList;
+import java.util.List;
/**
* @author Denis Zhdanov
@@ -36,15 +41,88 @@ public class MoveArrangementRuleUpAction extends AnAction implements DumbAware {
@Override
public void update(AnActionEvent e) {
- Function function = ArrangementConstants.UPDATE_MOVE_RULE_FUNCTION_KEY.getData(e.getDataContext());
- e.getPresentation().setEnabled(function != null && function.fun(true));
+ ArrangementMatchingRulesControl control = ArrangementConstants.MATCHING_RULES_CONTROL_KEY.getData(e.getDataContext());
+ if (control == null) {
+ e.getPresentation().setEnabled(false);
+ return;
+ }
+
+ TIntArrayList rows = control.getSelectedModelRows();
+ int top = -1;
+ for (int i = 0; i < rows.size(); i++) {
+ int row = rows.get(i);
+ if (row == top + 1) {
+ top++;
+ }
+ else {
+ e.getPresentation().setEnabled(true);
+ return;
+ }
+ }
+ e.getPresentation().setEnabled(false);
}
@Override
public void actionPerformed(AnActionEvent e) {
- Consumer function = ArrangementConstants.MOVE_RULE_FUNCTION_KEY.getData(e.getDataContext());
- if (function != null) {
- function.consume(true);
+ final ArrangementMatchingRulesControl control = ArrangementConstants.MATCHING_RULES_CONTROL_KEY.getData(e.getDataContext());
+ if (control == null) {
+ return;
}
+
+ final int editing = control.getEditingRow() - 1;
+
+ control.runOperationIgnoreSelectionChange(new Runnable() {
+ @Override
+ public void run() {
+ control.hideEditor();
+ final List mappings = new ArrayList();
+ TIntArrayList rows = control.getSelectedModelRows();
+ rows.reverse();
+ int top = -1;
+ for (int i = 0; i < rows.size(); i++) {
+ int row = rows.get(i);
+ if (row == top + 1) {
+ mappings.add(new int[] { row, row });
+ top++;
+ }
+ else {
+ mappings.add(new int[]{ row, row - 1 });
+ }
+ }
+
+ if (mappings.isEmpty()) {
+ return;
+ }
+
+ int newRowToEdit = editing;
+ ArrangementMatchingRulesModel model = control.getModel();
+ Object value;
+ int from;
+ int to;
+ for (int[] pair : mappings) {
+ from = pair[0];
+ to = pair[1];
+ if (from != to) {
+ value = model.getElementAt(from);
+ model.removeRow(from);
+ model.insert(to, value);
+ if (newRowToEdit == from) {
+ newRowToEdit = to;
+ }
+ }
+ }
+
+ ListSelectionModel selectionModel = control.getSelectionModel();
+ for (int[] pair : mappings) {
+ selectionModel.addSelectionInterval(pair[1], pair[1]);
+ }
+
+
+ if (newRowToEdit >= 0) {
+ control.showEditor(newRowToEdit);
+ }
+ }
+ });
+ control.repaintRows(0, control.getModel().getSize() - 1, true);
}
}
diff --git a/platform/lang-impl/src/com/intellij/application/options/codeStyle/arrangement/match/ArrangementMatchingRulesControl.java b/platform/lang-impl/src/com/intellij/application/options/codeStyle/arrangement/match/ArrangementMatchingRulesControl.java
index 1d45e8f73dbd..8801c99bc5f9 100644
--- a/platform/lang-impl/src/com/intellij/application/options/codeStyle/arrangement/match/ArrangementMatchingRulesControl.java
+++ b/platform/lang-impl/src/com/intellij/application/options/codeStyle/arrangement/match/ArrangementMatchingRulesControl.java
@@ -357,6 +357,9 @@ public class ArrangementMatchingRulesControl extends JBTable {
return new Rectangle(firstRect.x, firstRect.y, lastRect.width, lastRect.y + lastRect.height - firstRect.y);
}
+ /**
+ * @return selected model rows sorted in descending order
+ */
@NotNull
public TIntArrayList getSelectedModelRows() {
mySelectedRows.clear();
diff --git a/platform/lang-impl/src/com/intellij/application/options/codeStyle/arrangement/match/ArrangementMatchingRulesModel.java b/platform/lang-impl/src/com/intellij/application/options/codeStyle/arrangement/match/ArrangementMatchingRulesModel.java
index 61eec6cf55ba..2cd9318f9b41 100644
--- a/platform/lang-impl/src/com/intellij/application/options/codeStyle/arrangement/match/ArrangementMatchingRulesModel.java
+++ b/platform/lang-impl/src/com/intellij/application/options/codeStyle/arrangement/match/ArrangementMatchingRulesModel.java
@@ -48,6 +48,10 @@ public class ArrangementMatchingRulesModel extends DefaultTableModel {
public void set(int row, Object value) {
setValueAt(value, row, 0);
}
+
+ public void insert(int row, Object value) {
+ insertRow(row, new Object[] { value });
+ }
@Override
public void setValueAt(Object aValue, int row, int column) {