/******************************************************************************
*
*  NSSDC/CDF                                    Header file for `widgets'.
*
*  Version 1.3a, 30-Mar-97, Hughes STX.
*
*  Modification history:
*
*   V1.0  26-Nov-93, J Love     Original version.
*   V1.0a  4-Feb-94, J Love     DEC Alpha/OpenVMS port.
*   V1.0b  6-Apr-94, J Love     Solaris using GNU C compiler.
*   V1.1  13-Dec-94, J Love     CDF V2.5.
*   V1.1a 23-Jan-95, J Love     Primary/alternate "current" item movement keys
*                               for ItemWindow.
*   V1.1b  7-Mar-95, J Love     Added FieldWindow.
*   V1.2  30-Mar-95, J Love     POSIX.
*   V1.2a  6-Sep-95, J Love     CDFexport-related changes.
*   V1.3  18-Jul-96, J Love     CDF V2.6.
*   V1.3a 30-Mar-97, J Love     Allow FieldWindow fields to grow larger than
*                               their on-screen width.
*
******************************************************************************/

#if !defined(WIDGETSh_INCLUDEd__)
#define WIDGETSh_INCLUDEd__

/******************************************************************************
* Include files.
******************************************************************************/

#include "windoz.h"

/******************************************************************************
* Constants.
******************************************************************************/

#define MAX_INFO_WINDOW_eLINES  3
#define INFOtextMAX             (MAX_INFO_WINDOW_eLINES*(SCREEN_WIDTH-2+1))

/******************************************************************************
* ItemWindow operations.
*
*  ItemWindow (NEWiw, &IWstruct, ItemNumber);
*  ItemWindow (UPDATEiw, &IWstruct, ItemNumber);
*  ItemWindow (READiw, &IWstruct);
*  ItemWindow (DELETEiw, &IWstruct);
*  ItemWindow (UNDISPLAYiw, &IWstruct);
*  ItemWindow (REDISPLAYiw, &IWstruct);
*  ItemWindow (BEEPiw, &IWstruct);
*
*  where,
*
*    <op>iw......................the operation to perform.
*    IWstruct....................a pointer to an `ItemWindowStruct' structure.
*    ItemNumber(int).............the initial current item number.
*
******************************************************************************/

#define NEWiw           1       /* Create new menu. */
#define UPDATEiw        2       /* Update sections. */
#define READiw          3       /* Read keystrokes until `exit' key entered. */
#define DELETEiw        4       /* Delete menu. */
#define UNDISPLAYiw     5       /* Erase menu (it still exists though). */
#define REDISPLAYiw     6       /* Redisplay menu. */
#define BEEPiw          7       /* Beep. */

/******************************************************************************
* ItemWindow structure.
******************************************************************************/

struct ItemWindowStruct {
  /***************************************************************************
  * These must be initialized before calling `ItemWindow' the first time.
  ***************************************************************************/
  int ULrow;
  int ULcol;
  int nColsTotal;               /* Includes left and right borders. */
  char *label;
  int NhLines;
  char **hLines;
  int NiLines;
  char **iLines;
  int nItems;
  int *iLineNs;
  int *iCols;
  int *iLens;
  int NiRows;
  int NtLines;
  char **tLines;
  int *exitChars;               /* The characters which cause an exit from
				   the prompt window.  Terminated by NUL. */
  int refreshChar;              /* Causes entire screen to be refreshed. */
  Logical iPct;                 /* TRUE if a percentage indicator should be
				   displayed in the item section. */
  int NSkey;                    /* Next-screen key. */
  int PSkey;                    /* Prev-screen key. */
  /***************************************************************************
  * These are initialized/calculated/returned by `ItemWindow'.
  ***************************************************************************/
  int itemN;                    /* Current item number. */
  int key;                      /* Key entered causing exit from menu. */
  /***************************************************************************
  * These are for internal use by `ItemWindow'.
  ***************************************************************************/
  int nRowsTotal;               /* Total number of rows (including top and
				   bottom border rows). */
  int nColS;                    /* Doesn't include left and right borders. */
  int *iUpTo;
  int *iDownTo;
  int *iLeftTo;
  int *iRightTo;
  int hRowT, iRowT, tRowT;      /* Top row for section. */
  int hRowB, iRowB, tRowB;      /* Bottom row for section.  For the item
				   section, it is the last row actually
				   used. */
  Logical iScroll;              /* TRUE if item section needs to be scrolled
				   (more lines than rows). */
  int iRowN;                    /* Row number in item section containing
				   current item. */
  int iPctRowN;                 /* Row number of item section percentage
				   indicator. */
  int iPctColN;                 /* Column number of item section percentage
				   indicator. */
  WINDOWid wid;                 /* Window identifier. */
};

