ROOT logo
// @(#)root/qt:$Id: TQtWidget.cxx 28862 2009-06-09 18:56:02Z brun $
// Author: Valeri Fine   23/01/2003

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

// Definition of TQtWidget class
// "double-buffere widget

#include <qapplication.h>

#if QT_VERSION >= 0x40000
#  include <QFocusEvent>
#  include <QPaintEvent>
#  include <QKeyEvent>
#  include <QShowEvent>
#  include <QResizeEvent>
#  include <QMouseEvent>
#  include <QCustomEvent>
#  include <QImage>
#  include <QDebug>
#endif /* QT_VERSION */

#include "TQtWidget.h"
#include "TQtTimer.h"

#include "TROOT.h"
#include "TEnv.h"
#include "TRint.h"
#include "TSystem.h"
#include "Getline.h"
#include "TGQt.h"
#include "TCanvas.h"
#include "Buttons.h"
#include <qevent.h>
#include <qpainter.h>
#include <qpixmap.h>
#include <qfileinfo.h>

#ifdef R__QTWIN32
// #include "Windows4Root.h"
#include "TWinNTSystem.h"
#include "Win32Constants.h"
#endif

// Class to adjust buffer within the method scope if needed

//___________________________________________________________________
TQtWidgetBuffer::TQtWidgetBuffer(const QWidget *w, bool clear)
: fWidget(w),fBuffer(0), fIsImage(clear)
{
   if (fIsImage) {
      fBuffer = new  QImage(fWidget?fWidget->size():QSize(0,0),QImage::Format_ARGB32_Premultiplied);
//      ((QImage*)fBuffer)->fill(0);
   } else {
      fBuffer = new  QPixmap(fWidget?fWidget->size():QSize(0,0));
   }
}
//___________________________________________________________________
TQtWidgetBuffer::TQtWidgetBuffer(const TQtWidgetBuffer &b)
: fWidget(b.fWidget),fBuffer(0), fIsImage(b.fIsImage)
{
   // Copy ctor. Create the copy and account the new widget size
   if (fWidget && (fWidget->size() != QSize(0,0))) { 
      if (fIsImage) {
         QImage resized =((QImage*)b.fBuffer)->scaled (fWidget->size());
         fBuffer = new  QImage(resized);
      } else {
         QPixmap resized =((QPixmap*) b.fBuffer)->scaled (fWidget->size());
         fBuffer = new  QPixmap(resized);
      }
   }
} 
//___________________________________________________________________
TQtWidgetBuffer:: ~TQtWidgetBuffer()
{
   // dtor
   delete fBuffer;
   fBuffer = 0;
}

//___________________________________________________________________
void TQtWidgetBuffer::Clear()
{
   // Clear the buffer with the transparent color
   if (fBuffer &&  !fIsImage ) {
#ifdef R__WIN32   
         ((QPixmap*)fBuffer)->fill(Qt::transparent);
#else
         QPainter p(fBuffer);
         p.fillRect(QRect(0,0,fBuffer->width(), fBuffer->height())
            ,Qt::transparent);
#endif
   }
}


//___________________________________________________________________

ClassImp(TQtWidget)

////////////////////////////////////////////////////////////////////////////////
//
//  TQtWidget is a QWidget with the QPixmap double buffer
//  It is designed to back the ROOT TCanvasImp class interface  and it can be used
//  as a regular Qt Widget to create Qt-based GUI with the embedded TCanvas objects
//
//           This widget can be used as a Qt "custom widget"
//         to build a custom GUI interfaces with  Qt Designer
//
// The class emits the Qt signals and has Qt public slots
//
//  Public slots:  (Qt)
//
//   virtual void cd();  // make the associated TCanvas the current one (shortcut to TCanvas::cd())
//   virtual void cd(int subpadnumber); // as above - shortcut to Canvas::cd(int subpadnumber)
//   void Disconnect(); // disconnect the QWidget from the ROOT TCanvas (used in the class dtor)
//   void Refresh();    // force the associated TCanvas::Update to be called
//   virtual bool Save(const QString &fileName) const;  // Save the widget image with some ppixmap file
//   virtual bool Save(const char    *fileName) const;
//   virtual bool Save(const QString &fileName,const char *format,int quality=60) const;
//   virtual bool Save(const char    *fileName,const char *format,int quality=60) const;
//
//  signals        (Qt)
//
//    CanvasPainted();  // Signal the TCanvas has been painted onto the screen
//    Saved(bool ok);   // Signal the TCanvas has been saved into the file
//    RootEventProcessed(TObject *selected, unsigned int event, TCanvas *c);
//                      // Signal the Qt mouse/keyboard event has been process by ROOT
//                      // This "signal" is emitted by the enabled mouse events only.
//                      // See: EnableSignalEvents
//                      // ---  DisableSignalEvents
//
//  public methods:
//    The methods below define whether the TQtWidget object emits "RootEventProcessed" Qt signals
//     (By default no  RootEventProcessed Qt signal is emitted )
//     void EnableSignalEvents (UInt_t f)
//     void DisableSignalEvents(UInt_t f),
//         where f is a bitwise OR of the mouse event flags:
//                  kMousePressEvent       // TCanvas processed QEvent mousePressEvent
//                  kMouseMoveEvent        // TCanvas processed QEvent mouseMoveEvent
//                  kMouseReleaseEvent     // TCanvas processed QEvent mouseReleaseEvent
//                  kMouseDoubleClickEvent // TCanvas processed QEvent mouseDoubleClickEvent
//                  kKeyPressEvent         // TCanvas processed QEvent keyPressEvent
//                  kEnterEvent            // TCanvas processed QEvent enterEvent
//                  kLeaveEvent            // TCanvas processed QEvent leaveEvent
//
//  For example to create the custom responce to the mouse crossing TCanvas
//  connect the RootEventProsecced signal with your qt slot:
//
// connect(tQtWidget,SIGNAL(RootEventProcessed(TObject *, unsigned int, TCanvas *))
//          ,this,SLOT(CanvasEvent(TObject *, unsigned int, TCanvas *)));
//  . . .
//
//void qtrootexample1::CanvasEvent(TObject *obj, unsigned int event, TCanvas *)
//{
//  TQtWidget *tipped = (TQtWidget *)sender();
//  const char *objectInfo =
//        obj->GetObjectInfo(tipped->GetEventX(),tipped->GetEventY());
//  QString tipText ="You have ";
//  if  (tipped == tQtWidget1)
//     tipText +="clicked";
//  else
//     tipText +="passed";
//  tipText += " the object <";
//  tipText += obj->GetName();
//  tipText += "> of class ";
//  tipText += obj->ClassName();
//  tipText += " : ";
//  tipText += objectInfo;
//
//   QWhatsThis::display(tipText)
// }
//
////////////////////////////////////////////////////////////////////////////////

//_____________________________________________________________________________
TQtWidget::TQtWidget(QWidget* mother, const char* name, Qt::WFlags f,bool embedded) :
      QWidget(mother,f)
        ,fBits(0),fNeedStretch(false),fCanvas(0),fPixmapID(0),fPixmapScreen(0)
        ,fPaint(TRUE),fSizeChanged(FALSE),fDoubleBufferOn(FALSE),fEmbedded(embedded)
        ,fWrapper(0),fSaveFormat("PNG"),fInsidePaintEvent(false),fOldMousePos(-1,-1)
        ,fIgnoreLeaveEnter(0)
{
   if (name && name[0]) setObjectName(name);
   Init() ;
}

//_____________________________________________________________________________
TQtWidget::TQtWidget(QWidget* mother, Qt::WFlags f,bool embedded) :
      QWidget(mother,f)
     ,fBits(0),fNeedStretch(false),fCanvas(0),fPixmapID(0)
     ,fPixmapScreen(0),fPaint(TRUE),fSizeChanged(FALSE)
     ,fDoubleBufferOn(FALSE),fEmbedded(embedded),fWrapper(0),fSaveFormat("PNG")
     ,fInsidePaintEvent(false),fOldMousePos(-1,-1)
{ setObjectName("tqtwidget"); Init() ;}

