home *** CD-ROM | disk | FTP | other *** search
/ Whiteline: Alpha / Whiteline Alpha.iso / progtool / forth / edwindow.scr < prev    next >
Encoding:
Text File  |  1994-09-22  |  18.0 KB  |  1 lines

  1. \\                     *** EDWINDOW.SCR ***            14sep86we                                                                Dieses File enthält das Editorfenster. Es kann als Beispiel für die Programmierung eines eigenen Fensters benutzt werden.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       \ Window-Handling Loadscreen                           30oct86we                                                                Onlyforth   Gem also definitions                                                                                                1 7 +thru                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       \ VDI-Functions for window                             24aug86we                                                                : bar    ( x1 y1 x2 y2 -- )                                        ptsin 4 array!   1 function !   &11 2 0 VDI ;                                                                                : swr_mode   ( mode -- )         intin !   &32 0 1 VDI  ;                                                                       : sf_interior   ( style  -- )    intin !    &23 0 1 VDI  ;      : sf_style   ( styleindex -- )   intin !    &24 0 1 VDI  ;      : sf_color   ( color -- )        intin !    &25 0 1 VDI  ;      : sf_perimeter   ( pervis -- )   intin !   &104 0 1 VDI  ;                                                                      : fbox  ( x1 y1 x2 y2 -- )                                         1 swr_mode  1 sf_interior  0 sf_color  0 sf_perimeter  bar ;                                                                                                                                 \ save and restore the screen                          10sep86we                                                                ?head @    1 ?head !                                                                                                            Create memMFDB2  7 , 0 , &640 , &400 , &40 , 0 , 1 ,                             0 , 0 , 0 ,                                                                                                    memMFDB2 scr>mem scr>mem2  ( Xleft Ytop Width Heigth -- )       memMFDB2 mem>scr mem2>scr  ( Xleft Ytop Width Heigth -- )                                                                       : save_screen       0 0 cwidth &80 *  cheight &25 *                                 scr>mem2 ;                                  : restore_screen    0 0 cwidth &80 *  cheight &25 *                                 mem2>scr ;                                                                                                                                                                  \ Windowcomponents and Windowsize                      30aug86we                                                                :name  :move +  :info +  :uparrow +  :dnarrow +  :vslide +      Constant wi_components                                                                                                          : wi_x       ( -- n )      dx cwidth  * ;                       : wi_y       ( -- n )      dy cheight * ;                       : wi_width   ( -- n )     c/l cwidth  * ;                       : wi_height  ( -- n )     l/s cheight * ;                                                                                       : wi_size   ( -- wx wy wwidth wheight )                            0  wi_components                                                wi_x 1-  wi_y 1-  wi_width 2+  wi_height 2+  wind_calc          intout 2+ 4@ ;                                                                                                                                                                               \ Window's title and sliders                           25sep86we                                                                Variable wi_handle                                                                                                              : wi_string  ( 0string function# -- )       swap  >r               wi_handle @  swap  r> >absaddr swap  0 0  wind_set ;                                                                         : wi_title   ( 0string -- )    :wf_name wi_string ;             : wi_status  ( 0string -- )    :wf_info wi_string ;                                                                             : vslide_size                                                      wi_handle @  :wf_vslize  &1000 capacity /  0 0 0  wind_set ;                                                                 : vslide   ( scr# -- )      wi_handle @  :wf_vslide                rot  &1000  capacity dup 1-  IF 1- THEN   */                    0 0 0  wind_set ;                                            \ Draw window on screen                                30aug86we                                                                : small_big  ( -- sx sy sw sh  bx by bw bh )                       little 4@  wi_size ;                                                                                                         : growbox       small_big graf_growbox ;                        : shrinkbox     small_big graf_shrinkbox ;                                                                                      : wi_clear     wi_x 1-   wi_y 1-                                   over wi_width 1+ +    over wi_height 1+ +  fbox ;                                                                                                                                                                                                                                                                                                                                                                                                            \ Open and close window                                30aug86we                                                                : wi_open    ( -- )        save_screen   growbox                   wi_components wi_size wind_create   dup wi_handle !             pad  dup off  dup wi_title  wi_status                           wi_size wind_open   wi_clear ;                                                                                               : wi_close   ( -- )                                                wi_handle @  dup wind_close  wind_delete                        shrinkbox  restore_screen ;                                                                                                                                                                                                                                                                                                                                                                                                                                  \ redrawing the rest of screen                         10sep86we                                                                : restore_rect    ( x y w h -- )      1- >r  1-  r>  mem2>scr ;                                                                 : rect_update   ( function# -- x y w h )                           0  swap  wind_get  intout 2+  4@  ;                                                                                          : redraw_screen      :wf_firstxywh rect_update                     BEGIN  2dup or                                                  WHILE  restore_rect  :wf_nextxywh rect_update  REPEAT           2drop 2drop ;                                                                                                                ?head !                                                                                                                                                                                                                                                                                                                14sep86we                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                \ Window-Handling Loadscreen                           14sep86we                                                                Suchreihenfolge: Zuerst GEM, dann FORTH                                                                                         Gebraucht werden die Definitionen aus GEMDEFS.SCR                                                                               Dieses Vokabular wird als erstes durchsucht.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    \ VDI-Functions for window                             14sep86we                                                                Für das Fenster werden einige Funktionen aus VDI gebraucht,      die auf diesem Screen zusammengestellt sind. Beschreibung siehe Beschreibung VDI (hoffentlich haben wir die schon!)                                                                            Im Grunde wird nur eine Routine benutzt, mit der man ein weißes  Rechteck zum Löschen des Fensterinhaltes erzeugen kann. Dies    erledigt fbox                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  \ save and restore the screen                          14sep86we                                                                alle folgenden Funktionen sollen headerless kompiliert werden.                                                                  Ein zweiter Speicherbereich wird gebraucht, um den Bildschirm    beim Verlassen des Editors zu restaurieren. Dieses Verfahren    ren ist erheblich schneller als die Neuausgabe des Bildschirms, braucht aber Speicherplatz  (Wir hams ja!)                                                                                                                                                     Der gesamte Bildschirm wird in den dafür vorgesehenen Speicher-  bereich gerettet (außerhalb des FORTH-Systems, versteht sich)  Das Ganze umgekehrt stellt den Bildschirm wieder her. Diese      Funktionen sind recht nützlich, weil man Werte noch sehen kann, die z.B. bei LIST weggescrollt würden.                                                                                         \ Windowcomponents and Windowsize                      14sep86we                                                                Die Bestandteile des Fensters werden einfach aufaddiert und     als Konstante zur Verfügung gestellt.                                                                                           linke obere Ecke des Fensters in Bildschirmkoordinaten                                                                          Breite des Fensters in Bildschirmkoordinaten                    Höhe des Fensters in Bildschirmkoordinaten                                                                                      berechnet die Ausmaße des Fensters für alle weiteren Funktionen  unter Zuhilfenahme von WIND-CALC. Leider liefert diese Funktion bei Breite und Höhe ein Pixel zu wenig. Digital Research allein mag wissen, warum ...                                                                                                                                                                          \ Window's title and sliders                           14sep86we                                                                Window-Handle des Fensters                                                                                                      zur Ausgabe eines Textes in Titel- oder Infozeile                Der String muß mit einer Null abgeschlossen sein.                                                                              gibt 0string in der Titelzeile aus.                             gibt 0string in der Infozeile aus.                                                                                              Die Größe des vertikalen Sliders wird aus der Gesamtgröße des    Files, das editiert wird, berechnet.                                                                                           Die Position des vertikalen Sliders wird relativ zur Gesamtgröße des Files eingestellt.                                                                                                         \ Draw window on screen                                14sep86we                                                                gibt die Größe eines kleinen Rechtecks sowie des ganzen Fensters                                                                                                                                zeichnet ein wachsendes Rechteck (nur fürs Auge ...)            zeichnet ein schrumpfendes Rechteck ( s.o.)                                                                                     löscht den Innenraum des Fenster durch Überschreiben mit einem   weißen Rechteck.                                                                                                                                                                                                                                                                                                                                                                                                                                               \ Open and close window                                14sep86we                                                                öffnet das Editorfenster:  Bildschirminhalt merken               Fenster erzeugen mit entsprechender Größe und Attributen        Titel- und Infozeile löschen                                    Fenster auf dem Bildschirm ausgeben und Inhalt löschen                                                                         schließt das Editorfenster:                                      Fenster vom Bildschirm und überhaupt entfernen                  Bildschirm restaurieren.                                                                                                                                                                                                                                                                                                                                                                                                                                       \ redrawing the rest of screen                         14sep86we                                                                Rechteck per Pixelmove restaurieren                                                                                             liefert die Koordinaten eines neu zu zeichnenden Rechtecks.                                                                     Der Screenmanager stellt eine Liste von Rechtecken zurVerfügung, die nach einer Aktion geändert worden sind.                     Durch diese Liste hangelt sich die Routine hindurch und         erzeugt die Rechtecke per Pixelmove (schnell) neu.