/*******************************************************************************
* Copyright (c) 2002, 2009 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
* EclipseSource - ongoing development
******************************************************************************/
package org.eclipse.swt.internal.widgets.menukit;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.rwt.lifecycle.JSWriter;
import org.eclipse.rwt.lifecycle.WidgetLCAUtil;
import org.eclipse.swt.internal.widgets.WidgetTreeVisitor;
import org.eclipse.swt.internal.widgets.WidgetTreeVisitor.AllWidgetTreeVisitor;
import org.eclipse.swt.widgets.*;
final class DropDownMenuLCA extends MenuDelegateLCA {
void preserveValues( final Menu menu ) {
MenuLCAUtil.preserveEnabled( menu );
MenuLCAUtil.preserveMenuListener( menu );
MenuLCAUtil.preserveWidth( menu );
WidgetLCAUtil.preserveCustomVariant( menu );
WidgetLCAUtil.preserveHelpListener( menu );
}
void readData( final Menu menu ) {
MenuLCAUtil.readMenuEvent( menu );
WidgetLCAUtil.processHelp( menu );
}
void renderInitialization( final Menu menu ) throws IOException {
JSWriter writer = JSWriter.getWriterFor( menu );
// TODO [rh] check whether it is allowed (in SWT and/or Qooxdoo) to
// assign a Menu to more than one MenuItem
// [rst] It's allowed in SWT but not in qooxdoo - we have a problem here
writer.newWidget( "org.eclipse.rwt.widgets.Menu" );
MenuItem[] menuItems = findReferringMenuItems( menu );
for( int i = 0; i < menuItems.length; i++ ) {
writer.call( menuItems[ i ], "setMenu", new Object[] { menu } );
}
}
void renderChanges( final Menu menu ) throws IOException {
WidgetLCAUtil.writeCustomVariant( menu );
MenuLCAUtil.writeEnabled( menu );
MenuLCAUtil.writeMenuListener( menu );
MenuLCAUtil.writeUnhideMenu( menu );
WidgetLCAUtil.writeHelpListener( menu );
}
/**
* <p>Returns all <code>MenuItems</code> whose <code>getMenu()</code> returns
* the given <code>menu</code>. An empty array is returned if no
* <code>MenuItem</code>s refer to the given <code>menu</code>.</p>
*/
private static MenuItem[] findReferringMenuItems( final Menu menu ) {
final List menuItems = new ArrayList();
Decorations parent = menu.getParent();
WidgetTreeVisitor.accept( parent, new AllWidgetTreeVisitor() {
public boolean doVisit( final Widget widget ) {
if( widget instanceof MenuItem ) {
MenuItem menuItem = ( MenuItem )widget;
if( menuItem.getMenu() == menu ) {
menuItems.add( menuItem );
}
}
// TODO [rh] find a way to cancel visitor after all menus are done?
return true;
}
} );
MenuItem[] result = new MenuItem[ menuItems.size() ];
menuItems.toArray( result );
return result;
}
}