From 2dc9fb446f80fa9d071c210ffebdd3a5abd8da04 Mon Sep 17 00:00:00 2001 From: Sergey Savenko Date: Wed, 6 Aug 2014 18:33:29 +0400 Subject: [PATCH] JBTable: KeyEvents and focus transfer to cell editors --- .../src/com/intellij/ui/table/JBTable.java | 38 +++++++--- .../util/ui/JTableCellEditorHelper.java | 76 ------------------- 2 files changed, 29 insertions(+), 85 deletions(-) delete mode 100644 platform/platform-api/src/com/intellij/util/ui/JTableCellEditorHelper.java diff --git a/platform/platform-api/src/com/intellij/ui/table/JBTable.java b/platform/platform-api/src/com/intellij/ui/table/JBTable.java index 435c4358959f..8b801d11970f 100644 --- a/platform/platform-api/src/com/intellij/ui/table/JBTable.java +++ b/platform/platform-api/src/com/intellij/ui/table/JBTable.java @@ -52,7 +52,6 @@ public class JBTable extends JTable implements ComponentWithEmptyText, Component private Integer myMinRowHeight; private boolean myStriped; - private boolean isTypeAhead = true; private AsyncProcessIcon myBusyIcon; private boolean myBusy; @@ -69,6 +68,8 @@ public class JBTable extends JTable implements ComponentWithEmptyText, Component public JBTable(final TableModel model, final TableColumnModel columnModel) { super(model, columnModel); + setSurrendersFocusOnKeystroke(true); + myEmptyText = new StatusText(this) { @Override protected boolean isStatusVisible() { @@ -449,20 +450,43 @@ public class JBTable extends JTable implements ComponentWithEmptyText, Component add(editorComp); editorComp.validate(); - IdeFocusManager.findInstanceByComponent(this).requestFocus(editorComp, false); + if (surrendersFocusOnKeyStroke()) { + // this replaces focus request in JTable.processKeyBinding + final IdeFocusManager focusManager = IdeFocusManager.findInstanceByComponent(this); + focusManager.setTypeaheadEnabled(false); + focusManager.requestFocus(editorComp, false).doWhenProcessed(new Runnable() { + @Override + public void run() { + focusManager.setTypeaheadEnabled(true); + } + }); + } setCellEditor(editor); setEditingRow(row); setEditingColumn(column); editor.addCellEditorListener(this); - if (isTypeAhead) { - JTableCellEditorHelper.typeAhead(this, e, row, column); - } + return true; } return false; } + /** + * Always returns false. + * If you're interested in value of JTable.surrendersFocusOnKeystroke property, call JBTable.surrendersFocusOnKeyStroke() + * @return false + * @see #surrendersFocusOnKeyStroke + */ + @Override + public boolean getSurrendersFocusOnKeystroke() { + return false; // prevents JTable.processKeyBinding from requesting editor component to be focused + } + + public boolean surrendersFocusOnKeyStroke() { + return super.getSurrendersFocusOnKeystroke(); + } + private static boolean isTableDecorationSupported() { return UIUtil.isUnderAlloyLookAndFeel() || UIUtil.isUnderNativeMacLookAndFeel() @@ -472,10 +496,6 @@ public class JBTable extends JTable implements ComponentWithEmptyText, Component || UIUtil.isUnderWindowsLookAndFeel(); } - public void disableTypeAheadInCellEditors() { - isTypeAhead = false; - } - @NotNull @Override public Component prepareRenderer(@NotNull TableCellRenderer renderer, int row, int column) { diff --git a/platform/platform-api/src/com/intellij/util/ui/JTableCellEditorHelper.java b/platform/platform-api/src/com/intellij/util/ui/JTableCellEditorHelper.java deleted file mode 100644 index 733fec87e0b6..000000000000 --- a/platform/platform-api/src/com/intellij/util/ui/JTableCellEditorHelper.java +++ /dev/null @@ -1,76 +0,0 @@ -/* - * Copyright 2000-2011 JetBrains s.r.o. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.intellij.util.ui; - -import com.intellij.ide.DataManager; -import com.intellij.openapi.actionSystem.CommonDataKeys; -import com.intellij.openapi.actionSystem.PlatformDataKeys; -import com.intellij.openapi.editor.Editor; - -import javax.swing.*; -import java.awt.*; -import java.awt.event.KeyEvent; -import java.util.EventObject; - -/** - * @author Konstantin Bulenkov - */ -public class JTableCellEditorHelper { - private JTableCellEditorHelper() {} - - public static void typeAhead(final JTable table, final EventObject e, final int row, final int column) { - if (e instanceof KeyEvent) { - final Runnable r = new Runnable() { - @Override - public void run() { - if (table.getEditingColumn() != column && table.getEditingRow() != row) return; - - Component focusOwner = KeyboardFocusManager.getCurrentKeyboardFocusManager().getFocusOwner(); - if (focusOwner == null || !SwingUtilities.isDescendingFrom(focusOwner, table)) return; - - KeyEvent keyEvent = (KeyEvent)e; - if (Character.isDefined(keyEvent.getKeyChar())) { - try { - selectAll(focusOwner); - - Robot r = new Robot(); - r.keyPress(keyEvent.getKeyCode()); - r.keyRelease(keyEvent.getKeyCode()); - } - catch (AWTException e1) { - return; - } - } else { - selectAll(focusOwner); - } - } - }; - - SwingUtilities.invokeLater(r); - } - } - - private static void selectAll(Component component) { - if (component instanceof TextComponent) { - ((TextComponent)component).selectAll(); - } else { - Editor editor = CommonDataKeys.EDITOR.getData(DataManager.getInstance().getDataContext(component)); - if (editor != null) { - editor.getSelectionModel().setSelection(0, editor.getDocument().getTextLength()); - } - } - } -}