package body agar.gui.widget.tlist is

  package cbinds is
    procedure set_item_height
      (tlist  : tlist_access_t;
       height : c.int);
    pragma import (c, set_item_height, "AG_TlistSetItemHeight");

    procedure size_hint
      (tlist     : tlist_access_t;
       text      : cs.chars_ptr;
       num_items : c.int);
    pragma import (c, size_hint, "AG_TlistSizeHint");

    procedure size_hint_pixels
      (tlist     : tlist_access_t;
       width     : c.int;
       num_items : c.int);
    pragma import (c, size_hint_pixels, "AG_TlistSizeHintPixels");

    procedure size_hint_largest
      (tlist     : tlist_access_t;
       num_items : c.int);
    pragma import (c, size_hint_largest, "AG_TlistSizeHintLargest");

    procedure set_double_click_callback
      (tlist     : tlist_access_t;
       callback  : agar.core.event.callback_t;
       fmt       : agar.core.types.void_ptr_t);
    pragma import (c, set_double_click_callback, "AG_TlistSetDblClickFn");

    procedure set_changed_callback
      (tlist     : tlist_access_t;
       callback  : agar.core.event.callback_t;
       fmt       : agar.core.types.void_ptr_t);
    pragma import (c, set_changed_callback, "AG_TlistSetChangedFn");

    function list_select_text
      (tlist : tlist_access_t;
       text  : cs.chars_ptr) return item_access_t;
    pragma import (c, list_select_text, "AG_TlistSelectText");

    function list_find_by_index
      (tlist : tlist_access_t;
       index : c.int) return item_access_t;
    pragma import (c, list_find_by_index, "AG_TlistFindByIndex");

    function set_popup_callback
      (tlist    : tlist_access_t;
       callback : agar.core.event.callback_t;
       fmt      : agar.core.types.void_ptr_t) return agar.gui.widget.menu.item_access_t;
    pragma import (c, set_popup_callback, "AG_TlistSetPopupFn");

    function set_popup
      (tlist    : tlist_access_t;
       category : cs.chars_ptr) return agar.gui.widget.menu.item_access_t;
    pragma import (c, set_popup, "AG_TlistSetPopup");
  end cbinds;

  procedure set_item_height
    (tlist  : tlist_access_t;
     height : natural) is
  begin
    cbinds.set_item_height
      (tlist  => tlist,
       height => c.int (height));
  end set_item_height;

  procedure size_hint
    (tlist     : tlist_access_t;
     text      : string;
     num_items : natural)
  is
    c_text : aliased c.char_array := c.to_c (text);
  begin
    cbinds.size_hint
      (tlist     => tlist,
       text      => cs.to_chars_ptr (c_text'unchecked_access),
       num_items => c.int (num_items));
  end size_hint;

  procedure size_hint_pixels
    (tlist     : tlist_access_t;
     width     : natural;
     num_items : natural) is
  begin
    cbinds.size_hint_pixels
      (tlist     => tlist,
       width     => c.int (width),
       num_items => c.int (num_items));
  end size_hint_pixels;

  procedure size_hint_largest
    (tlist     : tlist_access_t;
     num_items : natural) is
  begin
    cbinds.size_hint_largest
      (tlist     => tlist,
       num_items => c.int (num_items));
  end size_hint_largest;

  procedure set_double_click_callback
    (tlist     : tlist_access_t;
     callback  : agar.core.event.callback_t) is
  begin
    cbinds.set_double_click_callback
      (tlist    => tlist,
       callback => callback,
       fmt      => agar.core.types.null_ptr);
  end set_double_click_callback;

  procedure set_changed_callback
    (tlist     : tlist_access_t;
     callback  : agar.core.event.callback_t) is
  begin
    cbinds.set_changed_callback
      (tlist    => tlist,
       callback => callback,
       fmt      => agar.core.types.null_ptr);
  end set_changed_callback;

  function list_select_text
    (tlist : tlist_access_t;
     text  : string) return item_access_t
  is
    c_text : aliased c.char_array := c.to_c (text);
  begin
    return cbinds.list_select_text
      (tlist => tlist,
       text  => cs.to_chars_ptr (c_text'unchecked_access));
  end list_select_text;

  function list_find_by_index
    (tlist : tlist_access_t;
     index : integer) return item_access_t is
  begin
    return cbinds.list_find_by_index
      (tlist => tlist,
       index => c.int (index));
  end list_find_by_index;

  function set_popup_callback
    (tlist    : tlist_access_t;
     callback : agar.core.event.callback_t) return agar.gui.widget.menu.item_access_t is
  begin
    return cbinds.set_popup_callback
      (tlist    => tlist,
       callback => callback,
       fmt      => agar.core.types.null_ptr);
  end set_popup_callback;

  function set_popup
    (tlist    : tlist_access_t;
     category : string) return agar.gui.widget.menu.item_access_t
  is
    c_cat : aliased c.char_array := c.to_c (category);
  begin
    return cbinds.set_popup
      (tlist    => tlist,
       category => cs.to_chars_ptr (c_cat'unchecked_access));
  end set_popup;

  function widget (tlist : tlist_access_t) return widget_access_t is
  begin
    return tlist.widget'access;
  end widget;

end agar.gui.widget.tlist;