// Author: Roel Aaij 21/07/2007

/*************************************************************************
 * Copyright (C) 1995-2007, Rene Brun and Fons Rademakers.               *
 * All rights reserved.                                                  *
 *                                                                       *
 * For the licensing terms see $ROOTSYS/LICENSE.                         *
 * For the list of contributors see $ROOTSYS/README/CREDITS.             *
 *************************************************************************/

#include "TGCanvas.h"
#include "TGFrame.h"
#include "TClass.h"
#include "TGWindow.h"
#include "TGResourcePool.h"
#include "Riostream.h"
#include "TSystem.h"
#include "TImage.h"
#include "TEnv.h"
#include "TGToolTip.h"
#include "TGWidget.h"
#include "TGPicture.h"
#include "TRandom3.h"
#include "TVirtualTableInterface.h"
#include "TGTable.h"
#include "TGTableCell.h"
#include "TGTableHeader.h"
#include "TObjArray.h"
#include "TGTableContainer.h"
#include "TGScrollBar.h"
#include "TGButton.h"
#include "TGNumberEntry.h"
#include "TGTextEntry.h"
#include "TGLabel.h"
#include "TColor.h"

ClassImp(TGTable)
ClassImp(TTableRange)

//______________________________________________________________________________
/* Begin_Html
<center><h2>TGTable</h2></center>
<br><br>
TGTable implements a table widget to display data in rows and
columns. The data is supplied by a TVirtualTableInterface.
<br><br>
The table is a TGCanvas to make use of already available viewport
functionality and drawing optimizations.
<br><br>
The top left cell in a table has coordinates (0,0)
<br><br>
A TObjArray is used internally to ensure little overhead and fast
acces to cells.
<br><br>
If the data source has more rows than the default 50 rows of cells in
memory, buttons at the bottom of the table can be used to load the
next or previous chunk of data.
<br><br>
At the top of the table, a frame is visible that shows the coordinates
of the top left cell currently in memmory in row,column. The amount of
rows and columns is also shown in rows x columns. These values can be
edited to move to a different area of the data source or to resize the
table. Tab will switch between the enties, return will move to the
currently entered range and resize the table if needed. Clicking the
goto button has the same effect.
<br><br>
A TGTable is created by first creating an appropriate
TVirtualTableInterface from the data that needs visualization and
then creating the TGTable using this interface.
<br><br>
A simple macro to use a TGTable with a TGSimpleTableInterface:
End_Html
Begin_Macro(source, gui)
{
   // Create an array to hold a bunch of numbers
   Int_t i = 0, j = 0;
   UInt_t nrows = 6, ncolumns = 5;
   Double_t** data = new Double_t*[nrows];
   for (i = 0; i < nrows; i++) {
      data[i] = new Double_t[ncolumns];
      for (j = 0; j < ncolumns; j++) {
         data[i][j] = 10 * i + j;
      }
   }

   // Create a main frame to contain the table
   TGMainFrame* mainframe = new TGMainFrame(0, 400, 200);
   mainframe->SetCleanup(kDeepCleanup) ;

   // Create an interface
   TGSimpleTableInterface *iface = new TGSimpleTableInterface(data, 6, 5);

   // Create the table
   TGTable *table = new TGTable(mainframe, 999, iface);

   // Add the table to the main frame
   mainframe->AddFrame(table, new TGLayoutHints(kLHintsExpandX | kLHintsExpandY));

   //Update data
   data[5][1] = 3.01;
   //update the table view
   table->Update();

   // Layout and map the main frame
   mainframe->SetWindowName("Tree Table Test") ;
   mainframe->MapSubwindows() ;
   mainframe->Layout();
   mainframe->Resize() ;
   mainframe->MapWindow() ;

   return mainframe;
}
End_Macro
Begin_Html

It is also possible to visualise data from a tree. A simple macro
showing the use of a TTreeTableInterface follows.
End_Html
Begin_Macro(source, gui)
{
   // Open a root file.
   TFile *file = new TFile("$ROOTSYS/tutorials/hsimple.root");
   // Load a tree from the file
   TNtuple *ntuple = (TNtuple *)file->Get("ntuple");

   // Create an interface
   TTreeTableInterface *iface = new TTreeTableInterface(ntuple);

   // Create a main frame to contain the table
   TGMainFrame* mainframe = new TGMainFrame(0, 400, 200);
   mainframe->SetCleanup(kDeepCleanup) ;

   // Create the table
   TGTable *table = new TGTable(mainframe, 999, iface, 10, 6);

   // Add the table to the main frame
   mainframe->AddFrame(table, new TGLayoutHints(kLHintsExpandX | kLHintsExpandY));

   // Set a selection
   iface->SetSelection("px > 0.");
   // Add a column
   iface->AddColumn("(px+py)/(px-py)", 0);
   //update the table view
   table->Update();

   // Layout and map the main frame
   mainframe->SetWindowName("Tree Table Test") ;
   mainframe->MapSubwindows() ;
   mainframe->Layout();
   mainframe->Resize() ;
   mainframe->MapWindow() ;

   return mainframe;
}
End_Macro
*/

// const TGGC *TGTable::fgDefaultSelectGC = 0;
// const TGGC *TGTable::fgDefaultBckgndGC = 0;
// const Int_t TGTable::fgDefaultTMode = kTextLeft | kTextTop;

// TList *TGTable::fgEditList = 0 ;

//______________________________________________________________________________
TGTable::TGTable(const TGWindow *p, Int_t id, TVirtualTableInterface *interface,
                 UInt_t nrows, UInt_t ncolumns)
   : TGCompositeFrame(p, 500, 500, kVerticalFrame), TGWidget(id), fRows(0),
     fRowHeaders(0), fColumnHeaders(0), fReadOnly(kFALSE), fSelectColor(0),
     fTMode(0), fAllData(kFALSE), fTableFrame(0), fCanvas(0), fCellWidth(80),
     fCellHeight(25), fInterface(interface)
{
   // TGTable constuctor.

   fCurrentRange = new TTableRange();
   fDataRange = new TTableRange();
   fGotoRange = new TTableRange();
   TGLayoutHints *hints = 0;
   fCellHintsList = new TList(hints);
   fRHdrHintsList = new TList(hints);
   fCHdrHintsList = new TList(hints);
   fMainHintsList = new TList(hints);

   // To be done: GetBackground colors for .rootrc
   SetBackgroundColor(GetWhitePixel());
   fEvenRowBackground = TColor::RGB2Pixel(204, 255, 204);
   fOddRowBackground  = TColor::RGB2Pixel(255, 255, 255);
   fHeaderBackground  = TColor::RGB2Pixel(204, 204, 255);

   fCurrentRange->fXbr = ncolumns;
   fCurrentRange->fYbr = nrows;

   Init();

   if(fInterface) SetInterface(fInterface, nrows, ncolumns);
   SetWindowName();
//    MapWindow();
}

//______________________________________________________________________________
TGTable::~TGTable()
{
   // TGTable destructor.

   // delete all cells in a good way
   UInt_t i = 0, j = 0;
   for (i = 0; i < GetNTableRows(); i++) {
      for (j = 0; j < GetNTableColumns(); j++) {
         delete GetCell(i,j);
      }
      delete fRows->At(i);
   }
   delete fRows;
   delete fRowHeaders;
   delete fColumnHeaders;

   delete fCurrentRange;
   delete fDataRange;
   delete fGotoRange;

   fCellHintsList->Delete();
   delete fCellHintsList;
   delete fRHdrHintsList;
   delete fCHdrHintsList;

   fMainHintsList->Delete();
   delete fMainHintsList;
}

