/* > H.Wimp-Funct */

/*****************************************************************************
*                                                                            *
* Hulp routines voor de window omgeving. Deze bestaan uit:                   *
*                                                                            *
*   - Memory management routines (aanvragen geheugen / vrijgeven / debug)    *
*   - String routines (dynamisch string copy/update)                         *
*   - Wimp routines (High level window redraw enz.)                          *
*   - Help systeem (Help systeem dat in elk programma verwerkt kan worden)   *
*   - Printer driver routines (aansturen RiscOs printer driver)              *
*                                                                            *
*                                                                            *
* (C) Bernard Rutgrink 1990                                                  *
*                                                                            *
*****************************************************************************/

#ifndef __stdio_h
#include "stdio.h"
#endif

#ifndef __txtedit_h
#include "txtedit.h"
#endif

#ifndef __wimp_h
#include "wimp.h"
#endif

#ifndef __dbox_h
#include "dbox.h"
#endif

#ifndef __os_h
#include "os.h"
#endif


/*****************************************************************************
*                                                                            *
*                       Memory management routines                           *
*                       --------------------------                           *
*                                                                            *
*****************************************************************************/

/******************************** alloc_mem **********************************
*                                                                            *
*  Description: Vraag geheugen aan m.b.v. heap_alloc. Als er geen geheugen   *
*               meer is, geef dan een error.                                 *
*                                                                            *
*  Parameters:  size_t size                  Aantal aan te vragen bytes      *
*                                                                            *
*  Returns:     void *                       Pointer naar geheugen           *
*                                                                            *
*  Other Info:  Als er geen geheugen meer is, dan wordt de NULL pointer      *
*               terug gegeven (er wordt eerst een error gegeven). Er wordt   *
*               een interne teller bij gehouden die aangeeft hoeveel keer    *
*               er geheugen is aangevraagd.                                  *
*                                                                            *
*****************************************************************************/

extern void *alloc_mem(size_t size,int lineno,char *file);

/******************************* free_mem ************************************
*                                                                            *
*  Description: Geef het aangegevraagde geheugen weer vrij                   *
*                                                                            *
*  Parameters:  void *pointer                Pointer naar vrij te geven      *
*                                            geheugen gebied.                *
*                                                                            *
*  Returns:     void                                                         *
*                                                                            *
*  Other Info:  Als de pointer NULL is, wordt geen geheugen vrij gegeven en  *
*               ook geen error gegenereerd. De interne teller wordt verlaagd *
*                                                                            *
*****************************************************************************/

extern void free_mem(void *pointer);

/**************************** check_memory_alloc *****************************
*                                                                            *
*  Description: Kijk of de interne 'alloc' teller '0' is. Deze routine kan   *
*               gebruikt worden om te kijken of al het aangevraagde geheugen *
*               ook wordt vrij gegeven.                                      *
*                                                                            *
*  Parameters:  void                                                         *
*                                                                            *
*  Returns:     void                                                         *
*                                                                            *
*  Other Info:  Er wordt een error gegeven als de teller niet 0 is. Deze     *
*               routine kan b.v. als allerlaatste worden aangeroepen.        *
*                                                                            *
*****************************************************************************/

extern void check_memory_alloc(void);

/*****************************************************************************
*                                                                            *
*                            String routines                                 *
*                            ---------------                                 *
*                                                                            *
*****************************************************************************/

#define strcpy_mem(a,b)          _strcpy_mem(a,b,__LINE__,__FILE__)
#define strupd_mem(a,b)          _strupd_mem(a,b,__LINE__,__FILE__)

/*************************** strcpy_mem **************************************
*                                                                            *
*  Description: Deze routine is hetzelfde als strcpy, maar er wordt direct   *
*               geheugen voor de string aangevraagd.                         *
*                                                                            *
*  Parameters:  char **destin                Pointer naar kar. pointer       *
*               char *source                 De t kopieren string            *
*                                                                            *
*  Returns:     void                                                         *
*                                                                            *
*  Other Info:  Als er geen geheugen meer is, wordt een error gegenereerd    *
*                                                                            *
*****************************************************************************/

extern void _strcpy_mem(char **destin,char *source,int line,char *file);

