AG_Treetbl — agar
    tree-based table widget
#include <agar/core.h>
#include <agar/gui.h>
 
The AG_Treetbl widget displays a tree in
    table format (i.e., rows are organized in a tree structure). It is an
    alternative implementation of
    AG_Table(3)
    optimized for the storage of the table data in tree form. It also differs
    from AG_Table in that rows and columns are uniquely
    identified.
AG_Treetbl *
  
  AG_TreetblNew(AG_Widget
    *parent, Uint
    flags, AG_TreetblDataFn
    dataFn, AG_TreetblSortFn
    sortFn);
  
  void
  
  AG_TreetblSizeHint(AG_Treetbl
    *tbl, int width,
    int nrows);
  
  void
  
  AG_TreetblSetRefreshRate(AG_Treetbl
    *tbl, Uint ms);
  
  void
  
  AG_TreetblSetColHeight(AG_Treetbl
    *tbl, int
  height);
  
  void
  
  AG_TreetblSetSortCol(AG_Treetbl
    *tbl, AG_TreetblCol
    *col);
  
  void
  
  AG_TreetblSetSortMode(AG_Treetbl
    *tbl, enum
    ag_treetbl_sort_mode mode);
  
  void
  
  AG_TreetblSetExpanderCol(AG_Treetbl
    *tbl, AG_TreetblCol
    *col);
The
    AG_TreetblNew()
    function allocates, initializes, and attaches a new
    AG_Treetbl widget. The
    dataFn()
    argument specifies the callback function from which to obtain the text to
    display for a given cell. The callback function should return a pointer to a
    valid C string to display under the given cell, and is declared as:
  
  char *
  
  MyDataFn(AG_Treetbl
    *tbl, int col,
    int row);
The
    sortFn()
    argument, if not NULL, specifies an optional comparison function to use in
    sorting cells, and is declared as:
  
  int
  
  MySortFn(AG_Treetbl
    *tbl, int col1,
    int row1,
    int col2,
    int row2);
The flags argument to
    AG_TreetblNew()
    may include:
  - AG_TREETBL_MULTI
- Allow selection of multiple rows at once while holding
      CTRLorSHIFT.
- AG_TREETBL_MULTITOGGLE
- Allow selection of multiple rows at once without holding
      CTRLorSHIFT.
- AG_TREETBL_REORDERCOLS
- Allow reordering of the columns through dragging and dropping of the
      column headers.
- AG_TREETBL_NODUPCHECKS
- Disable the safety check for duplicate row and column IDs. This option
      avoids a lookup in AG_TreetblAddCol() andAG_TreetblAddRow().
- AG_TREETBL_SORT
- Enable sorting of the rows.
- AG_TREETBL_POLLED
- Enable polling mode such that the table can be repopulated automatically
      to reflect some external data. When a row is deleted,
      AG_Treetblwill remember selection information for
      later use byAG_TreetblRowRestoreAll().
- AG_TREETBL_HFILL
- Expand horizontally in parent container.
- AG_TREETBL_VFILL
- Expand vertically in parent container.
- AG_TREETBL_EXPAND
- Shorthand for AG_TREETBL_HFILL|AG_TREETBL_VFILL.
      This is recommended as an alternative toAG_TreetblSizeHint().
The
    AG_TreetblSizeHint()
    function requests an initial sizing, where width is
    the width in pixels and nrows is the number of rows to
    display.
AG_TreetblSetRefreshRate()
    sets the default update rate for dynamically updated cells.
AG_TreetblSetColHeight()
    sets the height of column headers in pixels.
AG_TreetblSetSortCol()
    specifies the column controlling the sorting of rows.
    AG_TreetblSetSortMode() sets the sort method, where
    mode is one of:
  - AG_TREETBL_SORT_NOT
- No sorting
- AG_TREETBL_SORT_ASC
- Sort in ascending order
- AG_TREETBL_SORT_DSC
- Sort in descending order
AG_TreetblSetExpanderCol()
    specifies an alternate column for the tree expand/collapse controls. By
    default, the first column is used.