//______________________________________________________________________________
void TGTable::Init()
{
   // Initialise the TGTable.

   UInt_t nrows = GetNTableRows();
   UInt_t ncolumns = GetNTableColumns();

   // Main layout frames
   fTopFrame = new TGHorizontalFrame(this, fWidth, fCellHeight);
   fTopExtraFrame = new TGHorizontalFrame(fTopFrame, fWidth - fCellWidth,
                                          fCellHeight);
   TGString *str = new TGString();
   *str += GetNTableRows();
   *str += "x";
   *str += GetNTableColumns();
   *str += " Table";
   fTableHeader = new TGTableHeader(fTopFrame, this, str, 0,
                                    kTableHeader);

   fBottomFrame = new TGHorizontalFrame(this, fWidth, fHeight - fCellHeight);
   fRHdrFrame = new TGTableHeaderFrame(fBottomFrame, this, fCellWidth,
                                       fHeight - fCellHeight, kRowHeader);
   fCHdrFrame = new TGTableHeaderFrame(fTopExtraFrame, this, fWidth - fCellWidth,
                                       fCellHeight, kColumnHeader);

   // Frame for the buttons at the bottom
   fButtonFrame = new TGHorizontalFrame(this, 200, 50);
   fNextButton = new TGTextButton(fButtonFrame, "Next", WidgetId() + 2000);
   fPrevButton = new TGTextButton(fButtonFrame, "Previous", WidgetId() + 2001);
   fUpdateButton = new TGTextButton(fButtonFrame, "Update", WidgetId() + 2002);

   fCanvas = new TGCanvas(fBottomFrame, ncolumns * fCellWidth,
                          nrows * fCellHeight, 0);
   fTableFrame = new TGTableFrame(fCanvas->GetViewPort(), nrows, ncolumns);
   fTableFrame->SetCanvas(fCanvas);
   fCanvas->SetContainer(fTableFrame->GetFrame());

   // Frame to display range info and goto button.
   fRangeFrame = new TGHorizontalFrame(this, 450, 50);
   fFirstCellLabel = new TGLabel(fRangeFrame, "Top left cell in range:");
   fRangeLabel = new TGLabel(fRangeFrame, "Range:");
   fFirstCellEntry = new TGTextEntry(fRangeFrame, "0,0", WidgetId() + 2050);
   fFirstCellEntry->SetWidth(100);
   fFirstCellEntry->SetAlignment(kTextRight);
   fFirstCellEntry->Connect("TextChanged(const char *)", "TGTable", this,
                            "UserRangeChange()");
   fFirstCellEntry->Connect("ReturnPressed()", "TGTable", this, "Goto()");

   TString range;
   range += GetNTableRows();
   range += "x";
   range += GetNTableColumns();
   fRangeEntry = new TGTextEntry(range, fRangeFrame, WidgetId() + 2051);
   fRangeEntry->SetWidth(100);
   fRangeEntry->SetAlignment(kTextRight);
   fRangeEntry->Connect("TextChanged(const char *)", "TGTable", this,
                        "UserRangeChange()");
   fRangeEntry->Connect("ReturnPressed()", "TGTable", this, "Goto()");
   fRangeEntry->Connect("TabPressed()", "TGTextEntry", fFirstCellEntry,
                            "SetFocus()");
   fFirstCellEntry->Connect("TabPressed()", "TGTextEntry", fRangeEntry,
                            "SetFocus()");

   fGotoRange->fXbr = GetNTableRows();
   fGotoRange->fYbr = GetNTableColumns();
   fGotoButton = new TGTextButton(fRangeFrame, "Goto", WidgetId() + 2003);
   fGotoButton->SetState(kButtonDisabled);

   // Set frame backgrounds
   fCHdrFrame->SetBackgroundColor(fBackground);
   fRHdrFrame->SetBackgroundColor(fBackground);
   fRangeFrame->SetBackgroundColor(fBackground);
   fTopFrame->SetBackgroundColor(fBackground);
   fTopExtraFrame->SetBackgroundColor(fBackground);
   fBottomFrame->SetBackgroundColor(fBackground);
   fButtonFrame->SetBackgroundColor(fBackground);
   fFirstCellLabel->SetBackgroundColor(fBackground);
   fRangeLabel->SetBackgroundColor(fBackground);

   // Create the cells needed
   UInt_t i = 0, j = 0;
   TGString *label = 0;
   fRowHeaders = new TObjArray(nrows);
   for(i = 0; i < nrows; i++) {
      TGTableHeader *hdr = new TGTableHeader(fRHdrFrame, this,
                                             label, i, kRowHeader);
      fRowHeaders->AddAt(hdr, i);
   }
   fColumnHeaders = new TObjArray(ncolumns);
   for(i = 0; i < ncolumns; i++) {
      TGTableHeader *hdr = new TGTableHeader(fCHdrFrame, this,
                                             label, i, kColumnHeader);
      fColumnHeaders->AddAt(hdr, i);
   }

   TGTableCell *cell = 0;
   TObjArray *row = 0;
   fRows = new TObjArray(nrows);
   for (i = 0; i < nrows; i++) {
      row = new TObjArray(ncolumns);
      fRows->AddAt(row, i);
      for (j = 0; j < ncolumns; j++) {
         cell = new TGTableCell(fCanvas->GetContainer(), this, label, i, j);
         row->AddAt(cell, j);
      }
   }

   // Check if the table covers all the data
   if ((GetNDataColumns() >= GetNTableColumns()) &&
       (GetNDataRows() >= GetNTableRows())) {
      fAllData = kTRUE;
   } else {
      fAllData = kFALSE;
   }

   TGLayoutHints *lhints = 0;

   // Add cells and headers to layout frames
   for (i = 0; i < nrows; i++) {
      lhints = new TGLayoutHints(kLHintsLeft | kLHintsTop);
      fRHdrHintsList->Add(lhints);
      fRHdrFrame->AddFrame(GetRowHeader(i), lhints);
      for (j = 0; j < ncolumns; j++) {
         if (i == 0) {
            lhints = new TGLayoutHints(kLHintsLeft | kLHintsTop);
            fCHdrHintsList->Add(lhints);
            fCHdrFrame->AddFrame(GetColumnHeader(j), lhints);
         }
         lhints = new TGLayoutHints(kLHintsLeft | kLHintsTop);
         fCellHintsList->Add(lhints);
         fCanvas->AddFrame(GetCell(i,j), lhints);
      }
   }

   // Add frames to the range frame
   lhints = new TGLayoutHints(kLHintsRight | kLHintsCenterY, 3, 30, 4, 4);
   fRangeFrame->AddFrame(fGotoButton, lhints);
   lhints = new TGLayoutHints(kLHintsRight |kLHintsCenterY, 3, 3, 4, 4);
   fRangeFrame->AddFrame(fRangeEntry, lhints);
   lhints = new TGLayoutHints(kLHintsRight |kLHintsCenterY, 3, 3, 4, 4);
   fRangeFrame->AddFrame(fRangeLabel, lhints);
   lhints = new TGLayoutHints(kLHintsRight |kLHintsCenterY, 3, 3, 4, 4);
   fRangeFrame->AddFrame(fFirstCellEntry, lhints);
   lhints = new TGLayoutHints(kLHintsRight |kLHintsCenterY, 3, 3, 4, 4);
   fRangeFrame->AddFrame(fFirstCellLabel, lhints);
   lhints = new TGLayoutHints(kLHintsRight |kLHintsTop);
   fRangeFrame->Resize();
   // Range frame size = 448
   AddFrame(fRangeFrame, lhints);

   // Add table to the main composite frame
   lhints = new TGLayoutHints(kLHintsLeft |kLHintsTop);
   fTopFrame->AddFrame(fTableHeader, lhints);
   lhints = new TGLayoutHints(kLHintsLeft | kLHintsExpandX | kLHintsTop);
   fTopExtraFrame->AddFrame(fCHdrFrame, lhints);
   lhints = new TGLayoutHints(kLHintsLeft | kLHintsExpandX | kLHintsTop);
   fTopFrame->AddFrame(fTopExtraFrame, lhints);
   lhints = new TGLayoutHints(kLHintsLeft | kLHintsTop | kLHintsExpandY);
   fBottomFrame->AddFrame(fRHdrFrame, lhints);
   lhints =  new TGLayoutHints(kLHintsLeft | kLHintsTop | kLHintsExpandX
                               | kLHintsExpandY);
   fBottomFrame->AddFrame(fCanvas, lhints);

   // Add buttons to button frame
   lhints = new TGLayoutHints(kLHintsRight | kLHintsCenterY, 3, 30, 4, 4);
   fButtonFrame->AddFrame(fNextButton, lhints);
   lhints = new TGLayoutHints(kLHintsRight | kLHintsCenterY, 3, 3, 4, 4);
   fButtonFrame->AddFrame(fPrevButton, lhints);
   lhints = new TGLayoutHints(kLHintsRight | kLHintsCenterY, 3, 30, 4, 4);
   fButtonFrame->AddFrame(fUpdateButton, lhints);
   fButtonFrame->Resize();
   fButtonFrame->ChangeOptions(fButtonFrame->GetOptions() | kFixedWidth);

   lhints = new TGLayoutHints(kLHintsLeft | kLHintsTop | kLHintsExpandX);
   AddFrame(fTopFrame, lhints);
   lhints = new TGLayoutHints(kLHintsLeft | kLHintsTop | kLHintsExpandX |
                              kLHintsExpandY);
   AddFrame(fBottomFrame, lhints);
   lhints = new TGLayoutHints(kLHintsExpandX | kLHintsTop);
   AddFrame(fButtonFrame, lhints);

   // Setup scrolling for the headers
   TGScrollBar *sbar= fCanvas->GetVScrollbar();
   sbar->Connect("PositionChanged(Int_t)", "TGTable", this, "ScrollRHeaders(Int_t)");
   sbar = fCanvas->GetHScrollbar();
   sbar->Connect("PositionChanged(Int_t)", "TGTable", this, "ScrollCHeaders(Int_t)");

   // Connections for buttons
   fUpdateButton->Connect("Clicked()", "TGTable", this, "Update()");
   fNextButton->Connect("Clicked()", "TGTable", this, "NextChunk()");
   fPrevButton->Connect("Clicked()", "TGTable", this, "PreviousChunk()");
   fGotoButton->Connect("Clicked()", "TGTable", this, "Goto()");

//    MapSubwindows();
//    Layout();
}

//______________________________________________________________________________
void TGTable::DoRedraw()
{
   // Redraw the TGTable.

   MapSubwindows();
   Layout();
}

//______________________________________________________________________________
void TGTable::Expand(UInt_t nrows, UInt_t ncolumns)
{
   // Expand a TGTable by nrows and ncolumns.

   ExpandRows(nrows);
   ExpandColumns(ncolumns);
}

//______________________________________________________________________________
void TGTable::ExpandColumns(UInt_t ncolumns)
{
   // Expand the columns of a TGTable by ncolumns.

   UInt_t i = 0, j = 0;
   TGString *label = 0;

   UInt_t ntrows = GetNTableRows();
   UInt_t ntcolumns = GetNTableColumns();

   fColumnHeaders->Expand(ntcolumns + ncolumns);

   for (i = 0; i < ncolumns; i++) {
      TGTableHeader *header = new TGTableHeader(fCHdrFrame, this, label,
                                                ntcolumns + i,
                                                kColumnHeader);
      fColumnHeaders->AddAt(header, ntcolumns + i);
   }

   for (i = 0; i < ntrows; i++) {
      GetRow(i)->Expand(ntcolumns + ncolumns);
      for (j = 0; j < ncolumns; j++) {
         TGTableCell *cell = new TGTableCell(fCanvas->GetContainer(), this, label, i,
                                             ntcolumns + j);
         if (GetRow(i)) GetRow(i)->AddAt(cell, ntcolumns + j);
      }
   }

   fCurrentRange->fXbr += ncolumns;

   if ((GetNDataColumns() == GetNTableColumns()) &&
       (GetNDataRows() == GetNTableRows())) {
      fAllData = kTRUE;
   } else {
      fAllData = kFALSE;
   }
}

//______________________________________________________________________________
void TGTable::ExpandRows(UInt_t nrows)
{
   // Expand the rows of a TGTable by nrows.

   UInt_t i = 0, j = 0;

   UInt_t ntrows = GetNTableRows();
   UInt_t ntcolumns = GetNTableColumns();

   fRows->Expand(ntrows + nrows);
   fRowHeaders->Expand(ntrows + nrows);
   for (i = 0; i < nrows; i++) {
      TObjArray *row = new TObjArray(ntcolumns);
      fRows->AddAt(row, ntrows + i);
      TGString *label = 0;
      TGTableHeader *header = new TGTableHeader(fRHdrFrame, this, label,
                                                ntrows + i, kRowHeader);
      fRowHeaders->AddAt(header, ntrows + i);
      for (j = 0; j < ntcolumns ; j++) {
         TGTableCell *cell = new TGTableCell(fCanvas->GetContainer(), this, label,
                                             ntrows + i, j);
         if (GetRow(ntrows + i)) GetRow(ntrows + i)->AddAt(cell, j);
      }
   }

   fCurrentRange->fYbr += nrows;

   if ((GetNDataColumns() == GetNTableColumns()) &&
       (GetNDataRows() == GetNTableRows())) {
      fAllData = kTRUE;
   } else {
      fAllData = kFALSE;
   }
}

//______________________________________________________________________________
UInt_t TGTable::GetCHdrWidth() const
{
   // Get the current width of the column header frame.

   Int_t ncolumns = GetNTableColumns();
   UInt_t width = 0;
   for (Int_t i = 0; i < ncolumns; i++) {
      if (GetColumnHeader(i)) width += GetColumnHeader(i)->GetWidth();
   }
   return width;
}

//______________________________________________________________________________
UInt_t TGTable::GetRHdrHeight() const
{
   // Get the current height of the row header frame.

   Int_t nrows = GetNTableRows();
   UInt_t height = 0;
   for (Int_t i = 0; i < nrows; i++) {
      if (GetRowHeader(i)) height += GetRowHeader(i)->GetHeight();
   }
   return height;
}

//______________________________________________________________________________
void TGTable::Shrink(UInt_t nrows, UInt_t ncolumns)
{
   // Shrink the TGTable by nrows and ncolumns.

   ShrinkRows(nrows);
   ShrinkColumns(ncolumns);
}

//______________________________________________________________________________
void TGTable::ShrinkColumns(UInt_t ncolumns)
{
   // Shrink the columns of the TGTable by ncolumns.

   UInt_t i = 0, j = 0, k = 0;

   if(GetNTableColumns() - ncolumns < 1) {
      Info("TGTable::ShrinkColumns", "Cannot shrink smaller than 1"
                                     " column, adjusting");
      ncolumns = GetNTableColumns() - 1;
   }

   UInt_t ntrows = GetNTableRows();
   UInt_t ntcolumns = GetNTableColumns();

   TGTableCell *cell = 0;

   //Destroy windows

   for (i = 0; i < ntrows; i++) {
      for (j = 0; j < ncolumns; j++) {
         k = ntcolumns - ncolumns + j;
         if (GetRow(i)) {
            cell = (TGTableCell *)GetRow(i)->RemoveAt(k);
            if (cell) {
               cell->DestroyWindow();
               delete cell;
            }
         }
      }
      GetRow(i)->Expand(ntcolumns - ncolumns);
   }

   TGTableHeader *hdr = 0;
   for (j = 0; j < ncolumns; j++) {
      hdr = (TGTableHeader *)fColumnHeaders->RemoveAt(ntcolumns - ncolumns + j);
      hdr->DestroyWindow();
      delete hdr;
   }
   fColumnHeaders->Expand(ntcolumns - ncolumns);

   fCurrentRange->fXbr -= ncolumns;


   if ((GetNDataColumns() == GetNTableColumns()) &&
       (GetNDataRows() == GetNTableRows())) {
      fAllData = kTRUE;
   } else {
      fAllData = kFALSE;
   }
}

//______________________________________________________________________________
void TGTable::ShrinkRows(UInt_t nrows)
{
   // Shrink the rows of the TGTable by nrows.

   UInt_t i = 0 , j = 0;

   if(GetNTableRows() - nrows < 1) {
      Info("TGTable::ShrinkRows", "Cannot shrink smaller than 1 row, adjusting");
      nrows = GetNTableRows() - 1;
   }

   UInt_t ntrows = GetNTableRows();
   UInt_t ntcolumns = GetNTableColumns();

   TObjArray *row = 0;
   TGTableCell *cell = 0;
   TGTableHeader *hdr = 0;

   for (i = 0; i < nrows; i++) {
      for (j = 0; j < ntcolumns ; j++) {
         if (GetRow(ntrows - nrows + i)) {
            cell = (TGTableCell *)GetRow(ntrows - nrows + i)->RemoveAt(j);
            if (cell) {
               cell->DestroyWindow();
               delete cell;
            }
         }
      }
      row = (TObjArray *)fRows->RemoveAt(ntrows - nrows + i);
      delete row;
      hdr = (TGTableHeader *)fRowHeaders->RemoveAt(ntrows - nrows + i);
      hdr->DestroyWindow();
      delete hdr;
   }
   fRows->Expand(ntrows - nrows);
   fRowHeaders->Expand(ntrows - nrows);

   fCurrentRange->fYbr -= nrows;

   if ((GetNDataColumns() == GetNTableColumns()) &&
       (GetNDataRows() == GetNTableRows())) {
      fAllData = kTRUE;
   } else {
      fAllData = kFALSE;
   }
}

