2023-05-05 16:28:03 +00:00

1249 lines
48 KiB
Java

/*
* 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 4222172
@summary Verifies initial implementation of HierarchyEvent (programmatic)
@key headful
@run main SpecTest
*/
import java.awt.AWTEvent;
import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.Container;
import java.awt.EventQueue;
import java.awt.Frame;
import java.awt.Label;
import java.awt.Panel;
import java.awt.Window;
import java.awt.event.HierarchyBoundsListener;
import java.awt.event.HierarchyEvent;
import java.awt.event.HierarchyListener;
import java.lang.reflect.InvocationTargetException;
import javax.swing.JLabel;
import javax.swing.JPanel;
public class SpecTest extends Frame implements HierarchyListener, HierarchyBoundsListener {
static SpecTest f;
public static void main(String args[]) throws InterruptedException,
InvocationTargetException {
EventQueue.invokeAndWait(() -> init());
f.start();
}
class EELabel extends Label {
private long mask = 0;
public EELabel(String s) {
super(s);
}
protected void processHierarchyEvent(HierarchyEvent e) {
super.processHierarchyEvent(e);
if ((mask & AWTEvent.HIERARCHY_EVENT_MASK) != 0) {
switch (e.getID()) {
case HierarchyEvent.HIERARCHY_CHANGED:
hierarchyChanged(e);
break;
default:
break;
}
}
}
protected void processHierarchyBoundsEvent(HierarchyEvent e) {
super.processHierarchyBoundsEvent(e);
if ((mask & AWTEvent.HIERARCHY_BOUNDS_EVENT_MASK) != 0) {
switch (e.getID()) {
case HierarchyEvent.ANCESTOR_MOVED:
ancestorMoved(e);
break;
case HierarchyEvent.ANCESTOR_RESIZED:
ancestorResized(e);
break;
default:
break;
}
}
}
public void pubEnableEvents(long eventsToEnable) {
mask |= eventsToEnable;
enableEvents(eventsToEnable);
}
public void pubDisableEvents(long eventsToDisable) {
mask &= ~eventsToDisable;
disableEvents(eventsToDisable);
}
}
class EEJLabel extends JLabel {
private long mask = 0;
public EEJLabel(String s) {
super(s);
}
protected void processHierarchyEvent(HierarchyEvent e) {
super.processHierarchyEvent(e);
if ((mask & AWTEvent.HIERARCHY_EVENT_MASK) != 0) {
switch (e.getID()) {
case HierarchyEvent.HIERARCHY_CHANGED:
hierarchyChanged(e);
break;
default:
break;
}
}
}
protected void processHierarchyBoundsEvent(HierarchyEvent e) {
super.processHierarchyBoundsEvent(e);
if ((mask & AWTEvent.HIERARCHY_BOUNDS_EVENT_MASK) != 0) {
switch (e.getID()) {
case HierarchyEvent.ANCESTOR_MOVED:
ancestorMoved(e);
break;
case HierarchyEvent.ANCESTOR_RESIZED:
ancestorResized(e);
break;
default:
break;
}
}
}
public void pubEnableEvents(long eventsToEnable) {
mask |= eventsToEnable;
enableEvents(eventsToEnable);
}
public void pubDisableEvents(long eventsToDisable) {
mask &= ~eventsToDisable;
disableEvents(eventsToDisable);
}
}
class EEPanel extends Panel {
private long mask = 0;
protected void processHierarchyEvent(HierarchyEvent e) {
super.processHierarchyEvent(e);
if ((mask & AWTEvent.HIERARCHY_EVENT_MASK) != 0) {
switch (e.getID()) {
case HierarchyEvent.HIERARCHY_CHANGED:
hierarchyChanged(e);
break;
default:
break;
}
}
}
protected void processHierarchyBoundsEvent(HierarchyEvent e) {
super.processHierarchyBoundsEvent(e);
if ((mask & AWTEvent.HIERARCHY_BOUNDS_EVENT_MASK) != 0) {
switch (e.getID()) {
case HierarchyEvent.ANCESTOR_MOVED:
ancestorMoved(e);
break;
case HierarchyEvent.ANCESTOR_RESIZED:
ancestorResized(e);
break;
default:
break;
}
}
}
public void pubEnableEvents(long eventsToEnable) {
mask |= eventsToEnable;
enableEvents(eventsToEnable);
}
public void pubDisableEvents(long eventsToDisable) {
mask &= ~eventsToDisable;
disableEvents(eventsToDisable);
}
}
class EEJPanel extends JPanel {
private long mask = 0;
protected void processHierarchyEvent(HierarchyEvent e) {
super.processHierarchyEvent(e);
if ((mask & AWTEvent.HIERARCHY_EVENT_MASK) != 0) {
switch (e.getID()) {
case HierarchyEvent.HIERARCHY_CHANGED:
hierarchyChanged(e);
break;
default:
break;
}
}
}
protected void processHierarchyBoundsEvent(HierarchyEvent e) {
super.processHierarchyBoundsEvent(e);
if ((mask & AWTEvent.HIERARCHY_BOUNDS_EVENT_MASK) != 0) {
switch (e.getID()) {
case HierarchyEvent.ANCESTOR_MOVED:
ancestorMoved(e);
break;
case HierarchyEvent.ANCESTOR_RESIZED:
ancestorResized(e);
break;
default:
break;
}
}
}
public void pubEnableEvents(long eventsToEnable) {
mask |= eventsToEnable;
enableEvents(eventsToEnable);
}
public void pubDisableEvents(long eventsToDisable) {
mask &= ~eventsToDisable;
disableEvents(eventsToDisable);
}
}
int parentChanged, displayabilityChanged, showingChanged, ancestorMoved,
ancestorResized;
private static final int OBJ_ARRAY_SIZE = 2;
Component[] source = new Component[OBJ_ARRAY_SIZE],
changed = new Component[OBJ_ARRAY_SIZE];
Container[] changedParent = new Container[OBJ_ARRAY_SIZE];
boolean assertParent = false, assertDisplayability = false,
assertShowing = false, assertMoved = false, assertResized = false;
private void flushEventQueue() throws InterruptedException, InvocationTargetException {
EventQueue.invokeAndWait(() -> {});
}
private void testAdd(Component child, Container parent, int count)
throws InterruptedException, InvocationTargetException {
assertParent = true;
parentChanged = count;
parent.add(child);
flushEventQueue();
if (parentChanged != 0) {
throw new RuntimeException("hierarchyChanged(PARENT_CHANGED) invoked "+
parentChanged+" too few times");
}
assertParent = false;
}
private void testRemove(Component child, Container parent, int count)
throws InterruptedException, InvocationTargetException {
assertParent = true;
parentChanged = count;
parent.remove(child);
flushEventQueue();
if (parentChanged != 0) {
throw new RuntimeException("hierarchyChanged(PARENT_CHANGED) invoked "+
parentChanged+" too few times");
}
assertParent = false;
}
private void testSetLocation(Component changed, int x, int y, int count)
throws InterruptedException, InvocationTargetException {
assertMoved = true;
ancestorMoved = count;
changed.setLocation(x, y);
flushEventQueue();
if (ancestorMoved != 0) {
throw new RuntimeException("ancestorMoved invoked "+ancestorMoved+
" too few times");
}
assertMoved = false;
}
private void testSetSize(Component changed, int w, int h, int count)
throws InterruptedException, InvocationTargetException {
assertResized = true;
ancestorResized = count;
changed.setSize(w, h);
flushEventQueue();
if (ancestorResized != 0) {
throw new RuntimeException("ancestorResized invoked "+ancestorResized+
" too few times");
}
assertResized = false;
}
private void testPack(Window topLevel, int displayabilityCount)
throws InterruptedException, InvocationTargetException {
assertDisplayability = true;
assertShowing = true;
displayabilityChanged = displayabilityCount;
showingChanged = 0;
topLevel.pack();
flushEventQueue();
if (displayabilityChanged != 0) {
throw new RuntimeException("hierarchyChanged(DISPLAYABILITY_CHANGED) "+
"invoked "+displayabilityChanged+
" too few times");
}
if (showingChanged != 0) {
throw new RuntimeException("hierarchyChanged(SHOWING_CHANGED) "+
"invoked, but should not have been");
}
assertDisplayability = false;
assertShowing = false;
}
private void testShow(Window topLevel, int displayabilityCount,
int showingCount)
throws InterruptedException, InvocationTargetException {
assertDisplayability = true;
assertShowing = true;
displayabilityChanged = displayabilityCount;
showingChanged = showingCount;
topLevel.show();
flushEventQueue();
if (displayabilityChanged != 0) {
throw new RuntimeException("hierarchyChanged(DISPLAYABILITY_CHANGED) "+
"invoked "+displayabilityChanged+
" too few times");
}
if (showingChanged != 0) {
throw new RuntimeException("hierarchyChanged(SHOWING_CHANGED) "+
"invoked "+showingChanged+" too few times");
}
assertDisplayability = false;
assertShowing = false;
}
private void testHide(Window topLevel, int showingCount)
throws InterruptedException, InvocationTargetException {
assertDisplayability = true;
assertShowing = true;
displayabilityChanged = 0;
showingChanged = showingCount;
topLevel.hide();
flushEventQueue();
if (displayabilityChanged != 0) {
throw new RuntimeException("hierarchyChanged(DISPLAYABILITY_CHANGED) "+
"invoked, but should not have been");
}
if (showingChanged != 0) {
throw new RuntimeException("hierarchyChanged(SHOWING_CHANGED) "+
"invoked "+showingChanged+" too few times");
}
assertDisplayability = false;
assertShowing = false;
}
private void testDispose(Window topLevel, int displayabilityCount,
int showingCount)
throws InterruptedException, InvocationTargetException {
assertDisplayability = true;
assertShowing = true;
displayabilityChanged = displayabilityCount;
showingChanged = showingCount;
topLevel.dispose();
flushEventQueue();
if (displayabilityChanged != 0) {
throw new RuntimeException("hierarchyChanged(DISPLAYABILITY_CHANGED) "+
"invoked "+displayabilityChanged+
" too few times");
}
if (showingChanged != 0) {
throw new RuntimeException("hierarchyChanged(SHOWING_CHANGED) "+
"invoked "+showingChanged+" too few times");
}
assertDisplayability = false;
assertShowing = false;
}
private void assertObjectsImpl(HierarchyEvent e) {
int match = -1;
for (int i = 0; i < OBJ_ARRAY_SIZE; i++) {
if (e.getComponent() == source[i]) {
match = i;
break;
}
}
if (match == -1) {
String str = "\n\nsource incorrect, was "+e.getComponent()+"\n\n";
for (int i = 0; i < OBJ_ARRAY_SIZE; i++) {
str += "available source: "+source[i]+"\n\n";
}
str += "event: "+e+"\n";
throw new RuntimeException(str);
}
if (e.getChanged() != changed[match]) {
if (e.getID() == HierarchyEvent.HIERARCHY_CHANGED &&
(e.getChangeFlags() & HierarchyEvent.DISPLAYABILITY_CHANGED) != 0) {
System.err.println("warning (known bug): changed for "+
"DISPLAYABILITY_CHANGED event incorrect");
} else {
throw new RuntimeException("\n\nchanged incorrect, was "+
e.getChanged()+
", should be "+changed[match]+"\n\n"+
"event: "+e+"\n");
}
}
if (e.getChangedParent() != changedParent[match]) {
if (e.getID() == HierarchyEvent.HIERARCHY_CHANGED &&
(e.getChangeFlags() & HierarchyEvent.DISPLAYABILITY_CHANGED) != 0) {
System.err.println("warning (known bug): changedParent for "+
"DISPLAYABILITY_CHANGED event incorrect");
} else {
throw new RuntimeException("changedParent incorrect, was "+
e.getChangedParent()+
", should be "+changedParent[match]+"\n\n"+
"event: "+e+"\n");
}
}
}
private void setObjects(int index, Component source, Component changed,
Container changedParent) {
this.source[index] = source;
this.changed[index] = changed;
this.changedParent[index] = changedParent;
}
private void resetObjects() {
for (int i = 0; i < OBJ_ARRAY_SIZE; i++) {
setObjects(i, null, null, null);
}
}
public void hierarchyChanged(HierarchyEvent e) {
if (assertParent &&
(e.getChangeFlags() & HierarchyEvent.PARENT_CHANGED) != 0) {
assertObjectsImpl(e);
parentChanged--;
}
if (assertDisplayability &&
(e.getChangeFlags() & HierarchyEvent.DISPLAYABILITY_CHANGED) != 0){
assertObjectsImpl(e);
displayabilityChanged--;
}
if (assertShowing &&
(e.getChangeFlags() & HierarchyEvent.SHOWING_CHANGED) != 0) {
assertObjectsImpl(e);
showingChanged--;
}
}
public void ancestorMoved(HierarchyEvent e) {
if (!assertMoved)
return;
assertObjectsImpl(e);
ancestorMoved--;
}
public void ancestorResized(HierarchyEvent e) {
if (!assertResized)
return;
assertObjectsImpl(e);
ancestorResized--;
}
public static void init() {
f = new SpecTest();
f.setTitle("SpecTest");
f.setLayout(new BorderLayout());
}
private void test1(Component source, Component changed,
Container changedParent, Window topLevel,
int hierarchyCount, int hierarchyBoundsCount)
throws InterruptedException, InvocationTargetException {
changed.setBounds(0, 0, 100, 100);
topLevel.dispose();
resetObjects();
setObjects(0, source, changed, changedParent);
testRemove(changed, changedParent, hierarchyCount);
testAdd(changed, changedParent, hierarchyCount);
testSetLocation(changed, 200, 250, hierarchyBoundsCount);
testSetSize(changed, 50, 50, hierarchyBoundsCount);
setObjects(0, source, topLevel, null);
testPack(topLevel, hierarchyCount);
testDispose(topLevel, hierarchyCount, 0);
testPack(topLevel, hierarchyCount);
testShow(topLevel, 0, hierarchyCount);
testDispose(topLevel, hierarchyCount, hierarchyCount);
testShow(topLevel, hierarchyCount, hierarchyCount);
testHide(topLevel, hierarchyCount);
testDispose(topLevel, hierarchyCount, 0);
resetObjects();
}
private void test2(Component source1, Container parent1,
Component source2, Container parent2,
Window topLevel)
throws InterruptedException, InvocationTargetException {
topLevel.setBounds(0, 0, 100, 100);
topLevel.dispose();
resetObjects();
setObjects(0, source1, source1, parent1);
testRemove(source1, parent1, 1);
testAdd(source1, parent1, 1);
setObjects(0, source2, source2, parent2);
testRemove(source2, parent2, 1);
testAdd(source2, parent2, 1);
setObjects(0, source1, topLevel, null);
setObjects(1, source2, topLevel, null);
testSetLocation(topLevel, 200, 250, 2);
testSetSize(topLevel, 50, 50, 2);
testPack(topLevel, 2);
testDispose(topLevel, 2, 0);
testPack(topLevel, 2);
testShow(topLevel, 0, 2);
testDispose(topLevel, 2, 2);
testShow(topLevel, 2, 2);
testHide(topLevel, 2);
testDispose(topLevel, 2, 0);
resetObjects();
}
public void start() throws InterruptedException, InvocationTargetException {
/*
f
|
-----------------------------------------
| | | | | |
l1 l2 p1 p2 p5 p6
| | | |
----- ----- | |
| | | | | |
l3 l4 l5 l6 p3 p4
| |
----- -----
| | | |
l7 l8 l9 l10
*/
// listener-only tests
{
Label l1 = new Label("Label 1");
JLabel l2 = new JLabel("Label 2");
Panel p1 = new Panel();
JPanel p2 = new JPanel();
Panel p5 = new Panel();
JPanel p6 = new JPanel();
Label l3 = new Label("Label 3");
JLabel l4 = new JLabel("Label 4");
Label l5 = new Label("Label 5");
JLabel l6 = new JLabel("Label 6");
JPanel p3 = new JPanel();
Panel p4 = new Panel();
Label l7 = new Label("Label 7");
JLabel l8 = new JLabel("Label 8");
JLabel l9 = new JLabel("Label 9");
Label l10 = new Label("Label 10");
f.add(l1);
f.add(l2);
f.add(p1);
f.add(p2);
f.add(p5);
f.add(p6);
p1.add(l3);
p1.add(l4);
p2.add(l5);
p2.add(l6);
p5.add(p3);
p6.add(p4);
p3.add(l7);
p3.add(l8);
p4.add(l9);
p4.add(l10);
// test1
l1.addHierarchyListener(this);
l1.addHierarchyBoundsListener(this);
test1(l1, l1, f, f, 1, 0);
l1.addHierarchyListener(this);
l1.addHierarchyBoundsListener(this);
test1(l1, l1, f, f, 2, 0);
l1.removeHierarchyListener(this);
l1.removeHierarchyBoundsListener(this);
l1.removeHierarchyListener(this);
l1.removeHierarchyBoundsListener(this);
l2.addHierarchyListener(this);
l2.addHierarchyBoundsListener(this);
test1(l2, l2, f, f, 1, 0);
l2.addHierarchyListener(this);
l2.addHierarchyBoundsListener(this);
test1(l2, l2, f, f, 2, 0);
l2.removeHierarchyListener(this);
l2.removeHierarchyBoundsListener(this);
l2.removeHierarchyListener(this);
l2.removeHierarchyBoundsListener(this);
p1.addHierarchyListener(this);
p1.addHierarchyBoundsListener(this);
test1(p1, p1, f, f, 1, 0);
p1.addHierarchyListener(this);
p1.addHierarchyBoundsListener(this);
test1(p1, p1, f, f, 2, 0);
p1.removeHierarchyListener(this);
p1.removeHierarchyBoundsListener(this);
p1.removeHierarchyListener(this);
p1.removeHierarchyBoundsListener(this);
p2.addHierarchyListener(this);
p2.addHierarchyBoundsListener(this);
test1(p2, p2, f, f, 1, 0);
p2.addHierarchyListener(this);
p2.addHierarchyBoundsListener(this);
test1(p2, p2, f, f, 2, 0);
p2.removeHierarchyListener(this);
p2.removeHierarchyBoundsListener(this);
p2.removeHierarchyListener(this);
p2.removeHierarchyBoundsListener(this);
p5.addHierarchyListener(this);
p5.addHierarchyBoundsListener(this);
test1(p5, p5, f, f, 1, 0);
p5.addHierarchyListener(this);
p5.addHierarchyBoundsListener(this);
test1(p5, p5, f, f, 2, 0);
p5.removeHierarchyListener(this);
p5.removeHierarchyBoundsListener(this);
p5.removeHierarchyListener(this);
p5.removeHierarchyBoundsListener(this);
p6.addHierarchyListener(this);
p6.addHierarchyBoundsListener(this);
test1(p6, p6, f, f, 1, 0);
p6.addHierarchyListener(this);
p6.addHierarchyBoundsListener(this);
test1(p6, p6, f, f, 2, 0);
p6.removeHierarchyListener(this);
p6.removeHierarchyBoundsListener(this);
p6.removeHierarchyListener(this);
p6.removeHierarchyBoundsListener(this);
l3.addHierarchyListener(this);
l3.addHierarchyBoundsListener(this);
test1(l3, l3, p1, f, 1, 0);
test1(l3, p1, f, f, 1, 1);
l3.addHierarchyListener(this);
l3.addHierarchyBoundsListener(this);
test1(l3, l3, p1, f, 2, 0);
test1(l3, p1, f, f, 2, 2);
l3.removeHierarchyListener(this);
l3.removeHierarchyBoundsListener(this);
l3.removeHierarchyListener(this);
l3.removeHierarchyBoundsListener(this);
l4.addHierarchyListener(this);
l4.addHierarchyBoundsListener(this);
test1(l4, l4, p1, f, 1, 0);
test1(l4, p1, f, f, 1, 1);
l4.addHierarchyListener(this);
l4.addHierarchyBoundsListener(this);
test1(l4, l4, p1, f, 2, 0);
test1(l4, p1, f, f, 2, 2);
l4.removeHierarchyListener(this);
l4.removeHierarchyBoundsListener(this);
l4.removeHierarchyListener(this);
l4.removeHierarchyBoundsListener(this);
l5.addHierarchyListener(this);
l5.addHierarchyBoundsListener(this);
test1(l5, l5, p2, f, 1, 0);
test1(l5, p2, f, f, 1, 1);
l5.addHierarchyListener(this);
l5.addHierarchyBoundsListener(this);
test1(l5, l5, p2, f, 2, 0);
test1(l5, p2, f, f, 2, 2);
l5.removeHierarchyListener(this);
l5.removeHierarchyBoundsListener(this);
l5.removeHierarchyListener(this);
l5.removeHierarchyBoundsListener(this);
l6.addHierarchyListener(this);
l6.addHierarchyBoundsListener(this);
test1(l6, l6, p2, f, 1, 0);
test1(l6, p2, f, f, 1, 1);
l6.addHierarchyListener(this);
l6.addHierarchyBoundsListener(this);
test1(l6, l6, p2, f, 2, 0);
test1(l6, p2, f, f, 2, 2);
l6.removeHierarchyListener(this);
l6.removeHierarchyBoundsListener(this);
l6.removeHierarchyListener(this);
l6.removeHierarchyBoundsListener(this);
p3.addHierarchyListener(this);
p3.addHierarchyBoundsListener(this);
test1(p3, p3, p5, f, 1, 0);
test1(p3, p5, f, f, 1, 1);
p3.addHierarchyListener(this);
p3.addHierarchyBoundsListener(this);
test1(p3, p3, p5, f, 2, 0);
test1(p3, p5, f, f, 2, 2);
p3.removeHierarchyListener(this);
p3.removeHierarchyBoundsListener(this);
p3.removeHierarchyListener(this);
p3.removeHierarchyBoundsListener(this);
p4.addHierarchyListener(this);
p4.addHierarchyBoundsListener(this);
test1(p4, p4, p6, f, 1, 0);
test1(p4, p6, f, f, 1, 1);
p4.addHierarchyListener(this);
p4.addHierarchyBoundsListener(this);
test1(p4, p4, p6, f, 2, 0);
test1(p4, p6, f, f, 2, 2);
p4.removeHierarchyListener(this);
p4.removeHierarchyBoundsListener(this);
p4.removeHierarchyListener(this);
p4.removeHierarchyBoundsListener(this);
l7.addHierarchyListener(this);
l7.addHierarchyBoundsListener(this);
test1(l7, l7, p3, f, 1, 0);
test1(l7, p3, p5, f, 1, 1);
test1(l7, p5, f, f, 1, 1);
l7.addHierarchyListener(this);
l7.addHierarchyBoundsListener(this);
test1(l7, l7, p3, f, 2, 0);
test1(l7, p3, p5, f, 2, 2);
test1(l7, p5, f, f, 2, 2);
l7.removeHierarchyListener(this);
l7.removeHierarchyBoundsListener(this);
l7.removeHierarchyListener(this);
l7.removeHierarchyBoundsListener(this);
l8.addHierarchyListener(this);
l8.addHierarchyBoundsListener(this);
test1(l8, l8, p3, f, 1, 0);
test1(l8, p3, p5, f, 1, 1);
test1(l8, p5, f, f, 1, 1);
l8.addHierarchyListener(this);
l8.addHierarchyBoundsListener(this);
test1(l8, l8, p3, f, 2, 0);
test1(l8, p3, p5, f, 2, 2);
test1(l8, p5, f, f, 2, 2);
l8.removeHierarchyListener(this);
l8.removeHierarchyBoundsListener(this);
l8.removeHierarchyListener(this);
l8.removeHierarchyBoundsListener(this);
l9.addHierarchyListener(this);
l9.addHierarchyBoundsListener(this);
test1(l9, l9, p4, f, 1, 0);
test1(l9, p4, p6, f, 1, 1);
test1(l9, p6, f, f, 1, 1);
l9.addHierarchyListener(this);
l9.addHierarchyBoundsListener(this);
test1(l9, l9, p4, f, 2, 0);
test1(l9, p4, p6, f, 2, 2);
test1(l9, p6, f, f, 2, 2);
l9.removeHierarchyListener(this);
l9.removeHierarchyBoundsListener(this);
l9.removeHierarchyListener(this);
l9.removeHierarchyBoundsListener(this);
l10.addHierarchyListener(this);
l10.addHierarchyBoundsListener(this);
test1(l10, l10, p4, f, 1, 0);
test1(l10, p4, p6, f, 1, 1);
test1(l10, p6, f, f, 1, 1);
l10.addHierarchyListener(this);
l10.addHierarchyBoundsListener(this);
test1(l10, l10, p4, f, 2, 0);
test1(l10, p4, p6, f, 2, 2);
test1(l10, p6, f, f, 2, 2);
l10.removeHierarchyListener(this);
l10.removeHierarchyBoundsListener(this);
l10.removeHierarchyListener(this);
l10.removeHierarchyBoundsListener(this);
// test2
l1.addHierarchyListener(this);
l10.addHierarchyListener(this);
l1.addHierarchyBoundsListener(this);
l10.addHierarchyBoundsListener(this);
test2(l1, f, l10, p4, f);
l1.removeHierarchyListener(this);
l10.removeHierarchyListener(this);
l1.removeHierarchyBoundsListener(this);
l10.removeHierarchyBoundsListener(this);
l2.addHierarchyListener(this);
l9.addHierarchyListener(this);
l2.addHierarchyBoundsListener(this);
l9.addHierarchyBoundsListener(this);
test2(l2, f, l9, p4, f);
l2.removeHierarchyListener(this);
l9.removeHierarchyListener(this);
l2.removeHierarchyBoundsListener(this);
l9.removeHierarchyBoundsListener(this);
l3.addHierarchyListener(this);
l8.addHierarchyListener(this);
l3.addHierarchyBoundsListener(this);
l8.addHierarchyBoundsListener(this);
test2(l3, p1, l8, p3, f);
l3.removeHierarchyListener(this);
l8.removeHierarchyListener(this);
l3.removeHierarchyBoundsListener(this);
l8.removeHierarchyBoundsListener(this);
l4.addHierarchyListener(this);
l7.addHierarchyListener(this);
l4.addHierarchyBoundsListener(this);
l7.addHierarchyBoundsListener(this);
test2(l4, p1, l7, p3, f);
l4.removeHierarchyListener(this);
l7.removeHierarchyListener(this);
l4.removeHierarchyBoundsListener(this);
l7.removeHierarchyBoundsListener(this);
l5.addHierarchyListener(this);
l6.addHierarchyListener(this);
l5.addHierarchyBoundsListener(this);
l6.addHierarchyBoundsListener(this);
test2(l5, p2, l6, p2, f);
l5.removeHierarchyListener(this);
l6.removeHierarchyListener(this);
l5.removeHierarchyBoundsListener(this);
l6.removeHierarchyBoundsListener(this);
p1.addHierarchyListener(this);
p4.addHierarchyListener(this);
p1.addHierarchyBoundsListener(this);
p4.addHierarchyBoundsListener(this);
test2(p1, f, p4, p6, f);
p1.removeHierarchyListener(this);
p4.removeHierarchyListener(this);
p1.removeHierarchyBoundsListener(this);
p4.removeHierarchyBoundsListener(this);
p2.addHierarchyListener(this);
p3.addHierarchyListener(this);
p2.addHierarchyBoundsListener(this);
p3.addHierarchyBoundsListener(this);
test2(p2, f, p3, p5, f);
p2.removeHierarchyListener(this);
p3.removeHierarchyListener(this);
p2.removeHierarchyBoundsListener(this);
p3.removeHierarchyBoundsListener(this);
p5.addHierarchyListener(this);
p6.addHierarchyListener(this);
p5.addHierarchyBoundsListener(this);
p6.addHierarchyBoundsListener(this);
test2(p5, f, p6, f, f);
p5.removeHierarchyListener(this);
p6.removeHierarchyListener(this);
p5.removeHierarchyBoundsListener(this);
p6.removeHierarchyBoundsListener(this);
}
EventQueue.invokeAndWait(() -> {
if (f != null) {
f.dispose();
f.removeAll();
}
});
// mixed listener/eventEnabled and eventEnabled-only tests
{
EELabel l1 = new EELabel("Label 1");
EEJLabel l2 = new EEJLabel("Label 2");
EEPanel p1 = new EEPanel();
EEJPanel p2 = new EEJPanel();
EEPanel p5 = new EEPanel();
EEJPanel p6 = new EEJPanel();
EELabel l3 = new EELabel("Label 3");
EEJLabel l4 = new EEJLabel("Label 4");
EELabel l5 = new EELabel("Label 5");
EEJLabel l6 = new EEJLabel("Label 6");
EEJPanel p3 = new EEJPanel();
EEPanel p4 = new EEPanel();
EELabel l7 = new EELabel("Label 7");
EEJLabel l8 = new EEJLabel("Label 8");
EEJLabel l9 = new EEJLabel("Label 9");
EELabel l10 = new EELabel("Label 10");
f.add(l1);
f.add(l2);
f.add(p1);
f.add(p2);
f.add(p5);
f.add(p6);
p1.add(l3);
p1.add(l4);
p2.add(l5);
p2.add(l6);
p5.add(p3);
p6.add(p4);
p3.add(l7);
p3.add(l8);
p4.add(l9);
p4.add(l10);
// test3
l1.pubEnableEvents(AWTEvent.HIERARCHY_EVENT_MASK);
l1.pubEnableEvents(AWTEvent.HIERARCHY_BOUNDS_EVENT_MASK);
test1(l1, l1, f, f, 1, 0);
l1.addHierarchyListener(this);
l1.addHierarchyBoundsListener(this);
test1(l1, l1, f, f, 2, 0);
l1.pubDisableEvents(AWTEvent.HIERARCHY_EVENT_MASK);
l1.pubDisableEvents(AWTEvent.HIERARCHY_BOUNDS_EVENT_MASK);
l1.removeHierarchyListener(this);
l1.removeHierarchyBoundsListener(this);
l2.pubEnableEvents(AWTEvent.HIERARCHY_EVENT_MASK);
l2.pubEnableEvents(AWTEvent.HIERARCHY_BOUNDS_EVENT_MASK);
test1(l2, l2, f, f, 1, 0);
l2.addHierarchyListener(this);
l2.addHierarchyBoundsListener(this);
test1(l2, l2, f, f, 2, 0);
l2.removeHierarchyListener(this);
l2.removeHierarchyBoundsListener(this);
l2.pubDisableEvents(AWTEvent.HIERARCHY_EVENT_MASK);
l2.pubDisableEvents(AWTEvent.HIERARCHY_BOUNDS_EVENT_MASK);
p1.addHierarchyListener(this);
p1.addHierarchyBoundsListener(this);
test1(p1, p1, f, f, 1, 0);
p1.pubEnableEvents(AWTEvent.HIERARCHY_EVENT_MASK);
p1.pubEnableEvents(AWTEvent.HIERARCHY_BOUNDS_EVENT_MASK);
test1(p1, p1, f, f, 2, 0);
p1.pubDisableEvents(AWTEvent.HIERARCHY_EVENT_MASK);
p1.pubDisableEvents(AWTEvent.HIERARCHY_BOUNDS_EVENT_MASK);
p1.removeHierarchyListener(this);
p1.removeHierarchyBoundsListener(this);
p2.addHierarchyListener(this);
p2.addHierarchyBoundsListener(this);
test1(p2, p2, f, f, 1, 0);
p2.pubEnableEvents(AWTEvent.HIERARCHY_EVENT_MASK);
p2.pubEnableEvents(AWTEvent.HIERARCHY_BOUNDS_EVENT_MASK);
test1(p2, p2, f, f, 2, 0);
p2.removeHierarchyListener(this);
p2.removeHierarchyBoundsListener(this);
p2.pubDisableEvents(AWTEvent.HIERARCHY_EVENT_MASK);
p2.pubDisableEvents(AWTEvent.HIERARCHY_BOUNDS_EVENT_MASK);
p5.pubEnableEvents(AWTEvent.HIERARCHY_EVENT_MASK);
p5.pubEnableEvents(AWTEvent.HIERARCHY_BOUNDS_EVENT_MASK);
test1(p5, p5, f, f, 1, 0);
p5.addHierarchyListener(this);
p5.addHierarchyBoundsListener(this);
test1(p5, p5, f, f, 2, 0);
p5.pubDisableEvents(AWTEvent.HIERARCHY_EVENT_MASK);
p5.pubDisableEvents(AWTEvent.HIERARCHY_BOUNDS_EVENT_MASK);
p5.removeHierarchyListener(this);
p5.removeHierarchyBoundsListener(this);
p6.pubEnableEvents(AWTEvent.HIERARCHY_EVENT_MASK);
p6.pubEnableEvents(AWTEvent.HIERARCHY_BOUNDS_EVENT_MASK);
test1(p6, p6, f, f, 1, 0);
p6.addHierarchyListener(this);
p6.addHierarchyBoundsListener(this);
test1(p6, p6, f, f, 2, 0);
p6.removeHierarchyListener(this);
p6.removeHierarchyBoundsListener(this);
p6.pubDisableEvents(AWTEvent.HIERARCHY_EVENT_MASK);
p6.pubDisableEvents(AWTEvent.HIERARCHY_BOUNDS_EVENT_MASK);
l3.addHierarchyListener(this);
l3.addHierarchyBoundsListener(this);
test1(l3, l3, p1, f, 1, 0);
test1(l3, p1, f, f, 1, 1);
l3.pubEnableEvents(AWTEvent.HIERARCHY_EVENT_MASK);
l3.pubEnableEvents(AWTEvent.HIERARCHY_BOUNDS_EVENT_MASK);
test1(l3, l3, p1, f, 2, 0);
test1(l3, p1, f, f, 2, 2);
l3.pubDisableEvents(AWTEvent.HIERARCHY_EVENT_MASK);
l3.pubDisableEvents(AWTEvent.HIERARCHY_BOUNDS_EVENT_MASK);
l3.removeHierarchyListener(this);
l3.removeHierarchyBoundsListener(this);
l4.addHierarchyListener(this);
l4.addHierarchyBoundsListener(this);
test1(l4, l4, p1, f, 1, 0);
test1(l4, p1, f, f, 1, 1);
l4.pubEnableEvents(AWTEvent.HIERARCHY_EVENT_MASK);
l4.pubEnableEvents(AWTEvent.HIERARCHY_BOUNDS_EVENT_MASK);
test1(l4, l4, p1, f, 2, 0);
test1(l4, p1, f, f, 2, 2);
l4.removeHierarchyListener(this);
l4.removeHierarchyBoundsListener(this);
l4.pubDisableEvents(AWTEvent.HIERARCHY_EVENT_MASK);
l4.pubDisableEvents(AWTEvent.HIERARCHY_BOUNDS_EVENT_MASK);
l5.pubEnableEvents(AWTEvent.HIERARCHY_EVENT_MASK);
l5.pubEnableEvents(AWTEvent.HIERARCHY_BOUNDS_EVENT_MASK);
test1(l5, l5, p2, f, 1, 0);
test1(l5, p2, f, f, 1, 1);
l5.addHierarchyListener(this);
l5.addHierarchyBoundsListener(this);
test1(l5, l5, p2, f, 2, 0);
test1(l5, p2, f, f, 2, 2);
l5.pubDisableEvents(AWTEvent.HIERARCHY_EVENT_MASK);
l5.pubDisableEvents(AWTEvent.HIERARCHY_BOUNDS_EVENT_MASK);
l5.removeHierarchyListener(this);
l5.removeHierarchyBoundsListener(this);
l6.pubEnableEvents(AWTEvent.HIERARCHY_EVENT_MASK);
l6.pubEnableEvents(AWTEvent.HIERARCHY_BOUNDS_EVENT_MASK);
test1(l6, l6, p2, f, 1, 0);
test1(l6, p2, f, f, 1, 1);
l6.addHierarchyListener(this);
l6.addHierarchyBoundsListener(this);
test1(l6, l6, p2, f, 2, 0);
test1(l6, p2, f, f, 2, 2);
l6.removeHierarchyListener(this);
l6.removeHierarchyBoundsListener(this);
l6.pubDisableEvents(AWTEvent.HIERARCHY_EVENT_MASK);
l6.pubDisableEvents(AWTEvent.HIERARCHY_BOUNDS_EVENT_MASK);
p3.addHierarchyListener(this);
p3.addHierarchyBoundsListener(this);
test1(p3, p3, p5, f, 1, 0);
test1(p3, p5, f, f, 1, 1);
p3.pubEnableEvents(AWTEvent.HIERARCHY_EVENT_MASK);
p3.pubEnableEvents(AWTEvent.HIERARCHY_BOUNDS_EVENT_MASK);
test1(p3, p3, p5, f, 2, 0);
test1(p3, p5, f, f, 2, 2);
p3.pubDisableEvents(AWTEvent.HIERARCHY_EVENT_MASK);
p3.pubDisableEvents(AWTEvent.HIERARCHY_BOUNDS_EVENT_MASK);
p3.removeHierarchyListener(this);
p3.removeHierarchyBoundsListener(this);
p4.addHierarchyListener(this);
p4.addHierarchyBoundsListener(this);
test1(p4, p4, p6, f, 1, 0);
test1(p4, p6, f, f, 1, 1);
p4.pubEnableEvents(AWTEvent.HIERARCHY_EVENT_MASK);
p4.pubEnableEvents(AWTEvent.HIERARCHY_BOUNDS_EVENT_MASK);
test1(p4, p4, p6, f, 2, 0);
test1(p4, p6, f, f, 2, 2);
p4.removeHierarchyListener(this);
p4.removeHierarchyBoundsListener(this);
p4.pubDisableEvents(AWTEvent.HIERARCHY_EVENT_MASK);
p4.pubDisableEvents(AWTEvent.HIERARCHY_BOUNDS_EVENT_MASK);
l7.pubEnableEvents(AWTEvent.HIERARCHY_EVENT_MASK);
l7.pubEnableEvents(AWTEvent.HIERARCHY_BOUNDS_EVENT_MASK);
test1(l7, l7, p3, f, 1, 0);
test1(l7, p3, p5, f, 1, 1);
test1(l7, p5, f, f, 1, 1);
l7.addHierarchyListener(this);
l7.addHierarchyBoundsListener(this);
test1(l7, l7, p3, f, 2, 0);
test1(l7, p3, p5, f, 2, 2);
test1(l7, p5, f, f, 2, 2);
l7.pubDisableEvents(AWTEvent.HIERARCHY_EVENT_MASK);
l7.pubDisableEvents(AWTEvent.HIERARCHY_BOUNDS_EVENT_MASK);
l7.removeHierarchyListener(this);
l7.removeHierarchyBoundsListener(this);
l8.pubEnableEvents(AWTEvent.HIERARCHY_EVENT_MASK);
l8.pubEnableEvents(AWTEvent.HIERARCHY_BOUNDS_EVENT_MASK);
test1(l8, l8, p3, f, 1, 0);
test1(l8, p3, p5, f, 1, 1);
test1(l8, p5, f, f, 1, 1);
l8.addHierarchyListener(this);
l8.addHierarchyBoundsListener(this);
test1(l8, l8, p3, f, 2, 0);
test1(l8, p3, p5, f, 2, 2);
test1(l8, p5, f, f, 2, 2);
l8.removeHierarchyListener(this);
l8.removeHierarchyBoundsListener(this);
l8.pubDisableEvents(AWTEvent.HIERARCHY_EVENT_MASK);
l8.pubDisableEvents(AWTEvent.HIERARCHY_BOUNDS_EVENT_MASK);
l9.addHierarchyListener(this);
l9.addHierarchyBoundsListener(this);
test1(l9, l9, p4, f, 1, 0);
test1(l9, p4, p6, f, 1, 1);
test1(l9, p6, f, f, 1, 1);
l9.pubEnableEvents(AWTEvent.HIERARCHY_EVENT_MASK);
l9.pubEnableEvents(AWTEvent.HIERARCHY_BOUNDS_EVENT_MASK);
test1(l9, l9, p4, f, 2, 0);
test1(l9, p4, p6, f, 2, 2);
test1(l9, p6, f, f, 2, 2);
l9.pubDisableEvents(AWTEvent.HIERARCHY_EVENT_MASK);
l9.pubDisableEvents(AWTEvent.HIERARCHY_BOUNDS_EVENT_MASK);
l9.removeHierarchyListener(this);
l9.removeHierarchyBoundsListener(this);
l10.addHierarchyListener(this);
l10.addHierarchyBoundsListener(this);
test1(l10, l10, p4, f, 1, 0);
test1(l10, p4, p6, f, 1, 1);
test1(l10, p6, f, f, 1, 1);
l10.pubEnableEvents(AWTEvent.HIERARCHY_EVENT_MASK);
l10.pubEnableEvents(AWTEvent.HIERARCHY_BOUNDS_EVENT_MASK);
test1(l10, l10, p4, f, 2, 0);
test1(l10, p4, p6, f, 2, 2);
test1(l10, p6, f, f, 2, 2);
l10.removeHierarchyListener(this);
l10.removeHierarchyBoundsListener(this);
l10.pubDisableEvents(AWTEvent.HIERARCHY_EVENT_MASK);
l10.pubDisableEvents(AWTEvent.HIERARCHY_BOUNDS_EVENT_MASK);
// test4
l1.pubEnableEvents(AWTEvent.HIERARCHY_EVENT_MASK);
l10.pubEnableEvents(AWTEvent.HIERARCHY_EVENT_MASK);
l1.pubEnableEvents(AWTEvent.HIERARCHY_BOUNDS_EVENT_MASK);
l10.pubEnableEvents(AWTEvent.HIERARCHY_BOUNDS_EVENT_MASK);
test2(l1, f, l10, p4, f);
l1.pubDisableEvents(AWTEvent.HIERARCHY_EVENT_MASK);
l10.pubDisableEvents(AWTEvent.HIERARCHY_EVENT_MASK);
l1.pubDisableEvents(AWTEvent.HIERARCHY_BOUNDS_EVENT_MASK);
l10.pubDisableEvents(AWTEvent.HIERARCHY_BOUNDS_EVENT_MASK);
l2.pubEnableEvents(AWTEvent.HIERARCHY_EVENT_MASK);
l9.pubEnableEvents(AWTEvent.HIERARCHY_EVENT_MASK);
l2.pubEnableEvents(AWTEvent.HIERARCHY_BOUNDS_EVENT_MASK);
l9.pubEnableEvents(AWTEvent.HIERARCHY_BOUNDS_EVENT_MASK);
test2(l2, f, l9, p4, f);
l2.pubDisableEvents(AWTEvent.HIERARCHY_EVENT_MASK);
l9.pubDisableEvents(AWTEvent.HIERARCHY_EVENT_MASK);
l2.pubDisableEvents(AWTEvent.HIERARCHY_BOUNDS_EVENT_MASK);
l9.pubDisableEvents(AWTEvent.HIERARCHY_BOUNDS_EVENT_MASK);
l3.pubEnableEvents(AWTEvent.HIERARCHY_EVENT_MASK);
l8.pubEnableEvents(AWTEvent.HIERARCHY_EVENT_MASK);
l3.pubEnableEvents(AWTEvent.HIERARCHY_BOUNDS_EVENT_MASK);
l8.pubEnableEvents(AWTEvent.HIERARCHY_BOUNDS_EVENT_MASK);
test2(l3, p1, l8, p3, f);
l3.pubDisableEvents(AWTEvent.HIERARCHY_EVENT_MASK);
l8.pubDisableEvents(AWTEvent.HIERARCHY_EVENT_MASK);
l3.pubDisableEvents(AWTEvent.HIERARCHY_BOUNDS_EVENT_MASK);
l8.pubDisableEvents(AWTEvent.HIERARCHY_BOUNDS_EVENT_MASK);
l4.pubEnableEvents(AWTEvent.HIERARCHY_EVENT_MASK);
l7.pubEnableEvents(AWTEvent.HIERARCHY_EVENT_MASK);
l4.pubEnableEvents(AWTEvent.HIERARCHY_BOUNDS_EVENT_MASK);
l7.pubEnableEvents(AWTEvent.HIERARCHY_BOUNDS_EVENT_MASK);
test2(l4, p1, l7, p3, f);
l4.pubDisableEvents(AWTEvent.HIERARCHY_EVENT_MASK);
l7.pubDisableEvents(AWTEvent.HIERARCHY_EVENT_MASK);
l4.pubDisableEvents(AWTEvent.HIERARCHY_BOUNDS_EVENT_MASK);
l7.pubDisableEvents(AWTEvent.HIERARCHY_BOUNDS_EVENT_MASK);
l5.pubEnableEvents(AWTEvent.HIERARCHY_EVENT_MASK);
l6.pubEnableEvents(AWTEvent.HIERARCHY_EVENT_MASK);
l5.pubEnableEvents(AWTEvent.HIERARCHY_BOUNDS_EVENT_MASK);
l6.pubEnableEvents(AWTEvent.HIERARCHY_BOUNDS_EVENT_MASK);
test2(l5, p2, l6, p2, f);
l5.pubDisableEvents(AWTEvent.HIERARCHY_EVENT_MASK);
l6.pubDisableEvents(AWTEvent.HIERARCHY_EVENT_MASK);
l5.pubDisableEvents(AWTEvent.HIERARCHY_BOUNDS_EVENT_MASK);
l6.pubDisableEvents(AWTEvent.HIERARCHY_BOUNDS_EVENT_MASK);
p1.pubEnableEvents(AWTEvent.HIERARCHY_EVENT_MASK);
p4.pubEnableEvents(AWTEvent.HIERARCHY_EVENT_MASK);
p1.pubEnableEvents(AWTEvent.HIERARCHY_BOUNDS_EVENT_MASK);
p4.pubEnableEvents(AWTEvent.HIERARCHY_BOUNDS_EVENT_MASK);
test2(p1, f, p4, p6, f);
p1.pubDisableEvents(AWTEvent.HIERARCHY_EVENT_MASK);
p4.pubDisableEvents(AWTEvent.HIERARCHY_EVENT_MASK);
p1.pubDisableEvents(AWTEvent.HIERARCHY_BOUNDS_EVENT_MASK);
p4.pubDisableEvents(AWTEvent.HIERARCHY_BOUNDS_EVENT_MASK);
p2.pubEnableEvents(AWTEvent.HIERARCHY_EVENT_MASK);
p3.pubEnableEvents(AWTEvent.HIERARCHY_EVENT_MASK);
p2.pubEnableEvents(AWTEvent.HIERARCHY_BOUNDS_EVENT_MASK);
p3.pubEnableEvents(AWTEvent.HIERARCHY_BOUNDS_EVENT_MASK);
test2(p2, f, p3, p5, f);
p2.pubDisableEvents(AWTEvent.HIERARCHY_EVENT_MASK);
p3.pubDisableEvents(AWTEvent.HIERARCHY_EVENT_MASK);
p2.pubDisableEvents(AWTEvent.HIERARCHY_BOUNDS_EVENT_MASK);
p3.pubDisableEvents(AWTEvent.HIERARCHY_BOUNDS_EVENT_MASK);
p5.pubEnableEvents(AWTEvent.HIERARCHY_EVENT_MASK);
p6.pubEnableEvents(AWTEvent.HIERARCHY_EVENT_MASK);
p5.pubEnableEvents(AWTEvent.HIERARCHY_BOUNDS_EVENT_MASK);
p6.pubEnableEvents(AWTEvent.HIERARCHY_BOUNDS_EVENT_MASK);
test2(p5, f, p6, f, f);
p5.pubDisableEvents(AWTEvent.HIERARCHY_EVENT_MASK);
p6.pubDisableEvents(AWTEvent.HIERARCHY_EVENT_MASK);
p5.pubDisableEvents(AWTEvent.HIERARCHY_BOUNDS_EVENT_MASK);
p6.pubDisableEvents(AWTEvent.HIERARCHY_BOUNDS_EVENT_MASK);
}
System.out.println("passed");
}
}