diff --git a/src/main/java/com/googlecode/lanterna/gui2/table/Table.java b/src/main/java/com/googlecode/lanterna/gui2/table/Table.java index e33624ef5..f4f9c8579 100644 --- a/src/main/java/com/googlecode/lanterna/gui2/table/Table.java +++ b/src/main/java/com/googlecode/lanterna/gui2/table/Table.java @@ -60,7 +60,7 @@ public Table(String... columnLabels) { * Creates a new {@code Table} with the specified table model * @param tableModel Table model */ - public Table(final TableModel tableModel) { + public Table(final TableModel tableModel) { this.tableHeaderRenderer = new DefaultTableHeaderRenderer<>(); this.tableCellRenderer = new DefaultTableCellRenderer<>(); this.tableModel = tableModel; @@ -465,25 +465,45 @@ else if(escapeByArrowKey) { } else { return super.handleKeyStroke(keyStroke); } - case MOUSE_EVENT: - MouseAction action = (MouseAction)keyStroke; - MouseActionType actionType = action.getActionType(); - if (actionType == MouseActionType.MOVE) { - // do nothing + case MOUSE_EVENT: + if (!isFocused()) + { + // If table is not in focus, pass on + return super.handleKeyStroke(keyStroke); + } + + if (isMouseMove(keyStroke)) { + // do nothing return Result.UNHANDLED; - } - if (!isFocused()) { - super.handleKeyStroke(keyStroke); - } - int mouseRow = getRowByMouseAction((MouseAction) keyStroke); - int mouseColumn = getColumnByMouseAction((MouseAction) keyStroke); - boolean isDifferentCell = mouseRow != selectedRow || mouseColumn != selectedColumn; - selectedRow = mouseRow; - selectedColumn = mouseColumn; - if (isDifferentCell) { - return handleKeyStroke(new KeyStroke(KeyType.ENTER)); - } - break; + } + + MouseAction action = (MouseAction)keyStroke; + MouseActionType actionType = action.getActionType(); + + // Handle - scrolling or mouse movement + switch(actionType) + { + // do nothing, desired action has been performed already on CLICK_DOWN and DRAG + case CLICK_RELEASE : return Result.HANDLED; + + // Call ArrowUp key so same behavior is performed + case SCROLL_UP : return handleKeyStroke(new KeyStroke(KeyType.ARROW_UP)); + + // Call ArrowDown key so same behavior is performed + case SCROLL_DOWN : return handleKeyStroke(new KeyStroke(KeyType.ARROW_DOWN)); + + default : + int mouseRow = getRowByMouseAction((MouseAction) keyStroke); + int mouseColumn = getColumnByMouseAction((MouseAction) keyStroke); + boolean isDifferentCell = mouseRow != selectedRow || mouseColumn != selectedColumn; + selectedRow = mouseRow; + selectedColumn = mouseColumn; + if (!isDifferentCell) { + return handleKeyStroke(new KeyStroke(KeyType.ENTER)); + } + break; + } + break; default: return super.handleKeyStroke(keyStroke); } @@ -500,7 +520,7 @@ else if(escapeByArrowKey) { protected int getRowByMouseAction(MouseAction mouseAction) { int minPossible = getFirstViewedRowIndex(); int maxPossible = getLastViewedRowIndex(); - int mouseSpecified = mouseAction.getPosition().getRow() - getGlobalPosition().getRow() - 1; + int mouseSpecified = mouseAction.getPosition().getRow() - getGlobalPosition().getRow() + getRenderer().getViewTopRow() - 1; return Math.max(minPossible, Math.min(mouseSpecified, maxPossible)); } diff --git a/src/test/java/com/googlecode/lanterna/gui2/TableTest.java b/src/test/java/com/googlecode/lanterna/gui2/TableTest.java index ad532d46e..ef4052fad 100644 --- a/src/test/java/com/googlecode/lanterna/gui2/TableTest.java +++ b/src/test/java/com/googlecode/lanterna/gui2/TableTest.java @@ -18,21 +18,24 @@ */ package com.googlecode.lanterna.gui2; +import java.io.IOException; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.regex.Pattern; + import com.googlecode.lanterna.SGR; import com.googlecode.lanterna.TextColor; -import com.googlecode.lanterna.gui2.dialogs.*; +import com.googlecode.lanterna.gui2.dialogs.ActionListDialogBuilder; +import com.googlecode.lanterna.gui2.dialogs.ListSelectDialogBuilder; +import com.googlecode.lanterna.gui2.dialogs.MessageDialog; +import com.googlecode.lanterna.gui2.dialogs.TextInputDialogBuilder; import com.googlecode.lanterna.gui2.table.DefaultTableCellRenderer; import com.googlecode.lanterna.gui2.table.DefaultTableRenderer; import com.googlecode.lanterna.gui2.table.Table; import com.googlecode.lanterna.gui2.table.TableCellBorderStyle; import com.googlecode.lanterna.gui2.table.TableModel; -import java.io.IOException; -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; -import java.util.regex.Pattern; - /** * Test for the Table component */ @@ -62,6 +65,34 @@ protected void applyStyle(Table table, String cell, int columnIndex, int } } }); + table.setSelectAction(new Runnable() { + public void run() + { + int rowIdx = table.getSelectedRow(); + if (table.getTableModel().getRowCount() > 0) + { + List row = table.getTableModel().getRow(rowIdx); + if (row != null) + { + StringBuilder sb = new StringBuilder(); + sb.append(String.format("Row Selected(%d)->", rowIdx + 1)); + + int rows = table.getTableModel().getColumnCount(); + for (int idx = 0; idx 0) sb.append("->"); + sb.append(String.format("Col%d:[%s]", idx + 1, row.get(idx))); + } + sb.append(System.lineSeparator()); + + System.out.print(sb.toString()); + + MessageDialog.showMessageDialog(textGUI, "Selected Row Data", sb.toString()); + } + } + } + }); + final TableModel model = table.getTableModel(); for (int i = 1; i < 30; i++) { model.addRow("Row" + i, "Row" + i, "Row" + i);