AG_TreetblCol *
  
  AG_TreetblAddCol(AG_Treetbl
    *tbl, int colID,
    const char *width,
    const char *text,
    ...);
  
  AG_TreetblRow *
  
  AG_TreetblAddRow(AG_Treetbl
    *tbl, AG_TreetblRow
    *parent, int rowID,
    const char *argSpec,
    ...);
  
  AG_TreetblRow *
  
  AG_TreetblLookupRow(AG_Treetbl
    *tbl, int
  rowID);
  
  void
  
  AG_TreetblDelRow(AG_Treetbl
    *tbl, AG_TreetblRow
    *row);
  
  void
  
  AG_TreetblDelRowID(AG_Treetbl
    *tbl, int
  rowID);
  
  void
  
  AG_TreetblClearRows(AG_Treetbl
    *tbl);
  
  void
  
  AG_TreetblRestoreRows(AG_Treetbl
    *tbl);
AG_TreetblAddCol()
    creates a new table column. colID is a unique
    identifier for the new column. If width is non-NULL,
    it is a
    AG_SizeSpec(3)
    specifying a default width for the new column. text is
    the text initially displayed in the column header.
The
    AG_TreetblAddRow()
    function inserts a new row into the table. rowID is a
    unique identifier for the row. parent specifies the
    parent row in the tree. The data of the individual cells of the row are
    specified in argSpec and following arguments (in
    standard Agar argument format).
AG_TreetblLookupRow()
    looks up the row identified by rowID. If there is no
    such row, the function returns NULL.
AG_TreetblDelRow()
    removes the specified row from the table. The
    AG_TreetblDelRowID() variant looks up the row by
  ID.
AG_TreetblClearRows()
    (alternatively
    AG_TreetblBegin())
    clears all the rows from the table. If
    AG_TREETBL_POLLED is in effect, the row-specific
    widget states are remembered, to be later recovered by
    AG_TreetblRestoreRows() (alternatively
    AG_TreetblEnd()).
void
  
  AG_TreetblSelectCol(AG_Treetbl
    *tbl, AG_TreetblCol
    *col);
  
  void
  
  AG_TreetblDeselectCol(AG_Treetbl
    *tbl, AG_TreetblCol
    *col);
  
  void
  
  AG_TreetblSelectColID(AG_Treetbl
    *tbl, int
  colID);
  
  void
  
  AG_TreetblDeselectColID(AG_Treetbl
    *tbl, int
  colID);
  
  void
  
  AG_TreetblSelectRow(AG_Treetbl
    *tbl, AG_TreetblRow
    *row);
  
  void
  
  AG_TreetblSelectRowID(AG_Treetbl
    *tbl, int
  rowID);
  
  void
  
  AG_TreetblDeselectRow(AG_Treetbl
    *tbl, AG_TreetblRow
    *row);
  
  void
  
  AG_TreetblDeselectRowID(AG_Treetbl
    *tbl, int
  rowID);
  
  void
  
  AG_TreetblSelectedRow(AG_Treetbl
    *tbl);
  
  void
  
  AG_TreetblSelectAll(AG_Treetbl
    *tbl, AG_TreetblRow
    *row);
  
  void
  
  AG_TreetblDeselectAll(AG_Treetbl
    *tbl, AG_TreetblRow
    *row);
The
    AG_TreetblSelectCol()
    and AG_TreetblDeselectCol() routines select and
    deselect the specified column. The
    AG_TreetblSelectColID() and
    AG_TreetblDeselectColID() variants look up the
    column by index and return -1 if no such column exists.
AG_TreetblSelectRow()
    and AG_TreetblDeselectRow() select or deselect the
    specified row. The AG_TreetblSelectRowID() and
    AG_TreetblDeselectRowID() variants lookup the row by
    ID and return -1 if it is invalid.
AG_TreetblSelectedRow()
    returns the currently selected row or NULL if there is none. If the
    AG_TREETBL_MULTI or
    AG_TREETBL_MULTITOGGLE flags are in effect, the
    first selected row is returned. The AG_Treetbl
    should be locked by the caller.
The
    AG_TreetblSelectAll()
    and AG_TreetblDeselectAll() variants also
    select/deselect the child rows.
void
  
  AG_TreetblExpandRow(AG_Treetbl
    *tbl, AG_TreetblRow
    *row);
  
  void
  
  AG_TreetblCollapseRow(AG_Treetbl
    *tbl, AG_TreetblRow
    *row);
The
    AG_TreetblExpandRow()
    and AG_TreetblCollapseRow() routines control whether
    child rows of row are visible or hidden. This state is
    also controlled by the tree expand/collapse controls.
The AG_Treetbl widget does not generate
    any event.
The AG_Treetbl widget was written by John
    Blitch in 2004 and first appeared in Agar 1.0 as
    AG_Tableview. Agar-1.3.4 first featured the new
    AG_Treetbl interface.