// C++ code Copyright (C) David R. Evans G4AMJ/NQ0I

// classes for VGA mode of MIDAS

#ifndef SMVGAMODEH
#define SMVGAMODEH

#include <sm_batch.h>
#include <surf_vga.h>

class vga_mode;

extern vga_mode* vmode;

class vgamemberfunctionlist
{ typedef int (vga_mode::*VPMFSS)(DREstring&, DREstring&);
  VPMFSS array[50];

  int index;

public:
  vgamemberfunctionlist(void) : index(0) { }

  inline void operator+=(VPMFSS vpmfss) { array[index++] = vpmfss; }
  inline int length(void) { return index; }
  inline VPMFSS operator[](const int n) { return array[n]; } 
};

class vga_mode : public batch_mode
{ boolean Record, Play;
  
  char* Tmpdir;

  FILE* Record_file, *Play_file;
  
  vgamemberfunctionlist dispatch_functions;

  vga vga_screen;

  DREstring _get_command(void); 
  void _prompt(const char*, const int); 
  void _generate_command_list(void); 
  void _display_text(DREstring& msg, DREstring& title, const int clr = 7, 
                     const boolean centered = false);

  typedef void (vga_mode::*PMFV)(void);
  PMFV _screen_dump_function;

  int _query(DREstring&, DREstring&);
  int _cd(DREstring&, DREstring&);
  int _dir(DREstring&, DREstring&);
  int _drive(DREstring&, DREstring&);
  int _last(DREstring&, DREstring&);
  int _play(DREstring&, DREstring&);
  int _pwd(DREstring&, DREstring&);
  int _record(DREstring&, DREstring&);
  int _replot(DREstring&, DREstring&);
  int _set(DREstring&, DREstring&);

  void _dump_to_pcl(void);

public:
  vga_mode(const float);
  ~vga_mode(void);

  void execute(void);
  void clear_status(void) { display_status((DREstring)""); }
  void display_status(DREstring&);
  void error(DREstring&);
};

#endif
