/* * 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"); } }