//_____________________________________________________________________________
void TQtWidget::Init()
{
  setFocusPolicy(Qt::WheelFocus);
  setAttribute(Qt::WA_NoSystemBackground);
  setAutoFillBackground(false);
  QPalette  p = palette();
  p.setBrush(QPalette::Window, Qt::transparent);
  setPalette(p);

  if (fEmbedded) {
    if (!gApplication) InitRint();
    int minw = 10;
    int minh = 10;
    setMinimumSize(minw,minh);
     Bool_t batch = gROOT->IsBatch();
    if (!batch) gROOT->SetBatch(kTRUE); // to avoid the recursion within TCanvas ctor
    TGQt::RegisterWid(this);
    fCanvas = new TCanvas(objectName().toStdString().c_str(),minw,minh, TGQt::RegisterWid(this));
    gROOT->SetBatch(batch);
    //   schedule the flush operation fCanvas->Flush(); via timer
    QTimer::singleShot(0,this, SLOT(Refresh()));
  }
  fSizeHint = QWidget::sizeHint();
  setSizePolicy(QSizePolicy(QSizePolicy::MinimumExpanding,QSizePolicy::MinimumExpanding));
#ifdef R__QTWIN32
   // Set the application icon for all ROOT widgets
   static HICON rootIcon = 0;
   if (!rootIcon) {
      HICON hIcon = ::LoadIcon(::GetModuleHandle(NULL), MAKEINTRESOURCE(101));
      if (!hIcon) hIcon = LoadIcon(NULL, IDI_APPLICATION);
      rootIcon = hIcon;
      SetClassLong(winId(),        // handle to window
                   GCL_HICON,      // index of value to change
                   LONG(rootIcon)  // new value
      );
    }
#endif
}
//______________________________________________________________________________
TQtWidget::~TQtWidget()
{
   TCanvas *c = 0;
   // to block the double deleting from
   gVirtualX->SelectWindow(-1);
   TGQt::UnRegisterWid(this);
   if (fEmbedded) {
      // one has to set CanvasID = 0 to disconnect things properly.
      c = fCanvas;
      ResetCanvas();
      delete c;
   } else {
      ResetCanvas();
   }
   delete fPixmapID;     fPixmapID = 0;
   delete fPixmapScreen; fPixmapScreen = 0;
}

//______________________________________________________________________________
void TQtWidget::AdjustBufferSize() 
{
   // Adjust the widget buffer size
   TQtWidgetBuffer &buf = SetBuffer();
   QSize s(buf.Width(),buf.Height());
   if ( s != size() )  {
#if 0
       qDebug() << "TQtWidget::AdjustBufferSize(): " 
             << this 
             << s << size();
#endif
      if (fPixmapID) {
         TQtWidgetBuffer *bf = new TQtWidgetBuffer(*fPixmapID);
         delete  fPixmapID;     fPixmapID = bf;
      }
      if (fPixmapScreen) {
         TQtWidgetBuffer *bf = new TQtWidgetBuffer(*fPixmapScreen);
         delete  fPixmapScreen; fPixmapScreen = bf;
      }
   }
}
//_____________________________________________________________________________
TCanvas  *TQtWidget::Canvas()
{
   // Alias for GetCanvas method
   return GetCanvas();
}

//_____________________________________________________________________________
TCanvas   *TQtWidget::Canvas(TQtWidget *widget)
{
    // static: return TCanvas by TQtWidget pointer
   return widget ? widget->Canvas() : 0 ;
}

//_____________________________________________________________________________
TQtWidget *TQtWidget::Canvas(const TCanvas *canvas)
{
   // static: return the TQtWidget backend for TCanvas *canvas object
   return canvas ? Canvas(canvas->GetCanvasID()) : 0;
}
//_____________________________________________________________________________
TQtWidget *TQtWidget::Canvas(Int_t id)
{
   // static: return TQtWidget by TCanvas id
   return dynamic_cast<TQtWidget *>(TGQt::iwid(id));
}

//_____________________________________________________________________________
TApplication *TQtWidget::InitRint( Bool_t /*prompt*/, const char *appClassName, int *argc, char **argv,
          void *options, int numOptions, Bool_t noLogo)
{
   //
   // Instantiate ROOT from within Qt application if needed
   // Return the TRint pointer
   // Most parametrs are passed to TRint class ctor
   //
   // Bool_t prompt = kTRUE;  Instantiate ROOT with ROOT command prompt
   //                 kFALSE; No ROOT prompt. The default for Qt GUI applications
   //
   //  The prompt option can be defined via ROOT parameter file ".rootrc"
   // .rootrc:
   //    . . .
   //  Gui.Prompt   yes
   //
   static int localArgc   =0;
   if (!gApplication) {
       localArgc = argc ? *argc : qApp->argc();
       // check the Gui.backend and Factory
       TString guiBackend(gEnv->GetValue("Gui.Backend", "native"));
       guiBackend.ToLower();
       // Enforce Qt-base Gui.Backend and Gui.Factory from within ROOT-based Qt-application
       if (!guiBackend.BeginsWith("qt",TString::kIgnoreCase)) {
         gEnv->SetValue("Gui.Backend", "qt");
       }
       TString guiFactory(gEnv->GetValue("Gui.Factory", "native"));
       guiFactory.ToLower();
#if ROOT_VERSION_CODE >= ROOT_VERSION(5,16,0)
       TApplication::NeedGraphicsLibs() ;
#endif
       if (!guiFactory.BeginsWith("qt",TString::kIgnoreCase )){
         // Check for the extention
         char *extLib = gSystem->DynamicPathName("libQtRootGui",kTRUE);
         if (extLib) {
            gEnv->SetValue("Gui.Factory", "qtgui");
         } else {
            gEnv->SetValue("Gui.Factory", "qt");
         }
         delete [] extLib;
       }

       TRint *rint = new TRint(appClassName, &localArgc, argv ? argv : qApp->argv(),options,numOptions,noLogo);
       // To mimic what TRint::Run(kTRUE) does.
       Int_t prompt= gEnv->GetValue("Gui.Prompt", (Int_t)0);
       if (prompt) {
           Getlinem(kInit, rint->GetPrompt());
       } else {
           // disable the TTermInputHandler too to avoid the crash under X11
           // to get the pure "GUI" application
           TSeqCollection* col = gSystem->GetListOfFileHandlers();
           TIter next(col);
           TFileHandler* o=0;
           while ( ( o=(TFileHandler*) next() ) ) {
              if ( o->GetFd()== 0 ) {
                o->Remove();
                break;
              }
           }
           // Remove Ctrl-C, there will be ROOT prompt anyway
           gSystem->RemoveSignalHandler(rint->GetSignalHandler());
       }
       TQtTimer::Create()->start(0);
   }
   return gApplication;
}

//_____________________________________________________________________________
void TQtWidget::Erase()
{
  // Erases the entire widget and its double buffer
 
  SetBuffer();
//  buf.fill(this,QPoint(0,0));
  if (fPixmapScreen)  fPixmapScreen->Clear();
  if (fPixmapID)      fPixmapID->Clear();
  // erase();
}

//_____________________________________________________________________________
void TQtWidget::cd()
{
 // [slot] to make this embedded canvas the current one
  cd(0);
}
 //______________________________________________________________________________
void TQtWidget::cd(int subpadnumber)
{
 // [slot] to make this embedded canvas / pad the current one
  TCanvas *c = fCanvas;
  if (c) {
     c->cd(subpadnumber);
  }
}
//______________________________________________________________________________
void TQtWidget::Disconnect()
{
   // [slot] Disconnect the Qt widget from TCanvas object before deleting
   // to avoid the dead lock
   // one has to set CanvasID = 0 to disconnect things properly.
   fCanvas = 0;
}
//_____________________________________________________________________________
void TQtWidget::Refresh()
{
   // [slot]  to allow Qt signal refreshing the ROOT TCanvas if needed

   TCanvas *c = Canvas();
   if (c) {
      c->Modified();
      c->Resize();
      c->Update();
   }
   if (!fInsidePaintEvent) { update(); }
   else {
      qDebug() << " TQtWidget::Refresh() update inside of paintEvent !!!" << this; 
   }
}
//_____________________________________________________________________________
void TQtWidget::SetCanvas(TCanvas *c) 
{ 
   //  remember my host TCanvas and adopt its name
   fCanvas = c;
   // qDebug() << "TQtWidget::SetCanvas(TCanvas *c)" << fCanvas << fCanvas->GetName() ;
   setObjectName(fCanvas->GetName());
}

