From 12cf6f2c5985871b93453b66cceee7640e008383 Mon Sep 17 00:00:00 2001 From: Konstantin Bulenkov Date: Fri, 13 Apr 2012 17:02:24 +0200 Subject: [PATCH] selection handlers --- .../ui/components/FixedColumnsModel.java | 10 +++++ .../ui/components/FixedRowsModel.java | 10 +++++ .../ui/components/MultiColumnList.java | 39 +++++++++++++++++++ .../ui/components/MultiColumnListModel.java | 2 + 4 files changed, 61 insertions(+) diff --git a/platform/platform-api/src/com/intellij/ui/components/FixedColumnsModel.java b/platform/platform-api/src/com/intellij/ui/components/FixedColumnsModel.java index dda70558e03b..2b16e1b426df 100644 --- a/platform/platform-api/src/com/intellij/ui/components/FixedColumnsModel.java +++ b/platform/platform-api/src/com/intellij/ui/components/FixedColumnsModel.java @@ -44,4 +44,14 @@ public class FixedColumnsModel extends MultiColumnListModel { final int columns = getColumnCount(); return columns == 0 ? -1 : row * columns + column; } + + @Override + public int getColumn(int listIndex) { + return listIndex % myMaxColumns; + } + + @Override + public int getRow(int listIndex) { + return listIndex / myMaxColumns; + } } diff --git a/platform/platform-api/src/com/intellij/ui/components/FixedRowsModel.java b/platform/platform-api/src/com/intellij/ui/components/FixedRowsModel.java index 45043e514c89..bef9fad1d531 100644 --- a/platform/platform-api/src/com/intellij/ui/components/FixedRowsModel.java +++ b/platform/platform-api/src/com/intellij/ui/components/FixedRowsModel.java @@ -44,4 +44,14 @@ class FixedRowsModel extends MultiColumnListModel { final int rows = getRowCount(); return rows == 0 ? -1 : column * rows + row; } + + @Override + public int getColumn(int listIndex) { + return listIndex / myMaxRows; + } + + @Override + public int getRow(int listIndex) { + return listIndex % myMaxRows; + } } diff --git a/platform/platform-api/src/com/intellij/ui/components/MultiColumnList.java b/platform/platform-api/src/com/intellij/ui/components/MultiColumnList.java index 82a7fef7a469..38d4025b3afe 100644 --- a/platform/platform-api/src/com/intellij/ui/components/MultiColumnList.java +++ b/platform/platform-api/src/com/intellij/ui/components/MultiColumnList.java @@ -19,6 +19,7 @@ import javax.swing.*; import javax.swing.border.Border; import javax.swing.table.TableCellRenderer; import java.awt.*; +import java.awt.event.KeyEvent; /** * @author Konstantin Bulenkov @@ -60,6 +61,44 @@ public class MultiColumnList extends JTable { getColumnModel().setColumnMargin(0); } + @Override + protected void processKeyEvent(KeyEvent e) { + final int key = e.getKeyCode(); + final int col = getSelectedColumn(); + final int row = getSelectedRow(); + final MultiColumnListModel model = getModel(); + int r = row; + int c = col; + if (key == KeyEvent.VK_RIGHT) { + if (c + 1 < getColumnCount()) { + c++; + } + } else if (key == KeyEvent.VK_DOWN) { + if (r + 1 < getRowCount()) { + r++; + if (model.toListIndex(r, c ) >= model.getSize()) { + r = 0; c++; + } + } else { + r = 0; c++; + } + } + if (col != c || row != r) { + if (e.getID() == KeyEvent.KEY_RELEASED) return; + int index = model.toListIndex(r, c); + if (index >= model.getSize() || r >= getRowCount() || c >= getColumnCount()) { + e.consume(); + final int last = model.getSize() - 1; + changeSelection(model.getRow(last), model.getColumn(last), false, false); + } else { + changeSelection(r, c, false, false); + e.consume(); + } + } else { + super.processKeyEvent(e); + } + } + public MultiColumnList(Object...elements) { this(createListModel(elements)); } diff --git a/platform/platform-api/src/com/intellij/ui/components/MultiColumnListModel.java b/platform/platform-api/src/com/intellij/ui/components/MultiColumnListModel.java index a3189213d09a..8ee7ce055c44 100644 --- a/platform/platform-api/src/com/intellij/ui/components/MultiColumnListModel.java +++ b/platform/platform-api/src/com/intellij/ui/components/MultiColumnListModel.java @@ -32,6 +32,8 @@ public abstract class MultiColumnListModel extends AbstractTableModel implements } public abstract int toListIndex(int row, int column); + public abstract int getColumn(int listIndex); + public abstract int getRow(int listIndex); public int getSize() { return myModel.getSize();