// 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.             *
 *************************************************************************/

#ifndef ROOT_TGTable
#define ROOT_TGTable

#ifndef ROOT_TGCanvas
#include "TGCanvas.h"
#endif
#ifndef ROOT_TGWidget
#include "TGWidget.h"
#endif
#ifndef ROOT_TGTableHeader
#include "TGTableHeader.h"
#endif

class TGWindow;
class TGString;
class TGToolTip;
class TGPicture;
class TVirtualTableInterface;
class TGTableCell;
class TGTableHeader;
class TGToolTip;
class TGTableFrame;
class TGTableHeaderFrame;
class TGTextButton;
class TGNumberEntryField;
class TGLabel;
class TGTextEntry;
class TTableRange;

class TGTable : public TGCompositeFrame, public TGWidget {

protected:
   TObjArray     *fRows;          // Array of rows
   TObjArray     *fRowHeaders;    // Array of row headers
   TObjArray     *fColumnHeaders; // Array of column headers
   TGTableHeader *fTableHeader;   // Top left element of the table
   Bool_t         fReadOnly;      // Table readonly state
   Pixel_t        fSelectColor;      // Select Color
   Int_t          fTMode;         // Text justify mode
   Bool_t         fAllData;       // Is the data bigger than the table
   TTableRange   *fCurrentRange;  // Range of data currently loaded
   TTableRange   *fDataRange;     // Full range of the data set
   TTableRange   *fGotoRange;     // Range used by Goto frame
   TGTableFrame  *fTableFrame;    // Container for the frames
   TGCanvas      *fCanvas;        // Canvas that will contains the cells
   UInt_t         fCellWidth;     // Default cell width
   UInt_t         fCellHeight;    // Default cell width

   // Frames used for layout
   TGTableHeaderFrame *fCHdrFrame;     // Frame that contains the row headers
   TGTableHeaderFrame *fRHdrFrame;     // Frame that contains the row headers
   TGHorizontalFrame  *fRangeFrame;    // Frame that contains the top part
   TGHorizontalFrame  *fTopFrame;      // Frame that contains the top part
   TGHorizontalFrame  *fTopExtraFrame; // Dev idea
   TGHorizontalFrame  *fBottomFrame;   // Frame that contains the bottom part
   TGHorizontalFrame  *fButtonFrame;   // Contains the buttons

   // Buttons for interaction
   TGTextButton *fNextButton;     // Button to view next chunk
   TGTextButton *fPrevButton;     // Button to view previous chunk
   TGTextButton *fUpdateButton;   // Button to update current view
   TGTextButton *fGotoButton;     // Button to goto a new range

   // Labels and textentries for range information and input
   TGLabel     *fFirstCellLabel;  // Label for the range frame
   TGLabel     *fRangeLabel;      // Label for the range frame
   TGTextEntry *fFirstCellEntry;  // TextEntry for the range frame
   TGTextEntry *fRangeEntry;      // TextEntry for the range frame

   Pixel_t fOddRowBackground;     // Background color for odd numbered rows
   Pixel_t fEvenRowBackground;    // Background color for even numbered rows
   Pixel_t fHeaderBackground;     // Background color for headers

   // Those are neither used nor even initialized:
   // static const TGGC *fgDefaultSelectGC; // Default select GC
   // static const TGGC *fgDefaultBckgndGC; // Default cell background GC
   // static const Int_t fgDefaultTMode;    // Default text justify mode

   // Data members to keep track of LayoutHints that can't be
   // automatically cleaned
   TList *fCellHintsList;
   TList *fRHdrHintsList;
   TList *fCHdrHintsList;
   TList *fMainHintsList;   // List for all hints used in the main table frame

   // Add rows and/or colums to the edge of the table.

   virtual void Init();

   // Remove rows and/or colums from the edge of the table.
protected:
   TVirtualTableInterface *fInterface; // Interface to the data source

   virtual void DoRedraw();

   virtual void Expand(UInt_t nrows, UInt_t ncolumns);
   virtual void ExpandColumns(UInt_t ncolumns);
   virtual void ExpandRows(UInt_t nrows);

   virtual UInt_t GetRHdrHeight() const;
   virtual UInt_t GetCHdrWidth() const;