//______________________________________________________________________________
void TGTable::UpdateHeaders(EHeaderType type)
{
   // Update the labels of the headers of the given type

   UInt_t max = 0, i = 0, d = 0;
   if(type == kColumnHeader) {
      max = GetNTableColumns();
      for (i = 0; i < max; i++) {
         d = fCurrentRange->fXtl + i;
         if (GetColumnHeader(i) && fInterface->GetColumnHeader(d))
            GetColumnHeader(i)->SetLabel(fInterface->GetColumnHeader(d));
      }
   } else if (type == kRowHeader) {
      max = GetNTableRows();
      for (i = 0; i < max; i++) {
         d = fCurrentRange->fYtl + i;
         if (GetRowHeader(i) && fInterface->GetRowHeader(d))
            GetRowHeader(i)->SetLabel(fInterface->GetRowHeader(d));
      }
   }
}

//______________________________________________________________________________
void TGTable::SetInterface(TVirtualTableInterface *interface,
                           UInt_t nrows, UInt_t ncolumns)
{
   // Set the interface that the TGTable uses to interface.

   fInterface = interface;

   // Set up ranges

   fDataRange->fXtl = 0;
   fDataRange->fYtl = 0;
   fDataRange->fXbr = fInterface->GetNColumns();
   fDataRange->fYbr = fInterface->GetNRows();

   UInt_t x = 0, y = 0;
   if (fDataRange->fXbr < ncolumns) {
      x = fDataRange->fXbr;
   } else {
      x = ncolumns;
   }

   if (fDataRange->fYbr < nrows) {
      y = fDataRange->fYbr;
   } else {
      y = nrows;
   }

   GotoTableRange(0, 0, x, y);

   if ((GetNDataColumns() == GetNTableColumns()) &&
       (GetNDataRows() == GetNTableRows())) {
      fAllData = kTRUE;
   } else {
      fAllData = kFALSE;
   }
}

//______________________________________________________________________________
void TGTable::ResizeTable(UInt_t newnrows, UInt_t newncolumns)
{
   // Resize the table to newnrows and newncolumns and add all the frames to
   // their parent frames.

   UInt_t oldnrows = GetNTableRows();
   UInt_t oldncolumns = GetNTableColumns();

   Int_t i = 0, j = 0;

   TGCompositeFrame *container = (TGCompositeFrame *)fCanvas->GetContainer();

   if (newnrows != oldnrows){
      if (newnrows > oldnrows) {
         ExpandRows(newnrows - oldnrows);
      } else {
         ShrinkRows(oldnrows - newnrows);
      }
   }

   if (newncolumns != oldncolumns){
      if (newncolumns > oldncolumns) {
         ExpandColumns(newncolumns - oldncolumns);
      } else {
         ShrinkColumns(oldncolumns - newncolumns);
      }
   }

   // Update the layoutmanager and add the frames.
   if ((newncolumns != oldncolumns) || (newnrows != oldnrows)) {
      container->RemoveAll();
      fCellHintsList->Delete();

      fRHdrFrame->RemoveAll();
      fRHdrHintsList->Delete();

      fCHdrFrame->RemoveAll();
      fCHdrHintsList->Delete();

      container->SetLayoutManager(new TGMatrixLayout(container,
                                                     newnrows, newncolumns));
      // Add frames to layout frames
      TGLayoutHints *lhints = 0;
      for (i = 0; i < (Int_t)newnrows; i++) {
         lhints = new TGLayoutHints(kLHintsLeft | kLHintsTop);
         fRHdrHintsList->Add(lhints);
         fRHdrFrame->AddFrame(GetRowHeader(i), lhints);
         for (j = 0; j < (Int_t)newncolumns; j++) {
            if (i == 0) {
               lhints = new TGLayoutHints(kLHintsLeft | kLHintsTop);
               fCHdrHintsList->Add(lhints);
               fCHdrFrame->AddFrame(GetColumnHeader(j), lhints);
            }
            lhints = new TGLayoutHints(kLHintsLeft | kLHintsTop);
            fCellHintsList->Add(lhints);
            fCanvas->AddFrame(GetCell(i,j), lhints);
         }
      }
   }
   fCanvas->MapSubwindows();
   fCanvas->Layout();
}

//______________________________________________________________________________
void TGTable::UpdateRangeFrame()
{
   // Update the range shown in the range frame.

   TString tl, range;

   tl += fCurrentRange->fYtl;
   tl += ",";
   tl += fCurrentRange->fXtl;
   fFirstCellEntry->SetText(tl.Data());

   range += GetNTableRows();
   range += "x";
   range += GetNTableColumns();
   fRangeEntry->SetText(range.Data());

   fGotoButton->SetState(kButtonDisabled);
}

//______________________________________________________________________________
TObjArray *TGTable::GetRow(UInt_t row)
{
   // Get row. NOTE: Do not delete the TObjArray returned or the cells
   // it contains, they are owned by the TGTable.

   return (TObjArray *)fRows->At(row);
}

//______________________________________________________________________________
TObjArray *TGTable::GetColumn(UInt_t column)
{
   // Return a pointer to a TObjArray that contains pointers to all
   // the cells in column. NOTE: The user will have to delete the
   // TObjArray, but do NOT delete the cells it contains, they are
   // owned by the TGTable and will be deleted from the TGTable with
   // undefined consequenses.

   UInt_t nrows = GetNTableRows();

   TObjArray *col = new TObjArray(nrows);
   for(UInt_t ui = 0; ui < nrows; ui++) {
      col->AddAt(GetCell(ui, column), ui);
   }
   return col;
}

// //______________________________________________________________________________
// void TGTable::Select(TGTableCell *celltl, TGTableCell *cellbr)
// {
// }

// //______________________________________________________________________________
// void TGTable::Select(UInt_t xcelltl, UInt_t ycelltl, UInt_t xcell2, UInt_t ycell2)
// {
// }

// //______________________________________________________________________________
// void TGTable::SelectAll()
// {
// }

// //______________________________________________________________________________
// void TGTable::SelectRow(TGTableCell *cell)
// {
// }

// //______________________________________________________________________________
// void TGTable::SelectRow(UInt_t row)
// {
// }

// //______________________________________________________________________________
// void TGTable::SelectRows(UInt_t row, UInt_t nrows)
// {
// }

// //______________________________________________________________________________
// void TGTable::SelectColumn(TGTableCell *cell)
// {
// }

// //______________________________________________________________________________
// void TGTable::SelectColumn(UInt_t column)
// {
// }

// //______________________________________________________________________________
// void TGTable::SelectColumns(UInt_t column, UInt_t ncolumns)
// {
// }

// //______________________________________________________________________________
// void TGTable::SetBckgndGC(TGGC *gc)
// {
// }

// //______________________________________________________________________________
// void TGTable::SetSelectGC(TGGC *gc)
// {
// }

// //______________________________________________________________________________
// void TGTable::SetTextJustify(Int_t tmode)
// {
// }

//______________________________________________________________________________
const TGTableCell* TGTable::GetCell(UInt_t i, UInt_t j) const
{
   // Const version of GetCell().

   return const_cast<TGTable *>(this)->GetCell(i, j);
}

//______________________________________________________________________________
TGTableCell* TGTable::GetCell(UInt_t i, UInt_t j)
{
   // Return a pointer to the TGTableCell at position i,j.

   TObjArray *row = (TObjArray *)fRows->At(i);
   if(row) {
      TGTableCell *cell = (TGTableCell *)row->At(j);
      return cell;
   } else {
      return 0;
   }
}

//______________________________________________________________________________
const TGTableCell* TGTable::FindCell(TGString label) const
{
   // Const version of FindCell().

   return const_cast<TGTable *>(this)->FindCell(label);
}

//______________________________________________________________________________
TGTableCell* TGTable::FindCell(TGString label)
{
   // Find the TGTableCell with label.

   TObjArray *row = 0;
   TGTableCell *cell = 0;
   UInt_t i = 0, j = 0;
   //continue here
   UInt_t nrows = GetNTableRows();
   UInt_t ncolumns = GetNTableColumns();
   for (i = 0; i < nrows; i++) {
      for (j = 0; j < ncolumns; j++) {
         row = (TObjArray *)fRows->At(j);
         cell = (TGTableCell *)row->At(i);
         if (*(cell->GetLabel()) == label) {
            return cell;
         }
      }
   }
   return 0;
}

//______________________________________________________________________________
void TGTable::Show()
{
   // Show the contents of the TGTable in stdout.

   TGTableCell *cell = 0;
   TGTableHeader *hdr = 0;
   UInt_t i = 0, j = 0;
   UInt_t nrows = GetNTableRows();
   UInt_t ncolumns = GetNTableColumns();

   // save actual formatting flags
   std::ios_base::fmtflags org_flags = std::cout.flags();

   for (j = 0; j < ncolumns + 1; j++) {
      if (j == 0) {
         hdr = fTableHeader;
         if (hdr) std::cout << " " << std::setw(12) << std::right
                            << hdr->GetLabel()->GetString() << " ";
      } else {
         hdr = GetColumnHeader(j - 1);
         if (hdr) std::cout << " " << std::setw(12) << std::right
                            << hdr->GetLabel()->GetString() << " ";
      }
   }
   std::cout << std::endl;

   for (i = 0; i < nrows; i++) {
      for (j = 0; j < ncolumns + 1; j++) {
         if (j == 0) {
            hdr = GetRowHeader(i);
            if (hdr) std::cout << " " << std::setw(12) << std::right
                               << hdr->GetLabel()->GetString() << " ";
         } else {
            cell = GetCell(i, j - 1);
            if (cell) std::cout << " " << std::setw(12) << std::right
                                << cell->GetLabel()->GetString() << " ";
         }
      }
      std::cout << std::endl;
   }
   // restore original formatting flags
   std::cout.flags(org_flags);
}

// //______________________________________________________________________________
// void TGTable::InsertRowBefore(UInt_t row, UInt_t nrows)
// {
// }

// //______________________________________________________________________________
// void TGTable::InsertRowBefore(TGString label, UInt_t nrows)
// {
// }

// //______________________________________________________________________________
// void TGTable::InsertRowAfter(UInt_t row, UInt_t nrows)
// {
// }

// //______________________________________________________________________________
// void TGTable::InsertRowAfter(TGString label, UInt_t nrows)
// {
// }

// //______________________________________________________________________________
// void TGTable::InsertRowAt(UInt_t row, UInt_t nrows)
// {
// }

// //______________________________________________________________________________
// void TGTable::InsertRowAt(TGString label, UInt_t nrows)
// {
// }

// //______________________________________________________________________________
// void TGTable::InsertColumnBefore(UInt_t column, UInt_t ncolumns)
// {
// }

// //______________________________________________________________________________
// void TGTable::InsertColumnBefore(TGString label, UInt_t ncolumns)
// {
// }

// //______________________________________________________________________________
// void TGTable::InsertColumnAfter(UInt_t column, UInt_t ncolumns)
// {
// }

// //______________________________________________________________________________
// void TGTable::InsertColumnAfter(TGString label, UInt_t ncolumns)
// {
// }

// //______________________________________________________________________________
// void TGTable::InsertColumnAt(UInt_t column, UInt_t ncolumns)
// {
// }

// //______________________________________________________________________________
// void TGTable::InsertColumnAt(TGString label, UInt_t ncolumns)
// {
// }

// //______________________________________________________________________________
// void TGTable::RemoveRows(UInt_t row, UInt_t nrows)
// {
// }

// //______________________________________________________________________________
// void TGTable::RemoveColumns(UInt_t column, UInt_t ncolumns)
// {
// }

//______________________________________________________________________________
void TGTable::UpdateView()
{
   // Update and layout the visible part of the TGTable.

   UInt_t nrows = GetNTableRows();
   UInt_t ncolumns = GetNTableColumns();

   TGString *str = new TGString();
   *str += nrows;
   *str += "x";
   *str += ncolumns;
   *str += " Table";
   fTableHeader->SetLabel(str->GetString());
   delete str;

   UpdateHeaders(kRowHeader);
   UpdateHeaders(kColumnHeader);

   UInt_t i = 0, j = 0;
   UInt_t k = 0, l = 0;

   TGTableCell * cell = 0;
   for (i = 0; i < nrows; i++) {
      for (j = 0; j < ncolumns; j++) {
         cell = GetCell(i,j);
         k = fCurrentRange->fYtl + i;
         l = fCurrentRange->fXtl + j;

         const char *label = fInterface->GetValueAsString(k,l);
         if(cell) cell->SetLabel(label);
      }
   }

   MapSubwindows();
   Layout();
   gClient->NeedRedraw(fTableHeader);
   TGViewPort *vp = fCanvas->GetViewPort();
   fTableFrame->DrawRegion(0, 0, vp->GetWidth(), vp->GetHeight());
   fCHdrFrame->DrawRegion(0, 0, fCHdrFrame->GetWidth(), fCHdrFrame->GetHeight());
   fRHdrFrame->DrawRegion(0, 0, fRHdrFrame->GetWidth(), fRHdrFrame->GetHeight());

   UpdateRangeFrame();
}

