/******************************************************************************* * Copyright (c) 2008, 2015 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.rap.internal.design.example.managers; import java.util.ArrayList; import java.util.List; import org.eclipse.jface.action.IContributionItem; import org.eclipse.jface.action.MenuManager; import org.eclipse.jface.action.Separator; import org.eclipse.jface.action.SubContributionItem; import org.eclipse.rap.rwt.RWT; import org.eclipse.swt.SWT; import org.eclipse.swt.events.SelectionAdapter; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.graphics.Point; import org.eclipse.swt.graphics.Rectangle; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.Menu; import org.eclipse.swt.widgets.MenuItem; import org.eclipse.swt.widgets.ToolBar; import org.eclipse.swt.widgets.ToolItem; public class MenuBarManager extends MenuManager { private static final String MENU_BAR_VARIANT = "menuBar"; //$NON-NLS-1$ private Composite menuParent; private final List<ToolItem> toolItemList = new ArrayList<ToolItem>(); private ToolBar toolbar; @Override public void fill( final Composite parent ) { menuParent = parent; toolbar = new ToolBar( parent, SWT.WRAP | SWT.RIGHT ); toolbar.setData( RWT.CUSTOM_VARIANT, MENU_BAR_VARIANT ); update( false, false ); } @Override protected void update( final boolean force, final boolean recursive ) { super.update( force, recursive ); if( menuParent != null && ( force || isDirty() ) ) { disposeToolItems(); IContributionItem[] items = getItems(); if( items.length > 0 && menuParent != null ) { for( int i = 0; i < items.length; i++ ) { IContributionItem item = items[ i ]; if( item.isVisible() ) { makeEntry( item ); } } } menuParent.layout( true, true ); } } private void disposeToolItems() { for( ToolItem item : toolItemList ) { if( !item.isDisposed() ) { Object data = item.getData(); if( data != null && data instanceof Menu ) { Menu menu = ( Menu )data; if( !menu.isDisposed() ) { menu.dispose(); } } item.dispose(); } } } private void makeEntry( final IContributionItem item ) { IContributionItem tempItem = null; if( item instanceof SubContributionItem ) { SubContributionItem subItem = ( SubContributionItem ) item; tempItem = subItem.getInnerItem(); } else if( item instanceof MenuManager ) { tempItem = item; } if( tempItem != null && tempItem instanceof MenuManager ) { final MenuManager manager = ( MenuManager ) tempItem; int style = extractStyle( manager ); final ToolItem toolItem = new ToolItem( toolbar, style ); toolItem.setText( manager.getMenuText() ); toolItem.setData( RWT.CUSTOM_VARIANT, MENU_BAR_VARIANT ); createMenu( manager, toolItem ); // needed to clear all controls in case of an update toolItemList.add( toolItem ); } } private int extractStyle( MenuManager manager ) { int style = SWT.NONE; if( manager.getItems() != null && manager.getItems().length > 0 ) { style = SWT.DROP_DOWN; } return style; } private void createMenu( final MenuManager manager, final ToolItem toolItem ) { final Menu menu = new Menu( menuParent ); toolItem.setData( menu ); menu.setData( RWT.CUSTOM_VARIANT, MENU_BAR_VARIANT ); toolItem.addSelectionListener( new SelectionAdapter() { @Override public void widgetSelected( final SelectionEvent e ) { // cleanup the menu MenuItem[] menuItems = menu.getItems(); for( int i = 0; i < menuItems.length; i++ ) { menuItems[ i ].dispose(); } hookMenuToToolItem( manager, menu ); // set the menu position Display display = toolItem.getDisplay(); Rectangle bounds = toolItem.getBounds(); int leftIndent = bounds.x; int topIndent = bounds.y + bounds.height; Point indent = new Point( leftIndent, topIndent ); Point menuLocation = display.map( toolbar, toolbar.getShell(), indent ); menu.setLocation( menuLocation ); // style the menuitems and show the menu menu.setData( RWT.CUSTOM_VARIANT, MENU_BAR_VARIANT ); styleMenuItems( menu ); menu.setVisible( true ); } private void hookMenuToToolItem( MenuManager manager, Menu menu ) { IContributionItem[] contribItems = manager.getItems(); if( contribItems != null && contribItems.length > 0 ) { for( int i = 0; i < contribItems.length; i++ ) { if( contribItems[ i ].isVisible() ) { if( i > 0 || !( contribItems[ i ] instanceof Separator ) ) { contribItems[ i ].fill( menu, -1 ); } } } } } } ); } private void styleMenuItems( Menu menu ) { MenuItem[] items = menu.getItems(); if( items != null && items.length > 0 ) { for( int i = 0; i < items.length; i++ ) { items[ i ].setData( RWT.CUSTOM_VARIANT, MENU_BAR_VARIANT ); Menu subMenu = items[ i ].getMenu(); if( subMenu != null ) { subMenu.setData( RWT.CUSTOM_VARIANT, MENU_BAR_VARIANT ); styleMenuItems( subMenu ); } } } } public ToolBar getMenuToolBar() { return toolbar; } }