38 ClassImp(TTableRange);
168 TGTable::TGTable(
const TGWindow *p, Int_t
id, TVirtualTableInterface *interface,
169 UInt_t nrows, UInt_t ncolumns)
170 : TGCompositeFrame(p, 500, 500, kVerticalFrame), TGWidget(id), fRows(0),
171 fRowHeaders(0), fColumnHeaders(0), fReadOnly(kFALSE), fSelectColor(0),
172 fTMode(0), fAllData(kFALSE), fTableFrame(0), fCanvas(0), fCellWidth(80),
173 fCellHeight(25), fInterface(interface)
175 fCurrentRange =
new TTableRange();
176 fDataRange =
new TTableRange();
177 fGotoRange =
new TTableRange();
178 TGLayoutHints *hints = 0;
179 fCellHintsList =
new TList(hints);
180 fRHdrHintsList =
new TList(hints);
181 fCHdrHintsList =
new TList(hints);
182 fMainHintsList =
new TList(hints);
185 SetBackgroundColor(GetWhitePixel());
186 fEvenRowBackground = TColor::RGB2Pixel(204, 255, 204);
187 fOddRowBackground = TColor::RGB2Pixel(255, 255, 255);
188 fHeaderBackground = TColor::RGB2Pixel(204, 204, 255);
190 fCurrentRange->fXbr = ncolumns;
191 fCurrentRange->fYbr = nrows;
195 if(fInterface) SetInterface(fInterface, nrows, ncolumns);
207 for (i = 0; i < GetNTableRows(); i++) {
208 for (j = 0; j < GetNTableColumns(); j++) {
215 delete fColumnHeaders;
217 delete fCurrentRange;
221 fCellHintsList->Delete();
222 delete fCellHintsList;
223 delete fRHdrHintsList;
224 delete fCHdrHintsList;
226 fMainHintsList->Delete();
227 delete fMainHintsList;
235 UInt_t nrows = GetNTableRows();
236 UInt_t ncolumns = GetNTableColumns();
239 fTopFrame =
new TGHorizontalFrame(
this, fWidth, fCellHeight);
240 fTopExtraFrame =
new TGHorizontalFrame(fTopFrame, fWidth - fCellWidth,
242 TGString *str =
new TGString();
243 *str += GetNTableRows();
245 *str += GetNTableColumns();
247 fTableHeader =
new TGTableHeader(fTopFrame,
this, str, 0,
250 fBottomFrame =
new TGHorizontalFrame(
this, fWidth, fHeight - fCellHeight);
251 fRHdrFrame =
new TGTableHeaderFrame(fBottomFrame,
this, fCellWidth,
252 fHeight - fCellHeight, kRowHeader);
253 fCHdrFrame =
new TGTableHeaderFrame(fTopExtraFrame,
this, fWidth - fCellWidth,
254 fCellHeight, kColumnHeader);
257 fButtonFrame =
new TGHorizontalFrame(
this, 200, 50);
258 fNextButton =
new TGTextButton(fButtonFrame,
"Next", WidgetId() + 2000);
259 fPrevButton =
new TGTextButton(fButtonFrame,
"Previous", WidgetId() + 2001);
260 fUpdateButton =
new TGTextButton(fButtonFrame,
"Update", WidgetId() + 2002);
262 fCanvas =
new TGCanvas(fBottomFrame, ncolumns * fCellWidth,
263 nrows * fCellHeight, 0);
264 fTableFrame =
new TGTableFrame(fCanvas->GetViewPort(), nrows, ncolumns);
265 fTableFrame->SetCanvas(fCanvas);
266 fCanvas->SetContainer(fTableFrame->GetFrame());
269 fRangeFrame =
new TGHorizontalFrame(
this, 450, 50);
270 fFirstCellLabel =
new TGLabel(fRangeFrame,
"Top left cell in range:");
271 fRangeLabel =
new TGLabel(fRangeFrame,
"Range:");
272 fFirstCellEntry =
new TGTextEntry(fRangeFrame,
"0,0", WidgetId() + 2050);
273 fFirstCellEntry->SetWidth(100);
274 fFirstCellEntry->SetAlignment(kTextRight);
275 fFirstCellEntry->Connect(
"TextChanged(const char *)",
"TGTable",
this,
276 "UserRangeChange()");
277 fFirstCellEntry->Connect(
"ReturnPressed()",
"TGTable",
this,
"Goto()");
280 range += GetNTableRows();
282 range += GetNTableColumns();
283 fRangeEntry =
new TGTextEntry(range, fRangeFrame, WidgetId() + 2051);
284 fRangeEntry->SetWidth(100);
285 fRangeEntry->SetAlignment(kTextRight);
286 fRangeEntry->Connect(
"TextChanged(const char *)",
"TGTable",
this,
287 "UserRangeChange()");
288 fRangeEntry->Connect(
"ReturnPressed()",
"TGTable",
this,
"Goto()");
289 fRangeEntry->Connect(
"TabPressed()",
"TGTextEntry", fFirstCellEntry,
291 fFirstCellEntry->Connect(
"TabPressed()",
"TGTextEntry", fRangeEntry,
294 fGotoRange->fXbr = GetNTableRows();
295 fGotoRange->fYbr = GetNTableColumns();
296 fGotoButton =
new TGTextButton(fRangeFrame,
"Goto", WidgetId() + 2003);
297 fGotoButton->SetState(kButtonDisabled);
300 fCHdrFrame->SetBackgroundColor(fBackground);
301 fRHdrFrame->SetBackgroundColor(fBackground);
302 fRangeFrame->SetBackgroundColor(fBackground);
303 fTopFrame->SetBackgroundColor(fBackground);
304 fTopExtraFrame->SetBackgroundColor(fBackground);
305 fBottomFrame->SetBackgroundColor(fBackground);
306 fButtonFrame->SetBackgroundColor(fBackground);
307 fFirstCellLabel->SetBackgroundColor(fBackground);
308 fRangeLabel->SetBackgroundColor(fBackground);
313 fRowHeaders =
new TObjArray(nrows);
314 for(i = 0; i < nrows; i++) {
315 TGTableHeader *hdr =
new TGTableHeader(fRHdrFrame,
this,
316 label, i, kRowHeader);
317 fRowHeaders->AddAt(hdr, i);
319 fColumnHeaders =
new TObjArray(ncolumns);
320 for(i = 0; i < ncolumns; i++) {
321 TGTableHeader *hdr =
new TGTableHeader(fCHdrFrame,
this,
322 label, i, kColumnHeader);
323 fColumnHeaders->AddAt(hdr, i);
326 TGTableCell *cell = 0;
328 fRows =
new TObjArray(nrows);
329 for (i = 0; i < nrows; i++) {
330 row =
new TObjArray(ncolumns);
331 fRows->AddAt(row, i);
332 for (j = 0; j < ncolumns; j++) {
333 cell =
new TGTableCell(fCanvas->GetContainer(),
this, label, i, j);
339 if ((GetNDataColumns() >= GetNTableColumns()) &&
340 (GetNDataRows() >= GetNTableRows())) {
346 TGLayoutHints *lhints = 0;
349 for (i = 0; i < nrows; i++) {
350 lhints =
new TGLayoutHints(kLHintsLeft | kLHintsTop);
351 fRHdrHintsList->Add(lhints);
352 fRHdrFrame->AddFrame(GetRowHeader(i), lhints);
353 for (j = 0; j < ncolumns; j++) {
355 lhints =
new TGLayoutHints(kLHintsLeft | kLHintsTop);
356 fCHdrHintsList->Add(lhints);
357 fCHdrFrame->AddFrame(GetColumnHeader(j), lhints);
359 lhints =
new TGLayoutHints(kLHintsLeft | kLHintsTop);
360 fCellHintsList->Add(lhints);
361 fCanvas->AddFrame(GetCell(i,j), lhints);
366 lhints =
new TGLayoutHints(kLHintsRight | kLHintsCenterY, 3, 30, 4, 4);
367 fRangeFrame->AddFrame(fGotoButton, lhints);
368 lhints =
new TGLayoutHints(kLHintsRight |kLHintsCenterY, 3, 3, 4, 4);
369 fRangeFrame->AddFrame(fRangeEntry, lhints);
370 lhints =
new TGLayoutHints(kLHintsRight |kLHintsCenterY, 3, 3, 4, 4);
371 fRangeFrame->AddFrame(fRangeLabel, lhints);
372 lhints =
new TGLayoutHints(kLHintsRight |kLHintsCenterY, 3, 3, 4, 4);
373 fRangeFrame->AddFrame(fFirstCellEntry, lhints);
374 lhints =
new TGLayoutHints(kLHintsRight |kLHintsCenterY, 3, 3, 4, 4);
375 fRangeFrame->AddFrame(fFirstCellLabel, lhints);
376 lhints =
new TGLayoutHints(kLHintsRight |kLHintsTop);
377 fRangeFrame->Resize();
379 AddFrame(fRangeFrame, lhints);
382 lhints =
new TGLayoutHints(kLHintsLeft |kLHintsTop);
383 fTopFrame->AddFrame(fTableHeader, lhints);
384 lhints =
new TGLayoutHints(kLHintsLeft | kLHintsExpandX | kLHintsTop);
385 fTopExtraFrame->AddFrame(fCHdrFrame, lhints);
386 lhints =
new TGLayoutHints(kLHintsLeft | kLHintsExpandX | kLHintsTop);
387 fTopFrame->AddFrame(fTopExtraFrame, lhints);
388 lhints =
new TGLayoutHints(kLHintsLeft | kLHintsTop | kLHintsExpandY);
389 fBottomFrame->AddFrame(fRHdrFrame, lhints);
390 lhints =
new TGLayoutHints(kLHintsLeft | kLHintsTop | kLHintsExpandX
392 fBottomFrame->AddFrame(fCanvas, lhints);
395 lhints =
new TGLayoutHints(kLHintsRight | kLHintsCenterY, 3, 30, 4, 4);
396 fButtonFrame->AddFrame(fNextButton, lhints);
397 lhints =
new TGLayoutHints(kLHintsRight | kLHintsCenterY, 3, 3, 4, 4);
398 fButtonFrame->AddFrame(fPrevButton, lhints);
399 lhints =
new TGLayoutHints(kLHintsRight | kLHintsCenterY, 3, 30, 4, 4);
400 fButtonFrame->AddFrame(fUpdateButton, lhints);
401 fButtonFrame->Resize();
402 fButtonFrame->ChangeOptions(fButtonFrame->GetOptions() | kFixedWidth);
404 lhints =
new TGLayoutHints(kLHintsLeft | kLHintsTop | kLHintsExpandX);
405 AddFrame(fTopFrame, lhints);
406 lhints =
new TGLayoutHints(kLHintsLeft | kLHintsTop | kLHintsExpandX |
408 AddFrame(fBottomFrame, lhints);
409 lhints =
new TGLayoutHints(kLHintsExpandX | kLHintsTop);
410 AddFrame(fButtonFrame, lhints);
413 TGScrollBar *sbar= fCanvas->GetVScrollbar();
414 sbar->Connect(
"PositionChanged(Int_t)",
"TGTable",
this,
"ScrollRHeaders(Int_t)");
415 sbar = fCanvas->GetHScrollbar();
416 sbar->Connect(
"PositionChanged(Int_t)",
"TGTable",
this,
"ScrollCHeaders(Int_t)");
419 fUpdateButton->Connect(
"Clicked()",
"TGTable",
this,
"Update()");
420 fNextButton->Connect(
"Clicked()",
"TGTable",
this,
"NextChunk()");
421 fPrevButton->Connect(
"Clicked()",
"TGTable",
this,
"PreviousChunk()");
422 fGotoButton->Connect(
"Clicked()",
"TGTable",
this,
"Goto()");
431 void TGTable::DoRedraw()
440 void TGTable::Expand(UInt_t nrows, UInt_t ncolumns)
443 ExpandColumns(ncolumns);
449 void TGTable::ExpandColumns(UInt_t ncolumns)
454 UInt_t ntrows = GetNTableRows();
455 UInt_t ntcolumns = GetNTableColumns();
457 fColumnHeaders->Expand(ntcolumns + ncolumns);
459 for (i = 0; i < ncolumns; i++) {
460 TGTableHeader *header =
new TGTableHeader(fCHdrFrame,
this, label,
463 fColumnHeaders->AddAt(header, ntcolumns + i);
466 for (i = 0; i < ntrows; i++) {
467 GetRow(i)->Expand(ntcolumns + ncolumns);
468 for (j = 0; j < ncolumns; j++) {
469 TGTableCell *cell =
new TGTableCell(fCanvas->GetContainer(),
this, label, i,
471 if (GetRow(i)) GetRow(i)->AddAt(cell, ntcolumns + j);
475 fCurrentRange->fXbr += ncolumns;
477 if ((GetNDataColumns() == GetNTableColumns()) &&
478 (GetNDataRows() == GetNTableRows())) {
488 void TGTable::ExpandRows(UInt_t nrows)
492 UInt_t ntrows = GetNTableRows();
493 UInt_t ntcolumns = GetNTableColumns();
495 fRows->Expand(ntrows + nrows);
496 fRowHeaders->Expand(ntrows + nrows);
497 for (i = 0; i < nrows; i++) {
498 TObjArray *row =
new TObjArray(ntcolumns);
499 fRows->AddAt(row, ntrows + i);
501 TGTableHeader *header =
new TGTableHeader(fRHdrFrame,
this, label,
502 ntrows + i, kRowHeader);
503 fRowHeaders->AddAt(header, ntrows + i);
504 for (j = 0; j < ntcolumns ; j++) {
505 TGTableCell *cell =
new TGTableCell(fCanvas->GetContainer(),
this, label,
507 if (GetRow(ntrows + i)) GetRow(ntrows + i)->AddAt(cell, j);
511 fCurrentRange->fYbr += nrows;
513 if ((GetNDataColumns() == GetNTableColumns()) &&
514 (GetNDataRows() == GetNTableRows())) {
524 UInt_t TGTable::GetCHdrWidth()
const
526 Int_t ncolumns = GetNTableColumns();
528 for (Int_t i = 0; i < ncolumns; i++) {
529 if (GetColumnHeader(i)) width += GetColumnHeader(i)->GetWidth();
537 UInt_t TGTable::GetRHdrHeight()
const
539 Int_t nrows = GetNTableRows();
541 for (Int_t i = 0; i < nrows; i++) {
542 if (GetRowHeader(i)) height += GetRowHeader(i)->GetHeight();
550 void TGTable::Shrink(UInt_t nrows, UInt_t ncolumns)
553 ShrinkColumns(ncolumns);
559 void TGTable::ShrinkColumns(UInt_t ncolumns)
561 UInt_t i = 0, j = 0, k = 0;
563 if(GetNTableColumns() - ncolumns < 1) {
564 Info(
"TGTable::ShrinkColumns",
"Cannot shrink smaller than 1"
565 " column, adjusting");
566 ncolumns = GetNTableColumns() - 1;
569 UInt_t ntrows = GetNTableRows();
570 UInt_t ntcolumns = GetNTableColumns();
572 TGTableCell *cell = 0;
576 for (i = 0; i < ntrows; i++) {
577 for (j = 0; j < ncolumns; j++) {
578 k = ntcolumns - ncolumns + j;
580 cell = (TGTableCell *)GetRow(i)->RemoveAt(k);
582 cell->DestroyWindow();
587 GetRow(i)->Expand(ntcolumns - ncolumns);
590 TGTableHeader *hdr = 0;
591 for (j = 0; j < ncolumns; j++) {
592 hdr = (TGTableHeader *)fColumnHeaders->RemoveAt(ntcolumns - ncolumns + j);
593 hdr->DestroyWindow();
596 fColumnHeaders->Expand(ntcolumns - ncolumns);
598 fCurrentRange->fXbr -= ncolumns;
601 if ((GetNDataColumns() == GetNTableColumns()) &&
602 (GetNDataRows() == GetNTableRows())) {
612 void TGTable::ShrinkRows(UInt_t nrows)
614 UInt_t i = 0 , j = 0;
616 if(GetNTableRows() - nrows < 1) {
617 Info(
"TGTable::ShrinkRows",
"Cannot shrink smaller than 1 row, adjusting");
618 nrows = GetNTableRows() - 1;
621 UInt_t ntrows = GetNTableRows();
622 UInt_t ntcolumns = GetNTableColumns();
625 TGTableCell *cell = 0;
626 TGTableHeader *hdr = 0;
628 for (i = 0; i < nrows; i++) {
629 for (j = 0; j < ntcolumns ; j++) {
630 if (GetRow(ntrows - nrows + i)) {
631 cell = (TGTableCell *)GetRow(ntrows - nrows + i)->RemoveAt(j);
633 cell->DestroyWindow();
638 row = (TObjArray *)fRows->RemoveAt(ntrows - nrows + i);
640 hdr = (TGTableHeader *)fRowHeaders->RemoveAt(ntrows - nrows + i);
641 hdr->DestroyWindow();
644 fRows->Expand(ntrows - nrows);
645 fRowHeaders->Expand(ntrows - nrows);
647 fCurrentRange->fYbr -= nrows;
649 if ((GetNDataColumns() == GetNTableColumns()) &&
650 (GetNDataRows() == GetNTableRows())) {
660 void TGTable::UpdateHeaders(EHeaderType type)
662 UInt_t max = 0, i = 0, d = 0;
663 if(type == kColumnHeader) {
664 max = GetNTableColumns();
665 for (i = 0; i < max; i++) {
666 d = fCurrentRange->fXtl + i;
667 if (GetColumnHeader(i) && fInterface->GetColumnHeader(d))
668 GetColumnHeader(i)->SetLabel(fInterface->GetColumnHeader(d));
670 }
else if (type == kRowHeader) {
671 max = GetNTableRows();
672 for (i = 0; i < max; i++) {
673 d = fCurrentRange->fYtl + i;
674 if (GetRowHeader(i) && fInterface->GetRowHeader(d))
675 GetRowHeader(i)->SetLabel(fInterface->GetRowHeader(d));
683 void TGTable::SetInterface(TVirtualTableInterface *interface,
684 UInt_t nrows, UInt_t ncolumns)
686 fInterface = interface;
690 fDataRange->fXtl = 0;
691 fDataRange->fYtl = 0;
692 fDataRange->fXbr = fInterface->GetNColumns();
693 fDataRange->fYbr = fInterface->GetNRows();
696 if (fDataRange->fXbr < ncolumns) {
697 x = fDataRange->fXbr;
702 if (fDataRange->fYbr < nrows) {
703 y = fDataRange->fYbr;
708 GotoTableRange(0, 0, x, y);
710 if ((GetNDataColumns() == GetNTableColumns()) &&
711 (GetNDataRows() == GetNTableRows())) {
722 void TGTable::ResizeTable(UInt_t newnrows, UInt_t newncolumns)
724 UInt_t oldnrows = GetNTableRows();
725 UInt_t oldncolumns = GetNTableColumns();
729 TGCompositeFrame *container = (TGCompositeFrame *)fCanvas->GetContainer();
731 if (newnrows != oldnrows){
732 if (newnrows > oldnrows) {
733 ExpandRows(newnrows - oldnrows);
735 ShrinkRows(oldnrows - newnrows);
739 if (newncolumns != oldncolumns){
740 if (newncolumns > oldncolumns) {
741 ExpandColumns(newncolumns - oldncolumns);
743 ShrinkColumns(oldncolumns - newncolumns);
748 if ((newncolumns != oldncolumns) || (newnrows != oldnrows)) {
749 container->RemoveAll();
750 fCellHintsList->Delete();
752 fRHdrFrame->RemoveAll();
753 fRHdrHintsList->Delete();
755 fCHdrFrame->RemoveAll();
756 fCHdrHintsList->Delete();
758 container->SetLayoutManager(
new TGMatrixLayout(container,
759 newnrows, newncolumns));
761 TGLayoutHints *lhints = 0;
762 for (i = 0; i < (Int_t)newnrows; i++) {
763 lhints =
new TGLayoutHints(kLHintsLeft | kLHintsTop);
764 fRHdrHintsList->Add(lhints);
765 fRHdrFrame->AddFrame(GetRowHeader(i), lhints);
766 for (j = 0; j < (Int_t)newncolumns; j++) {
768 lhints =
new TGLayoutHints(kLHintsLeft | kLHintsTop);
769 fCHdrHintsList->Add(lhints);
770 fCHdrFrame->AddFrame(GetColumnHeader(j), lhints);
772 lhints =
new TGLayoutHints(kLHintsLeft | kLHintsTop);
773 fCellHintsList->Add(lhints);
774 fCanvas->AddFrame(GetCell(i,j), lhints);
778 fCanvas->MapSubwindows();
785 void TGTable::UpdateRangeFrame()
789 tl += fCurrentRange->fYtl;
791 tl += fCurrentRange->fXtl;
792 fFirstCellEntry->SetText(tl.Data());
794 range += GetNTableRows();
796 range += GetNTableColumns();
797 fRangeEntry->SetText(range.Data());
799 fGotoButton->SetState(kButtonDisabled);
806 TObjArray *TGTable::GetRow(UInt_t row)
808 return (TObjArray *)fRows->At(row);
818 TObjArray *TGTable::GetColumn(UInt_t column)
820 UInt_t nrows = GetNTableRows();
822 TObjArray *col =
new TObjArray(nrows);
823 for(UInt_t ui = 0; ui < nrows; ui++) {
824 col->AddAt(GetCell(ui, column), ui);
892 const TGTableCell* TGTable::GetCell(UInt_t i, UInt_t j)
const
894 return const_cast<TGTable *
>(
this)->GetCell(i, j);
900 TGTableCell* TGTable::GetCell(UInt_t i, UInt_t j)
902 TObjArray *row = (TObjArray *)fRows->At(i);
904 TGTableCell *cell = (TGTableCell *)row->At(j);
914 const TGTableCell* TGTable::FindCell(TGString label)
const
916 return const_cast<TGTable *
>(
this)->FindCell(label);
922 TGTableCell* TGTable::FindCell(TGString label)
925 TGTableCell *cell = 0;
928 UInt_t nrows = GetNTableRows();
929 UInt_t ncolumns = GetNTableColumns();
930 for (i = 0; i < nrows; i++) {
931 for (j = 0; j < ncolumns; j++) {
932 row = (TObjArray *)fRows->At(j);
933 cell = (TGTableCell *)row->At(i);
934 if (*(cell->GetLabel()) == label) {
947 TGTableCell *cell = 0;
948 TGTableHeader *hdr = 0;
950 UInt_t nrows = GetNTableRows();
951 UInt_t ncolumns = GetNTableColumns();
954 std::ios_base::fmtflags org_flags = std::cout.flags();
956 for (j = 0; j < ncolumns + 1; j++) {
959 if (hdr) std::cout <<
" " << std::setw(12) << std::right
960 << hdr->GetLabel()->GetString() <<
" ";
962 hdr = GetColumnHeader(j - 1);
963 if (hdr) std::cout <<
" " << std::setw(12) << std::right
964 << hdr->GetLabel()->GetString() <<
" ";
967 std::cout << std::endl;
969 for (i = 0; i < nrows; i++) {
970 for (j = 0; j < ncolumns + 1; j++) {
972 hdr = GetRowHeader(i);
973 if (hdr) std::cout <<
" " << std::setw(12) << std::right
974 << hdr->GetLabel()->GetString() <<
" ";
976 cell = GetCell(i, j - 1);
977 if (cell) std::cout <<
" " << std::setw(12) << std::right
978 << cell->GetLabel()->GetString() <<
" ";
981 std::cout << std::endl;
984 std::cout.flags(org_flags);
1060 void TGTable::UpdateView()
1062 UInt_t nrows = GetNTableRows();
1063 UInt_t ncolumns = GetNTableColumns();
1065 TGString *str =
new TGString();
1070 fTableHeader->SetLabel(str->GetString());
1073 UpdateHeaders(kRowHeader);
1074 UpdateHeaders(kColumnHeader);
1076 UInt_t i = 0, j = 0;
1077 UInt_t k = 0, l = 0;
1079 TGTableCell * cell = 0;
1080 for (i = 0; i < nrows; i++) {
1081 for (j = 0; j < ncolumns; j++) {
1082 cell = GetCell(i,j);
1083 k = fCurrentRange->fYtl + i;
1084 l = fCurrentRange->fXtl + j;
1086 const char *label = fInterface->GetValueAsString(k,l);
1087 if(cell) cell->SetLabel(label);
1093 gClient->NeedRedraw(fTableHeader);
1094 TGViewPort *vp = fCanvas->GetViewPort();
1095 fTableFrame->DrawRegion(0, 0, vp->GetWidth(), vp->GetHeight());
1096 fCHdrFrame->DrawRegion(0, 0, fCHdrFrame->GetWidth(), fCHdrFrame->GetHeight());
1097 fRHdrFrame->DrawRegion(0, 0, fRHdrFrame->GetWidth(), fRHdrFrame->GetHeight());
1105 UInt_t TGTable::GetNTableRows()
const
1107 return fCurrentRange->fYbr - fCurrentRange->fYtl;
1113 UInt_t TGTable::GetNDataRows()
const
1115 return fDataRange->fYbr - fDataRange->fYtl;
1121 UInt_t TGTable::GetNTableColumns()
const
1123 return fCurrentRange->fXbr - fCurrentRange->fXtl;
1129 UInt_t TGTable::GetNDataColumns()
const
1131 return fDataRange->fYbr - fDataRange->fYtl;
1137 UInt_t TGTable::GetNTableCells()
const
1139 return GetNTableRows() * GetNTableColumns();
1145 UInt_t TGTable::GetNDataCells()
const
1147 return GetNDataRows() * GetNDataColumns();
1153 const TTableRange *TGTable::GetCurrentRange()
const
1155 return fCurrentRange;
1161 const TGTableHeader *TGTable::GetRowHeader(
const UInt_t row)
const
1163 return const_cast<TGTable *
>(
this)->GetRowHeader(row);
1169 TGTableHeader *TGTable::GetRowHeader(
const UInt_t row)
1171 return (TGTableHeader *)fRowHeaders->At(row);
1177 const TGTableHeader *TGTable::GetColumnHeader(
const UInt_t column)
const
1179 return const_cast<TGTable *
>(
this)->GetColumnHeader(column);
1185 TGTableHeader *TGTable::GetColumnHeader(
const UInt_t column)
1187 return (TGTableHeader *)fColumnHeaders->At(column);
1193 TGTableHeader *TGTable::GetTableHeader()
1195 return fTableHeader;
1216 Pixel_t TGTable::GetRowBackground(UInt_t row)
const
1219 return fEvenRowBackground;
1221 return fOddRowBackground;
1228 Pixel_t TGTable::GetHeaderBackground()
const
1230 return fHeaderBackground;
1236 void TGTable::SetOddRowBackground(Pixel_t pixel)
1238 if(pixel == fOddRowBackground)
return;
1240 fOddRowBackground = pixel;
1242 UInt_t nrows = GetNTableRows();
1243 UInt_t ncolumns = GetNTableColumns();
1244 UInt_t i = 0, j = 0;
1245 TGTableCell *cell = 0;
1247 for (i = 0; i < nrows; i++) {
1248 for (j = 0; j < ncolumns; j++) {
1250 cell = GetCell(i,j);
1251 if (cell) cell->SetBackgroundColor(fOddRowBackground);
1256 UInt_t width = fCanvas->GetViewPort()->GetWidth();
1257 UInt_t height = fCanvas->GetViewPort()->GetHeight();
1258 fTableFrame->DrawRegion(0, 0, width, height);
1264 void TGTable::SetEvenRowBackground(Pixel_t pixel)
1266 if(pixel == fEvenRowBackground)
return;
1268 fEvenRowBackground = pixel;
1270 UInt_t nrows = GetNTableRows();
1271 UInt_t ncolumns = GetNTableColumns();
1272 UInt_t i = 0, j = 0;
1273 TGTableCell *cell = 0;
1275 for (i = 0; i < nrows; i++) {
1276 for (j = 0; j < ncolumns; j++) {
1278 cell = GetCell(i,j);
1279 if (cell) cell->SetBackgroundColor(fEvenRowBackground);
1283 UInt_t width = fCanvas->GetViewPort()->GetWidth();
1284 UInt_t height = fCanvas->GetViewPort()->GetHeight();
1285 fTableFrame->DrawRegion(0, 0, width, height);
1291 void TGTable::SetHeaderBackground(Pixel_t pixel)
1293 if(pixel == fHeaderBackground)
return;
1295 fHeaderBackground = pixel;
1297 UInt_t nrows = GetNTableRows();
1298 UInt_t ncolumns = GetNTableColumns();
1299 UInt_t i = 0, j = 0;
1300 TGTableHeader *hdr = 0;
1302 for (i = 0; i < nrows; i++) {
1303 hdr = GetRowHeader(i);
1304 if (hdr) hdr->SetBackgroundColor(fHeaderBackground);
1306 UInt_t height = fCanvas->GetViewPort()->GetHeight();
1307 UInt_t width = fTableHeader->GetWidth();
1308 fRHdrFrame->DrawRegion(0, 0, width, height);
1310 for (j = 0; j < ncolumns; j++) {
1311 hdr = GetColumnHeader(j);
1312 if (hdr) hdr->SetBackgroundColor(fHeaderBackground);
1315 width = fCanvas->GetViewPort()->GetWidth();
1316 height = fTableHeader->GetHeight();
1317 fCHdrFrame->DrawRegion(0, 0, width, height);
1323 void TGTable::SetDefaultColors()
1325 SetEvenRowBackground(TColor::RGB2Pixel(204, 255, 204));
1326 SetOddRowBackground(TColor::RGB2Pixel(255, 255, 255));
1327 SetHeaderBackground(TColor::RGB2Pixel(204, 204, 255));
1333 void TGTable::MoveTable(Int_t rows, Int_t columns)
1335 if (fAllData)
return;
1337 Int_t xtl = fCurrentRange->fXtl + columns;
1338 Int_t ytl = fCurrentRange->fYtl + rows;
1339 Int_t xbr = fCurrentRange->fXbr + columns;
1340 Int_t ybr = fCurrentRange->fYbr + rows;
1342 GotoTableRange(xtl, ytl, xbr, ybr);
1348 void TGTable::GotoTableRange(Int_t xtl, Int_t ytl, Int_t xbr, Int_t ybr)
1350 if (fAllData)
return;
1352 if(xtl == xbr || ytl == ybr) {
1353 Error(
"TGTable::GotoTableRange",
"x or y range = 0");
1357 Int_t nrows = TMath::Abs(ybr - ytl);
1358 Int_t ncolumns = TMath::Abs(xbr - xtl);
1361 Info(
"TGTable::GotoTableRange",
"Swapping x-range boundries");
1367 Info(
"TGTable::GotoTableRange",
"Swapping y-range boundries");
1373 if((xtl < 0) || (xbr < 0)) {
1374 Info(
"TGTable::GotoTableRange",
"Column boundry out of bounds, adjusting");
1377 if (xbr > (Int_t)fDataRange->fXbr) {
1378 xbr = fDataRange->fXbr;
1379 ncolumns = TMath::Abs(xbr - xtl);
1383 if((ytl < 0) || (ybr < 0)) {
1384 Info(
"TGTable::GotoTableRange",
"Row boundry out of bounds, adjusting");
1387 if (ybr > (Int_t)fDataRange->fYbr) {
1388 ybr = fDataRange->fYbr;
1389 nrows = TMath::Abs(ybr - ytl);
1393 if((xtl > (Int_t)fDataRange->fXbr) || (xbr > (Int_t)fDataRange->fXbr)) {
1394 Info(
"TGTable::GotoTableRange",
"Left Column boundry out of bounds, "
1396 xbr = fDataRange->fXbr;
1397 xtl = xbr - ncolumns;
1400 ncolumns = TMath::Abs(xbr - xtl);
1401 Info(
"TGTable::GotoTableRange",
"Right column boundry out of"
1402 " bounds, set to 0");
1405 if ((ytl > (Int_t)fDataRange->fYbr) || (ybr > (Int_t)fDataRange->fYbr)) {
1406 Info(
"TGTable::GotoTableRange",
"Bottom row boundry out of bounds, "
1408 ybr = fDataRange->fYbr;
1413 Info(
"TGTable::GotoTableRange",
"Top row boundry out of bounds, "
1418 nrows = TMath::Abs(ybr - ytl);
1419 ncolumns = TMath::Abs(xbr - xtl);
1422 ResizeTable(nrows, ncolumns);
1424 fCurrentRange->fXtl = xtl;
1425 fCurrentRange->fYtl = ytl;
1426 fCurrentRange->fXbr = xbr;
1427 fCurrentRange->fYbr = ybr;
1436 TGTableCell *TGTable::operator() (UInt_t row, UInt_t column)
1438 return GetCell(row, column);
1444 void TGTable::ScrollCHeaders(Int_t xpos)
1446 if (!fCHdrFrame)
return;
1448 fCHdrFrame->Move(- xpos, 0);
1449 fCHdrFrame->Resize();
1450 fCHdrFrame->DrawRegion(0, 0, fCHdrFrame->GetWidth(),
1451 fCHdrFrame->GetHeight());
1457 void TGTable::ScrollRHeaders(Int_t ypos)
1459 if (!fRHdrFrame)
return;
1461 fRHdrFrame->Move(fRHdrFrame->GetX(), -ypos);
1462 fRHdrFrame->Resize();
1463 fRHdrFrame->DrawRegion(0, 0, fRHdrFrame->GetWidth(),
1464 fRHdrFrame->GetHeight());
1470 void TGTable::NextChunk()
1472 MoveTable(GetNTableRows(), 0);
1479 void TGTable::PreviousChunk()
1481 MoveTable(-1 * (Int_t)GetNTableRows(), 0);
1489 void TGTable::Goto()
1491 if (fGotoButton->GetState() == kButtonUp) {
1492 GotoTableRange(fGotoRange->fXtl, fGotoRange->fYtl,
1493 fGotoRange->fXbr, fGotoRange->fYbr);
1501 void TGTable::UserRangeChange()
1503 TString topleft(fFirstCellEntry->GetText());
1504 if(!topleft.Contains(
","))
return;
1506 Int_t pos = topleft.First(
',');
1507 TString itl = topleft(0,pos);
1508 TString jtl = topleft(pos+1, topleft.Length());
1510 if (itl.Contains(
' ') || itl.Contains(
'\t') ||
1511 jtl.Contains(
' ') || jtl.Contains(
'\t'))
return;
1513 if (!itl.IsAlnum() || !jtl.IsAlnum())
return;
1515 fGotoRange->fXtl = jtl.Atoi();
1516 fGotoRange->fYtl = itl.Atoi();
1518 TString range(fRangeEntry->GetText());
1519 if(!range.Contains(
"x"))
return;
1522 pos = range.First(
'x');
1523 TString ir = range(0,pos);
1524 TString jr = range(pos+1, range.Length());
1526 if (ir.Contains(
' ') || ir.Contains(
'\t') ||
1527 jr.Contains(
' ') || jr.Contains(
'\t'))
return;
1528 if (!ir.IsAlnum() || !jr.IsAlnum())
return;
1530 fGotoRange->fXbr = jtl.Atoi() + jr.Atoi();
1531 fGotoRange->fYbr = itl.Atoi() + ir.Atoi();
1533 if (*fGotoRange == *fCurrentRange) {
1534 fGotoButton->SetState(kButtonDisabled);
1536 fGotoButton->SetState(kButtonUp);
1544 void TGTable::Update()
1546 fDataRange->fXbr = fInterface->GetNColumns();
1547 fDataRange->fYbr = fInterface->GetNRows();
1549 GotoTableRange(fCurrentRange->fXtl, fCurrentRange->fYtl,
1550 fCurrentRange->fXbr, fCurrentRange->fYbr);
1558 TTableRange::TTableRange() : fXtl(0), fYtl(0), fXbr(0), fYbr(0)
1565 void TTableRange::Print()
1567 std::cout <<
"Range = (" << fXtl <<
"," << fYtl <<
")->("
1568 << fXbr <<
"," << fYbr <<
")" << std::endl;
1574 Bool_t TTableRange::operator==(TTableRange &other)
1576 if ((fXtl == other.fXtl) && (fYtl == other.fYtl) &&
1577 (fXbr == other.fXbr) && (fYbr == other.fYbr)) {