#ifndef __GOLEM_H
#define __GOLEM_H

#ifndef __WINDOW_H
#include <window.h>
#endif

#ifndef __CONFIG_H
class TConfig;
#endif

#ifndef __STRINGS_H
#include <strings.h>
#endif

#ifndef __RELATION_H
class TRelation;
#endif

// @doc EXTERNAL

// @class TGolem | Classe per le gestione del Generic Object Linking & Embedding Mechanism
//
// @base public | TSortable
class TGolem : public TSortable

// @author:(INTERNAL) Guido

// @access:(INTERNAL) Private Member
{     
  // @cmember:(INTERNAL) Numero di GOLEM costruiti fin'ora
  static long _count;
  // @cmember:(INTERNAL) <c TConfig> di appoggio per leggere i paramentri
  static TConfig* _config; 
  // @cmember:(INTERNAL) Nome del file di config
  static TFilename* _path;
  // @cmember:(INTERNAL) <c TRelation> dei GOLEM
  static TRelation* _golem;

  // @cmember:(INTERNAL) Nome della classe del GOLEM
  TString16 _class;
  // @cmember:(INTERNAL) Identificatore del GOLEM
  long _id;

// @access Protected Member
protected:
  // @cmember Ritorna il path completo dell'oggetto inserito. <p test> verifica se esiste
  const TFilename& path(bool test = FALSE) const;
  // @cmember Ritorna l'estensione del GOLEM
  const char* ext() const;
  // @cmember Ritorna il <c TConfig> di appoggio per leggere i paramentri
  TConfig& config() const;
  // @cmember Genera il prossimo identificatore libero
  long new_id() const;
  
protected:// TSortable
  // @cmember Confronta due GOLEM (vedi <c TSortable>)
  virtual int compare(const TSortable& o) const;

// @access Public Member
public:   // TObject
  // @cmember Ritorna il nome della classe
  virtual const char* class_name() const;
  // @cmember Ritorna l'identificatore della classe
  virtual word class_id() const;
  // @cmember Ritorna se si tratta di un oggetto valido
  virtual bool ok() const;

public:
  // @cmember Ritorna l'identificatore dell'icona del GOLEM
  virtual short icon() const;
  // @cmember Chiama il programma di moifica del GOLEM
  virtual bool edit();
  // @cmember Mostra il dialog box di selezione del file
  virtual bool import();
  
  // @cmember Ritorna l'identificatore del GOLEM
  long id() const 
  { return _id; } 

  // @cmember Costruttore 
  TGolem(const char* cls, long id);
  // @cmember Distruttore
  virtual ~TGolem();
};

// @doc EXTERNAL

// @class TDDE | Classe per la gestione del DDE
//
// @base public | TObject
class TDDE : public TObject

// @comm Attualmente utilizzato all'avvio di PRASSI per comunicare al Program Manager il nome
//     dell'utente in modo da comunicarlo a tutti i programmi PRASSI avviati in seguito.

// @author:(INTERNAL) Guido

// @access:(INTERNAL) Private Member
{ 
  // @cmember:(INTERNAL) Handle della finestra Windows
  word _hwnd;
  // @cmember:(INTERNAL) Handle della finestra del server DDE
  word _server;
  // @cmember:(INTERNAL) Puntatore alla funzione di gestione dei messaggi
  long _old_hook;
  
// @access Public Member
public:                                                
  virtual bool do_initiate(word id, const TString& topic) { return FALSE; }
  virtual bool do_execute(word id, const TString& cmd) { return FALSE; }
  virtual bool do_ack(word id) { _server = id; return TRUE; }
  virtual bool do_terminate(word id) { return FALSE; }
  virtual bool do_custom_message(word msg, word wparam, long lparam) { return FALSE; }
  virtual const char* get_app_name() const { return NULL; }
  virtual const char* get_topics() const { return NULL; }

  // @cmember Stabilisce il collegamento dell'<p app> per i <p topic> indicati
  bool initiate(const char* app, const char* topic);
  // @cmember Esegue il comando <p cmd>
  bool execute(const char* cmd) const;
  // @cmember Lancia il server ed esegue un comando
  bool execute(const char* app, const char* topic, const char* cmd, const char* filename = NULL);
  // @cmember Chiude la connessione
  void terminate();
  
  
  // @cmember Inizia a fornire i servizi di DDE server
  bool start_server();
  
  word hwnd() const { return _hwnd; }

  // @cmember Costruttore
  TDDE();
  // @cmember Distruttore
  virtual ~TDDE();
};

#endif