# HG changeset patch # User alexsch # Date 1357735928 -14400 # Node ID e9db4be293240a7bf840cee137de7772cc6c9ca9 # Parent a41ada2ed4ef735449531c6ebe6cec593d890a1c 8005019: JTable passes row index instead of length when inserts selection interval Reviewed-by: serb, denis diff -r a41ada2ed4ef -r e9db4be29324 jdk/src/share/classes/javax/swing/JTable.java --- a/jdk/src/share/classes/javax/swing/JTable.java Wed Jul 05 18:34:52 2017 +0200 +++ b/jdk/src/share/classes/javax/swing/JTable.java Wed Jan 09 16:52:08 2013 +0400 @@ -3953,7 +3953,7 @@ break; case TableModelEvent.INSERT: modelSelection.insertIndexInterval(change.startModelIndex, - change.endModelIndex, + change.length, true); break; default: diff -r a41ada2ed4ef -r e9db4be29324 jdk/test/javax/swing/JTable/8005019/bug8005019.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/javax/swing/JTable/8005019/bug8005019.java Wed Jan 09 16:52:08 2013 +0400 @@ -0,0 +1,103 @@ +/* + * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +/* @test + * @bug 8005019 + * @summary JTable passes row index instead of length when inserts selection interval + * @author Alexander Scherbatiy + * @run main bug8005019 + */ + +import java.util.*; +import javax.swing.*; +import javax.swing.table.*; + +public class bug8005019 { + + public static void main(String[] args) throws Exception { + SwingUtilities.invokeAndWait(new Runnable() { + + @Override + public void run() { + testSelectionWithFilterTable(); + } + }); + } + + private static void testSelectionWithFilterTable() { + DefaultTableModel model = new DefaultTableModel(0, 1); + // a model with 3 elements is the minimum to demonstrate + // the bug + int last = 2; + for (int i = 0; i <= last; i++) { + model.addRow(new Object[]{i}); + } + JTable table = new JTable(model); + table.setAutoCreateRowSorter(true); + // set selection at the end + table.setRowSelectionInterval(last, last); + // exclude rows based on identifier + RowFilter filter = new GeneralFilter(new int[]{0}); + ((DefaultRowSorter) table.getRowSorter()).setRowFilter(filter); + // insertRow _before or at_ selected model index, such that + // endIndex (in event) > 1 + model.insertRow(2, new Object[]{"x"}); + } + + private static class GeneralFilter extends RowFilter { + + private int[] columns; + List excludes = Arrays.asList(0); + + GeneralFilter(int[] columns) { + this.columns = columns; + } + + public boolean include(RowFilter.Entry value) { + int count = value.getValueCount(); + if (columns.length > 0) { + for (int i = columns.length - 1; i >= 0; i--) { + int index = columns[i]; + if (index < count) { + if (include(value, index)) { + return true; + } + } + } + } else { + while (--count >= 0) { + if (include(value, count)) { + return true; + } + } + } + return false; + } + + protected boolean include( + Entry entry, + int index) { + return !excludes.contains(entry.getIdentifier()); + } + } +}