/******************************************************************************
* ItemWindow "current" item primary/alternate movement keys.
******************************************************************************/

#define IW_DOWN         KB_DOWNARROW
#define IW_UP           KB_UPARROW
#define IW_LEFT         KB_LEFTARROW
#define IW_RIGHT        KB_RIGHTARROW

#define IW_DOWNx        KB_d
#define IW_UPx          KB_u
#define IW_LEFTx        KB_l
#define IW_RIGHTx       KB_r

/******************************************************************************
* PromptWindow operations.
*
*  PromptWindow (NEWpw, &PWstruct, CursorAtThisChar, InsertMode);
*  PromptWindow (RESETpw, &PWstruct, CursorAtThisChar, InsertMode);
*  PromptWindow (READpw, &PWstruct);
*  PromptWindow (UNDISPLAYpw, &PWstruct);
*  PromptWindow (REDISPLAYpw, &PWstruct);
*  PromptWindow (DELETEpw, &PWstruct);
*  PromptWindow (BEEPpw, &PWstruct);
*
*  where,
*    <op>pw...................the operation to perform.
*    PWstruct.................a pointer to a `PromptWindowStruct' structure.
*    CursorAtThisChar(int)....character position at which to start the cursor.
*    InsertMode(Logical)......initial insert mode.  TRUE means insert, FALSE
*                             means overstrike.  `TOGGLEchar' toggles this
*                             mode after it is initially set.
*
******************************************************************************/

#define NEWpw           1       /* Create new window. */
#define RESETpw         2       /* Reset window. */
#define READpw          3       /* Read keystrokes until `exit' key entered. */
#define DELETEpw        4       /* Delete window. */
#define BEEPpw          5       /* Beep. */
#define UNDISPLAYpw     6       /* Erase window (it still exists though). */
#define REDISPLAYpw     7       /* Redisplay window. */

/******************************************************************************
* PromptWindow structure.
******************************************************************************/

struct PromptWindowStruct {
  /***************************************************************************
  * These must be initialized before calling `PromptWindow' the first time.
  ***************************************************************************/
  char *label;
  int ULrow;
  int ULcol;
  int nColsTotal;               /* Includes left and right borders. */
  int NhLines;
  char **hLines;
  int maxChars;
  char *value;
  int NtLines;
  char **tLines;
  int *exitChars;               /* The characters which cause an exit from
				   the prompt window.  Terminated by NUL. */
  int refreshChar;              /* Causes entire screen to be refreshed. */
  int SOLchar;                  /* Moves cursor to start-of-line. */
  int EOLchar;                  /* Moves cursor to end-of-line. */
  int TOGGLEchar;               /* Toggles between insert mode and overstrike
				   mode. */
  /***************************************************************************
  * These are initialized/calculated/returned by `PromptWindow'.
  ***************************************************************************/
  int key;                      /* Key entered causing exit from menu. */
  /***************************************************************************
  * These are for internal use by `PromptWindow'.
  ***************************************************************************/
  Logical insertMode;           /* If TRUE, insert mode.  If FALSE, overstrike
				   mode. */
  int nRowsTotal;               /* Total number of rows (including top and
				   bottom border rows). */
  int nColS;                    /* Doesn't include left and right borders. */
  int curCol;                   /* Current column cursor is on (numbered from
				   zero (0). */
  int curChar;                  /* Current character cursor is on (numbered
				   from zero (0). */
  int curLen;                   /* Current length of value. */
  int NvCols;                   /* Number of columns in value section. */
  int vRow;                     /* Row number value is on. */
  int vLcol;                    /* Left-most column of value. */
  int vRcol;                    /* Right-most column of value. */
  int mLcol;                    /* Column left `more' indicator is in. */
  int mRcol;                    /* Column right `more' indicator is in. */
  int hRowT, tRowT;             /* Top row for section. */
  int hRowB, tRowB;             /* Bottom row for section.  */
  WINDOWid wid;                 /* Window id. */
};

