Localize file www.TrSek.com/pas/tc.pas{ TC.PAS Copyright (c) TrSek alias Zdeno Sekerak }
{ TrSek Commander }
{ Program si kladie za ciel napodobnit Norton Commander. }
{ V tejto verzii obsahuje vypis adresara s moznostou menit velkost }
{ a poziciu okna. }
{ }
{ Datum:28.07.1996 http://www.trsek.com }
{$M 21192,0,65360}
program trsek_commander;
uses t_wind,crt,dos;
const mapa_kl:array[1..50] of char= { mapa ALT klavesnice }
('1','2','3','4','5','6','7','8','9','0','_','+',' ',' ',' ',
'Q','W','E','R','T','Y','U','I','O','P',' ',' ',' ',' ','A',
'S','D','F','G','H','J','K','L',' ',' ',' ',' ',' ','Z','X',
'C','V','B','N','M');
po_full=4; { pocet stlpcov pri full zobrazovani }
{ a tu su napisane }
ro_full:array[1..po_full] of byte=(12,23,32,38);
{ pre texty nad full }
mo_full:array[1..po_full] of byte=(0,13,24,33);
okno_bm=' Name '; { nazov suborov pre brief vypis }
okno_fm:array[1..po_full] of string= { nazov suborov pre full vypis }
(' Name ',' Size ',' Date ','Time ');
type t_DTA=record
disk:Byte;
meno:Array[1..8] of char;
prip:Array[1..3] of char;
Attr:Byte;
cpoladr:Word;
clusadr:Word;
bla:Array[1..4] of char;
atr:byte;
cas:word;
datum:word;
size:LongInt;
meno_kon:Array[1..13] of char;
buffer:word; { co s tym, naco to asi sluzi ??? }
end;
t_okno=record
xh,yh,xd,yd:byte;
c_okna:byte;
aktu:byte;
p_subor,k_subor,l_subor:^t_subor;
pocx,pocy:byte;
poccel:integer; { kolko sa vojde do okna }
pocet:integer; { kolko je suborov v adresari }
sort:byte; { sposob sortovania }
o_full:t_full; { vypisovat full/brief/ramcek }
attr:word;
pole_okna:pointer; { smernik na podklad }
subor:pointer; { pointer pre subory (na prvy) }
cesta:string; { okno ma cestu (dir) }
end;
var d_attr:word; { nastavuje default hodnoty }
okno:t_okno;
i:integer; { bez komentara }
mouse:boolean;
x,y:byte;
uziv_obr:array[1..80,1..25] of byte; { kde ake okno atd ... }
{$I mouse.pas }
{$I main.pas }
procedure rezidenty; { stara sa o programy, ktore maju }
begin { bezat akoze rezidentne }
timexy(72,0);
end;
{ proste caka pokial nepusti tlacitko na mysi }
procedure no_mouse;
var x,y,but:byte;
begin
repeat
get_mouse(x,y,but);
until (but=0);
end;
{ odpalil som enterom exe, com, bat zatial nefunguje tak neviem co dalej }
procedure run_exe(run:string);
begin
SwapVectors;
Exec(GetEnv('COMSPEC'), '/C '+run);
SwapVectors;
end;
{ stlacil enter(double-klick mouse) na subor alebo adresar }
procedure press_enter(var kurx,kury:byte;p_okno:pointer);
var okno:^t_okno;
old_ces:string;
exten:string[3];
begin
okno:=p_okno;
if (okno^.k_subor^.atr and $10)=$10 then begin
uvolni_f(okno^.subor);
old_ces:=okno^.cesta;
if (okno^.k_subor^.meno_kon[10]<>' ') then okno^.k_subor^.meno_kon[9]:='.';
okno^.cesta:=no_space(okno^.cesta+'\'+okno^.k_subor^.meno_kon);
okno^.subor:=napln_f('*.*',AnyFile-VolumeID,okno^.pocet);
sortuj(okno^.sort);
okno^.p_subor:=okno^.subor;
kury:=1;kurx:=0;
text_okno(okno^.o_full);
vypis_o(okno^.p_subor,zarovnaj(copy(old_ces,ord(okno^.cesta[0])+2,80),12),kurx,kury);
end
else begin
exten:=copy(okno^.k_subor^.meno_kon,10,3);
if (exten='exe') or (exten='com') or (exten='bat') then begin
vepo_podkl(okno^.xh,okno^.xd,okno^.yh,okno^.yd,okno^.pole_okna,false);
uvolni_mpole(okno^.pole_okna);
uvolni_f(okno^.subor);
old_ces:=okno^.k_subor^.meno_kon;
okno^.k_subor^.meno_kon[9]:='.';
run_exe(no_space(okno^.k_subor^.meno_kon));
kury:=1;kurx:=0;but:=0;ch:=#0;alti:=0;
old_file:=nothing(13);
show_mouse(true);
repeat
if (k_vypis<>okno.k_subor) then begin
writexy_s(okno.xh,kurx,okno.yh+kury,14,okno.o_full,okno.k_subor);
twritexy(okno.xh,okno.yd-2,14,zarovnaj(disp(okno.k_subor,' '),okno.xd-okno.xh-1)+nothing(78));
k_vypis:=okno.k_subor;
end;
if keypressed then begin
ch:=readkey;
writexy_s(okno.xh,kurx,okno.yh+kury,d_attr,okno.o_full,okno.k_subor);
k_vypis:=NIL;
if ch=#13 then press_enter(kurx,kury,@okno);
if (ch in [#48,#49,#50,#51,#52,#53,#54,#55,#56]) then begin
old_file:=okno.k_subor^.meno_kon;
okno.sort:=ord(ch)-48;
sortuj(okno.sort);
okno.p_subor:=okno.subor;
vypis_o(okno.p_subor,old_file,kurx,kury);
end;
if (ch='-') then begin
okno.o_full:=brief;
text_okno(okno.o_full);
vypis_o(okno.p_subor,old_file,kurx,kury);
end;
if (ch='=') then begin
okno.o_full:=full;
text_okno(okno.o_full);
vypis_o(okno.p_subor,old_file,kurx,kury);
end;
if alt_akt then begin
ch:=readkey;
if (ch in [#16..#50,#120..#131]) then begin
inc(alti);
if (ch>#119) then old_file[alti]:=mapa_kl[ord(ch)-119]
else old_file[alti]:=mapa_kl[ord(ch)];
pom:=okno.k_subor;
po_subor:=pom;i:=0;
while ( (po_subor^.zani<>po_subor) and
(UUpCase(copy(po_subor^.meno_kon,1,alti))<>copy(old_file,1,alti) )) do begin
inc(i);
po_subor:=po_subor^.zani;
end;
if (UUpCase(copy(po_subor^.meno_kon,1,alti))=copy(old_file,1,alti) ) then begin
for i:=i downto 1 do si_dole(kurx,kury);
writexy(0,23,d_attr,copy(old_file,1,alti)+nothing(13-alti));
end
else dec(alti);
end;
end
else begin
alti:=0;
writexy(0,23,d_attr,nothing(13));
end;
if ch=#0 then begin
ch:=readkey;
case ch of
#72: si_hore(kurx,kury); { sipka hore }
#80: si_dole(kurx,kury); { sipka dole }
#81: for i:=1 to okno.poccel do { Pg Dn }
si_dole(kurx,kury);
#73: for i:=1 to okno.poccel do { Pg Up }
si_hore(kurx,kury);
#77: for i:=1 to okno.pocy do { sipka vpravo }
si_dole(kurx,kury);
#75: for i:=1 to okno.pocy do { sipka vlavo }
si_hore(kurx,kury);
end;
end;
if (p_vypis<>okno.p_subor) then vypis_o(okno.p_subor,okno.k_subor^.meno_kon,kurx,kury);
p_vypis:=okno.p_subor;
end
else begin
if mouse then begin
get_mouse(x,y,but);
if (but=1) and (uziv_obr[x,y]<>0) then begin
show_mouse(false);
if ((uziv_obr[x,y] shr 4)< 8) then begin
men_okno(uziv_obr[x,y] shr 4);
vypis_o(okno.p_subor,okno.k_subor^.meno_kon,kurx,kury);
k_vypis:=NIL;
show_mouse(true);
end { k if (uziv_obr .. }
else begin
writexy_s(okno.xh,kurx,okno.yh+kury,d_attr,okno.o_full,okno.k_subor);
if ( (uziv_obr[x,y] shr 4)=8 ) then
si_hore(kurx,kury); { sipka hore }
if ( (uziv_obr[x,y] shr 4)=10 ) then
si_dole(kurx,kury); { sipka dole }
{ zisti na aky subor cvakol }
if ( (uziv_obr[x,y] shr 4)=9 ) then begin
okno.k_subor:=okno.p_subor;
i:=1;kury:=1;kurx:=0;
if (okno.o_full=full) then x:=trunc((x-okno.xh-1)/38)
else x:=trunc((x-okno.xh-1)/13);
y:=y-okno.yh-1;
while not(((kurx=x) and (kury=y)) or (okno.k_subor^.zani=okno.k_subor) ) do
begin
inc(i);inc(kury);
if (kury>okno.pocy) then begin
kury:=1;inc(kurx);
end;
okno.k_subor:=okno.k_subor^.zani;
end;
no_mouse;
delay(100);
get_mouse(x,y,but);
if (but=1) then
press_enter(kurx,kury,@okno);
end; { k if (uziv_obr[x,y] shr 4)=9 .. }
no_mouse;
if (p_vypis<>okno.p_subor) then vypis_o(okno.p_subor,okno.k_subor^.meno_kon,kurx,kury);
p_vypis:=okno.p_subor;
end; { k else }
show_mouse(true);
end; { if (but=1) ... }
end; { if mouse }
rezidenty; { rezidentne programi, ako hodinky atd.. }
end; { k hlavnemu else }
until ((ch=#27) or (but=2));
end;
begin
textcolor(yellow);textbackground(blue);
clrscr;
d_attr:=7712;
for x:=1 to 80 do { znuluj uziv obrazovku }
for y:=1 to 25 do uziv_obr[x,y]:=0;
okno.pole_okna:=init_okna; { inicializuje miesto pre okna }
okno.cesta:='';
okno.c_okna:=1;okno.subor:=NIL;okno.sort:=1;
okno.subor:=napln_f('*.*',AnyFile-VolumeID,okno.pocet);
sortuj(okno.sort);
okno.xh:=8;okno.yh:=3;
okno.xd:=69;okno.yd:=19;
okno.c_okna:=1;okno.attr:=d_attr;okno.o_full:=full;
okno.p_subor:=okno.subor;
okno.k_subor:=okno.subor;
gotoxy(1,24);
urobpole(okno.xh,okno.xd,okno.yh,okno.yd,okno.pole_okna);
{ vezme im podklad }
vepo_podkl(okno.xh,okno.xd,okno.yh,okno.yd,okno.pole_okna,true);
text_okno(okno.o_full);
mouse:=mouse_ok;
vypis_o(okno.p_subor,okno.k_subor^.meno_kon,x,x);
v_okno(okno.subor);
vepo_podkl(okno.xh,okno.xd,okno.yh,okno.yd,okno.pole_okna,false);
uvolni_mpole(okno.pole_okna);
show_mouse(true);
uvolni_f(okno.subor);
uvolni_inokna(okno.pole_okna);
end.