/***************************** strupd_mem ************************************
*                                                                            *
*  Description: String update. Een al 'beschreven' string wordt ge-update    *
*               Dit wordt dynamisch gedaan. Het oude geheugen wordt vrij     *
*               gegeven en er wordt niet geheugen aangevraagd. Hierin wordt  *
*               de nieuwe string gekopierd.                                  *
*                                                                            *
*  Parameters:  char **old                   Pointer naar kar. pointer str   *
*               char *new                    Pointer naar wat het moet       *
*                                            worden                          *
*                                                                            *
*  Returns:     void                                                         *
*                                                                            *
*  Other Info:  Als er geen geheugen meer is, wordt een error gegenereerd    *
*                                                                            *
*****************************************************************************/

extern void _strupd_mem(char **old,char *new,int line,char *file);

/*****************************************************************************
*                                                                            *
*                            Window routines                                 *
*                            ---------------                                 *
*                                                                            *
*****************************************************************************/

extern void wimp_force_redraw_easy(wimp_w handle,int x0,int y0,int x1,int y1);

extern void wimp_force_redraw_window_easy(wimp_w handle);

extern void wimp_set_icon_text_easy(wimp_w handle,wimp_i icon,const char *pointer);

extern char *wimp_get_icon_text_easy(wimp_w handle,wimp_i icon);

extern void wimp_front_window_easy(wimp_w handle);

extern void wimp_set_caret_pos_easy(wimp_w handle,wimp_i icon,int index);

extern void wimp_select_icon_easy(wimp_w handle,wimp_i icon);

extern void wimp_flash_icon_easy(wimp_w handle,wimp_i icon,int aantal);

extern BOOL wimp_icon_selected(wimp_w handle,wimp_i icon);

extern void wimp_search_selected_icons(wimp_w handle,wimp_i *results);

extern void wimp_delete_icons(wimp_w handle);

extern void wimp_close_menu(void);

extern int wimp_create_icon_easy(int handle,int x0,int y0,int x1,int y1,int flag,
                          char c0,char c1,char *tekst);

extern void wimp_mouse_to(int xpos,int ypos);

extern void wimp_set_icon_flag_easy(wimp_w handle,wimp_i icon,int keep_same,int set);

/*********************** wimp_move_template_window ***************************
*                                                                            *
*  Description: Zorg ervoor dat twee dezelfde windows niet over elkaar       *
*               worden gezet. Verschuif daarom het window in de template-    *
*               file                                                         *
*                                                                            *
*  Parameters:  const char *name             Naam van het window             *
*                                                                            *
*  Returns:     void                                                         *
*                                                                            *
*  Other Info:  Er wordt vanuit gegaan dat het window met de opgegeven naam  *
*               bestaat.                                                     *
*                                                                            *
*****************************************************************************/

extern void wimp_move_template_window(const char *naam);

/*********************** wimp_centre_template_window *************************
*                                                                            *
*  Description: Zorg ervoor dat een window uit de template file gecentreerd  *
*               op t.o.v. de huidige scherm coordinaten. Het window zal de   *
*               volgende keer dus midden op het scherm ge-opend worden.      *
*                                                                            *
*  Parameters:  const char *name             Naam van het window             *
*                                                                            *
*  Returns:     void                                                         *
*                                                                            *
*  Other Info:  Er wordt vanuit gegaan dat het window met de opgegeven naam  *
*               bestaat.                                                     *
*                                                                            * 
*****************************************************************************/
    
void wimp_centre_template_window(const char *naam);

int mode_x_res(void);

int mode_y_res(void);

/*****************************************************************************
*                                                                            *
*                         Help system routines                               *
*                         --------------------                               *
*                                                                            *
*                                                                            *
*  Syntax beschrijving 'help' file                                           *
*  -------------------------------                                           *
*                                                                            *
*  nivo          [0-9]                                                       *
*  woord         [A-Za-z0-9]*                                                *
*  tekst         ({woord}|" ")*                                              *
*                                                                            *
*  label         ":"{nivo}{woord}\n\n                                        *
*  link          ">"{nivo}\n\n                                               *
*  helptekst     {tekst}\n\n                                                 *
*                                                                            *
*                                                                            *
*  help          ({label}({link}|{helptekst}))*                              *
*                                                                            *
*****************************************************************************/