/******************************************************************************
* EditWindow operations.
*
*  EditWindow (NEWew, &EWstruct, InsertMode);
*  EditWindow (UPDATEew, &EWstruct, InsertMode);
*  EditWindow (READew, &EWstruct);
*  EditWindow (DELETEew, &EWstruct);
*  EditWindow (BEEPew, &EWstruct);
*
*  where,
*    <op>ew...................the operation to perform.
*    EWstruct.................a pointer to a `EditWindowStruct' structure.
*    InsertMode(Logical)......initial insert mode.  TRUE means insert, FALSE
*                             means overstrike.  Ctrl-A toggles this mode after
*                             it is initially set.
*
******************************************************************************/

#define NEWew           1       /* Create edit window. */
#define UPDATEew        2       /* Update edit window. */
#define READew          3       /* Read keystrokes until `exit' key entered. */
#define DELETEew        4       /* Delete window. */
#define BEEPew          5       /* Beep. */

/******************************************************************************
* EditWindow structure.
******************************************************************************/

struct EditWindowStruct {
  /***************************************************************************
  * These must be initialized before calling `EditWindow' the first time.
  ***************************************************************************/
  char *label;                  /* Label for top of window (on border). */
  int ULrow;                    /* Row on the screen at which top line of
				   window should be placed. */
  int ULcol;                    /* Column on the screen at which the left-most
				   column of the window should be placed. */
  int nColsTotal;               /* Number of columns that window should have
				   (this includes the left and right border
				   columns). */
  int NhLines;                  /* Number of header lines. */
  char **hLines;                /* Header lines. */
  char *eText;                  /* Text to be edited. */
  int NeRows;                   /* Number of rows in the edit section.  This
				   can be less than the number of lines. */
  int NtLines;                  /* Number of trailer lines. */
  char **tLines;                /* Trailer lines. */
  Logical ePct;                 /* TRUE if a percentage indicator should be
				   displayed in the edit section. */
  Logical readOnly;             /* TRUE if the edit section may not be
				   modified. */
  int *exitChars;               /* The characters which cause an exit from
				   the edit window.  Terminated by NUL. */
  int REFRESHkey;               /* Causes entire screen to be refreshed. */
  int SOLkey;                   /* Moves cursor to start-of-line. */
  int EOLkey;                   /* Moves cursor to end-of-line. */
  int SOTkey;                   /* Moves cursor to start-of-text. */
  int EOTkey;                   /* Moves cursor to end-of-text. */
  int NSkey;                    /* Moves cursor to next-screen. */
  int PSkey;                    /* Moves cursor to prev-screen. */
  int DLkey;                    /* Delete line that cursor is on. */
  int NWkey;                    /* Moves cursor to end of current/next word. */
  int TOGGLEkey;                /* Toggles between insert mode and overstrike
				   mode. */
  /***************************************************************************
  * These are initialized/calculated/returned by `EditWindow'.
  ***************************************************************************/
  int key;                      /* Key entered causing exit from menu. */
  /***************************************************************************
  * These are for internal use by `EditWindow'.
  ***************************************************************************/
  int nRowsTotal;               /* Total number of rows (including top and
				   bottom border rows). */
  int nColS;                    /* Doesn't include left and right borders. */
  int hRowT, eRowT, tRowT;      /* Top row for section. */
  int hRowB, eRowB, tRowB;      /* Bottom row for section. */
  int nChars;                   /* Number of characters currently in `text'. */
  int xChars;                   /* Maximum number of characters that `text'
				   can currently contain. */
  int cursorRow;                /* Row containing cursor. */
  int cursorCol;                /* Column containing cursor. */
  int firstChar;                /* Character in text at the upper-left
				   position of the EditSection. */
  int cursorChar;               /* Character in text on which the cursor is
				   sitting. */
  Logical insertMode;           /* If TRUE, insert mode.  If FALSE, overstrike
				   mode. */
  int ePctRowN;                 /* Row number of edit section percentage
				   indicator. */
  int ePctColN;                 /* Column number of edit section percentage
				   indicator. */
  WINDOWid wid;                 /* Window id. */
};

