// @(#)root/qt:$Id$
// Author: Valeri Fine   21/01/2002

/*************************************************************************
 * Copyright (C) 1995-2004, Rene Brun and Fons Rademakers.               *
 * Copyright (C) 2002 by Valeri Fine.                                    *
 * All rights reserved.                                                  *
 *                                                                       *
 * For the licensing terms see $ROOTSYS/LICENSE.                         *
 * For the list of contributors see $ROOTSYS/README/CREDITS.             *
 *************************************************************************/

#ifndef ROOT_TQClientFilter
#define ROOT_TQClientFilter

#include "GuiTypes.h"
#include "Rtypes.h"

#ifndef __CINT__
#  include <QEvent>
#  include <QMouseEvent>
#  include <QList>
#  include <QApplication>
#else
   class TQtClientWidget;
   class QObject;
   class QList<TQtClientWidget*>;
#endif  /* CINT */

#include "TQtClientWidget.h"

//________________________________________________________________________
//
//  TQtClientFilter  is Qt "eventFilter" to map Qt event to ROOT event
//________________________________________________________________________

class TQtNextEventMessage;
class TQtEventQueue;
class TQtClientWidget;
class TQtPointerGrabber;

class TQtClientFilter : public QObject {
#ifndef __CINT__
   Q_OBJECT
#endif
   friend class TGQt;
   friend class TQtClientWidget;
private:
   void operator=(const TQtClientFilter &);
   TQtClientFilter(const TQtClientFilter &);
protected:
   TQtEventQueue             *fRootEventQueue;
   TQtNextEventMessage       *fNotifyClient;
#ifndef __CINT__
   QList<TQtClientWidget*>     fButtonGrabList;
#endif
   static TQtClientWidget    *fgPointerGrabber;
   static TQtClientWidget    *fgButtonGrabber;
   static TQtClientWidget    *fgActiveGrabber;
   TQtClientWidget           *fKeyGrabber;
   UInt_t                     fInputEventMask;
   static UInt_t              fgGrabPointerEventMask;
   static Bool_t              fgGrabPointerOwner;
   static QCursor            *fgGrabPointerCursor;
   // static Bool_t              fIsGrabbing;
   static TQtPointerGrabber  *fgGrabber;
protected:
   bool eventFilter( QObject *o, QEvent *e );
   void AddKeyEvent( const QKeyEvent &event, TQtClientWidget *widget);
   TQtEventQueue *Queue();
   void SetKeyGrabber(TQtClientWidget *grabber)     { fKeyGrabber = grabber;}
   void UnSetKeyGrabber(TQtClientWidget *grabber)   { if (fKeyGrabber == grabber) fKeyGrabber = 0; }
   void RestoreLostGrabbing(Event_t &event);
   static Bool_t IsGrabSelected(UInt_t selectEventMask);
   static Bool_t SelectGrab(Event_t &event, UInt_t selectEventMask, QMouseEvent &me);
public:
   TQtClientFilter():fRootEventQueue(0),fNotifyClient(0),fKeyGrabber(0),fInputEventMask(0){;}
   virtual ~TQtClientFilter();
   static TQtClientWidget    *GetPointerGrabber();
   static TQtClientWidget    *GetButtonGrabber();
   static void SetButtonGrabber(TQtClientWidget *grabber);
   static void GrabPointer(TQtClientWidget *grabber, UInt_t evmask, Window_t confine,
                                    QCursor *cursor, Bool_t grab = kTRUE,
                                    Bool_t owner_events = kTRUE);
   static TQtPointerGrabber *PointerGrabber();
public slots:
   void AppendButtonGrab (TQtClientWidget *);
   void RemoveButtonGrab (QObject *);
#ifndef Q_MOC_RUN
   ClassDef(TQtClientFilter,0) // Map Qt and ROOT event
#endif
};

//
//  TQtClientFilter is a Qt "eventFilter" to map Qt event to ROOT event
//
class QWidget;
class QCursor;

class TQtPointerGrabber {
private:
   UInt_t           fGrabPointerEventMask;
   UInt_t           fInputPointerEventMask;
   Bool_t           fGrabPointerOwner;
   QCursor         *fGrabPointerCursor;
   TQtClientWidget *fPointerGrabber;
   QWidget         *fPointerConfine;
   Bool_t           fIsActive;        // Do we active grabbing with WM
public:
   TQtPointerGrabber(TQtClientWidget *grabber, UInt_t evGrabMask, UInt_t evInputMask,
                                    QCursor *cursor, Bool_t grab = kTRUE,
                                    Bool_t owner_events = kTRUE, QWidget *confine=0);
   ~TQtPointerGrabber();
   void   ActivateGrabbing(bool on=TRUE);
   void   DisactivateGrabbing(){ ActivateGrabbing(kFALSE); }
   Bool_t IsGrabSelected(UInt_t selectEventMask) const;
   Bool_t IsGrabbing(TQtClientWidget *grabbed) const { return (grabbed == fPointerGrabber); }
   void   SetGrabPointer( TQtClientWidget *grabber, UInt_t evGrabMask, UInt_t evInputMask
                       , QCursor *cursor, Bool_t grab = kTRUE
                       , Bool_t owner_events = kTRUE, QWidget *confine=0);
   bool   SelectGrab(Event_t &event, UInt_t selectEventMask,QMouseEvent &mouse);
};

