/* Copyright (C) 1996, Russell Lang.  All rights reserved.
  
  This file is part of Aladdin Ghostscript.
  
  Aladdin Ghostscript is distributed with NO WARRANTY OF ANY KIND.  No author
  or distributor accepts any responsibility for the consequences of using it,
  or for whether it serves any particular purpose or works at all, unless he
  or she says so in writing.  Refer to the Aladdin Ghostscript Free Public
  License (the "License") for full details.
  
  Every copy of Aladdin Ghostscript must include a copy of the License,
  normally in a plain ASCII text file named PUBLIC.  The License grants you
  the right to copy, modify and redistribute Aladdin Ghostscript, but only
  under certain conditions described in the License.  Among other things, the
  License requires that the copyright notice and this notice be preserved on
  all copies.
*/


// dwtext.h 
// Text Window class


#ifdef _WINDOWS
#define _Windows
#endif

 
/* ================================== */
/* text window class */


class TextWindow {
	HINSTANCE hInstance;		/* required */
	LPSTR	Title;			/* required */
	HICON	hIcon;			/* optional */

	BYTE FAR *ScreenBuffer;
	POINT	ScreenSize;		/* optional */
	char	*DragPre;		/* optional */
	char	*DragPost;		/* optional */
	int	nCmdShow;		/* optional */
	HWND	hwnd;

	BYTE FAR *KeyBuf;
	BYTE FAR *KeyBufIn;
	BYTE FAR *KeyBufOut;
	unsigned int KeyBufSize;
	BOOL	quitnow;

	BOOL	bFocus;
	BOOL	bGetCh;
	char	*fontname;		// font name
	int	fontsize;		// font size in pts
	HFONT	hfont;
	int	CharAscent;

	int	CaretHeight;
	int	CursorFlag;
	POINT	CursorPos;
	POINT	ClientSize;
	POINT	CharSize;
	POINT	ScrollPos;
	POINT	ScrollMax;

	void error(char *message);
	void new_line(void);
	void update_text(int count);
	void drag_drop(HDROP hdrop);
	void copy_to_clipboard(void);

public:
	// constructor
	TextWindow(void);

	// destructor
	~TextWindow(void);

	// register window class
	int register_class(HINSTANCE hinst, HICON hicon);

	// test if a key has been pressed
	// return TRUE if key hit
	// return FALSE if no key
	int kbhit(void);	

	// Get a character from the keyboard, waiting if necessary
	int getch(void);

	// Get a line from the keyboard
	// store line in buf, with no more than len characters
	// including null character
	// return number of characters read
	int gets(LPSTR buf, int len);

	// Get a line from the keyboard
	// store line in buf, with no more than len characters
	// line is not null terminated
	// return number of characters read
	int read_line(LPSTR buf, int len);

	// Put a character to the window
	int putch(int ch);

	// Write cnt character from buf to the window
	void write_buf(LPSTR buf, int cnt);
	
	// Put a string to the window
	void puts(LPSTR str);

	// Scroll window to make cursor visible
	void to_cursor(void);

	// Create and show window with given name and min/max/normal state
	// return 0 on success, non-zero on error
	int create(LPSTR title, int cmdShow);

	// Destroy window
	int destroy(void);
	
	// Set window font and size
	// a must choose monospaced 
	void font(const char *fontname, int fontsize);

	// Set screen size in characters
	void size(int width, int height);

	// Set pre drag and post drag strings
	// If a file is dropped on the window, the following will
	// be poked into the keyboard buffer: 
	//   the pre_drag string
	//   the file name
	//   the post_drag string
	void drag(const char *pre_drag, const char *post_drag);

	// member window procedure
	LRESULT WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam);

	// provide access to window handle
	HWND get_handle(void) { return hwnd; };
};

/* ================================== */

