/******************************************************************************
*
*  NSSDC/CDF					Header file for `widgets'.
*
*  Version 1.2a, 6-Sep-95, 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.
*
******************************************************************************/

#if !defined(WIDGETSh_INCLUDEd__)
#define WIDGETSh_INCLUDEd__

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

#include "windoz.h"

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

#define MAX_INFO_WINDOW_eLINES          3

/******************************************************************************
* 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. */
  int XeLines;			/* Maximum number of edit lines. */
  int NeLines;			/* Current number of edit lines. */
  char **eLines;		/* Edit lines - there should be `XeLines'
				   of these and each should be long enough
				   for the `nColsTotal' specified. */
  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 refreshChar;		/* 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. */
  /***************************************************************************
  * 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 curRowN;			/* Row that cursor is on. */
  int curLineN;			/* Line that cursor is on. */
  int curCharN;			/* Character position that cursor is on (of
				   the line). */
  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. */
  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 of each field. */
  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 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 PROTOARGs((int, ...));
int PromptWindow PROTOARGs((int, ...));
int EditWindow PROTOARGs((int, ...));
int FieldWindow PROTOARGs((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, int *nLines, char ***lineS
));
void InfoWindow PROTOARGs((
  char *line1, char *line2, char *line3, Logical center
));

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

#endif