//______________________________________________________________________________
UInt_t TGTable::GetNTableRows() const
{
   // Return the amount of rows in the table.

   return fCurrentRange->fYbr - fCurrentRange->fYtl;
}

//______________________________________________________________________________
UInt_t TGTable::GetNDataRows() const
{
   // Return the amount of rows in the data source.

   return fDataRange->fYbr - fDataRange->fYtl;
}

//______________________________________________________________________________
UInt_t TGTable::GetNTableColumns() const
{
   // Return the amount of columns in the table.

   return fCurrentRange->fXbr - fCurrentRange->fXtl;
}

//______________________________________________________________________________
UInt_t TGTable::GetNDataColumns() const
{
   // Return the amount of columns in the data source.

   return fDataRange->fYbr - fDataRange->fYtl;
}

//______________________________________________________________________________
UInt_t TGTable::GetNTableCells() const
{
   // Return the amount of cells in the table.

   return GetNTableRows() * GetNTableColumns();
}

//______________________________________________________________________________
UInt_t TGTable::GetNDataCells() const
{
   // Return the amount of cell in the data source.

   return GetNDataRows() * GetNDataColumns();
}

//______________________________________________________________________________
const TTableRange *TGTable::GetCurrentRange() const
{
   // Return the current range of the TGTable.

   return fCurrentRange;
}

//______________________________________________________________________________
const TGTableHeader *TGTable::GetRowHeader(const UInt_t row) const
{
   // Const version of GetRowHeader();

   return const_cast<TGTable *>(this)->GetRowHeader(row);
}

//______________________________________________________________________________
TGTableHeader *TGTable::GetRowHeader(const UInt_t row)
{
   // Return a pointer to the header of row.

   return (TGTableHeader *)fRowHeaders->At(row);
}

//______________________________________________________________________________
const TGTableHeader *TGTable::GetColumnHeader(const UInt_t column) const
{
   // Const version of GetColumnHeader();

   return const_cast<TGTable *>(this)->GetColumnHeader(column);
}

//______________________________________________________________________________
TGTableHeader *TGTable::GetColumnHeader(const UInt_t column)
{
   // Return a pointer to the header of column.

   return (TGTableHeader *)fColumnHeaders->At(column);
}

//______________________________________________________________________________
TGTableHeader *TGTable::GetTableHeader()
{
   // Return a pointer to the table header.

   return fTableHeader;
}

// //______________________________________________________________________________
// const TGGC*  TGTable::GetSelectGC() const
// {
// }

// //______________________________________________________________________________
// const TGGC*  TGTable::GetCellBckgndGC(TGTableCell *cell) const
// {
// }

// //______________________________________________________________________________
// const TGGC*  TGTable::GetCellBckgndGC(UInt_t row, UInt_t column) const
// {
// }

//______________________________________________________________________________
Pixel_t TGTable::GetRowBackground(UInt_t row) const
{
   // Get the background collor for row.

   if (row % 2 == 0) { // Even rows
      return fEvenRowBackground;
   } else {            // Odd rows
      return fOddRowBackground;
   }
}

//______________________________________________________________________________
Pixel_t TGTable::GetHeaderBackground() const
{
   // Get the background color of headers.

   return fHeaderBackground;
}

//______________________________________________________________________________
void TGTable::SetOddRowBackground(Pixel_t pixel)
{
   // Set the background color for all odd numbered rows.

   if(pixel == fOddRowBackground) return;

   fOddRowBackground = pixel;

   UInt_t nrows = GetNTableRows();
   UInt_t ncolumns = GetNTableColumns();
   UInt_t i = 0, j = 0;
   TGTableCell *cell = 0;

   for (i = 0; i < nrows; i++) {
      for (j = 0; j < ncolumns; j++) {
         if (i % 2) {
            cell = GetCell(i,j);
            if (cell) cell->SetBackgroundColor(fOddRowBackground);
         }
      }
   }

   UInt_t width = fCanvas->GetViewPort()->GetWidth();
   UInt_t height = fCanvas->GetViewPort()->GetHeight();
   fTableFrame->DrawRegion(0, 0, width, height);
}

//______________________________________________________________________________
void TGTable::SetEvenRowBackground(Pixel_t pixel)
{
   // Set the background color for all even numbered rows.

   if(pixel == fEvenRowBackground) return;

   fEvenRowBackground = pixel;

   UInt_t nrows = GetNTableRows();
   UInt_t ncolumns = GetNTableColumns();
   UInt_t i = 0, j = 0;
   TGTableCell *cell = 0;

   for (i = 0; i < nrows; i++) {
      for (j = 0; j < ncolumns; j++) {
         if (!(i % 2)) {
            cell = GetCell(i,j);
            if (cell) cell->SetBackgroundColor(fEvenRowBackground);
         }
      }
   }
   UInt_t width = fCanvas->GetViewPort()->GetWidth();
   UInt_t height = fCanvas->GetViewPort()->GetHeight();
   fTableFrame->DrawRegion(0, 0, width, height);
}

//______________________________________________________________________________
void TGTable::SetHeaderBackground(Pixel_t pixel)
{
   // Set the background color for the headers.

   if(pixel == fHeaderBackground) return;

   fHeaderBackground = pixel;

   UInt_t nrows = GetNTableRows();
   UInt_t ncolumns = GetNTableColumns();
   UInt_t i = 0, j = 0;
   TGTableHeader *hdr = 0;

   for (i = 0; i < nrows; i++) {
      hdr = GetRowHeader(i);
      if (hdr) hdr->SetBackgroundColor(fHeaderBackground);
   }
   UInt_t height = fCanvas->GetViewPort()->GetHeight();
   UInt_t width = fTableHeader->GetWidth();
   fRHdrFrame->DrawRegion(0, 0, width, height);

   for (j = 0; j < ncolumns; j++) {
      hdr = GetColumnHeader(j);
      if (hdr) hdr->SetBackgroundColor(fHeaderBackground);
//       gClient->NeedRedraw(hdr);
   }
   width = fCanvas->GetViewPort()->GetWidth();
   height = fTableHeader->GetHeight();
   fCHdrFrame->DrawRegion(0, 0, width, height);
}

//______________________________________________________________________________
void TGTable::SetDefaultColors()
{
   // Set the background color for all rows and headers to their defaults.

   SetEvenRowBackground(TColor::RGB2Pixel(204, 255, 204));
   SetOddRowBackground(TColor::RGB2Pixel(255, 255, 255));
   SetHeaderBackground(TColor::RGB2Pixel(204, 204, 255));
}

//______________________________________________________________________________
void TGTable::MoveTable(Int_t rows, Int_t columns)
{
   // Move and layout the table to the specified range.

   if (fAllData) return;

   Int_t xtl = fCurrentRange->fXtl + columns;
   Int_t ytl = fCurrentRange->fYtl + rows;
   Int_t xbr = fCurrentRange->fXbr + columns;
   Int_t ybr = fCurrentRange->fYbr + rows;

   GotoTableRange(xtl, ytl, xbr, ybr);
}

//______________________________________________________________________________
void TGTable::GotoTableRange(Int_t xtl,  Int_t ytl, Int_t xbr,  Int_t ybr)
{
   // Move and resize the table to the specified range.

   if (fAllData) return;

   if(xtl == xbr || ytl == ybr) {
      Error("TGTable::GotoTableRange","x or y range = 0");
      return;
   }

   Int_t nrows    = TMath::Abs(ybr - ytl);
   Int_t ncolumns = TMath::Abs(xbr - xtl);

   if (xtl > xbr) {
      Info("TGTable::GotoTableRange","Swapping x-range boundries");
      Int_t temp = xtl;
      xtl = xbr;
      xbr = temp;
   }
   if (ytl > ybr) {
      Info("TGTable::GotoTableRange","Swapping y-range boundries");
      Int_t temp = ytl;
      ytl = ybr;
      ybr = temp;
   }

   if((xtl < 0) || (xbr < 0)) {
      Info("TGTable::GotoTableRange", "Column boundry out of bounds, adjusting");
      xtl = 0;
      xbr = ncolumns;
      if (xbr > (Int_t)fDataRange->fXbr) {
         xbr = fDataRange->fXbr;
         ncolumns = TMath::Abs(xbr - xtl);
      }
   }

   if((ytl < 0) || (ybr < 0)) {
      Info("TGTable::GotoTableRange", "Row boundry out of bounds, adjusting");
      ytl = 0;
      ybr = nrows;
      if (ybr > (Int_t)fDataRange->fYbr) {
         ybr = fDataRange->fYbr;
         nrows =  TMath::Abs(ybr - ytl);
      }
   }

   if((xtl > (Int_t)fDataRange->fXbr) || (xbr > (Int_t)fDataRange->fXbr)) {
      Info("TGTable::GotoTableRange", "Left Column boundry out of bounds, "
           "adjusting");
      xbr = fDataRange->fXbr;
      xtl = xbr - ncolumns;
      if (xtl < 0) {
         xtl = 0;
         ncolumns = TMath::Abs(xbr - xtl);
         Info("TGTable::GotoTableRange", "Right column boundry out of"
                                         " bounds, set to 0");
      }
   }
   if ((ytl > (Int_t)fDataRange->fYbr) || (ybr > (Int_t)fDataRange->fYbr)) {
      Info("TGTable::GotoTableRange", "Bottom row boundry out of bounds, "
                                      "adjusting");
      ybr = fDataRange->fYbr;
      ytl = ybr - nrows;
      if (ytl < 0) {
         ytl = 0;
         nrows = ybr - ytl;
         Info("TGTable::GotoTableRange", "Top row boundry out of bounds, "
                                         "set to 0");
      }
   }

   nrows    = TMath::Abs(ybr - ytl);
   ncolumns = TMath::Abs(xbr - xtl);

   // Resize rows and columns if needed
   ResizeTable(nrows, ncolumns);

   fCurrentRange->fXtl = xtl;
   fCurrentRange->fYtl = ytl;
   fCurrentRange->fXbr = xbr;
   fCurrentRange->fYbr = ybr;

   // Update the table view.
   UpdateView();
}

//______________________________________________________________________________
TGTableCell *TGTable::operator() (UInt_t row, UInt_t column)
{
   // Operator for easy cell acces.

   return GetCell(row, column);
}

//______________________________________________________________________________
void TGTable::ScrollCHeaders(Int_t xpos)
{
   // Scroll the column headers horizontally.

   if (!fCHdrFrame) return;

   fCHdrFrame->Move(- xpos, 0);
   fCHdrFrame->Resize();
   fCHdrFrame->DrawRegion(0, 0, fCHdrFrame->GetWidth(),
                          fCHdrFrame->GetHeight());
}

//______________________________________________________________________________
void TGTable::ScrollRHeaders(Int_t ypos)
{
   // Scroll the row headers vertically

   if (!fRHdrFrame) return;

   fRHdrFrame->Move(fRHdrFrame->GetX(), -ypos);
   fRHdrFrame->Resize();
   fRHdrFrame->DrawRegion(0, 0, fRHdrFrame->GetWidth(),
                          fRHdrFrame->GetHeight());
}

//______________________________________________________________________________
void TGTable::NextChunk()
{
   // Move the table to the next chunk of the data set with the same size.

   MoveTable(GetNTableRows(), 0);
   UpdateRangeFrame();
}

//______________________________________________________________________________
void TGTable::PreviousChunk()
{
   // Move the table to the previous chunk of the data set with the same size.

   MoveTable(-1 * (Int_t)GetNTableRows(), 0);
   UpdateRangeFrame();
}

//______________________________________________________________________________
void TGTable::Goto()
{
   // Slot used by the Goto button and whenever return is pressed in
   // on of the text entries in the range frame.

   if (fGotoButton->GetState() == kButtonUp) {
      GotoTableRange(fGotoRange->fXtl, fGotoRange->fYtl,
                     fGotoRange->fXbr, fGotoRange->fYbr);
      UpdateRangeFrame();
   }
}