//_____________________________________________________________________________
void
TQtWidget::customEvent(QEvent *e)
{
   // The custom response to the special WIN32 events
   // These events are not present with X11 systems
   switch (e->type() - QEvent::User) {
   case kEXITSIZEMOVE:
      { // WM_EXITSIZEMOVE
         fPaint = TRUE;
         exitSizeEvent();
         break;
      }
   case kENTERSIZEMOVE:
      {
         //  WM_ENTERSIZEMOVE
         fSizeChanged=FALSE;
         fPaint = FALSE;
         break;
      }
   case kFORCESIZE:
   default:
      {
         // Force resize
         fPaint       = TRUE;
         fSizeChanged = TRUE;
         exitSizeEvent();
         break;
      }
   };
}
 //_____________________________________________________________________________
void TQtWidget::contextMenuEvent(QContextMenuEvent *e)
{
   // The custom response to the Qt QContextMenuEvent
   // Map QContextMenuEvent to the ROOT kButton3Down = 3  event
   TCanvas *c = Canvas();
   if (e && c && (e->reason() != QContextMenuEvent::Mouse) ) {
      e->accept();
      c->HandleInput(kButton3Down, e->x(), e->y());
   }
}
//_____________________________________________________________________________
void TQtWidget::focusInEvent ( QFocusEvent *e )
{
   // The custom response to the Qt QFocusEvent "in"
   // this imposes an extra protection to avoid TObject interaction with
   // mouse event accidently
   if (!fWrapper && e->gotFocus()) {
      setMouseTracking(TRUE);
   }
}
//_____________________________________________________________________________
void TQtWidget::focusOutEvent ( QFocusEvent *e )
{
   // The custom response to the Qt QFocusEvent "out"
   // this imposes an extra protection to avoid TObject interaction with
   // mouse event accidently
   if (!fWrapper && e->lostFocus()) {
      setMouseTracking(FALSE);
   }
}

//_____________________________________________________________________________
void TQtWidget::mousePressEvent (QMouseEvent *e)
{
   // Map the Qt mouse press button event to the ROOT TCanvas events
   // Mouse events occur when a mouse button is pressed or released inside
   // a widget or when the mouse cursor is moved.

   //    kButton1Down   =  1, kButton2Down   =  2, kButton3Down   =  3,

   EEventType rootButton = kNoEvent;
   fOldMousePos = e->pos();
   TCanvas *c = Canvas();
   if (c && !fWrapper ){
      switch (e->button ())
      {
      case Qt::LeftButton:  rootButton = kButton1Down; break;
      case Qt::RightButton: {
//          rootButton = kButton3Down; 
         // respect the QWidget::contextMenuPolicy
         // treat this event as QContextMenuEvent
          if (contextMenuPolicy()) {
             e->accept(); 
             QContextMenuEvent evt(QContextMenuEvent::Other, e->pos() );
             QApplication::sendEvent(this, &evt);
          }
          break;
       }
      case Qt::MidButton:   rootButton = kButton2Down; break;
      default: break;
      };
      if (rootButton != kNoEvent) {
         e->accept(); 
         c->HandleInput(rootButton, e->x(), e->y());
         EmitSignal(kMousePressEvent);
         return;
      }
   } else {
      e->ignore();
   }
   QWidget::mousePressEvent(e);
}

//_____________________________________________________________________________
void TQtWidget::mouseMoveEvent (QMouseEvent * e)
{
   //  Map the Qt mouse move pointer event to the ROOT TCanvas events
   //  kMouseMotion   = 51,
   //  kButton1Motion = 21, kButton2Motion = 22, kButton3Motion = 23, kKeyPress = 24
   EEventType rootButton = kMouseMotion;
   if ( fOldMousePos != e->pos() && fIgnoreLeaveEnter < 2  ) { // workaround of Qt 4.5.x bug
      fOldMousePos = e->pos(); 
      TCanvas *c = Canvas();
      if (c && !fWrapper){
         if (e->buttons() & Qt::LeftButton) { rootButton = kButton1Motion; }
         e->accept();
         c->HandleInput(rootButton, e->x(), e->y());
         EmitSignal(kMouseMoveEvent);
         return;
      } else {
         e->ignore();
      }
   }
   QWidget::mouseMoveEvent(e);
}

//_____________________________________________________________________________
void TQtWidget::mouseReleaseEvent(QMouseEvent * e)
{
   //  Map the Qt mouse button release event to the ROOT TCanvas events
   //   kButton1Up     = 11, kButton2Up     = 12, kButton3Up     = 13

   EEventType rootButton = kNoEvent;
   fOldMousePos = QPoint(-1,-1);
   TCanvas *c = Canvas();
   if (c && !fWrapper){
      switch (e->button())
      {
      case Qt::LeftButton:  rootButton = kButton1Up; break;
      case Qt::RightButton: rootButton = kButton3Up; break;
      case Qt::MidButton:   rootButton = kButton2Up; break;
      default: break;
      };
      if (rootButton != kNoEvent) {
         e->accept();
         c->HandleInput(rootButton, e->x(), e->y());
         gPad->Modified();
         EmitSignal(kMouseReleaseEvent);
         return;
      }
   } else {
      e->ignore();
   }
   QWidget::mouseReleaseEvent(e);
}

