public void tableKeysCanJumpTable()

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});


  }