mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-27 10:03:11 +07:00
JBTable: KeyEvents and focus transfer to cell editors
This commit is contained in:
@@ -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) {
|
||||
|
||||
@@ -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());
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user