#ifndef MAC_OPENGL_WINDOW_H
#define MAC_OPENGL_WINDOW_H

#include "CommonWindowInterface.h"

#define b3gDefaultOpenGLWindow MacOpenGLWindow

class MacOpenGLWindow : public CommonWindowInterface
{
   struct MacOpenGLWindowInternalData* m_internalData;
   float m_mouseX;
   float m_mouseY;
  int m_modifierFlags;

   b3MouseButtonCallback m_mouseButtonCallback;
   b3MouseMoveCallback m_mouseMoveCallback;
   b3WheelCallback m_wheelCallback;
   b3KeyboardCallback m_keyboardCallback;
       b3RenderCallback m_renderCallback;

   float m_retinaScaleFactor;
       bool m_allowRetina;

public:

   MacOpenGLWindow();
   virtual ~MacOpenGLWindow();

   void init(int width, int height, const char* windowTitle);

   void closeWindow();

   void startRendering();

   void endRendering();//swap buffers

       virtual bool    requestedExit() const;

       virtual void    setRequestExit();

   void getMouseCoordinates(int& x, int& y);

   void runMainLoop();

    virtual bool    isModifierKeyPressed(int key);

   void setMouseButtonCallback(b3MouseButtonCallback   mouseCallback)
   {
       m_mouseButtonCallback = mouseCallback;
   }

   void setMouseMoveCallback(b3MouseMoveCallback       mouseCallback)
   {
       m_mouseMoveCallback = mouseCallback;
   }

   void setResizeCallback(b3ResizeCallback resizeCallback);


       void setKeyboardCallback( b3KeyboardCallback    keyboardCallback)
   {
       m_keyboardCallback = keyboardCallback;
   }

       virtual b3MouseMoveCallback getMouseMoveCallback()
       {
               return m_mouseMoveCallback;
       }
       virtual b3MouseButtonCallback getMouseButtonCallback()
       {
               return m_mouseButtonCallback;
       }
       virtual b3ResizeCallback getResizeCallback();

       virtual b3WheelCallback getWheelCallback()
       {
               return m_wheelCallback;
       }

   b3KeyboardCallback getKeyboardCallback()
       {
               return m_keyboardCallback;
       }

       void setWheelCallback (b3WheelCallback wheelCallback)
   {
       m_wheelCallback = wheelCallback;
   }

   float getRetinaScale() const
   {
       return m_retinaScaleFactor;
   }
       virtual void    setAllowRetina(bool allow)
       {
               m_allowRetina = allow;
       }

       virtual void    createWindow(const b3gWindowConstructionInfo& ci);

       virtual float   getTimeInSeconds();


   virtual int   getWidth() const;
   virtual int   getHeight() const;


       virtual void setRenderCallback( b3RenderCallback renderCallback);

       virtual void setWindowTitle(const char* title);

   int fileOpenDialog(char* filename, int maxNameLength);

};


#endif