blob: ae1f098749b405f6f34bf5f68143d849565abaf9 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2002-2006 Innoopract Informationssysteme GmbH.
* 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:
* Innoopract Informationssysteme GmbH - initial API and implementation
******************************************************************************/
package org.eclipse.swt.internal.widgets;
import org.eclipse.swt.widgets.*;
/**
* TODO [rh] JavaDoc
* <p></p>
*/
public class WidgetTreeVisitor {
public static abstract class AllWidgetTreeVisitor extends WidgetTreeVisitor {
public final boolean visit( final Widget widget ) {
return doVisit( widget );
}
public final boolean visit( final Composite composite ) {
return doVisit( composite );
}
public abstract boolean doVisit( Widget widget );
}
// TODO [rh] all SWT Menu have shell as their parent
// we should visit the menus as part of visiting shell, not on each
// control -> could lead to visiting one menu multiple times
public static void accept( final Widget root,
final WidgetTreeVisitor visitor )
{
if( root instanceof Composite ) {
Composite composite = ( Composite )root;
if( visitor.visit( composite ) ) {
handleMenus( composite, visitor );
handleItems( root, visitor );
Control[] children = composite.getChildren();
for( int i = 0; i < children.length; i++ ) {
accept( children[ i ], visitor );
}
}
} else if( ItemHolder.isItemHolder( root ) ) {
if( visitor.visit( root ) ) {
handleItems( root, visitor );
}
} else {
visitor.visit( root );
}
}
public boolean visit( final Widget widget ) {
return true;
}
public boolean visit( final Composite composite ) {
return true;
}
///////////////////////////////////////////////////
// Helping methods to visit particular hierarchies
private static void handleMenus( final Composite composite,
final WidgetTreeVisitor visitor )
{
if( MenuHolder.isMenuHolder( composite ) ) {
Menu[] menus = MenuHolder.getMenus( composite );
for( int i = 0; i < menus.length; i++ ) {
accept( menus[ i ], visitor );
}
}
}
private static void handleItems( final Widget root,
final WidgetTreeVisitor visitor )
{
if( ItemHolder.isItemHolder( root ) ) {
Item[] items = ItemHolder.getItems( root );
for( int i = 0; i < items.length; i++ ) {
accept( items[ i ], visitor );
}
}
}
}