#ifndef __RELAPP_H
#define __RELAPP_H

#ifndef __APPLICAT_H
#include <applicat.h>
#endif

#ifndef __RELATION_H
#include <relation.h>
#endif


#ifndef __MASK_H
#include <mask.h>
#endif

class TKey_array;

class TRelation_application : public TApplication
{
  TMask * _mask;
  TKey_array* _maskeys;
  long _first, _last;
  int    _search_id;
  
  TString _autoins_caller;
  bool _lnflag;
  TToken_string _fixed;
  
  virtual bool create();
  virtual bool destroy();
  
  bool filter();
  bool test_key(byte k, bool err);
  bool save(bool check_dirty);
  void enable_query();
  void set_toolbar(bool all);
  
  int set_mode(int mode);       // Seleziona il nuovo modo e ritorna il vecchio
  void set_limits(byte what = 0x3);
  void query_insert_mode() { query_mode(TRUE); }
  void insert_mode();   // Entra in modo inserimento
  virtual bool main_loop();       // Ciclo principale
  TMask_field*  get_search_field() const;

protected:
  TLocalisamfile& file() const { return *get_relation()->lfile(); }
  void set_fixed();   // Fissa i campi non modificabili
  bool search_mode(); // Attiva la maschera di ricerca
  void query_mode(bool pre_ins = FALSE);        // Entra in modo ricerca
  bool modify_mode();   // Entra in modo modifica
  void  setkey();
  bool lnflag() const { return _lnflag;}
  long first() const { return _first;}
  long last() const { return _first;}
  TMask& curr_mask() const { return *_mask; }
  const TString& autoins_caller() const { return _autoins_caller;}
  virtual bool menu(MENU_TAG m);

  virtual bool user_create() pure;
  virtual bool user_destroy() pure;
  virtual TMask* get_mask(int mode) pure;
  virtual bool changing_mask(int mode) pure;
  virtual TRelation* get_relation() const pure;
  virtual int read(TMask& m);
  virtual int write(const TMask& m);
  virtual int rewrite(const TMask& m);
  virtual bool remove();
  virtual const char* get_next_key() { return ""; }
  virtual bool protected_record(TRectype&) { return FALSE; }
  virtual void init_query_mode(TMask&) { }
  virtual void init_query_insert_mode(TMask& m) { init_query_mode(m); }
  virtual void init_insert_mode(TMask&) { }
  virtual void init_modify_mode(TMask&) { }
  virtual void write_enable(const bool on = TRUE) { get_relation()->write_enable(-1, on); }
  void write_disable() { write_enable(FALSE); }
  
  bool autonum(TMask* m, bool rec);
  void set_search_field(short id) { _search_id = id;}
  bool has_filtered_cursor() const { return filtered() || force_cursor_usage();}
  
public:
  TRelation_application();
  virtual ~TRelation_application();
  bool filtered() const { return _fixed.not_empty(); }
  void set_first(long first) { _first = first;}
  void set_last(long last) { _last = last;}
  bool find(byte key = 0);
  virtual bool force_cursor_usage() const { return FALSE;}
};

#endif