{$I VAR.INC}
{$I WINDMNGR.INC}
{$C-}
{$I-}

var Screen_real: Array[1..4000] of byte absolute $B800:$0000;
    temp_screen: Array[1..4000] of byte;
    Windows: Array[1..8] of Record
                  UpperLeftX,UpperLeftY,LowerRightX,LowerRightY,
                  ForeGround,BackGround,FrameType,color: Integer;
                  Title: String[80];
             end;
    saved,yestitle,stored:boolean;
    wintitle:string[80];
    title_color:integer;

Procedure Window_Title2(Name: Maxstr; color,i,j:integer);

var m, k, l: integer;

begin
     l:=3;
     color:=color+(j*16);
     temp_screen[(((windows[i].upperlefty)*160)+(windows[i].upperleftx*2))+l]:=$5b;
     for m:=1 to length(Name) do
             begin
                  k:=(((windows[i].upperlefty)*160)+(windows[i].upperleftx*2))+l+1;
                  temp_Screen[k+1]:=ord(copy(Name,m,1));
                  temp_Screen[k+2]:=Color;
                  l:=l+2
             end;
     temp_Screen[k+3]:=$5d
end;

{ Thats all.. }

Procedure Writexy2(long_string:maxstr; xcoord,ycoord,color: integer);

{ This procedure Draws whatever you want, wherever you want, by changing the
  value of Screen in the variable declaration, it can draw a "Picture" any-
  were in memory. This allows for the Speed of the window making process..}

var str_len, real_pos, scr_pos: integer;

begin
{$I-}
     str_len:=length(long_string); { So I know how much to write }
     Scr_pos:=0;

     { The next 8 lines write the string in every "even" location in memory
       and ever odd location gets the attribute with determines how the
       string is displayed on the screen}
     for real_pos:=1 to str_len do
                 if scr_pos < 4001 then
                       begin
                            scr_pos:=((xcoord*2)-1)+(ycoord*160);
                            temp_screen[scr_pos]:=ord(copy(long_string,real_pos,1));
                            temp_screen[scr_pos+1]:=color;
                            xcoord:=xcoord+1;
                       end
{$I+}
end;

Procedure Clrtemp;
var i:integer;
begin
     for i:=1 to 4000 do temp_screen[i]:=$00
end;

Procedure Store_File;
var outfile: text;
    ch: char;
    i,j: integer;
