blob: dc038af32e9a1beffca4724195e74b5d6f444439 [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.widgets;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.MenuEvent;
import org.eclipse.swt.events.MenuListener;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.graphics.Rectangle;
import org.eclipse.swt.internal.widgets.IItemHolderAdapter;
import org.eclipse.swt.internal.widgets.ItemHolder;
public class Menu extends Widget {
private final Shell parent;
private final ItemHolder itemHolder;
private int x;
private int y;
private boolean visible = false;
MenuItem cascade;
public Menu( final Menu menu ) {
this( menu.getParent(), SWT.DROP_DOWN );
}
public Menu( final MenuItem parent ) {
this( parent.getParent().getParent(), SWT.DROP_DOWN );
}
public Menu( final Control parent ) {
this( parent.getShell(), SWT.POP_UP );
}
public Menu( final Shell parent, final int style ) {
super( parent, checkStyle( style ) );
this.parent = parent;
itemHolder = new ItemHolder( MenuItem.class );
MenuHolder.addMenu( parent, this );
}
public final Display getDisplay() {
checkWidget();
return parent.getDisplay();
}
public final Shell getParent() {
checkWidget();
return parent;
}
public MenuItem getParentItem() {
checkWidget ();
return cascade;
}
public Menu getParentMenu() {
checkWidget();
if( cascade != null ) {
return cascade.getParent();
}
return null;
}
public Object getAdapter( final Class adapter ) {
Object result;
if( adapter == IItemHolderAdapter.class ) {
result = itemHolder;
} else {
result = super.getAdapter( adapter );
}
return result;
}
public void setLocation( final int x, final int y ) {
checkWidget();
if( ( style & ( SWT.BAR | SWT.DROP_DOWN ) ) == 0 ) {
this.x = x;
this.y = y;
}
}
public void setLocation( final Point location ) {
checkWidget();
if( location == null ) {
SWT.error( SWT.ERROR_NULL_ARGUMENT );
}
setLocation( location.x, location.y );
}
public Rectangle getBounds() {
checkWidget();
// TODO: [fappel] how to calculate width and height?
return new Rectangle( x, y, 0, 0 );
}
public Shell getShell() {
checkWidget();
return parent;
}
///////////
// Visible
public void setVisible( final boolean visible ) {
checkWidget();
if( ( style & ( SWT.BAR | SWT.DROP_DOWN ) ) == 0 ) {
this.visible = visible;
}
}
public boolean getVisible() {
checkWidget();
boolean result;
if( ( style & SWT.BAR ) != 0 ) {
result = ( this == parent.getMenuBar() );
} else if( ( style & SWT.POP_UP ) != 0 ) {
result = visible;
} else {
// we don't know which menus are currently visible on the client
result = false;
}
return result;
}
public boolean isVisible (){
checkWidget();
return getVisible();
}
///////////
// Enabled
public void setEnabled( final boolean enabled ) {
checkWidget();
state &= ~DISABLED;
if( !enabled ) {
state |= DISABLED;
}
}
public boolean getEnabled() {
checkWidget();
return ( state & DISABLED ) == 0;
}
public boolean isEnabled() {
checkWidget();
Menu parentMenu = getParentMenu();
if( parentMenu == null ) {
return getEnabled();
}
return getEnabled() && parentMenu.isEnabled();
}
////////////////////////////
// Management of menu items
public int getItemCount() {
checkWidget();
return itemHolder.size();
}
public MenuItem[] getItems() {
checkWidget();
return (org.eclipse.swt.widgets.MenuItem[] )itemHolder.getItems();
}
public MenuItem getItem( final int index ) {
checkWidget();
return ( MenuItem )itemHolder.getItem( index );
}
public int indexOf( final MenuItem menuItem ) {
checkWidget();
if( menuItem == null ) {
SWT.error( SWT.ERROR_NULL_ARGUMENT );
}
if( menuItem.isDisposed() ) {
SWT.error( SWT.ERROR_INVALID_ARGUMENT );
}
return itemHolder.indexOf( menuItem );
}
////////////////////
// Widget overrides
// TODO [rh] disposal of Menu and its items not yet completely implemented
protected final void releaseChildren() {
MenuItem[] menuItems = (org.eclipse.swt.widgets.MenuItem[] )ItemHolder.getItems( this );
for( int i = 0; i < menuItems.length; i++ ) {
menuItems[ i ].dispose();
}
}
protected final void releaseParent() {
// do nothing
}
protected final void releaseWidget() {
MenuHolder.removeMenu( parent, this );
}
///////////////////////////////////////
// Listener registration/deregistration
public void addMenuListener( final MenuListener listener ) {
checkWidget();
MenuEvent.addListener( this, listener );
}
public void removeMenuListener( final MenuListener listener ) {
checkWidget();
MenuEvent.removeListener( this, listener );
}
//////////////////
// Helping methods
private static int checkStyle( final int style ) {
return checkBits( style, SWT.POP_UP, SWT.BAR, SWT.DROP_DOWN, 0, 0, 0 );
}
}