37 const TGFont  *TGStatusBar::fgDefaultFont = 0;
 
   38 TGGC          *TGStatusBar::fgDefaultGC = 0;
 
   41 class TGStatusBarPart : 
public TGHorizontalFrame {
 
   42 friend class TGStatusBar;
 
   44    TGString  *fStatusInfo;    
 
   46    virtual void DoRedraw();
 
   49    TGStatusBarPart(
const TGWindow *p, Int_t h, Int_t y, ULong_t back = GetDefaultFrameBackground());
 
   50    ~TGStatusBarPart() { 
delete fStatusInfo; DestroyWindow(); }
 
   51    void SetText(TGString *text);
 
   52    const TGString *GetText()
 const { 
return fStatusInfo; }
 
   59 TGStatusBarPart::TGStatusBarPart(
const TGWindow *p, Int_t h, Int_t y, ULong_t back)
 
   60    : TGHorizontalFrame(p, 5, 5, kChildFrame | kHorizontalFrame, back)
 
   67    fEditDisabled = kEditDisableGrab;
 
   73 void TGStatusBarPart::SetText(TGString *text)
 
   75    if (fStatusInfo) 
delete fStatusInfo;
 
   77    fClient->NeedRedraw(
this);
 
   83 void TGStatusBarPart::DoRedraw()
 
   85    TGHorizontalFrame::DoRedraw();
 
   88       fStatusInfo->Draw(fId, TGStatusBar::GetDefaultGC()(), 3, fYt);
 
   92 ClassImp(TGStatusBar);
 
   98 TGStatusBar::TGStatusBar(
const TGWindow *p, UInt_t w, UInt_t h,
 
   99                          UInt_t options, ULong_t back) :
 
  100    TGHorizontalFrame(p, w, h, options, back)
 
  103    fStatusPart    = 
new TGStatusBarPart* [1];
 
  104    fParts         = 
new Int_t [1];
 
  110    int max_ascent, max_descent;
 
  111    gVirtualX->GetFontProperties(GetDefaultFontStruct(), max_ascent, max_descent);
 
  112    int ht = max_ascent + max_descent;
 
  116    fStatusPart[0] = 
new TGStatusBarPart(
this, ht, fYt);
 
  117    AddFrame(fStatusPart[0]);
 
  126 TGStatusBar::~TGStatusBar()
 
  128    if (!MustCleanup()) {
 
  129       for (
int i = 0; i < fNpart; i++) {
 
  130          delete fStatusPart[i];
 
  134    delete [] fStatusPart;
 
  143 void TGStatusBar::SetText(TGString *text, Int_t partidx)
 
  145    if (partidx < 0 || partidx >= fNpart) {
 
  146       Error(
"SetText", 
"partidx out of range (0,%d)", fNpart-1);
 
  150    fStatusPart[partidx]->SetText(text);
 
  156 void TGStatusBar::SetText(
const char *text, Int_t partidx)
 
  158    if ((partidx >= 0) && (partidx < fNpart))
 
  159       SetText(
new TGString(text), partidx);
 
  165 const char *TGStatusBar::GetText(Int_t partidx)
 const 
  167    if (partidx < 0 || partidx >= fNpart) {
 
  168       Error(
"GetText", 
"partidx out of range (0,%d)", fNpart-1);
 
  172    const TGString *str = fStatusPart[partidx]->GetText();
 
  179 void TGStatusBar::DrawBorder()
 
  183    for (i = 0; i < fNpart; i++) {
 
  187          fXt[i] = fXt[i-1] + (fWidth * fParts[i-1] / 100);
 
  191    for (i = 0; i < fNpart; i++) {
 
  192       int xmax, xmin = fXt[i];
 
  200             fStatusPart[i]->MoveResize(fXt[i]+2, 1, xmax - fXt[i] - 15, fHeight - 2);
 
  202             fStatusPart[i]->MoveResize(fXt[i]+2, 1, xmax - fXt[i], fHeight - 2);
 
  204          fStatusPart[i]->MoveResize(fXt[i]+2, 1, xmax - fXt[i] - 4, fHeight - 2);
 
  206       gVirtualX->DrawLine(fId, GetShadowGC()(), xmin, 0, xmax-2, 0);
 
  207       gVirtualX->DrawLine(fId, GetShadowGC()(), xmin, 0, xmin, fHeight-2);
 
  208       gVirtualX->DrawLine(fId, GetHilightGC()(), xmin, fHeight-1, xmax-1, fHeight-1);
 
  210          gVirtualX->DrawLine(fId, GetHilightGC()(), xmax-1, fHeight-1, xmax-1, 0);
 
  212          gVirtualX->DrawLine(fId, GetHilightGC()(), xmax-1, fHeight-1, xmax-1, 1);
 
  217       gVirtualX->DrawLine(fId, GetShadowGC()(),  fWidth-3,  fHeight-2, fWidth-2, fHeight-3);
 
  218       gVirtualX->DrawLine(fId, GetShadowGC()(),  fWidth-4,  fHeight-2, fWidth-2, fHeight-4);
 
  219       gVirtualX->DrawLine(fId, GetHilightGC()(), fWidth-5,  fHeight-2, fWidth-2, fHeight-5);
 
  221       gVirtualX->DrawLine(fId, GetShadowGC()(),  fWidth-7,  fHeight-2, fWidth-2, fHeight-7);
 
  222       gVirtualX->DrawLine(fId, GetShadowGC()(),  fWidth-8,  fHeight-2, fWidth-2, fHeight-8);
 
  223       gVirtualX->DrawLine(fId, GetHilightGC()(), fWidth-9,  fHeight-2, fWidth-2, fHeight-9);
 
  225       gVirtualX->DrawLine(fId, GetShadowGC()(),  fWidth-11, fHeight-2, fWidth-2, fHeight-11);
 
  226       gVirtualX->DrawLine(fId, GetShadowGC()(),  fWidth-12, fHeight-2, fWidth-2, fHeight-12);
 
  227       gVirtualX->DrawLine(fId, GetHilightGC()(), fWidth-13, fHeight-2, fWidth-2, fHeight-13);
 
  229       gVirtualX->DrawLine(fId, GetBckgndGC()(),  fWidth-13, fHeight-1, fWidth-1, fHeight-1);
 
  230       gVirtualX->DrawLine(fId, GetBckgndGC()(),  fWidth-1,  fHeight-1, fWidth-1, fHeight-13);
 
  237 void TGStatusBar::DoRedraw()
 
  242    for (
int i = 0; i < fNpart; i++)
 
  243       fStatusPart[i]->DoRedraw();
 
  250 void TGStatusBar::SetParts(Int_t *parts, Int_t npart)
 
  253       Warning(
"SetParts", 
"must be at least one part");
 
  257       Error(
"SetParts", 
"to many parts (limit is 15)");
 
  262    for (i = 0; i < fNpart; i++)
 
  263       delete fStatusPart[i];
 
  265    delete [] fStatusPart;
 
  270    fStatusPart = 
new TGStatusBarPart* [npart];
 
  271    fParts      = 
new Int_t [npart];
 
  272    fXt         = 
new Int_t [npart];
 
  275    for (i = 0; i < npart; i++) {
 
  276       fStatusPart[i] = 
new TGStatusBarPart(
this, fHeight, fYt);
 
  277       AddFrame(fStatusPart[i]);
 
  278       fParts[i] = parts[i];
 
  281          Error(
"SetParts", 
"sum of part > 100");
 
  284       fParts[npart-1] += 100 - tot;
 
  291 void TGStatusBar::SetParts(Int_t npart)
 
  294       Warning(
"SetParts", 
"must be at least one part");
 
  298       Error(
"SetParts", 
"to many parts (limit is 40)");
 
  303    for (i = 0; i < fNpart; i++)
 
  304       delete fStatusPart[i];
 
  306    delete [] fStatusPart;
 
  311    fStatusPart = 
new TGStatusBarPart* [npart];
 
  312    fParts      = 
new Int_t [npart];
 
  313    fXt         = 
new Int_t [npart];
 
  317    for (i = 0; i < npart; i++) {
 
  318       fStatusPart[i] = 
new TGStatusBarPart(
this, fHeight, fYt);
 
  319       AddFrame(fStatusPart[i]);
 
  324       fParts[npart-1] += 100 - tot;
 
  331 FontStruct_t TGStatusBar::GetDefaultFontStruct()
 
  334       fgDefaultFont = gClient->GetResourcePool()->GetStatusFont();
 
  335    return fgDefaultFont->GetFontStruct();
 
  341 const TGGC &TGStatusBar::GetDefaultGC()
 
  344       fgDefaultGC = 
new TGGC(*gClient->GetResourcePool()->GetFrameGC());
 
  345       fgDefaultGC->SetFont(fgDefaultFont->GetFontHandle());
 
  354 TGCompositeFrame *TGStatusBar::GetBarPart(Int_t npart)
 const 
  356    return  ((npart<fNpart) && (npart>=0)) ? (TGCompositeFrame*)fStatusPart[npart] : 0;
 
  362 TGDimension TGStatusBar::GetDefaultSize()
 const 
  366    for (
int i = 0; i < fNpart; i++) {
 
  367       h = TMath::Max(h,fStatusPart[i]->GetDefaultHeight()+1);
 
  369    return TGDimension(fWidth, h);
 
  375 void TGStatusBar::SavePrimitive(std::ostream &out, Option_t *option )
 
  377    if (fBackground != GetDefaultFrameBackground()) SaveUserColor(out, option);
 
  380    out << 
"   // status bar" << std::endl;
 
  382    out << 
"   TGStatusBar *";
 
  383    out << GetName() <<
" = new TGStatusBar("<< fParent->GetName()
 
  384        << 
"," << GetWidth() << 
"," << GetHeight();
 
  386    if (fBackground == GetDefaultFrameBackground()) {
 
  387       if (GetOptions() == (kSunkenFrame | kHorizontalFrame)) {
 
  388          out <<
");" << std::endl;
 
  390          out << 
"," << GetOptionString() <<
");" << std::endl;
 
  393       out << 
"," << GetOptionString() << 
",ucolor);" << std::endl;
 
  395    if (option && strstr(option, 
"keep_names"))
 
  396       out << 
"   " << GetName() << 
"->SetName(\"" << GetName() << 
"\");" << std::endl;
 
  398    int i; 
char quote = 
'"';
 
  401       out << 
"   Int_t parts" << GetName()+5 << 
"[] = {" << fParts[0];
 
  403       for (i=1; i<fNpart; i++) {
 
  404          out  << 
"," << fParts[i];
 
  406       out << 
"};" << std::endl;
 
  408       out << 
"   " << GetName() << 
"->SetParts(parts" << GetName()+5
 
  409           << 
"," << fNpart << 
");" <<std::endl;
 
  411    for (i=0; i<fNpart; i++) {
 
  412       if (fStatusPart[i]->GetText()) {
 
  413          out << 
"   " << GetName() << 
"->SetText(" << quote
 
  414              << fStatusPart[i]->GetText()->GetString()
 
  415              << quote << 
"," << i << 
");" << std::endl;
 
  417          if (!fStatusPart[i]->GetList()->First()) 
continue;
 
  418          out << 
"   TGCompositeFrame *" << fStatusPart[i]->GetName()
 
  419              << 
" = " << GetName() << 
"->GetBarPart(" << i << 
");" << std::endl;
 
  422          TIter next(fStatusPart[i]->GetList());
 
  424          while ((el = (TGFrameElement *) next())) {
 
  425             el->fFrame->SavePrimitive(out, option);
 
  426             out << 
"   " << fStatusPart[i]->GetName() << 
"->AddFrame(" 
  427                 << el->fFrame->GetName();
 
  428             el->fLayout->SavePrimitive(out, option);
 
  429             out << 
");" << std::endl;