/******************************************************************************
* FieldWindow operations.
*
*  FieldWindow (NEWfw, &FWstruct, fieldNumber, insertMode);
*  FieldWindow (UPDATEfw, &FWstruct, fieldNumber, insertMode);
*  FieldWindow (READfw, &FWstruct);
*  FieldWindow (DELETEfw, &FWstruct);
*  FieldWindow (UNDISPLAYfw, &FWstruct);
*  FieldWindow (REDISPLAYfw, &FWstruct);
*  FieldWindow (BEEPfw, &FWstruct);
*
*  where,
*
*    <op>fw..................is the operation to perform.
*    FWstruct................is a pointer to an `FieldWindowStruct' structure.
*    fieldNumber(int)........is the initial current field number.
*    insertMode(Logical).....is the initial insert mode.  TRUE means insert,
*                            FALSE means overstrike.  This mode is toggled by
*                            TOGGLEkey.
*
******************************************************************************/

#define NEWfw           1       /* Create new menu. */
#define UPDATEfw        2       /* Update sections. */
#define READfw          3       /* Read keystrokes until `exit' key entered. */
#define DELETEfw        4       /* Delete menu. */
#define UNDISPLAYfw     5       /* Erase menu (it still exists though). */
#define REDISPLAYfw     6       /* Redisplay menu. */
#define BEEPfw          7       /* Beep. */

/******************************************************************************
* FieldWindow structure.
******************************************************************************/

