home *** CD-ROM | disk | FTP | other *** search
- program modal;
-
- uses gem, geminit, newobs, pform, tools;
-
- (*$I modal.i*)
-
- var
- tree : AESTreePtr;
- menuptr : AESTreePtr;
- leave : boolean;
- buffer : ARRAY_8;
- w_handle, ret : integer;
- oldtxt : string;
-
- (***********************************************************************)
- (* modale Fenster-Dialoge *)
- (***********************************************************************)
- function rc_intersect(var p1, p2: GRECT): boolean;
- var
- tw, th, tx, ty : integer;
- begin
- tw := min(p1.g_x + p1.g_w, p2.g_x + p2.g_w);
- th := min(p1.g_y + p1.g_h, p2.g_y + p2.g_h);
- tx := max(p1.g_x, p2.g_x);
- ty := max(p1.g_y, p2.g_y);
-
- p2.g_x := tx;
- p2.g_y := ty;
- p2.g_w := tw - tx;
- p2.g_h := th - ty;
- rc_intersect := (tw > tx) and (th > ty);
- end;
-
- procedure do_redraw(wh: integer; area: GRECT; tree: AESTreePtr);
- var
- box, full: GRECT;
- begin
- graf_mouse(M_OFF, NIL);
- wind_update(BEG_UPDATE);
- with full do
- wind_get(0, WF_WORKXYWH, g_x, g_y, g_w, g_h);
- with box do
- wind_get(wh, WF_FIRSTXYWH, g_x, g_y, g_w, g_h);
- while (box.g_w > 0) and (box.g_h > 0) do
- begin
- if rc_intersect(full, box) then
- if rc_intersect(area, box) then
- begin
- with box do
- objc_draw(tree, ROOT, MAX_DEPTH, g_x, g_y, g_w, g_h);
-
- end;
- with box do
- wind_get(wh, WF_NEXTXYWH, g_x, g_y, g_w, g_h);
- end;
- wind_update(END_UPDATE);
- graf_mouse(M_ON, NIL);
- end;
-
- function open_winddial(tree: AESTreePtr; title: pchar;
- var w_handle: integer): boolean;
- var
- elements : integer;
- inside, outside : GRECT;
- begin
- if title^ <> #0 then
- elements := NAME + MOVER
- else
- elements := MOVER;
- open_winddial := TRUE;
- with inside do
- pform_center(tree, g_x, g_y, g_w, g_h);
- with outside do
- begin
- wind_get(0, WF_WORKXYWH, g_x, g_y, g_w, g_h);
- w_handle := wind_create(elements, g_x, g_y, g_w, g_h);
- end;
- if title^ <> #0 then
- wind_set(w_handle, WF_NAME, hiword(longint(title)),
- loword(longint(title)), 0, 0);
- if w_handle < 0 then
- begin
- open_winddial := FALSE;
- exit;
- end;
- with outside do
- wind_calc(WC_BORDER, elements, tree^[ROOT].ob_x, tree^[ROOT].ob_y,
- tree^[ROOT].ob_width, tree^[ROOT].ob_height,
- g_x, g_y, g_w, g_h);
- with outside do
- if wind_open(w_handle, g_x, g_y, g_w, g_h) = 0 then
- begin
- open_winddial := FALSE;
- exit;
- end;
- end;
-
- function pform_winddo(tree: AESTreePtr;
- startob, w_handle: integer): integer;
- var
- which : integer;
- leave : boolean;
- idx, ret : integer;
- topwind : integer;
- dummy : integer;
- events : EVENT;
- editobj : integer;
- box : GRECT;
- pipe : ARRAY_8;
- begin
- leave := FALSE;
- pipe[1] := AES_pb.global^[2];
- editobj := ini_field(tree, startob);
- if editobj <> 0 then
- objc_ed(tree, editobj, 0, idx, EDINIT);
-
- with events do
- begin
- ev_mflags := MU_KEYBD or MU_BUTTON or MU_MESAG;
- ev_mbclicks := 2;
- ev_bmask := 1;
- ev_mbstate := 1;
- ev_mm1flags := 0;
- ev_mm1x := 0;
- ev_mm1y := 0;
- ev_mm1width := 0;
- ev_mm1height := 0;
- ev_mm2flags := 0;
- ev_mm2x := 0;
- ev_mm2y := 0;
- ev_mm2width := 0;
- ev_mm2height := 0;
- ev_mtlocount := 10;
- ev_mthicount := 0;
- end;
- repeat
- which := EvntMulti(events);
-
- if (which and MU_MESAG) <> 0 then
- with events do
- begin
- box.g_x := ev_mmgpbuf[4];
- box.g_y := ev_mmgpbuf[5];
- box.g_w := ev_mmgpbuf[6];
- box.g_h := ev_mmgpbuf[7];
- case events.ev_mmgpbuf[0] of
- WM_MOVED:
- if w_handle = ev_mmgpbuf[3] then
- begin
- wind_set(w_handle, WF_CURRXYWH, ev_mmgpbuf[4],
- ev_mmgpbuf[5], ev_mmgpbuf[6], ev_mmgpbuf[7]);
- with tree^[ROOT] do
- wind_get(w_handle, WF_WORKXYWH, ob_x, ob_y,
- ob_width, ob_height);
- end;
- WM_REDRAW:
- if w_handle = ev_mmgpbuf[3] then
- begin
- wind_get(0, WF_TOP, topwind, dummy, dummy, dummy);
- if (editobj <> 0) and (topwind = w_handle) then
- begin
- with tree^[ROOT] do
- objc_draw(tree, ROOT, MAX_DEPTH,
- ob_x, ob_y, ob_width, ob_height);
- objc_ed(tree, editobj, 0, idx, EDINIT);
- end
- else
- do_redraw(ev_mmgpbuf[3], box, tree);
- end;
- WM_TOPPED:
- if w_handle = ev_mmgpbuf[3] then
- begin
- wind_set(w_handle, WF_TOP, 0, 0, 0, 0);
- wind_get(0, WF_TOP, topwind, dummy, dummy, dummy);
- pipe[0] := WM_REDRAW;
- pipe[2] := 0;
- pipe[3] := w_handle;
- pipe[4] := tree^[ROOT].ob_x;
- pipe[5] := tree^[ROOT].ob_y;
- pipe[6] := tree^[ROOT].ob_width;
- pipe[7] := tree^[ROOT].ob_height;
- appl_write(pipe[1], 16, @pipe);
- end;
- WM_UNTOPPED:
- if editobj <> 0 then
- objc_ed(tree, editobj, 0, idx, EDEND);
- end;
- end;
-
- ret := pform_thru(tree, which, events, editobj, idx);
- if ret >= 0 then
- if is_flag(tree^[ret and $7fff], TOUCHEXIT) or
- is_flag(tree^[ret and $7fff], F_EXIT) then
- leave := TRUE;
- until leave;
- if editobj <> 0 then
- objc_ed(tree, editobj, 0, idx, EDEND);
- pform_winddo := ret;
- end;
-
- procedure close_winddial(w_handle: integer);
- begin
- wind_close(w_handle);
- wind_delete(w_handle);
- end;
-
- (***********************************************************************)
-
- function spec_chars: integer;
- var
- tree : AESTreePtr;
- ret : integer;
- begin
- rsrc_gaddr(R_TREE, POPASCII, pointer(tree));
- with tree^[ROOT] do
- begin
- graf_mkstate(ob_x, ob_y, ret, ret);
- dec(ob_x, ob_width div 2);
- ob_x := max(ob_x, 0);
- dec(ob_y, ob_height div 2);
- ob_y := max(ob_y, 0);
- end;
- ret := pop_up(tree);
- if ret = - 1 then
- spec_chars := S_INSERT
- else
- begin
- spec_chars := integer(pchar(tree^[ret].ob_spec.free_string)^);
- end;
- end;
-
- begin
- if not initgem then
- exit;
- if rsrc_load('modal.rsc') = 0 then
- begin
- exitgem;
- exit;
- end;
- graf_mouse(ARROW, NIL);
- init_pform(vdihandle, FALSE);
- init_newobs(vdihandle);
- set_insert(spec_chars);
- fix_all(TRUE);
- rsrc_gaddr(R_TREE, MENU, pointer(menuptr));
- menu_bar(menuptr, 1);
- leave := FALSE;
- repeat
- evnt_mesag(buffer);
- if buffer[0] = MN_SELECTED then
- begin
- case buffer[4] of
- ABOUT_MODAL:
- begin
- rsrc_gaddr(R_TREE, ABOUT, pointer(tree));
- menu_bar(menuptr, 0);
- menu_ienable(menuptr, ABOUT_MODAL, 0);
- menu_ienable(menuptr, MFILE, 0);
- menu_ienable(menuptr, DIALOG, 0);
- menu_bar(menuptr, 1);
- open_winddial(tree, 'MODAL', w_handle);
- ret := pform_winddo(tree, ROOT, w_handle);
- deselect(tree^[ret]);
- close_winddial(w_handle);
- menu_bar(menuptr, 0);
- menu_ienable(menuptr, ABOUT_MODAL, 1);
- menu_ienable(menuptr, MFILE, 1);
- menu_ienable(menuptr, DIALOG, 1);
- menu_bar(menuptr, 1);
- end;
-
- OPEN_DIAL:
- begin
- rsrc_gaddr(R_TREE, FORM, pointer(tree));
- getptext(tree, FIELD, oldtxt);
- menu_bar(menuptr, 0);
- menu_ienable(menuptr, ABOUT_MODAL, 0);
- menu_ienable(menuptr, MFILE, 0);
- menu_ienable(menuptr, DIALOG, 0);
- menu_bar(menuptr, 1);
- open_winddial(tree, 'MODAL', w_handle);
- ret := pform_winddo(tree, FIELD, w_handle);
- deselect(tree^[ret]);
- close_winddial(w_handle);
- menu_bar(menuptr, 0);
- menu_ienable(menuptr, ABOUT_MODAL, 1);
- menu_ienable(menuptr, MFILE, 1);
- menu_ienable(menuptr, DIALOG, 1);
- menu_bar(menuptr, 1);
- if ret = CANCEL then
- setptext(tree, FIELD, oldtxt);
- end;
-
- QUIT:
- leave := TRUE;
- end;
- menu_tnormal(menuptr, buffer[3], 1);
- end;
- until leave;
- menu_bar(menuptr, 0);
- fix_all(FALSE);
- exit_pform;
- rsrc_free;
- exitgem;
- end.