root/src/libs/glut/glutMenu.h
/***********************************************************
 *      Copyright (C) 1997, Be Inc.  Copyright (C) 1999, Jake Hamby.
 *
 * This program is freely distributable without licensing fees
 * and is provided without guarantee or warrantee expressed or
 * implied. This program is -not- in the public domain.
 *
 *  FILE:       glutMenu.h
 *
 *      DESCRIPTION:    the GlutMenu class is a simple popup menu
 ***********************************************************/

/***********************************************************
 *      Headers
 ***********************************************************/
#include <GL/glut.h>
#include <Menu.h>
#include <MenuItem.h>
#include <PopUpMenu.h>

/***********************************************************
 *      Definitions
 ***********************************************************/
const int32 MENU_ITEM = 'menu';

/***********************************************************
 *      CLASS:  GlutMenu
 ***********************************************************/
class GlutMenuItem;
class GlutPopUp;
class GlutMenu {
public:
        GlutMenu(int n_id, GLUTselectCB n_select) {
                id = n_id;
                select = n_select;
                list = 0;
                num = 0;
        }
        ~GlutMenu();
        BMenu *CreateBMenu(bool toplevel=true); // construct BPopUpMenu

        // public data
        int id;
        GLUTselectCB select;    // callback function
        GlutMenuItem *list;             // list of menu items
        int num;                                // number of items
};

/***********************************************************
 *      CLASS:  GlutMenuItem
 ***********************************************************/
class GlutMenuItem {
public:
        GlutMenuItem(GlutMenu *n_menu, bool n_trig, int n_value, const char *n_label);

        // public data
        GlutMenu *menu;         // parent menu
        bool isTrigger;         // are we a submenu?
        int value;                      // value to send, or submenu id if isTrigger
        char *label;            // strdup'ed label string
        GlutMenuItem *next; // next menu entry on list
};

/***********************************************************
 *      CLASS:  GlutPopUp
 ***********************************************************/
class GlutPopUp : public BPopUpMenu {
public:
        GlutPopUp(int m) : BPopUpMenu(0, false, false) { menu = m;}
        
        BPoint point;   // point to start menu
        GlutWindow *win;        // pointer to my window
        int menu;               // my menu number
};

/***********************************************************
 *      CLASS:  GlutBMenuItem
 ***********************************************************/
class GlutBMenuItem : public BMenuItem {
public:
        GlutBMenuItem(const char *name) : BMenuItem(name, 0) {}
        GlutBMenuItem(BMenu* menu) : BMenuItem(menu) {}
        int menu, value;
};