/*******************************************************************************
* 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 org.eclipse.rwt.graphics.Graphics;
import org.eclipse.rwt.internal.lifecycle.JSConst;
import org.eclipse.rwt.lifecycle.*;
import org.eclipse.swt.events.ArmEvent;
import org.eclipse.swt.events.MenuEvent;
import org.eclipse.swt.graphics.Font;
import org.eclipse.swt.widgets.Menu;
import org.eclipse.swt.widgets.MenuItem;
final class MenuLCAUtil {
private static final int MENU_PADDING = 1;
private static final int MENU_BORDER = 1;
private static final int ITEM_LEFT_PADDING = 2;
private static final int ITEM_RIGHT_PADDING = 4;
private static final int ITEM_SPACING = 2;
private static final int ITEM_IMAGE = 16;
static final String PROP_ENABLED = "enabled";
static final String PROP_WIDTH = "width";
static final String PROP_MENU_LISTENER = "menuListener";
public static void preserveEnabled( final Menu menu ) {
IWidgetAdapter adapter = WidgetUtil.getAdapter( menu );
adapter.preserve( PROP_ENABLED, Boolean.valueOf( menu.getEnabled() ) );
}
public static void writeEnabled( final Menu menu ) throws IOException {
Boolean newValue = Boolean.valueOf( menu.getEnabled() );
Boolean defValue = Boolean.TRUE;
JSWriter writer = JSWriter.getWriterFor( menu );
writer.set( PROP_ENABLED, JSConst.QX_FIELD_ENABLED, newValue, defValue );
}
public static void preserveMenuListener( final Menu menu ) {
Boolean hasListener = Boolean.valueOf( hasListener( menu ) );
IWidgetAdapter adapter = WidgetUtil.getAdapter( menu );
adapter.preserve( PROP_MENU_LISTENER, hasListener );
}
public static void writeMenuListener( final Menu menu ) throws IOException {
String prop = PROP_MENU_LISTENER;
Boolean newValue = Boolean.valueOf( hasListener( menu ) );
Boolean defValue = Boolean.FALSE;
if( WidgetLCAUtil.hasChanged( menu, prop, newValue, defValue ) ) {
JSWriter writer = JSWriter.getWriterFor( menu );
Object[] args = new Object[]{ newValue };
writer.call( "setHasMenuListener", args );
}
}
public static void readMenuEvent( final Menu menu ) {
if( WidgetLCAUtil.wasEventSent( menu, JSConst.EVENT_MENU_SHOWN ) ) {
MenuEvent event = new MenuEvent( menu, MenuEvent.MENU_SHOWN );
event.processEvent();
}
if( WidgetLCAUtil.wasEventSent( menu, JSConst.EVENT_MENU_HIDDEN ) ) {
MenuEvent event = new MenuEvent( menu, MenuEvent.MENU_HIDDEN );
event.processEvent();
}
}
/* (intentionally non-JavaDoc'ed)
* Activates the menu if a menu event was received (in this case, only a
* preliminary menu is displayed).
*/
public static void writeUnhideMenu( final Menu menu ) throws IOException {
String eventId = JSConst.EVENT_MENU_SHOWN;
if( WidgetLCAUtil.wasEventSent( menu, eventId ) ) {
JSWriter writer = JSWriter.getWriterFor( menu );
Boolean reveal = Boolean.valueOf( menu.getItemCount() > 0 );
Object[] args = new Object[]{ reveal };
writer.call( "unhideItems", args );
}
}
static void preserveWidth( final Menu menu ) {
int width = computeWidth( menu );
IWidgetAdapter adapter = WidgetUtil.getAdapter( menu );
adapter.preserve( PROP_WIDTH, new Integer( width ) );
}
static void writeWidth( final Menu menu ) throws IOException {
int width = computeWidth( menu );
JSWriter writer = JSWriter.getWriterFor( menu );
writer.set( PROP_WIDTH, "width", new Integer( width ), null );
}
static int computeWidth( final Menu menu ) {
int maxItemWidth = 0;
MenuItem[] items = menu.getItems();
for( int i = 0; i < items.length; i++ ) {
int width = MenuLCAUtil.getMenuItemWidth( items [ i ] );
maxItemWidth = Math.max( width, maxItemWidth );
}
return maxItemWidth + MENU_PADDING * 2 + MENU_BORDER * 2;
}
private static int getMenuItemWidth( final MenuItem menuItem ) {
Font systemFont = menuItem.getDisplay().getSystemFont();
int result
= ITEM_LEFT_PADDING
+ ITEM_IMAGE
+ ITEM_SPACING
+ Graphics.stringExtent( systemFont, menuItem.getText() ).x
+ ITEM_SPACING
+ ITEM_IMAGE
+ ITEM_RIGHT_PADDING;
return result;
}
private static boolean hasListener( final Menu menu ) {
boolean result = MenuEvent.hasListener( menu );
if( !result ) {
MenuItem[] items = menu.getItems();
for( int i = 0; i < items.length && !result; i++ ) {
result = ArmEvent.hasListener( items[ i ] );
}
}
return result;
}
}