// Qt Viewer for libVRML97
//
// Copyright (C) 1999 by Kenneth Bentley <bentley@nuc.net>
//
// This software may be distributed under the terms of the Q
// Public License, version 1.0 or later. Please see the file LICENSE for 
// terms. 

// based on libVRML97 by Chris Morley. and gtkLookat, by Erik Andersen

// libVRML97 is Copyright (C) 1998,1999 Chris Morley (cmorley@vermontel.com)

// gtkLookat is Copyright (C) 1998 by Erik Andersen <andersee@debian.org> under
// the terms of the GNU Public License. Erik Anderson has granted permission to 
// license this derivative work under QPL.

#include "vGLWidget.h"
#include "ViewerQt.h"
#include <qtextstream.h>
#include <qsize.h>
#include <qapplication.h>
#include <qkeycode.h>

#include <OpenVRML/System.h>


vGLWidget::vGLWidget( QWidget *parent, const char *name )
     : QGLWidget( QGLFormat( QGL::DoubleBuffer | QGL::DepthBuffer | 
                             QGL::Rgba | QGL::AlphaChannel | QGL::DirectRendering ), 
                     parent, name ), 
       viewer(0), _parent(parent)
{
}

void vGLWidget::setViewerPtr( ViewerQt *v_ptr)
{
    viewer = v_ptr;
}

bool vGLWidget::event( QEvent *e )
{
#if 0 //mdvh code below does not compile on win32. Probably X11 specific
    if ( e->type() == Levent_SHOW ) {    // QShowEvent
        if (viewer) 
            viewer->handleRedraw();
        return TRUE;                        // eat event
    }
    else if ( e->type() == rodent_PRESS ) {
        viewer->vMousePressEvent( (QMouseEvent *)e);
        return TRUE;                        // eat event
    }
    else if ( e->type() == rodent_RELEASE  ) {
        viewer->vMouseReleaseEvent( (QMouseEvent *)e);
        return TRUE;                        // eat event
    }
    else if ( e->type() == rodent_MOVE   ) {
    viewer->vMouseMoveEvent( (QMouseEvent *)e);
        return TRUE;                        // eat event
    }
    else if ( e->type() == Levent_TIMER   ) {
    killTimer( ((QTimerEvent *)e)->timerId() );
    if (viewer)
        viewer->timerUpdate();
        return TRUE;                        // eat event
    }
    // in plugin mode, mainWgt is no longer topLevel, meaning it will not normally 
    // receive key events, so send key events to it directly
    else if ( e->type() == Levent_KEYPRESS   ) {
        qApp->sendEvent(_parent, e);
        return TRUE;                        // eat event
    }
    else if ( e->type() == Levent_PAINT   ) { // suppress these
        if (viewer){
            makeCurrent();
            viewer->handleRedraw();
        }
        return TRUE;
    }
    else if ( e->type() == Levent_RESIZE   ) { // suppress these
        QSize sz = ((QResizeEvent *)e)->size();
        if (viewer){
            makeCurrent();
            viewer->resize(sz.width(), sz.height() );
        }
        return TRUE;                        // eat event
    }
    return FALSE;                           // standard event processing
#endif //mdvh
/*	None = 0,				// invalid event
	Timer = 1,				// timer event
	MouseButtonPress = 2,			// mouse button pressed
	MouseButtonRelease = 3,			// mouse button released
	MouseButtonDblClick= 4,			// mouse button double click
	MouseMove = 5,				// mouse move
	KeyPress = 6,				// key pressed
	KeyRelease = 7,				// key released
	FocusIn = 8,				// keyboard focus received
	FocusOut = 9,				// keyboard focus lost
	Enter = 10,				// mouse enters widget
	Leave = 11,				// mouse leaves widget
	Paint = 12,				// paint widget
	Move = 13,				// move widget
	Resize = 14,				// resize widget
	Create = 15,				// after object creation
	Destroy = 16,				// during object destruction
	Show = 17,				// widget is shown
	Hide = 18,				// widget is hidden
	Close = 19,				// request to close widget
	Quit = 20,				// request to quit application
	Reparent = 21,				// widget has been reparented
	ShowMinimized = 22,		       	// widget is shown minimized
	ShowNormal = 23,	       		// widget is shown normal
	WindowActivate = 24,	       		// window was activated
	WindowDeactivate = 25,	       		// window was deactivated
	ShowToParent = 26,	       		// widget is shown to parent
	HideToParent = 27,	       		// widget is hidden to parent
	ShowMaximized = 28,		       	// widget is shown maximized
	Accel = 30,				// accelerator event
	Wheel = 31,				// wheel event
	AccelAvailable = 32,			// accelerator available event
	CaptionChange = 33,			// caption changed
	IconChange = 34,			// icon changed
	ParentFontChange = 35,			// parent font changed
	ApplicationFontChange = 36,		// application font changed
	ParentPaletteChange = 37,		// parent font changed
	ApplicationPaletteChange = 38,		// application palette changed
	Clipboard = 40,				// internal clipboard event
	Speech = 42,				// reserved for speech input
	SockAct = 50,				// socket activation
	AccelOverride = 51,			// accelerator override event
	DragEnter = 60,				// drag moves into widget
	DragMove = 61,				// drag moves in widget
	DragLeave = 62,				// drag leaves or is cancelled
	Drop = 63,				// actual drop
	DragResponse = 64,			// drag accepted/rejected
	ChildInserted = 70,			// new child widget
	ChildRemoved = 71,			// deleted child widget
	LayoutHint = 72,			// child min/max size changed
	ShowWindowRequest = 73,			// widget's window should be mapped
	ActivateControl = 80,			// ActiveX activation
	DeactivateControl = 81,			// ActiveX deactivation
	User = 1000				// first user event id
*/
	   if ( e->type() == QEvent::Type::Show ) {    // QShowEvent
        if (viewer) 
            viewer->handleRedraw();
        return TRUE;                        // eat event
    }
    else if ( e->type() == QEvent::Type::MouseButtonPress ) {
        viewer->vMousePressEvent( (QMouseEvent *)e);
        return TRUE;                        // eat event
    }
    else if ( e->type() == QEvent::Type::MouseButtonRelease ) {
        viewer->vMouseReleaseEvent( (QMouseEvent *)e);
        return TRUE;                        // eat event
    }
    else if ( e->type() == QEvent::Type::MouseMove  ) {
    viewer->vMouseMoveEvent( (QMouseEvent *)e);
        return TRUE;                        // eat event
    }
    else if ( e->type() == QEvent::Type::Timer   ) {
    killTimer( ((QTimerEvent *)e)->timerId() );
    if (viewer)
        viewer->timerUpdate();
        return TRUE;                        // eat event
    }
    // in plugin mode, mainWgt is no longer topLevel, meaning it will not normally 
    // receive key events, so send key events to it directly
    else if ( e->type() == QEvent::Type::KeyPress  ) {
        qApp->sendEvent(_parent, e);
        return TRUE;                        // eat event
    }
    else if ( e->type() == QEvent::Type::Paint   ) { // suppress these
        if (viewer){
            makeCurrent();
            viewer->handleRedraw();
        }
        return TRUE;
    }
    else if ( e->type() == QEvent::Type::Resize   ) { // suppress these
        QSize sz = ((QResizeEvent *)e)->size();
        if (viewer){
            makeCurrent();
            viewer->resize(sz.width(), sz.height() );
        }
        return TRUE;                        // eat event
    }
	// default:
	return QObject::event( e );

   	//return FALSE;                           // standard event processing
}