//______________________________________________________________________________
inline   TQtEventQueue *TQtClientFilter::Queue() {
      TQtEventQueue *save = fRootEventQueue;
      // fprintf(stderr," Queue %d \n", save ? save->count():-1);
      return save;
   }

#endif

 TQtClientFilter.h:1
 TQtClientFilter.h:2
 TQtClientFilter.h:3
 TQtClientFilter.h:4
 TQtClientFilter.h:5
 TQtClientFilter.h:6
 TQtClientFilter.h:7
 TQtClientFilter.h:8
 TQtClientFilter.h:9
 TQtClientFilter.h:10
 TQtClientFilter.h:11
 TQtClientFilter.h:12
 TQtClientFilter.h:13
 TQtClientFilter.h:14
 TQtClientFilter.h:15
 TQtClientFilter.h:16
 TQtClientFilter.h:17
 TQtClientFilter.h:18
 TQtClientFilter.h:19
 TQtClientFilter.h:20
 TQtClientFilter.h:21
 TQtClientFilter.h:22
 TQtClientFilter.h:23
 TQtClientFilter.h:24
 TQtClientFilter.h:25
 TQtClientFilter.h:26
 TQtClientFilter.h:27
 TQtClientFilter.h:28
 TQtClientFilter.h:29
 TQtClientFilter.h:30
 TQtClientFilter.h:31
 TQtClientFilter.h:32
 TQtClientFilter.h:33
 TQtClientFilter.h:34
 TQtClientFilter.h:35
 TQtClientFilter.h:36
 TQtClientFilter.h:37
 TQtClientFilter.h:38
 TQtClientFilter.h:39
 TQtClientFilter.h:40
 TQtClientFilter.h:41
 TQtClientFilter.h:42
 TQtClientFilter.h:43
 TQtClientFilter.h:44
 TQtClientFilter.h:45
 TQtClientFilter.h:46
 TQtClientFilter.h:47
 TQtClientFilter.h:48
 TQtClientFilter.h:49
 TQtClientFilter.h:50
 TQtClientFilter.h:51
 TQtClientFilter.h:52
 TQtClientFilter.h:53
 TQtClientFilter.h:54
 TQtClientFilter.h:55
 TQtClientFilter.h:56
 TQtClientFilter.h:57
 TQtClientFilter.h:58
 TQtClientFilter.h:59
 TQtClientFilter.h:60
 TQtClientFilter.h:61
 TQtClientFilter.h:62
 TQtClientFilter.h:63
 TQtClientFilter.h:64
 TQtClientFilter.h:65
 TQtClientFilter.h:66
 TQtClientFilter.h:67
 TQtClientFilter.h:68
 TQtClientFilter.h:69
 TQtClientFilter.h:70
 TQtClientFilter.h:71
 TQtClientFilter.h:72
 TQtClientFilter.h:73
 TQtClientFilter.h:74
 TQtClientFilter.h:75
 TQtClientFilter.h:76
 TQtClientFilter.h:77
 TQtClientFilter.h:78
 TQtClientFilter.h:79
 TQtClientFilter.h:80
 TQtClientFilter.h:81
 TQtClientFilter.h:82
 TQtClientFilter.h:83
 TQtClientFilter.h:84
 TQtClientFilter.h:85
 TQtClientFilter.h:86
 TQtClientFilter.h:87
 TQtClientFilter.h:88
 TQtClientFilter.h:89
 TQtClientFilter.h:90
 TQtClientFilter.h:91
 TQtClientFilter.h:92
 TQtClientFilter.h:93
 TQtClientFilter.h:94
 TQtClientFilter.h:95
 TQtClientFilter.h:96
 TQtClientFilter.h:97
 TQtClientFilter.h:98
 TQtClientFilter.h:99
 TQtClientFilter.h:100
 TQtClientFilter.h:101
 TQtClientFilter.h:102
 TQtClientFilter.h:103
 TQtClientFilter.h:104
 TQtClientFilter.h:105
 TQtClientFilter.h:106
 TQtClientFilter.h:107
 TQtClientFilter.h:108
 TQtClientFilter.h:109
 TQtClientFilter.h:110
 TQtClientFilter.h:111
 TQtClientFilter.h:112
 TQtClientFilter.h:113
 TQtClientFilter.h:114
 TQtClientFilter.h:115
 TQtClientFilter.h:116
 TQtClientFilter.h:117
 TQtClientFilter.h:118
 TQtClientFilter.h:119
 TQtClientFilter.h:120
 TQtClientFilter.h:121
 TQtClientFilter.h:122
 TQtClientFilter.h:123
 TQtClientFilter.h:124
 TQtClientFilter.h:125
 TQtClientFilter.h:126
 TQtClientFilter.h:127
 TQtClientFilter.h:128
 TQtClientFilter.h:129
 TQtClientFilter.h:130
 TQtClientFilter.h:131
 TQtClientFilter.h:132