Skip to content

Commit

Permalink
8306137: Open source several AWT ScrollPane related tests
Browse files Browse the repository at this point in the history
Backport-of: 4becb7bcb6d8c24db5209dade77dbf2be057b2b0
  • Loading branch information
GoeLin committed Jul 10, 2023
1 parent 592d64b commit efd7f7f
Show file tree
Hide file tree
Showing 6 changed files with 752 additions and 0 deletions.
99 changes: 99 additions & 0 deletions test/jdk/java/awt/ScrollPane/ComponentScrollTest.java
@@ -0,0 +1,99 @@
/*
* Copyright (c) 2000, 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 4342129
@summary Unable to scroll in scrollpane for canvas
@key headful
*/

import java.awt.Component;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Frame;
import java.awt.Graphics;
import java.awt.ScrollPane;

import java.awt.event.AdjustmentEvent;
import java.awt.event.AdjustmentListener;

public class ComponentScrollTest {
public ScrollPane scrollpane;
public Frame frame;
public volatile int count = 0;

public static void main(String[] args) throws Exception {
ComponentScrollTest cst = new ComponentScrollTest();
cst.init();
cst.start();
}

public void init() throws Exception {
EventQueue.invokeAndWait(() -> {
scrollpane = new ScrollPane();
frame = new Frame("Component Scroll Test");
scrollpane.add(new Component() {
public Dimension getPreferredSize() {
return new Dimension(500, 500);
}

public void paint(Graphics g) {
g.drawLine(0, 0, 500, 500);
}
});
frame.add(scrollpane);
scrollpane.getVAdjustable().addAdjustmentListener(new AdjustmentListener() {
@Override
public void adjustmentValueChanged(AdjustmentEvent adjustmentEvent) {
count++;
scrollpane.getVAdjustable().setValue(20);
}
});
frame.pack();
frame.setVisible(true);
});
}

public void start() throws Exception {
try {
EventQueue.invokeAndWait(() -> {
scrollpane.getVAdjustable().setValue(20);
});

Thread.sleep(1000);

System.out.println("Count = " + count);
if (count > 50) {
throw new RuntimeException();
}
} finally {
EventQueue.invokeAndWait(() -> {
if (frame != null) {
frame.dispose();
}
});
}
}
}
97 changes: 97 additions & 0 deletions test/jdk/java/awt/ScrollPane/ScrollPaneExtraScrollBar.java
@@ -0,0 +1,97 @@
/*
* Copyright (c) 2003, 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 4152524
@requires os.family=="windows"
@summary Test that scroll pane doesn't have scroll bars visible when it is
shown for the first time with SCROLLBARS_AS_NEEDED style
@key headful
*/

import java.awt.Button;
import java.awt.EventQueue;
import java.awt.Frame;
import java.awt.Insets;
import java.awt.Rectangle;
import java.awt.Robot;
import java.awt.ScrollPane;

import java.awt.event.InputEvent;

public class ScrollPaneExtraScrollBar {
ScrollPane sp;
Frame f;
volatile Rectangle r;

public static void main(String[] args) throws Exception {
ScrollPaneExtraScrollBar scrollTest = new ScrollPaneExtraScrollBar();
scrollTest.init();
scrollTest.start();
}

public void init() throws Exception {
EventQueue.invokeAndWait(() -> {
f = new Frame("ScrollPaneExtraScrollBar");
sp = new ScrollPane(ScrollPane.SCROLLBARS_AS_NEEDED);
sp.add(new Button("TEST"));
f.add("Center", sp);
f.pack();
f.setLocationRelativeTo(null);
f.setVisible(true);
});
}

public void start() throws Exception {
try {
Robot robot = new Robot();
robot.waitForIdle();
robot.delay(100);
EventQueue.invokeAndWait(() -> {
r = f.getBounds();
});
robot.mouseMove(r.x + r.width - 1, r.y + r.height - 1);
robot.mousePress(InputEvent.BUTTON1_DOWN_MASK);
robot.mouseMove(r.x + r.width + 50, r.y + r.height + 50);
robot.mouseRelease(InputEvent.BUTTON1_DOWN_MASK);

robot.waitForIdle();
robot.delay(1000);

EventQueue.invokeAndWait(() -> {
Insets insets = sp.getInsets();
if (insets.left != insets.right || insets.top != insets.bottom) {
throw new RuntimeException("ScrollPane has scroll bars visible" +
" when it shouldn't");
}
});
} finally {
EventQueue.invokeAndWait(() -> {
if (f != null) {
f.dispose();
}
});
}
}
}
149 changes: 149 additions & 0 deletions test/jdk/java/awt/ScrollPane/ScrollPaneLimitation.java
@@ -0,0 +1,149 @@
/*
* Copyright (c) 2000, 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 4046446
@requires os.family=="windows"
@summary Tests 16-bit limitations of scroll pane, child's position and size
and mouse coordinates
@key headful
*/