   virtual void Shrink(UInt_t nrows, UInt_t ncolumns);
   virtual void ShrinkColumns(UInt_t ncolumns);
   virtual void ShrinkRows(UInt_t nrows);

   virtual void UpdateHeaders(EHeaderType type);
   virtual void SetInterface(TVirtualTableInterface *interface,
                             UInt_t nrows = 50, UInt_t ncolumns = 20);
   virtual void ResizeTable(UInt_t nrows, UInt_t ncolumns);

   virtual void UpdateRangeFrame();

public:
   TGTable(const TGWindow *p = 0, Int_t id = 0,
           TVirtualTableInterface *interface = 0, UInt_t nrows = 50,
           UInt_t ncolumns = 20);
   virtual ~TGTable();

   virtual TObjArray *GetRow(UInt_t row);
   virtual TObjArray *GetColumn(UInt_t columns);

//    // Selection
//    virtual void Select(TGTableCell *celltl, TGTableCell *cellbr);
//    virtual void Select(UInt_t xcell1, UInt_t ycell1, UInt_t xcell2, UInt_t ycell2);
//    virtual void SelectAll();
//    virtual void SelectRow(TGTableCell *cell);
//    virtual void SelectRow(UInt_t row);
//    virtual void SelectRows(UInt_t row, UInt_t nrows);
//    virtual void SelectColumn(TGTableCell *cell);
//    virtual void SelectColumn(UInt_t column);
//    virtual void SelectColumns(UInt_t column, UInt_t ncolumns);

//    virtual void SetSelectGC(TGGC *gc);
//    virtual void SetTextJustify(Int_t tmode);

   // Cells
   virtual const TGTableCell* GetCell(UInt_t i, UInt_t j) const;
   virtual TGTableCell* GetCell(UInt_t i, UInt_t j);

   virtual const TGTableCell* FindCell(TGString label) const;
   virtual TGTableCell* FindCell(TGString label);

   virtual void Show();

   // Because insertion and removal of columns in the middle of a data
   // set is not yet supported in this design iteration, these methods
   // have been commented out.

//    // Insert a range of columns or rows, if the label is empty, a
//    // default scheme will be used.
//    virtual void InsertRowBefore(UInt_t row, UInt_t nrows);
//    virtual void InsertRowBefore(TGString label, UInt_t nrows);
//    virtual void InsertRowAfter(UInt_t row, UInt_t nrows);
//    virtual void InsertRowAfter(TGString label, UInt_t nrows);
//    virtual void InsertRowAt(UInt_t row, UInt_t nrows = 1);
//    virtual void InsertRowAt(TGString label, UInt_t nrows);

//    virtual void InsertColumnBefore(UInt_t column, UInt_t ncolumns);
//    virtual void InsertColumnBefore(TGString label, UInt_t ncolumns);
//    virtual void InsertColumnAfter(UInt_t column, UInt_t ncolumns);
//    virtual void InsertColumnAfter(TGString label, UInt_t ncolumns);
//    virtual void InsertColumnAt(UInt_t column, UInt_t ncolumns = 1);
//    virtual void InsertColumnAt(TGString label, UInt_t ncolumns);

//    // Remove rows or columns.
//    virtual void RemoveRows(UInt_t row, UInt_t nrows = 1);
//    virtual void RemoveColumns(UInt_t column, UInt_t ncolumns = 1);

   // Update view
   virtual void UpdateView();

   // Getters
   virtual UInt_t       GetNTableRows() const;
   virtual UInt_t       GetNDataRows() const;
   virtual UInt_t       GetNTableColumns() const;
   virtual UInt_t       GetNDataColumns() const;
   virtual UInt_t       GetNTableCells() const;
   virtual UInt_t       GetNDataCells() const;
   virtual const  TTableRange *GetCurrentRange() const;

   virtual TVirtualTableInterface *GetInterface() { return fInterface; }