//______________________________________________________________________________
void TGTable::UserRangeChange()
{
   // Slot used when the text in one of the range frame text entries changes.

   TString topleft(fFirstCellEntry->GetText());
   if(!topleft.Contains(",")) return;

   Int_t pos = topleft.First(',');
   TString itl = topleft(0,pos);
   TString jtl = topleft(pos+1, topleft.Length());

   if (itl.Contains(' ') || itl.Contains('\t') ||
       jtl.Contains(' ') || jtl.Contains('\t')) return;

   if (!itl.IsAlnum() || !jtl.IsAlnum()) return;

   fGotoRange->fXtl = jtl.Atoi();
   fGotoRange->fYtl = itl.Atoi();

   TString range(fRangeEntry->GetText());
   if(!range.Contains("x")) return;

   pos = 0;
   pos = range.First('x');
   TString ir = range(0,pos);
   TString jr = range(pos+1, range.Length());

   if (ir.Contains(' ') || ir.Contains('\t') ||
       jr.Contains(' ') || jr.Contains('\t')) return;
   if (!ir.IsAlnum() || !jr.IsAlnum()) return;

   fGotoRange->fXbr = jtl.Atoi() + jr.Atoi();
   fGotoRange->fYbr = itl.Atoi() + ir.Atoi();

   if (*fGotoRange == *fCurrentRange) {
      fGotoButton->SetState(kButtonDisabled);
   } else {
      fGotoButton->SetState(kButtonUp);
   }

}

//______________________________________________________________________________
void TGTable::Update()
{
   // Update the range of the available data and refresh the current view.

   fDataRange->fXbr = fInterface->GetNColumns();
   fDataRange->fYbr = fInterface->GetNRows();

   GotoTableRange(fCurrentRange->fXtl, fCurrentRange->fYtl,
                  fCurrentRange->fXbr, fCurrentRange->fYbr);

   UpdateView();
}

//______________________________________________________________________________
TTableRange::TTableRange() : fXtl(0), fYtl(0), fXbr(0), fYbr(0)
{
   // TTableRange constuctor.
}

//______________________________________________________________________________
void TTableRange::Print()
{
   // Print the values of a range.

   std::cout << "Range = (" << fXtl << "," << fYtl << ")->("
             << fXbr << "," << fYbr << ")" << std::endl;
}

