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;