#include <cassert>
#include <iostream>

#include <GL/glut.h>
#include <GL/gl.h>

#include <cstdlib>
using namespace std;

//#include <zpr.h>


#include <graphmisc.h>
#include <myglutgui.h>

myglutgui* myglutgui::global=0;


void myglutguikeyboard(unsigned char key, int x, int y)
{
  myglutgui* g = myglutgui::global;
  if (g==0)
  {
    cout << "error:  myglutgui::global==0" << endl;
    cout << "  Call globalSet(); in derived constructor" << endl << endl;
    return;
  }
  
  g->keyboard(key,x,y);
}

void myglutguidisplay()
{
  myglutgui* g = myglutgui::global;
  if (g==0)
  {
    cout << "error:  myglutgui::global==0" << endl;
    cout << "  Call globalSet(); in derived constructor" << endl << endl;
    return;
  }
  
  g->display();
}


void myglutgui::globalSet()
{
  myglutgui::global = this;
}


void myglutgui::keyboard(unsigned char key, int x, int y)
{
#ifndef NDEBUG
cout << "Warning - default keyboard handling behaviour." << endl;
cout << "myglutgui::keyboard(unsigned char key, int x, int y)" << endl;
cout << "  This is the default behaviour.  If you want keys handeled" << endl;
cout << "  over ride the virtual keyboard function eg " << endl;
cout << "  void keyboard(unsigned char key, int x, int y)" << endl;
cout << "    { menu.read(key); }" << endl;
#endif
  switch (key)
  {
    case 27:
      exit(0);
      break;
  }
}

myglutgui::myglutgui
(
  int & argc, 
  char** & argv,
  uintc mode,
  uintc x,
  uintc y,
  string const & title
)
{
  glutInit(&argc,argv);

  glutInitDisplayMode(mode);
  glutInitWindowSize(x,y);
  glutCreateWindow(title.c_str());

  glutDisplayFunc(myglutguidisplay);
  glutKeyboardFunc(myglutguikeyboard);
}

myglutgui::~myglutgui()
{
}




