#include <qapplication.h>
#if QT_VERSION >= 0x40000
# include <QFocusEvent>
# include <QPaintEvent>
# include <QKeyEvent>
# include <QShowEvent>
# include <QResizeEvent>
# include <QMouseEvent>
# include <QCustomEvent>
# 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 "TWinNTSystem.h"
#include "Win32Constants.h"
#endif
ClassImp(TQtWidget)
TQtWidget::TQtWidget(QWidget* parent, const char* name, Qt::WFlags f,bool embedded) :
#if QT_VERSION < 0x40000
QWidget(parent,name,f)
#else
QWidget(parent,f)
#endif
,fBits(0),fNeedStretch(false),fCanvas(0),fPixmapID(this),fShadowWidget(0),fIsShadow(false),fPaint(TRUE),fSizeChanged(FALSE)
,fDoubleBufferOn(FALSE),fEmbedded(embedded),fWrapper(0),fSaveFormat("PNG")
{
if (name && name[0]) setName(name);
Init() ;
}
TQtWidget::TQtWidget(QWidget* parent, Qt::WFlags f,bool embedded) :
#if QT_VERSION < 0x40000
QWidget(parent,"tqtwidget",f)
#else
QWidget(parent,f)
#endif
,fBits(0),fNeedStretch(false),fCanvas(0),fPixmapID(this),fShadowWidget(0),fIsShadow(false),fPaint(TRUE),fSizeChanged(FALSE)
,fDoubleBufferOn(FALSE),fEmbedded(embedded),fWrapper(0),fSaveFormat("PNG")
{ Init() ;}
void TQtWidget::Init()
{
#if QT_VERSION < 0x40000
setFocusPolicy(QWidget::WheelFocus);
setWFlags(getWFlags () | Qt::WRepaintNoErase | Qt:: WResizeNoErase );
#else /* QT_VERSION */
setFocusPolicy(Qt::WheelFocus);
setAttribute(Qt::WA_PaintOnScreen);
setAttribute(Qt::WA_PaintOutsidePaintEvent);
#endif /* QT_VERSION */
setBackgroundMode(Qt::NoBackground);
if (fEmbedded) {
if (!gApplication) InitRint();
int minw = 10;
int minh = 10;
setMinimumSize(minw,minh);
Bool_t batch = gROOT->IsBatch();
if (!batch) gROOT->SetBatch(kTRUE);
TGQt::RegisterWid(this);
fCanvas = new TCanvas(name(),minw,minh, TGQt::RegisterWid(this));
gROOT->SetBatch(batch);
}
fSizeHint = QWidget::sizeHint();
setSizePolicy(QSizePolicy(QSizePolicy::MinimumExpanding,QSizePolicy::MinimumExpanding));
#ifdef R__QTWIN32
static HICON rootIcon = 0;
if (!rootIcon) {
HICON hIcon = ::LoadIcon(::GetModuleHandle(NULL), MAKEINTRESOURCE(101));
if (!hIcon) hIcon = LoadIcon(NULL, IDI_APPLICATION);
rootIcon = hIcon;
SetClassLong(winId(),
GCL_HICON,
LONG(rootIcon)
);
}
#endif
}
TQtWidget::TQtWidget( TQtWidget &main) : QWidget(&main)
,fBits(0),fCanvas(0),fPixmapID(this),fShadowWidget(0),fIsShadow(true)
,fPaint(TRUE),fSizeChanged(FALSE),fDoubleBufferOn(TRUE),fEmbedded(TRUE)
,fWrapper(0),fSaveFormat("PNG")
{
#if QT_VERSION < 0x40000
setFocusPolicy(QWidget::WheelFocus);
setWFlags(getWFlags () | Qt::WRepaintNoErase | Qt:: WResizeNoErase );
#else /* QT_VERSION */
setBackgroundRole(QPalette::Window);
QPalette palette;
palette.setColor(backgroundRole(), QColor(0,200,0,128));
setPalette(palette);
#endif /* QT_VERSION */
}
TQtWidget::~TQtWidget()
{
TCanvas *c = 0;
if (!IsShadow()) {
gVirtualX->SelectWindow(-1);
gQt->End();
TGQt::UnRegisterWid(this);
if (fEmbedded) {
c = fCanvas;
fCanvas = 0;
delete c;
} else {
fCanvas = 0;
}
}
}
TCanvas *TQtWidget::Canvas()
{
return GetCanvas();
}
TCanvas *TQtWidget::Canvas(TQtWidget *widget)
{
return widget ? widget->Canvas() : 0 ;
}
TQtWidget *TQtWidget::Canvas(const TCanvas *canvas)
{
return canvas ? Canvas(canvas->GetCanvasID()) : 0;
}
TQtWidget *TQtWidget::Canvas(Int_t id)
{
return dynamic_cast<TQtWidget *>(TGQt::iwid(id));
}
TApplication *TQtWidget::InitRint( Bool_t , const char *appClassName, int *argc, char **argv,
void *options, int numOptions, Bool_t noLogo)
{
static int localArgc =0;
if (!gApplication) {
localArgc = argc ? *argc : qApp->argc();
TString guiBackend(gEnv->GetValue("Gui.Backend", "native"));
guiBackend.ToLower();
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 )){
char *extLib = 0;
#if QT_VERSION < 0x40000
extLib = gSystem->DynamicPathName("libQtGui",kTRUE);
#endif
if (!extLib) 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);
Int_t prompt= gEnv->GetValue("Gui.Prompt", (Int_t)0);
if (prompt) {
Getlinem(kInit, rint->GetPrompt());
} else {
TSeqCollection* col = gSystem->GetListOfFileHandlers();
TIter next(col);
TFileHandler* o=0;
while ( ( o=(TFileHandler*) next() ) ) {
if ( o->GetFd()== 0 ) {
o->Remove();
break;
}
}
gSystem->RemoveSignalHandler(rint->GetSignalHandler());
}
TQtTimer::Create()->start(0,TRUE);
}
return gApplication;
}
void TQtWidget::adjustSize()
{
QWidget::adjustSize ();
AdjustBufferSize();
update();
}
void TQtWidget::Erase ()
{
fPixmapID.fill(this,QPoint(0,0));
erase();
}
void TQtWidget::cd()
{
cd(0);
}
void TQtWidget::cd(int subpadnumber)
{
TCanvas *c = fCanvas;
if (c) {
c->cd(subpadnumber);
}
}
void TQtWidget::Disconnect()
{
fCanvas = 0;
}
void TQtWidget::Refresh()
{
TCanvas *c = Canvas();
if (!fPixmapID.paintingActive()) AdjustBufferSize();
if (c) {
c->Modified();
c->Resize();
c->Update();
}
update();
}
void TQtWidget::SetCanvas(TCanvas *c)
{
fCanvas = c;
setName(fCanvas->GetName());
}
void TQtWidget::resize (int w, int h)
{
QWidget::resize(w,h);
AdjustBufferSize();
}
void TQtWidget::resize (const QSize &size)
{
QWidget::resize(size);
AdjustBufferSize();
}
void
#if (QT_VERSION > 0x039999)
TQtWidget::customEvent(QEvent *e)
#else
TQtWidget::customEvent(QCustomEvent *e)
#endif
{
switch (e->type() - QEvent::User) {
case kEXITSIZEMOVE:
{
fPaint = TRUE;
#if (QT_VERSION <0x40000)
setUpdatesEnabled( TRUE );
#endif
exitSizeEvent();
break;
}
case kENTERSIZEMOVE:
{
fSizeChanged=FALSE;
fPaint = FALSE;
#if (QT_VERSION <0x40000)
setUpdatesEnabled( FALSE );
#endif
break;
}
case kFORCESIZE:
default:
{
fPaint = TRUE;
fSizeChanged = TRUE;
#if (QT_VERSION <0x40000)
setUpdatesEnabled( TRUE );
#endif
exitSizeEvent();
break;
}
};
}
void TQtWidget::contextMenuEvent(QContextMenuEvent *e)
{
TCanvas *c = Canvas();
if (e && c) {
#if (QT_VERSION >= 0x040000)
if (e->reason() != QContextMenuEvent::Mouse) {
c->HandleInput(kButton3Down, e->x(), e->y());
e->accept();
}
#endif
}
}
void TQtWidget::focusInEvent ( QFocusEvent *e )
{
if (!fWrapper && e->gotFocus()) {
setMouseTracking(TRUE);
}
}
void TQtWidget::focusOutEvent ( QFocusEvent *e )
{
if (!fWrapper && e->lostFocus()) {
setMouseTracking(FALSE);
}
}
void TQtWidget::mousePressEvent (QMouseEvent *e)
{
EEventType rootButton = kNoEvent;
TCanvas *c = Canvas();
if (c && !fWrapper ){
switch (e->button ())
{
case Qt::LeftButton: rootButton = kButton1Down; break;
case Qt::RightButton: rootButton = kButton3Down; break;
case Qt::MidButton: rootButton = kButton2Down; break;
default: break;
};
if (rootButton != kNoEvent) {
c->HandleInput(rootButton, e->x(), e->y());
e->accept();
EmitSignal(kMousePressEvent);
if (!( IsDoubleBuffered() || IsShadow()) ) {
if (GetShadow() && ! GetShadow()->isVisible() ) {
GetShadow()->show();
}
}
return;
}
} else {
e->ignore();
}
QWidget::mousePressEvent(e);
}
void TQtWidget::mouseMoveEvent (QMouseEvent * e)
{
EEventType rootButton = kMouseMotion;
TCanvas *c = Canvas();
if (c && !fWrapper){
if (e->state() & Qt::LeftButton) { rootButton = kButton1Motion; }
c->HandleInput(rootButton, e->x(), e->y());
e->accept();
EmitSignal(kMouseMoveEvent);
if ( IsDoubleBuffered() && IsShadow()) {
repaint(rect());
}
return;
} else {
e->ignore();
}
QWidget::mouseMoveEvent(e);
}
void TQtWidget::mouseReleaseEvent(QMouseEvent * e)
{
if ( IsDoubleBuffered() && IsShadow())
{
hide();
}
EEventType rootButton = kNoEvent;
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) {
c->HandleInput(rootButton, e->x(), e->y());
gPad->Modified();
e->accept(); EmitSignal(kMouseReleaseEvent);
return;
}
} else {
e->ignore();
}
QWidget::mouseReleaseEvent(e);
}
void TQtWidget::mouseDoubleClickEvent(QMouseEvent * e)
{
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) {
c->HandleInput(rootButton, e->x(), e->y());
e->accept(); EmitSignal(kMouseDoubleClickEvent);return;
}
} else {
e->ignore();
}
QWidget::mouseDoubleClickEvent(e);
}
void TQtWidget::keyPressEvent(QKeyEvent * e)
{
TCanvas *c = Canvas();
if (c && !fWrapper){
c->HandleInput(kKeyPress, e->ascii(), e->key());
EmitSignal(kKeyPressEvent);
} else {
e->ignore();
}
QWidget::keyPressEvent(e);
}
void TQtWidget::keyReleaseEvent(QKeyEvent * e)
{
QWidget::keyReleaseEvent(e);
}
void TQtWidget::enterEvent(QEvent *e)
{
TCanvas *c = Canvas();
if (c && !fWrapper){
c->HandleInput(kMouseEnter, 0, 0);
EmitSignal(kEnterEvent);
}
QWidget::enterEvent(e);
}
void TQtWidget::leaveEvent (QEvent *e)
{
TCanvas *c = Canvas();
if (c && !fWrapper){
c->HandleInput(kMouseLeave, 0, 0);
EmitSignal(kLeaveEvent);
}
QWidget::leaveEvent(e);
}
void TQtWidget::resizeEvent(QResizeEvent *e)
{
if (!e) return;
if (topLevelWidget()->isMinimized()) { fSizeChanged=FALSE; }
else if (topLevelWidget()->isMaximized ()){
fSizeChanged=TRUE;
exitSizeEvent();
fSizeChanged=TRUE;
} else {
#ifdef R__QTWIN32
if (!fPaint) {
fSizeChanged=TRUE;
fNeedStretch=true;
#if (QT_VERSION <0x40000)
stretchWidget(e);
#endif
} else {
#else
{
fSizeChanged=TRUE;
fPaint = kTRUE;
exitSizeEvent();
#endif
} }
}
void TQtWidget::SetSaveFormat(const char *format)
{
fSaveFormat = TGQt::QtFileFormat(format);
}
bool TQtWidget::Save(const char *fileName) const
{
return Save(QString(fileName));
}
bool TQtWidget::Save(const QString &fileName) const
{
QString fileNameExtension = QFileInfo(fileName).extension(FALSE).upper();
QString saveFormat;
if (fileNameExtension.isEmpty() ) {
saveFormat = fSaveFormat;
} else {
saveFormat = TGQt::QtFileFormat(fileNameExtension);
}
return Save(fileName,saveFormat);
}
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
{
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((const char *)fileName,(const char *)saveType);
Ok = true;
} else {
int dot = fileName.findRev('.');
int plus = 0;
if (dot) {
plus = fileName.find('+',dot+1);
}
QString fln = (plus) ? TGQt::GetNewFileName(fileName.left(plus)) : fileName;
Ok = GetBuffer().save(fln,saveType,quality);
}
emit ((TQtWidget *)this)->Saved(Ok);
return Ok;
}
void TQtWidget::SetDoubleBuffer(bool on)
{
if (fDoubleBufferOn != on ) {
fDoubleBufferOn = on;
#if QT_VERSION >= 0x040000
#ifdef SHAWDOWBUFEFR
fprintf(stderr, "TQtWidget::SetDoubleBuffer buffer=%d \n", fDoubleBufferOn );
if (!fDoubleBufferOn) {
if (!(fShadowWidget || IsShadow())) {
fShadowWidget = new TQtWidget(*this);
fprintf(stderr, "TQtWidget::SetDoubleBuffer created %d\n", fShadowWidget);
}
fShadowWidget->move(0,0);
fShadowWidget->resize(size()/2);
QBrush brush(QColor(0,0,128,128));
(fShadowWidget->GetBuffer()).fill(brush);
fprintf(stderr, "TQtWidget::SetDoubleBuffer visible %d \n", fShadowWidget->isVisible());
} else if (fShadowWidget) {
fprintf(stderr, "TQtWidget::SetDoubleBuffer invisible %d \n", fShadowWidget->isVisible());
fShadowWidget->hide();
}
#endif
#endif
}
}
void TQtWidget::stretchWidget(QResizeEvent * )
{
if (!paintingActive()) {
#if defined(R__QTWIN32) && (QT_VERSION < 0x40000)
QPainter painter( this );
if (!StretchBlt(
painter.handle(),
0,
0,
width(),
height(),
GetBuffer().handle(),
0,
0,
GetBuffer().width(),
GetBuffer().height(),
SRCCOPY
)) {
qSystemWarning("StretchBlt failed!" );
printf("last error %d\n",GetLastError());
}
#else
QPainter pnt(this);
pnt.drawPixmap(rect(),GetBuffer());
#endif
}
fNeedStretch = false;
}
void TQtWidget::exitSizeEvent ()
{
if (!fSizeChanged && !IsShadow() ) return;
Refresh();
}
bool TQtWidget::paintFlag(bool mode)
{
bool flag = fPaint;
fPaint = mode;
return flag;
}
void TQtWidget::showEvent ( QShowEvent *)
{
if ( fPixmapID.size() != size() )
{
fSizeChanged = kTRUE;
exitSizeEvent();
}
}
void TQtWidget::paintEvent (QPaintEvent *e)
{
if (fNeedStretch) {
stretchWidget((QResizeEvent *)0);
} else {
#ifdef R__QTWIN32
if ( fEmbedded && fPixmapID.size() != size() )
{
fSizeChanged = kTRUE;
exitSizeEvent();
update();
return;
}
#endif
QRect rect = e->rect();
if ( ( fPaint && !rect.isEmpty() ) || IsShadow() )
{
#if QT_VERSION < 0x40000
bitBlt(this, rect.x(),rect.y(),&GetBuffer(),rect.x(), rect.y(), rect.width(), rect.height());
#else
QPainter screen(this);
screen.drawPixmap(rect.x(),rect.y(),GetBuffer(),rect.x(), rect.y(), rect.width(), rect.height());
if ( IsShadow() ) {
QColor bc("yellow");
bc.setAlpha(128);
screen.fillRect(10,10,40,40,QBrush(bc));
fprintf(stderr,"Shadow painted visible %d\n", isVisible());
}
#endif
}
}
}
void TQtWidget::SetSizeHint (const QSize &size) {
fSizeHint = size;
}
QSize TQtWidget::sizeHint () const{
return QWidget::sizeHint();
}
QSize TQtWidget::minimumSizeHint () const{
return QWidget::minimumSizeHint ();
}
QSizePolicy TQtWidget::sizePolicy () const{
return QWidget::sizePolicy ();
}
void TQtWidget::EmitTestedSignal()
{
TCanvas *c = GetCanvas();
TObject *selected = GetSelected();
UInt_t event = GetEvent();
emit RootEventProcessed(selected, event, c);
}
void TQtWidget::SetBit(UInt_t f, Bool_t set)
{
if (set)
SetBit(f);
else
ResetBit(f);
}
Last change: Wed Jun 25 08:51:56 2008
Last generated: 2008-06-25 08:51
This page has been automatically generated. If you have any comments or suggestions about the page layout send a mail to ROOT support, or contact the developers with any questions or problems regarding ROOT.