#ifndef CDK_H
#define CDK_H

/*
 * Copyright 1999, Mike Glover
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in the
 *    documentation and/or other materials provided with the distribution.
 * 3. All advertising materials mentioning features or use of this software
 *    must display the following acknowledgment:
 * 	This product includes software developed by Mike Glover
 * 	and contributors.
 * 4. Neither the name of Mike Glover, nor the names of contributors
 *    may be used to endorse or promote products derived from this software
 *    without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY MIKE GLOVER AND CONTRIBUTORS ``AS IS'' AND
 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 * ARE DISCLAIMED.  IN NO EVENT SHALL MIKE GLOVER OR CONTRIBUTORS BE LIABLE
 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
 * SUCH DAMAGE.
 */

#include <cdk/cdk_config.h>

#ifdef	CDK_PERL_EXT
#undef	instr
#endif

#ifdef HAVE_XCURSES
#include <xcurses.h>
#else
#ifdef HAVE_NCURSES_H
#include <ncurses.h>
#else
#include <curses.h>
#endif
#endif

#include <sys/types.h>
#include <sys/stat.h>

#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include <unistd.h>
#include <dirent.h>
#include <time.h>
#include <errno.h>
#include <pwd.h>
#include <grp.h>

#if HAVE_LIMITS_H
#include <limits.h>
#endif

#if HAVE_GETOPT_HEADER
#if HAVE_GETOPT_H
#include <getopt.h>
#endif
#else
extern int optind;
extern char * optarg;
#endif

/*
 * Values we normally get from limits.h (assume 32-bits)
 */
#ifndef INT_MIN
#define INT_MIN (-INT_MAX - 1)
#endif

#ifndef INT_MAX
#define INT_MAX 2147483647
#endif

#ifndef GCC_UNUSED
#define GCC_UNUSED /*nothing*/
#endif

#if HAVE_LIBDMALLOC
#include <dmalloc.h>    /* Gray Watson's library */
#else
#undef  HAVE_LIBDMALLOC
#define HAVE_LIBDMALLOC 0
#endif

#if HAVE_LIBDBMALLOC
#include <dbmalloc.h>   /* Conor Cahill's library */
#else
#undef  HAVE_LIBDBMALLOC
#define HAVE_LIBDBMALLOC 0
#endif

/*
 * This enumerated typedef lists all the CDK widget types.
 */
typedef enum {vNULL,
		vALPHALIST, vBUTTONBOX, vCALENDAR, vDIALOG,
		vENTRY, vFSELECT, vGRAPH, vHISTOGRAM,
		vITEMLIST, vLABEL, vMARQUEE, vMATRIX,
		vMENTRY, vMENU, vRADIO, vSCALE, vSCROLL,
		vSELECTION, vSLIDER, vSWINDOW, vTEMPLATE,
		vTAB, vVIEWER
		} EObjectType;

/*
 * This enumerated typedef lists all the valid display types for
 * the entry, mentry, and template widgets.
 */
typedef enum {vINVALID,
		vCHAR, vHCHAR, vINT, vHINT, vMIXED, vHMIXED,
		vUCHAR, vLCHAR, vUHCHAR, vLHCHAR, vUMIXED,
		vLMIXED, vUHMIXED, vLHMIXED, vVIEWONLY
		} EDisplayType;

/*
 * This enumerated typedef lists all the display types for
 * the histogram widget.
 */
typedef enum {vNONE, vPERCENT, vFRACTION, vREAL} EHistogramDisplayType;

/*
 * This enumerated typedef defines the display types for the graph.
 */
typedef enum {vPLOT, vLINE} EGraphDisplayType;

/*
 * This enumerated typedef defines where white space is to be
 * stripped from in the function stripWhiteSpace.
 */
typedef enum {vFRONT, vBACK, vBOTH} EStripType;

/*
 * This enumerated typedef defines the type of exits the widgets
 * recognize.
 */
typedef enum {vEARLY_EXIT, vESCAPE_HIT, vNORMAL, vNEVER_ACTIVATED} EExitType;

/*
 * This defines a boolean type.
 */
typedef int boolean;

/*
 * Declare miscellaneous defines.
 */
#define	LEFT		9000
#define	RIGHT		9001
#define	CENTER		9002
#define	TOP		9003
#define	BOTTOM		9004
#define	HORIZONTAL	9005
#define	VERTICAL	9006
#define	FULL		9007

#define NONE		0
#define ROW		1
#define COL		2

#define MAX_BINDINGS	300
#define MAX_ITEMS	2000
#define MAX_LINES	5000
#define MAX_BUTTONS	200

#if 0
/*
 * Not all variants of curses define getmaxx, etc.  But use the provided ones
 * if they exist, to work around differences in the underlying implementation.
 */
#ifndef getmaxx
#define getmaxx(a)	((a)->_maxx)
#endif

#ifndef getmaxy
#define getmaxy(a)	((a)->_maxy)
#endif

#ifndef getbegx
#define getbegx(a)	((a)->_begx)
#endif

#ifndef getbegy
#define getbegy(a)	((a)->_begy)
#endif
#endif

#define	MAXIMUM(a,b)	((a) > (b) ? (a) : (b))
#define	MINIMUM(a,b)	((a) < (b) ? (a) : (b))
#define	HALF(a)		((a) >> 1)

#ifndef COLOR_PAIR
#define	COLOR_PAIR(a)	A_NORMAL
#endif

#define CONTROL(c)	((c) & 0x1f)

/*
 * Derived macros
 */
#define getendx(a)	(getbegx(a) + getmaxx(a))
#define getendy(a)	(getbegy(a) + getmaxy(a))

/* Define the 'GLOBAL DEBUG FILEHANDLE'	*/
extern  FILE	*CDKDEBUG;

/*
 * =========================================================
 * 	Declare Debugging Routines.
 * =========================================================
 */
#define START_DEBUG(a)		(CDKDEBUG=startCDKDebug(a))
#define WRITE_DEBUGMESG(a,b)	(writeCDKDebugMessage (CDKDEBUG,__FILE__,a,__LINE__,b))
#define	END_DEBUG		(stopCDKDebug(CDKDEBUG)
FILE *startCDKDebug(char *filename);
void writeCDKDebugMessage (FILE *fd, char *filename, char *function, int line, char *message);
void stopCDKDebug (FILE *fd);

/*
 * These header files define miscellaneous values and prototypes.
 */
#include <cdk/cdkscreen.h>
#include <cdk/curdefs.h>
#include <cdk/binding.h>
#include <cdk/cdk_util.h>
#include <cdk/cdk_objs.h>

/*
 * Include the CDK widget header files.
 */
#include <cdk/alphalist.h>
#include <cdk/buttonbox.h>
#include <cdk/calendar.h>
#include <cdk/dialog.h>
#include <cdk/entry.h>
#include <cdk/fselect.h>
#include <cdk/graph.h>
#include <cdk/histogram.h>
#include <cdk/itemlist.h>
#include <cdk/label.h>
#include <cdk/marquee.h>
#include <cdk/matrix.h>
#include <cdk/mentry.h>
#include <cdk/menu.h>
#include <cdk/radio.h>
#include <cdk/scale.h>
#include <cdk/scroll.h>
#include <cdk/selection.h>
#include <cdk/slider.h>
#include <cdk/swindow.h>
#include <cdk/template.h>
#include <cdk/viewer.h>
#include <cdk/draw.h>

#endif /* CDK_H */