   virtual TGCanvas                 *GetCanvas() { return fCanvas; }
   virtual const TGTableHeaderFrame *GetRHdrFrame() { return fRHdrFrame; }
   virtual const TGTableHeaderFrame *GetCHdrFrame() { return fCHdrFrame; }
   virtual const TGTableHeader      *GetRowHeader(const UInt_t row) const;
   virtual TGTableHeader            *GetRowHeader(const UInt_t row);
   virtual const TGTableHeader      *GetColumnHeader(const UInt_t column) const;
   virtual TGTableHeader            *GetColumnHeader(const UInt_t column);
   virtual TGTableHeader            *GetTableHeader();

//    virtual const TGGC*  GetSelectGC() const;
//    virtual const TGGC*  GetCellBckgndGC(TGTableCell *cell) const;
//    virtual const TGGC*  GetCellBckgndGC(UInt_t row, UInt_t column) const;

   virtual Pixel_t GetRowBackground(UInt_t row) const;
   virtual Pixel_t GetHeaderBackground() const ;

   virtual void SetOddRowBackground(Pixel_t pixel);
   virtual void SetEvenRowBackground(Pixel_t pixel);
   virtual void SetHeaderBackground(Pixel_t pixel);
   virtual void SetDefaultColors();

   // Range manipulators
   virtual void MoveTable(Int_t rows, Int_t columns);
   virtual void GotoTableRange(Int_t xtl, Int_t ytl,
                               Int_t xbr, Int_t ybr);
   // Operators
   virtual TGTableCell* operator() (UInt_t row, UInt_t column);

   // Internal slots
   virtual void ScrollCHeaders(Int_t xpos);
   virtual void ScrollRHeaders(Int_t ypos);
   virtual void NextChunk();
   virtual void PreviousChunk();
   virtual void UserRangeChange();
   virtual void Goto();
   virtual void Update();

   ClassDef(TGTable, 0) // A table used to visualize data from diffent sources.
};

class TTableRange {
public:
   UInt_t fXtl; // Top left X coordinate
   UInt_t fYtl; // Top left Y coordinate
   UInt_t fXbr; // Bottom right X coordinate
   UInt_t fYbr; // Bottom right Y coordinate

   TTableRange();
   virtual ~TTableRange() {}
   virtual void Print();

   Bool_t operator==(TTableRange &other);
   ClassDef(TTableRange, 0) // Range used in TGTable.
};