//_____________________________________________________________________________
void TQtWidget::mouseDoubleClickEvent(QMouseEvent * e)
{
   //  Map the Qt mouse double click button event to the ROOT TCanvas events
   //  kButton1Double = 61, kButton2Double = 62, kButton3Double = 63
   EEventType rootButton = kNoEvent;
   TCanvas *c = Canvas();
   if (c && !fWrapper){
      switch (e->button())
      {
      case Qt::LeftButton:  rootButton = kButton1Double; break;
      case Qt::RightButton: rootButton = kButton3Double; break;
      case Qt::MidButton:   rootButton = kButton2Double; break;
      default: break;
      };
      if (rootButton != kNoEvent) {
         e->accept();
         c->HandleInput(rootButton, e->x(), e->y());
         EmitSignal(kMouseDoubleClickEvent);return;
      }
   }  else {
      e->ignore();
   }
   QWidget::mouseDoubleClickEvent(e);
}
//_____________________________________________________________________________
void TQtWidget::keyPressEvent(QKeyEvent * e)
{
   // Map the Qt key press event to the ROOT TCanvas events
   // kKeyDown  =  4
   TCanvas *c = Canvas();
   if (c && !fWrapper){
      c->HandleInput(kKeyPress, e->text().toStdString().c_str()[0], e->key());
      EmitSignal(kKeyPressEvent);
   } else {
      e->ignore();
   }
   QWidget::keyPressEvent(e);
}
//_____________________________________________________________________________
void TQtWidget::keyReleaseEvent(QKeyEvent * e)
{
   // Map the Qt key release event to the ROOT TCanvas events
   // kKeyUp    = 14
   QWidget::keyReleaseEvent(e);
}
//_____________________________________________________________________________
void TQtWidget::enterEvent(QEvent *e)
{
   // Map the Qt mouse enters widget event to the ROOT TCanvas events
   // kMouseEnter    = 52
   TCanvas *c = Canvas();
   if (c && !fIgnoreLeaveEnter && !fWrapper){
      c->HandleInput(kMouseEnter, 0, 0);
      EmitSignal(kEnterEvent);
   }
   QWidget::enterEvent(e);
}
//_____________________________________________________________________________
void TQtWidget::leaveEvent (QEvent *e)
{
   //  Map the Qt mouse leaves widget event to the ROOT TCanvas events
   // kMouseLeave    = 53
   TCanvas *c = Canvas();
   if (c && !fIgnoreLeaveEnter && !fWrapper){
      c->HandleInput(kMouseLeave, 0, 0);
      EmitSignal(kLeaveEvent);
   }
   QWidget::leaveEvent(e);
}
//_____________________________________________________________________________
void TQtWidget::resizeEvent(QResizeEvent *e)
{
   // The widget will be erased and receive a paint event immediately after
   // processing the resize event.
   // No drawing need be (or should be) done inside this handler.
   if (!e) return;
   if (topLevelWidget()->isMinimized())      { fSizeChanged=FALSE; }
   else if (topLevelWidget()->isMaximized ()){
      fSizeChanged=TRUE;
      exitSizeEvent();
      fSizeChanged=TRUE;
   } else {
#ifdef R__QTWIN32
      if (!fPaint)  {
         // real resize event
         fSizeChanged=TRUE;
         fNeedStretch=true;
      } else {
#else
      {
         fSizeChanged=TRUE;
#if 0
         if (Qt::LeftButton == QApplication::mouseButtons()) 
         {
            fNeedStretch=true;
            fPaint = false;
         } else 
#endif
         {
            fPaint = kTRUE;
            exitSizeEvent();
         }
#endif
      } }
}
//____________________________________________________________________________
void TQtWidget::SetSaveFormat(const char *format)
{
     // Set the default save format for the widget
   fSaveFormat = TGQt::QtFileFormat(format);
}
//____________________________________________________________________________
bool TQtWidget::Save(const char *fileName) const
{
   //
   //  TQtWidget::Save(const QString &fileName) is a public Qt slot.
   //  it saves the double buffer of this object using the default save
   //  format  defined the file extension
   //  If the "fileName" has no extension the "default" format is to be used instead
   //  The deafult format is "PNG".
   //  It can be changed with the TQtWidget::SetSaveFormat method
   //
    return Save(QString(fileName));
}
//____________________________________________________________________________
bool TQtWidget::Save(const QString &fileName) const
{
   //
   //  TQtWidget::Save(const QString &fileName) is a public Qt slot.
   //  it saves the double buffer of this object using the default save
   //  format  defined the file extension
   //  If the "fileName" has no extension the "default" format is to be used instead
   //  The deafult format is "PNG".
   //  It can be changed with the TQtWidget::SetSaveFormat method
   //
   QString fileNameExtension = QFileInfo(fileName).suffix().toUpper();
   QString saveFormat;
   if (fileNameExtension.isEmpty() ) {
      saveFormat = fSaveFormat; // this is default
   } else {
      saveFormat = TGQt::QtFileFormat(fileNameExtension);
   }
   return Save(fileName,saveFormat.toStdString().c_str());
}

//____________________________________________________________________________
bool TQtWidget::Save(const char *fileName,const char *format,int quality)const
{
   return Save(QString(fileName),format,quality);
}
//____________________________________________________________________________
bool TQtWidget::Save(const QString &fileName,const char *format,int quality)const
{
   //  TQtWidget::save is a public Qt slot.
   //  it saves the double buffer of this object using QPixmap facility
   bool Ok = false;
   bool rootFormatFound=kTRUE;
   QString saveType =  TGQt::RootFileFormat(format);
   if (saveType.isEmpty() )  {
      rootFormatFound = false;
      saveType = TGQt::QtFileFormat(format);
   }
   TCanvas *c = GetCanvas();
   if (rootFormatFound && c) {
      c->Print(fileName.toStdString().c_str(),saveType.toStdString().c_str());
      Ok = true;
   } else {
      // Since the "+" is a legal part of the file name and it is used by Onuchin
      // to indicate  the "animation" mode, we have to proceed very carefully
      int dot = fileName.lastIndexOf('.');
      int plus = 0;
      if (dot > -1) {
         plus = fileName.indexOf('+',dot+1);
      }
      QString fln = (plus > -1) ? TGQt::GetNewFileName(fileName.left(plus)) : fileName;
      Ok = GetOffScreenBuffer() ? GetOffScreenBuffer()->save(fln,saveType.toStdString().c_str(),quality): false;
   }
   emit ((TQtWidget *)this)->Saved(Ok);
   return Ok;
}
//_____________________________________________________________________________
void  TQtWidget::SetDoubleBuffer(bool on)
{
     // Set the double buffered mode on/off
   if (fDoubleBufferOn != on ) {
      fDoubleBufferOn = on;
      if (on) SetBuffer();
   }
}
//_____________________________________________________________________________
void TQtWidget::stretchWidget(QResizeEvent * /*s*/)
{
   // Stretch the widget during sizing

   if  (!paintingActive() && fPixmapID) {
      QPainter pnt(this);
      pnt.drawPixmap(rect(),*GetOffScreenBuffer());
   }
   fNeedStretch = false;
}
//_____________________________________________________________________________
void TQtWidget::exitSizeEvent ()
{
   // Response to the "exit size event"

   if (!fSizeChanged ) return;
   {
      AdjustBufferSize();
   }
   //Refresh();
   TCanvas *c = Canvas();
   if (c)   c->Resize();
   // One more time to catch the last size
   QTimer::singleShot(0,this, SLOT(Refresh()));
}

//____________________________________________________________________________
bool TQtWidget::paintFlag(bool mode)
{
   //  Set new fPaint flag
   //  Returns: the previous version of the flag
   bool flag = fPaint;
   fPaint = mode;
   return flag;
}
//____________________________________________________________________________
void TQtWidget::showEvent ( QShowEvent *)
{
   // Custom handler of the Qt show event
   // Non-spontaneous show events are sent to widgets immediately before
   // they are shown.
   // The spontaneous show events of top-level widgets are delivered afterwards.
   TQtWidgetBuffer &buf = SetBuffer();
   QSize s(buf.Width(),buf.Height());
   if (s != size() )
   {
      fSizeChanged = kTRUE;
      exitSizeEvent();
   }
}

//____________________________________________________________________________
void TQtWidget::paintEvent (QPaintEvent *e)
{
   // Custom handler of the Qt paint event
   // A paint event is a request to repaint all or part of the widget.
   // It can happen as a result of repaint() or update(), or because the widget
   // was obscured and has now been uncovered, or for many other reasons.
   fInsidePaintEvent = true;
   if (fNeedStretch) {
      stretchWidget((QResizeEvent *)0);
   } else {
#ifdef R__QTWIN32
      TQtWidgetBuffer &buf = SetBuffer();
      QSize s(buf.Width(),buf.Height());
      if ( fEmbedded && (s != size()) )
      {
         fSizeChanged = kTRUE;
         exitSizeEvent();
         fInsidePaintEvent = false;
         return;
      }
#endif
      QRegion region = e->region();
      if ( ( fPaint && !region.isEmpty() ) )
      {
         //  fprintf(stderr,"TQtWidget::paintEvent: window = %p; buffer =  %p\n",
         //  (QPaintDevice *)this, (QPaintDevice *)&GetBuffer());
         //  qDebug() << "1. TQtWidget::paintEvent this =" << (QPaintDevice *)this  << " buffer = " << fPixmapID << "redirected = " << QPainter::redirected(this)
         //    <<" IsDoubleBuffered()=" << IsDoubleBuffered() ;
         // qDebug() << "2. TQtWidget::paintEvent this =" << (QPaintDevice *)this  << " buffer = " << fPixmapID << " IsDoubleBuffered()=" << IsDoubleBuffered() ;
         QPainter screen(this);
         screen.setClipRegion(region);
         // paint the the TCanvas double buffer
         if (fPixmapID)  screen.drawPixmap(0,0,*GetOffScreenBuffer());
      }
   }
   fInsidePaintEvent = false;
}
//  Layout methods:
//____________________________________________________________________________
void TQtWidget::SetSizeHint (const QSize &sz) {
   //  sets the preferred size of the widget.
   fSizeHint = sz;
}
//____________________________________________________________________________
QSize TQtWidget::sizeHint () const{
   //  returns the preferred size of the widget.
   return QWidget::sizeHint();
}
//____________________________________________________________________________
QSize TQtWidget::minimumSizeHint () const{
   // returns the smallest size the widget can have.
   return QWidget::minimumSizeHint ();
}
//____________________________________________________________________________
QSizePolicy TQtWidget::sizePolicy () const{
   //  returns a QSizePolicy; a value describing the space requirements
   return QWidget::sizePolicy ();
}
//____________________________________________________________________________
void  TQtWidget::EmitTestedSignal()
{
   TCanvas *c        = GetCanvas();
   TObject *selected = GetSelected();
   UInt_t evt      = GetEvent();
   emit RootEventProcessed(selected, evt, c);
}
//____________________________________________________________________________
void  TQtWidget::SetBit(UInt_t f, Bool_t set)
{
   // Set or unset the user status bits as specified in f.

   if (set)
      SetBit(f);
   else
      ResetBit(f);
}
//____________________________________________________________________________
TQtWidgetBuffer  &TQtWidget::SetBuffer() {
   // Create (if needed) and return the buffer
   TQtWidgetBuffer *buf = 0;
   if (IsDoubleBuffered() ) {
      if (!fPixmapID) fPixmapID = new TQtWidgetBuffer(this);
      buf = fPixmapID;
   } else {
      if (!fPixmapScreen) fPixmapScreen = new TQtWidgetBuffer(this,true);
      // qDebug() << "TQtWidget::SetBuffer() " << fPixmapScreen;
      buf = fPixmapScreen;
   }
   return  *buf;
}
//______________________________________________________________________________
QPixmap  *TQtWidget::GetOffScreenBuffer()  const { 
   //  return the current widget buffer;
   return fPixmapID ? (QPixmap  *)fPixmapID->Buffer():0;
}
 TQtWidget.cxx:1
 TQtWidget.cxx:2
 TQtWidget.cxx:3
 TQtWidget.cxx:4
 TQtWidget.cxx:5
 TQtWidget.cxx:6
 TQtWidget.cxx:7
 TQtWidget.cxx:8
 TQtWidget.cxx:9
 TQtWidget.cxx:10
 TQtWidget.cxx:11
 TQtWidget.cxx:12
 TQtWidget.cxx:13
 TQtWidget.cxx:14
 TQtWidget.cxx:15
 TQtWidget.cxx:16
 TQtWidget.cxx:17
 TQtWidget.cxx:18
 TQtWidget.cxx:19
 TQtWidget.cxx:20
 TQtWidget.cxx:21
 TQtWidget.cxx:22
 TQtWidget.cxx:23
 TQtWidget.cxx:24
 TQtWidget.cxx:25
 TQtWidget.cxx:26
 TQtWidget.cxx:27
 TQtWidget.cxx:28
 TQtWidget.cxx:29
 TQtWidget.cxx:30
 TQtWidget.cxx:31
 TQtWidget.cxx:32
 TQtWidget.cxx:33
 TQtWidget.cxx:34
 TQtWidget.cxx:35
 TQtWidget.cxx:36
 TQtWidget.cxx:37
 TQtWidget.cxx:38
 TQtWidget.cxx:39
 TQtWidget.cxx:40
 TQtWidget.cxx:41
 TQtWidget.cxx:42
 TQtWidget.cxx:43
 TQtWidget.cxx:44
 TQtWidget.cxx:45
 TQtWidget.cxx:46
 TQtWidget.cxx:47
 TQtWidget.cxx:48
 TQtWidget.cxx:49
 TQtWidget.cxx:50
 TQtWidget.cxx:51
 TQtWidget.cxx:52
 TQtWidget.cxx:53
 TQtWidget.cxx:54
 TQtWidget.cxx:55
 TQtWidget.cxx:56
 TQtWidget.cxx:57
 TQtWidget.cxx:58
 TQtWidget.cxx:59
 TQtWidget.cxx:60
 TQtWidget.cxx:61
 TQtWidget.cxx:62
 TQtWidget.cxx:63
 TQtWidget.cxx:64
 TQtWidget.cxx:65
 TQtWidget.cxx:66
 TQtWidget.cxx:67
 TQtWidget.cxx:68
 TQtWidget.cxx:69
 TQtWidget.cxx:70
 TQtWidget.cxx:71
 TQtWidget.cxx:72
 TQtWidget.cxx:73
 TQtWidget.cxx:74
 TQtWidget.cxx:75
 TQtWidget.cxx:76
 TQtWidget.cxx:77
 TQtWidget.cxx:78
 TQtWidget.cxx:79
 TQtWidget.cxx:80
 TQtWidget.cxx:81
 TQtWidget.cxx:82
 TQtWidget.cxx:83
 TQtWidget.cxx:84
 TQtWidget.cxx:85
 TQtWidget.cxx:86
 TQtWidget.cxx:87
 TQtWidget.cxx:88
 TQtWidget.cxx:89
 TQtWidget.cxx:90
 TQtWidget.cxx:91
 TQtWidget.cxx:92
 TQtWidget.cxx:93
 TQtWidget.cxx:94
 TQtWidget.cxx:95
 TQtWidget.cxx:96
 TQtWidget.cxx:97
 TQtWidget.cxx:98
 TQtWidget.cxx:99
 TQtWidget.cxx:100
 TQtWidget.cxx:101
 TQtWidget.cxx:102
 TQtWidget.cxx:103
 TQtWidget.cxx:104
 TQtWidget.cxx:105
 TQtWidget.cxx:106
 TQtWidget.cxx:107
 TQtWidget.cxx:108
 TQtWidget.cxx:109
 TQtWidget.cxx:110
 TQtWidget.cxx:111
 TQtWidget.cxx:112
 TQtWidget.cxx:113
 TQtWidget.cxx:114
 TQtWidget.cxx:115
 TQtWidget.cxx:116
 TQtWidget.cxx:117
 TQtWidget.cxx:118
 TQtWidget.cxx:119
 TQtWidget.cxx:120
 TQtWidget.cxx:121
 TQtWidget.cxx:122
 TQtWidget.cxx:123
 TQtWidget.cxx:124
 TQtWidget.cxx:125
 TQtWidget.cxx:126
 TQtWidget.cxx:127
 TQtWidget.cxx:128
 TQtWidget.cxx:129
 TQtWidget.cxx:130
 TQtWidget.cxx:131
 TQtWidget.cxx:132
 TQtWidget.cxx:133
 TQtWidget.cxx:134
 TQtWidget.cxx:135
 TQtWidget.cxx:136
 TQtWidget.cxx:137
 TQtWidget.cxx:138
 TQtWidget.cxx:139
 TQtWidget.cxx:140
 TQtWidget.cxx:141
 TQtWidget.cxx:142
 TQtWidget.cxx:143
 TQtWidget.cxx:144
 TQtWidget.cxx:145
 TQtWidget.cxx:146
 TQtWidget.cxx:147
 TQtWidget.cxx:148
 TQtWidget.cxx:149
 TQtWidget.cxx:150
 TQtWidget.cxx:151
 TQtWidget.cxx:152
 TQtWidget.cxx:153
 TQtWidget.cxx:154
 TQtWidget.cxx:155
 TQtWidget.cxx:156
 TQtWidget.cxx:157
 TQtWidget.cxx:158
 TQtWidget.cxx:159
 TQtWidget.cxx:160
 TQtWidget.cxx:161
 TQtWidget.cxx:162
 TQtWidget.cxx:163
 TQtWidget.cxx:164
 TQtWidget.cxx:165
 TQtWidget.cxx:166
 TQtWidget.cxx:167
 TQtWidget.cxx:168
 TQtWidget.cxx:169
 TQtWidget.cxx:170
 TQtWidget.cxx:171
 TQtWidget.cxx:172
 TQtWidget.cxx:173
 TQtWidget.cxx:174
 TQtWidget.cxx:175
 TQtWidget.cxx:176
 TQtWidget.cxx:177
 TQtWidget.cxx:178
 TQtWidget.cxx:179
 TQtWidget.cxx:180
 TQtWidget.cxx:181
 TQtWidget.cxx:182
 TQtWidget.cxx:183
 TQtWidget.cxx:184
 TQtWidget.cxx:185
 TQtWidget.cxx:186
 TQtWidget.cxx:187
 TQtWidget.cxx:188
 TQtWidget.cxx:189
 TQtWidget.cxx:190
 TQtWidget.cxx:191
 TQtWidget.cxx:192
 TQtWidget.cxx:193
 TQtWidget.cxx:194
 TQtWidget.cxx:195
 TQtWidget.cxx:196
 TQtWidget.cxx:197
 TQtWidget.cxx:198
 TQtWidget.cxx:199
 TQtWidget.cxx:200
 TQtWidget.cxx:201
 TQtWidget.cxx:202
 TQtWidget.cxx:203
 TQtWidget.cxx:204
 TQtWidget.cxx:205
 TQtWidget.cxx:206
 TQtWidget.cxx:207
 TQtWidget.cxx:208
 TQtWidget.cxx:209
 TQtWidget.cxx:210
 TQtWidget.cxx:211
 TQtWidget.cxx:212
 TQtWidget.cxx:213
 TQtWidget.cxx:214
 TQtWidget.cxx:215
 TQtWidget.cxx:216
 TQtWidget.cxx:217
 TQtWidget.cxx:218
 TQtWidget.cxx:219
 TQtWidget.cxx:220
 TQtWidget.cxx:221
 TQtWidget.cxx:222
 TQtWidget.cxx:223
 TQtWidget.cxx:224
 TQtWidget.cxx:225
 TQtWidget.cxx:226
 TQtWidget.cxx:227
 TQtWidget.cxx:228
 TQtWidget.cxx:229
 TQtWidget.cxx:230
 TQtWidget.cxx:231
 TQtWidget.cxx:232
 TQtWidget.cxx:233
 TQtWidget.cxx:234
 TQtWidget.cxx:235
 TQtWidget.cxx:236
 TQtWidget.cxx:237
 TQtWidget.cxx:238
 TQtWidget.cxx:239
 TQtWidget.cxx:240
 TQtWidget.cxx:241
 TQtWidget.cxx:242
 TQtWidget.cxx:243
 TQtWidget.cxx:244
 TQtWidget.cxx:245
 TQtWidget.cxx:246
 TQtWidget.cxx:247
 TQtWidget.cxx:248
 TQtWidget.cxx:249
 TQtWidget.cxx:250
 TQtWidget.cxx:251
 TQtWidget.cxx:252
 TQtWidget.cxx:253
 TQtWidget.cxx:254
 TQtWidget.cxx:255
 TQtWidget.cxx:256
 TQtWidget.cxx:257
 TQtWidget.cxx:258
 TQtWidget.cxx:259
 TQtWidget.cxx:260
 TQtWidget.cxx:261
 TQtWidget.cxx:262
 TQtWidget.cxx:263
 TQtWidget.cxx:264
 TQtWidget.cxx:265
 TQtWidget.cxx:266
 TQtWidget.cxx:267
 TQtWidget.cxx:268
 TQtWidget.cxx:269
 TQtWidget.cxx:270
 TQtWidget.cxx:271
 TQtWidget.cxx:272
 TQtWidget.cxx:273
 TQtWidget.cxx:274
 TQtWidget.cxx:275
 TQtWidget.cxx:276
 TQtWidget.cxx:277
 TQtWidget.cxx:278
 TQtWidget.cxx:279
 TQtWidget.cxx:280
 TQtWidget.cxx:281
 TQtWidget.cxx:282
 TQtWidget.cxx:283
 TQtWidget.cxx:284
 TQtWidget.cxx:285
 TQtWidget.cxx:286
 TQtWidget.cxx:287
 TQtWidget.cxx:288
 TQtWidget.cxx:289
 TQtWidget.cxx:290
 TQtWidget.cxx:291
 TQtWidget.cxx:292
 TQtWidget.cxx:293
 TQtWidget.cxx:294
 TQtWidget.cxx:295
 TQtWidget.cxx:296
 TQtWidget.cxx:297
 TQtWidget.cxx:298
 TQtWidget.cxx:299
 TQtWidget.cxx:300
 TQtWidget.cxx:301
 TQtWidget.cxx:302
 TQtWidget.cxx:303
 TQtWidget.cxx:304
 TQtWidget.cxx:305
 TQtWidget.cxx:306
 TQtWidget.cxx:307
 TQtWidget.cxx:308
 TQtWidget.cxx:309
 TQtWidget.cxx:310
 TQtWidget.cxx:311
 TQtWidget.cxx:312
 TQtWidget.cxx:313
 TQtWidget.cxx:314
 TQtWidget.cxx:315
 TQtWidget.cxx:316
 TQtWidget.cxx:317
 TQtWidget.cxx:318
 TQtWidget.cxx:319
 TQtWidget.cxx:320
 TQtWidget.cxx:321
 TQtWidget.cxx:322
 TQtWidget.cxx:323
 TQtWidget.cxx:324
 TQtWidget.cxx:325
 TQtWidget.cxx:326
 TQtWidget.cxx:327
 TQtWidget.cxx:328
 TQtWidget.cxx:329
 TQtWidget.cxx:330
 TQtWidget.cxx:331
 TQtWidget.cxx:332
 TQtWidget.cxx:333
 TQtWidget.cxx:334
 TQtWidget.cxx:335
 TQtWidget.cxx:336
 TQtWidget.cxx:337
 TQtWidget.cxx:338
 TQtWidget.cxx:339
 TQtWidget.cxx:340
 TQtWidget.cxx:341
 TQtWidget.cxx:342
 TQtWidget.cxx:343
 TQtWidget.cxx:344
 TQtWidget.cxx:345
 TQtWidget.cxx:346
 TQtWidget.cxx:347
 TQtWidget.cxx:348
 TQtWidget.cxx:349
 TQtWidget.cxx:350
 TQtWidget.cxx:351
 TQtWidget.cxx:352
 TQtWidget.cxx:353
 TQtWidget.cxx:354
 TQtWidget.cxx:355
 TQtWidget.cxx:356
 TQtWidget.cxx:357
 TQtWidget.cxx:358
 TQtWidget.cxx:359
 TQtWidget.cxx:360
 TQtWidget.cxx:361
 TQtWidget.cxx:362
 TQtWidget.cxx:363
 TQtWidget.cxx:364
 TQtWidget.cxx:365
 TQtWidget.cxx:366
 TQtWidget.cxx:367
 TQtWidget.cxx:368
 TQtWidget.cxx:369
 TQtWidget.cxx:370
 TQtWidget.cxx:371
 TQtWidget.cxx:372
 TQtWidget.cxx:373
 TQtWidget.cxx:374
 TQtWidget.cxx:375
 TQtWidget.cxx:376
 TQtWidget.cxx:377
 TQtWidget.cxx:378
 TQtWidget.cxx:379
 TQtWidget.cxx:380
 TQtWidget.cxx:381
 TQtWidget.cxx:382
 TQtWidget.cxx:383
 TQtWidget.cxx:384
 TQtWidget.cxx:385
 TQtWidget.cxx:386
 TQtWidget.cxx:387
 TQtWidget.cxx:388
 TQtWidget.cxx:389
 TQtWidget.cxx:390
 TQtWidget.cxx:391
 TQtWidget.cxx:392
 TQtWidget.cxx:393
 TQtWidget.cxx:394
 TQtWidget.cxx:395
 TQtWidget.cxx:396
 TQtWidget.cxx:397
 TQtWidget.cxx:398
 TQtWidget.cxx:399
 TQtWidget.cxx:400
 TQtWidget.cxx:401
 TQtWidget.cxx:402
 TQtWidget.cxx:403
 TQtWidget.cxx:404
 TQtWidget.cxx:405
 TQtWidget.cxx:406
 TQtWidget.cxx:407
 TQtWidget.cxx:408
 TQtWidget.cxx:409
 TQtWidget.cxx:410
 TQtWidget.cxx:411
 TQtWidget.cxx:412
 TQtWidget.cxx:413
 TQtWidget.cxx:414
 TQtWidget.cxx:415
 TQtWidget.cxx:416
 TQtWidget.cxx:417
 TQtWidget.cxx:418
 TQtWidget.cxx:419
 TQtWidget.cxx:420
 TQtWidget.cxx:421
 TQtWidget.cxx:422
 TQtWidget.cxx:423
 TQtWidget.cxx:424
 TQtWidget.cxx:425
 TQtWidget.cxx:426
 TQtWidget.cxx:427
 TQtWidget.cxx:428
 TQtWidget.cxx:429
 TQtWidget.cxx:430
 TQtWidget.cxx:431
 TQtWidget.cxx:432
 TQtWidget.cxx:433
 TQtWidget.cxx:434
 TQtWidget.cxx:435
 TQtWidget.cxx:436
 TQtWidget.cxx:437
 TQtWidget.cxx:438
 TQtWidget.cxx:439
 TQtWidget.cxx:440
 TQtWidget.cxx:441
 TQtWidget.cxx:442
 TQtWidget.cxx:443
 TQtWidget.cxx:444
 TQtWidget.cxx:445
 TQtWidget.cxx:446
 TQtWidget.cxx:447
 TQtWidget.cxx:448
 TQtWidget.cxx:449
 TQtWidget.cxx:450
 TQtWidget.cxx:451
 TQtWidget.cxx:452
 TQtWidget.cxx:453
 TQtWidget.cxx:454
 TQtWidget.cxx:455
 TQtWidget.cxx:456
 TQtWidget.cxx:457
 TQtWidget.cxx:458
 TQtWidget.cxx:459
 TQtWidget.cxx:460
 TQtWidget.cxx:461
 TQtWidget.cxx:462
 TQtWidget.cxx:463
 TQtWidget.cxx:464
 TQtWidget.cxx:465
 TQtWidget.cxx:466
 TQtWidget.cxx:467
 TQtWidget.cxx:468
 TQtWidget.cxx:469
 TQtWidget.cxx:470
 TQtWidget.cxx:471
 TQtWidget.cxx:472
 TQtWidget.cxx:473
 TQtWidget.cxx:474
 TQtWidget.cxx:475
 TQtWidget.cxx:476
 TQtWidget.cxx:477
 TQtWidget.cxx:478
 TQtWidget.cxx:479
 TQtWidget.cxx:480
 TQtWidget.cxx:481
 TQtWidget.cxx:482
 TQtWidget.cxx:483
 TQtWidget.cxx:484
 TQtWidget.cxx:485
 TQtWidget.cxx:486
 TQtWidget.cxx:487
 TQtWidget.cxx:488
 TQtWidget.cxx:489
 TQtWidget.cxx:490
 TQtWidget.cxx:491
 TQtWidget.cxx:492
 TQtWidget.cxx:493
 TQtWidget.cxx:494
 TQtWidget.cxx:495
 TQtWidget.cxx:496
 TQtWidget.cxx:497
 TQtWidget.cxx:498
 TQtWidget.cxx:499
 TQtWidget.cxx:500
 TQtWidget.cxx:501
 TQtWidget.cxx:502
 TQtWidget.cxx:503
 TQtWidget.cxx:504
 TQtWidget.cxx:505
 TQtWidget.cxx:506
 TQtWidget.cxx:507
 TQtWidget.cxx:508
 TQtWidget.cxx:509
 TQtWidget.cxx:510
 TQtWidget.cxx:511
 TQtWidget.cxx:512
 TQtWidget.cxx:513
 TQtWidget.cxx:514
 TQtWidget.cxx:515
 TQtWidget.cxx:516
 TQtWidget.cxx:517
 TQtWidget.cxx:518
 TQtWidget.cxx:519
 TQtWidget.cxx:520
 TQtWidget.cxx:521
 TQtWidget.cxx:522
 TQtWidget.cxx:523
 TQtWidget.cxx:524
 TQtWidget.cxx:525
 TQtWidget.cxx:526
 TQtWidget.cxx:527
 TQtWidget.cxx:528
 TQtWidget.cxx:529
 TQtWidget.cxx:530
 TQtWidget.cxx:531
 TQtWidget.cxx:532
 TQtWidget.cxx:533
 TQtWidget.cxx:534
 TQtWidget.cxx:535
 TQtWidget.cxx:536
 TQtWidget.cxx:537
 TQtWidget.cxx:538
 TQtWidget.cxx:539
 TQtWidget.cxx:540
 TQtWidget.cxx:541
 TQtWidget.cxx:542
 TQtWidget.cxx:543
 TQtWidget.cxx:544
 TQtWidget.cxx:545
 TQtWidget.cxx:546
 TQtWidget.cxx:547
 TQtWidget.cxx:548
 TQtWidget.cxx:549
 TQtWidget.cxx:550
 TQtWidget.cxx:551
 TQtWidget.cxx:552
 TQtWidget.cxx:553
 TQtWidget.cxx:554
 TQtWidget.cxx:555
 TQtWidget.cxx:556
 TQtWidget.cxx:557
 TQtWidget.cxx:558
 TQtWidget.cxx:559
 TQtWidget.cxx:560
 TQtWidget.cxx:561
 TQtWidget.cxx:562
 TQtWidget.cxx:563
 TQtWidget.cxx:564
 TQtWidget.cxx:565
 TQtWidget.cxx:566
 TQtWidget.cxx:567
 TQtWidget.cxx:568
 TQtWidget.cxx:569
 TQtWidget.cxx:570
 TQtWidget.cxx:571
 TQtWidget.cxx:572
 TQtWidget.cxx:573
 TQtWidget.cxx:574
 TQtWidget.cxx:575
 TQtWidget.cxx:576
 TQtWidget.cxx:577
 TQtWidget.cxx:578
 TQtWidget.cxx:579
 TQtWidget.cxx:580
 TQtWidget.cxx:581
 TQtWidget.cxx:582
 TQtWidget.cxx:583
 TQtWidget.cxx:584
 TQtWidget.cxx:585
 TQtWidget.cxx:586
 TQtWidget.cxx:587
 TQtWidget.cxx:588
 TQtWidget.cxx:589
 TQtWidget.cxx:590
 TQtWidget.cxx:591
 TQtWidget.cxx:592
 TQtWidget.cxx:593
 TQtWidget.cxx:594
 TQtWidget.cxx:595
 TQtWidget.cxx:596
 TQtWidget.cxx:597
 TQtWidget.cxx:598
 TQtWidget.cxx:599
 TQtWidget.cxx:600
 TQtWidget.cxx:601
 TQtWidget.cxx:602
 TQtWidget.cxx:603
 TQtWidget.cxx:604
 TQtWidget.cxx:605
 TQtWidget.cxx:606
 TQtWidget.cxx:607
 TQtWidget.cxx:608
 TQtWidget.cxx:609
 TQtWidget.cxx:610
 TQtWidget.cxx:611
 TQtWidget.cxx:612
 TQtWidget.cxx:613
 TQtWidget.cxx:614
 TQtWidget.cxx:615
 TQtWidget.cxx:616
 TQtWidget.cxx:617
 TQtWidget.cxx:618
 TQtWidget.cxx:619
 TQtWidget.cxx:620
 TQtWidget.cxx:621
 TQtWidget.cxx:622
 TQtWidget.cxx:623
 TQtWidget.cxx:624
 TQtWidget.cxx:625
 TQtWidget.cxx:626
 TQtWidget.cxx:627
 TQtWidget.cxx:628
 TQtWidget.cxx:629
 TQtWidget.cxx:630
 TQtWidget.cxx:631
 TQtWidget.cxx:632
 TQtWidget.cxx:633
 TQtWidget.cxx:634
 TQtWidget.cxx:635
 TQtWidget.cxx:636
 TQtWidget.cxx:637
 TQtWidget.cxx:638
 TQtWidget.cxx:639
 TQtWidget.cxx:640
 TQtWidget.cxx:641
 TQtWidget.cxx:642
 TQtWidget.cxx:643
 TQtWidget.cxx:644
 TQtWidget.cxx:645
 TQtWidget.cxx:646
 TQtWidget.cxx:647
 TQtWidget.cxx:648
 TQtWidget.cxx:649
 TQtWidget.cxx:650
 TQtWidget.cxx:651
 TQtWidget.cxx:652
 TQtWidget.cxx:653
 TQtWidget.cxx:654
 TQtWidget.cxx:655
 TQtWidget.cxx:656
 TQtWidget.cxx:657
 TQtWidget.cxx:658
 TQtWidget.cxx:659
 TQtWidget.cxx:660
 TQtWidget.cxx:661
 TQtWidget.cxx:662
 TQtWidget.cxx:663
 TQtWidget.cxx:664
 TQtWidget.cxx:665
 TQtWidget.cxx:666
 TQtWidget.cxx:667
 TQtWidget.cxx:668
 TQtWidget.cxx:669
 TQtWidget.cxx:670
 TQtWidget.cxx:671
 TQtWidget.cxx:672
 TQtWidget.cxx:673
 TQtWidget.cxx:674
 TQtWidget.cxx:675
 TQtWidget.cxx:676
 TQtWidget.cxx:677
 TQtWidget.cxx:678
 TQtWidget.cxx:679
 TQtWidget.cxx:680
 TQtWidget.cxx:681
 TQtWidget.cxx:682
 TQtWidget.cxx:683
 TQtWidget.cxx:684
 TQtWidget.cxx:685
 TQtWidget.cxx:686
 TQtWidget.cxx:687
 TQtWidget.cxx:688
 TQtWidget.cxx:689
 TQtWidget.cxx:690
 TQtWidget.cxx:691
 TQtWidget.cxx:692
 TQtWidget.cxx:693
 TQtWidget.cxx:694
 TQtWidget.cxx:695
 TQtWidget.cxx:696
 TQtWidget.cxx:697
 TQtWidget.cxx:698
 TQtWidget.cxx:699
 TQtWidget.cxx:700
 TQtWidget.cxx:701
 TQtWidget.cxx:702
 TQtWidget.cxx:703
 TQtWidget.cxx:704
 TQtWidget.cxx:705
 TQtWidget.cxx:706
 TQtWidget.cxx:707
 TQtWidget.cxx:708
 TQtWidget.cxx:709
 TQtWidget.cxx:710
 TQtWidget.cxx:711
 TQtWidget.cxx:712
 TQtWidget.cxx:713
 TQtWidget.cxx:714
 TQtWidget.cxx:715
 TQtWidget.cxx:716
 TQtWidget.cxx:717
 TQtWidget.cxx:718
 TQtWidget.cxx:719
 TQtWidget.cxx:720
 TQtWidget.cxx:721
 TQtWidget.cxx:722
 TQtWidget.cxx:723
 TQtWidget.cxx:724
 TQtWidget.cxx:725
 TQtWidget.cxx:726
 TQtWidget.cxx:727
 TQtWidget.cxx:728
 TQtWidget.cxx:729
 TQtWidget.cxx:730
 TQtWidget.cxx:731
 TQtWidget.cxx:732
 TQtWidget.cxx:733
 TQtWidget.cxx:734
 TQtWidget.cxx:735
 TQtWidget.cxx:736
 TQtWidget.cxx:737
 TQtWidget.cxx:738
 TQtWidget.cxx:739
 TQtWidget.cxx:740
 TQtWidget.cxx:741
 TQtWidget.cxx:742
 TQtWidget.cxx:743
 TQtWidget.cxx:744
 TQtWidget.cxx:745
 TQtWidget.cxx:746
 TQtWidget.cxx:747
 TQtWidget.cxx:748
 TQtWidget.cxx:749
 TQtWidget.cxx:750
 TQtWidget.cxx:751
 TQtWidget.cxx:752
 TQtWidget.cxx:753
 TQtWidget.cxx:754
 TQtWidget.cxx:755
 TQtWidget.cxx:756
 TQtWidget.cxx:757
 TQtWidget.cxx:758
 TQtWidget.cxx:759
 TQtWidget.cxx:760
 TQtWidget.cxx:761
 TQtWidget.cxx:762
 TQtWidget.cxx:763
 TQtWidget.cxx:764
 TQtWidget.cxx:765
 TQtWidget.cxx:766
 TQtWidget.cxx:767
 TQtWidget.cxx:768
 TQtWidget.cxx:769
 TQtWidget.cxx:770
 TQtWidget.cxx:771
 TQtWidget.cxx:772
 TQtWidget.cxx:773
 TQtWidget.cxx:774
 TQtWidget.cxx:775
 TQtWidget.cxx:776
 TQtWidget.cxx:777
 TQtWidget.cxx:778
 TQtWidget.cxx:779
 TQtWidget.cxx:780
 TQtWidget.cxx:781
 TQtWidget.cxx:782
 TQtWidget.cxx:783
 TQtWidget.cxx:784
 TQtWidget.cxx:785
 TQtWidget.cxx:786
 TQtWidget.cxx:787
 TQtWidget.cxx:788
 TQtWidget.cxx:789
 TQtWidget.cxx:790
 TQtWidget.cxx:791
 TQtWidget.cxx:792
 TQtWidget.cxx:793
 TQtWidget.cxx:794
 TQtWidget.cxx:795
 TQtWidget.cxx:796
 TQtWidget.cxx:797
 TQtWidget.cxx:798
 TQtWidget.cxx:799
 TQtWidget.cxx:800
 TQtWidget.cxx:801
 TQtWidget.cxx:802
 TQtWidget.cxx:803
 TQtWidget.cxx:804
 TQtWidget.cxx:805
 TQtWidget.cxx:806
 TQtWidget.cxx:807
 TQtWidget.cxx:808
 TQtWidget.cxx:809
 TQtWidget.cxx:810
 TQtWidget.cxx:811
 TQtWidget.cxx:812
 TQtWidget.cxx:813
 TQtWidget.cxx:814
 TQtWidget.cxx:815
 TQtWidget.cxx:816
 TQtWidget.cxx:817
 TQtWidget.cxx:818
 TQtWidget.cxx:819
 TQtWidget.cxx:820
 TQtWidget.cxx:821
 TQtWidget.cxx:822
 TQtWidget.cxx:823
 TQtWidget.cxx:824
 TQtWidget.cxx:825
 TQtWidget.cxx:826
 TQtWidget.cxx:827
 TQtWidget.cxx:828
 TQtWidget.cxx:829
 TQtWidget.cxx:830
 TQtWidget.cxx:831
 TQtWidget.cxx:832
 TQtWidget.cxx:833
 TQtWidget.cxx:834
 TQtWidget.cxx:835
 TQtWidget.cxx:836
 TQtWidget.cxx:837
 TQtWidget.cxx:838
 TQtWidget.cxx:839
 TQtWidget.cxx:840
 TQtWidget.cxx:841
 TQtWidget.cxx:842
 TQtWidget.cxx:843
 TQtWidget.cxx:844
 TQtWidget.cxx:845
 TQtWidget.cxx:846
 TQtWidget.cxx:847
 TQtWidget.cxx:848
 TQtWidget.cxx:849
 TQtWidget.cxx:850
 TQtWidget.cxx:851
 TQtWidget.cxx:852
 TQtWidget.cxx:853
 TQtWidget.cxx:854
 TQtWidget.cxx:855
 TQtWidget.cxx:856
 TQtWidget.cxx:857
 TQtWidget.cxx:858
 TQtWidget.cxx:859
 TQtWidget.cxx:860
 TQtWidget.cxx:861
 TQtWidget.cxx:862
 TQtWidget.cxx:863
 TQtWidget.cxx:864
 TQtWidget.cxx:865
 TQtWidget.cxx:866
 TQtWidget.cxx:867
 TQtWidget.cxx:868
 TQtWidget.cxx:869
 TQtWidget.cxx:870
 TQtWidget.cxx:871
 TQtWidget.cxx:872
 TQtWidget.cxx:873
 TQtWidget.cxx:874
 TQtWidget.cxx:875
 TQtWidget.cxx:876
 TQtWidget.cxx:877
 TQtWidget.cxx:878
 TQtWidget.cxx:879
 TQtWidget.cxx:880
 TQtWidget.cxx:881
 TQtWidget.cxx:882
 TQtWidget.cxx:883
 TQtWidget.cxx:884
 TQtWidget.cxx:885
 TQtWidget.cxx:886
 TQtWidget.cxx:887
 TQtWidget.cxx:888
 TQtWidget.cxx:889
 TQtWidget.cxx:890
 TQtWidget.cxx:891
 TQtWidget.cxx:892
 TQtWidget.cxx:893
 TQtWidget.cxx:894
 TQtWidget.cxx:895
 TQtWidget.cxx:896
 TQtWidget.cxx:897
 TQtWidget.cxx:898
 TQtWidget.cxx:899
 TQtWidget.cxx:900
 TQtWidget.cxx:901
 TQtWidget.cxx:902
 TQtWidget.cxx:903
 TQtWidget.cxx:904
 TQtWidget.cxx:905
 TQtWidget.cxx:906
 TQtWidget.cxx:907
 TQtWidget.cxx:908
 TQtWidget.cxx:909
 TQtWidget.cxx:910
 TQtWidget.cxx:911
 TQtWidget.cxx:912
 TQtWidget.cxx:913
 TQtWidget.cxx:914
 TQtWidget.cxx:915
 TQtWidget.cxx:916
 TQtWidget.cxx:917
 TQtWidget.cxx:918
 TQtWidget.cxx:919
 TQtWidget.cxx:920
 TQtWidget.cxx:921
 TQtWidget.cxx:922
 TQtWidget.cxx:923
 TQtWidget.cxx:924
 TQtWidget.cxx:925
 TQtWidget.cxx:926
 TQtWidget.cxx:927
 TQtWidget.cxx:928
 TQtWidget.cxx:929
 TQtWidget.cxx:930
 TQtWidget.cxx:931
 TQtWidget.cxx:932
 TQtWidget.cxx:933
 TQtWidget.cxx:934