1 6 21 22 package de.schlichtherle.swing; 23 24 import de.schlichtherle.swing.event.PanelEvent; 25 import de.schlichtherle.swing.event.PanelListener; 26 27 import java.awt.AWTEvent ; 28 import java.awt.Component ; 29 import java.awt.LayoutManager ; 30 import java.awt.Window ; 31 import java.awt.event.ComponentAdapter ; 32 import java.awt.event.ComponentEvent ; 33 import java.awt.event.ComponentListener ; 34 import java.awt.event.HierarchyEvent ; 35 import java.awt.event.HierarchyListener ; 36 import java.util.EventListener ; 37 import java.util.logging.Logger ; 38 39 import javax.swing.JPanel ; 40 import javax.swing.event.AncestorEvent ; 41 import javax.swing.event.AncestorListener ; 42 import javax.swing.event.EventListenerList ; 43 44 60 public class EnhancedPanel extends JPanel { 61 62 private static final Logger logger 63 = Logger.getLogger(EnhancedPanel.class.getName()); 64 65 74 public EnhancedPanel(LayoutManager layout, boolean isDoubleBuffered) { 75 super(layout, isDoubleBuffered); 76 init(); 77 } 78 79 85 public EnhancedPanel(LayoutManager layout) { 86 super(layout); 87 init(); 88 } 89 90 100 public EnhancedPanel(boolean isDoubleBuffered) { 101 super(isDoubleBuffered); 102 init(); 103 } 104 105 109 public EnhancedPanel() { 110 init(); 111 } 112 113 private void init() { 114 addHierarchyListener(new HierarchyListener () { 115 public void hierarchyChanged(final HierarchyEvent e) { 116 if ((e.getChangeFlags() & HierarchyEvent.SHOWING_CHANGED) 117 != HierarchyEvent.SHOWING_CHANGED) 118 return; 119 120 122 123 final Window window = getAncestorWindow(); 124 final boolean windowShown = window.isShowing(); 125 if (windowShown != isShowing()) 126 return; 127 128 processPanelEvent(new PanelEvent(EnhancedPanel.this, 129 windowShown 130 ? PanelEvent.ANCESTOR_WINDOW_SHOWN 131 : PanelEvent.ANCESTOR_WINDOW_HIDDEN)); 132 } 133 }); 134 135 191 } 192 193 199 protected AWTEvent coalesceEvents( 200 final AWTEvent existingEvent, 201 final AWTEvent newEvent) { 202 assert existingEvent.getSource() == newEvent.getSource(); 203 204 if (existingEvent instanceof PanelEvent && newEvent instanceof PanelEvent) { 207 assert false : "This is dead code since the refactoring for TrueZIP 6.4!"; 208 final int id = newEvent.getID(); 209 assert id == existingEvent.getID(); 210 switch (id) { 211 case PanelEvent.ANCESTOR_WINDOW_SHOWN: 212 case PanelEvent.ANCESTOR_WINDOW_HIDDEN: 213 return newEvent; 214 } 215 } 216 217 return super.coalesceEvents(existingEvent, newEvent); 218 } 219 220 225 protected void processEvent(final AWTEvent event) { 226 if (event instanceof PanelEvent) { 227 processPanelEvent((PanelEvent) event); 229 } else { 230 super.processEvent(event); 231 } 232 } 233 234 239 protected void processPanelEvent(final PanelEvent event) { 240 logger.fine("Processing " + event); 241 switch (event.getID()) { 242 case PanelEvent.ANCESTOR_WINDOW_SHOWN: 243 fireAncestorWindowShown(event); 244 break; 245 246 case PanelEvent.ANCESTOR_WINDOW_HIDDEN: 247 fireAncestorWindowHidden(event); 248 break; 249 250 default: 251 throw new AssertionError (); 252 } 253 } 254 255 260 public Window getAncestorWindow() { 261 return getAncestorWindow(this); 262 } 263 264 private static final Window getAncestorWindow(Component c) { 265 while (c != null && !(c instanceof Window )) 266 c = c.getParent(); 267 268 return (Window ) c; 269 } 270 271 275 private transient EventListenerList listenerList; 276 277 291 public void addPanelListener(final PanelListener listener) { 292 if (listener == null) 293 throw new NullPointerException (); 294 if (listenerList == null ) 295 listenerList = new EventListenerList (); 296 listenerList.add(PanelListener.class, listener); 297 } 298 299 310 public void removePanelListener(final PanelListener listener) { 311 if (listener == null) 312 throw new NullPointerException (); 313 if (listenerList == null) 314 return; 315 listenerList.remove(PanelListener.class, listener); 316 } 317 318 328 public PanelListener[] getPanelListeners() { 329 if (listenerList != null) 330 return (PanelListener[]) listenerList.getListeners(PanelListener.class); 331 else 332 return new PanelListener[0]; 333 } 334 335 public EventListener [] getListeners(Class listenerType) { 336 if (listenerType == PanelListener.class) 337 return getPanelListeners(); 338 else 339 return super.getListeners(listenerType); 340 } 341 342 350 protected void fireAncestorWindowShown(final PanelEvent event) { 351 if (listenerList == null) 352 return; 353 final Object [] listeners = listenerList.getListenerList(); 354 for (int i = listeners.length - 2; i >= 0; i -= 2) { 355 if (listeners[i] == PanelListener.class) 356 ((PanelListener) listeners[i+1]).ancestorWindowShown(event); 357 } 358 } 359 360 368 protected void fireAncestorWindowHidden(final PanelEvent event) { 369 if (listenerList == null) 370 return; 371 final Object [] listeners = listenerList.getListenerList(); 372 for (int i = listeners.length - 2; i >= 0; i -= 2) { 373 if (listeners[i] == PanelListener.class) 374 ((PanelListener) listeners[i+1]).ancestorWindowHidden(event); 375 } 376 } 377 } 378 | Popular Tags |