import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Frame;
import java.awt.Point;
import java.awt.Robot;
import java.awt.ScrollPane;

import java.awt.event.InputEvent;
import java.awt.event.MouseEvent;
import java.awt.event.MouseAdapter;

import java.util.concurrent.CountDownLatch;
import java.util.concurrent.TimeUnit;

public class ScrollPaneLimitation {
static final int SCROLL_POS = 50000;
public static Component child = null;
static final CountDownLatch go = new CountDownLatch(1);
public Frame frame;
volatile Point point;
ScrollPane pane;

public static void main(String[] args) throws Exception {
ScrollPaneLimitation scrollTest = new ScrollPaneLimitation();
scrollTest.init();
scrollTest.start();
}

public void init() throws Exception {
EventQueue.invokeAndWait(() -> {
frame = new Frame("Scroll Pane Limitation");
frame.setLayout(new BorderLayout());
pane = new ScrollPane();
frame.add(pane);
child = new MyPanel();
child.addMouseListener(new MouseAdapter() {
public void mousePressed(MouseEvent e) {
if (e.getID() == MouseEvent.MOUSE_PRESSED
&& e.getSource() == ScrollPaneLimitation.child
&& e.getY() > SCROLL_POS) {
go.countDown();
}
}
});
pane.add(child);
frame.setSize(200, 200);
frame.pack();
frame.setLocationRelativeTo(null);
frame.setAlwaysOnTop(true);
frame.setVisible(true);
pane.doLayout();
});
}

public void start() throws Exception {
try {
Robot robot = new Robot();
robot.waitForIdle();
robot.delay(1000);

EventQueue.invokeAndWait(() -> {
Point p = child.getLocation();
System.out.println("Child's initial location " + p);
System.out.println("Pane's insets " + pane.getInsets());
pane.setScrollPosition(0, SCROLL_POS);
p = pane.getScrollPosition();
System.out.println("Scroll pos = " + p);
if (p.y != SCROLL_POS) {
throw new RuntimeException("wrong scroll position");
}
p = child.getLocation();
System.out.println("Child pos = " + p);
if (p.y != -SCROLL_POS) {
if (child.isLightweight()) {
// If it is lightweight it will always have (0, 0) location.
// Check location of its parent - it is Panel and it should
// be at (inset left, inset top + position)
Container cp = child.getParent();
p = cp.getLocation();
System.out.println("Child's parent pos = " + p);
if (p.y != -SCROLL_POS) {
throw new RuntimeException("wrong child location");
}
} else {
throw new RuntimeException("wrong child location");
}
}

p = pane.getLocationOnScreen();
Dimension d = pane.getSize();
point = new Point(p.x + d.width / 2, p.y + d.height / 2);
});
robot.mouseMove(point.x, point.y);
robot.mousePress(InputEvent.BUTTON1_DOWN_MASK);
robot.mouseRelease(InputEvent.BUTTON1_DOWN_MASK);

if (!go.await(3, TimeUnit.SECONDS)) {
throw new RuntimeException("mouse was not pressed");
}
} finally {
EventQueue.invokeAndWait(() -> {
if (frame != null) {
frame.dispose();
}
});
}
}

private static class MyPanel extends Component {
public Dimension getPreferredSize() {
return new Dimension(100, 100000);
}
}
}

1 comment on commit efd7f7f

@openjdk-notifier
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please sign in to comment.