/*  MikMod example player
	(c) 1999 Miodrag Vallat and others - see file AUTHORS for
	complete list.

	This program is free software; you can redistribute it and/or modify
	it under the terms of the GNU General Public License as published by
	the Free Software Foundation; either version 2 of the License, or
	(at your option) any later version.
 
	This program is distributed in the hope that it will be useful,
	but WITHOUT ANY WARRANTY; without even the implied warranty of
	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
	GNU General Public License for more details.
 
	You should have received a copy of the GNU General Public License
	along with this program; if not, write to the Free Software
    Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
    02111-1307, USA.
*/

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

  $Id: mwidget.h,v 1.3 1999/07/05 04:00:02 miod Exp $

  Widget and Dialog creation functions

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

#ifndef MWIDGET_H
#define MWIDGET_H

#include "mwindow.h"

#define EVENT_HANDLED 100

#define FOCUS_NEXT     (1)               /* next widget gets focus */
#define FOCUS_PREV     (-1)              /* prev widget gets focus */
#define FOCUS_ACTIVATE (EVENT_HANDLED+1) /* button select, return in input field */

typedef enum {
	WID_GET_FOCUS,
	WID_HOTKEY,
	WID_KEY
} WID_EVENT;

typedef enum {
	TYPE_LABEL,
	TYPE_STR,
	TYPE_INT,
	TYPE_BUTTON
} WID_TYPE;

typedef struct {
	int active;             /* active widget */
	int cnt;                /* Nuber of widgets */
	MWINDOW *win;
	struct WIDGET **widget; /* the widgets */
} DIALOG;

typedef struct WIDGET {
	WID_TYPE type;
	BOOL can_focus; /* can the widget have the focus */
	BOOL has_focus; /* has this widget the focus */
	int x;          /* x-pos of widget(is calculated) */
	int y;          /* Before dialog_open():
	                   spacing(-1: Widget on the right side of last widget)
	                   After dialog_open():
	                   y-pos of widget */
	void(*w_free)(struct WIDGET*);
	void(*w_paint)(DIALOG*,struct WIDGET*);
	int(*w_handle_event)(DIALOG*,struct WIDGET*,WID_EVENT,int);
	void(*w_get_size)(struct WIDGET*,int*,int*);

	int(*handle_key)(DIALOG*,struct WIDGET*,int);
	int(*handle_focus)(DIALOG*,struct WIDGET*,int);
	void *data;     /* not used by menu functions */
} WIDGET;

typedef int(*handleKeyFunc)(DIALOG*,struct WIDGET*,int);
typedef int(*handleFocusFunc)(DIALOG*,struct WIDGET*,int);

/* Free substructs of w and w itself */
typedef void(*freeFunc)(WIDGET*);
/* Display widget w */
typedef void(*paintFunc)(DIALOG*,WIDGET*);
/*
   GET_FOCUS: Widget w gets the focus
     ch: -1: Last active widget was behind the new one
          1: Last active widget was before the new one
   HOTKEY:
     ch: The Key which was pressed
     back:
       FOCUS_ACTIVATE: Widget w gets the focus
       EVENT_HANDLED : Focus is not changed, Key is not processed any more,
                       e.g. necessary if function closes the dialog
   KEY: Key ch was pressed
     back:
       +/-n : Widget n entries before/behind Widget w gets the focus
       EVENT_HANDLED: Key is not processed any more
       0 : event HOTKEY is send to the widgets
*/
typedef int(*handleEventFunc)(DIALOG*,WIDGET*,WID_EVENT,int);
/* Return the size of widget w */
typedef void(*getSizeFunc)(WIDGET*,int*,int*);

typedef struct {
	WIDGET w;
	char *msg;
} WID_LABEL;

typedef struct {
	WIDGET w;
	char *input;
	int width;   /* width of input field */
	int cur_pos; /* cursor position */
	int start;   /* first visible char */
	int length;  /* max length of input */
} WID_STR;

typedef struct {
	WIDGET w;
	char *input;
	int width;   /* width of input field */
	int cur_pos; /* cursor position */
	int start;   /* first visible char */
	int length;  /* max length of input */
} WID_INT;

typedef struct {
	WIDGET w;
	char *button; /* &but1|but2|... */
	int cnt;      /* Number of buttons */
	int active;   /* active button */
} WID_BUTTON;

/* spacing: -1 : Widget on the right side of last widget
		    >=0: Number of free lines to last widget */
WIDGET* wid_label_add(DIALOG*,int,char*);
WIDGET* wid_str_add(DIALOG*,int,char*,int);
WIDGET* wid_int_add(DIALOG*,int,int,int);
WIDGET* wid_button_add(DIALOG*,int,char*,int);

void wid_set_func(WIDGET*,handleKeyFunc,handleFocusFunc,void*);

DIALOG* dialog_new(void);
void dialog_open(DIALOG*,char*);
BOOL dialog_repaint(MWINDOW*);
void dialog_close(DIALOG*);

#endif /* MWIDGET_H */