/************************* help_splits_bij_spatie ****************************
*                                                                            *
*  Description: Hulp routine die een regel splitst bij een spatie of een '-' *
*                                                                            *
*  Parameters:  char *string                 De regel                        *
*                                                                            *
*  Returns:     void                                                         *
*                                                                            *
*  Other Info:  Interne routine                                              *
*                                                                            *
*****************************************************************************/

extern void help_splits_bij_spatie(char *string);

/*************************** zoek_help_item **********************************
*                                                                            *
*  Description: Zoekt in de help-gegevens naar een bepaald 'help-item'       *
*                                                                            *
*  Parameters:  char *item                   Het te zoeken item              *
*                                                                            *
*  Returns:     struct helpstr *             Pointer naar de gevonden help-  *
*                                            structure.                      *
*                                                                            *
*  Other Info:  Als het item niet gevonden wordt, dan wordt er een wimp-     *
*               error gegenereerd. De pointer NULL wordt terug gegeven.      *
*               Interne routine.                                             *
*                                                                            *
*****************************************************************************/

extern struct helpstr *zoek_help_item(char *item);

/***************************** show_help_tekst *******************************
*                                                                            *
*  Description: Popup window met help-teksten bij bepaald item               *
*                                                                            *
*  Parameters:  struct helpstr *pointer      Pointer naar de 'help-tekst'    *
*                                                                            *
*  Returns:     BOOL                         Gesloten door CloseIcon         *
*                                                                            *
*  Other Info:  Interne routine                                              *
*                                                                            *
*****************************************************************************/

BOOL show_help_tekst(struct helpstr *pointer);

/**************************** help_system_handler ****************************
*                                                                            *
*  Description: Handler routine voor het help-menu                           *
*                                                                            *
*  Parameters:  dbox menu                    Pointer naar dbox               *
*               void *handle                 level van menu                  *
*                                                                            *
*  Returns:     void                                                         *
*                                                                            *
*  Other Info:  Interne routine                                              *
*                                                                            *
*****************************************************************************/

extern void help_system_handler(dbox menu,void *handle);

/***************************** show_help_menu ********************************
*                                                                            *
*  Description: Laat het menu-window zien van een bepaald level. Het help    *
*               systeem moet worden aangeroepen met show_help_menu(0)        *
*                                                                            *
*  Parameters:  int level                    level van menu                  *
*                                                                            *
*  Returns:     void                                                         *
*                                                                            *
*  Other Info:  Geen                                                         *
*                                                                            *
*****************************************************************************/

extern void show_help_menu(int level);

/************************* init_help_system **********************************
*                                                                            *
*  Description: Initialiseer het help systeem. Deze routine mg maar n keer *
*               worden aangeroepen. Hij moet worden aangeroepen na res_init  *
*               Er wordt in de applicatie directory gekeken naar de file     *
*               'Help'. Deze file moet aan het help-system formaat voldoen.  *
*                                                                            *
*  Parameters:  void                                                         *
*                                                                            *
*  Returns:     void                                                         *
*                                                                            *
*  Other Info:  Geen                                                         *
*                                                                            *
*****************************************************************************/

extern void init_help_system(void);

/*********************** exit_help_system ************************************
*                                                                            *
*  Description: Routine die zorgt dat al het aangevraagde geheugen wordt     *
*               vrij-gegeven.                                                *
*                                                                            *
*  Parameters:  void                                                         *
*                                                                            *
*  Returns:     void                                                         *
*                                                                            *
*  Other Info:  Geen                                                         *
*                                                                            *
*****************************************************************************/

extern void exit_help_system(void);

/*****************************************************************************
*                                                                            *
*                       Printer driver routines                              *
*                       -----------------------                              *
*                                                                            *
*****************************************************************************/

os_error *PrintAbortJob(int filehandle);

os_error *PrintEndJob(int filehandle);

os_error *PrintCancelJob(int filehandle);

os_error *PrintSelectJob(int filehandle,const char *titel,int *prev_filehandle);

os_error *PrintPageSize(int *xsize,int *ysize,
                   int *left,int *bottom,int *right,int *top);

os_error *PrintDrawPage(int copies,int pagenum,int *rectangle,int *id,int *more);

