/* -- MyDials "Interface" --

	Any improvements would be appreciated.

	(P) 1992, Markus Nick

	---------------------------------------------------------------

	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.

	---------------------------------------------------------------

*/
/*
    requires int `dummy'
*/

#ifndef __myd2ruby_h__
#define __myd2ruby_h__  1


/* ==== types ==== */

typedef struct {
    OBJECT *Tree;
    MFDB Buffer;
    WORD x, y, w, h;
} DIALINFO;

typedef struct {
    WORD x, y, w, h;
} RECT;

/* ==== prototypes ==== */

int fm_inifld _((OBJECT *tree, int start_fld));

/* ==== defines ==== */

#define dial_init(fct_alloc, fct_free, mnum, mform, gs) \
                        (my2r_mnum = (mnum), my2r_mform = (mform), my2r_gs = (gs))
#define dial_exit()     /* void */
#define dial_fix(tree, is_dialog)   ((is_dialog) ? (void)mfm_ruby((tree)) : (void)0)

#define dial_center(tree)      (form_center(tree, &dummy, &dummy, &dummy, &dummy))
#define dial_move(di, rx, ry, rw, rh)   (di_fly((di)->Tree))
#define dial_draw(di)   (objc_draw((di)->Tree, ROOT, MAX_DEPTH, (di)->x, (di)->y, (di)->w, (di)->h))
#define dial_start(tree, di)            \
               ((di)->Tree = (tree),    \
                (di)->x = (tree)[ROOT].ob_x,     (di)->y = (tree)[ROOT].ob_y,      \
                (di)->w = (tree)[ROOT].ob_width, (di)->h = (tree)[ROOT].ob_height, \
                form_dial(FMD_START, xdesk+wdesk/2, ydesk+hdesk/2, 1, 1,     \
                                     (di)->x, (di)->y, (di)->w, (di)->h),     \
                (my2r_gs ? form_dial(FMD_GROW, xdesk+wdesk/2, ydesk+hdesk/2, 1, 1,   \
                                               (di)->x, (di)->y, (di)->w, (di)->h) : 0))
#define dial_end(di)        \
               ((my2r_gs ? form_dial(FMD_SHRINK, xdesk+wdesk/2, ydesk+hdesk/2, 1, 1,   \
                                                 (di)->x, (di)->y, (di)->w, (di)->h) : 0), \
                form_dial(FMD_FINISH, xdesk+wdesk/2, ydesk+hdesk/2, 1, 1,   \
                                      (di)->x, (di)->y, (di)->w, (di)->h))

#define dial_do(di, edit_obj)   (form_do((di)->Tree, my2d_find_inifld((di)->Tree, edit_obj)))

#define open_dial(tree, grow, start, di)     \
               ((di)->Tree = (tree),    \
                (di)->x = (tree)[ROOT].ob_x,     (di)->y = (tree)[ROOT].ob_y,      \
                (di)->w = (tree)[ROOT].ob_width, (di)->h = (tree)[ROOT].ob_height, \
                form_dial(FMD_START, xdesk+wdesk/2, ydesk+hdesk/2, 1, 1,   \
                                     (di)->x, (di)->y, (di)->w, (di)->h),     \
                ((my2r_gs && (grow)) ?      \
                    (start)                  \
                      ? form_dial(FMD_GROW, ((GRECT*)start)->g_x, ((GRECT*)start)->g_y, ((GRECT*)start)->g_w, ((GRECT*)start)->g_h,   \
                                            (di)->x, (di)->y, (di)->w, (di)->h)  \
                      : (form_dial(FMD_GROW, xdesk+wdesk/2, ydesk+hdesk/2, 1, 1,   \
                                             (di)->x, (di)->y, (di)->w, (di)->h)),  \
                dial_draw(di))

#define close_dial(di, start)  \
               (((my2r_gs && (grow))   \
                   ? (start)           \
                      ? form_dial(FMD_SHRINK, ((GRECT*)start)->g_x, ((GRECT*)start)->g_y, ((GRECT*)start)->g_w, ((GRECT*)start)->g_h,   \
                                              (di)->x, (di)->y, (di)->w, (di)->h)  \
                      : form_dial(FMD_SHRINK, xdesk+wdesk/2, ydesk+hdesk/2, 1, 1,   \
                                               (di)->x, (di)->y, (di)->w, (di)->h))    \
                   : 0),  \
                form_dial(FMD_FINISH, xdesk+wdesk/2, ydesk+hdesk/2, 1, 1,   \
                                      (di)->x, (di)->y, (di)->w, (di)->h))

#define HndlDial(tree, startfld, gs, start, ok)   \
               (open_dial(tree, gs, start, di),   \
                dial_do(di->Tree, startfld),      \
                close_dial(di, start),            \
                *ok = 1)

#ifndef __myd2ruby_c__

extern WORD my2r_mnum;
extern MFORM my2r_mform;
extern BOOLEAN my2r_gs;

#endif /* ndef __myd2ruby_c__ */

#endif /* ndef __myd2ruby_h__ */

/* -eof- */
