Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
58
Добавлен:
10.05.2014
Размер:
7.9 Кб
Скачать
{$M 64000,0,600000}

(*
(c) 2005 Dima Zolotukhin aka 'Zlogic' <zlogic@gmail.com>
Redistributable under GNU GPL license
*)
program mega_tree;
uses dos,graph,crt;

const
MAX_PATH = 79;
LEVEL_SEPARATOR = ' ';
TEXTHEIGHT = 10;
LEVEL_WIDTH = 40;
ICON_WIDTH = 15;
SCROLL_X = 100;
SCROLL_Y = 20*TEXTHEIGHT;

type
str_path = string[MAX_PATH];
str_message = string[70];

tdata = str_path;
pnode = ^node;
node = record
data:tdata;
next,children:pnode;
end;

function get_string(m:str_message;def_str:str_path):str_path;
var
temp_str:str_path;
begin
write(m,'> ');
readln(temp_str);
if(length(temp_str)=0)then
temp_str:=def_str;
get_string:=temp_str;
end;

function fill_tree(path:str_path):pnode;
var
new_node,children_node,next_node,children_start,next_start:pnode;
current_file:searchrec;
begin
children_node:=NIL;
next_node:=NIL;
children_start:=NIL;
next_start:=NIL;
findfirst(path+'*.*',ANYFILE,current_file);{ЁйҐ¬ ЇҐаўл© нЄ§Ґ¬Ї«па д ©« }
while(doserror=0)do{Ї®Є  д ©« ¬®¦­® ­ ©вЁ}
begin
if(current_file.name<>'..')then{Ґб«Ё нв® ­Ґ . Ё«Ё ..}
begin
new(new_node);{ᮧ¤ Ґ¬ н«Ґ¬Ґ­в}
new_node^.data:=current_file.name;
if(current_file.name<>'.') and ((current_file.attr and DIRECTORY)>0) then{Ґб«Ё нв® ¤ЁаҐЄв®аЁп}
new_node^.children:=fill_tree(path+current_file.name+'\')
else
new_node^.children:=NIL;
if(new_node^.children=NIL)then{д®а¬Ёа㥬 ¤ҐаҐў® д ©«®ў}
begin
if(children_node<>NIL)then{Ґб«Ё ¬л в®«мЄ® ­ з «Ё ᮧ¤ ў вм ¤ҐаҐў®}
begin
children_node^.next:=new_node;{«Ё­ЄгҐ¬}
children_node:=new_node;{ЇҐаҐе®¤Ё¬ Є ­®ў®¬г н«Ґ¬Ґ­вг}
end
else{Ё­ зҐ}
begin
children_start:=new_node;
children_node:=new_node;{б®е࠭塞 ббл«Єг ­  ЇҐаўл© н«Ґ¬Ґ­в}
end;
end
else{д®а¬Ёа㥬 ¤ҐаҐў® ¤ЁаҐЄв®аЁ©}
begin
if(next_node<>NIL)then{Ґб«Ё ¬л в®«мЄ® ­ з «Ё ᮧ¤ ў вм ¤ҐаҐў®}
begin
next_node^.next:=new_node;{«Ё­ЄгҐ¬}
next_node:=new_node;{ЇҐаҐе®¤Ё¬ Є ­®ў®¬г н«Ґ¬Ґ­вг}
end
else{Ё­ зҐ}
begin
next_node:=new_node;{б®е࠭塞 ббл«Єг ­  ЇҐаўл© н«Ґ¬Ґ­в}
next_start:=new_node;
end;
end;
end;
findnext(current_file);{ЁйҐ¬ б«Ґ¤гойЁ© д ©«}
end;
children_node^.next:=NIL;
if(next_start<>NIL)then
next_node^.next:=children_start
else
next_start:=children_start;
fill_tree:=next_start;
end;
function fill_spaces(count:byte):tdata;
var
i:byte;
spaces:tdata;
begin
spaces:='';
for i:=1 to count do
spaces:=spaces+LEVEL_SEPARATOR;
fill_spaces:=spaces;
end;

function count_nodes(root:pnode):longint;
var
found:pnode;
begin
if(root<>NIL)then
count_nodes:=count_nodes(root^.children)+count_nodes(root^.next)+1
else
count_nodes:=0;
end;

function find_prelast(root:pnode):pnode;
var
prev,prev_prev:pnode;
begin
prev_prev:=NIL;
prev:=NIL;
while(root<>NIL)do
begin
prev_prev:=prev;
prev:=root;
root:=root^.next;
end;
find_prelast:=prev_prev;
end;

function find_last(root:pnode):pnode;
var
prev:pnode;
begin
prev:=NIL;
while(root<>NIL)do
begin
prev:=root;
root:=root^.next;
end;
find_last:=prev;
end;

procedure render_node(root:pnode;topmargin,dx,dy:longint;level:byte);
var
twidth:longint;
datawidth:longint;
delta_h:longint;
theight:longint;
begin
twidth:=LEVEL_WIDTH*level;
theight:=TEXTHEIGHT;
datawidth:=twidth+ICON_WIDTH;
if(root<>NIL)and(topmargin+textheight+dy<getmaxy)then{Ґб«Ё ­®¤  бгйҐвўгҐв}
begin
if(root^.data<>'.')then
begin
outtextxy(twidth+ICON_WIDTH+2+dx,topmargin+dy,root^.data);{ўлў®¤Ё¬ ҐҐ §­ зҐ­ЁҐ}
if(count_nodes(root^.children)>1)then{Ґб«Ё ¤ЁаҐЄв®аЁп}
begin
line(twidth+LEVEL_WIDTH+dx,topmargin+theight+dy,twidth+LEVEL_WIDTH+dx,topmargin+2*theight+dy);{ўлў®¤Ё¬
§ Ј®Јг«Ё­г(вЁЇ  ЇҐаҐе®¤ ­  б«Ґ¤гойЁ© га®ўҐ­м}
line(twidth+dx,topmargin+round(theight*0.4)+dy,twidth+ICON_WIDTH+dx,topmargin+round(theight*0.4)+dy);
topmargin:=topmargin+TEXTHEIGHT;
end
else
begin
if(root^.next<>NIL)and not((root^.next^.next=NIL)and(root^.next^.data='.'))then
line(twidth+dx,topmargin+dy,twidth+dx,topmargin+theight+dy){ўлў®¤Ё¬ § Ј®Јг«Ё­г(вЁЇ  ЇҐаҐе®¤ ­  б«Ґ¤гойЁ© га®ўҐ­м}
else
line(twidth+dx,topmargin+dy,twidth+dx,topmargin+round(theight*0.4)+dy);{ўлў®¤Ё¬ § Ј®Јг«Ё­г(вЁЇ  ЇҐаҐе®¤ ­  б«Ґ¤гойЁ©
га®ўҐ­м}
line(twidth+dx,topmargin+round(theight*0.4)+dy,twidth+ICON_WIDTH+dx,topmargin+round(theight*0.4)+dy);
end;
end
else
topmargin:=topmargin-theight;

if(root^.children=NIL)then
delta_h:=theight
else
begin
delta_h:=theight*count_nodes(root^.children);
if(root^.next<>NIL)then
begin
if not((root^.next^.data='.')and(root^.next^.next=NIL))then
line(twidth+dx,topmargin-theight+dy,twidth+dx,topmargin+delta_h+dy)
else
line(twidth+dx,topmargin+dy-theight,twidth+dx,topmargin-round(theight*0.6)+dy);
end;
end;
render_node(root^.children,topmargin+theight,dx,dy,level+1);{ўлў®¤Ё¬ ४габЁў­® «Ґўго ўҐвЄг}
render_node(root^.next,topmargin+delta_h,dx,dy,level);{ўлў®¤Ё¬ ४габЁў­® Їа ўго ўҐвЄг}
end;
end;

procedure render_tree(root:pnode);
var
grdriver:integer;
grmode:integer;
errcode:integer;
c:char;
dx,dy:longint;
begin
grdriver:=detect;
initgraph(grdriver, grmode,'');
errcode := graphresult;
if errcode = grok then
begin
c:='l';
dx:=0;
dy:=0;
while(c<>'q')do
begin
setfillstyle(1,BLACK);{®зЁбвЄ  нЄа ­ }
bar(0,0,getmaxx,getmaxy);
setcolor(LIGHTGREEN);
if(dx>-10)then
dx:=10;
if(dy>0)then
dy:=0;
render_node(root,TEXTHEIGHT*2,dx,dy,0);{аЁб㥬 ¤ҐаҐў®}
setfillstyle(1,lightgray);
bar(0,0,getmaxx,TEXTHEIGHT*2-2);
setcolor(WHITE);
outtextxy(0,round(TEXTHEIGHT*0.5),'Ќ ¦¬ЁвҐ q ¤«п ўл室 , w/a/s/d ¤«п ЇҐаҐ¬ҐйҐ­Ёп');
c:=readkey;{®Ўа Ў®вЄ  бЄа®««Ё­Ј }
case c of
'w':dy:=dy-SCROLL_Y;
'a':dx:=dx-SCROLL_X;
's':dy:=dy+SCROLL_Y;
'd':dx:=dx+SCROLL_X;
end;
end;
closegraph;
end
else
writeln('Graphics error:', grapherrormsg(errcode));
end;


procedure write_tree(var file_out:text;root:pnode;level:byte);
begin
if(root<>NIL)then{Ґб«Ё ­®¤  бгйбвўгҐв}
begin
if(root^.data<>'.')then{Ґб«Ё ®вбвгЇ}
writeln(file_out,fill_spaces(level),'|-',root^.data);{ўлў®¤Ё¬ ҐҐ §­ зҐ­ЁҐ}
if(count_nodes(root^.children)>1)then{Ґб«Ё ¤ЁаҐЄв®аЁп}
writeln(file_out,fill_spaces(level+1),'|');{ўлў®¤Ё¬ § Ј®Јг«Ё­г(вЁЇ  ЇҐаҐе®¤ ­  б«Ґ¤гойЁ© га®ўҐ­м}
write_tree(file_out,root^.children,level+1);{ўлў®¤Ё¬ ४габЁў­® «Ґўго ўҐвЄг}
write_tree(file_out,root^.next,level);{ўлў®¤Ё¬ ४габЁў­® Їа ўго ўҐвЄг}
end;
end;


var
path:str_path;
file_tree:text;
tree_tree:pnode;
begin
path:=get_string('‚ўҐ¤ЁвҐ Їгвм Є ¤ЁаҐЄв®аЁЁ [C:\])','C:\');{Ї®«гз Ґ¬ Ё¬п ¤ЁаҐЄв®аЁЁ ¤«п § ЇЁбЁ}
assign(file_tree,path+get_string('‚ўҐ¤ЁвҐ Ё¬п д ©« , Єг¤  бЄ« ¤лў вм ¤ҐаҐў® [tree.o]',
'tree.o'));{Ї®«гз Ґ¬ Ё¬п д ©«  ¤«п ўлў®¤  ¤ҐаҐў }
rewrite(file_tree);{®вЄалў Ґ¬ д ©« ¤«п § ЇЁбЁ}

tree_tree:=fill_tree(path);{Ї®«гз Ґ¬ ¤ҐаҐў®}
write_tree(file_tree,tree_tree,0);{ўлў®¤Ё¬ ў д ©«}
render_tree(tree_tree);{аЁб㥬}

close(file_tree);{§ Єалў Ґ¬ д ©«л}
end.
Соседние файлы в папке 07