bug6263446.java revision 11111:4ef86895869c
1/*
2 * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved.
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 *
5 * This code is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License version 2 only, as
7 * published by the Free Software Foundation.
8 *
9 * This code is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
12 * version 2 for more details (a copy is included in the LICENSE file that
13 * accompanied this code).
14 *
15 * You should have received a copy of the GNU General Public License version
16 * 2 along with this work; if not, write to the Free Software Foundation,
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
18 *
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
20 * or visit www.oracle.com if you need additional information or have any
21 * questions.
22 */
23
24/*
25 * @test
26 * @bug 6263446
27 * @summary Tests that double-clicking to edit a cell doesn't select the content.
28 * @author Shannon Hickey
29 * @run main bug6263446
30 */
31import java.awt.*;
32import java.awt.event.*;
33import javax.swing.*;
34import javax.swing.table.*;
35
36public class bug6263446 {
37
38    private static JTable table;
39    private static final String FIRST = "AAAAA";
40    private static final String SECOND = "BB";
41    private static final String ALL = FIRST + " " + SECOND;
42    private static Robot robot;
43
44    public static void main(String[] args) throws Exception {
45        robot = new Robot();
46        robot.setAutoDelay(50);
47
48        SwingUtilities.invokeAndWait(new Runnable() {
49
50            public void run() {
51                createAndShowGUI();
52            }
53        });
54
55
56        robot.waitForIdle();
57
58        Point point = getClickPoint();
59        robot.mouseMove(point.x, point.y);
60        robot.waitForIdle();
61
62        click(1);
63        robot.waitForIdle();
64        assertEditing(false);
65
66        click(2);
67        robot.waitForIdle();
68        checkSelectedText(null);
69
70        click(3);
71        robot.waitForIdle();
72        checkSelectedText(FIRST);
73
74
75        click(4);
76        robot.waitForIdle();
77        checkSelectedText(ALL);
78
79        setClickCountToStart(1);
80
81        click(1);
82        robot.waitForIdle();
83        checkSelectedText(null);
84
85        click(2);
86        robot.waitForIdle();
87        checkSelectedText(FIRST);
88
89        click(3);
90        robot.waitForIdle();
91        checkSelectedText(ALL);
92
93        setClickCountToStart(3);
94
95        click(1);
96        robot.waitForIdle();
97        assertEditing(false);
98
99        click(2);
100        robot.waitForIdle();
101        assertEditing(false);
102
103        click(3);
104        robot.waitForIdle();
105        checkSelectedText(null);
106
107        click(4);
108        robot.waitForIdle();
109        checkSelectedText(FIRST);
110
111        click(5);
112        robot.waitForIdle();
113        checkSelectedText(ALL);
114
115
116        SwingUtilities.invokeAndWait(new Runnable() {
117
118            @Override
119            public void run() {
120                table.editCellAt(0, 0);
121            }
122        });
123
124        robot.waitForIdle();
125        assertEditing(true);
126
127        click(2);
128        robot.waitForIdle();
129        checkSelectedText(FIRST);
130
131    }
132
133    private static void checkSelectedText(String sel) throws Exception {
134        assertEditing(true);
135        checkSelection(sel);
136        cancelCellEditing();
137        assertEditing(false);
138    }
139
140    private static void setClickCountToStart(final int clicks) throws Exception {
141        SwingUtilities.invokeAndWait(new Runnable() {
142
143            @Override
144            public void run() {
145                DefaultCellEditor editor =
146                        (DefaultCellEditor) table.getDefaultEditor(String.class);
147                editor.setClickCountToStart(clicks);
148            }
149        });
150
151    }
152
153    private static void cancelCellEditing() throws Exception {
154        SwingUtilities.invokeAndWait(new Runnable() {
155
156            @Override
157            public void run() {
158                table.getCellEditor().cancelCellEditing();
159            }
160        });
161    }
162
163    private static void checkSelection(final String sel) throws Exception {
164        SwingUtilities.invokeAndWait(new Runnable() {
165
166            @Override
167            public void run() {
168                DefaultCellEditor editor =
169                        (DefaultCellEditor) table.getDefaultEditor(String.class);
170                JTextField field = (JTextField) editor.getComponent();
171                String text = field.getSelectedText();
172                if (sel == null) {
173                    if (text != null && text.length() != 0) {
174                        throw new RuntimeException("Nothing should be selected,"
175                                + " but \"" + text + "\" is selected.");
176                    }
177                } else if (!sel.equals(text)) {
178                    throw new RuntimeException("\"" + sel + "\" should be "
179                            + "selected, but \"" + text + "\" is selected.");
180                }
181            }
182        });
183    }
184
185    private static void assertEditing(final boolean editing) throws Exception {
186        SwingUtilities.invokeAndWait(new Runnable() {
187
188            @Override
189            public void run() {
190                if (editing && !table.isEditing()) {
191                    throw new RuntimeException("Table should be editing");
192                }
193                if (!editing && table.isEditing()) {
194                    throw new RuntimeException("Table should not be editing");
195                }
196            }
197        });
198    }
199
200    private static Point getClickPoint() throws Exception {
201        final Point[] result = new Point[1];
202        SwingUtilities.invokeAndWait(new Runnable() {
203
204            @Override
205            public void run() {
206                Rectangle rect = table.getCellRect(0, 0, false);
207                Point point = new Point(rect.x + rect.width / 5,
208                        rect.y + rect.height / 2);
209                SwingUtilities.convertPointToScreen(point, table);
210                result[0] = point;
211            }
212        });
213
214        return result[0];
215    }
216
217    private static void click(int times) {
218        robot.delay(500);
219        for (int i = 0; i < times; i++) {
220            robot.mousePress(InputEvent.BUTTON1_MASK);
221            robot.mouseRelease(InputEvent.BUTTON1_MASK);
222        }
223    }
224
225    private static TableModel createTableModel() {
226        String[] columnNames = {"Column 0"};
227        String[][] data = {{ALL}};
228
229        return new DefaultTableModel(data, columnNames);
230    }
231
232    private static void createAndShowGUI() {
233        JFrame frame = new JFrame("bug6263446");
234        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
235        table = new JTable(createTableModel());
236        frame.add(table);
237        frame.pack();
238        frame.setVisible(true);
239    }
240}
241