struct FieldWindowStruct {
  /***************************************************************************
  * These must be initialized before calling `FieldWindow' the first time.
  ***************************************************************************/
  int ULrow;                    /* Upper-left row number. */
  int ULcol;                    /* Upper-left column number. */
  int nColsTotal;               /* Includes left and right borders. */
  char *label;                  /* Label for window. */
  int NhLines;                  /* Number of header lines (zero or more). */
  char **hLines;                /* Header lines. */
  int NfLines;                  /* Number of field lines (one or more). */
  char **fLines;                /* Field lines. */
  char **fields;                /* Fields. */
  int nFields;                  /* Number of fields (one or more). */
  int *fLineNs;                 /* Line number for each field. */
  int *fCols;                   /* Starting column number for each field. */
  int *fLens;                   /* Length (width) of each field. */
  int *fMaxs;                   /* Maximum length of a field.  This can be
				   greater than the on-screen width. */
  int NfRows;                   /* Number of rows in fields section. */
  int NtLines;                  /* Number of trailer lines (zero or more). */
  char **tLines;                /* Trailer lines. */
  int *exitChars;               /* The characters which cause an exit from
				   the prompt window.  Terminated by NUL. */
  int refreshChar;              /* Causes entire screen to be refreshed. */
  Logical fPct;                 /* TRUE if a percentage indicator should be
				   displayed in the fields section. */
  int NSkey;                    /* Next-screen key. */
  int PSkey;                    /* Prev-screen key. */
  int toggleKey;                /* Toggles between insert and overstrike. */
  /***************************************************************************
  * These are initialized/calculated/returned by `FieldWindow'.
  ***************************************************************************/
  int fieldN;                   /* Current field number. */
  int key;                      /* Key entered causing exit from menu. */
  /***************************************************************************
  * These are for internal use by `FieldWindow'.
  ***************************************************************************/
  int charN;                    /* Cursor position within current field. */
  int leftCharN;                /* Character within current field that is at
				   the left (first) on-screen position. */
  int nRowsTotal;               /* Total number of rows (including top and
				   bottom border rows). */
  int nColS;                    /* Doesn't include left and right borders. */
  int *fUpTo;                   /* Field number above. */
  int *fDownTo;                 /* Field number below. */
  int *fLeftTo;                 /* Field number to the left. */
  int *fRightTo;                /* Field number to the right. */
  int hRowT, fRowT, tRowT;      /* Top row for header, fields, and trailer
				   sections. */
  int hRowB, fRowB, tRowB;      /* Bottom row for each section.  For the fields
				   section, it is the last row actually used.*/
  Logical fScroll;              /* TRUE if fields section needs to be scrolled
				   (more lines than rows). */
  int fRowN;                    /* Row number in fields section containing
				   current field. */
  int fPctRowN;                 /* Row number of fields section percentage
				   indicator. */
  int fPctColN;                 /* Column number of fields section percentage
				   indicator. */
  Logical insert;               /* If TRUE, insert.  If FALSE, overstrike. */
  WINDOWid wid;                 /* Window identifier. */
};

/******************************************************************************
* FieldWindow "current" field primary/alternate movement keys.
******************************************************************************/

#define FW_DOWN_FIELD   KB_DOWNARROW
#define FW_UP_FIELD     KB_UPARROW
#define FW_LEFT_FIELD   NUL
#define FW_RIGHT_FIELD  KB_TAB
#define FW_LEFT_CHAR    KB_LEFTARROW
#define FW_RIGHT_CHAR   KB_RIGHTARROW

#define FW_DOWN_FIELDx  NUL
#define FW_UP_FIELDx    NUL
#define FW_LEFT_FIELDx  NUL
#define FW_RIGHT_FIELDx NUL
#define FW_LEFT_CHARx   NUL
#define FW_RIGHT_CHARx  NUL

/******************************************************************************
* Function prototypes.
******************************************************************************/

int ItemWindow VARPROTOARGs((int, ...));
int PromptWindow VARPROTOARGs((int, ...));
int EditWindow VARPROTOARGs((int, ...));
int FieldWindow VARPROTOARGs((int, ...));
void AllocIW PROTOARGs((
  struct ItemWindowStruct *IW, int nItems, int NiLines, int iLineNchars,
  void (*fatalFnc) PROTOARGs((char *msg))
));
void FreeIW PROTOARGs((
  struct ItemWindowStruct *IW, void (*fatalFnc) PROTOARGs((char *msg))
));
void AllocFW PROTOARGs((
  struct FieldWindowStruct *FW, int nFields, int NfLines, int fLineNchars,
  void (*fatalFnc) PROTOARGs((char *msg))
));
void FreeFW PROTOARGs((
  struct FieldWindowStruct *FW, void (*fatalFnc) PROTOARGs((char *msg))
));
Logical OnlineHelpWindow PROTOARGs((char *ilhFile, int helpId));
Logical LoadOnlineHelp PROTOARGs((
  char *ilhFile, int helpId, char *header, char **eText
));
void InfoWindow PROTOARGs((
  char *line1, char *line2, char *line3, Logical center, Logical beep, int wait
));

/*****************************************************************************/

#endif
