home *** CD-ROM | disk | FTP | other *** search
- #include "intern.h"
-
- #ifdef __MTAES__
- #define wind_create_grect(a,b) wind_create(a,b)
- #define wind_calc_grect(a,b,c,d) wind_calc(a,b,c,d)
- #define wind_open_grect(a,b) wind_open(a,b)
- #define wind_set_str(a,b,c) wind_set_string(a,b,c)
- #endif
-
- /* --------------------------------------------------------------------------- */
- /* app-modaler Fensterdialog */
- /* --------------------------------------------------------------------------- */
-
- #define KIND (NAME|MOVER|BACKDROP)
-
- static MDIAL_WCB win_cb = NULL;
- static MDIAL *md_list = NULL;
-
- static int handle_msg(int *msg);
-
-
- void set_mdial_wincb(MDIAL_WCB cb)
- {
- win_cb = cb;
- cf_msg_cb = (win_cb != NULL);
- }
-
- void handle_mdial_msg(int *msg)
- {
- if (!handle_msg(msg) && win_cb)
- {
- switch (msg[0])
- {
- case WM_REDRAW :
- case WM_MOVED :
- case WM_SIZED :
- win_cb(msg);
- break;
- default:
- ;
- }
- }
- }
-
- static void redraw_dial(MDIAL *dial, int start, int depth, int x, int y, int w, int h)
- {
- GRECT r, r1;
-
- r.g_x = x; r.g_y = y; r.g_w = w; r.g_h = h;
- wind_update(BEG_UPDATE);
- hide_mouse_if_needed(&r);
- wind_get_grect(dial->win_handle, WF_FIRSTXYWH, &r1);
- while (r1.g_w != 0 && r1.g_h != 0)
- {
- if (rc_intersect(&r, &r1))
- #ifdef __MTAES__
- objc_draw(dial->tree, start, depth, &r1);
- #else
- objc_draw(dial->tree, start, depth, r1.g_x, r1.g_y, r1.g_w, r1.g_h);
- #endif
- wind_get_grect(dial->win_handle, WF_NEXTXYWH, &r1);
- }
- show_mouse();
- wind_update(END_UPDATE);
- }
-
- static void redraw_cursor(MDIAL *dial)
- {
- if (dial->edit_obj > 0)
- {
- GRECT r;
-
- objc_edit(dial->tree, dial->edit_obj, 0, &dial->edit_idx, ED_INIT);
- get_objframe(dial->tree, dial->edit_obj, &r);
- redraw_dial(dial, ROOT, MAX_DEPTH, r.g_x, r.g_y - 3, r.g_w + 1, r.g_h + 6);
- objc_edit(dial->tree, dial->edit_obj, 0, &dial->edit_idx, ED_INIT);
- }
- }
-
- static void move_dial(MDIAL *dial, int x, int y)
- {
- GRECT r;
-
- wind_get_grect(dial->win_handle, WF_CURRXYWH, &r);
- r.g_x = x;
- r.g_y = y;
- wind_set_grect(dial->win_handle, WF_CURRXYWH, &r);
- wind_get_grect(dial->win_handle, WF_WORKXYWH, &r);
- dial->tree[0].ob_x = r.g_x;
- dial->tree[0].ob_y = r.g_y - dial->delta_y;
- }
-
- static int handle_msg(int *msg)
- {
- MDIAL *md;
- int ret = FALSE;
-
- md = md_list;
- while (md)
- {
- if (msg[3] == md->win_handle)
- break;
- md = md->next;
- }
- if (md)
- {
- switch (msg[0])
- {
- case WM_REDRAW :
- redraw_dial(md, ROOT, MAX_DEPTH, msg[4], msg[5], msg[6], msg[7]);
- redraw_cursor(md);
- ret = TRUE;
- break;
-
- case WM_MOVED :
- move_dial(md, msg[4], msg[5]);
- ret = TRUE;
- break;
- }
- }
- return ret;
- }
-
- /* --------------------------------------------------------------------------- */
- MDIAL *open_mdial(OBJECT *tree, int edit_start)
- {
- GRECT r1, r2;
- MDIAL *dial;
- int center = FALSE;
-
- dial = (MDIAL *)cf_malloc(sizeof(MDIAL), "open_mdial", FALSE);
- if (dial != NULL)
- {
- memset(dial, 0, sizeof(MDIAL));
- dial->tree = tree;
-
- dial->next = md_list;
- md_list = dial;
-
- /* Rahmen abschalten */
- dial->save_frame = tree[0].ob_spec.obspec.framesize;
- tree[0].ob_spec.obspec.framesize = 0;
-
- /* Zentrieren, nur beim ersten Mal */
- if (tree[0].ob_x == 0 && tree[0].ob_y == 0)
- {
- #ifdef __MTAES__
- form_center(tree, &r1);
- #else
- form_center(tree, &r1.g_x, &r1.g_y, &r1.g_w, &r1.g_h);
- #endif
- center = TRUE;
- }
-
- /* Fenstertitel holen und ausblenden */
- if (get_magx_obj(tree, 1) == MX_UNDERLINE)
- {
- dial->win_name = (char *)get_obspec(tree, 1);
- dial->delta_y = (tree[1].ob_y + tree[1].ob_height);
- dial->tree[0].ob_y -= dial->delta_y;
- set_flag(tree, 1, HIDETREE, TRUE);
- }
- else
- dial->win_name = NULL;
-
- /* Editfeld */
- if ((edit_start <= 0) || !edit_valid(dial->tree, edit_start))
- dial->edit_obj = find_edit(dial->tree, 0, FMD_FORWARD);
- else
- dial->edit_obj = edit_start;
-
- r1.g_x = tree[0].ob_x;
- r1.g_y = tree[0].ob_y + dial->delta_y;
- r1.g_w = tree[0].ob_width;
- r1.g_h = tree[0].ob_height - dial->delta_y;
- wind_calc_grect(WC_BORDER, KIND, &r1, &r2);
-
- /* Fenster neu zentrieren */
- if (center)
- {
- int d;
-
- d = (r2.g_h - r1.g_h) / 2 + dial->delta_y / 2;
- r2.g_y += d ;
- tree[0].ob_y += d;
- /* herausragen ins Menü verhindern */
- if (r2.g_y < gl_desk.g_y)
- {
- tree[0].ob_y += (gl_desk.g_y - r2.g_y);
- r2.g_y = gl_desk.g_y;
- }
- }
-
- dial->win_handle = wind_create_grect(KIND, &r2);
- if (dial->win_handle > 0)
- {
- int msg[8];
-
- /* Menü abschalten */
- disable_menu();
-
- if (dial->win_name)
- wind_set_str(dial->win_handle, WF_NAME, dial->win_name);
- wind_open_grect(dial->win_handle, &r2);
-
- /* den REDRAW noch abholen */
- while (TRUE)
- {
- evnt_mesag(msg);
- handle_mdial_msg(msg);
- if ((msg[0] == WM_REDRAW) && (msg[3] == dial->win_handle))
- break;
- }
- }
- else
- {
- close_mdial(dial);
- dial = NULL;
- }
- }
- return dial;
- }
-
- int do_mdial(MDIAL *dial)
- {
- int msg[8], mx, my, mbutton, kstate, kreturn, breturn, event, ret;
- int cont, b, doppel = FALSE;
-
- ret = -1;
- if (dial != NULL)
- {
- cont = TRUE;
- while (cont)
- {
- #ifdef __MTAES__
- GRECT n = {0,0,0,0};
- EVNTDATA ev;
-
- event = evnt_multi(MU_MESAG|MU_BUTTON|MU_KEYBD,
- 2, 1, 1, 0, &n, 0, &n,
- msg, 0, &ev,
- &kreturn, &breturn);
- mx = ev.x;
- my = ev.y;
- mbutton = ev.bstate;
- kstate = ev.kstate;
- #else
- event = evnt_multi(MU_MESAG|MU_BUTTON|MU_KEYBD,
- 2, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- msg, 0, &mx, &my, &mbutton, &kstate,
- &kreturn, &breturn);
- #endif
-
- if (event & MU_MESAG)
- {
- switch (msg[0])
- {
- case WM_REDRAW :
- case WM_MOVED :
- case WM_SIZED:
- handle_mdial_msg(msg);
- break;
-
- case WM_TOPPED :
- /*
- if (msg[3] != dial->win_handle)
- Bconout(2, 7);
- */
- /* kein break! */
- case WM_NEWTOP :
- case WM_ONTOP :
- /* immer den Dialog toppen! */
- wind_set(dial->win_handle, WF_TOP, 0, 0, 0, 0);
- break;
-
- case WM_BOTTOMED:
- case 100: /* WM_M_BACKDROPED MagiC 2.x */
- Bconout(2, 7);
- break;
-
- case WM_SHADED :
- case WM_UNSHADED :
- dial->is_shaded = !dial->is_shaded;
- break;
-
- case AP_TERM : /* sofort verlassen */
- event = 0;
- cont = FALSE;
- dial->next_obj = -1;
- break;
- }
- }
-
- if ((event & MU_KEYBD) && (!dial->is_shaded))
- {
- cont = cf_form_keybd(dial->tree, dial->edit_obj, kstate, &kreturn, &dial->next_obj);
- if (cont) /* kein Exit-Obj ausgelöst */
- {
- if (kreturn)
- cf_objc_edit(dial->tree, dial->edit_obj, kreturn, &dial->edit_idx, ED_CHAR, kstate, &b);
- else if (cont && (dial->tree[dial->next_obj].ob_flags & EDITABLE))
- {
- /* kein Exit-Obj aber neues Edit-Obj */
- objc_edit(dial->tree, dial->edit_obj, 0, &dial->edit_idx, ED_END);
- dial->edit_obj = dial->next_obj;
- objc_edit(dial->tree, dial->edit_obj, 0, &dial->edit_idx, ED_INIT);
- }
- }
- }
- if (event & MU_BUTTON)
- {
- dial->next_obj = cf_objc_find(dial->tree, ROOT, MAX_DEPTH, mx, my);
- if (dial->next_obj == -1)
- {
- Bconout(2, 7);
- dial->next_obj = 0;
- }
- else
- {
- doppel = (breturn == 2);
- cont = form_button(dial->tree, dial->next_obj, mbutton, &dial->next_obj);
- if (cont && (dial->tree[dial->next_obj].ob_flags & EDITABLE))
- {
- /* kein Exit-Obj aber neues Edit-Obj */
- objc_edit(dial->tree, dial->edit_obj, 0, &dial->edit_idx, ED_END);
- dial->edit_obj = dial->next_obj;
- if (gl_magx)
- objc_edit(dial->tree, dial->edit_obj, mx, &dial->edit_idx, ED_CRSR);
- else
- objc_edit(dial->tree, dial->edit_obj, 0, &dial->edit_idx, ED_INIT);
-
- }
- }
- }
- }
- ret = dial->next_obj;
- }
- if (doppel)
- ret |= 0x8000; /* bit 15 für Doppelklick */
- return ret;
- }
-
- void close_mdial(MDIAL *dial)
- {
- if (dial != NULL)
- {
- if (dial->win_handle > 0)
- {
- int msg[8], d, event = 0;
-
- wind_close(dial->win_handle);
- wind_delete(dial->win_handle);
-
- /*
- * Alle auflaufenden Redraw-Messages abarbeiten, damit
- * alle Fenster sauber sind, wenn der Dialog beendet ist.
- */
- while (event != MU_TIMER)
- {
- #ifdef __MTAES__
- GRECT n = {0,0,0,0};
- EVNTDATA ev;
-
- event = evnt_multi(MU_MESAG|MU_TIMER, 1, 1, 1,
- 0, &n, 0, &n,
- msg, 1, &ev, &d, &d);
- #else
- event = evnt_multi(MU_MESAG|MU_TIMER, 1, 1, 1,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- msg, 1, &d, &d, &d, &d, &d, &d);
- #endif
- if ((event & MU_MESAG) && (msg[0] == WM_REDRAW))
- handle_mdial_msg(msg);
- }
-
- /* Menü wieder an */
- enable_menu();
- }
-
- /* Dialog wieder herstellen */
- dial->tree[0].ob_spec.obspec.framesize = dial->save_frame;
- set_flag(dial->tree, 1, HIDETREE, FALSE);
- dial->tree[0].ob_y += dial->delta_y;
-
- md_list = dial->next;
- Mfree(dial);
- }
- }
-
- int simple_mdial(OBJECT *tree, int edit_start)
- {
- MDIAL *dial;
- int ret = -1;
-
- graf_mouse(ARROW, NULL);
- dial = open_mdial(tree, edit_start);
- if (dial)
- {
- ret = do_mdial(dial) & 0x7FFF;
- set_state(tree, ret, SELECTED, FALSE);
- close_mdial(dial);
- }
- return ret;
- }
-
- void redraw_mdobj(MDIAL *dial, int obj)
- {
- GRECT r;
-
- if (dial != NULL)
- {
- get_objframe(dial->tree, obj, &r);
- redraw_dial(dial, ROOT, MAX_DEPTH, r.g_x, r.g_y - 3, r.g_w + 1, r.g_h + 6);
-
- /* neu zeichnen, wenn obj das Editfeld bzw. ein Child von obj ist */
- if ((obj == dial->edit_obj) ||
- (dial->edit_obj >= dial->tree[obj].ob_head && dial->edit_obj <= dial->tree[obj].ob_tail))
- redraw_cursor(dial);
- }
- }
-
- void change_mdedit(MDIAL *md, int new)
- {
- int last = 0;
-
- if (md != NULL)
- {
- /* 1. prüfen, ob aktuelles nicht mehr gültig ist */
- if (md->edit_obj > 0)
- {
- last = -1;
- if (!edit_valid(md->tree, md->edit_obj))
- {
- objc_edit(md->tree, md->edit_obj, 0, &md->edit_idx, ED_END);
- last = md->edit_obj;
- }
- }
-
- /*
- * last = -1 -> aktuelles Editfeld weiterhin gültig, nix weiteres tun
- * last = 0 -> bisher kein Editfeld, erstes suchen
- * last > 0 -> aktuelles Editfeld ungültig geworden, nächstes suchen
- */
- if (last != -1)
- {
- if (new > 0 && edit_valid(md->tree, new))
- md->edit_obj = new; /* 2a. ein gültiges neues übergeben? */
- else /* 2b. neues suchen */
- md->edit_obj = find_edit(md->tree, last, FMD_FORWARD);
- if (md->edit_obj > 0)
- objc_edit(md->tree, md->edit_obj, 0, &md->edit_idx, ED_INIT);
- }
- }
- }
-