TGStatusBar.cxx

Go to the documentation of this file.
00001 // @(#)root/gui:$Id: TGStatusBar.cxx 35582 2010-09-22 13:38:27Z bellenot $
00002 // Author: Fons Rademakers   23/01/98
00003 
00004 /*************************************************************************
00005  * Copyright (C) 1995-2000, Rene Brun and Fons Rademakers.               *
00006  * All rights reserved.                                                  *
00007  *                                                                       *
00008  * For the licensing terms see $ROOTSYS/LICENSE.                         *
00009  * For the list of contributors see $ROOTSYS/README/CREDITS.             *
00010  *************************************************************************/
00011 /**************************************************************************
00012 
00013     This source is based on Xclass95, a Win95-looking GUI toolkit.
00014     Copyright (C) 1996, 1997 David Barth, Ricky Ralston, Hector Peraza.
00015 
00016     Xclass95 is free software; you can redistribute it and/or
00017     modify it under the terms of the GNU Library General Public
00018     License as published by the Free Software Foundation; either
00019     version 2 of the License, or (at your option) any later version.
00020 
00021 **************************************************************************/
00022 
00023 //////////////////////////////////////////////////////////////////////////
00024 //                                                                      //
00025 // TGStatusBar                                                          //
00026 //                                                                      //
00027 // Provides a StatusBar widget.                                         //
00028 //                                                                      //
00029 //////////////////////////////////////////////////////////////////////////
00030 
00031 #include "TGStatusBar.h"
00032 #include "TGResourcePool.h"
00033 #include "TList.h"
00034 #include "Riostream.h"
00035 
00036 
00037 const TGFont  *TGStatusBar::fgDefaultFont = 0;
00038 TGGC          *TGStatusBar::fgDefaultGC = 0;
00039 
00040 
00041 class TGStatusBarPart : public TGHorizontalFrame {
00042 friend class TGStatusBar;
00043 private:
00044    TGString  *fStatusInfo;    // status text to be displayed in this part
00045    Int_t      fYt;            // y position of text in frame
00046    virtual void DoRedraw();
00047 
00048 public:
00049    TGStatusBarPart(const TGWindow *p, Int_t h, Int_t y, ULong_t back = GetDefaultFrameBackground());
00050    ~TGStatusBarPart() { delete fStatusInfo; DestroyWindow(); }
00051    void SetText(TGString *text);
00052    const TGString *GetText() const { return fStatusInfo; }
00053 };
00054 
00055 //______________________________________________________________________________
00056 TGStatusBarPart::TGStatusBarPart(const TGWindow *p, Int_t h, Int_t y, ULong_t back)
00057    : TGHorizontalFrame(p, 5, 5, kChildFrame | kHorizontalFrame, back)
00058 {
00059    // Create statusbar part frame. This frame will contain the text for this
00060    // statusbar part.
00061 
00062    fStatusInfo = 0;
00063    fYt = y + 1;
00064    fHeight = h;
00065    MapWindow();
00066 
00067    fEditDisabled = kEditDisableGrab;
00068 }
00069 
00070 //______________________________________________________________________________
00071 void TGStatusBarPart::SetText(TGString *text)
00072 {
00073    // Set text in this part of the statusbar.
00074 
00075    if (fStatusInfo) delete fStatusInfo;
00076    fStatusInfo = text;
00077    fClient->NeedRedraw(this);
00078 }
00079 
00080 //______________________________________________________________________________
00081 void TGStatusBarPart::DoRedraw()
00082 {
00083    // Draw string in statusbar part frame.
00084 
00085    TGHorizontalFrame::DoRedraw();
00086 
00087    if (fStatusInfo)
00088       fStatusInfo->Draw(fId, TGStatusBar::GetDefaultGC()(), 3, fYt);
00089 }
00090 
00091 
00092 ClassImp(TGStatusBar)
00093 
00094 //______________________________________________________________________________
00095 TGStatusBar::TGStatusBar(const TGWindow *p, UInt_t w, UInt_t h,
00096                          UInt_t options, ULong_t back) :
00097    TGHorizontalFrame(p, w, h, options, back)
00098 {
00099    // Create a status bar widget. By default it consist of one part.
00100    // Multiple parts can be created using SetParts().
00101 
00102    fBorderWidth   = 2;
00103    fStatusPart    = new TGStatusBarPart* [1];
00104    fParts         = new Int_t [1];
00105    fXt            = new Int_t [1];
00106    fParts[0]      = 100;
00107    fNpart         = 1;
00108    f3DCorner      = kTRUE;
00109 
00110    int max_ascent, max_descent;
00111    gVirtualX->GetFontProperties(GetDefaultFontStruct(), max_ascent, max_descent);
00112    int ht = max_ascent + max_descent;
00113 
00114    fYt = max_ascent;
00115 
00116    fStatusPart[0] = new TGStatusBarPart(this, ht, fYt);
00117    AddFrame(fStatusPart[0]);
00118    Resize(w, ht + 5);
00119 
00120    //fEditDisabled = kEditDisableLayout;
00121 }
00122 
00123 //______________________________________________________________________________
00124 TGStatusBar::~TGStatusBar()
00125 {
00126    // Delete status bar widget.
00127 
00128    if (!MustCleanup()) {
00129       for (int i = 0; i < fNpart; i++) {
00130          delete fStatusPart[i];
00131       }
00132    }
00133 
00134    delete [] fStatusPart;
00135    delete [] fParts;
00136    delete [] fXt;
00137 }
00138 
00139 //______________________________________________________________________________
00140 void TGStatusBar::SetText(TGString *text, Int_t partidx)
00141 {
00142    // Set text in partition partidx in status bar. The TGString is
00143    // adopted by the status bar.
00144 
00145    if (partidx < 0 || partidx >= fNpart) {
00146       Error("SetText", "partidx out of range (0,%d)", fNpart-1);
00147       return;
00148    }
00149 
00150    fStatusPart[partidx]->SetText(text);
00151 }
00152 
00153 //______________________________________________________________________________
00154 void TGStatusBar::SetText(const char *text, Int_t partidx)
00155 {
00156    // Set text in partion partidx in status bar.
00157 
00158    SetText(new TGString(text), partidx);
00159 }
00160 
00161 //______________________________________________________________________________
00162 const char *TGStatusBar::GetText(Int_t partidx) const
00163 {
00164    // return text in the part partidx
00165 
00166    if (partidx < 0 || partidx >= fNpart) {
00167       Error("GetText", "partidx out of range (0,%d)", fNpart-1);
00168       return 0;
00169    }
00170 
00171    const TGString *str = fStatusPart[partidx]->GetText();
00172    return str->Data();
00173 }
00174 
00175 //______________________________________________________________________________
00176 void TGStatusBar::DrawBorder()
00177 {
00178    // Draw the status bar border (including cute 3d corner).
00179 
00180    // Current width is known at this stage so calculate fXt's.
00181    int i;
00182    for (i = 0; i < fNpart; i++) {
00183       if (i == 0)
00184          fXt[i] = 0;
00185       else
00186          fXt[i] = fXt[i-1] + (fWidth * fParts[i-1] / 100);
00187    }
00188 
00189    //TGFrame::DrawBorder();
00190    for (i = 0; i < fNpart; i++) {
00191       int xmax, xmin = fXt[i];
00192       if (i == fNpart-1)
00193          xmax = fWidth;
00194       else
00195          xmax = fXt[i+1] - 2;
00196 
00197       if (i == fNpart-1) {
00198          if (f3DCorner)
00199             fStatusPart[i]->MoveResize(fXt[i]+2, 1, xmax - fXt[i] - 15, fHeight - 2);
00200          else
00201             fStatusPart[i]->MoveResize(fXt[i]+2, 1, xmax - fXt[i], fHeight - 2);
00202       } else
00203          fStatusPart[i]->MoveResize(fXt[i]+2, 1, xmax - fXt[i] - 4, fHeight - 2);
00204 
00205       gVirtualX->DrawLine(fId, GetShadowGC()(), xmin, 0, xmax-2, 0);
00206       gVirtualX->DrawLine(fId, GetShadowGC()(), xmin, 0, xmin, fHeight-2);
00207       gVirtualX->DrawLine(fId, GetHilightGC()(), xmin, fHeight-1, xmax-1, fHeight-1);
00208       if (i == fNpart-1)
00209          gVirtualX->DrawLine(fId, GetHilightGC()(), xmax-1, fHeight-1, xmax-1, 0);
00210       else
00211          gVirtualX->DrawLine(fId, GetHilightGC()(), xmax-1, fHeight-1, xmax-1, 1);
00212    }
00213 
00214    // 3d corner...
00215    if (f3DCorner) {
00216       gVirtualX->DrawLine(fId, GetShadowGC()(),  fWidth-3,  fHeight-2, fWidth-2, fHeight-3);
00217       gVirtualX->DrawLine(fId, GetShadowGC()(),  fWidth-4,  fHeight-2, fWidth-2, fHeight-4);
00218       gVirtualX->DrawLine(fId, GetHilightGC()(), fWidth-5,  fHeight-2, fWidth-2, fHeight-5);
00219 
00220       gVirtualX->DrawLine(fId, GetShadowGC()(),  fWidth-7,  fHeight-2, fWidth-2, fHeight-7);
00221       gVirtualX->DrawLine(fId, GetShadowGC()(),  fWidth-8,  fHeight-2, fWidth-2, fHeight-8);
00222       gVirtualX->DrawLine(fId, GetHilightGC()(), fWidth-9,  fHeight-2, fWidth-2, fHeight-9);
00223 
00224       gVirtualX->DrawLine(fId, GetShadowGC()(),  fWidth-11, fHeight-2, fWidth-2, fHeight-11);
00225       gVirtualX->DrawLine(fId, GetShadowGC()(),  fWidth-12, fHeight-2, fWidth-2, fHeight-12);
00226       gVirtualX->DrawLine(fId, GetHilightGC()(), fWidth-13, fHeight-2, fWidth-2, fHeight-13);
00227 
00228       gVirtualX->DrawLine(fId, GetBckgndGC()(),  fWidth-13, fHeight-1, fWidth-1, fHeight-1);
00229       gVirtualX->DrawLine(fId, GetBckgndGC()(),  fWidth-1,  fHeight-1, fWidth-1, fHeight-13);
00230    }
00231 }
00232 
00233 //______________________________________________________________________________
00234 void TGStatusBar::DoRedraw()
00235 {
00236    // Redraw status bar.
00237 
00238    // calls DrawBorder()
00239    TGFrame::DoRedraw();
00240 
00241    for (int i = 0; i < fNpart; i++)
00242       fStatusPart[i]->DoRedraw();
00243 }
00244 
00245 //______________________________________________________________________________
00246 void TGStatusBar::SetParts(Int_t *parts, Int_t npart)
00247 {
00248    // Divide the status bar in nparts. Size of each part is given in parts
00249    // array (percentual).
00250 
00251    if (npart < 1) {
00252       Warning("SetParts", "must be at least one part");
00253       npart = 1;
00254    }
00255    if (npart > 15) {
00256       Error("SetParts", "to many parts (limit is 15)");
00257       return;
00258    }
00259 
00260    int i;
00261    for (i = 0; i < fNpart; i++)
00262       delete fStatusPart[i];
00263 
00264    delete [] fStatusPart;
00265    delete [] fParts;
00266    delete [] fXt;
00267    fList->Delete();
00268 
00269    fStatusPart = new TGStatusBarPart* [npart];
00270    fParts      = new Int_t [npart];
00271    fXt         = new Int_t [npart];
00272 
00273    int tot = 0;
00274    for (i = 0; i < npart; i++) {
00275       fStatusPart[i] = new TGStatusBarPart(this, fHeight, fYt);
00276       AddFrame(fStatusPart[i]);
00277       fParts[i] = parts[i];
00278       tot += parts[i];
00279       if (tot > 100)
00280          Error("SetParts", "sum of part > 100");
00281    }
00282    if (tot < 100)
00283       fParts[npart-1] += 100 - tot;
00284    fNpart = npart;
00285 }
00286 
00287 //______________________________________________________________________________
00288 void TGStatusBar::SetParts(Int_t npart)
00289 {
00290    // Divide the status bar in npart equal sized parts.
00291 
00292    if (npart < 1) {
00293       Warning("SetParts", "must be at least one part");
00294       npart = 1;
00295    }
00296    if (npart > 40) {
00297       Error("SetParts", "to many parts (limit is 40)");
00298       return;
00299    }
00300 
00301    int i;
00302    for (i = 0; i < fNpart; i++)
00303       delete fStatusPart[i];
00304 
00305    delete [] fStatusPart;
00306    delete [] fParts;
00307    delete [] fXt;
00308    fList->Delete();
00309 
00310    fStatusPart = new TGStatusBarPart* [npart];
00311    fParts      = new Int_t [npart];
00312    fXt         = new Int_t [npart];
00313 
00314    int sz  = 100/npart;
00315    int tot = 0;
00316    for (i = 0; i < npart; i++) {
00317       fStatusPart[i] = new TGStatusBarPart(this, fHeight, fYt);
00318       AddFrame(fStatusPart[i]);
00319       fParts[i] = sz;
00320       tot += sz;
00321    }
00322    if (tot < 100)
00323       fParts[npart-1] += 100 - tot;
00324    fNpart = npart;
00325 }
00326 
00327 //______________________________________________________________________________
00328 FontStruct_t TGStatusBar::GetDefaultFontStruct()
00329 {
00330    // Return default font structure in use.
00331 
00332    if (!fgDefaultFont)
00333       fgDefaultFont = gClient->GetResourcePool()->GetStatusFont();
00334    return fgDefaultFont->GetFontStruct();
00335 }
00336 
00337 //______________________________________________________________________________
00338 const TGGC &TGStatusBar::GetDefaultGC()
00339 {
00340    // Return default graphics context in use.
00341 
00342    if (!fgDefaultGC) {
00343       fgDefaultGC = new TGGC(*gClient->GetResourcePool()->GetFrameGC());
00344       fgDefaultGC->SetFont(fgDefaultFont->GetFontHandle());
00345    }
00346    return *fgDefaultGC;
00347 }
00348 
00349 //______________________________________________________________________________
00350 TGCompositeFrame *TGStatusBar::GetBarPart(Int_t npart) const
00351 {
00352    // Returns bar part. That allows to put in the bar part
00353    // something more interesting than text ;-)
00354 
00355    return  ((npart<fNpart) && (npart>=0)) ? (TGCompositeFrame*)fStatusPart[npart] : 0;
00356 }
00357 
00358 //______________________________________________________________________________
00359 TGDimension TGStatusBar::GetDefaultSize() const
00360 {
00361    // Return default size.
00362 
00363    UInt_t h = fHeight;
00364 
00365    for (int i = 0; i < fNpart; i++) {
00366       h = TMath::Max(h,fStatusPart[i]->GetDefaultHeight()+1);
00367    }
00368    return TGDimension(fWidth, h);
00369 }
00370 
00371 //______________________________________________________________________________
00372 void TGStatusBar::SavePrimitive(ostream &out, Option_t *option /*= ""*/)
00373 {
00374     // Save a status bar widget as a C++ statement(s) on output stream out.
00375 
00376    if (fBackground != GetDefaultFrameBackground()) SaveUserColor(out, option);
00377 
00378    out << endl;
00379    out << "   // status bar" << endl;
00380 
00381    out << "   TGStatusBar *";
00382    out << GetName() <<" = new TGStatusBar("<< fParent->GetName()
00383        << "," << GetWidth() << "," << GetHeight();
00384 
00385    if (fBackground == GetDefaultFrameBackground()) {
00386       if (GetOptions() == (kSunkenFrame | kHorizontalFrame)) {
00387          out <<");" << endl;
00388       } else {
00389          out << "," << GetOptionString() <<");" << endl;
00390       }
00391    } else {
00392       out << "," << GetOptionString() << ",ucolor);" << endl;
00393    }
00394    if (option && strstr(option, "keep_names"))
00395       out << "   " << GetName() << "->SetName(\"" << GetName() << "\");" << endl;
00396 
00397    int i; char quote = '"';
00398 
00399    if (fNpart > 1)  {
00400       out << "   Int_t parts" << GetName()+5 << "[] = {" << fParts[0];
00401 
00402       for (i=1; i<fNpart; i++) {
00403          out  << "," << fParts[i];
00404       }
00405       out << "};" << endl;
00406 
00407       out << "   " << GetName() << "->SetParts(parts" << GetName()+5
00408           << "," << fNpart << ");" <<endl;
00409    }
00410    for (i=0; i<fNpart; i++) {
00411       if (fStatusPart[i]->GetText()) {
00412          out << "   " << GetName() << "->SetText(" << quote
00413              << fStatusPart[i]->GetText()->GetString()
00414              << quote << "," << i << ");" << endl;
00415       } else {
00416          if (!fStatusPart[i]->GetList()->First()) continue;
00417          out << "   TGCompositeFrame *" << fStatusPart[i]->GetName()
00418              << " = " << GetName() << "->GetBarPart(" << i << ");" << endl;
00419 
00420          TGFrameElement *el;
00421          TIter next(fStatusPart[i]->GetList());
00422 
00423          while ((el = (TGFrameElement *) next())) {
00424             el->fFrame->SavePrimitive(out, option);
00425             out << "   " << fStatusPart[i]->GetName() << "->AddFrame("
00426                 << el->fFrame->GetName();
00427             el->fLayout->SavePrimitive(out, option);
00428             out << ");" << endl;
00429          }
00430       }
00431    }
00432 }

Generated on Tue Jul 5 14:22:03 2011 for ROOT_528-00b_version by  doxygen 1.5.1