begin
     Assign(outfile,'DEFS.INC');
     rewrite(outfile);
     Writeln(outfile,'Procedure Select_Window(Win_Num: Integer);');
     Write(outfile,'Const Windows: Array[1..9,1..8] of integer =(');
     for i:=1 to 8 do
              writeln(outfile,'(',Windows[i].UpperleftX,',',
                                  Windows[i].Upperlefty,',',
                                  Windows[i].Lowerrightx,',',
                                  Windows[i].Lowerrighty,',',
                                  Windows[i].Foreground,',',
                                  Windows[i].Background,',',
                                  Windows[i].Frametype,',',
                                  Windows[i].Color,
                              '),');
     Writeln(outfile,'(0,0,0,0,0,0,0,0));');
     writeln(outfile,' ');
     Write(outfile,'  Title:Array[1..9] of string[80] = (');
     for i:=1 to 8 do
              if windows[i].title <> '' then writeln(outfile,'''',windows[i].title,'''',',')
              else writeln(outfile,'''''',',');
     Writeln(outfile,''''');');
     writeln(outfile,' ');
     writeln(outfile,'Begin');
     Writeln(outfile,'     If (windows[win_num,3] > 0) and (Win_num > Stack_top) then');
     Writeln(outfile,'        Begin');
     Writeln(outfile,'            Add_Window(Windows[Win_Num,1],');
     Writeln(Outfile,'                       Windows[Win_Num,2],');
     Writeln(Outfile,'                       Windows[Win_Num,3],');
     Writeln(Outfile,'                       Windows[Win_Num,4],');
     Writeln(Outfile,'                       Windows[Win_Num,5],');
     Writeln(Outfile,'                       Windows[Win_Num,6],');
     Writeln(Outfile,'                       Windows[Win_Num,7]);');
     Writeln(Outfile,'     If Title[win_num] <> '''' then');
     Writeln(Outfile,'            Window_Title(Title[Win_num],Windows[Win_Num,8])');
     Writeln(Outfile,'     end');
     Writeln(Outfile,'     else');
     Writeln(Outfile,'         If windows[Win_num,4] > 0 then');
     Writeln(Outfile,'                begin');
     Writeln(Outfile,'                     Imig[Last_window_num].w1:=wherex;');
     Writeln(Outfile,'                     Imig[Last_window_num].w2:=wherey;');
     Writeln(Outfile,'                     Window(1,1,80,25);');
     Writeln(Outfile,'                     GotoXY(1,1);');
     Writeln(Outfile,'                     Window(Imig[Win_num].x1,Imig[Win_num].y1,');
     Writeln(Outfile,'                            Imig[Win_num].x2,Imig[Win_num].y2);');
     Writeln(Outfile,'                     Textcolor(Imig[win_num].c1+(Imig[win_num].b1*16));');
     Writeln(Outfile,'                     GotoXY(1,1);');
     Writeln(Outfile,'                     GotoXY(Imig[win_num].w1,Imig[win_num].w2);');
     Writeln(Outfile,'                     Last_Window_Num:=Win_Num');
     Writeln(Outfile,'                End');
     Writeln(outfile,'End;');
     Close(outfile);
     Saved:=true;
end;



Procedure Frame2(WindowType, UpperLeftX, UpperLeftY, LowerRightX, LowerRightY, color: Integer);

{ This procedure draws the window frame in another part of memory. }
var i: integer;
begin
     WriteXY2(chr(Fc[WindowType,1]),UpperLeftX, UpperLeftY,color);
     for i:=UpperLeftX+1 to LowerRightX-1 do WriteXY2(chr(Fc[WindowType,2]),i,UpperleftY,color);
     WriteXY2(chr(Fc[WindowType,3]),i+1,UpperleftY,color);
     for i:=UpperLeftY+1 to LowerRightY-1 do
         begin
              WriteXY2(chr(Fc[WindowType,4]),UpperLeftX , i,color);
              WriteXY2(chr(Fc[WindowType,4]),LowerRightX, i,color);
         end;
     WriteXY2(chr(Fc[WindowType,5]),UpperLeftX, LowerRightY, color);
    for i:=UpperLeftX+1 to LowerRightX-1 do WriteXY2(chr(Fc[WindowType,6]),i,LowerrightY,color);
     WriteXY2(chr(Fc[WindowType,7]),i+1,LowerRightY,color);
end  { Frame 2};

Procedure GetChar(VAR Ch: Char; VAR Extended: Boolean);
Type
 Registers = Record
              AX,BX,CX,DX,BP,SI,DI,DS,ES,Flags: Integer;
             End;
Var
 Reg: Registers;
 AL:  Integer;
Begin
Ch:=#0; Extended:=False;
If KeyPressed Then
 Begin
 Reg.Ax:=$0800;                { -Set AH as $8 for Dos Function call      }
 Intr($21,Reg);                { -Calls Interupt $21 for Dos Fucntion call}
 AL:=(Reg.AX AND $00FF);       { -Derive AL from AX                       }
 Ch:=Chr(AL);                  { -Set Ch to character to AL               }
 If Ch=#0 then
  Begin                       { Routine to get extended character scan code }
  Reg.Ax:=$0800;
  Intr($21,Reg);
  Ch:=Chr((Reg.AX AND $00FF));
  Extended:=True;
  End;
 End;
End;

Procedure Beep;
begin
     Sound(1500);
     delay(10);
     Nosound
end;

Procedure color_Frame(win, Foreground, Background: Integer);
var i,j,k,color: Integer;
begin
     if background < 8 then color:=foreground+(Background*16);
     k:=1;
     for j:=(Windows[win].UpperLefty) to Windows[win].LowerRighty do
         for i:=(Windows[win].Upperleftx) to (Windows[win].Lowerrightx) do
             begin
                  k:=(j*160)+(i*2);
                  temp_screen[k]:=Color;
             end;
     end;

Procedure Edit_window;

var i,j,k,ux,uy,lx,ly,f,c1,b1: Integer;
    Ch: Char;
    Extended,saved: Boolean;
    x11,y11,x22,y22,forg,bak:string[3];

begin
     yestitle:=false;
     Add_Window(0,0,80,25,15,0,5);
     Normvideo;
     Window(1,1,80,25);
     repeat
           gotoxy(1,1);
           Clrscr;
           textcolor(1);
           Write(' Edit Window #(1-8): ');
           textcolor(7);
           read(i);
     until (i<9) and (i>0);
     if windows[i].title <> '' then yestitle:=true;
     if windows[i].frametype=0 then
           begin
                Windows[i].Upperleftx:=5;
                Windows[i].Upperlefty:=5;
                Windows[i].Lowerrightx:=10;
                Windows[i].Lowerrighty:=10;
                Windows[i].Foreground:=15;
                Windows[i].Frametype:=1;
                Windows[i].Background:=7;
                Windows[i].Foreground:=1;
           end;
     repeat
           Clrtemp;
           Str(windows[i].upperleftx,x11);
           Str(windows[i].upperlefty,y11);
           Str(windows[i].lowerrightx,x22);
           str(windows[i].lowerrighty,y22);
           Str(windows[i].foreground,forg);
           Str(windows[i].background,bak);
           if length(x11) < 2 then x11:='0'+x11;
           if length(y11) < 2 then y11:='0'+y11;
           if length(x22) < 2 then x22:='0'+x22;
           if length(y22) < 2 then y22:='0'+y22;
           if (length(forg)<2) then forg:='0'+forg;
           if (length(forg)<3) then forg:='0'+forg;
           Writexy2('  STATUS   X1:'+X11+' Y1:'+Y11+'   X2:'+X22+' Y2:'+Y22+'     FOREGROUND:'+FORG+'  BACKGROUND:'+BAK,0,0,7
                   );
           Writexy2(' 1=Expand-X  2=Expand-Y 3=Frame Type 4=Foreground 5=background 6=Title',1,1,14);
           Writexy2(' 10=Exit to Main Menu, Use cursor keys to move window',1,2,14);
           Frame2(Windows[i].frametype,Windows[i].Upperleftx,
                  Windows[i].Upperlefty,Windows[i].LowerRightx,
                  Windows[i].Lowerrighty,Windows[i].foreground);
           Color_frame(i,Windows[i].foreground,windows[i].background);
           if yestitle then Window_title2(windows[i].title,windows[i].color,i,windows[i].background);
           move(temp_screen,screen_real,4000);
           beep;
           repeat
                 repeat until keypressed;
                 Getchar(ch, extended);
           Until ord(ch) in [59,60,61,62,63,64,72,77,67,80,75,68];
           saved:=false;
           if extended then case ord(ch) of
                          64:begin
                                  yestitle:=true;
                                  gotoxy(1,1);
                                  write('                                                                              ');
                                  textcolor(1);
                                  gotoxy(1,1);
                                  write('Enter Window title: ');
                                  textcolor(7);
                                  readln(wintitle);
                                  gotoxy(1,1);
                                  write('                                                                 ');
                                  gotoxy(1,1);
                                  textcolor(1);
                                  write('Enter color of title: ');
                                  textcolor(7);
                                  readln(title_color);
                                  windows[i].color:=Title_color;
                                  windows[i].title:=wintitle;
                             end;
                          59:windows[i].LowerRightX:=Windows[i].LowerRightX+1;
                          60:Windows[i].LowerRightY:=Windows[i].LowerRightY+1;
                          61:begin
                                  Windows[i].Frametype:=Windows[i].Frametype+1;
                                  if Windows[i].Frametype > 4
                                         then Windows[i].Frametype:=1
                             end;
                          62:begin
                                  clrtemp;
                                  gotoxy(1,1);
                                  write('                                                                              ');
                                  gotoxy(1,1);
                                  textcolor(1);
                                  Write(' Enter new Foreground Color (0-255): ');
                                  textcolor(7);
                                  repeat
                                        readln(Windows[i].Foreground)
                                  until Windows[i].Foreground < 256;
                             end;
                          77:begin
                                if Windows[i].LowerRightX<80 then begin
                                  Windows[i].Upperleftx:=Windows[i].Upperleftx+1;
                                  Windows[i].Lowerrightx:=Windows[i].lowerrightx+1;
                                end
                                else beep
                             end;
                          72:Begin
                                if windows[i].upperlefty>0 then begin
                                  Windows[i].LowerRightY:=Windows[i].Lowerrighty-1;
                                  Windows[i].Upperlefty:=Windows[i].Upperlefty-1;
                                end
                                else beep
                             end;
                          63:begin
                              repeat
                                  move(screen_real,temp_screen,4000);
                                  gotoxy(1,1);
                                  write('                                                                              ');
                                  gotoxy(1,1);
                                  textcolor(1);
                                  Write('Enter New Background Color (0-8): ');
                                  textcolor(7);
                                  readln(Windows[i].background);
                              until windows[i].background < 8;
                              end;
                         80:Begin
                                if windows[i].lowerrighty<24 then begin
                                  Windows[i].LowerRightY:=Windows[i].Lowerrighty+1;
                                  Windows[i].Upperlefty:=Windows[i].Upperlefty+1;
                                end
                                else beep
                             end;
                           75:begin
                                if windows[i].Upperleftx>1 then begin
                                  Windows[i].Upperleftx:=Windows[i].Upperleftx-1;
                                  Windows[i].Lowerrightx:=Windows[i].lowerrightx-1;
                                end
                                else beep
                              end;
                   end;
     until ord(ch)=68;
     stored:=false;
     Remove(1);
end;

Procedure Show_all;
var ii: Integer;
begin
     Add_Window(1,1,80,25,15,0,0);
     NormVideo;
     Window(1,1,80,25);
     repeat
           GotoXY(1,1);
           GotoXY(1,1);
           Textcolor(1);
           Writeln('Display Window');
           Write('Number <0=Main Menu>: ');
           textcolor(7);
           readln(ii);
           if ii<9 then
           if (ii>0) and (windows[ii].Upperleftx > 0) then
               begin
                   with windows[ii] do
                        begin
                             Add_Window(Upperleftx,Upperlefty,LowerRightX,LowerRightY,FOreground,Background,frametype);
                             Window_title(title,color)
                        end
               end
           else
               If ii>0 then
                   begin
                        gotoxy(1,1);
                        Write('                                                                ');
                        gotoxy(1,1);
                        textcolor(1);
                        Write('Window not defined!');
                        delay(3000)
                   end;
           Gotoxy(1,1);
           Write('                                                                ');
    Normvideo;
    window(1,1,80,25);
    Until ii=0;
    Remove(Stack_top-1);
end;



var ch: Char;
    extended: Boolean;
    i: integer;

begin
     Stored:=true;
     Scrn_Off;
     Set_page($01);
     Initialize;
     for i:=1 to 4000 do screen_real[i]:=00;
     ClrScr;
     saved:=true;
     for i:=1 to 8 do
         begin
              windows[i].Upperleftx:=0;
              windows[i].upperlefty:=0;
              windows[i].lowerrightx:=0;
              windows[i].lowerrighty:=0;
              windows[i].foreground:=0;
              windows[i].background:=0;
              windows[i].frametype:=0;
              windows[i].color:=0
         end;
     gotoxy(17,3);
     Textcolor(15);
     Writeln('THE WINDOW MANAGER/EDITOR SYSTEM WINDOW EDITOR');
     gotoxy(17,5);
     Textcolor(7);
     Writeln('              (C) Copyright 1985');
     gotoxy(17,6);
     Writeln('                      by');
     gotoxy(17,7);
     Writeln('                 Jim Everingham');
     Add_window(5,10,75,20,0,0,2);
     gotoxy(10,2);
     Writeln(' Options:');
     writeln('                   <1> Edit/Configure window file');
     writeln('                   <2> Save Definitions to disk file');
     writeln('                   <3> Clear Defined Window');
     writeln('                   <4> Display defined windows simultaneously');
     writeln('                   <5> Exit to sytem');
     Color_Window(0,4);
     Scrn_on;
     Set_page($00);
     For I:=1 to 8 do
               begin
                          windows[i].Upperleftx:=0;
                          windows[i].upperlefty:=0;
                          windows[i].lowerrightx:=0;
                          windows[i].lowerrighty:=0;
                          windows[i].foreground:=0;
                          windows[i].background:=0;
                          windows[i].frametype:=0;
                          Windows[i].Title:='';
                end;
     Window_Title(' Main Menu ',128+(4*16));
     beep;
     repeat
           repeat
                 repeat until keypressed;
                 read(kbd,ch);
                 beep;
           until ch in ['1'..'5'];
           case ch of
                '1': Edit_window;
                '2': Store_file;
                '4': Show_All;
                '5': begin
                          normvideo;
                          Add_Window(1,1,80,25,1,0,5);
                          clrscr;
                          if not stored then
                                 begin
                                      Write('File not saved.  Are you sure you want to abort?');
                                      read(kbd,ch);
                                      if upcase(ch)='Y' then halt
                                      else remove(1);
                                 end
                         else halt
                     end;
                '3': begin
                          Add_window(1,1,80,25,15,0,5);
                          clrscr;
                          textcolor(1);
                          Write('Clear Window number: ');
                          textcolor(7);
                          repeat
                                readln(i);
                          until (i<8) and (i>0);
                          windows[i].Upperleftx:=0;
                          windows[i].upperlefty:=0;
                          windows[i].lowerrightx:=0;
                          windows[i].lowerrighty:=0;
                          windows[i].foreground:=0;
                          windows[i].background:=0;
                          windows[i].frametype:=0;
                          Windows[i].Title:='';
                          Remove(1);
                    end;
           end;
    until true=false;
end.