home *** CD-ROM | disk | FTP | other *** search
- program modeless;
-
- uses gem, geminit, newobs, pform, tools;
-
- (*$I modelss2.i*)
-
- type
- FORMULAR = record
- w_handle : integer;
- tree : AESTreePtr;
- editobj : integer;
- idx : integer;
- end;
-
- var
- menuptr : AESTreePtr;
- leave : boolean;
- buffer : ARRAY_8;
- ret : integer;
- oldtxt : string;
- events : EVENT;
- which : integer;
- form_about,
- form_test : FORMULAR;
-
- (***********************************************************************)
- (* unmodale 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(var form: FORMULAR; title: pchar): 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(form.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);
- form.w_handle := wind_create(elements, g_x, g_y, g_w, g_h);
- end;
- if title^ <> #0 then
- wind_set(form.w_handle, WF_NAME, hiword(longint(title)),
- loword(longint(title)), 0, 0);
- if form.w_handle < 0 then
- begin
- open_winddial := FALSE;
- exit;
- end;
- with outside do
- wind_calc(WC_BORDER, elements, form.tree^[ROOT].ob_x,
- form.tree^[ROOT].ob_y, form.tree^[ROOT].ob_width,
- form.tree^[ROOT].ob_height,
- g_x, g_y, g_w, g_h);
- with outside do
- if wind_open(form.w_handle, g_x, g_y, g_w, g_h) = 0 then
- begin
- open_winddial := FALSE;
- exit;
- end;
- form.editobj := ini_field(form.tree, form.editobj);
- if form.editobj <> 0 then
- objc_ed(form.tree, form.editobj, 0, form.idx, EDINIT);
- end;
-
- function pform_win(var form: FORMULAR): integer;
- var
- topwind : integer;
- dummy : integer;
- box : GRECT;
- pipe : ARRAY_8;
- begin
- pipe[1] := AES_pb.global^[2];
-
- 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 form.w_handle = ev_mmgpbuf[3] then
- begin
- wind_set(form.w_handle, WF_CURRXYWH, ev_mmgpbuf[4],
- ev_mmgpbuf[5], ev_mmgpbuf[6], ev_mmgpbuf[7]);
- with form.tree^[ROOT] do
- wind_get(form.w_handle, WF_WORKXYWH, ob_x, ob_y,
- ob_width, ob_height);
- end;
- WM_REDRAW:
- if form.w_handle = ev_mmgpbuf[3] then
- begin
- wind_get(0, WF_TOP, topwind, dummy, dummy, dummy);
- if (form.editobj <> 0) and
- (topwind = form.w_handle) then
- begin
- with form.tree^[ROOT] do
- objc_draw(form.tree, ROOT, MAX_DEPTH,
- ob_x, ob_y, ob_width, ob_height);
- objc_ed(form.tree, form.editobj, 0,
- form.idx, EDINIT);
- end
- else
- do_redraw(ev_mmgpbuf[3], box, form.tree);
- end;
-
-
- WM_TOPPED:
- if form.w_handle = ev_mmgpbuf[3] then
- begin
- wind_set(form.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] := form.w_handle;
- pipe[4] := form.tree^[ROOT].ob_x;
- pipe[5] := form.tree^[ROOT].ob_y;
- pipe[6] := form.tree^[ROOT].ob_width;
- pipe[7] := form.tree^[ROOT].ob_height;
- appl_write(pipe[1], 16, @pipe);
- end;
- end;
- end;
- ret := -1;
- wind_get(0, WF_TOP, topwind, dummy, dummy, dummy);
-
-
- if (form.tree <> NIL) and (form.w_handle > 0) and
- (topwind = form.w_handle) then
- ret := pform_thru(form.tree, which, events, form.editobj, form.idx);
- pform_win := ret;
- end;
-
- procedure close_winddial(var form: FORMULAR);
- begin
- if form.editobj <> 0 then
- objc_ed(form.tree, form.editobj, 0, form.idx, EDEND);
- wind_close(form.w_handle);
- wind_delete(form.w_handle);
- form.w_handle := -1;
- 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('modelss2.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;
-
- 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;
-
- with form_test do
- begin
- tree := NIL;
- w_handle := -1;
- editobj := 0;
- end;
- with form_about do
- begin
- tree := NIL;
- w_handle := -1;
- editobj := 0;
- end;
-
- repeat
- which := EvntMulti(events);
-
- ret := pform_win(form_about);
- if ret >= 0 then
- begin
- if is_flag(form_about.tree^[ret], TOUCHEXIT) or
- (is_flag(form_about.tree^[ret], F_EXIT) and
- is_flag(form_about.tree^[ret], SELECTABLE)) then
- begin
- close_winddial(form_about);
- deselect(form_about.tree^[ret]);
- menu_ienable(menuptr, ABOUT_MODELESS, 1);
- end;
- end
- else
- begin
- ret := pform_win(form_test);
- if ret >= 0 then
- begin
- if is_flag(form_test.tree^[ret], TOUCHEXIT) or
- (is_flag(form_test.tree^[ret], F_EXIT) and
- is_flag(form_test.tree^[ret], SELECTABLE)) then
- begin
- close_winddial(form_test);
- deselect(form_test.tree^[ret]);
- if ret = CANCEL then
- setptext(form_test.tree, FIELD, oldtxt);
- menu_ienable(menuptr, OPEN_DIAL, 1);
- end;
- end;
- end;
-
- if (which and MU_MESAG) <> 0 then
- begin
- if events.ev_mmgpbuf[0] = MN_SELECTED then
- begin
- case events.ev_mmgpbuf[4] of
- ABOUT_MODELESS:
- begin
- rsrc_gaddr(R_TREE, ABOUT, pointer(form_about.tree));
- open_winddial(form_about, 'MODAL');
- menu_ienable(menuptr, ABOUT_MODELESS, 0);
- end;
-
- OPEN_DIAL:
- begin
- rsrc_gaddr(R_TREE, FORM, pointer(form_test.tree));
- getptext(form_test.tree, FIELD, oldtxt);
- open_winddial(form_test, 'MODAL');
- menu_ienable(menuptr, OPEN_DIAL, 0);
- end;
-
- QUIT:
- leave := TRUE;
- end;
- menu_tnormal(menuptr, events.ev_mmgpbuf[3], 1);
- end;
- end;
- until leave;
- if form_test.w_handle <> -1 then
- close_winddial(form_test);
- if form_about.w_handle <> -1 then
- close_winddial(form_about);
- menu_bar(menuptr, 0);
- fix_all(FALSE);
- exit_pform;
- rsrc_free;
- exitgem;
- end.