#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