#endif

 TGTable.h:1
 TGTable.h:2
 TGTable.h:3
 TGTable.h:4
 TGTable.h:5
 TGTable.h:6
 TGTable.h:7
 TGTable.h:8
 TGTable.h:9
 TGTable.h:10
 TGTable.h:11
 TGTable.h:12
 TGTable.h:13
 TGTable.h:14
 TGTable.h:15
 TGTable.h:16
 TGTable.h:17
 TGTable.h:18
 TGTable.h:19
 TGTable.h:20
 TGTable.h:21
 TGTable.h:22
 TGTable.h:23
 TGTable.h:24
 TGTable.h:25
 TGTable.h:26
 TGTable.h:27
 TGTable.h:28
 TGTable.h:29
 TGTable.h:30
 TGTable.h:31
 TGTable.h:32
 TGTable.h:33
 TGTable.h:34
 TGTable.h:35
 TGTable.h:36
 TGTable.h:37
 TGTable.h:38
 TGTable.h:39
 TGTable.h:40
 TGTable.h:41
 TGTable.h:42
 TGTable.h:43
 TGTable.h:44
 TGTable.h:45
 TGTable.h:46
 TGTable.h:47
 TGTable.h:48
 TGTable.h:49
 TGTable.h:50
 TGTable.h:51
 TGTable.h:52
 TGTable.h:53
 TGTable.h:54
 TGTable.h:55
 TGTable.h:56
 TGTable.h:57
 TGTable.h:58
 TGTable.h:59
 TGTable.h:60
 TGTable.h:61
 TGTable.h:62
 TGTable.h:63
 TGTable.h:64
 TGTable.h:65
 TGTable.h:66
 TGTable.h:67
 TGTable.h:68
 TGTable.h:69
 TGTable.h:70
 TGTable.h:71
 TGTable.h:72
 TGTable.h:73
 TGTable.h:74
 TGTable.h:75
 TGTable.h:76
 TGTable.h:77
 TGTable.h:78
 TGTable.h:79
 TGTable.h:80
 TGTable.h:81
 TGTable.h:82
 TGTable.h:83
 TGTable.h:84
 TGTable.h:85
 TGTable.h:86
 TGTable.h:87
 TGTable.h:88
 TGTable.h:89
 TGTable.h:90
 TGTable.h:91
 TGTable.h:92
 TGTable.h:93
 TGTable.h:94
 TGTable.h:95
 TGTable.h:96
 TGTable.h:97
 TGTable.h:98
 TGTable.h:99
 TGTable.h:100
 TGTable.h:101
 TGTable.h:102
 TGTable.h:103
 TGTable.h:104
 TGTable.h:105
 TGTable.h:106
 TGTable.h:107
 TGTable.h:108
 TGTable.h:109
 TGTable.h:110
 TGTable.h:111
 TGTable.h:112
 TGTable.h:113
 TGTable.h:114
 TGTable.h:115
 TGTable.h:116
 TGTable.h:117
 TGTable.h:118
 TGTable.h:119
 TGTable.h:120
 TGTable.h:121
 TGTable.h:122
 TGTable.h:123
 TGTable.h:124
 TGTable.h:125
 TGTable.h:126
 TGTable.h:127
 TGTable.h:128
 TGTable.h:129
 TGTable.h:130
 TGTable.h:131
 TGTable.h:132
 TGTable.h:133
 TGTable.h:134
 TGTable.h:135
 TGTable.h:136
 TGTable.h:137
 TGTable.h:138
 TGTable.h:139
 TGTable.h:140
 TGTable.h:141
 TGTable.h:142
 TGTable.h:143
 TGTable.h:144
 TGTable.h:145
 TGTable.h:146
 TGTable.h:147
 TGTable.h:148
 TGTable.h:149
 TGTable.h:150
 TGTable.h:151
 TGTable.h:152
 TGTable.h:153
 TGTable.h:154
 TGTable.h:155
 TGTable.h:156
 TGTable.h:157
 TGTable.h:158
 TGTable.h:159
 TGTable.h:160
 TGTable.h:161
 TGTable.h:162
 TGTable.h:163
 TGTable.h:164
 TGTable.h:165
 TGTable.h:166
 TGTable.h:167
 TGTable.h:168
 TGTable.h:169
 TGTable.h:170
 TGTable.h:171
 TGTable.h:172
 TGTable.h:173
 TGTable.h:174
 TGTable.h:175
 TGTable.h:176
 TGTable.h:177
 TGTable.h:178
 TGTable.h:179
 TGTable.h:180
 TGTable.h:181
 TGTable.h:182
 TGTable.h:183
 TGTable.h:184
 TGTable.h:185
 TGTable.h:186
 TGTable.h:187
 TGTable.h:188
 TGTable.h:189
 TGTable.h:190
 TGTable.h:191
 TGTable.h:192
 TGTable.h:193
 TGTable.h:194
 TGTable.h:195
 TGTable.h:196
 TGTable.h:197
 TGTable.h:198
 TGTable.h:199
 TGTable.h:200
 TGTable.h:201
 TGTable.h:202
 TGTable.h:203
 TGTable.h:204
 TGTable.h:205
 TGTable.h:206
 TGTable.h:207
 TGTable.h:208
 TGTable.h:209
 TGTable.h:210
 TGTable.h:211
 TGTable.h:212
 TGTable.h:213
 TGTable.h:214
 TGTable.h:215
 TGTable.h:216
 TGTable.h:217
 TGTable.h:218
 TGTable.h:219
 TGTable.h:220
 TGTable.h:221
 TGTable.h:222
 TGTable.h:223
 TGTable.h:224
 TGTable.h:225
 TGTable.h:226
 TGTable.h:227
 TGTable.h:228
 TGTable.h:229
 TGTable.h:230
 TGTable.h:231
 TGTable.h:232
 TGTable.h:233
 TGTable.h:234
 TGTable.h:235
 TGTable.h:236
 TGTable.h:237
 TGTable.h:238
 TGTable.h:239
 TGTable.h:240
 TGTable.h:241
 TGTable.h:242
 TGTable.h:243
 TGTable.h:244
 TGTable.h:245
 TGTable.h:246
 TGTable.h:247
 TGTable.h:248
 TGTable.h:249
 TGTable.h:250