00001 
00002 
00003 
00004 
00005 
00006 
00007 
00008 
00009 
00010 
00011 
00012 #include "TEveViewer.h"
00013 #include "TEveScene.h"
00014 #include "TEveSceneInfo.h"
00015 
00016 #include "TEveManager.h"
00017 #include "TEveSelection.h"
00018 
00019 #include "TGLFormat.h"
00020 #include "TGLSAViewer.h"
00021 #include "TGLEmbeddedViewer.h"
00022 #include "TGLScenePad.h"
00023 
00024 #include "TGLEventHandler.h"
00025 
00026 #include "TApplication.h"
00027 #include "TEnv.h"
00028 #include "TSystem.h"
00029 
00030 
00031 
00032 
00033 
00034 
00035 
00036 
00037 
00038 
00039 
00040 
00041 
00042 
00043 
00044 
00045 
00046 ClassImp(TEveViewer);
00047 
00048 Bool_t TEveViewer::fgInitInternal        = kFALSE;
00049 Bool_t TEveViewer::fgRecreateGlOnDockOps = kFALSE;
00050 
00051 
00052 TEveViewer::TEveViewer(const char* n, const char* t) :
00053    TEveWindowFrame(0, n, t),
00054    fGLViewer      (0),
00055    fGLViewerFrame (0)
00056 {
00057    
00058    
00059    
00060    
00061    
00062 
00063    SetChildClass(TEveSceneInfo::Class());
00064    fGUIFrame->SetCleanup(kNoCleanup); 
00065 
00066    if (!fgInitInternal)
00067    {
00068       InitInternal();
00069    }
00070 }
00071 
00072 
00073 TEveViewer::~TEveViewer()
00074 {
00075    
00076 
00077    fGLViewer->SetEventHandler(0);
00078 
00079    fGLViewerFrame->UnmapWindow();
00080    GetGUICompositeFrame()->RemoveFrame(fGLViewerFrame);
00081    fGLViewerFrame->ReparentWindow(gClient->GetDefaultRoot());
00082    TTimer::SingleShot(150, "TGLViewer", fGLViewer, "Delete()");
00083 }
00084 
00085 
00086 
00087 
00088 void TEveViewer::InitInternal()
00089 {
00090    
00091 
00092    
00093    
00094    fgRecreateGlOnDockOps = (gVirtualX->SupportsExtension("Apple-WM") == 1);
00095 
00096    fgInitInternal = kTRUE;
00097 }
00098 
00099 
00100 void TEveViewer::PreUndock()
00101 {
00102    
00103    
00104 
00105    TEveWindowFrame::PreUndock();
00106    if (fgRecreateGlOnDockOps)
00107    {
00108       
00109       
00110       if (fGLViewer->GetGLWidget())
00111       {
00112          fGLViewer->DestroyGLWidget();
00113       }
00114    }
00115 }
00116 
00117 
00118 void TEveViewer::PostDock()
00119 {
00120    
00121    
00122 
00123    if (fgRecreateGlOnDockOps) {
00124       fGLViewer->CreateGLWidget();
00125    }
00126    TEveWindowFrame::PostDock();
00127 }
00128 
00129 
00130 
00131 
00132 const TGPicture* TEveViewer::GetListTreeIcon(Bool_t)
00133 {
00134    
00135 
00136    return TEveElement::fgListTreeIcons[1];
00137 }
00138 
00139 
00140 void TEveViewer::SetGLViewer(TGLViewer* viewer, TGFrame* frame)
00141 {
00142    
00143    
00144 
00145    delete fGLViewer;
00146    fGLViewer      = viewer;
00147    fGLViewerFrame = frame;
00148 
00149    fGLViewer->SetSmartRefresh(kTRUE);
00150 }
00151 
00152 
00153 TGLSAViewer* TEveViewer::SpawnGLViewer(TGedEditor* ged, Bool_t stereo)
00154 {
00155    
00156 
00157    static const TEveException kEH("TEveViewer::SpawnGLViewer ");
00158 
00159    TGCompositeFrame* cf = GetGUICompositeFrame();
00160 
00161    TGLFormat *form = 0;
00162    if (stereo)
00163    {
00164       form = new TGLFormat;
00165       form->SetStereo(kTRUE);
00166    }
00167 
00168    cf->SetEditable(kTRUE);
00169    TGLSAViewer* v = 0;
00170    try
00171    {
00172       v = new TGLSAViewer(cf, 0, ged, form);
00173    }
00174    catch (std::exception&)
00175    {
00176       Error("SpawnGLViewer", "Insufficient support from the graphics hardware. Aborting.");
00177       gApplication->Terminate(1);
00178    }
00179    cf->SetEditable(kFALSE);
00180    v->ToggleEditObject();
00181    v->DisableCloseMenuEntries();
00182    if (gEnv->GetValue("Eve.Viewer.HideMenus", 1) == 1)
00183    {
00184       v->EnableMenuBarHiding();
00185    }
00186    SetGLViewer(v, v->GetFrame());
00187 
00188    if (stereo)
00189       v->SetStereo(kTRUE);
00190 
00191    if (fEveFrame == 0)
00192       PreUndock();
00193 
00194    return v;
00195 }
00196 
00197 
00198 TGLEmbeddedViewer* TEveViewer::SpawnGLEmbeddedViewer(TGedEditor* ged, Int_t border)
00199 {
00200    
00201 
00202    static const TEveException kEH("TEveViewer::SpawnGLEmbeddedViewer ");
00203 
00204    TGCompositeFrame* cf = GetGUICompositeFrame();
00205 
00206    TGLEmbeddedViewer* v = new TGLEmbeddedViewer(cf, 0, ged, border);
00207    SetGLViewer(v, v->GetFrame());
00208 
00209    cf->AddFrame(fGLViewerFrame, new TGLayoutHints(kLHintsNormal | kLHintsExpandX | kLHintsExpandY));
00210 
00211    fGLViewerFrame->MapWindow();
00212 
00213    if (fEveFrame == 0)
00214       PreUndock();
00215 
00216    return v;
00217 }
00218 
00219 
00220 void TEveViewer::Redraw(Bool_t resetCameras)
00221 {
00222    
00223 
00224    if (resetCameras) fGLViewer->PostSceneBuildSetup(kTRUE);
00225    fGLViewer->RequestDraw(TGLRnrCtx::kLODHigh);
00226 }
00227 
00228 
00229 void TEveViewer::SwitchStereo()
00230 {
00231    
00232    
00233    
00234 
00235    TGLSAViewer *v = dynamic_cast<TGLSAViewer*>(fGLViewer);
00236 
00237    if (!v) {
00238       Warning("SwitchStereo", "Only supported for TGLSAViewer.");
00239       return;
00240    }
00241 
00242    v->DestroyGLWidget();
00243    TGLFormat *f = v->GetFormat();
00244 switch_stereo:
00245    f->SetStereo(!f->IsStereo());
00246    v->SetStereo(f->IsStereo());
00247    try
00248    {
00249       v->CreateGLWidget();
00250    }
00251    catch (std::exception&)
00252    {
00253       Error("SwitchStereo", "Insufficient support from the graphics hardware. Reverting.");
00254       goto switch_stereo;
00255    }
00256 }
00257 
00258 
00259 
00260 
00261 void TEveViewer::AddScene(TEveScene* scene)
00262 {
00263    
00264 
00265    static const TEveException eh("TEveViewer::AddScene ");
00266 
00267    TGLSceneInfo* glsi = fGLViewer->AddScene(scene->GetGLScene());
00268    if (glsi != 0) {
00269       TEveSceneInfo* si = new TEveSceneInfo(this, scene, glsi);
00270       AddElement(si);
00271    } else {
00272       throw(eh + "scene already in the viewer.");
00273    }
00274 }
00275 
00276 
00277 void TEveViewer::RemoveElementLocal(TEveElement* el)
00278 {
00279    
00280    
00281    
00282 
00283    fGLViewer->RemoveScene(((TEveSceneInfo*)el)->GetGLScene());
00284 }
00285 
00286 
00287 void TEveViewer::RemoveElementsLocal()
00288 {
00289    
00290    
00291 
00292    fGLViewer->RemoveAllScenes();
00293 }
00294 
00295 
00296 TObject* TEveViewer::GetEditorObject(const TEveException& eh) const
00297 {
00298    
00299    
00300 
00301    if (!fGLViewer)
00302       throw(eh + "fGLViewer not set.");
00303    return fGLViewer;
00304 }
00305 
00306 
00307 Bool_t TEveViewer::HandleElementPaste(TEveElement* el)
00308 {
00309    
00310    
00311    
00312 
00313    static const TEveException eh("TEveViewer::HandleElementPaste ");
00314 
00315    TEveScene* scene = dynamic_cast<TEveScene*>(el);
00316    if (scene != 0) {
00317       AddScene(scene);
00318       return kTRUE;
00319    } else {
00320       Warning(eh.Data(), "class TEveViewer only accepts TEveScene paste argument.");
00321       return kFALSE;
00322    }
00323 }
00324 
00325 
00326 
00327 
00328 
00329 
00330 
00331 
00332 
00333 
00334 
00335 ClassImp(TEveViewerList);
00336 
00337 
00338 TEveViewerList::TEveViewerList(const char* n, const char* t) :
00339    TEveElementList(n, t),
00340    fShowTooltip   (kTRUE),
00341 
00342    fBrightness(0),
00343    fUseLightColorSet(kFALSE)
00344 {
00345    
00346 
00347    SetChildClass(TEveViewer::Class());
00348    Connect();
00349 }
00350 
00351 
00352 TEveViewerList::~TEveViewerList()
00353 {
00354    
00355 
00356    Disconnect();
00357 }
00358 
00359 
00360 
00361 
00362 void TEveViewerList::AddElement(TEveElement* el)
00363 {
00364    
00365    
00366    
00367 
00368    TEveElementList::AddElement(el);
00369    el->IncParentIgnoreCnt();
00370 }
00371 
00372 
00373 void TEveViewerList::RemoveElementLocal(TEveElement* el)
00374 {
00375    
00376 
00377    el->DecParentIgnoreCnt();
00378    TEveElementList::RemoveElementLocal(el);
00379 }
00380 
00381 
00382 void TEveViewerList::RemoveElementsLocal()
00383 {
00384    
00385 
00386    for (List_i i=fChildren.begin(); i!=fChildren.end(); ++i)
00387    {
00388       (*i)->DecParentIgnoreCnt();
00389    }
00390 
00391    TEveElementList::RemoveElementsLocal();
00392 }
00393 
00394 
00395 
00396 
00397 void TEveViewerList::Connect()
00398 {
00399    
00400 
00401    TQObject::Connect("TGLViewer", "MouseOver(TObject*,UInt_t)",
00402                      "TEveViewerList", this, "OnMouseOver(TObject*,UInt_t)");
00403 
00404    TQObject::Connect("TGLViewer", "ReMouseOver(TObject*,UInt_t)",
00405                      "TEveViewerList", this, "OnReMouseOver(TObject*,UInt_t)");
00406 
00407    TQObject::Connect("TGLViewer", "UnMouseOver(TObject*,UInt_t)",
00408                      "TEveViewerList", this, "OnUnMouseOver(TObject*,UInt_t)");
00409 
00410    TQObject::Connect("TGLViewer", "Clicked(TObject*,UInt_t,UInt_t)",
00411                      "TEveViewerList", this, "OnClicked(TObject*,UInt_t,UInt_t)");
00412 
00413    TQObject::Connect("TGLViewer", "ReClicked(TObject*,UInt_t,UInt_t)",
00414                      "TEveViewerList", this, "OnReClicked(TObject*,UInt_t,UInt_t)");
00415 
00416    TQObject::Connect("TGLViewer", "UnClicked(TObject*,UInt_t,UInt_t)",
00417                      "TEveViewerList", this, "OnUnClicked(TObject*,UInt_t,UInt_t)");
00418 }
00419 
00420 
00421 void TEveViewerList::Disconnect()
00422 {
00423    
00424 
00425    TQObject::Disconnect("TGLViewer", "MouseOver(TObject*,UInt_t)",
00426                         this, "OnMouseOver(TObject*,UInt_t)");
00427 
00428    TQObject::Disconnect("TGLViewer", "ReMouseOver(TObject*,UInt_t)",
00429                         this, "OnReMouseOver(TObject*,UInt_t)");
00430 
00431    TQObject::Disconnect("TGLViewer", "UnMouseOver(TObject*,UInt_t)",
00432                         this, "OnUnMouseOver(TObject*,UInt_t)");
00433 
00434    TQObject::Disconnect("TGLViewer", "Clicked(TObject*,UInt_t,UInt_t)",
00435                         this, "OnClicked(TObject*,UInt_t,UInt_t)");
00436 
00437    TQObject::Disconnect("TGLViewer", "ReClicked(TObject*,UInt_t,UInt_t)",
00438                         this, "OnReClicked(TObject*,UInt_t,UInt_t)");
00439 
00440    TQObject::Disconnect("TGLViewer", "UnClicked(TObject*,UInt_t,UInt_t)",
00441                         this, "OnUnClicked(TObject*,UInt_t,UInt_t)");
00442 }
00443 
00444 
00445 
00446 
00447 void TEveViewerList::RepaintChangedViewers(Bool_t resetCameras, Bool_t dropLogicals)
00448 {
00449    
00450 
00451    for (List_i i=fChildren.begin(); i!=fChildren.end(); ++i)
00452    {
00453       TGLViewer* glv = ((TEveViewer*)*i)->GetGLViewer();
00454       if (glv->IsChanged())
00455       {
00456          
00457 
00458          if (resetCameras) glv->PostSceneBuildSetup(kTRUE);
00459          if (dropLogicals) glv->SetSmartRefresh(kFALSE);
00460 
00461          glv->RequestDraw(TGLRnrCtx::kLODHigh);
00462 
00463          if (dropLogicals) glv->SetSmartRefresh(kTRUE);
00464       }
00465    }
00466 }
00467 
00468 
00469 void TEveViewerList::RepaintAllViewers(Bool_t resetCameras, Bool_t dropLogicals)
00470 {
00471    
00472 
00473    for (List_i i=fChildren.begin(); i!=fChildren.end(); ++i)
00474    {
00475       TGLViewer* glv = ((TEveViewer*)*i)->GetGLViewer();
00476 
00477       
00478 
00479       if (resetCameras) glv->PostSceneBuildSetup(kTRUE);
00480       if (dropLogicals) glv->SetSmartRefresh(kFALSE);
00481 
00482       glv->RequestDraw(TGLRnrCtx::kLODHigh);
00483 
00484       if (dropLogicals) glv->SetSmartRefresh(kTRUE);
00485    }
00486 }
00487 
00488 
00489 void TEveViewerList::DeleteAnnotations()
00490 {
00491    
00492 
00493    for (List_i i=fChildren.begin(); i!=fChildren.end(); ++i)
00494    {
00495       TGLViewer* glv = ((TEveViewer*)*i)->GetGLViewer();
00496       glv->DeleteOverlayAnnotations();
00497    }
00498 }
00499 
00500 
00501 
00502 
00503 void TEveViewerList::SceneDestructing(TEveScene* scene)
00504 {
00505    
00506    
00507 
00508    for (List_i i=fChildren.begin(); i!=fChildren.end(); ++i)
00509    {
00510       TEveViewer* viewer = (TEveViewer*) *i;
00511       List_i j = viewer->BeginChildren();
00512       while (j != viewer->EndChildren())
00513       {
00514          TEveSceneInfo* sinfo = (TEveSceneInfo*) *j;
00515          ++j;
00516          if (sinfo->GetScene() == scene)
00517             viewer->RemoveElement(sinfo);
00518       }
00519    }
00520 }
00521 
00522 
00523 
00524 
00525 
00526 
00527 
00528 void TEveViewerList::HandleTooltip()
00529 {
00530    
00531    
00532 
00533    if (fShowTooltip)
00534    {
00535       TGLViewer       *glw = dynamic_cast<TGLViewer*>((TQObject*) gTQSender);
00536       TGLEventHandler *glh = (TGLEventHandler*) glw->GetEventHandler();
00537       if (gEve->GetHighlight()->NumChildren() == 1)
00538       {
00539          TString title(gEve->GetHighlight()->FirstChild()->GetHighlightTooltip());
00540          if ( ! title.IsNull())
00541             glh->TriggerTooltip(title);
00542       }
00543       else
00544       {
00545          glh->RemoveTooltip();
00546       }
00547    }
00548 }
00549 
00550 
00551 void TEveViewerList::OnMouseOver(TObject *obj, UInt_t )
00552 {
00553    
00554    
00555    
00556    
00557    
00558    
00559    
00560    
00561    
00562    
00563 
00564    TEveElement *el = dynamic_cast<TEveElement*>(obj);
00565    if (el && !el->IsPickable())
00566       el = 0;
00567 
00568    void *qsender = gTQSender;
00569    gEve->GetHighlight()->UserPickedElement(el, kFALSE);
00570    gTQSender = qsender;
00571 
00572    HandleTooltip();
00573 }
00574 
00575 
00576 void TEveViewerList::OnReMouseOver(TObject *obj, UInt_t )
00577 {
00578    
00579    
00580    
00581    
00582    
00583    
00584    
00585 
00586    TEveElement* el = dynamic_cast<TEveElement*>(obj);
00587    if (el && !el->IsPickable())
00588       el = 0;
00589 
00590    void *qsender = gTQSender;
00591    gEve->GetHighlight()->UserRePickedElement(el);
00592    gTQSender = qsender;
00593 
00594    HandleTooltip();
00595 }
00596 
00597 
00598 void TEveViewerList::OnUnMouseOver(TObject *obj, UInt_t )
00599 {
00600    
00601    
00602    
00603    
00604    
00605    
00606    
00607 
00608    TEveElement* el = dynamic_cast<TEveElement*>(obj);
00609    if (el && !el->IsPickable())
00610       el = 0;
00611 
00612    void *qsender = gTQSender;
00613    gEve->GetHighlight()->UserUnPickedElement(el);
00614    gTQSender = qsender;
00615 
00616    HandleTooltip();
00617 }
00618 
00619 
00620 void TEveViewerList::OnClicked(TObject *obj, UInt_t , UInt_t state)
00621 {
00622    
00623    
00624    
00625    
00626    
00627    
00628    
00629 
00630    TEveElement* el = dynamic_cast<TEveElement*>(obj);
00631    if (el && !el->IsPickable())
00632       el = 0;
00633    gEve->GetSelection()->UserPickedElement(el, state & kKeyControlMask);
00634 }
00635 
00636 
00637 void TEveViewerList::OnReClicked(TObject *obj, UInt_t , UInt_t )
00638 {
00639    
00640    
00641    
00642    
00643    
00644    
00645    
00646 
00647    TEveElement* el = dynamic_cast<TEveElement*>(obj);
00648    if (el && !el->IsPickable())
00649       el = 0;
00650    gEve->GetSelection()->UserRePickedElement(el);
00651 }
00652 
00653 
00654 void TEveViewerList::OnUnClicked(TObject *obj, UInt_t , UInt_t )
00655 {
00656    
00657    
00658    
00659    
00660    
00661    
00662    
00663 
00664    TEveElement* el = dynamic_cast<TEveElement*>(obj);
00665    if (el && !el->IsPickable())
00666       el = 0;
00667    gEve->GetSelection()->UserUnPickedElement(el);
00668 }
00669 
00670 
00671 void TEveViewerList::SetColorBrightness(Float_t b)
00672 {
00673    
00674 
00675    TEveUtil::SetColorBrightness(b, 1);
00676 }
00677 
00678 
00679 void TEveViewerList::SwitchColorSet()
00680 {
00681    
00682 
00683    fUseLightColorSet = ! fUseLightColorSet;
00684    for (List_i i=fChildren.begin(); i!=fChildren.end(); ++i)
00685    {  
00686       TGLViewer* glv = ((TEveViewer*)*i)->GetGLViewer();
00687       if ( fUseLightColorSet)
00688          glv->UseLightColorSet();
00689       else 
00690          glv->UseDarkColorSet();
00691 
00692       glv->RequestDraw(TGLRnrCtx::kLODHigh);
00693    }
00694 }