home *** CD-ROM | disk | FTP | other *** search
- (*
- * Bibliotheksfunktionen zur Fensterprogrammierung
- * Jürgen Holtkamp, 1993
- *)
- unit windlib;
-
- interface
-
- uses gem, tools;
-
- const
- WI_NOTYPE = 0;
- WI_DIAL = 1;
-
- type
- WINDOWPtr = ^WINDOW;
- WINDOWProc = procedure(windptr: WINDOWPtr);
-
- WINDOW =
- record
- handle : integer; (* Window Handle *)
- work : GRECT; (* Arbeitsbereich *)
- clip : GRECT; (* Clipping-Bereich *)
- elements : integer; (* Bestandteile des Fensters *)
- scroll_x : integer; (* Scroll-Wert für x-Achse *)
- scroll_y : integer; (* Scroll-Wert für y-Achse *)
- align : boolean;
- doc_x : integer; (* x-Position des Dokuments *)
- doc_y : integer; (* y-Position des Dokuments *)
- doc_height : longint; (* Dokumentlänge *)
- doc_width : longint; (* Dokumentbreite *)
- redraw : WINDOWProc; (* Redraw-Funktion *)
- untopped : WINDOWProc; (* wird beim Untoppen aufgerufen *)
- topped : WINDOWProc; (* wird beim Toppen aufgerufen *)
- moved : WINDOWProc; (* " " Moven " *)
- closed : WINDOWProc; (* wird beim Schließen aufg. *)
- next : WINDOWPtr; (* nächstes Fenster *)
- prev : WINDOWPtr;
- wind_spec : pointer;
- wind_type : integer;
- end;
-
- procedure init_windows(vdihandle: integer);
- function create_window(var wind: WINDOW; var coords: GRECT): integer;
- function open_window(var wind: WINDOW; var coords: GRECT;
- wind_name, wind_info: pchar): integer;
- function close_window(var wind: WINDOW): integer;
- procedure handle_window(var buffer: ARRAY_8);
- function find_window(w_handle: integer): WINDOWPtr;
- function get_top: integer;
- function rc_intersect(var p1, p2: GRECT): boolean;
- function cycle_window(w_handle: integer): integer;
-
- function search_menu(m_tree : AESTreePtr; kstate, key : integer;
- var title, entry: integer): boolean;
-
- implementation
-
- uses tos, strings;
-
- (*$X+*)
-
- var
- v_handle : integer;
- firstwind : WINDOWPtr;
- pxy : ARRAY_8;
-
- (***********************************************************************)
- (* xywh2grect() und grect2array() *)
- (***********************************************************************)
- procedure xywh2grect(x, y, w, h: integer; var g: GRECT);
- begin
- with g do
- begin
- g_x := x;
- g_y := y;
- g_w := w;
- g_h := h;
- end;
- end;
-
- procedure grect2array(g: GRECT; var xy: ARRAY_4);
- begin
- with g do
- begin
- xy[0] := g_x;
- xy[1] := g_y;
- xy[2] := g_x + g_w - 1;
- xy[3] := g_y + g_h - 1;
- end;
- end;
-
-
- (***********************************************************************)
- (* rc_intersect() *)
- (* überprüft, ob sich p1 und p2 überlappen *)
- (***********************************************************************)
- 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;
-
- (***********************************************************************)
- (* rc_equal() *)
- (* vergleicht zwei GRECT-Strukturen auf Gleicheit *)
- (***********************************************************************)
- function rc_equal(p1, p2: GRECT): boolean;
- begin
- if (p1.g_x <> p2.g_x) or (p1.g_y <> p2.g_y) or
- (p1.g_w <> p2.g_w) or (p1.g_h <> p2.g_h) then
- rc_equal := FALSE
- else
- rc_equal := TRUE;
- end;
-
-
- (***********************************************************************)
- (* get_top() *)
- (***********************************************************************)
- function get_top: integer;
- var
- dummy, tw: integer;
- begin
- wind_get(0, WF_TOP, tw, dummy, dummy, dummy);
- get_top := tw;
- end;
-
- (***********************************************************************)
- (* find_window() *)
- (***********************************************************************)
- function find_window(w_handle: integer): WINDOWPtr;
- var
- ret: WINDOWPtr;
- begin
- find_window := NIL;
- ret := firstwind;
- if (ret = NIL) then
- exit;
-
- repeat
- if ret^.handle = w_handle then
- find_window := ret;
- ret := ret^.next;
- until ret = WINDOWPtr(NIL);
- end;
-
- function cycle_window(w_handle: integer): integer;
- var
- currwind : WINDOWPtr;
- begin
- if w_handle <= 0 then
- begin
- cycle_window := -1;
- exit;
- end;
- currwind := find_window(w_handle);
- if currwind = NIL then
- begin
- cycle_window := -1;
- exit;
- end;
- repeat
- currwind := currwind^.next;
- if currwind = NIL then
- currwind := firstwind;
- until currwind^.handle <> -1;
- cycle_window := currwind^.handle;
- end;
-
-
- (***********************************************************************)
- (* remove_window() *)
- (* entfernt Eintrag aus der verketteten Liste. *)
- (***********************************************************************)
- function remove_window(wind: WINDOW): boolean;
- var
- wptr1, prev : WINDOWPtr;
- begin
- wptr1 := firstwind;
- if @wind = wptr1 then
- begin
- firstwind := wind.next;
- remove_window := TRUE;
- end
- else
- begin
- repeat
- prev := wptr1;
- wptr1 := wptr1^.next;
- until (wptr1 = @wind) or (wptr1 = WINDOWPtr(NIL));
- if wptr1 <> WINDOWPtr(NIL) then
- begin
- prev^.next := wptr1^.next;
- remove_window := TRUE;
- end
- else
- remove_window := FALSE;
- end;
- end;
-
- (***********************************************************************)
- (* align_wwh() *)
- (***********************************************************************)
- procedure align_wh(w_handle: integer; var w, h: integer);
- var
- currwind : WINDOWPtr;
- border : GRECT;
- begin
- currwind := find_window(w_handle);
- if currwind = NIL then
- exit;
- with currwind^ do
- begin
- if align then
- begin
-
- w := (w div scroll_x) * scroll_x;
- h := (h div scroll_y) * scroll_y;
-
- end;
- end;
- end;
-
-
- (***********************************************************************)
- (* calc_window *)
- (***********************************************************************)
- procedure calc_window(wctype, kind: integer; into: GRECT; var out: GRECT);
- begin
- wind_calc(wctype, kind, into.g_x, into.g_y, into.g_w, into.g_h,
- out.g_x, out.g_y, out.g_w, out.g_h);
- end;
-
- (***********************************************************************)
- (* clear_window() *)
- (* löscht Fensterinhalt *)
- (***********************************************************************)
- procedure clear_window(var wind: WINDOW);
- var
- clip : ARRAY_4;
- begin
- wind_get(wind.handle, WF_WORKXYWH, clip[0], clip[1], clip[2], clip[3]);
- inc(clip[2], (clip[0] - 1));
- inc(clip[3], (clip[1] - 1));
- v_hide_c(v_handle);
- vsf_color(v_handle, 0);
- vs_clip(v_handle, 1, clip);
- v_bar(v_handle, clip);
- v_show_c(v_handle, 1);
- end;
-
-
- (***********************************************************************)
- (* slider_size() *)
- (* Setzen der Größe der Slider *)
- (***********************************************************************)
- procedure slider_size(var wind: WINDOW);
- var
- h_size, v_size : longint;
- old_size, d : integer;
- begin
- with wind do begin
- if (elements and VSLIDE) <> 0 then
- begin
- if doc_height = 0 then
- v_size := 1000
- else
- v_size := min(1000, longint(work.g_h) * 1000
- div longint(doc_height));
- wind_get(handle, WF_VSLSIZE, old_size, d, d, d);
- if old_size <> integer(v_size) then
- wind_set(handle, WF_VSLSIZE, integer(v_size), 0, 0, 0);
- end;
- if (elements and HSLIDE) <> 0 then
- begin
- if doc_width = 0 then
- h_size := 1000
- else
- h_size := min(1000, longint(work.g_w) * 1000
- div longint(doc_width));
- wind_get(handle, WF_HSLSIZE, old_size, d, d, d);
- if old_size <> integer(h_size) then
- wind_set(handle, WF_HSLSIZE, integer(h_size), 0, 0, 0);
- end;
- end;
- end;
-
- (***********************************************************************)
- (* slider_pos() *)
- (* Setzen der Position der Slider *)
- (***********************************************************************)
- procedure slider_pos(var wind: WINDOW);
- var
- x_pos, y_pos : longint;
- old_pos, d : integer;
- begin
- with wind do
- begin
- if (elements and HSLIDE) <> 0 then
- begin
- if wind.doc_width <= wind.work.g_w then
- x_pos := 0
- else
- x_pos := longint(wind.doc_x) * 1000 div
- (wind.doc_width - wind.work.g_w);
- wind_get(handle, WF_HSLIDE, old_pos, d, d, d);
- if old_pos <> integer(x_pos) then
- wind_set(wind.handle, WF_HSLIDE, integer(x_pos), 0, 0, 0);
- end;
-
- if (elements and VSLIDE) <> 0 then
- begin
- if wind.doc_height <= wind.work.g_h then
- y_pos := 0
- else
- y_pos := longint(wind.doc_y) * 1000 div
- (wind.doc_height - wind.work.g_h);
- wind_get(handle, WF_VSLIDE, old_pos, d, d, d);
- if old_pos <> integer(y_pos) then
- wind_set(wind.handle, WF_VSLIDE, integer(y_pos), 0, 0, 0);
- end;
- end;
- end;
-
- (***********************************************************************)
- (* create_window() *)
- (***********************************************************************)
- function create_window(var wind: WINDOW; var coords: GRECT): integer;
- var
- maximum, inside : GRECT;
- currwind : WINDOWPtr;
- begin
- if firstwind = NIL then
- begin
- firstwind := @wind;
- wind.prev := NIL
- end
- else
- begin
- currwind := firstwind;
- while currwind^.next <> NIL do
- currwind := currwind^.next;
- currwind^.next := @wind;
- wind.prev := currwind;
- end;
- wind.next := NIL;
-
- with maximum do
- wind_get(0, WF_WORKXYWH, g_x, g_y, g_w, g_h);
-
- if coords.g_w > maximum.g_w then
- coords.g_w := maximum.g_w;
- if coords.g_h > maximum.g_h then
- coords.g_h := maximum.g_h;
-
- if (coords.g_x + coords.g_w) > (maximum.g_x + maximum.g_w) then
- coords.g_x := maximum.g_x + maximum.g_w - coords.g_w;
- if (coords.g_y + coords.g_h) > (maximum.g_y + maximum.g_h) then
- coords.g_y := maximum.g_y + maximum.g_h - coords.g_h;
-
- if coords.g_x < maximum.g_x then
- coords.g_x := maximum.g_x;
- if coords.g_y < maximum.g_y then
- coords.g_y := maximum.g_y;
-
- with inside do
- begin
- wind_calc(WC_WORK, wind.elements, coords.g_x, coords.g_y,
- coords.g_w, coords.g_h, g_x, g_y, g_w, g_h);
- align_wh(wind.handle, g_w, g_h);
- wind_calc(WC_BORDER, wind.elements, g_x, g_y, g_w, g_h,
- coords.g_x, coords.g_y, coords.g_w, coords.g_h);
- end;
-
- with coords do
- wind.handle := wind_create(wind.elements, g_x, g_y, g_w, g_h);
-
- create_window := wind.handle;
- end;
-
-
- (***********************************************************************)
- (* open_window() *)
- (***********************************************************************)
- function open_window(var wind: WINDOW; var coords: GRECT;
- wind_name, wind_info: pchar): integer;
- var
- maximum : GRECT;
- currwind : WINDOWPtr;
- begin
- currwind := find_window(get_top);
- if currwind <> WINDOWPtr(NIL) then
- currwind^.untopped(currwind);
-
- with maximum do
- wind_get(wind.handle, WF_FULLXYWH, g_x, g_y, g_w, g_h);
-
- if coords.g_w > maximum.g_w then
- coords.g_w := maximum.g_w;
- if coords.g_h > maximum.g_h then
- coords.g_h := maximum.g_h;
-
- if (coords.g_x + coords.g_w) > (maximum.g_x + maximum.g_w) then
- coords.g_x := maximum.g_x + maximum.g_w - coords.g_w;
- if (coords.g_y + coords.g_h) > (maximum.g_y + maximum.g_h) then
- coords.g_y := maximum.g_y + maximum.g_h - coords.g_h;
-
- if coords.g_x < maximum.g_x then
- coords.g_x := maximum.g_x;
- if coords.g_y < maximum.g_y then
- coords.g_y := maximum.g_y;
-
- with wind do
- begin
- calc_window(WC_WORK, elements, coords, work);
- align_wh(handle, work.g_w, work.g_h);
- calc_window(WC_BORDER, elements, work, coords);
- end;
-
- if ((wind.elements and NAME) <> 0) and (wind_name^ <> #0) then
- wind_set(wind.handle, WF_NAME, longint(wind_name) shr 16,
- longint(wind_name) and $ffff, 0, 0);
- if ((wind.elements and INFO) <> 0) and (wind_info^ <> #0) then
- wind_set(wind.handle, WF_INFO, longint(wind_info) shr 16,
- longint(wind_info) and $ffff, 0, 0);
- with coords do
- open_window := wind_open(wind.handle, g_x, g_y, g_w, g_h);
-
- clear_window(wind);
- slider_size(wind);
- slider_pos(wind);
- end;
-
- (***********************************************************************)
- (* handle_full() *)
- (***********************************************************************)
- procedure handle_full(var wind: WINDOW);
- var
- prev, curr, full : GRECT;
- begin
- with curr do
- wind_get(wind.handle, WF_CURRXYWH, g_x, g_y, g_w, g_h);
- with prev do
- wind_get(wind.handle, WF_PREVXYWH, g_x, g_y, g_w, g_h);
- with full do
- wind_get(wind.handle, WF_FULLXYWH, g_x, g_y, g_w, g_h);
-
- if rc_equal(curr, full) then
- begin
- with prev do
- wind_set(wind.handle, WF_CURRXYWH, g_x, g_y, g_w, g_h);
- calc_window(WC_WORK, wind.elements, prev, wind.work);
- end
- else
- begin
- wind_set(wind.handle, WF_CURRXYWH,
- full.g_x, full.g_y, full.g_w, full.g_h);
- calc_window(WC_WORK, wind.elements, full, wind.work);
- end;
- end;
-
- (***********************************************************************)
- (* do_redraw() *)
- (* führt den Redraw eines Fensters aus *)
- (***********************************************************************)
- procedure do_redraw(var wind: WINDOW; x, y, w, h: integer);
- var
- p : GRECT;
- xy : ARRAY_4;
- begin
- vsf_color(v_handle, WHITE);
- graf_mouse(M_OFF, NIL);
- wind_update(BEG_UPDATE);
- with p do
- wind_get(wind.handle, WF_FIRSTXYWH, g_x, g_y, g_w, g_h);
- while (p.g_w > 0) and (p.g_h > 0) do
- begin
- wind.clip.g_x := x; (* x *)
- wind.clip.g_y := y; (* y *)
- wind.clip.g_w := w; (* width *)
- wind.clip.g_h := h; (* height *)
- if rc_intersect(p, wind.clip) then
- begin
- grect2array(wind.clip, xy);
- vs_clip(v_handle, 1, xy);
- v_bar(v_handle, xy);
- wind.redraw(@wind);
- end;
- with p do
- wind_get(wind.handle, WF_NEXTXYWH, g_x, g_y, g_w, g_h);
- end;
- vs_clip(v_handle, 0, xy);
- wind_update(END_UPDATE);
- graf_mouse(M_ON, NIL);
- end;
-
- (***********************************************************************)
- (* wind_hslide() *)
- (* Berechnen der horizontalen Dokumentsposition *)
- (***********************************************************************)
- function wind_hslide(var wind: WINDOW; newpos: integer): boolean;
- var
- oldpos, dummy : integer;
- old_doc_x : integer;
- begin
- wind_hslide := FALSE;
- wind_get(wind.handle, WF_HSLIDE, oldpos, dummy, dummy, dummy);
- if ((wind.elements and HSLIDE) <> 0) and (oldpos <> newpos) then
- begin
- old_doc_x := wind.doc_x;
- wind.doc_x := newpos * (wind.doc_width - wind.work.g_w) div 1000;
- wind_set(wind.handle, WF_HSLIDE, newpos, 0, 0, 0);
- if wind.align then
- begin
- wind.doc_x := (wind.doc_x div wind.scroll_x) * wind.scroll_x;
- old_doc_x := (old_doc_x div wind.scroll_x) * old_doc_x;
- end;
- wind_hslide := (wind.doc_x <> old_doc_x);
- end
- end;
-
- (***********************************************************************)
- (* wind_vslide() *)
- (* Berechnen der vertikalen Dokumentsposition *)
- (***********************************************************************)
- function wind_vslide(var wind: WINDOW; newpos: integer): boolean;
- var
- oldpos, dummy : integer;
- old_doc_y : integer;
- begin
- wind_vslide := FALSE;
- wind_get(wind.handle, WF_VSLIDE, oldpos, dummy, dummy, dummy);
- if ((wind.elements and VSLIDE) <> 0) and (oldpos <> newpos) then
- begin
- old_doc_y := wind.doc_y;
- wind.doc_y := newpos * (wind.doc_height - wind.work.g_h) div 1000;
- if wind.align then
- begin
- wind.doc_y := (wind.doc_y div wind.scroll_y) * wind.scroll_y;
- old_doc_y := (old_doc_y div wind.scroll_y) * old_doc_y;
- end;
- wind_set(wind.handle, WF_VSLIDE, newpos, 0, 0, 0);
- wind_vslide := (wind.doc_y <> old_doc_y);
- end
- end;
-
- (***********************************************************************)
- (* scroll_wind() *)
- (* Slidermanager *)
- (***********************************************************************)
- function scroll_wind(var wind: WINDOW; what: integer): boolean;
- var
- old_doc_x, old_doc_y : integer;
- begin
- with wind do
- begin
- old_doc_x := doc_x;
- old_doc_y := doc_y;
- case what of
- WA_UPPAGE : dec(doc_y, work.g_h + scroll_y);
- WA_DNPAGE : inc(doc_y, work.g_h - scroll_y);
- WA_UPLINE : dec(doc_y, scroll_y);
- WA_DNLINE : inc(doc_y, scroll_y);
- WA_LFPAGE : dec(doc_x, work.g_w + scroll_x);
- WA_RTPAGE : inc(doc_x, work.g_w - scroll_x);
- WA_LFLINE : dec(doc_x, scroll_x);
- WA_RTLINE : inc(doc_x, scroll_x);
- end;
- if doc_y > doc_height - work.g_h then
- doc_y := doc_height - work.g_h;
- if doc_y < 0 then
- doc_y := 0;
- if doc_x > doc_width - work.g_w then
- doc_x := doc_width - work.g_w;
- if doc_x < 0 then
- doc_x := 0;
-
- if (old_doc_x = doc_x) and (old_doc_y = doc_y) then
- scroll_wind := FALSE
- else
- begin
- scroll_wind := TRUE;
- slider_pos(wind);
- end;
- end;
- end;
-
- (***********************************************************************)
- (* scroll_redraw() *)
- (***********************************************************************)
- procedure scroll_redraw(var wind: WINDOW; what: integer);
- var
- screen : MFDB;
- x, y, w, h : integer;
- clipxy : ARRAY_4;
- box, p : GRECT;
- begin
- with wind do
- begin
- x := work.g_x;
- y := work.g_y;
- w := work.g_w;
- h := work.g_h;
- if (what in [WA_UPPAGE, WA_DNPAGE, WA_LFPAGE, WA_RTPAGE]) or
- (not align) then
- begin
- do_redraw(wind, x, y, w, h);
- exit;
- end;
-
- screen.fd_addr := NIL;
- (* erstes rechteck holen *)
- with p do
- wind_get(wind.handle, WF_FIRSTXYWH, g_x, g_y, g_w, g_h);
- (* while w und h > 0 *)
- wind_update(BEG_UPDATE);
- graf_mouse(M_OFF, NIL);
-
- while (p.g_w > 0) and (p.g_h > 0) do
- begin
- x := p.g_x;
- y := p.g_y;
- w := p.g_w;
- h := p.g_h;
- case what of
- WA_RTLINE:
- with p do
- begin
- pxy[0] := g_x + scroll_x;
- pxy[1] := g_y;
- pxy[2] := g_x + g_w - 1;
- pxy[3] := g_y + g_h - 1;
- pxy[4] := g_x;
- pxy[5] := g_y;
- pxy[6] := g_x + g_w - 1 - scroll_x;
- pxy[7] := g_y + g_h - 1;
- if scroll_x < g_w then
- begin
- x := g_x + g_w - scroll_x;
- y := g_y;
- w := scroll_x;
- h := g_h;
- end;
- end;
- WA_LFLINE:
- with p do
- begin
- pxy[0] := g_x;
- pxy[1] := g_y;
- pxy[2] := g_x + g_w - 1 - scroll_x;
- pxy[3] := g_y + g_h - 1;
- pxy[4] := g_x + scroll_x;
- pxy[5] := g_y;
- pxy[6] := g_x + g_w - 1;
- pxy[7] := g_y + g_h - 1;
- if scroll_x < g_w then
- begin
- x := g_x;
- y := g_y;
- w := scroll_x;
- h := g_h;
- end;
- end;
- WA_DNLINE:
- with p do
- begin
- pxy[0] := g_x;
- pxy[1] := g_y + scroll_y;
- pxy[2] := g_x + g_w - 1;
- pxy[3] := g_y + g_h - 1;
- pxy[4] := g_x;
- pxy[5] := g_y;
- pxy[6] := g_x + g_w - 1;
- pxy[7] := g_y + g_h - 1 - scroll_y;
- if scroll_y < g_h then
- begin
- x := g_x;
- y := g_y + g_h - scroll_y;
- w := g_w;
- h := scroll_y;
- end;
- end;
- WA_UPLINE:
- with p do
- begin
- pxy[0] := g_x;
- pxy[1] := g_y;
- pxy[2] := g_x + g_w - 1;
- pxy[3] := g_y + g_h - 1 - scroll_y;
- pxy[4] := g_x;
- pxy[5] := g_y + scroll_y;
- pxy[6] := g_x + g_w - 1;
- pxy[7] := g_y + g_h - 1;
- if scroll_y < g_h then
- begin
- x := g_x;
- y := g_y;
- w := g_w;
- h := scroll_y;
- end;
- end;
- end; (* of case *)
- if ((what in [WA_UPLINE, WA_DNLINE]) and
- (p.g_h > scroll_y)) or
- ((what in [WA_LFLINE, WA_RTLINE]) and
- (p.g_w > scroll_x)) then
- vro_cpyfm(v_handle, S_ONLY, pxy, screen, screen);
- wind.clip.g_x := x;
- wind.clip.g_y := y;
- wind.clip.g_w := w;
- wind.clip.g_h := h;
- with wind.clip do
- begin
- clipxy[0] := g_x;
- clipxy[1] := g_y;
- clipxy[2] := g_x + g_w - 1;
- clipxy[3] := g_y + g_h - 1;
- end;
- vs_clip(v_handle, 1, clipxy);
- vsf_color(v_handle, WHITE);
- vr_recfl(v_handle, clipxy);
- wind.redraw(@wind);
- vs_clip(v_handle, 0, clipxy);
- with p do
- wind_get(wind.handle, WF_NEXTXYWH, g_x, g_y, g_w, g_h);
- end;
- graf_mouse(M_ON, NIL);
- wind_update(END_UPDATE);
- end;
- end;
-
- (***********************************************************************)
- (* handle_window() *)
- (* allgemeine Fensterverwaltung *)
- (***********************************************************************)
- procedure handle_window(var buffer: ARRAY_8);
- var
- currwind : WINDOWPtr;
- p : GRECT;
- begin
- currwind := find_window(buffer[3]);
- case buffer[0] of
- WM_REDRAW:
- do_redraw(currwind^, buffer[4], buffer[5], buffer[6], buffer[7]);
- WM_TOPPED, WM_NEWTOP:
- begin
- currwind := find_window(get_top);
- if currwind <> WINDOWPtr(NIL) then
- currwind^.untopped(currwind);
- currwind := find_window(buffer[3]);
- wind_set(buffer[3], WF_TOP, buffer[3], 0, 0, 0);
- currwind^.topped(currwind);
- end;
- WM_CLOSED:
- close_window(currwind^);
- WM_FULLED:
- begin
- handle_full(currwind^);
- slider_size(currwind^);
- slider_pos(currwind^);
- with currwind^ do
- begin
- if work.g_w > (doc_width - doc_x) then
- doc_x := doc_width - work.g_w;
- if doc_x < 0 then
- doc_x := 0;
- if work.g_h > (doc_height - doc_y) then
- doc_y := doc_height - work.g_h;
- if doc_y < 0 then
- doc_y := 0;
- end;
- end;
- WM_ARROWED:
- if scroll_wind(currwind^, buffer[4]) then
- scroll_redraw(currwind^, buffer[4]);
- WM_HSLID:
- begin
- if wind_hslide(currwind^, buffer[4]) then
- do_redraw(currwind^, currwind^.work.g_x, currwind^.work.g_y,
- currwind^.work.g_w, currwind^.work.g_h);
- end;
- WM_VSLID:
- begin
- if wind_vslide(currwind^, buffer[4]) then
- do_redraw(currwind^, currwind^.work.g_x, currwind^.work.g_y,
- currwind^.work.g_w, currwind^.work.g_h);
- end;
- WM_SIZED:
- begin
- if buffer[6] < 100 then
- buffer[6] := 100;
- if buffer[7] < 100 then
- buffer[7] := 100;
-
- with currwind^.work do
- begin
- wind_calc(WC_WORK, currwind^.elements, buffer[4], buffer[5],
- buffer[6], buffer[7], g_x, g_y, g_w, g_h);
- align_wh(buffer[3], g_w, g_h);
- wind_calc(WC_BORDER, currwind^.elements, g_x, g_y, g_w, g_h,
- buffer[4], buffer[5], buffer[6],buffer[7]);
- wind_set(buffer[3], WF_CURRXYWH, buffer[4], buffer[5],
- buffer[6],buffer[7]);
- end;
- slider_size(currwind^);
- slider_pos(currwind^);
- with currwind^ do
- begin
- if work.g_w > (doc_width - doc_x) then
- doc_x := doc_width - work.g_w;
- if doc_x < 0 then
- doc_x := 0;
- if work.g_h > (doc_height - doc_y) then
- doc_y := doc_height - work.g_h;
- if doc_y < 0 then
- doc_y := 0;
- end;
- end;
- WM_MOVED:
- begin
- with currwind^.work do
- begin
- wind_calc(WC_WORK, currwind^.elements, buffer[4], buffer[5],
- buffer[6], buffer[7], g_x, g_y, g_w, g_h);
- align_wh(buffer[3], g_w, g_h);
- wind_calc(WC_BORDER, currwind^.elements, g_x, g_y, g_w, g_h,
- buffer[4], buffer[5], buffer[6],buffer[7]);
- wind_set(buffer[3], WF_CURRXYWH, buffer[4], buffer[5],
- buffer[6],buffer[7]);
- end;
- slider_size(currwind^);
- currwind^.moved(currwind);
- end;
- end;
- end;
-
- (***********************************************************************)
- (* close_window() *)
- (***********************************************************************)
- function close_window(var wind: WINDOW): integer;
- begin
- wind.closed(@wind);
- close_window := 1;
- if wind_close(wind.handle) = 0 then
- close_window := 0;
- if wind_delete(wind.handle) = 0 then
- close_window := 0;
- wind.handle := -1;
- (* remove_window(wind); *)
- if wind.prev <> NIL then
- (wind.prev)^.next := wind.next; (* Fenster aus Liste entfernen *)
- if firstwind = @wind then
- firstwind := wind.next;
- end;
-
- procedure init_windows(vdihandle: integer);
- begin
- v_handle := vdihandle;
- end;
-
- (*********************************************************************)
-
- function test_entry(specstr : pchar; bst : char;
- scan, state : integer) : boolean;
- var
- vchr : char;
- ret : boolean;
- zahl, i : integer;
- begin
- test_entry := FALSE;
- i := strlen(specstr) - 1;
- while specstr[i] = ' ' do
- dec(i);
- vchr := upcase(specstr[i]);
-
- if vchr = bst then
- begin
- dec(i);
- if ((specstr[i] = '^') and (state = K_CTRL))
- or ((specstr[i] = #7) and (state = K_ALT)) then
- begin
- test_entry := TRUE;
- exit;
- end;
- if (specstr[i] = ' ') and ((state and K_CTRL) = 0) and
- ((state and K_ALT) = 0) then
- begin
- test_entry := TRUE;
- exit;
- end;
- end;
-
-
- if (specstr[i] = '''') and ((state and K_CTRL) = 0) and
- ((state and K_ALT) = 0) then
- begin
- dec(i);
- vchr := upcase(specstr[i]);
- if (vchr = bst) and (specstr[i - 1] = '''') then
- begin
- test_entry := TRUE;
- exit;
- end;
- end;
-
- if (specstr[i] in ['0'..'9']) then
- begin
- zahl := ord(specstr[i]) - ord('0');
- dec(i);
- if specstr[i] in ['0'..'9'] then
- begin
- inc(zahl, (ord(specstr[i]) - ord(0)) * 10);
- dec(i);
- end;
- if specstr[i] = 'F' then
- begin
- if specstr[i - 1] = #1 then
- inc(zahl, 10);
- if zahl in [1..10] then
- if zahl = scan - $3b + 1 then
- begin
- test_entry := TRUE;
- exit;
- end;
- if zahl in [11..20] then
- if zahl = scan - $54 + 11 then
- begin
- test_entry := TRUE;
- exit;
- end;
- end;
- end;
- end;
-
- function search_menu(m_tree : AESTreePtr; kstate, key : integer;
- var title, entry: integer): boolean;
- var
- do_quit, desk : boolean;
- pkeytbl : KEYTABPtr;
- kbd_unshift, kbd_shift : pchar;
- bst : char;
- state, scan, mother_title, child_title,
- mother_entry, child_entry : integer;
- begin
- search_menu := FALSE;
- state := 0;
- do_quit := FALSE;
- desk := TRUE;
- pkeytbl := Keytbl(pointer(-1),pointer(-1),pointer(-1));
- kbd_unshift := pkeytbl^.unshift;
- kbd_shift := pkeytbl^.shift;
- wind_update(BEG_UPDATE);
- wind_update(END_UPDATE);
- scan := hi(key);
- if (kstate and (K_LSHIFT or K_RSHIFT)) = 0 then
- bst := kbd_unshift[scan]
- else
- bst := kbd_shift[scan];
- bst := upcase(bst);
- if ((kstate and K_ALT) <> 0) and ((kstate and K_CTRL) = 0) then
- state := K_ALT
- else
- if ((kstate and K_CTRL) <> 0) and ((kstate and K_ALT) = 0) then
- state := K_CTRL
- else
- if ((kstate and K_CTRL) = 0) and ((kstate and K_ALT) = 0) then
- state := 0
- else
- do_quit := TRUE;
- mother_title := m_tree^[m_tree^[ROOT].ob_head].ob_head;
- child_title := m_tree^[mother_title].ob_head;
- mother_entry := m_tree^[m_tree^[ROOT].ob_tail].ob_head;
- child_entry := m_tree^[mother_entry].ob_head;
-
- while not do_quit do
- begin
- if not is_state(m_tree^[child_title], DISABLED) then
- while (not do_quit) and (child_entry <> mother_entry) and
- (child_entry <> -1) do
- begin
- with m_tree^[child_entry] do
- begin
- if not is_state(m_tree^[child_entry], DISABLED) and
- (ob_type in [G_STRING, G_BUTTON]) then
- do_quit := test_entry(ob_spec.free_string,
- bst, scan, state);
- if do_quit then
- begin
- menu_tnormal(m_tree, child_title, 0);
- title := child_title;
- entry := child_entry;
- search_menu := TRUE;
- end;
- child_entry := ob_next;
- if desk then
- begin
- child_entry := mother_entry;
- desk := FALSE;
- end;
- end;
- end;
- child_title := m_tree^[child_title].ob_next;
- mother_entry := m_tree^[mother_entry].ob_next;
- child_entry := m_tree^[mother_entry].ob_head;
- if child_title = mother_title then
- do_quit := TRUE;
- end;
- end;
-
-
- begin
- firstwind := NIL;
- end.