os_error *PrintGiveRectangle(int id,int *rectangle,int *dimentions,int *pos);

os_error *PrintGetRectangle(int *buf,int *id,int *more);

os_error *PrintGetResolution(int *xres,int *yres);

extern int ConvertToPoint(int os_unit);

extern int ConvertToOS(int point);

BOOL check_printer_driver(void);

/*************************************************************************
 Error afvang van escape tijdens het printen. Er is een globale variabele
 waarin het filenummer van de huidige print job wordt gezet. Na het drukken
 van escape wordt deze job 'aborted'. Na het printen van de job, moet de
 error handler weer verwijderd worden. Na de error wordt een longjump naar
 'jmp_main' uitgevoerd. Deze moet naar de main poll lus wijzen.
**************************************************************************/

extern void pdriver_release_error(void);

extern void print_error(int signal);

extern void pdriver_error_init(FILE *filehandle);

extern void pdriver_release_error(void);

extern FILE *pdriver_fileptr;
extern int  pdriver_filehandle;
extern int  pdriver_oldfilehandle;

/******************************* pdriver_start_job ***************************
*                                                                            *
*  Description: Algemene routine voor het starten van een print job. Deze    *
*               routine moet aangeroepen worden als er begonnen moet worden  *
*               met printen. Na AL het print werk, moet de routine           *
*               pdriver_end_job worden aangeroepen.                          *
*                                                                            *
*  Parameters:  geen                                                         *
*                                                                            *
*  Returns:     BOOL                               True als gelukt is        *
*                                                                            *
*  Other Info:  geen                                                         *
*                                                                            * 
*****************************************************************************/

extern BOOL pdriver_start_job(void);
                             
extern BOOL pdriver_end_job(void);

extern int pdriver_get_type(void);

/******************************** print_page *********************************
*                                                                            *
*  Description: Algemene print-pagina routine. Deze routine zorgt ervoor dat *
*               de gegevens voor de printer driver goed worden ge-           *
*               initialiseerd. Hierna wordt de pagina geprint. De routine    *
*               die de gegevens op het scherm zet wordt als parameter mee-   *
*               gegeven. Een pagina ligt tussen de coordinaten 0,0 en        *
*               1280,1900. Hiertussen moet de 'teken' routine alle gegevens  *
*               zetten om de op papier te krijgen.                           *
*                                                                            *
*  Parameters:  BOOL (*draw_info)(void *,int *)    Bouw scherm op routine    *
*               int *pointer                       Pointer die meegegeven    *
*                                                  moet worden aan de bouw-  *
*                                                  scherm op routine.        *
*               int *page                          Pointer naar pagina num.  *
*                                                                            *
*  Returns:     BOOL                               True als printen gelukt is*
*                                                                            *
*  Other Info:  Het pagina nummer wordt meegegeven aan de opbouw routine.    *
*               Het pagina nummer wordt niet automatisch opgehoogd.          *
*               De routine pdriver_start_job moet zijn aangeroepen voordat   *
*               er geprint kan worden.                                       *
*                                                                            *
*****************************************************************************/

BOOL print_page(BOOL (*draw_info)(void *,int *),void *pointer,int *page);

extern void print_demo(int bounds[]);


/*****************************************************************************
*                                                                            *
*                       Edit window management routines                      *
*                       -------------------------------                      *
*                                                                            *
* De volgende routines zorgen ervoor dat 'strings' met behulp van edit       *
* windows ge-edit kunnen worden. Als identificatie van de 'string' wordt de  *
* pointer naar deze 'string' gebruikt. Deze mag dus tijdens het editen niet  *
* veranderen. LET DUS OP BIJ HET VRIJ GEVEN VAN GEHEUGEN. ALS ER EDIT        *
* WINDOW's OPEN ZIJN, SLUIT DEZE DAN.                                        *
*                                                                            *
*****************************************************************************/

extern char *txt_copy_text(txt t);

extern BOOL text_window_save_handler(char *filename,txtedit_state *state,void *handle);

extern void text_window_close_handler(char *name,txtedit_state *state,void *handle);

extern void close_text_window(char **string);

extern void open_text_window(char **string,char *name);

extern void init_edit_windows(void);
