00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016 #include <qapplication.h>
00017
00018 #if QT_VERSION >= 0x40000
00019 # include <QFocusEvent>
00020 # include <QPaintEvent>
00021 # include <QKeyEvent>
00022 # include <QShowEvent>
00023 # include <QResizeEvent>
00024 # include <QMouseEvent>
00025 # include <QCustomEvent>
00026 # include <QImage>
00027 # include <QDebug>
00028 #endif
00029
00030 #include "TQtWidget.h"
00031 #include "TQtTimer.h"
00032
00033 #include "TROOT.h"
00034 #include "TEnv.h"
00035 #include "TRint.h"
00036 #include "TSystem.h"
00037 #include "Getline.h"
00038 #include "TGQt.h"
00039 #include "TCanvas.h"
00040 #include "Buttons.h"
00041 #include <qevent.h>
00042 #include <qpainter.h>
00043 #include <qpixmap.h>
00044 #include <qfileinfo.h>
00045
00046 #ifdef R__QTWIN32
00047
00048 #include "TWinNTSystem.h"
00049 #include "Win32Constants.h"
00050 #endif
00051
00052
00053
00054
00055 TQtWidgetBuffer::TQtWidgetBuffer(const QWidget *w, bool clear)
00056 : fWidget(w),fBuffer(0), fIsImage(clear)
00057 {
00058 if (fIsImage) {
00059 fBuffer = new QImage(fWidget?fWidget->size():QSize(0,0),QImage::Format_ARGB32_Premultiplied);
00060
00061 } else {
00062 fBuffer = new QPixmap(fWidget?fWidget->size():QSize(0,0));
00063 }
00064 }
00065
00066 TQtWidgetBuffer::TQtWidgetBuffer(const TQtWidgetBuffer &b)
00067 : fWidget(b.fWidget),fBuffer(0), fIsImage(b.fIsImage)
00068 {
00069
00070 if (fWidget && (fWidget->size() != QSize(0,0))) {
00071 if (fIsImage) {
00072 QImage resized =((QImage*)b.fBuffer)->scaled (fWidget->size());
00073 fBuffer = new QImage(resized);
00074 } else {
00075 QPixmap resized =((QPixmap*) b.fBuffer)->scaled (fWidget->size());
00076 fBuffer = new QPixmap(resized);
00077 }
00078 }
00079 }
00080
00081 TQtWidgetBuffer:: ~TQtWidgetBuffer()
00082 {
00083
00084 delete fBuffer;
00085 fBuffer = 0;
00086 }
00087
00088
00089 void TQtWidgetBuffer::Clear()
00090 {
00091
00092 if (fBuffer && !fIsImage ) {
00093 #ifdef R__WIN32
00094 ((QPixmap*)fBuffer)->fill(Qt::transparent);
00095 #else
00096 QPainter p(fBuffer);
00097 p.fillRect(QRect(0,0,fBuffer->width(), fBuffer->height())
00098 ,Qt::transparent);
00099 #endif
00100 }
00101 }
00102
00103
00104
00105
00106 ClassImp(TQtWidget)
00107
00108
00109
00110
00111
00112
00113
00114
00115
00116
00117
00118
00119
00120
00121
00122
00123
00124
00125
00126
00127
00128
00129
00130
00131
00132
00133
00134
00135
00136
00137
00138
00139
00140
00141
00142
00143
00144
00145
00146
00147
00148
00149
00150
00151
00152
00153
00154
00155
00156
00157
00158
00159
00160
00161
00162
00163
00164
00165
00166
00167
00168
00169
00170
00171
00172
00173
00174
00175
00176
00177
00178
00179
00180
00181
00182
00183
00184 TQtWidget::TQtWidget(QWidget* mother, const char* name, Qt::WFlags f,bool embedded) :
00185 QWidget(mother,f)
00186 ,fBits(0),fNeedStretch(false),fCanvas(0),fPixmapID(0),fPixmapScreen(0)
00187 ,fPaint(TRUE),fSizeChanged(FALSE),fDoubleBufferOn(FALSE),fEmbedded(embedded)
00188 ,fWrapper(0),fSaveFormat("PNG"),fInsidePaintEvent(false),fOldMousePos(-1,-1)
00189 ,fIgnoreLeaveEnter(0),fRefreshTimer(0)
00190 {
00191 if (name && name[0]) setObjectName(name);
00192 Init() ;
00193 }
00194
00195
00196 TQtWidget::TQtWidget(QWidget* mother, Qt::WFlags f,bool embedded) :
00197 QWidget(mother,f)
00198 ,fBits(0),fNeedStretch(false),fCanvas(0),fPixmapID(0)
00199 ,fPixmapScreen(0),fPaint(TRUE),fSizeChanged(FALSE)
00200 ,fDoubleBufferOn(FALSE),fEmbedded(embedded),fWrapper(0),fSaveFormat("PNG")
00201 ,fInsidePaintEvent(false),fOldMousePos(-1,-1),fIgnoreLeaveEnter(0),fRefreshTimer(0)
00202 { setObjectName("tqtwidget"); Init() ;}
00203
00204
00205 void TQtWidget::Init()
00206 {
00207 setFocusPolicy(Qt::WheelFocus);
00208 setAttribute(Qt::WA_NoSystemBackground);
00209 setAutoFillBackground(false);
00210 QPalette p = palette();
00211 p.setBrush(QPalette::Window, Qt::transparent);
00212 setPalette(p);
00213
00214 if (fEmbedded) {
00215 if (!gApplication) InitRint();
00216 int minw = 10;
00217 int minh = 10;
00218 setMinimumSize(minw,minh);
00219 Bool_t batch = gROOT->IsBatch();
00220 if (!batch) gROOT->SetBatch(kTRUE);
00221 TGQt::RegisterWid(this);
00222 fCanvas = new TCanvas(objectName().toStdString().c_str(),minw,minh, TGQt::RegisterWid(this));
00223 gROOT->SetBatch(batch);
00224
00225 Refresh();
00226 }
00227 fSizeHint = QWidget::sizeHint();
00228 setSizePolicy(QSizePolicy(QSizePolicy::MinimumExpanding,QSizePolicy::MinimumExpanding));
00229 #ifdef R__QTWIN32
00230
00231 static HICON rootIcon = 0;
00232 if (!rootIcon) {
00233 HICON hIcon = ::LoadIcon(::GetModuleHandle(NULL), MAKEINTRESOURCE(101));
00234 if (!hIcon) hIcon = LoadIcon(NULL, IDI_APPLICATION);
00235 rootIcon = hIcon;
00236 SetClassLong(winId(),
00237 GCL_HICON,
00238 LONG(rootIcon)
00239 );
00240 }
00241 #endif
00242 }
00243
00244 TQtWidget::~TQtWidget()
00245 {
00246 TCanvas *c = 0;
00247
00248 gVirtualX->SelectWindow(-1);
00249 TGQt::UnRegisterWid(this);
00250 if (fEmbedded) {
00251
00252 c = fCanvas;
00253 ResetCanvas();
00254 delete c;
00255 } else {
00256 ResetCanvas();
00257 }
00258 delete fPixmapID; fPixmapID = 0;
00259 delete fPixmapScreen; fPixmapScreen = 0;
00260 }
00261
00262
00263 void TQtWidget::AdjustBufferSize()
00264 {
00265
00266 TQtWidgetBuffer &buf = SetBuffer();
00267 QSize s(buf.Width(),buf.Height());
00268 if ( s != size() ) {
00269 #if 0
00270 qDebug() << "TQtWidget::AdjustBufferSize(): "
00271 << this
00272 << s << size();
00273 #endif
00274 if (fPixmapID) {
00275 TQtWidgetBuffer *bf = new TQtWidgetBuffer(*fPixmapID);
00276 delete fPixmapID; fPixmapID = bf;
00277 }
00278 if (fPixmapScreen) {
00279 TQtWidgetBuffer *bf = new TQtWidgetBuffer(*fPixmapScreen);
00280 delete fPixmapScreen; fPixmapScreen = bf;
00281 }
00282 }
00283 }
00284
00285 TCanvas *TQtWidget::Canvas()
00286 {
00287
00288 return GetCanvas();
00289 }
00290
00291
00292 TCanvas *TQtWidget::Canvas(TQtWidget *widget)
00293 {
00294
00295 return widget ? widget->Canvas() : 0 ;
00296 }
00297
00298
00299 TQtWidget *TQtWidget::Canvas(const TCanvas *canvas)
00300 {
00301
00302 return canvas ? Canvas(canvas->GetCanvasID()) : 0;
00303 }
00304
00305 TQtWidget *TQtWidget::Canvas(Int_t id)
00306 {
00307
00308 return dynamic_cast<TQtWidget *>(TGQt::iwid(id));
00309 }
00310
00311
00312 TApplication *TQtWidget::InitRint( Bool_t , const char *appClassName, int *argc, char **argv,
00313 void *options, int numOptions, Bool_t noLogo)
00314 {
00315
00316
00317
00318
00319
00320
00321
00322
00323
00324
00325
00326
00327
00328 static int localArgc =0;
00329 static char **localArgv =0;
00330 if (!gApplication) {
00331 QStringList args = QCoreApplication::arguments ();
00332 localArgc = argc ? *argc : args.size();
00333
00334 TString guiBackend(gEnv->GetValue("Gui.Backend", "native"));
00335 guiBackend.ToLower();
00336
00337 if (!guiBackend.BeginsWith("qt",TString::kIgnoreCase)) {
00338 gEnv->SetValue("Gui.Backend", "qt");
00339 }
00340 TString guiFactory(gEnv->GetValue("Gui.Factory", "native"));
00341 guiFactory.ToLower();
00342 #if ROOT_VERSION_CODE >= ROOT_VERSION(5,16,0)
00343 TApplication::NeedGraphicsLibs() ;
00344 #endif
00345 if (!guiFactory.BeginsWith("qt",TString::kIgnoreCase )){
00346
00347 char *extLib = gSystem->DynamicPathName("libQtRootGui",kTRUE);
00348 if (extLib) {
00349 gEnv->SetValue("Gui.Factory", "qtgui");
00350 } else {
00351 gEnv->SetValue("Gui.Factory", "qt");
00352 }
00353 delete [] extLib;
00354 }
00355 if (!argc && !argv ) {
00356 localArgv = new char*[args.size()];
00357 for (int i = 0; i < args.size(); ++i) {
00358 QString nextarg = args.at(i);
00359 Int_t nchi = nextarg.length()+1;
00360 localArgv[i]= new char[nchi];
00361 memcpy(localArgv[i], nextarg.toAscii().constData(),nchi-1);
00362 localArgv[nchi-1]=0;
00363 }
00364 } else {
00365 localArgv = argv;
00366 }
00367
00368 TRint *rint = new TRint(appClassName, &localArgc, localArgv, options,numOptions,noLogo);
00369
00370 Int_t prompt= gEnv->GetValue("Gui.Prompt", (Int_t)0);
00371 if (prompt) {
00372 Getlinem(kInit, rint->GetPrompt());
00373 } else {
00374
00375
00376 TSeqCollection* col = gSystem->GetListOfFileHandlers();
00377 TIter next(col);
00378 TFileHandler* o=0;
00379 while ( ( o=(TFileHandler*) next() ) ) {
00380 if ( o->GetFd()== 0 ) {
00381 o->Remove();
00382 break;
00383 }
00384 }
00385
00386 gSystem->RemoveSignalHandler(rint->GetSignalHandler());
00387 }
00388 TQtTimer::Create()->start(0);
00389 }
00390 return gApplication;
00391 }
00392
00393
00394 void TQtWidget::Erase()
00395 {
00396
00397
00398 SetBuffer();
00399
00400 if (fPixmapScreen) fPixmapScreen->Clear();
00401 if (fPixmapID) fPixmapID->Clear();
00402
00403 }
00404
00405
00406 void TQtWidget::cd()
00407 {
00408
00409 cd(0);
00410 }
00411
00412 void TQtWidget::cd(int subpadnumber)
00413 {
00414
00415 TCanvas *c = fCanvas;
00416 if (c) {
00417 c->cd(subpadnumber);
00418 }
00419 }
00420
00421 void TQtWidget::Disconnect()
00422 {
00423
00424
00425
00426 fCanvas = 0;
00427 }
00428
00429 void TQtWidget::Refresh()
00430 {
00431
00432
00433
00434 if (!fRefreshTimer) {
00435 fRefreshTimer = new QTimer(this);
00436 fRefreshTimer->setSingleShot(true);
00437 fRefreshTimer->setInterval(0);
00438 connect(fRefreshTimer, SIGNAL(timeout()), this, SLOT(RefreshCB()));
00439 }
00440 fRefreshTimer->start();
00441 }
00442
00443 void TQtWidget::RefreshCB()
00444 {
00445
00446
00447 TCanvas *c = Canvas();
00448 if (c) {
00449 c->Modified();
00450 c->Resize();
00451 c->Update();
00452 }
00453 if (!fInsidePaintEvent) { update(); }
00454 else {
00455 qDebug() << " TQtWidget::Refresh() update inside of paintEvent !!!" << this;
00456 }
00457 }
00458
00459 void TQtWidget::SetCanvas(TCanvas *c)
00460 {
00461
00462 fCanvas = c;
00463
00464 setObjectName(fCanvas->GetName());
00465 }
00466
00467
00468 void
00469 TQtWidget::customEvent(QEvent *e)
00470 {
00471
00472
00473 switch (e->type() - QEvent::User) {
00474 case kEXITSIZEMOVE:
00475 {
00476 fPaint = TRUE;
00477 exitSizeEvent();
00478 break;
00479 }
00480 case kENTERSIZEMOVE:
00481 {
00482
00483 fSizeChanged=FALSE;
00484 fPaint = FALSE;
00485 break;
00486 }
00487 case kFORCESIZE:
00488 default:
00489 {
00490
00491 fPaint = TRUE;
00492 fSizeChanged = TRUE;
00493 exitSizeEvent();
00494 break;
00495 }
00496 };
00497 }
00498
00499 void TQtWidget::contextMenuEvent(QContextMenuEvent *e)
00500 {
00501
00502
00503 TCanvas *c = Canvas();
00504 if (e && c && (e->reason() != QContextMenuEvent::Mouse) ) {
00505 e->accept();
00506 c->HandleInput(kButton3Down, e->x(), e->y());
00507 }
00508 }
00509
00510 void TQtWidget::focusInEvent ( QFocusEvent *e )
00511 {
00512
00513
00514
00515 if (!fWrapper && e->gotFocus()) {
00516 setMouseTracking(TRUE);
00517 }
00518 }
00519
00520 void TQtWidget::focusOutEvent ( QFocusEvent *e )
00521 {
00522
00523
00524
00525 if (!fWrapper && e->lostFocus()) {
00526 setMouseTracking(FALSE);
00527 }
00528 }
00529
00530
00531 void TQtWidget::mousePressEvent (QMouseEvent *e)
00532 {
00533
00534
00535
00536
00537
00538
00539 EEventType rootButton = kNoEvent;
00540 Qt::ContextMenuPolicy currentPolicy = contextMenuPolicy();
00541 fOldMousePos = e->pos();
00542 TCanvas *c = Canvas();
00543 if (c && !fWrapper ){
00544 switch (e->button ())
00545 {
00546 case Qt::LeftButton: rootButton = kButton1Down; break;
00547 case Qt::RightButton: {
00548
00549
00550 if ( currentPolicy == Qt::DefaultContextMenu) {
00551 e->accept();
00552 QContextMenuEvent evt(QContextMenuEvent::Other, e->pos() );
00553 QApplication::sendEvent(this, &evt);
00554 } else {
00555 rootButton = kButton3Down;
00556 }
00557 break;
00558 }
00559 case Qt::MidButton: rootButton = kButton2Down; break;
00560 default: break;
00561 };
00562 if (rootButton != kNoEvent) {
00563 e->accept();
00564 if (rootButton == kButton3Down) {
00565 bool lastvalue = c->TestBit(kNoContextMenu);
00566 c->SetBit(kNoContextMenu);
00567 c->HandleInput(rootButton, e->x(), e->y());
00568 c->SetBit(kNoContextMenu, lastvalue);
00569 } else {
00570 c->HandleInput(rootButton, e->x(), e->y());
00571 }
00572 EmitSignal(kMousePressEvent);
00573 return;
00574 }
00575 } else {
00576 e->ignore();
00577 }
00578 QWidget::mousePressEvent(e);
00579 }
00580
00581
00582 void TQtWidget::mouseMoveEvent (QMouseEvent * e)
00583 {
00584
00585
00586
00587 EEventType rootButton = kMouseMotion;
00588 if ( fOldMousePos != e->pos() && fIgnoreLeaveEnter < 2 ) {
00589 fOldMousePos = e->pos();
00590 TCanvas *c = Canvas();
00591 if (c && !fWrapper){
00592 if (e->buttons() & Qt::LeftButton) { rootButton = kButton1Motion; }
00593 e->accept();
00594 c->HandleInput(rootButton, e->x(), e->y());
00595 EmitSignal(kMouseMoveEvent);
00596 return;
00597 } else {
00598 e->ignore();
00599 }
00600 }
00601 QWidget::mouseMoveEvent(e);
00602 }
00603
00604
00605 void TQtWidget::mouseReleaseEvent(QMouseEvent * e)
00606 {
00607
00608
00609
00610 EEventType rootButton = kNoEvent;
00611 fOldMousePos = QPoint(-1,-1);
00612 TCanvas *c = Canvas();
00613 if (c && !fWrapper){
00614 switch (e->button())
00615 {
00616 case Qt::LeftButton: rootButton = kButton1Up; break;
00617 case Qt::RightButton: rootButton = kButton3Up; break;
00618 case Qt::MidButton: rootButton = kButton2Up; break;
00619 default: break;
00620 };
00621 if (rootButton != kNoEvent) {
00622 e->accept();
00623 c->HandleInput(rootButton, e->x(), e->y());
00624 gPad->Modified();
00625 EmitSignal(kMouseReleaseEvent);
00626 return;
00627 }
00628 } else {
00629 e->ignore();
00630 }
00631 QWidget::mouseReleaseEvent(e);
00632 }
00633
00634
00635 void TQtWidget::mouseDoubleClickEvent(QMouseEvent * e)
00636 {
00637
00638
00639 EEventType rootButton = kNoEvent;
00640 TCanvas *c = Canvas();
00641 if (c && !fWrapper){
00642 switch (e->button())
00643 {
00644 case Qt::LeftButton: rootButton = kButton1Double; break;
00645 case Qt::RightButton: rootButton = kButton3Double; break;
00646 case Qt::MidButton: rootButton = kButton2Double; break;
00647 default: break;
00648 };
00649 if (rootButton != kNoEvent) {
00650 e->accept();
00651 c->HandleInput(rootButton, e->x(), e->y());
00652 EmitSignal(kMouseDoubleClickEvent);return;
00653 }
00654 } else {
00655 e->ignore();
00656 }
00657 QWidget::mouseDoubleClickEvent(e);
00658 }
00659
00660 void TQtWidget::keyPressEvent(QKeyEvent * e)
00661 {
00662
00663
00664 TCanvas *c = Canvas();
00665 if (c && !fWrapper){
00666 c->HandleInput(kKeyPress, e->text().toStdString().c_str()[0], e->key());
00667 EmitSignal(kKeyPressEvent);
00668 } else {
00669 e->ignore();
00670 }
00671 QWidget::keyPressEvent(e);
00672 }
00673
00674 void TQtWidget::keyReleaseEvent(QKeyEvent * e)
00675 {
00676
00677
00678 QWidget::keyReleaseEvent(e);
00679 }
00680
00681 void TQtWidget::enterEvent(QEvent *e)
00682 {
00683
00684
00685 TCanvas *c = Canvas();
00686 if (c && !fIgnoreLeaveEnter && !fWrapper){
00687 c->HandleInput(kMouseEnter, 0, 0);
00688 EmitSignal(kEnterEvent);
00689 }
00690 QWidget::enterEvent(e);
00691 }
00692
00693 void TQtWidget::leaveEvent (QEvent *e)
00694 {
00695
00696
00697 TCanvas *c = Canvas();
00698 if (c && !fIgnoreLeaveEnter && !fWrapper){
00699 c->HandleInput(kMouseLeave, 0, 0);
00700 EmitSignal(kLeaveEvent);
00701 }
00702 QWidget::leaveEvent(e);
00703 }
00704
00705 void TQtWidget::resizeEvent(QResizeEvent *e)
00706 {
00707
00708
00709
00710 if (!e) return;
00711 if (topLevelWidget()->isMinimized()) { fSizeChanged=FALSE; }
00712 else if (topLevelWidget()->isMaximized ()){
00713 fSizeChanged=TRUE;
00714 exitSizeEvent();
00715 fSizeChanged=TRUE;
00716 } else {
00717 #ifdef R__QTWIN32
00718 if (!fPaint) {
00719
00720 fSizeChanged=TRUE;
00721 fNeedStretch=true;
00722 } else {
00723 #else
00724 {
00725 fSizeChanged=TRUE;
00726 #if 0
00727 if (Qt::LeftButton == QApplication::mouseButtons())
00728 {
00729 fNeedStretch=true;
00730 fPaint = false;
00731 } else
00732 #endif
00733 {
00734 fPaint = kTRUE;
00735 exitSizeEvent();
00736 }
00737 #endif
00738 } }
00739 }
00740
00741 void TQtWidget::SetSaveFormat(const char *format)
00742 {
00743
00744 fSaveFormat = TGQt::QtFileFormat(format);
00745 }
00746
00747 bool TQtWidget::Save(const char *fileName) const
00748 {
00749
00750
00751
00752
00753
00754
00755
00756
00757 return Save(QString(fileName));
00758 }
00759
00760 bool TQtWidget::Save(const QString &fileName) const
00761 {
00762
00763
00764
00765
00766
00767
00768
00769
00770 QString fileNameExtension = QFileInfo(fileName).suffix().toUpper();
00771 QString saveFormat;
00772 if (fileNameExtension.isEmpty() ) {
00773 saveFormat = fSaveFormat;
00774 } else {
00775 saveFormat = TGQt::QtFileFormat(fileNameExtension);
00776 }
00777 return Save(fileName,saveFormat.toStdString().c_str());
00778 }
00779
00780
00781 bool TQtWidget::Save(const char *fileName,const char *format,int quality)const
00782 {
00783 return Save(QString(fileName),format,quality);
00784 }
00785
00786 bool TQtWidget::Save(const QString &fileName,const char *format,int quality)const
00787 {
00788
00789
00790 bool Ok = false;
00791 bool rootFormatFound=kTRUE;
00792 QString saveType = TGQt::RootFileFormat(format);
00793 if (saveType.isEmpty() ) {
00794 rootFormatFound = false;
00795 saveType = TGQt::QtFileFormat(format);
00796 }
00797 TCanvas *c = GetCanvas();
00798 if (rootFormatFound && c) {
00799 c->Print(fileName.toStdString().c_str(),saveType.toStdString().c_str());
00800 Ok = true;
00801 } else if (GetOffScreenBuffer()) {
00802
00803
00804 int dot = fileName.lastIndexOf('.');
00805 int plus = 0;
00806 if (dot > -1) {
00807 plus = fileName.indexOf('+',dot+1);
00808 }
00809 QString fln = (plus > -1) ? TGQt::GetNewFileName(fileName.left(plus)) : fileName;
00810 if (fCanvasDecorator.isNull()) {
00811 Ok = GetOffScreenBuffer()->save(fln,saveType.toStdString().c_str(),quality);
00812 } else {
00813
00814 }
00815 }
00816 emit ((TQtWidget *)this)->Saved(Ok);
00817 return Ok;
00818 }
00819
00820 void TQtWidget::SetDoubleBuffer(bool on)
00821 {
00822
00823 if (fDoubleBufferOn != on ) {
00824 fDoubleBufferOn = on;
00825 if (on) SetBuffer();
00826 }
00827 }
00828
00829 void TQtWidget::stretchWidget(QResizeEvent * )
00830 {
00831
00832
00833 if (!paintingActive() && fPixmapID) {
00834 QPainter pnt(this);
00835 pnt.drawPixmap(rect(),*GetOffScreenBuffer());
00836 }
00837 fNeedStretch = false;
00838 }
00839
00840 void TQtWidget::exitSizeEvent ()
00841 {
00842
00843
00844 if (!fSizeChanged ) return;
00845 {
00846 AdjustBufferSize();
00847 }
00848
00849 TCanvas *c = Canvas();
00850 if (c) c->Resize();
00851
00852 Refresh();
00853 }
00854
00855
00856 bool TQtWidget::paintFlag(bool mode)
00857 {
00858
00859
00860 bool flag = fPaint;
00861 fPaint = mode;
00862 return flag;
00863 }
00864
00865 void TQtWidget::showEvent ( QShowEvent *)
00866 {
00867
00868
00869
00870
00871 TQtWidgetBuffer &buf = SetBuffer();
00872 QSize s(buf.Width(),buf.Height());
00873 if (s != size() )
00874 {
00875 fSizeChanged = kTRUE;
00876 exitSizeEvent();
00877 }
00878 }
00879
00880
00881 void TQtWidget::paintEvent (QPaintEvent *e)
00882 {
00883
00884
00885
00886
00887 fInsidePaintEvent = true;
00888 if (fNeedStretch) {
00889 stretchWidget((QResizeEvent *)0);
00890 } else {
00891 #ifdef R__QTWIN32
00892 TQtWidgetBuffer &buf = SetBuffer();
00893 QSize s(buf.Width(),buf.Height());
00894 if ( fEmbedded && (s != size()) )
00895 {
00896 fSizeChanged = kTRUE;
00897 exitSizeEvent();
00898 fInsidePaintEvent = false;
00899 return;
00900 }
00901 #endif
00902 QRegion region = e->region();
00903 if ( ( fPaint && !region.isEmpty() ) )
00904 {
00905
00906
00907
00908
00909
00910 QPainter screen(this);
00911 screen.setClipRegion(region);
00912
00913 if (fPixmapID) screen.drawPixmap(0,0,*GetOffScreenBuffer());
00914 if (!fCanvasDecorator.isNull()) fCanvasDecorator->paintEvent(screen,e);
00915 }
00916 }
00917 fInsidePaintEvent = false;
00918 }
00919
00920
00921 void TQtWidget::SetSizeHint (const QSize &sz) {
00922
00923 fSizeHint = sz;
00924 }
00925
00926 QSize TQtWidget::sizeHint () const{
00927
00928 return QWidget::sizeHint();
00929 }
00930
00931 QSize TQtWidget::minimumSizeHint () const{
00932
00933 return QWidget::minimumSizeHint ();
00934 }
00935
00936 QSizePolicy TQtWidget::sizePolicy () const{
00937
00938 return QWidget::sizePolicy ();
00939 }
00940
00941 void TQtWidget::EmitTestedSignal()
00942 {
00943 TCanvas *c = GetCanvas();
00944 TObject *selected = GetSelected();
00945 UInt_t evt = GetEvent();
00946 emit RootEventProcessed(selected, evt, c);
00947 }
00948
00949 void TQtWidget::SetBit(UInt_t f, Bool_t set)
00950 {
00951
00952
00953 if (set)
00954 SetBit(f);
00955 else
00956 ResetBit(f);
00957 }
00958
00959 TQtWidgetBuffer &TQtWidget::SetBuffer() {
00960
00961 TQtWidgetBuffer *buf = 0;
00962 if (IsDoubleBuffered() ) {
00963 if (!fPixmapID) fPixmapID = new TQtWidgetBuffer(this);
00964 buf = fPixmapID;
00965 } else {
00966 if (!fPixmapScreen) fPixmapScreen = new TQtWidgetBuffer(this,true);
00967
00968 buf = fPixmapScreen;
00969 }
00970 return *buf;
00971 }
00972
00973 QPixmap *TQtWidget::GetOffScreenBuffer() const {
00974
00975 return fPixmapID ? (QPixmap *)fPixmapID->Buffer():0;
00976 }