FileDocCategorySizeDatePackage
AncestorNotifier.javaAPI DocJava SE 5 API6706Fri Aug 26 14:57:52 BST 2005javax.swing

AncestorNotifier

public class AncestorNotifier extends Object implements ComponentListener, Serializable, PropertyChangeListener
version
1.19 12/19/03
author
Dave Moore

Fields Summary
Component
firstInvisibleAncestor
EventListenerList
listenerList
JComponent
root
Constructors Summary
AncestorNotifier(JComponent root)


      
	this.root = root;
       	addListeners(root, true);
    
Methods Summary
voidaddAncestorListener(javax.swing.event.AncestorListener l)

	listenerList.add(AncestorListener.class, l);
    
voidaddListeners(java.awt.Component ancestor, boolean addToFirst)

	Component a;

	firstInvisibleAncestor = null;
	for (a = ancestor;
	     firstInvisibleAncestor == null;
	     a = a.getParent()) {
	    if (addToFirst || a != ancestor) {
		a.addComponentListener(this);

		if (a instanceof JComponent) {
		    JComponent jAncestor = (JComponent)a;

		    jAncestor.addPropertyChangeListener(this);
		}
	    }
	    if (!a.isVisible() || a.getParent() == null || a instanceof Window) {
		firstInvisibleAncestor = a;
	    }
	}
	if (firstInvisibleAncestor instanceof Window &&
	    firstInvisibleAncestor.isVisible()) {
	    firstInvisibleAncestor = null;
	}
    
public voidcomponentHidden(java.awt.event.ComponentEvent e)

	Component ancestor = e.getComponent();
	boolean needsNotify = firstInvisibleAncestor == null;

	if ( !(ancestor instanceof Window) ) {
	    removeListeners(ancestor.getParent());
	}
	firstInvisibleAncestor = ancestor;
	if (needsNotify) {
	    fireAncestorRemoved(root, AncestorEvent.ANCESTOR_REMOVED,
				(Container)ancestor, ancestor.getParent());
	}
    
public voidcomponentMoved(java.awt.event.ComponentEvent e)

	Component source = e.getComponent();

	fireAncestorMoved(root, AncestorEvent.ANCESTOR_MOVED,
			  (Container)source, source.getParent());
    
public voidcomponentResized(java.awt.event.ComponentEvent e)

public voidcomponentShown(java.awt.event.ComponentEvent e)

	Component ancestor = e.getComponent();

	if (ancestor == firstInvisibleAncestor) {
	    addListeners(ancestor, false);
	    if (firstInvisibleAncestor == null) {
		fireAncestorAdded(root, AncestorEvent.ANCESTOR_ADDED,
				  (Container)ancestor, ancestor.getParent());
	    }
	}
    
protected voidfireAncestorAdded(javax.swing.JComponent source, int id, java.awt.Container ancestor, java.awt.Container ancestorParent)

	// Guaranteed to return a non-null array
	Object[] listeners = listenerList.getListenerList();
	// Process the listeners last to first, notifying
	// those that are interested in this event
	for (int i = listeners.length-2; i>=0; i-=2) {
	    if (listeners[i]==AncestorListener.class) {
		// Lazily create the event:
		AncestorEvent ancestorEvent = 
		    new AncestorEvent(source, id, ancestor, ancestorParent);
		((AncestorListener)listeners[i+1]).ancestorAdded(ancestorEvent);
	    }	       
	}
    
protected voidfireAncestorMoved(javax.swing.JComponent source, int id, java.awt.Container ancestor, java.awt.Container ancestorParent)

	// Guaranteed to return a non-null array
	Object[] listeners = listenerList.getListenerList();
	// Process the listeners last to first, notifying
	// those that are interested in this event
	for (int i = listeners.length-2; i>=0; i-=2) {
	    if (listeners[i]==AncestorListener.class) {
		// Lazily create the event:
		AncestorEvent ancestorEvent = 
		    new AncestorEvent(source, id, ancestor, ancestorParent);
		((AncestorListener)listeners[i+1]).ancestorMoved(ancestorEvent);
	    }	       
	}
    
protected voidfireAncestorRemoved(javax.swing.JComponent source, int id, java.awt.Container ancestor, java.awt.Container ancestorParent)

	// Guaranteed to return a non-null array
	Object[] listeners = listenerList.getListenerList();
	// Process the listeners last to first, notifying
	// those that are interested in this event
	for (int i = listeners.length-2; i>=0; i-=2) {
	    if (listeners[i]==AncestorListener.class) {
		// Lazily create the event:
		AncestorEvent ancestorEvent = 
		    new AncestorEvent(source, id, ancestor, ancestorParent);
		((AncestorListener)listeners[i+1]).ancestorRemoved(ancestorEvent);
	    }	       
	}
    
javax.swing.event.AncestorListener[]getAncestorListeners()

	return (AncestorListener[])listenerList.getListeners(AncestorListener.class);
    
public voidpropertyChange(java.beans.PropertyChangeEvent evt)

	String s = evt.getPropertyName();

	if (s!=null && (s.equals("parent") || s.equals("ancestor"))) {
	    JComponent component = (JComponent)evt.getSource();

	    if (evt.getNewValue() != null) {
		if (component == firstInvisibleAncestor) {
		    addListeners(component, false);
		    if (firstInvisibleAncestor == null) {
			fireAncestorAdded(root, AncestorEvent.ANCESTOR_ADDED,
					  component, component.getParent());
		    }
		}
	    } else {
		boolean needsNotify = firstInvisibleAncestor == null;
		Container oldParent = (Container)evt.getOldValue();

		removeListeners(oldParent);
		firstInvisibleAncestor = component;
		if (needsNotify) {
		    fireAncestorRemoved(root, AncestorEvent.ANCESTOR_REMOVED,
					component, oldParent);
		}
	    }
	}
    
voidremoveAllListeners()

	removeListeners(root);
    
voidremoveAncestorListener(javax.swing.event.AncestorListener l)

	listenerList.remove(AncestorListener.class, l);
    
voidremoveListeners(java.awt.Component ancestor)

	Component a;
	for (a = ancestor; a != null; a = a.getParent()) {
	    a.removeComponentListener(this);
	    if (a instanceof JComponent) {
		JComponent jAncestor = (JComponent)a;
		jAncestor.removePropertyChangeListener(this);
	    }
	    if (a == firstInvisibleAncestor || a instanceof Window) {
		break;
	    }
	}