home *** CD-ROM | disk | FTP | other *** search
/ Power-Programmierung / CD1.mdf / pascal / library / dos / bix / window.sys < prev    next >
Text File  |  1986-08-04  |  17KB  |  528 lines

  1. (********************************************************************)
  2. (*                                                                  *)
  3. (*           WINDOW.SYS  WINDOW MANIPULATION ROUTINES               *)
  4. (*                                                                  *)
  5. (*      Allows for the manipulation of windows.  A window is        *)
  6. (*      defined as a portion of a display screen.                   *)
  7. (*                                                                  *)
  8. (*                                                                  *)
  9. (*                                                                  *)
  10. (*                                                                  *)
  11. (*                                                                  *)
  12. (*      written by:      John Leonard    1/9/86                     *)
  13. (*                                                                  *)
  14. (*        NOT FOR SALE WITHOUT WRITTEN PERMISSION                   *)
  15. (********************************************************************)
  16.  
  17.  
  18. procedure DisplayLine( page,y,x,attribute,len,begchar,midchar,endchar:Integer;
  19.                 vertical : boolean );
  20.    var i,j:integer;
  21.    begin
  22.       setcursorposition(page,y,x);
  23.       writecharacterandattribute(begchar,page,attribute,1);
  24.       if vertical then begin
  25.          for i := y+1 to (y+len-2) do begin
  26.             setcursorposition(page,i,x);
  27.             writecharacterandattribute(midchar,page,attribute,1);
  28.          end;
  29.          setcursorposition(page,y+len-1,x);
  30.          writecharacterandattribute(endchar,page,attribute,1);
  31.          end
  32.       else begin
  33.          setcursorposition(page,y,x+1);
  34.          writecharacterandattribute(midchar,page,attribute,len-2);
  35.          setcursorposition(page,y,x+len-1);
  36.          writecharacterandattribute(endchar,page,attribute,1);
  37.       end;
  38.    end;
  39.  
  40.  
  41. procedure VertLine ( x,y,len,left,mid,right : integer);
  42.    const vert:boolean=true;
  43.    begin
  44.       with currentscreendata do
  45.          DisplayLine(page,y-1,x-1,attribute,len,left,mid,right,vert);
  46.    end;
  47.  
  48.  
  49. procedure HorLine ( x,y,len,left,mid,right : integer);
  50.    const vert:boolean=false;
  51.    begin
  52.       with currentscreendata do
  53.          DisplayLine(page,y-1,x-1,attribute,len,left,mid,right,vert);
  54.    end;
  55.  
  56.  
  57. procedure clreol;
  58.    const vert:boolean=false;
  59.    var oldx,oldy:integer;
  60.    begin
  61.       oldx := wherex;oldy:=wherey;
  62.       with currentscreendata do with windowloc[page] do
  63.       DisplayLine(page,wherey-1,wherex-1,attribute,x2-wherex-1,
  64.          filler,filler,filler,vert);
  65.       gotoxy(oldx,oldy);
  66.    end;
  67.  
  68.  
  69. procedure Frame(UpperLeftX, UpperLeftY, LowerRightX, LowerRightY: Integer;
  70.                 tl,tr,bl,br : integer;
  71.                 ls,ts,rs,bs : integer );
  72.    var  I : Integer;
  73.    begin {Frame}
  74.      GotoXYAbs(UpperLeftX+1, UpperLeftY+1);
  75.      WriteAbs(chr(tl));
  76.      for I := (UpperLeftX + 2) to (LowerRightX ) do
  77.      begin
  78.        WriteAbs(chr(ts));
  79.      end;
  80.      WriteAbs(chr(tr));
  81.      for I := (UpperLeftY + 2) to (LowerRightY ) do
  82.      begin
  83.         GotoXYAbs(UpperLeftX +1, I);  WriteAbs(chr(ls));
  84.         GotoXYAbs(LowerRightX+1, I);  WriteAbs(chr(rs));
  85.      end;
  86.      GotoXYAbs(UpperLeftX+1, LowerRightY+1);
  87.      WriteAbs(chr(bl));
  88.      for I := (UpperLeftX + 2) to (LowerRightX ) do WriteAbs(chr(bs));
  89.      WriteAbs(chr(br));
  90.    end; {Frame}
  91.  
  92.  
  93. procedure WindowFrame ( tl,tr,bl,br : integer;
  94.                             ls,ts,rs,bs : integer);
  95.    var i,j:integer;
  96.    begin { MonoFrame }
  97.       with CurrentScreenData do with windowloc[page] do begin
  98.            x1 := x1 - 1;y1 := y1 - 1; x2 := x2 + 1; y2 := y2 + 1;
  99.            framed := true;
  100.            frame( x1,y1,x2,y2,tl,tr,bl,br,ls,ts,rs,bs);
  101.            x1 := x1 + 1;y1 := y1 + 1; x2 := x2 - 1; y2 := y2 - 1;
  102.         end;
  103.    end;
  104.  
  105.  
  106. procedure MonoFrame1;
  107.    begin
  108.       WindowFrame(218,191,192,217,179,196,179,196);
  109.    end;
  110.  
  111.  
  112. procedure MonoFrame2;
  113.    begin
  114.       WindowFrame(201,187,200,188,186,205,186,205);
  115.    end;
  116.  
  117.  
  118. procedure moveleft( FromPage, TuPage, Distance, Fillpage : integer);
  119.    var
  120.       i,width,FillWidth : integer;
  121.       OldOffset,NewOffset,j,
  122.       FromSegment,TuSegment,FillSegment,
  123.       OldFillOffset,NewFillOffset : integer;
  124.       row,column,s1,s2:integer;
  125.    begin
  126.       if (frompage <> tupage) and (fillpage in [0..MaxDisplayStack]) then
  127.             copydisplay(fillpage,tupage);
  128.       with CurrentScreenData do begin
  129.          with windowloc[FromPage] do begin
  130.             if framed then begin
  131.                x1:=x1-1;y1:=y1-1;x2:=x2+1;y2:=y2+1;
  132.             end;
  133.             width := x2 - x1 + 1;
  134.             fromsegment := seg(displaystack[frompage]^);
  135.             tusegment   := seg(displaystack[tupage]^);
  136.             fillsegment := seg(displaystack[fillpage]^);
  137.             for i := y1 to y2 do begin
  138.                OldOffset     := woffset(  i, x1);
  139.                NewOffset     := woffset(  i, x1-distance);
  140.                move( mem[fromsegment:oldoffset],
  141.                      mem[tusegment:newoffset], 2*width);
  142.                if frompage = tupage then begin
  143.                   OldFillOffset := woffset( i, x2-distance+1);
  144.                   NewFillOffset := woffset( i, x2-distance+1);
  145.                   move( mem[fillsegment:OldFillOffset],
  146.                         mem[tusegment:NewfillOffset],
  147.                         2*distance);
  148.                end;
  149.             end;
  150.          end;
  151.          with windowloc[frompage] do
  152.             if framed then begin
  153.             x1:=x1+1;y1:=y1+1;x2:=x2-1;y2:=y2-1;
  154.          end;
  155.          move( windowloc[frompage],
  156.                windowloc[tupage],
  157.                sizeof(windowloc[frompage]) );
  158.          with windowloc[TuPage] do begin
  159.             x1 := x1 - distance; x2 := x2 - distance;
  160.          end;
  161.          readcursorposition(tupage,row,column,s1,s2);
  162.          setcursorposition(tupage,row,column-distance);
  163.       end;
  164.    end;
  165.  
  166.  
  167. procedure moveright( FromPage, TuPage, Distance, FillPage : integer );
  168.    var
  169.       i,width,FillWidth : integer;
  170.       OldOffset,NewOffset,j,
  171.       FromSegment,TuSegment,FillSegment,
  172.       OldFillOffset,NewFillOffset : integer;
  173.       row,column,s1,s2:integer;
  174.    begin
  175.       if (frompage <> tupage) and (fillpage in [0..MaxDisplayStack]) then
  176.            copydisplay(fillpage,tupage);
  177.       with CurrentScreenData do begin
  178.          with windowloc[FromPage] do begin
  179.             if framed then begin
  180.                x1:=x1-1;y1:=y1-1;x2:=x2+1;y2:=y2+1;
  181.             end;
  182.             width := x2 - x1 + 1;
  183.             fromsegment := seg(displaystack[frompage]^);
  184.             tusegment   := seg(displaystack[tupage]^);
  185.             fillsegment := seg(displaystack[fillpage]^);
  186.             for i := y1 to y2 do begin
  187.                OldOffset     := woffset(  i, x1);
  188.                NewOffset     := woffset(  i, x1+distance);
  189.                move( mem[fromsegment:oldoffset],
  190.                      mem[tusegment:newoffset], 2*width);
  191.                if frompage = tupage then begin
  192.                   OldFillOffset := woffset( i, x1);
  193.                   NewFillOffset := woffset( i, x1);
  194.                   move( mem[fillsegment:OldFillOffset],
  195.                         mem[tusegment:NewfillOffset],
  196.                         2*distance);
  197.                end;
  198.             end;
  199.          end;
  200.          with windowloc[frompage] do
  201.             if framed then begin
  202.             x1:=x1+1;y1:=y1+1;x2:=x2-1;y2:=y2-1;
  203.          end;
  204.          move( windowloc[frompage],
  205.                windowloc[tupage],
  206.                sizeof(windowloc[frompage]) );
  207.          with windowloc[TuPage] do begin
  208.             x1 := x1 + distance; x2 := x2 + distance;
  209.          end;
  210.          readcursorposition(tupage,row,column,s1,s2);
  211.          setcursorposition(tupage,row,column+distance);
  212.       end;
  213.    end;
  214.  
  215.  
  216. procedure moveup( FromPage, TuPage, Distance, FillPage : integer );
  217.    var
  218.       i,width,FillWidth : integer;
  219.       OldOffset,NewOffset,j,
  220.       FromSegment,TuSegment,FillSegment,
  221.       OldFillOffset,NewFillOffset : integer;
  222.       row,column,s1,s2:integer;
  223.    begin
  224.       if (frompage <> tupage) and (fillpage in [0..MaxDisplayStack]) then
  225.            copydisplay(fillpage,tupage);
  226.       with CurrentScreenData do begin
  227.          with windowloc[FromPage] do begin
  228.             if framed then begin
  229.                x1:=x1-1;y1:=y1-1;x2:=x2+1;y2:=y2+1;
  230.             end;
  231.             width := x2 - x1 + 1;
  232.             fromsegment := seg(displaystack[frompage]^);
  233.             tusegment   := seg(displaystack[tupage]^);
  234.             fillsegment := seg(displaystack[fillpage]^);
  235.             for i  := y1 to y2 do begin
  236.                OldOffset     := woffset( i, x1);
  237.                NewOffset     := woffset( i-distance, x1);
  238.                move( mem[fromsegment:oldoffset],
  239.                      mem[tusegment:newoffset], 2*width);
  240.             end;
  241.             if frompage = tupage then begin
  242.                for i := (y2 - distance) to y2 do begin
  243.                   OldFillOffset := woffset(i+1, x1);
  244.                   NewFillOffset := woffset(i+1, x1);
  245.                   move( mem[fillsegment:OldFillOffset],
  246.                         mem[tusegment:NewfillOffset],
  247.                         2*width);
  248.                end;
  249.             end;
  250.          end;
  251.          with windowloc[frompage] do
  252.             if framed then begin
  253.             x1:=x1+1;y1:=y1+1;x2:=x2-1;y2:=y2-1;
  254.          end;
  255.          move( windowloc[frompage],
  256.                windowloc[tupage],
  257.                sizeof(windowloc[frompage]) );
  258.          with windowloc[TuPage] do begin
  259.               y2 := y2 - distance; y1 := y1 - distance;
  260.          end;
  261.          readcursorposition(tupage,row,column,s1,s2);
  262.          setcursorposition(tupage,row-distance,column);
  263.       end;
  264.    end;
  265.  
  266.  
  267. procedure movedown( FromPage, TuPage, Distance, FillPage : integer );
  268.    var
  269.       i,width,FillWidth : integer;
  270.       OldOffset,NewOffset,j,
  271.       fromsegment,tusegment,fillsegment,
  272.       OldFillOffset,NewFillOffset : integer;
  273.       row,column,s1,s2:integer;
  274.    begin
  275.       if (frompage <> tupage) and (fillpage in [0..MaxDisplayStack]) then
  276.            copydisplay(fillpage,tupage);
  277.       with CurrentScreenData do begin
  278.          with windowloc[FromPage] do begin
  279.             if framed then begin
  280.                x1:=x1-1;y1:=y1-1;x2:=x2+1;y2:=y2+1;
  281.             end;
  282.             width := x2 - x1 + 1;
  283.             fromsegment := seg(displaystack[frompage]^);
  284.             tusegment   := seg(displaystack[tupage]^);
  285.             fillsegment := seg(displaystack[fillpage]^);
  286.             for i  := y2 downto y1 do begin
  287.                OldOffset     := woffset( i, x1);
  288.                NewOffset     := woffset( i+distance, x1);
  289.                move( mem[fromsegment:oldoffset],
  290.                      mem[tusegment:newoffset], 2*width);
  291.             end;
  292.             if frompage = tupage then begin
  293.                for i := (y1-distance-1) to y1-1 do begin
  294.                   OldFillOffset := woffset( i+1, x1);
  295.                   NewFillOffset := woffset( i+1, x1);
  296.                   move( mem[fillsegment:OldFillOffset],
  297.                         mem[tusegment:NewfillOffset],
  298.                         2*width);
  299.                end;
  300.             end;
  301.          end;
  302.          with windowloc[frompage] do
  303.             if framed then begin
  304.             x1:=x1+1;y1:=y1+1;x2:=x2-1;y2:=y2-1;
  305.          end;
  306.          move( windowloc[frompage],
  307.                windowloc[tupage],
  308.                sizeof(windowloc[frompage]) );
  309.          with windowloc[TuPage] do begin
  310.               y2 := y2 + distance; y1 := y1 + distance;
  311.          end;
  312.          readcursorposition(tupage,row,column,s1,s2);
  313.          setcursorposition(tupage,row+distance,column);
  314.       end;
  315.    end;
  316.  
  317.  
  318.  
  319. function ConstStr(c,n:integer) : Window_Medium_String;
  320.    var s: Window_Medium_String;
  321.    begin
  322.       if n<0 then n := 0;
  323.       s[0] := chr(n);
  324.       fillchar(s[1],n,c);
  325.       conststr := s;
  326.    end;
  327.  
  328.  
  329. procedure centertext ( row: integer; text: Window_Big_String );
  330.    var width,i:integer;
  331.    begin
  332.       with CurrentScreenData do with windowloc[page] do begin
  333.          width := x2 - x1;
  334.          i := (width-length(text)) div 2 ;
  335.          gotoxy(i+1,row);write(text);
  336.       end;
  337.    end;
  338.  
  339.  
  340. procedure Header ( text : Window_Big_String );
  341.    begin
  342.       with currentscreendata do with windowloc[page] do begin
  343.          hlen:=length(text);
  344.          if not framed then centertext(1,text) else begin
  345.             x1:=x1-1;y1:=y1-1;x2:=x2+1;y2:=y2+1;
  346.             centertext(1,text);
  347.             x1:=x1+1;y1:=y1+1;x2:=x2-1;y2:=y2-1;
  348.          end;
  349.       end;
  350.    end;
  351.  
  352.  
  353. procedure Footer ( text : Window_Big_String);
  354.    begin
  355.       with currentscreendata do with windowloc[page] do begin
  356.          flen:=length(text);
  357.          if not framed then centertext (y2+1,text) else begin
  358.             x1:=x1-1;y1:=y1-1;x2:=x2+1;y2:=y2+1;
  359.             centertext(y2+1-y1,text);
  360.             x1:=x1+1;y1:=y1+1;x2:=x2-1;y2:=y2-1;
  361.          end;
  362.       end;
  363.    end;
  364.  
  365.  
  366. procedure ClearHeader ( i : integer );
  367.    var text:window_big_string;
  368.    begin
  369.       with currentscreendata do with windowloc[page] do begin
  370.          text := conststr(i,hlen);
  371.          if not framed then centertext(1,text) else begin
  372.             x1:=x1-1;y1:=y1-1;x2:=x2+1;y2:=y2+1;
  373.             centertext(1,text);
  374.             x1:=x1+1;y1:=y1+1;x2:=x2-1;y2:=y2-1;
  375.          end;
  376.       end;
  377.    end;
  378.  
  379.  
  380. procedure ClearFooter(i:integer);
  381.    var text:window_big_string;
  382.    begin
  383.       with currentscreendata do with windowloc[page] do begin
  384.          text:=conststr(i,flen);
  385.          if not framed then centertext (y2+1,text) else begin
  386.             x1:=x1-1;y1:=y1-1;x2:=x2+1;y2:=y2+1;
  387.             centertext(y2+1-y1,text);
  388.             x1:=x1+1;y1:=y1+1;x2:=x2-1;y2:=y2-1;
  389.          end;
  390.       end;
  391.    end;
  392.  
  393.  
  394. procedure plop ( from,tu : integer );
  395.    begin
  396.       moveright(from,tu,0,-1);
  397.       pagecursorhome(tu);
  398.    end;
  399.  
  400.  
  401. procedure noise( freq, time: integer);
  402.    begin
  403.       sound(freq);delay(time);nosound;
  404.    end;
  405.  
  406.  
  407. procedure beep;
  408.    begin
  409.       noise( 1000, 200);
  410.    end;
  411.  
  412.  
  413. procedure newline;
  414.    begin
  415.       write(#13#10);
  416.    end;
  417.  
  418.  
  419. function readkey( var Special : Boolean ) : char;
  420.    var ch : char;
  421.       quit:boolean;
  422.    begin
  423.       Special := false;
  424.       quit := false;
  425.       repeat
  426.          if keypressed then begin
  427.             quit := true;
  428.             read(kbd,ch);
  429.             if ( ch = #27) and keypressed then begin
  430.                read(kbd,ch);
  431.                Special := true;
  432.             end;
  433.          end;
  434.       until quit;
  435.       readkey := ch;
  436.    end;
  437.  
  438.  
  439. procedure Strip(var Line : Window_Big_String;
  440.                 var Len  : Integer;
  441.                    Break : Window_Char_Set);
  442.    var  Indx: Integer;
  443.    begin
  444.       Len := Length(Line);
  445.       if Len > 0 then begin
  446.         Indx := 0;
  447.         while (Line[Indx+1] in Break) and (Indx < Len) do
  448.           Indx := Indx + 1;
  449.         Delete(Line,1,Indx);
  450.         Len := Len - Indx;
  451.       end
  452.    end;
  453.  
  454.  
  455. function parse(var Line: Window_Big_String;
  456.                         Break : Window_Char_Set;
  457.                var nl : boolean  ) : Window_Little_String;
  458.    var
  459.       Len,Indx           : Integer;
  460.    begin
  461.        parse := '';
  462.        Strip(Line,Len,Break);
  463.        if Len = 0
  464.           then Exit;
  465.        Indx := 0;
  466.        while not (Line[Indx+1] in Break) and (Indx < Len) do
  467.           Indx := Indx + 1;
  468.        nl := (Line[Indx+1] = '&');
  469.        parse := Copy(Line,1,Indx);
  470.        Delete(Line,1,Indx);
  471.        Strip(Line,Len,Break)
  472.    end;
  473.  
  474.  
  475. procedure PlaceText( text : Window_Big_String );
  476.    var Breakset : Window_Char_Set;
  477.        word     : Window_Little_String;
  478.        leftover,row,column,s1,s2 : integer;
  479.        nl       : boolean;
  480.    begin
  481.       breakset := [' ','&'];
  482.       with currentscreendata do with windowloc[page] do begin
  483.          write(' ');
  484.          repeat
  485.             word := parse(text,breakset,nl);
  486.             readcursorposition(page,row,column,s1,s2);
  487.             leftover := x2 - column;
  488.             if length(word) < leftover then begin
  489.                 write(word);
  490.                 write(' ');
  491.                 end
  492.             else begin
  493.                 newline;write(' ');
  494.                 write(word);write(' ');
  495.             end;
  496.             if nl then begin
  497.                 newline;write(' ');
  498.             end;
  499.          until text = '';
  500.  
  501.       end;
  502.    end;
  503.  
  504.  
  505. function gettext( filename: Window_Little_String;
  506.                       line:integer):Window_Big_String;
  507.     var textfile : text;
  508.         i:integer;
  509.         textstring : Window_Big_String;
  510.     begin
  511.        assign(textfile,filename);
  512.        {$I-} reset(textfile) {$I+};
  513.        if IOResult <> 0 then begin
  514.           windowexit;
  515.           selectpage(0);gotoxy(1,23);
  516.           writeln;
  517.           writeln('Text file ',filename,' not found.  ABORTING.');
  518.           halt;
  519.        end;
  520.        i := 0;
  521.        while i<line do begin
  522.           i := i + 1;
  523.           readln(textfile,textstring);
  524.        end;
  525.        close(textfile);
  526.        gettext := textstring;
  527.     end;
  528.