From 43e52f87a93578c8fe09c8e5491f554fe72ce52a Mon Sep 17 00:00:00 2001 From: duke Date: Fri, 27 Dec 2024 11:36:57 +0000 Subject: [PATCH] Backport d3a79b5861be27227b8c28cb3acdce089b74c50b --- .../swing/AbstractDocument/bug4549069.java | 124 +++++++++++++ .../swing/AbstractWriter/bug4185537.java | 140 +++++++++++++++ .../DefaultTableCellRenderer/bug4240870.java | 93 ++++++++++ .../javax/swing/JTableHeader/bug4243927.java | 45 +++++ .../javax/swing/LookAndFeel/bug4736093.java | 167 ++++++++++++++++++ 5 files changed, 569 insertions(+) create mode 100644 test/jdk/javax/swing/AbstractDocument/bug4549069.java create mode 100644 test/jdk/javax/swing/AbstractWriter/bug4185537.java create mode 100644 test/jdk/javax/swing/DefaultTableCellRenderer/bug4240870.java create mode 100644 test/jdk/javax/swing/JTableHeader/bug4243927.java create mode 100644 test/jdk/javax/swing/LookAndFeel/bug4736093.java diff --git a/test/jdk/javax/swing/AbstractDocument/bug4549069.java b/test/jdk/javax/swing/AbstractDocument/bug4549069.java new file mode 100644 index 00000000000..472830399ee --- /dev/null +++ b/test/jdk/javax/swing/AbstractDocument/bug4549069.java @@ -0,0 +1,124 @@ +/* + * Copyright (c) 2001, 2023, 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 4549069 + * @summary Tests if javax.swing.text.AbstractDocument.BranchElement.getEndOffset() throws AIOOBE + * @key headful + */ + +import java.awt.Point; +import java.awt.Robot; +import java.awt.event.InputEvent; +import java.awt.event.KeyAdapter; +import java.awt.event.KeyEvent; +import java.awt.event.WindowAdapter; +import java.awt.event.WindowEvent; +import java.util.Timer; +import java.util.TimerTask; +import javax.swing.JFrame; +import javax.swing.JTextArea; +import javax.swing.SwingUtilities; +import javax.swing.text.DefaultStyledDocument; +import javax.swing.undo.UndoManager; + +public class bug4549069 { + static Timer timer; + static volatile Point p; + + static JFrame f; + static JTextArea jta; + static UndoManager um; + static Robot robot; + + public static void main(String[] argv) throws Exception { + robot = new Robot(); + try { + SwingUtilities.invokeAndWait(() -> { + f = new JFrame("bug4549069"); + f.addWindowListener(new TestStateListener()); + + jta = new JTextArea(); + um = new UndoManager(); + jta.setDocument(new DefaultStyledDocument()); + jta.getDocument().addUndoableEditListener(um); + + String text = "Press Ctrl-Z (undo) to get\n" + + "a stacktrace U shouldn't XX\n"; + jta.setText(text); + + jta.addKeyListener(new KeyAdapter() { + public void keyPressed(KeyEvent e) { + if (um.canUndo()) { + um.undo(); + } + } + }); + + f.getContentPane().add(jta); + f.pack(); + f.setVisible(true); + }); + + robot.waitForIdle(); + robot.delay(1000); + } finally { + if (f != null) { + SwingUtilities.invokeAndWait(() -> { + f.dispose(); + }); + } + } + } + + static class TestStateListener extends WindowAdapter { + public void windowOpened(WindowEvent ev) { + timer = new Timer(); + timer.schedule(new RobotTask(), 1000); + } + } + + static class RobotTask extends TimerTask { + public void run() { + try { + SwingUtilities.invokeAndWait(() -> { + p = jta.getLocationOnScreen(); + }); + } catch (Exception e) { + throw new RuntimeException("Could not get location"); + + } + robot.mouseMove(p.x, p.y); + robot.waitForIdle(); + + robot.mousePress(InputEvent.BUTTON1_DOWN_MASK); + robot.mouseRelease(InputEvent.BUTTON1_DOWN_MASK); + robot.waitForIdle(); + + robot.keyPress(KeyEvent.VK_SPACE); + robot.keyRelease(KeyEvent.VK_SPACE); + robot.waitForIdle(); + } + } +} diff --git a/test/jdk/javax/swing/AbstractWriter/bug4185537.java b/test/jdk/javax/swing/AbstractWriter/bug4185537.java new file mode 100644 index 00000000000..3425f12a83a --- /dev/null +++ b/test/jdk/javax/swing/AbstractWriter/bug4185537.java @@ -0,0 +1,140 @@ +/* + * Copyright (c) 1998, 2023, 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 4185537 + * @summary javax.swing.text.AbstractWriter: TOTAL REWRITE COMPLETE. + */ + +import java.io.IOException; +import java.io.StringWriter; +import java.io.Writer; +import javax.swing.text.AbstractWriter; +import javax.swing.text.BadLocationException; +import javax.swing.text.DefaultStyledDocument; +import javax.swing.text.Document; + +public class bug4185537 { + static char[] chars = {'a', 'b', 'c', 'd', 'e'}; + static StringWriter wr = new StringWriter(); + + public static void main(String[] argv) { + DefaultStyledDocument doc = new DefaultStyledDocument(); + + SimpleWriter sw = new SimpleWriter(wr, doc, 5, 200); + sw.test_getWriter(); + + if (sw.getStartOffset() != 5) { + throw new RuntimeException("getStartOffset fails..."); + } + if (sw.getEndOffset() != 205) { + throw new RuntimeException("getEndOffset fails..."); + } + + sw.setLineSeparator("+"); + if (!sw.getLineSeparator().equals("+")) { + throw new RuntimeException("Doesn't set line separator correctly..."); + } + sw.test_writeLineSeparator(); + + sw.test_write_output(); + sw.test_CurrentLineLength(); + sw.test_getLineLength(); + sw.test_getIndentLevel(); + sw.test_CanWrapLines(); + if (!wr.toString().equals("+abcde")) { + throw new RuntimeException("Test fails..."); + } + try { + wr.close(); + } catch (Exception e) { + System.out.println("Exception..."); + } + } + + static class SimpleWriter extends AbstractWriter { + + public SimpleWriter(Writer w, Document d, int pos, int len) { + super(w, d, pos, len); + } + + void test_writeLineSeparator() { + try { + writeLineSeparator(); + } catch (IOException e) { + e.printStackTrace(); + throw new RuntimeException("writeLineSeparator fails..."); + } + } + + void test_getWriter() { + if (getWriter() != wr) throw new RuntimeException("Writer gets incorrect..."); + } + + void test_CurrentLineLength() { + setCurrentLineLength(0); + if (getCurrentLineLength() != 0) throw new RuntimeException("Doesn't set CurrentLineLength..."); + if (!isLineEmpty()) { + throw new RuntimeException("isLineEmpty() should return false..."); + } + } + + void test_getLineLength() { + setLineLength(80); + if (getLineLength() != 80) { + throw new RuntimeException("Default line length doesn't set..."); + } + } + + void test_CanWrapLines() { + setCanWrapLines(true); + if (!getCanWrapLines()) { + throw new RuntimeException("Doesn't set wrapping lines correctly"); + } + } + + void test_getIndentLevel() { + incrIndent(); + if (getIndentLevel() != 1) { + throw new RuntimeException("getIndentLevel() fails..."); + } + } + + void test_write_output() { + try { + write(chars, 0, 3); + } catch (IOException e) { + throw new RuntimeException("write(char[], int, int): unexpected IOException..."); + } + try { + output(chars, 3, 2); + } catch (IOException e) { + throw new RuntimeException("output(char[], int, int): unexpected IOException..."); + } + } + + public void write() throws IOException, BadLocationException { + } + } +} diff --git a/test/jdk/javax/swing/DefaultTableCellRenderer/bug4240870.java b/test/jdk/javax/swing/DefaultTableCellRenderer/bug4240870.java new file mode 100644 index 00000000000..7b032e65940 --- /dev/null +++ b/test/jdk/javax/swing/DefaultTableCellRenderer/bug4240870.java @@ -0,0 +1,93 @@ +/* + * Copyright (c) 1999, 2023, 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 4240870 4240855 + * @summary Tests that DefaultTableCellRenderer overrides following methods: + * validate() + * revalidate() + * repaint(long, int, int, int, int) + * repaint(Rectangle) + * firePropertyChange(String, Object, Object) + * firePropertyChange(String, boolean, boolean) + */ + +import java.beans.PropertyChangeEvent; +import java.beans.PropertyChangeListener; +import javax.swing.table.DefaultTableCellRenderer; + +public class bug4240870 { + public static void main(String[] argv) { + // Test overridden public methods using reflection + String methodName = null; + try { + Class clazz = Class.forName( + "javax.swing.table.DefaultTableCellRenderer"); + Class[] noArgs = {}; + methodName = "validate"; + clazz.getDeclaredMethod(methodName, noArgs); + methodName = "revalidate"; + clazz.getDeclaredMethod(methodName, noArgs); + + Class[] args1 = {long.class, int.class, int.class, + int.class, int.class}; + methodName = "repaint"; + clazz.getDeclaredMethod(methodName, args1); + Class[] args2 = {Class.forName("java.awt.Rectangle")}; + methodName = "repaint"; + clazz.getDeclaredMethod(methodName, args2); + + Class objectClass = Class.forName("java.lang.Object"); + Class stringClass = Class.forName("java.lang.String"); + Class[] args3 = {stringClass, objectClass, objectClass}; + methodName = "firePropertyChange"; + clazz.getDeclaredMethod(methodName, args3); + Class[] args4 = {stringClass, boolean.class, boolean.class}; + clazz.getDeclaredMethod(methodName, args4); + } catch (NoSuchMethodException e) { + throw new RuntimeException("Failed: " + methodName + " not overridden"); + } catch (ClassNotFoundException e) { + } + + // test protected firePropertyChange(String, Object, Object) + Renderer r = new Renderer(); + r.addPropertyChangeListener(new Listener()); + r.test(); + } + + static class Renderer extends DefaultTableCellRenderer { + public void test() { + super.firePropertyChange("text", "old_text", "new_text"); + super.firePropertyChange("stuff", "old_stuff", "new_stuff"); + } + } + + static class Listener implements PropertyChangeListener { + public void propertyChange(PropertyChangeEvent e) { + if (!e.getPropertyName().equals("text")) { + throw new RuntimeException("Failed: firePropertyChange not overridden"); + } + } + } +} diff --git a/test/jdk/javax/swing/JTableHeader/bug4243927.java b/test/jdk/javax/swing/JTableHeader/bug4243927.java new file mode 100644 index 00000000000..a46b1fa86a5 --- /dev/null +++ b/test/jdk/javax/swing/JTableHeader/bug4243927.java @@ -0,0 +1,45 @@ +/* + * Copyright (c) 1999, 2023, 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 4243927 + * @summary Tests that methods getAccessibleChild() and getAccessibleAt() + * of class JTableHeader.AccessibleJTableHeader do not throw NPE + */ + +import javax.accessibility.AccessibleComponent; +import javax.accessibility.AccessibleContext; +import javax.swing.table.JTableHeader; +import javax.swing.table.TableColumn; + +public class bug4243927 { + public static void main(String[] argv) { + JTableHeader header = new JTableHeader(); + header.getColumnModel().addColumn(new TableColumn(0)); + + AccessibleContext c = header.getAccessibleContext(); + c.getAccessibleChild(0); + ((AccessibleComponent)c).getAccessibleAt(new java.awt.Point(0,0)); + } +} diff --git a/test/jdk/javax/swing/LookAndFeel/bug4736093.java b/test/jdk/javax/swing/LookAndFeel/bug4736093.java new file mode 100644 index 00000000000..522eb98ab3e --- /dev/null +++ b/test/jdk/javax/swing/LookAndFeel/bug4736093.java @@ -0,0 +1,167 @@ +/* + * Copyright (c) 2002, 2023, 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 4736093 + * @requires (os.family == "windows") + * @summary REGRESSION: Menu and controls shortcuts are not visible in Win L&F in jdk1.4.1 + * @modules java.desktop/com.sun.java.swing.plaf.windows + * @key headful + */ + +import java.awt.Robot; +import java.awt.event.WindowAdapter; +import java.awt.event.WindowEvent; +import javax.swing.JFrame; +import javax.swing.JMenu; +import javax.swing.JMenuBar; +import javax.swing.JMenuItem; +import javax.swing.MenuElement; +import javax.swing.MenuSelectionManager; +import javax.swing.SwingUtilities; +import javax.swing.UIManager; + +import com.sun.java.swing.plaf.windows.WindowsLookAndFeel; + +public class bug4736093 { + static volatile boolean passed = true; + static volatile boolean done = false; + static volatile boolean winlaf = true; + static JFrame mainFrame = null; + static Robot robo; + + public static void main(String args[]) throws Exception { + try { + robo = new Robot(); + + SwingUtilities.invokeAndWait(() -> { + try { + UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel"); + } catch (Exception ex) { + winlaf = false; + } + + if (winlaf && WindowsLookAndFeel.isMnemonicHidden()) { + mainFrame = new JFrame("Bug 4736093"); + mainFrame.addWindowListener(new TestStateListener()); + mainFrame.setSize(200, 400); + mainFrame.setLocationRelativeTo(null); + mainFrame.setVisible(true); + } else { + System.out.println("Test is not for this system. Passed."); + } + }); + + robo.waitForIdle(); + robo.delay(1000); + + if (!passed) { + throw new RuntimeException("Test failed."); + } + } finally { + SwingUtilities.invokeAndWait(() -> { + if (mainFrame != null) { + mainFrame.dispose(); + } + }); + } + } + + public static void addMenuBar() { + JMenuBar mbar = new JMenuBar(); + JMenu menu = new JMenu("File"); + for (int i = 1; i < 5; i++) { + menu.add(new JMenuItem("Menu Item " + i)); + } + mbar.add(menu); + mainFrame.setJMenuBar(mbar); + } + + + public static void checkForMnemonics(boolean expected) { + if (expected != WindowsLookAndFeel.isMnemonicHidden()) { + passed = false; + } + } + + public static class TestStateListener extends WindowAdapter { + public void windowOpened(WindowEvent ev) { + try { + new Thread(new RobotThread()).start(); + } catch (Exception ex) { + throw new RuntimeException("Thread Exception"); + } + } + } + + public static class RobotThread implements Runnable { + public void run() { + MenuElement[] path; + int altKey = java.awt.event.KeyEvent.VK_ALT; + robo.setAutoDelay(3000); // 3 seconds delay + robo.waitForIdle(); + + robo.keyPress(altKey); + robo.delay(1000); + + checkForMnemonics(false); // mnemonics should appear on press + robo.keyRelease(altKey); + robo.delay(1000); + + checkForMnemonics(true); // and disappear on release + robo.keyPress(java.awt.event.KeyEvent.VK_ESCAPE); + robo.keyRelease(java.awt.event.KeyEvent.VK_ESCAPE); + robo.delay(1000); + + addMenuBar(); + robo.delay(1000); + + robo.keyPress(altKey); + robo.delay(1000); + + checkForMnemonics(false); // mnemonics should appear on press + robo.keyRelease(altKey); + robo.delay(1000); + + checkForMnemonics(false); // and stay appeared in selected menu + path = MenuSelectionManager.defaultManager().getSelectedPath(); + if (path.length == 0) { + passed = false; // menu should be selected + } + robo.delay(1000); + + robo.keyPress(altKey); + robo.delay(1000); + + checkForMnemonics(true); // and only now disappear + path = MenuSelectionManager.defaultManager().getSelectedPath(); + if (path.length != 0) { + passed = false; // menu should be deselected + } + robo.keyRelease(altKey); + done = true; + robo.delay(1000); + } + } +}