home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Hall of Fame
/
HallofFameCDROM.cdr
/
prpascal
/
windmngr.lzh
/
WINDODEF.PAS
< prev
Wrap
Pascal/Delphi Source File
|
1986-01-13
|
20KB
|
486 lines
{$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.