#include "TGLEventHandler.h"
#include "TGEventHandler.h"
#include "TGLViewer.h"
#include "TGLWidget.h"
#include "TGWindow.h"
#include "TPoint.h"
#include "TVirtualPad.h"
#include "TVirtualX.h"
#include "TGClient.h"
#include "TVirtualGL.h"
#include "TGLOverlay.h"
#include "TGLLogicalShape.h"
#include "TGLPhysicalShape.h"
#include "TContextMenu.h"
#include "TGToolTip.h"
#include "KeySymbols.h"
#include "TGLAnnotation.h"
ClassImp(TGLEventHandler);
TGLEventHandler::TGLEventHandler(const char *name, TGWindow *w, TObject *obj,
const char *title) :
TGEventHandler(name, w, obj, title),
fGLViewer ((TGLViewer *)obj),
fMouseTimer (0),
fLastPos (-1, -1),
fLastMouseOverPos (-1, -1),
fLastMouseOverShape (0),
fTooltip (0),
fActiveButtonID (0),
fLastEventState (0),
fInPointerGrab (kFALSE),
fMouseTimerRunning (kFALSE),
fTooltipShown (kFALSE),
fTooltipPixelTolerance (3)
{
fMouseTimer = new TTimer(this, 80);
fTooltip = new TGToolTip(0, 0, "", 650);
fTooltip->Hide();
}
TGLEventHandler::~TGLEventHandler()
{
delete fMouseTimer;
delete fTooltip;
}
void TGLEventHandler::ExecuteEvent(Int_t event, Int_t px, Int_t py)
{
Event_t eventSt;
eventSt.fX = px;
eventSt.fY = py;
eventSt.fState = 0;
if (event != kKeyPress) {
eventSt.fY -= Int_t((1 - gPad->GetHNDC() - gPad->GetYlowNDC()) * gPad->GetWh());
eventSt.fX -= Int_t(gPad->GetXlowNDC() * gPad->GetWw());
}
switch (event) {
case kMouseMotion:
eventSt.fCode = kMouseMotion;
eventSt.fType = kMotionNotify;
HandleMotion(&eventSt);
break;
case kButton1Down:
case kButton1Up:
{
eventSt.fCode = kButton1;
eventSt.fType = event == kButton1Down ? kButtonPress:kButtonRelease;
HandleButton(&eventSt);
}
break;
case kButton2Down:
case kButton2Up:
{
eventSt.fCode = kButton2;
eventSt.fType = event == kButton2Down ? kButtonPress:kButtonRelease;
HandleButton(&eventSt);
}
break;
case kButton3Down:
{
eventSt.fState = kKeyShiftMask;
eventSt.fCode = kButton1;
eventSt.fType = kButtonPress;
HandleButton(&eventSt);
}
break;
case kButton3Up:
{
eventSt.fCode = kButton3;
eventSt.fType = kButtonRelease;
HandleButton(&eventSt);
}
break;
case kButton1Double:
case kButton2Double:
case kButton3Double:
{
eventSt.fCode = kButton1Double ? kButton1 : kButton2Double ? kButton2 : kButton3;
eventSt.fType = kButtonDoubleClick;
HandleDoubleClick(&eventSt);
}
break;
case kButton1Motion:
case kButton2Motion:
case kButton3Motion:
{
eventSt.fCode = event == kButton1Motion ? kButton1 : event == kButton2Motion ? kButton2 : kButton3;
eventSt.fType = kMotionNotify;
HandleMotion(&eventSt);
}
break;
case kKeyPress:
{
eventSt.fType = kGKeyPress;
eventSt.fCode = py;
HandleKey(&eventSt);
}
break;
case 6:
if (fGLViewer->CurrentCamera().Zoom(+50, kFALSE, kFALSE)) {
if (fGLViewer->fGLDevice != -1) {
gGLManager->MarkForDirectCopy(fGLViewer->fGLDevice, kTRUE);
gVirtualX->SetDrawMode(TVirtualX::kCopy);
}
fGLViewer->RequestDraw();
}
break;
case 5:
if (fGLViewer->CurrentCamera().Zoom(-50, kFALSE, kFALSE)) {
if (fGLViewer->fGLDevice != -1) {
gGLManager->MarkForDirectCopy(fGLViewer->fGLDevice, kTRUE);
gVirtualX->SetDrawMode(TVirtualX::kCopy);
}
fGLViewer->RequestDraw();
}
break;
case 7:
eventSt.fState = kKeyShiftMask;
eventSt.fCode = kButton1;
eventSt.fType = kButtonPress;
HandleButton(&eventSt);
break;
default:
{
}
}
}
Bool_t TGLEventHandler::HandleEvent(Event_t *event)
{
if (event->fType == kFocusIn) {
if (fGLViewer->fDragAction != TGLViewer::kDragNone) {
Error("TGLEventHandler::HandleEvent", "active drag-action at focus-in.");
fGLViewer->fDragAction = TGLViewer::kDragNone;
}
StartMouseTimer();
}
if (event->fType == kFocusOut) {
if (fGLViewer->fDragAction != TGLViewer::kDragNone) {
Warning("TGLEventHandler::HandleEvent", "drag-action active at focus-out.");
fGLViewer->fDragAction = TGLViewer::kDragNone;
}
StopMouseTimer();
ClearMouseOver();
}
return kTRUE;
}
Bool_t TGLEventHandler::HandleFocusChange(Event_t *event)
{
fGLViewer->MouseIdle(0, 0, 0);
if (event->fType == kFocusIn) {
if (fGLViewer->fDragAction != TGLViewer::kDragNone) {
Error("TGLEventHandler::HandleFocusChange", "active drag-action at focus-in.");
fGLViewer->fDragAction = TGLViewer::kDragNone;
}
StartMouseTimer();
fGLViewer->Activated();
}
if (event->fType == kFocusOut) {
if (fGLViewer->fDragAction != TGLViewer::kDragNone) {
Warning("TGLEventHandler::HandleFocusChange", "drag-action active at focus-out.");
fGLViewer->fDragAction = TGLViewer::kDragNone;
}
StopMouseTimer();
ClearMouseOver();
}
return kTRUE;
}
Bool_t TGLEventHandler::HandleCrossing(Event_t *event)
{
if (event->fCode != 0) {
return kTRUE;
}
fGLViewer->MouseIdle(0, 0, 0);
if (event->fType == kEnterNotify) {
if (fGLViewer->fDragAction != TGLViewer::kDragNone) {
Error("TGLEventHandler::HandleCrossing", "active drag-action at enter-notify.");
fGLViewer->fDragAction = TGLViewer::kDragNone;
}
StartMouseTimer();
fGLViewer->Activated();
}
if (event->fType == kLeaveNotify) {
if (fGLViewer->fDragAction != TGLViewer::kDragNone) {
Warning("TGLEventHandler::HandleCrossing", "drag-action active at leave-notify.");
fGLViewer->fDragAction = TGLViewer::kDragNone;
}
StopMouseTimer();
ClearMouseOver();
}
return kTRUE;
}
Bool_t TGLEventHandler::HandleButton(Event_t * event)
{
static Event_t eventSt = {kOtherEvent, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, kFALSE, 0, 0, {0,0,0,0,0}};
if (fGLViewer->IsLocked()) {
if (gDebug>2) {
Info("TGLEventHandler::HandleButton", "ignored - viewer is %s",
fGLViewer->LockName(fGLViewer->CurrentLock()));
}
return kFALSE;
}
if (event->fType == kButtonPress && event->fCode <= kButton3)
{
fGLViewer->MouseIdle(0, 0, 0);
fGLViewer->Activated();
if (fGLViewer->fDragAction != TGLViewer::kDragNone)
return kFALSE;
eventSt.fX = event->fX;
eventSt.fY = event->fY;
eventSt.fCode = event->fCode;
if ( fGLViewer->GetPushAction() != TGLViewer::kPushStd )
{
fGLViewer->RequestSelect(event->fX, event->fY);
if (fGLViewer->fSelRec.GetN() > 0)
{
TGLVector3 v(event->fX, event->fY, 0.5*fGLViewer->fSelRec.GetMinZ());
fGLViewer->CurrentCamera().WindowToViewport(v);
v = fGLViewer->CurrentCamera().ViewportToWorld(v);
if (fGLViewer->GetPushAction() == TGLViewer::kPushCamCenter)
{
fGLViewer->CurrentCamera().SetExternalCenter(kTRUE);
fGLViewer->CurrentCamera().SetCenterVec(v.X(), v.Y(), v.Z());
}
else
{
TGLSelectRecord& rec = fGLViewer->GetSelRec();
TObject* obj = rec.GetObject();
TGLRect& vp = fGLViewer->CurrentCamera().RefViewport();
new TGLAnnotation(fGLViewer, obj->GetTitle(), eventSt.fX*1.f/vp.Width(), 1 - eventSt.fY*1.f/vp.Height(), v);
}
fGLViewer->RequestDraw();
}
return kTRUE;
}
Bool_t grabPointer = kFALSE;
Bool_t handled = kFALSE;
fActiveButtonID = event->fCode;
if (fGLViewer->fDragAction == TGLViewer::kDragNone && fGLViewer->fCurrentOvlElm)
{
if (fGLViewer->fCurrentOvlElm->Handle(*fGLViewer->fRnrCtx, fGLViewer->fOvlSelRec, event))
{
handled = kTRUE;
grabPointer = kTRUE;
fGLViewer->fDragAction = TGLViewer::kDragOverlay;
fGLViewer->RequestDraw();
}
}
if ( ! handled)
{
switch(event->fCode)
{
case kButton1:
{
if (event->fState & kKeyShiftMask) {
if (fGLViewer->RequestSelect(event->fX, event->fY)) {
fGLViewer->ApplySelection();
handled = kTRUE;
} else {
fGLViewer->SelectionChanged();
}
} else if (event->fState & kKeyMod1Mask) {
fGLViewer->RequestSelect(event->fX, event->fY, kTRUE);
if (fGLViewer->fSecSelRec.GetPhysShape() != 0)
{
TGLLogicalShape& lshape = const_cast<TGLLogicalShape&>
(*fGLViewer->fSecSelRec.GetPhysShape()->GetLogical());
lshape.ProcessSelection(*fGLViewer->fRnrCtx, fGLViewer->fSecSelRec);
handled = kTRUE;
}
}
if ( ! handled) {
fGLViewer->fDragAction = TGLViewer::kDragCameraRotate;
grabPointer = kTRUE;
if (fMouseTimer) {
fMouseTimer->TurnOff();
fMouseTimer->Reset();
}
}
break;
}
case kButton2:
{
fGLViewer->fDragAction = TGLViewer::kDragCameraTruck;
grabPointer = kTRUE;
break;
}
case kButton3:
{
if (event->fState & kKeyShiftMask)
{
fGLViewer->RequestSelect(event->fX, event->fY);
const TGLPhysicalShape * selected = fGLViewer->fSelRec.GetPhysShape();
if (selected) {
if (!fGLViewer->fContextMenu) {
fGLViewer->fContextMenu = new TContextMenu("glcm", "GL Viewer Context Menu");
}
Int_t x, y;
Window_t childdum;
gVirtualX->TranslateCoordinates(fGLViewer->fGLWidget->GetId(),
gClient->GetDefaultRoot()->GetId(),
event->fX, event->fY, x, y, childdum);
selected->InvokeContextMenu(*fGLViewer->fContextMenu, x, y);
}
} else {
fGLViewer->fDragAction = TGLViewer::kDragCameraDolly;
grabPointer = kTRUE;
}
break;
}
}
}
if (grabPointer)
{
gVirtualX->GrabPointer(fGLViewer->GetGLWidget()->GetId(),
kButtonPressMask | kButtonReleaseMask | kPointerMotionMask,
kNone, kNone, kTRUE, kFALSE);
fInPointerGrab = kTRUE;
}
}
else if (event->fType == kButtonRelease)
{
if (fInPointerGrab)
{
gVirtualX->GrabPointer(0, 0, 0, 0, kFALSE);
fInPointerGrab = kFALSE;
}
if (fGLViewer->GetPushAction() != TGLViewer::kPushStd)
{
fGLViewer->fPushAction = TGLViewer::kPushStd;
fGLViewer->RefreshPadEditor(fGLViewer);
return kTRUE;
}
else if (fGLViewer->fDragAction == TGLViewer::kDragOverlay && fGLViewer->fCurrentOvlElm)
{
fGLViewer->fCurrentOvlElm->Handle(*fGLViewer->fRnrCtx, fGLViewer->fOvlSelRec, event);
fGLViewer->OverlayDragFinished();
if (fGLViewer->RequestOverlaySelect(event->fX, event->fY))
fGLViewer->RequestDraw();
}
else if (fGLViewer->fDragAction >= TGLViewer::kDragCameraRotate &&
fGLViewer->fDragAction <= TGLViewer::kDragCameraDolly)
{
fGLViewer->RequestDraw(TGLRnrCtx::kLODHigh);
}
switch(event->fCode) {
case kButton5: {
if (fGLViewer->CurrentCamera().Zoom(50, kFALSE, kFALSE))
fGLViewer->fRedrawTimer->RequestDraw(10, TGLRnrCtx::kLODMed);
return kTRUE;
break;
}
case kButton4: {
if (fGLViewer->CurrentCamera().Zoom(-50, kFALSE, kFALSE))
fGLViewer->fRedrawTimer->RequestDraw(10, TGLRnrCtx::kLODMed);
return kTRUE;
break;
}
}
fGLViewer->fDragAction = TGLViewer::kDragNone;
if (fGLViewer->fGLDevice != -1)
{
gGLManager->MarkForDirectCopy(fGLViewer->fGLDevice, kFALSE);
}
if ((event->fX == eventSt.fX) &&
(event->fY == eventSt.fY) &&
(eventSt.fCode == event->fCode))
{
TObject *obj = 0;
fGLViewer->RequestSelect(fLastPos.fX, fLastPos.fY, kFALSE);
TGLPhysicalShape *phys_shape = fGLViewer->fSelRec.GetPhysShape();
if (phys_shape) {
obj = phys_shape->GetLogical()->GetExternal();
}
fGLViewer->Clicked(obj);
fGLViewer->Clicked(obj, event->fCode, event->fState);
eventSt.fX = 0;
eventSt.fY = 0;
eventSt.fCode = 0;
eventSt.fState = 0;
}
if (event->fCode == kButton1 && fMouseTimer)
{
fMouseTimer->TurnOn();
}
}
return kTRUE;
}
Bool_t TGLEventHandler::HandleDoubleClick(Event_t *event)
{
if (fGLViewer->IsLocked()) {
if (gDebug>3) {
Info("TGLEventHandler::HandleDoubleClick", "ignored - viewer is %s",
fGLViewer->LockName(fGLViewer->CurrentLock()));
}
return kFALSE;
}
fGLViewer->MouseIdle(0, 0, 0);
if (event->fCode != kButton4 && event->fCode != kButton5) {
if (fGLViewer->fResetCameraOnDoubleClick) {
fGLViewer->ResetCurrentCamera();
fGLViewer->RequestDraw();
}
fGLViewer->DoubleClicked();
}
return kTRUE;
}
Bool_t TGLEventHandler::HandleConfigureNotify(Event_t *event)
{
if (fGLViewer->IsLocked())
{
if (gDebug > 0) {
Info("TGLEventHandler::HandleConfigureNotify", "ignored - viewer is %s",
fGLViewer->LockName(fGLViewer->CurrentLock()));
}
return kFALSE;
}
if (event)
{
fGLViewer->SetViewport(event->fX, event->fY, event->fWidth, event->fHeight);
fGLViewer->fRedrawTimer->RequestDraw(10, TGLRnrCtx::kLODMed);
}
return kTRUE;
}
Bool_t TGLEventHandler::HandleExpose(Event_t * event)
{
if (event->fCount != 0) return kTRUE;
if (fGLViewer->IsLocked()) {
if (gDebug > 0) {
Info("TGLViewer::HandleExpose", "ignored - viewer is %s",
fGLViewer->LockName(fGLViewer->CurrentLock()));
}
return kFALSE;
}
fGLViewer->fRedrawTimer->RequestDraw(20, TGLRnrCtx::kLODHigh);
return kTRUE;
}
Bool_t TGLEventHandler::HandleKey(Event_t *event)
{
fLastEventState = event->fState;
fGLViewer->MouseIdle(0, 0, 0);
if (fGLViewer->IsLocked()) {
if (gDebug>3) {
Info("TGLEventHandler::HandleKey", "ignored - viewer is %s",
fGLViewer->LockName(fGLViewer->CurrentLock()));
}
return kFALSE;
}
char tmp[10] = {0};
UInt_t keysym = 0;
if (fGLViewer->fGLDevice == -1)
gVirtualX->LookupString(event, tmp, sizeof(tmp), keysym);
else
keysym = event->fCode;
fGLViewer->fRnrCtx->SetEventKeySym(keysym);
Bool_t redraw = kFALSE;
if (fGLViewer->fCurrentOvlElm &&
fGLViewer->fCurrentOvlElm->Handle(*fGLViewer->fRnrCtx, fGLViewer->fOvlSelRec, event))
{
redraw = kTRUE;
}
else
{
Bool_t mod1 = event->fState & kKeyControlMask;
Bool_t mod2 = event->fState & kKeyShiftMask;
switch (keysym)
{
case kKey_R:
case kKey_r:
fGLViewer->SetStyle(TGLRnrCtx::kFill);
redraw = kTRUE;
break;
case kKey_E:
case kKey_e:
fGLViewer->SwitchColorSet();
redraw = kTRUE;
break;
case kKey_W:
case kKey_w:
fGLViewer->SetStyle(TGLRnrCtx::kWireFrame);
redraw = kTRUE;
break;
case kKey_T:
case kKey_t:
fGLViewer->SetStyle(TGLRnrCtx::kOutline);
redraw = kTRUE;
break;
case kKey_F1:
fGLViewer->RequestSelect(fLastPos.fX, fLastPos.fY, kFALSE);
fGLViewer->MouseIdle(fGLViewer->fSelRec.GetPhysShape(), (UInt_t)fLastPos.fX, (UInt_t)fLastPos.fY);
break;
case kKey_Plus:
case kKey_J:
case kKey_j:
redraw = fGLViewer->CurrentCamera().Dolly(10, mod1, mod2);
break;
case kKey_Minus:
case kKey_K:
case kKey_k:
redraw = fGLViewer->CurrentCamera().Dolly(-10, mod1, mod2);
break;
case kKey_Up:
redraw = fGLViewer->CurrentCamera().Truck(0, 10, mod1, mod2);
break;
case kKey_Down:
redraw = fGLViewer->CurrentCamera().Truck(0, -10, mod1, mod2);
break;
case kKey_Left:
redraw = fGLViewer->CurrentCamera().Truck(-10, 0, mod1, mod2);
break;
case kKey_Right:
redraw = fGLViewer->CurrentCamera().Truck(10, 0, mod1, mod2);
break;
case kKey_Home:
fGLViewer->ResetCurrentCamera();
redraw = kTRUE;
break;
case kKey_D:
case kKey_d:
fGLViewer->fDebugMode = !fGLViewer->fDebugMode;
redraw = kTRUE;
Info("OpenGL viewer debug mode : ", fGLViewer->fDebugMode ? "ON" : "OFF");
break;
case kKey_Space:
if (fGLViewer->fDebugMode) {
Info("OpenGL viewer FORCED rebuild", "");
fGLViewer->UpdateScene();
}
default:;
}
}
if (redraw) {
if (fGLViewer->fGLDevice != -1)
gGLManager->MarkForDirectCopy(fGLViewer->fGLDevice, kTRUE);
fGLViewer->RequestDraw();
}
return kTRUE;
}
Bool_t TGLEventHandler::HandleMotion(Event_t * event)
{
fGLViewer->MouseIdle(0, 0, 0);
if (fGLViewer->IsLocked()) {
if (gDebug>3) {
Info("TGLEventHandler::HandleMotion", "ignored - viewer is %s",
fGLViewer->LockName(fGLViewer->CurrentLock()));
}
return kFALSE;
}
Bool_t processed = kFALSE, changed = kFALSE;
Short_t lod = TGLRnrCtx::kLODMed;
Int_t xDelta = event->fX - fLastPos.fX;
Int_t yDelta = event->fY - fLastPos.fY;
Bool_t mod1 = event->fState & kKeyControlMask;
Bool_t mod2 = event->fState & kKeyShiftMask;
if (fMouseTimerRunning) StopMouseTimer();
if (fTooltipShown &&
( TMath::Abs(event->fXRoot - fTooltipPos.fX) > fTooltipPixelTolerance ||
TMath::Abs(event->fYRoot - fTooltipPos.fY) > fTooltipPixelTolerance ))
{
RemoveTooltip();
}
if (fGLViewer->fDragAction == TGLViewer::kDragNone)
{
if (fGLViewer->fRedrawTimer->IsPending()) {
if (gDebug > 2)
Info("TGLEventHandler::HandleMotion", "Redraw pending, ignoring.");
return kTRUE;
}
changed = fGLViewer->RequestOverlaySelect(event->fX, event->fY);
if (fGLViewer->fCurrentOvlElm)
processed = fGLViewer->fCurrentOvlElm->Handle(*fGLViewer->fRnrCtx, fGLViewer->fOvlSelRec, event);
lod = TGLRnrCtx::kLODHigh;
if ( ! processed && ! fMouseTimerRunning)
StartMouseTimer();
}
else if (fGLViewer->fDragAction == TGLViewer::kDragCameraRotate)
{
processed = Rotate(xDelta, yDelta, mod1, mod2);
}
else if (fGLViewer->fDragAction == TGLViewer::kDragCameraTruck)
{
processed = fGLViewer->CurrentCamera().Truck(xDelta, -yDelta, mod1, mod2);
}
else if (fGLViewer->fDragAction == TGLViewer::kDragCameraDolly)
{
processed = fGLViewer->CurrentCamera().Dolly(xDelta, mod1, mod2);
}
else if (fGLViewer->fDragAction == TGLViewer::kDragOverlay)
{
processed = fGLViewer->fCurrentOvlElm->Handle(*fGLViewer->fRnrCtx, fGLViewer->fOvlSelRec, event);
}
fLastPos.fX = event->fX;
fLastPos.fY = event->fY;
fLastGlobalPos.fX = event->fXRoot;
fLastGlobalPos.fY = event->fYRoot;
if (processed || changed) {
if (fGLViewer->fGLDevice != -1) {
gGLManager->MarkForDirectCopy(fGLViewer->fGLDevice, kTRUE);
gVirtualX->SetDrawMode(TVirtualX::kCopy);
}
fGLViewer->RequestDraw(lod);
}
return processed;
}
Bool_t TGLEventHandler::Rotate(Int_t xDelta, Int_t yDelta, Bool_t mod1, Bool_t mod2)
{
return fGLViewer->CurrentCamera().Rotate(xDelta, -yDelta, mod1, mod2);
}
Bool_t TGLEventHandler::HandleTimer(TTimer *t)
{
if (t != fMouseTimer) return kFALSE;
fMouseTimerRunning = kFALSE;
if (fGLViewer->fRedrawTimer->IsPending()) {
if (gDebug > 2)
Info("TGLEventHandler::HandleTimer", "Redraw pending, ignoring.");
return kTRUE;
}
if (fGLViewer->fDragAction == TGLViewer::kDragNone)
{
if (fLastMouseOverPos != fLastPos)
{
fGLViewer->RequestSelect(fLastPos.fX, fLastPos.fY, kFALSE);
if (fLastMouseOverShape != fGLViewer->fSelRec.GetPhysShape())
{
fLastMouseOverShape = fGLViewer->fSelRec.GetPhysShape();
fGLViewer->MouseOver(fLastMouseOverShape);
fGLViewer->MouseOver(fLastMouseOverShape, fLastEventState);
}
fLastMouseOverPos = fLastPos;
}
}
return kTRUE;
}
void TGLEventHandler::StartMouseTimer()
{
fMouseTimer->Start(-1, kTRUE);
fMouseTimerRunning = kTRUE;
}
void TGLEventHandler::StopMouseTimer()
{
fMouseTimerRunning = kFALSE;
fMouseTimer->Stop();
}
void TGLEventHandler::ClearMouseOver()
{
fLastMouseOverPos.fX = fLastMouseOverPos.fY = -1;
fLastMouseOverShape = 0;
fGLViewer->MouseOver(fLastMouseOverShape);
fGLViewer->MouseOver(fLastMouseOverShape, fLastEventState);
fGLViewer->ClearCurrentOvlElm();
}
void TGLEventHandler::Repaint()
{
if (fGLViewer->IsLocked()) {
if (gDebug > 0) {
Info("TGLViewer::HandleExpose", "ignored - viewer is %s",
fGLViewer->LockName(fGLViewer->CurrentLock()));
}
return;
}
fGLViewer->fRedrawTimer->RequestDraw(20, TGLRnrCtx::kLODHigh);
}
void TGLEventHandler::TriggerTooltip(const char* text)
{
static UInt_t screenW = 0, screenH = 0;
fTooltipPos = fLastGlobalPos;
fTooltipShown = kTRUE;
fTooltip->SetText(text);
Int_t x = fTooltipPos.fX + 16, y = fTooltipPos.fY + 16;
if (screenW == 0 || screenH == 0) {
screenW = gClient->GetDisplayWidth();
screenH = gClient->GetDisplayHeight();
}
if (x + 5 + fTooltip->GetWidth() > screenW) {
x = screenW - fTooltip->GetWidth() - 5;
if (y + 5 + fTooltip->GetHeight() > screenH) {
y -= (25 + fTooltip->GetHeight());
}
}
if (y + 5 + fTooltip->GetHeight() > screenH) {
y = screenH - fTooltip->GetHeight() - 10;
}
fTooltip->SetPosition(x, y);
fTooltip->Reset();
}
void TGLEventHandler::RemoveTooltip()
{
fTooltip->Hide();
fTooltipShown = kFALSE;
}
void TGLEventHandler::SetMouseOverSelectDelay(Int_t ms)
{
fMouseTimer->SetTime(ms);
}
void TGLEventHandler::SetMouseOverTooltipDelay(Int_t ms)
{
fTooltip->SetDelay(ms);
}