/******************************************************************************* * Copyright (c) 2009, 2011 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 { private static final String KEY_DECORATORS = Widget.class.getName() + "#decorators"; private static final Decorator[] EMPTY_DECORATORS = new Decorator[ 0 ]; public static Decorator[] getDecorators( Widget widget ) { Decorator[] result = EMPTY_DECORATORS; List<Decorator> decorationsList = getDecoratorsList( widget ); if( decorationsList != null ) { result = decorationsList.toArray( new Decorator[ decorationsList.size() ] ); } return result; } private Widget decoratedWidget; private DisposeListener disposeListener; public Decorator( Widget widget, 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( 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<Decorator> decorations = getDecoratorsList( decoratedWidget ); if( decorations == null ) { decorations = new ArrayList<Decorator>(); } decorations.add( this ); setDecoratorsList( decorations ); } private void unbindDecoration() { List<Decorator> decorations = getDecoratorsList( decoratedWidget ); if( decorations != null ) { decorations.remove( this ); if( decorations.size() == 0 ) { decorations = null; } setDecoratorsList( decorations ); } } private void setDecoratorsList( List<Decorator> decorations ) { decoratedWidget.setData( KEY_DECORATORS, decorations ); } @SuppressWarnings("unchecked") private static List<Decorator> getDecoratorsList( Widget widget ) { return ( List<Decorator> )widget.getData( KEY_DECORATORS ); } }