/*******************************************************************************
 * 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 );
  }
}
