in android/editors.strings/testSrc/com/android/tools/idea/editors/strings/table/FrozenColumnTableTest.java [83:296]
public void tableKeysCanJumpTable() {
Object[][] data = new Object[][] {
new Object[]{"east", "app/src/main/res", false, "east", "est", "øst"},
new Object[]{"west", "app/src/main/res", false, "west", "ouest", "vest"},
new Object[]{"north", "app/src/main/res", false, "north", "nord", "nord"},
new Object[]{"south", "app/src/main/res", false, "south", "sud", "syd"}
};
Object[] columns = new Object[]{"Key", "Resource Folder", "Untranslatable", "Default Value", "French (fr)", "Danish (da)"};
DefaultTableModel model = new DefaultTableModel(data, columns);
FrozenColumnTable<DefaultTableModel> frozenColumnTable = new FrozenColumnTable<>(model, 4);
JTable frozenTable = frozenColumnTable.getFrozenTable();
JTable scrollableTable = frozenColumnTable.getScrollableTable();
frozenTable.createDefaultColumnsFromModel();
scrollableTable.createDefaultColumnsFromModel();
JPanel panel = new JPanel(new BorderLayout());
panel.add(frozenTable, BorderLayout.CENTER);
panel.add(frozenColumnTable.getScrollPane(), BorderLayout.WEST);
FakeUi ui = new FakeUi(panel, 1.0, true, myRule.getDisposable());
FakeKeyboardFocusManager focusManager = new FakeKeyboardFocusManager(myRule.getDisposable());
focusManager.setFocusOwner(frozenColumnTable.getFrozenTable());
moveTo(frozenColumnTable, 1, 3);
assertThat(getRowSelection(frozenColumnTable)).isEqualTo(new int[]{1});
assertThat(getColumnSelection(frozenColumnTable)).isEqualTo(new int[]{3});
// Move right jumps to scrollable table:
ui.keyboard.pressAndRelease(KeyEvent.VK_RIGHT);
assertThat(focusManager.getFocusOwner()).isSameAs(scrollableTable);
assertThat(getRowSelection(frozenColumnTable)).isEqualTo(new int[]{1});
assertThat(getColumnSelection(frozenColumnTable)).isEqualTo(new int[]{4});
// Move left jumps to frozen table:
ui.keyboard.pressAndRelease(KeyEvent.VK_LEFT);
assertThat(focusManager.getFocusOwner()).isSameAs(frozenTable);
assertThat(getRowSelection(frozenColumnTable)).isEqualTo(new int[]{1});
assertThat(getColumnSelection(frozenColumnTable)).isEqualTo(new int[]{3});
// Move to end jumps to scrollable table:
ui.keyboard.pressAndRelease(KeyEvent.VK_END);
assertThat(focusManager.getFocusOwner()).isSameAs(scrollableTable);
assertThat(getRowSelection(frozenColumnTable)).isEqualTo(new int[]{1});
assertThat(getColumnSelection(frozenColumnTable)).isEqualTo(new int[]{5});
// Move to the right is a noop:
ui.keyboard.pressAndRelease(KeyEvent.VK_RIGHT);
assertThat(focusManager.getFocusOwner()).isSameAs(scrollableTable);
assertThat(getRowSelection(frozenColumnTable)).isEqualTo(new int[]{1});
assertThat(getColumnSelection(frozenColumnTable)).isEqualTo(new int[]{5});
// Move to home jumps to frozen table:
ui.keyboard.pressAndRelease(KeyEvent.VK_HOME);
assertThat(focusManager.getFocusOwner()).isSameAs(frozenTable);
assertThat(getRowSelection(frozenColumnTable)).isEqualTo(new int[]{1});
assertThat(getColumnSelection(frozenColumnTable)).isEqualTo(new int[]{0});
// Select a range of rows:
moveTo(frozenColumnTable, 1, 3);
ui.keyboard.press(KeyEvent.VK_SHIFT);
ui.keyboard.pressAndRelease(KeyEvent.VK_DOWN);
ui.keyboard.pressAndRelease(KeyEvent.VK_DOWN);
ui.keyboard.release(KeyEvent.VK_SHIFT);
assertThat(getRowSelection(frozenColumnTable)).isEqualTo(new int[]{1, 2, 3});
assertThat(getColumnSelection(frozenColumnTable)).isEqualTo(new int[]{3});
// Move right extending the selection jumps to scrollable table:
ui.keyboard.press(KeyEvent.VK_SHIFT);
ui.keyboard.pressAndRelease(KeyEvent.VK_RIGHT);
ui.keyboard.release(KeyEvent.VK_SHIFT);
assertThat(focusManager.getFocusOwner()).isSameAs(scrollableTable);
assertThat(getRowSelection(frozenColumnTable)).isEqualTo(new int[]{1, 2, 3});
assertThat(getColumnSelection(frozenColumnTable)).isEqualTo(new int[]{3, 4});
// Move left extending the selection jumps to frozen table:
ui.keyboard.press(KeyEvent.VK_SHIFT);
ui.keyboard.pressAndRelease(KeyEvent.VK_LEFT);
ui.keyboard.release(KeyEvent.VK_SHIFT);
assertThat(focusManager.getFocusOwner()).isSameAs(frozenTable);
assertThat(getRowSelection(frozenColumnTable)).isEqualTo(new int[]{1, 2, 3});
assertThat(getColumnSelection(frozenColumnTable)).isEqualTo(new int[]{3});
// Move to end extending the selection jumps to scrollable table:
ui.keyboard.press(KeyEvent.VK_SHIFT);
ui.keyboard.pressAndRelease(KeyEvent.VK_END);
ui.keyboard.release(KeyEvent.VK_SHIFT);
assertThat(focusManager.getFocusOwner()).isSameAs(scrollableTable);
assertThat(getRowSelection(frozenColumnTable)).isEqualTo(new int[]{1, 2, 3});
assertThat(getColumnSelection(frozenColumnTable)).isEqualTo(new int[]{3, 4, 5});
// Move to home jumps to frozen table:
ui.keyboard.press(KeyEvent.VK_SHIFT);
ui.keyboard.pressAndRelease(KeyEvent.VK_HOME);
ui.keyboard.release(KeyEvent.VK_SHIFT);
assertThat(focusManager.getFocusOwner()).isSameAs(frozenTable);
assertThat(getRowSelection(frozenColumnTable)).isEqualTo(new int[]{1, 2, 3});
assertThat(getColumnSelection(frozenColumnTable)).isEqualTo(new int[]{3, 2, 1, 0});
// Select a new range of rows with the lead on the top:
ui.keyboard.pressAndRelease(KeyEvent.VK_RIGHT);
ui.keyboard.pressAndRelease(KeyEvent.VK_RIGHT);
ui.keyboard.pressAndRelease(KeyEvent.VK_RIGHT);
ui.keyboard.pressAndRelease(KeyEvent.VK_UP);
ui.keyboard.press(KeyEvent.VK_SHIFT);
ui.keyboard.pressAndRelease(KeyEvent.VK_UP);
ui.keyboard.pressAndRelease(KeyEvent.VK_UP);
ui.keyboard.release(KeyEvent.VK_SHIFT);
assertThat(focusManager.getFocusOwner()).isSameAs(frozenTable);
assertThat(getRowSelection(frozenColumnTable)).isEqualTo(new int[]{2, 1, 0});
assertThat(getColumnSelection(frozenColumnTable)).isEqualTo(new int[]{3});
// Move right extending the selection jumps to scrollable table:
ui.keyboard.press(KeyEvent.VK_SHIFT);
ui.keyboard.pressAndRelease(KeyEvent.VK_RIGHT);
ui.keyboard.release(KeyEvent.VK_SHIFT);
assertThat(focusManager.getFocusOwner()).isSameAs(scrollableTable);
assertThat(getRowSelection(frozenColumnTable)).isEqualTo(new int[]{2, 1, 0});
assertThat(getColumnSelection(frozenColumnTable)).isEqualTo(new int[]{3, 4});
// Move left extending the selection jumps to frozen table:
ui.keyboard.press(KeyEvent.VK_SHIFT);
ui.keyboard.pressAndRelease(KeyEvent.VK_LEFT);
ui.keyboard.release(KeyEvent.VK_SHIFT);
assertThat(focusManager.getFocusOwner()).isSameAs(frozenTable);
assertThat(getRowSelection(frozenColumnTable)).isEqualTo(new int[]{2, 1, 0});
assertThat(getColumnSelection(frozenColumnTable)).isEqualTo(new int[]{3});
// Move to end extending the selection jumps to scrollable table:
ui.keyboard.press(KeyEvent.VK_SHIFT);
ui.keyboard.pressAndRelease(KeyEvent.VK_END);
ui.keyboard.release(KeyEvent.VK_SHIFT);
assertThat(focusManager.getFocusOwner()).isSameAs(scrollableTable);
assertThat(getRowSelection(frozenColumnTable)).isEqualTo(new int[]{2, 1, 0});
assertThat(getColumnSelection(frozenColumnTable)).isEqualTo(new int[]{3, 4, 5});
// Move to home jumps to frozen table:
ui.keyboard.press(KeyEvent.VK_SHIFT);
ui.keyboard.pressAndRelease(KeyEvent.VK_HOME);
ui.keyboard.release(KeyEvent.VK_SHIFT);
assertThat(focusManager.getFocusOwner()).isSameAs(frozenTable);
assertThat(getRowSelection(frozenColumnTable)).isEqualTo(new int[]{2, 1, 0});
assertThat(getColumnSelection(frozenColumnTable)).isEqualTo(new int[]{3, 2, 1, 0});
// Move to the right should select a single cell:
ui.keyboard.pressAndRelease(KeyEvent.VK_RIGHT);
assertThat(focusManager.getFocusOwner()).isSameAs(frozenTable);
assertThat(getRowSelection(frozenColumnTable)).isEqualTo(new int[]{0});
assertThat(getColumnSelection(frozenColumnTable)).isEqualTo(new int[]{1});
// Select columns from both tables:
ui.keyboard.press(KeyEvent.VK_SHIFT);
ui.keyboard.pressAndRelease(KeyEvent.VK_RIGHT);
ui.keyboard.pressAndRelease(KeyEvent.VK_RIGHT);
ui.keyboard.pressAndRelease(KeyEvent.VK_RIGHT);
ui.keyboard.release(KeyEvent.VK_SHIFT);
assertThat(focusManager.getFocusOwner()).isSameAs(scrollableTable);
assertThat(getRowSelection(frozenColumnTable)).isEqualTo(new int[]{0});
assertThat(getColumnSelection(frozenColumnTable)).isEqualTo(new int[]{1, 2, 3, 4});
// Move down removes column selection:
ui.keyboard.pressAndRelease(KeyEvent.VK_DOWN);
assertThat(focusManager.getFocusOwner()).isSameAs(scrollableTable);
assertThat(getRowSelection(frozenColumnTable)).isEqualTo(new int[]{1});
assertThat(getColumnSelection(frozenColumnTable)).isEqualTo(new int[]{4});
// Select columns from both tables:
ui.keyboard.press(KeyEvent.VK_SHIFT);
ui.keyboard.pressAndRelease(KeyEvent.VK_LEFT);
ui.keyboard.pressAndRelease(KeyEvent.VK_LEFT);
ui.keyboard.release(KeyEvent.VK_SHIFT);
assertThat(focusManager.getFocusOwner()).isSameAs(frozenTable);
assertThat(getRowSelection(frozenColumnTable)).isEqualTo(new int[]{1});
assertThat(getColumnSelection(frozenColumnTable)).isEqualTo(new int[]{4, 3, 2});
// Move down removes column selection:
ui.keyboard.pressAndRelease(KeyEvent.VK_UP);
assertThat(focusManager.getFocusOwner()).isSameAs(frozenTable);
assertThat(getRowSelection(frozenColumnTable)).isEqualTo(new int[]{0});
assertThat(getColumnSelection(frozenColumnTable)).isEqualTo(new int[]{2});
// Select columns from both tables:
ui.keyboard.press(KeyEvent.VK_SHIFT);
ui.keyboard.pressAndRelease(KeyEvent.VK_RIGHT);
ui.keyboard.pressAndRelease(KeyEvent.VK_RIGHT);
ui.keyboard.pressAndRelease(KeyEvent.VK_RIGHT);
ui.keyboard.release(KeyEvent.VK_SHIFT);
assertThat(focusManager.getFocusOwner()).isSameAs(scrollableTable);
assertThat(getRowSelection(frozenColumnTable)).isEqualTo(new int[]{0});
assertThat(getColumnSelection(frozenColumnTable)).isEqualTo(new int[]{2, 3, 4, 5});
// Move down to last row removes column selection:
ui.keyboard.press(KeyEvent.VK_CONTROL);
ui.keyboard.pressAndRelease(KeyEvent.VK_END);
ui.keyboard.release(KeyEvent.VK_CONTROL);
assertThat(focusManager.getFocusOwner()).isSameAs(scrollableTable);
assertThat(getRowSelection(frozenColumnTable)).isEqualTo(new int[]{3});
assertThat(getColumnSelection(frozenColumnTable)).isEqualTo(new int[]{5});
// Select columns from both tables:
ui.keyboard.press(KeyEvent.VK_SHIFT);
ui.keyboard.pressAndRelease(KeyEvent.VK_LEFT);
ui.keyboard.pressAndRelease(KeyEvent.VK_LEFT);
ui.keyboard.release(KeyEvent.VK_SHIFT);
assertThat(focusManager.getFocusOwner()).isSameAs(frozenTable);
assertThat(getRowSelection(frozenColumnTable)).isEqualTo(new int[]{3});
assertThat(getColumnSelection(frozenColumnTable)).isEqualTo(new int[]{5, 4, 3});
// Move up to first row removes column selection:
ui.keyboard.press(KeyEvent.VK_CONTROL);
ui.keyboard.pressAndRelease(KeyEvent.VK_HOME);
ui.keyboard.release(KeyEvent.VK_CONTROL);
assertThat(focusManager.getFocusOwner()).isSameAs(frozenTable);
assertThat(getRowSelection(frozenColumnTable)).isEqualTo(new int[]{0});
assertThat(getColumnSelection(frozenColumnTable)).isEqualTo(new int[]{3});
}