//______________________________________________________________________________
Bool_t TTableRange::operator==(TTableRange &other)
{
   // Operator to determine if 2 ranges are equal

   if ((fXtl == other.fXtl) && (fYtl == other.fYtl) &&
       (fXbr == other.fXbr) && (fYbr == other.fYbr)) {
      return kTRUE;
   } else {
      return kFALSE;
   }
}
 TGTable.cxx:1
 TGTable.cxx:2
 TGTable.cxx:3
 TGTable.cxx:4
 TGTable.cxx:5
 TGTable.cxx:6
 TGTable.cxx:7
 TGTable.cxx:8
 TGTable.cxx:9
 TGTable.cxx:10
 TGTable.cxx:11
 TGTable.cxx:12
 TGTable.cxx:13
 TGTable.cxx:14
 TGTable.cxx:15
 TGTable.cxx:16
 TGTable.cxx:17
 TGTable.cxx:18
 TGTable.cxx:19
 TGTable.cxx:20
 TGTable.cxx:21
 TGTable.cxx:22
 TGTable.cxx:23
 TGTable.cxx:24
 TGTable.cxx:25
 TGTable.cxx:26
 TGTable.cxx:27
 TGTable.cxx:28
 TGTable.cxx:29
 TGTable.cxx:30
 TGTable.cxx:31
 TGTable.cxx:32
 TGTable.cxx:33
 TGTable.cxx:34
 TGTable.cxx:35
 TGTable.cxx:36
 TGTable.cxx:37
 TGTable.cxx:38
 TGTable.cxx:39
 TGTable.cxx:40
 TGTable.cxx:41
 TGTable.cxx:42
 TGTable.cxx:43
 TGTable.cxx:44
 TGTable.cxx:45
 TGTable.cxx:46
 TGTable.cxx:47
 TGTable.cxx:48
 TGTable.cxx:49
 TGTable.cxx:50
 TGTable.cxx:51
 TGTable.cxx:52
 TGTable.cxx:53
 TGTable.cxx:54
 TGTable.cxx:55
 TGTable.cxx:56
 TGTable.cxx:57
 TGTable.cxx:58
 TGTable.cxx:59
 TGTable.cxx:60
 TGTable.cxx:61
 TGTable.cxx:62
 TGTable.cxx:63
 TGTable.cxx:64
 TGTable.cxx:65
 TGTable.cxx:66
 TGTable.cxx:67
 TGTable.cxx:68
 TGTable.cxx:69
 TGTable.cxx:70
 TGTable.cxx:71
 TGTable.cxx:72
 TGTable.cxx:73
 TGTable.cxx:74
 TGTable.cxx:75
 TGTable.cxx:76
 TGTable.cxx:77
 TGTable.cxx:78
 TGTable.cxx:79
 TGTable.cxx:80
 TGTable.cxx:81
 TGTable.cxx:82
 TGTable.cxx:83
 TGTable.cxx:84
 TGTable.cxx:85
 TGTable.cxx:86
 TGTable.cxx:87
 TGTable.cxx:88
 TGTable.cxx:89
 TGTable.cxx:90
 TGTable.cxx:91
 TGTable.cxx:92
 TGTable.cxx:93
 TGTable.cxx:94
 TGTable.cxx:95
 TGTable.cxx:96
 TGTable.cxx:97
 TGTable.cxx:98
 TGTable.cxx:99
 TGTable.cxx:100
 TGTable.cxx:101
 TGTable.cxx:102
 TGTable.cxx:103
 TGTable.cxx:104
 TGTable.cxx:105
 TGTable.cxx:106
 TGTable.cxx:107
 TGTable.cxx:108
 TGTable.cxx:109
 TGTable.cxx:110
 TGTable.cxx:111
 TGTable.cxx:112
 TGTable.cxx:113
 TGTable.cxx:114
 TGTable.cxx:115
 TGTable.cxx:116
 TGTable.cxx:117
 TGTable.cxx:118
 TGTable.cxx:119
 TGTable.cxx:120
 TGTable.cxx:121
 TGTable.cxx:122
 TGTable.cxx:123
 TGTable.cxx:124
 TGTable.cxx:125
 TGTable.cxx:126
 TGTable.cxx:127
 TGTable.cxx:128
 TGTable.cxx:129
 TGTable.cxx:130
 TGTable.cxx:131
 TGTable.cxx:132
 TGTable.cxx:133
 TGTable.cxx:134
 TGTable.cxx:135
 TGTable.cxx:136
 TGTable.cxx:137
 TGTable.cxx:138
 TGTable.cxx:139
 TGTable.cxx:140
 TGTable.cxx:141
 TGTable.cxx:142
 TGTable.cxx:143
 TGTable.cxx:144
 TGTable.cxx:145
 TGTable.cxx:146
 TGTable.cxx:147
 TGTable.cxx:148
 TGTable.cxx:149
 TGTable.cxx:150
 TGTable.cxx:151
 TGTable.cxx:152
 TGTable.cxx:153
 TGTable.cxx:154
 TGTable.cxx:155
 TGTable.cxx:156
 TGTable.cxx:157
 TGTable.cxx:158
 TGTable.cxx:159
 TGTable.cxx:160
 TGTable.cxx:161
 TGTable.cxx:162
 TGTable.cxx:163
 TGTable.cxx:164
 TGTable.cxx:165
 TGTable.cxx:166
 TGTable.cxx:167
 TGTable.cxx:168
 TGTable.cxx:169
 TGTable.cxx:170
 TGTable.cxx:171
 TGTable.cxx:172
 TGTable.cxx:173
 TGTable.cxx:174
 TGTable.cxx:175
 TGTable.cxx:176
 TGTable.cxx:177
 TGTable.cxx:178
 TGTable.cxx:179
 TGTable.cxx:180
 TGTable.cxx:181
 TGTable.cxx:182
 TGTable.cxx:183
 TGTable.cxx:184
 TGTable.cxx:185
 TGTable.cxx:186
 TGTable.cxx:187
 TGTable.cxx:188
 TGTable.cxx:189
 TGTable.cxx:190
 TGTable.cxx:191
 TGTable.cxx:192
 TGTable.cxx:193
 TGTable.cxx:194
 TGTable.cxx:195
 TGTable.cxx:196
 TGTable.cxx:197
 TGTable.cxx:198
 TGTable.cxx:199
 TGTable.cxx:200
 TGTable.cxx:201
 TGTable.cxx:202
 TGTable.cxx:203
 TGTable.cxx:204
 TGTable.cxx:205
 TGTable.cxx:206
 TGTable.cxx:207
 TGTable.cxx:208
 TGTable.cxx:209
 TGTable.cxx:210
 TGTable.cxx:211
 TGTable.cxx:212
 TGTable.cxx:213
 TGTable.cxx:214
 TGTable.cxx:215
 TGTable.cxx:216
 TGTable.cxx:217
 TGTable.cxx:218
 TGTable.cxx:219
 TGTable.cxx:220
 TGTable.cxx:221
 TGTable.cxx:222
 TGTable.cxx:223
 TGTable.cxx:224
 TGTable.cxx:225
 TGTable.cxx:226
 TGTable.cxx:227
 TGTable.cxx:228
 TGTable.cxx:229
 TGTable.cxx:230
 TGTable.cxx:231
 TGTable.cxx:232
 TGTable.cxx:233
 TGTable.cxx:234
 TGTable.cxx:235
 TGTable.cxx:236
 TGTable.cxx:237
 TGTable.cxx:238
 TGTable.cxx:239
 TGTable.cxx:240
 TGTable.cxx:241
 TGTable.cxx:242
 TGTable.cxx:243
 TGTable.cxx:244
 TGTable.cxx:245
 TGTable.cxx:246
 TGTable.cxx:247
 TGTable.cxx:248
 TGTable.cxx:249
 TGTable.cxx:250
 TGTable.cxx:251
 TGTable.cxx:252
 TGTable.cxx:253
 TGTable.cxx:254
 TGTable.cxx:255
 TGTable.cxx:256
 TGTable.cxx:257
 TGTable.cxx:258
 TGTable.cxx:259
 TGTable.cxx:260
 TGTable.cxx:261
 TGTable.cxx:262
 TGTable.cxx:263
 TGTable.cxx:264
 TGTable.cxx:265
 TGTable.cxx:266
 TGTable.cxx:267
 TGTable.cxx:268
 TGTable.cxx:269
 TGTable.cxx:270
 TGTable.cxx:271
 TGTable.cxx:272
 TGTable.cxx:273
 TGTable.cxx:274
 TGTable.cxx:275
 TGTable.cxx:276
 TGTable.cxx:277
 TGTable.cxx:278
 TGTable.cxx:279
 TGTable.cxx:280
 TGTable.cxx:281
 TGTable.cxx:282
 TGTable.cxx:283
 TGTable.cxx:284
 TGTable.cxx:285
 TGTable.cxx:286
 TGTable.cxx:287
 TGTable.cxx:288
 TGTable.cxx:289
 TGTable.cxx:290
 TGTable.cxx:291
 TGTable.cxx:292
 TGTable.cxx:293
 TGTable.cxx:294
 TGTable.cxx:295
 TGTable.cxx:296
 TGTable.cxx:297
 TGTable.cxx:298
 TGTable.cxx:299
 TGTable.cxx:300
 TGTable.cxx:301
 TGTable.cxx:302
 TGTable.cxx:303
 TGTable.cxx:304
 TGTable.cxx:305
 TGTable.cxx:306
 TGTable.cxx:307
 TGTable.cxx:308
 TGTable.cxx:309
 TGTable.cxx:310
 TGTable.cxx:311
 TGTable.cxx:312
 TGTable.cxx:313
 TGTable.cxx:314
 TGTable.cxx:315
 TGTable.cxx:316
 TGTable.cxx:317
 TGTable.cxx:318
 TGTable.cxx:319
 TGTable.cxx:320
 TGTable.cxx:321
 TGTable.cxx:322
 TGTable.cxx:323
 TGTable.cxx:324
 TGTable.cxx:325
 TGTable.cxx:326
 TGTable.cxx:327
 TGTable.cxx:328
 TGTable.cxx:329
 TGTable.cxx:330
 TGTable.cxx:331
 TGTable.cxx:332
 TGTable.cxx:333
 TGTable.cxx:334
 TGTable.cxx:335
 TGTable.cxx:336
 TGTable.cxx:337
 TGTable.cxx:338
 TGTable.cxx:339
 TGTable.cxx:340
 TGTable.cxx:341
 TGTable.cxx:342
 TGTable.cxx:343
 TGTable.cxx:344
 TGTable.cxx:345
 TGTable.cxx:346
 TGTable.cxx:347
 TGTable.cxx:348
 TGTable.cxx:349
 TGTable.cxx:350
 TGTable.cxx:351
 TGTable.cxx:352
 TGTable.cxx:353
 TGTable.cxx:354
 TGTable.cxx:355
 TGTable.cxx:356
 TGTable.cxx:357
 TGTable.cxx:358
 TGTable.cxx:359
 TGTable.cxx:360
 TGTable.cxx:361
 TGTable.cxx:362
 TGTable.cxx:363
 TGTable.cxx:364
 TGTable.cxx:365
 TGTable.cxx:366
 TGTable.cxx:367
 TGTable.cxx:368
 TGTable.cxx:369
 TGTable.cxx:370
 TGTable.cxx:371
 TGTable.cxx:372
 TGTable.cxx:373
 TGTable.cxx:374
 TGTable.cxx:375
 TGTable.cxx:376
 TGTable.cxx:377
 TGTable.cxx:378
 TGTable.cxx:379
 TGTable.cxx:380
 TGTable.cxx:381
 TGTable.cxx:382
 TGTable.cxx:383
 TGTable.cxx:384
 TGTable.cxx:385
 TGTable.cxx:386
 TGTable.cxx:387
 TGTable.cxx:388
 TGTable.cxx:389
 TGTable.cxx:390
 TGTable.cxx:391
 TGTable.cxx:392
 TGTable.cxx:393
 TGTable.cxx:394
 TGTable.cxx:395
 TGTable.cxx:396
 TGTable.cxx:397
 TGTable.cxx:398
 TGTable.cxx:399
 TGTable.cxx:400
 TGTable.cxx:401
 TGTable.cxx:402
 TGTable.cxx:403
 TGTable.cxx:404
 TGTable.cxx:405
 TGTable.cxx:406
 TGTable.cxx:407
 TGTable.cxx:408
 TGTable.cxx:409
 TGTable.cxx:410
 TGTable.cxx:411
 TGTable.cxx:412
 TGTable.cxx:413
 TGTable.cxx:414
 TGTable.cxx:415
 TGTable.cxx:416
 TGTable.cxx:417
 TGTable.cxx:418
 TGTable.cxx:419
 TGTable.cxx:420
 TGTable.cxx:421
 TGTable.cxx:422
 TGTable.cxx:423
 TGTable.cxx:424
 TGTable.cxx:425
 TGTable.cxx:426
 TGTable.cxx:427
 TGTable.cxx:428
 TGTable.cxx:429
 TGTable.cxx:430
 TGTable.cxx:431
 TGTable.cxx:432
 TGTable.cxx:433
 TGTable.cxx:434
 TGTable.cxx:435
 TGTable.cxx:436
 TGTable.cxx:437
 TGTable.cxx:438
 TGTable.cxx:439
 TGTable.cxx:440
 TGTable.cxx:441
 TGTable.cxx:442
 TGTable.cxx:443
 TGTable.cxx:444
 TGTable.cxx:445
 TGTable.cxx:446
 TGTable.cxx:447
 TGTable.cxx:448
 TGTable.cxx:449
 TGTable.cxx:450
 TGTable.cxx:451
 TGTable.cxx:452
 TGTable.cxx:453
 TGTable.cxx:454
 TGTable.cxx:455
 TGTable.cxx:456
 TGTable.cxx:457
 TGTable.cxx:458
 TGTable.cxx:459
 TGTable.cxx:460
 TGTable.cxx:461
 TGTable.cxx:462
 TGTable.cxx:463
 TGTable.cxx:464
 TGTable.cxx:465
 TGTable.cxx:466
 TGTable.cxx:467
 TGTable.cxx:468
 TGTable.cxx:469
 TGTable.cxx:470
 TGTable.cxx:471
 TGTable.cxx:472
 TGTable.cxx:473
 TGTable.cxx:474
 TGTable.cxx:475
 TGTable.cxx:476
 TGTable.cxx:477
 TGTable.cxx:478
 TGTable.cxx:479
 TGTable.cxx:480
 TGTable.cxx:481
 TGTable.cxx:482
 TGTable.cxx:483
 TGTable.cxx:484
 TGTable.cxx:485
 TGTable.cxx:486
 TGTable.cxx:487
 TGTable.cxx:488
 TGTable.cxx:489
 TGTable.cxx:490
 TGTable.cxx:491
 TGTable.cxx:492
 TGTable.cxx:493
 TGTable.cxx:494
 TGTable.cxx:495
 TGTable.cxx:496
 TGTable.cxx:497
 TGTable.cxx:498
 TGTable.cxx:499
 TGTable.cxx:500
 TGTable.cxx:501
 TGTable.cxx:502
 TGTable.cxx:503
 TGTable.cxx:504
 TGTable.cxx:505
 TGTable.cxx:506
 TGTable.cxx:507
 TGTable.cxx:508
 TGTable.cxx:509
 TGTable.cxx:510
 TGTable.cxx:511
 TGTable.cxx:512
 TGTable.cxx:513
 TGTable.cxx:514
 TGTable.cxx:515
 TGTable.cxx:516
 TGTable.cxx:517
 TGTable.cxx:518
 TGTable.cxx:519
 TGTable.cxx:520
 TGTable.cxx:521
 TGTable.cxx:522
 TGTable.cxx:523
 TGTable.cxx:524
 TGTable.cxx:525
 TGTable.cxx:526
 TGTable.cxx:527
 TGTable.cxx:528
 TGTable.cxx:529
 TGTable.cxx:530
 TGTable.cxx:531
 TGTable.cxx:532
 TGTable.cxx:533
 TGTable.cxx:534
 TGTable.cxx:535
 TGTable.cxx:536
 TGTable.cxx:537
 TGTable.cxx:538
 TGTable.cxx:539
 TGTable.cxx:540
 TGTable.cxx:541
 TGTable.cxx:542
 TGTable.cxx:543
 TGTable.cxx:544
 TGTable.cxx:545
 TGTable.cxx:546
 TGTable.cxx:547
 TGTable.cxx:548
 TGTable.cxx:549
 TGTable.cxx:550
 TGTable.cxx:551
 TGTable.cxx:552
 TGTable.cxx:553
 TGTable.cxx:554
 TGTable.cxx:555
 TGTable.cxx:556
 TGTable.cxx:557
 TGTable.cxx:558
 TGTable.cxx:559
 TGTable.cxx:560
 TGTable.cxx:561
 TGTable.cxx:562
 TGTable.cxx:563
 TGTable.cxx:564
 TGTable.cxx:565
 TGTable.cxx:566
 TGTable.cxx:567
 TGTable.cxx:568
 TGTable.cxx:569
 TGTable.cxx:570
 TGTable.cxx:571
 TGTable.cxx:572
 TGTable.cxx:573
 TGTable.cxx:574
 TGTable.cxx:575
 TGTable.cxx:576
 TGTable.cxx:577
 TGTable.cxx:578
 TGTable.cxx:579
 TGTable.cxx:580
 TGTable.cxx:581
 TGTable.cxx:582
 TGTable.cxx:583
 TGTable.cxx:584
 TGTable.cxx:585
 TGTable.cxx:586
 TGTable.cxx:587
 TGTable.cxx:588
 TGTable.cxx:589
 TGTable.cxx:590
 TGTable.cxx:591
 TGTable.cxx:592
 TGTable.cxx:593
 TGTable.cxx:594
 TGTable.cxx:595
 TGTable.cxx:596
 TGTable.cxx:597
 TGTable.cxx:598
 TGTable.cxx:599
 TGTable.cxx:600
 TGTable.cxx:601
 TGTable.cxx:602
 TGTable.cxx:603
 TGTable.cxx:604
 TGTable.cxx:605
 TGTable.cxx:606
 TGTable.cxx:607
 TGTable.cxx:608
 TGTable.cxx:609
 TGTable.cxx:610
 TGTable.cxx:611
 TGTable.cxx:612
 TGTable.cxx:613
 TGTable.cxx:614
 TGTable.cxx:615
 TGTable.cxx:616
 TGTable.cxx:617
 TGTable.cxx:618
 TGTable.cxx:619
 TGTable.cxx:620
 TGTable.cxx:621
 TGTable.cxx:622
 TGTable.cxx:623
 TGTable.cxx:624
 TGTable.cxx:625
 TGTable.cxx:626
 TGTable.cxx:627
 TGTable.cxx:628
 TGTable.cxx:629
 TGTable.cxx:630
 TGTable.cxx:631
 TGTable.cxx:632
 TGTable.cxx:633
 TGTable.cxx:634
 TGTable.cxx:635
 TGTable.cxx:636
 TGTable.cxx:637
 TGTable.cxx:638
 TGTable.cxx:639
 TGTable.cxx:640
 TGTable.cxx:641
 TGTable.cxx:642
 TGTable.cxx:643
 TGTable.cxx:644
 TGTable.cxx:645
 TGTable.cxx:646
 TGTable.cxx:647
 TGTable.cxx:648
 TGTable.cxx:649
 TGTable.cxx:650
 TGTable.cxx:651
 TGTable.cxx:652
 TGTable.cxx:653
 TGTable.cxx:654
 TGTable.cxx:655
 TGTable.cxx:656
 TGTable.cxx:657
 TGTable.cxx:658
 TGTable.cxx:659
 TGTable.cxx:660
 TGTable.cxx:661
 TGTable.cxx:662
 TGTable.cxx:663
 TGTable.cxx:664
 TGTable.cxx:665
 TGTable.cxx:666
 TGTable.cxx:667
 TGTable.cxx:668
 TGTable.cxx:669
 TGTable.cxx:670
 TGTable.cxx:671
 TGTable.cxx:672
 TGTable.cxx:673
 TGTable.cxx:674
 TGTable.cxx:675
 TGTable.cxx:676
 TGTable.cxx:677
 TGTable.cxx:678
 TGTable.cxx:679
 TGTable.cxx:680
 TGTable.cxx:681
 TGTable.cxx:682
 TGTable.cxx:683
 TGTable.cxx:684
 TGTable.cxx:685
 TGTable.cxx:686
 TGTable.cxx:687
 TGTable.cxx:688
 TGTable.cxx:689
 TGTable.cxx:690
 TGTable.cxx:691
 TGTable.cxx:692
 TGTable.cxx:693
 TGTable.cxx:694
 TGTable.cxx:695
 TGTable.cxx:696
 TGTable.cxx:697
 TGTable.cxx:698
 TGTable.cxx:699
 TGTable.cxx:700
 TGTable.cxx:701
 TGTable.cxx:702
 TGTable.cxx:703
 TGTable.cxx:704
 TGTable.cxx:705
 TGTable.cxx:706
 TGTable.cxx:707
 TGTable.cxx:708
 TGTable.cxx:709
 TGTable.cxx:710
 TGTable.cxx:711
 TGTable.cxx:712
 TGTable.cxx:713
 TGTable.cxx:714
 TGTable.cxx:715
 TGTable.cxx:716
 TGTable.cxx:717
 TGTable.cxx:718
 TGTable.cxx:719
 TGTable.cxx:720
 TGTable.cxx:721
 TGTable.cxx:722
 TGTable.cxx:723
 TGTable.cxx:724
 TGTable.cxx:725
 TGTable.cxx:726
 TGTable.cxx:727
 TGTable.cxx:728
 TGTable.cxx:729
 TGTable.cxx:730
 TGTable.cxx:731
 TGTable.cxx:732
 TGTable.cxx:733
 TGTable.cxx:734
 TGTable.cxx:735
 TGTable.cxx:736
 TGTable.cxx:737
 TGTable.cxx:738
 TGTable.cxx:739
 TGTable.cxx:740
 TGTable.cxx:741
 TGTable.cxx:742
 TGTable.cxx:743
 TGTable.cxx:744
 TGTable.cxx:745
 TGTable.cxx:746
 TGTable.cxx:747
 TGTable.cxx:748
 TGTable.cxx:749
 TGTable.cxx:750
 TGTable.cxx:751
 TGTable.cxx:752
 TGTable.cxx:753
 TGTable.cxx:754
 TGTable.cxx:755
 TGTable.cxx:756
 TGTable.cxx:757
 TGTable.cxx:758
 TGTable.cxx:759
 TGTable.cxx:760
 TGTable.cxx:761
 TGTable.cxx:762
 TGTable.cxx:763
 TGTable.cxx:764
 TGTable.cxx:765
 TGTable.cxx:766
 TGTable.cxx:767
 TGTable.cxx:768
 TGTable.cxx:769
 TGTable.cxx:770
 TGTable.cxx:771
 TGTable.cxx:772
 TGTable.cxx:773
 TGTable.cxx:774
 TGTable.cxx:775
 TGTable.cxx:776
 TGTable.cxx:777
 TGTable.cxx:778
 TGTable.cxx:779
 TGTable.cxx:780
 TGTable.cxx:781
 TGTable.cxx:782
 TGTable.cxx:783
 TGTable.cxx:784
 TGTable.cxx:785
 TGTable.cxx:786
 TGTable.cxx:787
 TGTable.cxx:788
 TGTable.cxx:789
 TGTable.cxx:790
 TGTable.cxx:791
 TGTable.cxx:792
 TGTable.cxx:793
 TGTable.cxx:794
 TGTable.cxx:795
 TGTable.cxx:796
 TGTable.cxx:797
 TGTable.cxx:798
 TGTable.cxx:799
 TGTable.cxx:800
 TGTable.cxx:801
 TGTable.cxx:802
 TGTable.cxx:803
 TGTable.cxx:804
 TGTable.cxx:805
 TGTable.cxx:806
 TGTable.cxx:807
 TGTable.cxx:808
 TGTable.cxx:809
 TGTable.cxx:810
 TGTable.cxx:811
 TGTable.cxx:812
 TGTable.cxx:813
 TGTable.cxx:814
 TGTable.cxx:815
 TGTable.cxx:816
 TGTable.cxx:817
 TGTable.cxx:818
 TGTable.cxx:819
 TGTable.cxx:820
 TGTable.cxx:821
 TGTable.cxx:822
 TGTable.cxx:823
 TGTable.cxx:824
 TGTable.cxx:825
 TGTable.cxx:826
 TGTable.cxx:827
 TGTable.cxx:828
 TGTable.cxx:829
 TGTable.cxx:830
 TGTable.cxx:831
 TGTable.cxx:832
 TGTable.cxx:833
 TGTable.cxx:834
 TGTable.cxx:835
 TGTable.cxx:836
 TGTable.cxx:837
 TGTable.cxx:838
 TGTable.cxx:839
 TGTable.cxx:840
 TGTable.cxx:841
 TGTable.cxx:842
 TGTable.cxx:843
 TGTable.cxx:844
 TGTable.cxx:845
 TGTable.cxx:846
 TGTable.cxx:847
 TGTable.cxx:848
 TGTable.cxx:849
 TGTable.cxx:850
 TGTable.cxx:851
 TGTable.cxx:852
 TGTable.cxx:853
 TGTable.cxx:854
 TGTable.cxx:855
 TGTable.cxx:856
 TGTable.cxx:857
 TGTable.cxx:858
 TGTable.cxx:859
 TGTable.cxx:860
 TGTable.cxx:861
 TGTable.cxx:862
 TGTable.cxx:863
 TGTable.cxx:864
 TGTable.cxx:865
 TGTable.cxx:866
 TGTable.cxx:867
 TGTable.cxx:868
 TGTable.cxx:869
 TGTable.cxx:870
 TGTable.cxx:871
 TGTable.cxx:872
 TGTable.cxx:873
 TGTable.cxx:874
 TGTable.cxx:875
 TGTable.cxx:876
 TGTable.cxx:877
 TGTable.cxx:878
 TGTable.cxx:879
 TGTable.cxx:880
 TGTable.cxx:881
 TGTable.cxx:882
 TGTable.cxx:883
 TGTable.cxx:884
 TGTable.cxx:885
 TGTable.cxx:886
 TGTable.cxx:887
 TGTable.cxx:888
 TGTable.cxx:889
 TGTable.cxx:890
 TGTable.cxx:891
 TGTable.cxx:892
 TGTable.cxx:893
 TGTable.cxx:894
 TGTable.cxx:895
 TGTable.cxx:896
 TGTable.cxx:897
 TGTable.cxx:898
 TGTable.cxx:899
 TGTable.cxx:900
 TGTable.cxx:901
 TGTable.cxx:902
 TGTable.cxx:903
 TGTable.cxx:904
 TGTable.cxx:905
 TGTable.cxx:906
 TGTable.cxx:907
 TGTable.cxx:908
 TGTable.cxx:909
 TGTable.cxx:910
 TGTable.cxx:911
 TGTable.cxx:912
 TGTable.cxx:913
 TGTable.cxx:914
 TGTable.cxx:915
 TGTable.cxx:916
 TGTable.cxx:917
 TGTable.cxx:918
 TGTable.cxx:919
 TGTable.cxx:920
 TGTable.cxx:921
 TGTable.cxx:922
 TGTable.cxx:923
 TGTable.cxx:924
 TGTable.cxx:925
 TGTable.cxx:926
 TGTable.cxx:927
 TGTable.cxx:928
 TGTable.cxx:929
 TGTable.cxx:930
 TGTable.cxx:931
 TGTable.cxx:932
 TGTable.cxx:933
 TGTable.cxx:934
 TGTable.cxx:935
 TGTable.cxx:936
 TGTable.cxx:937
 TGTable.cxx:938
 TGTable.cxx:939
 TGTable.cxx:940
 TGTable.cxx:941
 TGTable.cxx:942
 TGTable.cxx:943
 TGTable.cxx:944
 TGTable.cxx:945
 TGTable.cxx:946
 TGTable.cxx:947
 TGTable.cxx:948
 TGTable.cxx:949
 TGTable.cxx:950
 TGTable.cxx:951
 TGTable.cxx:952
 TGTable.cxx:953
 TGTable.cxx:954
 TGTable.cxx:955
 TGTable.cxx:956
 TGTable.cxx:957
 TGTable.cxx:958
 TGTable.cxx:959
 TGTable.cxx:960
 TGTable.cxx:961
 TGTable.cxx:962
 TGTable.cxx:963
 TGTable.cxx:964
 TGTable.cxx:965
 TGTable.cxx:966
 TGTable.cxx:967
 TGTable.cxx:968
 TGTable.cxx:969
 TGTable.cxx:970
 TGTable.cxx:971
 TGTable.cxx:972
 TGTable.cxx:973
 TGTable.cxx:974
 TGTable.cxx:975
 TGTable.cxx:976
 TGTable.cxx:977
 TGTable.cxx:978
 TGTable.cxx:979
 TGTable.cxx:980
 TGTable.cxx:981
 TGTable.cxx:982
 TGTable.cxx:983
 TGTable.cxx:984
 TGTable.cxx:985
 TGTable.cxx:986
 TGTable.cxx:987
 TGTable.cxx:988
 TGTable.cxx:989
 TGTable.cxx:990
 TGTable.cxx:991
 TGTable.cxx:992
 TGTable.cxx:993
 TGTable.cxx:994
 TGTable.cxx:995
 TGTable.cxx:996
 TGTable.cxx:997
 TGTable.cxx:998
 TGTable.cxx:999
 TGTable.cxx:1000
 TGTable.cxx:1001
 TGTable.cxx:1002
 TGTable.cxx:1003
 TGTable.cxx:1004
 TGTable.cxx:1005
 TGTable.cxx:1006
 TGTable.cxx:1007
 TGTable.cxx:1008
 TGTable.cxx:1009
 TGTable.cxx:1010
 TGTable.cxx:1011
 TGTable.cxx:1012
 TGTable.cxx:1013
 TGTable.cxx:1014
 TGTable.cxx:1015
 TGTable.cxx:1016
 TGTable.cxx:1017
 TGTable.cxx:1018
 TGTable.cxx:1019
 TGTable.cxx:1020
 TGTable.cxx:1021
 TGTable.cxx:1022
 TGTable.cxx:1023
 TGTable.cxx:1024
 TGTable.cxx:1025
 TGTable.cxx:1026
 TGTable.cxx:1027
 TGTable.cxx:1028
 TGTable.cxx:1029
 TGTable.cxx:1030
 TGTable.cxx:1031
 TGTable.cxx:1032
 TGTable.cxx:1033
 TGTable.cxx:1034
 TGTable.cxx:1035
 TGTable.cxx:1036
 TGTable.cxx:1037
 TGTable.cxx:1038
 TGTable.cxx:1039
 TGTable.cxx:1040
 TGTable.cxx:1041
 TGTable.cxx:1042
 TGTable.cxx:1043
 TGTable.cxx:1044
 TGTable.cxx:1045
 TGTable.cxx:1046
 TGTable.cxx:1047
 TGTable.cxx:1048
 TGTable.cxx:1049
 TGTable.cxx:1050
 TGTable.cxx:1051
 TGTable.cxx:1052
 TGTable.cxx:1053
 TGTable.cxx:1054
 TGTable.cxx:1055
 TGTable.cxx:1056
 TGTable.cxx:1057
 TGTable.cxx:1058
 TGTable.cxx:1059
 TGTable.cxx:1060
 TGTable.cxx:1061
 TGTable.cxx:1062
 TGTable.cxx:1063
 TGTable.cxx:1064
 TGTable.cxx:1065
 TGTable.cxx:1066
 TGTable.cxx:1067
 TGTable.cxx:1068
 TGTable.cxx:1069
 TGTable.cxx:1070
 TGTable.cxx:1071
 TGTable.cxx:1072
 TGTable.cxx:1073
 TGTable.cxx:1074
 TGTable.cxx:1075
 TGTable.cxx:1076
 TGTable.cxx:1077
 TGTable.cxx:1078
 TGTable.cxx:1079
 TGTable.cxx:1080
 TGTable.cxx:1081
 TGTable.cxx:1082
 TGTable.cxx:1083
 TGTable.cxx:1084
 TGTable.cxx:1085
 TGTable.cxx:1086
 TGTable.cxx:1087
 TGTable.cxx:1088
 TGTable.cxx:1089
 TGTable.cxx:1090
 TGTable.cxx:1091
 TGTable.cxx:1092
 TGTable.cxx:1093
 TGTable.cxx:1094
 TGTable.cxx:1095
 TGTable.cxx:1096
 TGTable.cxx:1097
 TGTable.cxx:1098
 TGTable.cxx:1099
 TGTable.cxx:1100
 TGTable.cxx:1101
 TGTable.cxx:1102
 TGTable.cxx:1103
 TGTable.cxx:1104
 TGTable.cxx:1105
 TGTable.cxx:1106
 TGTable.cxx:1107
 TGTable.cxx:1108
 TGTable.cxx:1109
 TGTable.cxx:1110
 TGTable.cxx:1111
 TGTable.cxx:1112
 TGTable.cxx:1113
 TGTable.cxx:1114
 TGTable.cxx:1115
 TGTable.cxx:1116
 TGTable.cxx:1117
 TGTable.cxx:1118
 TGTable.cxx:1119
 TGTable.cxx:1120
 TGTable.cxx:1121
 TGTable.cxx:1122
 TGTable.cxx:1123
 TGTable.cxx:1124
 TGTable.cxx:1125
 TGTable.cxx:1126
 TGTable.cxx:1127
 TGTable.cxx:1128
 TGTable.cxx:1129
 TGTable.cxx:1130
 TGTable.cxx:1131
 TGTable.cxx:1132
 TGTable.cxx:1133
 TGTable.cxx:1134
 TGTable.cxx:1135
 TGTable.cxx:1136
 TGTable.cxx:1137
 TGTable.cxx:1138
 TGTable.cxx:1139
 TGTable.cxx:1140
 TGTable.cxx:1141
 TGTable.cxx:1142
 TGTable.cxx:1143
 TGTable.cxx:1144
 TGTable.cxx:1145
 TGTable.cxx:1146
 TGTable.cxx:1147
 TGTable.cxx:1148
 TGTable.cxx:1149
 TGTable.cxx:1150
 TGTable.cxx:1151
 TGTable.cxx:1152
 TGTable.cxx:1153
 TGTable.cxx:1154
 TGTable.cxx:1155
 TGTable.cxx:1156
 TGTable.cxx:1157
 TGTable.cxx:1158
 TGTable.cxx:1159
 TGTable.cxx:1160
 TGTable.cxx:1161
 TGTable.cxx:1162
 TGTable.cxx:1163
 TGTable.cxx:1164
 TGTable.cxx:1165
 TGTable.cxx:1166
 TGTable.cxx:1167
 TGTable.cxx:1168
 TGTable.cxx:1169
 TGTable.cxx:1170
 TGTable.cxx:1171
 TGTable.cxx:1172
 TGTable.cxx:1173
 TGTable.cxx:1174
 TGTable.cxx:1175
 TGTable.cxx:1176
 TGTable.cxx:1177
 TGTable.cxx:1178
 TGTable.cxx:1179
 TGTable.cxx:1180
 TGTable.cxx:1181
 TGTable.cxx:1182
 TGTable.cxx:1183
 TGTable.cxx:1184
 TGTable.cxx:1185
 TGTable.cxx:1186
 TGTable.cxx:1187
 TGTable.cxx:1188
 TGTable.cxx:1189
 TGTable.cxx:1190
 TGTable.cxx:1191
 TGTable.cxx:1192
 TGTable.cxx:1193
 TGTable.cxx:1194
 TGTable.cxx:1195
 TGTable.cxx:1196
 TGTable.cxx:1197
 TGTable.cxx:1198
 TGTable.cxx:1199
 TGTable.cxx:1200
 TGTable.cxx:1201
 TGTable.cxx:1202
 TGTable.cxx:1203
 TGTable.cxx:1204
 TGTable.cxx:1205
 TGTable.cxx:1206
 TGTable.cxx:1207
 TGTable.cxx:1208
 TGTable.cxx:1209
 TGTable.cxx:1210
 TGTable.cxx:1211
 TGTable.cxx:1212
 TGTable.cxx:1213
 TGTable.cxx:1214
 TGTable.cxx:1215
 TGTable.cxx:1216
 TGTable.cxx:1217
 TGTable.cxx:1218
 TGTable.cxx:1219
 TGTable.cxx:1220
 TGTable.cxx:1221
 TGTable.cxx:1222
 TGTable.cxx:1223
 TGTable.cxx:1224
 TGTable.cxx:1225
 TGTable.cxx:1226
 TGTable.cxx:1227
 TGTable.cxx:1228
 TGTable.cxx:1229
 TGTable.cxx:1230
 TGTable.cxx:1231
 TGTable.cxx:1232
 TGTable.cxx:1233
 TGTable.cxx:1234
 TGTable.cxx:1235
 TGTable.cxx:1236
 TGTable.cxx:1237
 TGTable.cxx:1238
 TGTable.cxx:1239
 TGTable.cxx:1240
 TGTable.cxx:1241
 TGTable.cxx:1242
 TGTable.cxx:1243
 TGTable.cxx:1244
 TGTable.cxx:1245
 TGTable.cxx:1246
 TGTable.cxx:1247
 TGTable.cxx:1248
 TGTable.cxx:1249
 TGTable.cxx:1250
 TGTable.cxx:1251
 TGTable.cxx:1252
 TGTable.cxx:1253
 TGTable.cxx:1254
 TGTable.cxx:1255
 TGTable.cxx:1256
 TGTable.cxx:1257
 TGTable.cxx:1258
 TGTable.cxx:1259
 TGTable.cxx:1260
 TGTable.cxx:1261
 TGTable.cxx:1262
 TGTable.cxx:1263
 TGTable.cxx:1264
 TGTable.cxx:1265
 TGTable.cxx:1266
 TGTable.cxx:1267
 TGTable.cxx:1268
 TGTable.cxx:1269
 TGTable.cxx:1270
 TGTable.cxx:1271
 TGTable.cxx:1272
 TGTable.cxx:1273
 TGTable.cxx:1274
 TGTable.cxx:1275
 TGTable.cxx:1276
 TGTable.cxx:1277
 TGTable.cxx:1278
 TGTable.cxx:1279
 TGTable.cxx:1280
 TGTable.cxx:1281
 TGTable.cxx:1282
 TGTable.cxx:1283
 TGTable.cxx:1284
 TGTable.cxx:1285
 TGTable.cxx:1286
 TGTable.cxx:1287
 TGTable.cxx:1288
 TGTable.cxx:1289
 TGTable.cxx:1290
 TGTable.cxx:1291
 TGTable.cxx:1292
 TGTable.cxx:1293
 TGTable.cxx:1294
 TGTable.cxx:1295
 TGTable.cxx:1296
 TGTable.cxx:1297
 TGTable.cxx:1298
 TGTable.cxx:1299
 TGTable.cxx:1300
 TGTable.cxx:1301
 TGTable.cxx:1302
 TGTable.cxx:1303
 TGTable.cxx:1304
 TGTable.cxx:1305
 TGTable.cxx:1306
 TGTable.cxx:1307
 TGTable.cxx:1308
 TGTable.cxx:1309
 TGTable.cxx:1310
 TGTable.cxx:1311
 TGTable.cxx:1312
 TGTable.cxx:1313
 TGTable.cxx:1314
 TGTable.cxx:1315
 TGTable.cxx:1316
 TGTable.cxx:1317
 TGTable.cxx:1318
 TGTable.cxx:1319
 TGTable.cxx:1320
 TGTable.cxx:1321
 TGTable.cxx:1322
 TGTable.cxx:1323
 TGTable.cxx:1324
 TGTable.cxx:1325
 TGTable.cxx:1326
 TGTable.cxx:1327
 TGTable.cxx:1328
 TGTable.cxx:1329
 TGTable.cxx:1330
 TGTable.cxx:1331
 TGTable.cxx:1332
 TGTable.cxx:1333
 TGTable.cxx:1334
 TGTable.cxx:1335
 TGTable.cxx:1336
 TGTable.cxx:1337
 TGTable.cxx:1338
 TGTable.cxx:1339
 TGTable.cxx:1340
 TGTable.cxx:1341
 TGTable.cxx:1342
 TGTable.cxx:1343
 TGTable.cxx:1344
 TGTable.cxx:1345
 TGTable.cxx:1346
 TGTable.cxx:1347
 TGTable.cxx:1348
 TGTable.cxx:1349
 TGTable.cxx:1350
 TGTable.cxx:1351
 TGTable.cxx:1352
 TGTable.cxx:1353
 TGTable.cxx:1354
 TGTable.cxx:1355
 TGTable.cxx:1356
 TGTable.cxx:1357
 TGTable.cxx:1358
 TGTable.cxx:1359
 TGTable.cxx:1360
 TGTable.cxx:1361
 TGTable.cxx:1362
 TGTable.cxx:1363
 TGTable.cxx:1364
 TGTable.cxx:1365
 TGTable.cxx:1366
 TGTable.cxx:1367
 TGTable.cxx:1368
 TGTable.cxx:1369
 TGTable.cxx:1370
 TGTable.cxx:1371
 TGTable.cxx:1372
 TGTable.cxx:1373
 TGTable.cxx:1374
 TGTable.cxx:1375
 TGTable.cxx:1376
 TGTable.cxx:1377
 TGTable.cxx:1378
 TGTable.cxx:1379
 TGTable.cxx:1380
 TGTable.cxx:1381
 TGTable.cxx:1382
 TGTable.cxx:1383
 TGTable.cxx:1384
 TGTable.cxx:1385
 TGTable.cxx:1386
 TGTable.cxx:1387
 TGTable.cxx:1388
 TGTable.cxx:1389
 TGTable.cxx:1390
 TGTable.cxx:1391
 TGTable.cxx:1392
 TGTable.cxx:1393
 TGTable.cxx:1394
 TGTable.cxx:1395
 TGTable.cxx:1396
 TGTable.cxx:1397
 TGTable.cxx:1398
 TGTable.cxx:1399
 TGTable.cxx:1400
 TGTable.cxx:1401
 TGTable.cxx:1402
 TGTable.cxx:1403
 TGTable.cxx:1404
 TGTable.cxx:1405
 TGTable.cxx:1406
 TGTable.cxx:1407
 TGTable.cxx:1408
 TGTable.cxx:1409
 TGTable.cxx:1410
 TGTable.cxx:1411
 TGTable.cxx:1412
 TGTable.cxx:1413
 TGTable.cxx:1414
 TGTable.cxx:1415
 TGTable.cxx:1416
 TGTable.cxx:1417
 TGTable.cxx:1418
 TGTable.cxx:1419
 TGTable.cxx:1420
 TGTable.cxx:1421
 TGTable.cxx:1422
 TGTable.cxx:1423
 TGTable.cxx:1424
 TGTable.cxx:1425
 TGTable.cxx:1426
 TGTable.cxx:1427
 TGTable.cxx:1428
 TGTable.cxx:1429
 TGTable.cxx:1430
 TGTable.cxx:1431
 TGTable.cxx:1432
 TGTable.cxx:1433
 TGTable.cxx:1434
 TGTable.cxx:1435
 TGTable.cxx:1436
 TGTable.cxx:1437
 TGTable.cxx:1438
 TGTable.cxx:1439
 TGTable.cxx:1440
 TGTable.cxx:1441
 TGTable.cxx:1442
 TGTable.cxx:1443
 TGTable.cxx:1444
 TGTable.cxx:1445
 TGTable.cxx:1446
 TGTable.cxx:1447
 TGTable.cxx:1448
 TGTable.cxx:1449
 TGTable.cxx:1450
 TGTable.cxx:1451
 TGTable.cxx:1452
 TGTable.cxx:1453
 TGTable.cxx:1454
 TGTable.cxx:1455
 TGTable.cxx:1456
 TGTable.cxx:1457
 TGTable.cxx:1458
 TGTable.cxx:1459
 TGTable.cxx:1460
 TGTable.cxx:1461
 TGTable.cxx:1462
 TGTable.cxx:1463
 TGTable.cxx:1464
 TGTable.cxx:1465
 TGTable.cxx:1466
 TGTable.cxx:1467
 TGTable.cxx:1468
 TGTable.cxx:1469
 TGTable.cxx:1470
 TGTable.cxx:1471
 TGTable.cxx:1472
 TGTable.cxx:1473
 TGTable.cxx:1474
 TGTable.cxx:1475
 TGTable.cxx:1476
 TGTable.cxx:1477
 TGTable.cxx:1478
 TGTable.cxx:1479
 TGTable.cxx:1480
 TGTable.cxx:1481
 TGTable.cxx:1482
 TGTable.cxx:1483
 TGTable.cxx:1484
 TGTable.cxx:1485
 TGTable.cxx:1486
 TGTable.cxx:1487
 TGTable.cxx:1488
 TGTable.cxx:1489
 TGTable.cxx:1490
 TGTable.cxx:1491
 TGTable.cxx:1492
 TGTable.cxx:1493
 TGTable.cxx:1494
 TGTable.cxx:1495
 TGTable.cxx:1496
 TGTable.cxx:1497
 TGTable.cxx:1498
 TGTable.cxx:1499
 TGTable.cxx:1500
 TGTable.cxx:1501
 TGTable.cxx:1502
 TGTable.cxx:1503
 TGTable.cxx:1504
 TGTable.cxx:1505
 TGTable.cxx:1506
 TGTable.cxx:1507
 TGTable.cxx:1508
 TGTable.cxx:1509
 TGTable.cxx:1510
 TGTable.cxx:1511
 TGTable.cxx:1512
 TGTable.cxx:1513
 TGTable.cxx:1514
 TGTable.cxx:1515
 TGTable.cxx:1516
 TGTable.cxx:1517
 TGTable.cxx:1518
 TGTable.cxx:1519
 TGTable.cxx:1520
 TGTable.cxx:1521
 TGTable.cxx:1522
 TGTable.cxx:1523
 TGTable.cxx:1524
 TGTable.cxx:1525
 TGTable.cxx:1526
 TGTable.cxx:1527
 TGTable.cxx:1528
 TGTable.cxx:1529
 TGTable.cxx:1530
 TGTable.cxx:1531
 TGTable.cxx:1532
 TGTable.cxx:1533
 TGTable.cxx:1534
 TGTable.cxx:1535
 TGTable.cxx:1536
 TGTable.cxx:1537
 TGTable.cxx:1538
 TGTable.cxx:1539
 TGTable.cxx:1540
 TGTable.cxx:1541
 TGTable.cxx:1542
 TGTable.cxx:1543
 TGTable.cxx:1544
 TGTable.cxx:1545
 TGTable.cxx:1546
 TGTable.cxx:1547
 TGTable.cxx:1548
 TGTable.cxx:1549
 TGTable.cxx:1550
 TGTable.cxx:1551
 TGTable.cxx:1552
 TGTable.cxx:1553
 TGTable.cxx:1554
 TGTable.cxx:1555
 TGTable.cxx:1556
 TGTable.cxx:1557
 TGTable.cxx:1558
 TGTable.cxx:1559
 TGTable.cxx:1560
 TGTable.cxx:1561
 TGTable.cxx:1562
 TGTable.cxx:1563
 TGTable.cxx:1564
 TGTable.cxx:1565
 TGTable.cxx:1566
 TGTable.cxx:1567
 TGTable.cxx:1568
 TGTable.cxx:1569
 TGTable.cxx:1570
 TGTable.cxx:1571
 TGTable.cxx:1572
 TGTable.cxx:1573
 TGTable.cxx:1574
 TGTable.cxx:1575
 TGTable.cxx:1576
 TGTable.cxx:1577
 TGTable.cxx:1578
 TGTable.cxx:1579
 TGTable.cxx:1580