#ifndef __TREECTRL_H
#define __TREECTRL_H

#ifndef __MASKFLD_H
#include "maskfld.h"
#endif

// Native control host window: autresizes its unique child control
class TControl_host_window : public TField_window
{
protected:
  WINDOW _ctrl;

protected:
  virtual void handler(WINDOW win, EVENT* ep);
  TControl_host_window(int x, int y, int dx, int dy, 
                       WINDOW parent, TWindowed_field* owner);
};

class TGolem_client_field : public TWindowed_field
{             
  TGolem_field* _driver;

protected:  // TObject
  virtual word class_id() const;
  virtual bool is_kind_of(word cid) const;
          
protected: // TWindowed_field
  virtual TField_window* create_window(int x, int y, int dx, int dy, WINDOW parent);
  virtual bool parse_item(TScanner& scan);
  
public:                                                 
  TGolem_field* driver() const { return _driver; }
  virtual bool on_hit();

  TGolem_client_field(TMask* m);
  virtual ~TGolem_client_field();
};

// Implemented in tree.cpp
class TTree;

class TTree_field : public TWindowed_field
{ 
protected:  // TObject
  virtual word class_id() const;
  virtual bool is_kind_of(word cid) const;
          
protected: // TWindowed_field
  virtual TField_window* create_window(int x, int y, int dx, int dy, WINDOW parent);

public:                                                 
  TTree* tree() const;
  void set_tree(TTree* t);
  
  void hide_leaves(bool yes = true);
  void show_leaves(bool yes = true) { hide_leaves(!yes); }
  bool select_current();
  bool goto_selected();

  void set_header(const char* head);
  void set_row_height(int rh);

  TTree_field(TMask* m) : TWindowed_field(m) { }
  virtual ~TTree_field() { }
};

class TOutlook_field : public TWindowed_field
{
  TString4 _str; // Current selection

protected:  // TMask_field
  virtual word class_id() const;
  virtual bool is_kind_of(word cid) const;

  virtual const TString& get_window_data();
  virtual void set_window_data(const char* data);
  virtual bool on_key(KEY key);

protected: // TWindowed_field
  virtual TField_window* create_window(int x, int y, int dx, int dy, WINDOW parent);

public:
  int add_item(short icon, const char* text, int flags);
  void create(short dlg, int x, int y, int dx, int dy, WINDOW parent);
  void clear();

  int items() const;
  virtual void set(const char* data);
  virtual const TString& get() const;

  TOutlook_field(TMask* m) : TWindowed_field(m) { }
  virtual ~TOutlook_field() { }
};

class TSlider_field : public TWindowed_field
{
  short _buddy;
  real _range_min, _range_max;

protected:  // TMask_field
  virtual word class_id() const;
  virtual bool is_kind_of(word cid) const;

  virtual const TString& get_window_data();
  virtual void set_window_data(const char* data);

protected: // TWindowed_field
  virtual TField_window* create_window(int x, int y, int dx, int dy, WINDOW parent);
  virtual bool parse_item(TScanner& scanner);

  const char* get_buddy() const;
  void set_buddy(const char* b) const;

public:
  virtual void set(const char* data);
  virtual const TString& get() const;
  virtual bool on_hit();

  void set_range(const real& mi, const real& ma);
  void set_range(int mi, int ma);
  void range(real& mi, real& ma);

  TSlider_field(TMask* m);
  virtual ~TSlider_field() { }
};


class TProp_field : public TWindowed_field
{
protected:
  virtual TField_window* create_window(int x, int y, int dx, int dy, WINDOW parent);
  virtual bool parse_item(TScanner& scanner);

public:
  virtual word class_id() const;
  virtual bool is_kind_of(word cid) const;

  void freeze(bool on);
  bool set_property(const char* name, const char* value, const char* label = NULL);
  bool set_property(const char* name, COLOR value, const char* label = NULL);
  bool set_property(const char* name, long value, const char* label = NULL);

  const TString& get_property(const char* name) const;
  COLOR get_color_property(const char* name) const;
  long get_long_property(const char* name) const;;

  TProp_field(TMask* m);
};

#endif