#include "puLocal.h"

void drop_down_the_menu ( puObject *b )
{
  puPopupMenu *p = (puPopupMenu *) b -> getUserData () ;

  if ( b -> getValue () )
    p->reveal () ;
  else
    p->hide () ;

  for ( puObject *child = b -> getParent () -> getFirstChild () ;
        child != NULL ; child = child -> next )
  {
    if (( child -> getType() & PUCLASS_BUTTON    ) != 0 && child != b ) child -> clrValue () ;
    if (( child -> getType() & PUCLASS_POPUPMENU ) != 0 && child != p ) child -> hide     () ;
  }
}

void puMenuBar::add_submenu ( char *str, char *items[], puCallback cb[] )
{
  int w, h ;
  getSize ( &w, &h ) ;

  puOneShot    *b = new puOneShot ( w+10, 0, str ) ;
  b -> setStyle ( PUSTYLE_SPECIAL_UNDERLINED ) ;
  b -> setColourScheme ( colour[PUCOL_FOREGROUND][0],
                         colour[PUCOL_FOREGROUND][1],
                         colour[PUCOL_FOREGROUND][2],
                         colour[PUCOL_FOREGROUND][3] ) ;
  b -> setCallback ( drop_down_the_menu ) ;
  b -> setActiveDirn ( PU_UP_AND_DOWN ) ;

  puPopupMenu *p = new puPopupMenu ( w+10, 0 ) ;

  b -> setUserData ( p ) ;

  for ( int i = 0 ; items[i] != NULL ; i++ )
    p -> add_item ( items[i], cb[i] ) ;

  p->close () ;
  recalc_bbox () ;
}

void puMenuBar::close (void)
{
  puInterface::close () ;

  if ( dlist == NULL )
    return ;

  int width = 0 ;
  puObject *ob ;

  /*
    Use alternate objects - which gets the puOneShot/puPopupMenu pairs
  */

  for ( ob = dlist ; ob != NULL ; ob = ob -> next )
  {
    int w, h ;

    /* Reposition the button so it looks nice */

    ob -> getSize ( &w, &h ) ;
    ob -> setPosition ( width, 0 ) ;
    ob = ob -> next ;

    /* Reposition the submenu so it sits under the button */

    int w2, h2 ;
    ob -> getSize ( &w2, &h2 ) ;
    ob -> setPosition ( width, -h2 ) ;

    /* Next please! */
    width += w ;
  }

  recalc_bbox () ;
}