#ifndef __VE0100_H
#define __VE0100_H

#define CHANGE_MESSAGE "Sono state effettuate modifiche alla configurazione.\nPrima di eseguire la gestione documenti occorre rigenerare le maschere.\nDesideri farlo ora ?"

#ifndef __RELAPP_H
#include <relapp.h>
#endif

#ifndef __VELIB_H
#include "velib.h"
#endif

// Definizione della classe dell'applicazione motore
class TMotore_application : public TRelation_application
{
  TArray _file;               // Tutti i fiels da usare

  // Puntatore al profilo del documento caricato
  TConfig  * _config_ditta;  

  // Puntatore alla maschera di ricerca
  TMask * _msk; 
  TDocumento_mask * _docmsk;
//  TMask * _occas_mask;

  // puntatore alla relazione
  TRelation * _rel;

  TString16 _codnum;
  TString16 _tipodoc;
  
  // Array di maschere documento

  TAssoc_array _doc_masks;
  TSelect_color_mask * _sel_color;
  int _link_pos;

  // Ridefinizione dei metodi virtuali
  virtual bool user_create( );
  virtual bool user_destroy( );
  virtual bool menu(MENU_TAG mt);
  virtual TMask* get_mask( int mode );
  virtual bool changing_mask( int mode );
  virtual void init_query_mode(TMask& m);
  virtual void init_insert_mode( TMask& m );
  virtual void init_modify_mode( TMask& m );
  virtual int read( TMask& m );
  virtual int write( const TMask& m );
  virtual int rewrite( const TMask& m );
  virtual void print();
  virtual bool has_filtered_cursor() const { return TRUE; }

  // Funzioni da associare ad ogni procedura
  int user_function( int index );

  void user_set_handler( int fieldid, int index, TMask* m = NULL );

protected:

  virtual void on_firm_change();

  // Procedure e funzioni per la gestione degli stati
  int stato_corrente( );

  // Handler per la maschera di ricerca
  static bool ndoc_handler( TMask_field& f, KEY key );

  // caricamento Inifile
  virtual void sheet2ini(TSheet_field& s, TConfig& ini);
  virtual void ini2mask(TConfig& ini, TMask& m, bool query);
public:
  virtual TRelation* get_relation( ) const { return _rel;}

  // Funzioni di accesso alle variabili private

  TMask & query_mask() { CHECK( _msk, "Maschera di ricerca nulla!" ); return *_msk; }
  TDocumento_mask & edit_mask() { CHECK( _docmsk, "Maschera di edit nulla!" ); return *_docmsk; }
  TRelation & rel() { CHECK( _rel, "Relazione nulla!" ); return *_rel; }
  TSheet_field & sheet() { return edit_mask().sheet(); }
  TConfig & config_ditta() {return *_config_ditta; }
  TDocumento & doc() {return edit_mask().doc(); }

  // Operazione
  TMotore_application( ) { }
  virtual ~TMotore_application( ) { }
  
  virtual const char* get_next_key( );
};

inline TMotore_application& app() { return (TMotore_application &) main_app(); }

#endif