/******************************************************************************* * Copyright (c) 2009 EclipseSource and others. All rights reserved. * This program and the accompanying materials are made available under the * terms of the Eclipse Public License v1.0 which accompanies this distribution, * and is available at http://www.eclipse.org/legal/epl-v10.html * * Contributors: * EclipseSource - initial API and implementation ******************************************************************************/ package org.eclipse.swt.internal.widgets; import java.util.ArrayList; import java.util.List; import org.eclipse.swt.events.DisposeEvent; import org.eclipse.swt.events.DisposeListener; import org.eclipse.swt.widgets.Widget; public class Decorator extends Widget { public static final String KEY_DECORATIONS = "decorations"; private Widget decoratedWidget; private DisposeListener disposeListener; public Decorator( final Widget widget, final int style ) { super( widget, style ); this.decoratedWidget = widget; registerDisposeListeners(); bindDecoration(); } protected final Widget getDecoratedWidget() { return decoratedWidget; } ////////////////// // Helping methods private void registerDisposeListeners() { disposeListener = new DisposeListener() { public void widgetDisposed( final DisposeEvent event ) { release(); } }; addDisposeListener( disposeListener ); this.decoratedWidget.addDisposeListener( disposeListener ); } private void release() { if( decoratedWidget != null && !decoratedWidget.isDisposed() ) { removeDisposeListener( disposeListener ); decoratedWidget.removeDisposeListener( disposeListener ); disposeListener = null; unbindDecoration(); decoratedWidget = null; dispose(); } } private void bindDecoration() { List decorations = ( List )decoratedWidget.getData( KEY_DECORATIONS ); if( decorations == null ) { decorations = new ArrayList(); } decorations.add( this ); decoratedWidget.setData( KEY_DECORATIONS, decorations ); } private void unbindDecoration() { List decorations = ( List )decoratedWidget.getData( KEY_DECORATIONS ); if( decorations != null ) { decorations.remove( this ); if( decorations.size() == 0 ) { decorations = null; } decoratedWidget.setData( KEY_DECORATIONS, decorations ); } } }