From a8ae6f87f49a72ae65f193751f5177547a3b6e81 Mon Sep 17 00:00:00 2001 From: ptbrunet Date: Thu, 31 Jan 2013 18:51:17 +0400 Subject: [PATCH] 7179482: Component.accessibleContext and JComponent.accessibleContext refactoring Reviewed-by: art, anthony, alexsch --- src/share/classes/java/awt/Component.java | 24 +++++++---- src/share/classes/java/awt/Container.java | 24 ++++++++++- src/share/classes/javax/swing/JComponent.java | 43 ++++++++----------- 3 files changed, 57 insertions(+), 34 deletions(-) diff --git a/src/share/classes/java/awt/Component.java b/src/share/classes/java/awt/Component.java index 42e422d3e..3bfb115c1 100644 --- a/src/share/classes/java/awt/Component.java +++ b/src/share/classes/java/awt/Component.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1995, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1995, 2013, 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 @@ -8994,7 +8994,10 @@ public abstract class Component implements ImageObserver, MenuContainer, * to the individual objects which extend Component. */ - AccessibleContext accessibleContext = null; + /** + * The {@code AccessibleContext} associated with this {@code Component}. + */ + protected AccessibleContext accessibleContext = null; /** * Gets the AccessibleContext associated @@ -9034,6 +9037,13 @@ public abstract class Component implements ImageObserver, MenuContainer, protected AccessibleAWTComponent() { } + /** + * Number of PropertyChangeListener objects registered. It's used + * to add/remove ComponentListener and FocusListener to track + * target Component's state. + */ + private volatile transient int propertyListenersCount = 0; + protected ComponentListener accessibleAWTComponentHandler = null; protected FocusListener accessibleAWTFocusHandler = null; @@ -9098,10 +9108,12 @@ public abstract class Component implements ImageObserver, MenuContainer, public void addPropertyChangeListener(PropertyChangeListener listener) { if (accessibleAWTComponentHandler == null) { accessibleAWTComponentHandler = new AccessibleAWTComponentHandler(); - Component.this.addComponentListener(accessibleAWTComponentHandler); } if (accessibleAWTFocusHandler == null) { accessibleAWTFocusHandler = new AccessibleAWTFocusHandler(); + } + if (propertyListenersCount++ == 0) { + Component.this.addComponentListener(accessibleAWTComponentHandler); Component.this.addFocusListener(accessibleAWTFocusHandler); } super.addPropertyChangeListener(listener); @@ -9115,13 +9127,9 @@ public abstract class Component implements ImageObserver, MenuContainer, * @param listener The PropertyChangeListener to be removed */ public void removePropertyChangeListener(PropertyChangeListener listener) { - if (accessibleAWTComponentHandler != null) { + if (--propertyListenersCount == 0) { Component.this.removeComponentListener(accessibleAWTComponentHandler); - accessibleAWTComponentHandler = null; - } - if (accessibleAWTFocusHandler != null) { Component.this.removeFocusListener(accessibleAWTFocusHandler); - accessibleAWTFocusHandler = null; } super.removePropertyChangeListener(listener); } diff --git a/src/share/classes/java/awt/Container.java b/src/share/classes/java/awt/Container.java index 78af6b10c..1118852f0 100644 --- a/src/share/classes/java/awt/Container.java +++ b/src/share/classes/java/awt/Container.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1995, 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1995, 2013, 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 @@ -3824,6 +3824,12 @@ public class Container extends Component { return Container.this.getAccessibleAt(p); } + /** + * Number of PropertyChangeListener objects registered. It's used + * to add/remove ContainerListener to track target Container's state. + */ + private volatile transient int propertyListenersCount = 0; + protected ContainerListener accessibleContainerHandler = null; /** @@ -3859,11 +3865,27 @@ public class Container extends Component { public void addPropertyChangeListener(PropertyChangeListener listener) { if (accessibleContainerHandler == null) { accessibleContainerHandler = new AccessibleContainerHandler(); + } + if (propertyListenersCount++ == 0) { Container.this.addContainerListener(accessibleContainerHandler); } super.addPropertyChangeListener(listener); } + /** + * Remove a PropertyChangeListener from the listener list. + * This removes a PropertyChangeListener that was registered + * for all properties. + * + * @param listener the PropertyChangeListener to be removed + */ + public void removePropertyChangeListener(PropertyChangeListener listener) { + if (--propertyListenersCount == 0) { + Container.this.removeContainerListener(accessibleContainerHandler); + } + super.removePropertyChangeListener(listener); + } + } // inner class AccessibleAWTContainer /** diff --git a/src/share/classes/javax/swing/JComponent.java b/src/share/classes/javax/swing/JComponent.java index dbf4b3c33..dac623a37 100644 --- a/src/share/classes/javax/swing/JComponent.java +++ b/src/share/classes/javax/swing/JComponent.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2013, 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 @@ -3643,26 +3643,6 @@ public abstract class JComponent extends Container implements Serializable, } } - /** - * The AccessibleContext associated with this - * JComponent. - */ - protected AccessibleContext accessibleContext = null; - - /** - * Returns the AccessibleContext associated with this - * JComponent. The method implemented by this base - * class returns null. Classes that extend JComponent - * should implement this method to return the - * AccessibleContext associated with the subclass. - * - * @return the AccessibleContext of this - * JComponent - */ - public AccessibleContext getAccessibleContext() { - return accessibleContext; - } - /** * Inner class of JComponent used to provide default support for * accessibility. This class is not meant to be used directly by @@ -3689,7 +3669,18 @@ public abstract class JComponent extends Container implements Serializable, super(); } - protected ContainerListener accessibleContainerHandler = null; + /** + * Number of PropertyChangeListener objects registered. It's used + * to add/remove ContainerListener and FocusListener to track + * target JComponent's state + */ + private volatile transient int propertyListenersCount = 0; + + /** + * This field duplicates the one in java.awt.Component.AccessibleAWTComponent, + * so it has been deprecated. + */ + @Deprecated protected FocusListener accessibleFocusHandler = null; /** @@ -3747,10 +3738,12 @@ public abstract class JComponent extends Container implements Serializable, public void addPropertyChangeListener(PropertyChangeListener listener) { if (accessibleFocusHandler == null) { accessibleFocusHandler = new AccessibleFocusHandler(); - JComponent.this.addFocusListener(accessibleFocusHandler); } if (accessibleContainerHandler == null) { accessibleContainerHandler = new AccessibleContainerHandler(); + } + if (propertyListenersCount++ == 0) { + JComponent.this.addFocusListener(accessibleFocusHandler); JComponent.this.addContainerListener(accessibleContainerHandler); } super.addPropertyChangeListener(listener); @@ -3764,9 +3757,9 @@ public abstract class JComponent extends Container implements Serializable, * @param listener the PropertyChangeListener to be removed */ public void removePropertyChangeListener(PropertyChangeListener listener) { - if (accessibleFocusHandler != null) { + if (--propertyListenersCount == 0) { JComponent.this.removeFocusListener(accessibleFocusHandler); - accessibleFocusHandler = null; + JComponent.this.removeContainerListener(accessibleContainerHandler); } super.removePropertyChangeListener(listener); } -- GitLab