File: ZOrderTest.java

package info (click to toggle)
openjdk-21 21.0.8%2B9-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 823,976 kB
  • sloc: java: 5,613,338; xml: 1,643,607; cpp: 1,296,296; ansic: 420,291; asm: 404,850; objc: 20,994; sh: 15,271; javascript: 11,245; python: 6,895; makefile: 2,362; perl: 357; awk: 351; sed: 172; jsp: 24; csh: 3
file content (159 lines) | stat: -rw-r--r-- 5,398 bytes parent folder | download | duplicates (7)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
/*
 * Copyright (c) 1997, 2024, 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 4059430
 * @summary Test for component z-ordering consistency
 * @library /java/awt/regtesthelpers
 * @build PassFailJFrame
 * @run main/manual ZOrderTest
 */

import java.awt.Color;
import java.awt.Component;
import java.awt.Container;
import java.awt.Frame;
import java.awt.GridLayout;
import java.awt.Insets;
import java.awt.Label;
import java.awt.Panel;
import java.lang.reflect.InvocationTargetException;
import java.util.List;

public class ZOrderTest {
    public final static String INSTRUCTIONS = """
            The ZOrderTest creates two frames.
            - Frame 1 has components added to an intermediate panel
            - Frame 2 has components added directly to the frame itself
            Verify that the components are in the correct z-order. Lower numbered
            components should overlap higher numbered ones (e.g. component zero should
            appear on top of component one).
            Both frames should have the same component ordering, and this ordering should
            be the same on all supported operating systems.
            """;

    public static void main(String [] args) throws InterruptedException,
            InvocationTargetException {
        PassFailJFrame.builder()
                .title("Component ZOrder Test")
                .testUI(ZOrderTest::makeFrames)
                .instructions(INSTRUCTIONS)
                .columns(40)
                .logArea()
                .build()
                .awaitAndCheck();
    }

    private static List<Frame> makeFrames() {
        Frame frame, frame2;

        // test adding components to panel on a frame
        frame = new Frame("ZOrderTest(1) for 4059430");
        frame.pack();
        frame.show();
        Panel panel = new ZOrderPanel();
        frame.setBounds(0, 0, 500, 350);
        frame.setLayout(new GridLayout());
        frame.add(panel);
        doTest(panel);

        // test adding components directly to frame
        frame2 = new ZOrderTestFrame("ZOrderTest(2) for 4059430");
        frame2.pack();
        frame2.show();
        frame2.setBounds(80, 80, 500, 350);
        doTest(frame2);

        return List.of(frame, frame2);
    }

    /*
     * This tests various boundary conditions with z-ordering
     *  - inserting at the top of the z-order
     *  - inserting at the bottom of the z-order
     *  - inserting in the middle of the z-order
     */
    private static void doTest(Container cont) {
        Component compZero, compOne, compTwo, compThree, compFour;

        compZero = makeBox(cont, "Comp One", Color.blue, -1);
        // insert on top
        compOne = makeBox(cont, "Comp Zero", Color.yellow, 0);
        // put at the back
        compThree = makeBox(cont, "Comp Three", Color.red, 2);
        // insert in last position
        compTwo = makeBox(cont, "Comp Two", Color.green, 3);
        // swap compTwo and compThree to correct positions
        cont.remove(compTwo);
        cont.add(compTwo, 2);
        // one more test of adding to the end
        compFour = makeBox(cont, "Comp Four", Color.magenta, -1);
        // re-validate so components cascade into proper place
        cont.validate();
    }

    private static Component makeBox(Container cont, String s, Color c, int index) {
        Label l = new Label(s);
        l.setBackground(c);
        l.setAlignment(Label.RIGHT);
        if (index == -1) {
            cont.add(l); // semantically equivalent to -1, but why not test this too
        } else {
            cont.add(l, index);
        }
        cont.validate();
        return l;
    }

    /**
     * Cascades components across the container so
     * that they overlap, demonstrating their z-ordering
     */
    static void doCascadeLayout(Container cont) {
        int i, n;
        Insets ins = cont.insets();
        n = cont.countComponents();
        for (i = n - 1; i >= 0; i--) {
            Component comp = cont.getComponent(i);
            comp.reshape(ins.left + 75 * i, ins.top + 30 * i, 100, 100);
        }
    }
}

class ZOrderPanel extends Panel {
    public void layout() {
        ZOrderTest.doCascadeLayout(this);
    }
}

class ZOrderTestFrame extends Frame
{
    public ZOrderTestFrame(String title) {
        super(title);
    }

    public void layout() {
        ZOrderTest.doCascadeLayout(this);
    }
}