Subversion Repositories Kolibri OS

Rev

Rev 937 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
905 leency 1
//Leency & Veliant -=- KolibriOS Team -=- 2008
2
 
3
#codesize
4
#include "lib\kolibri.h--"
5
#include "lib\memory.h--"
6
#include "lib\edit_box_lib.h--"
937 leency 7
#include "lib\file_system.h--"
935 leency 8
#include "imgs\toolbar.txt"
937 leency 9
#include "imgs\left_p.txt"
905 leency 10
 
11
//локализация и настройки
944 leency 12
#define header "Eolite File Manager v0.97.2"
13
#define videlenie 0x94AECE //0x94AECE,0xFEA4B7,0x8BCDFF,0xB8C9B8}; //цвет выделенного элемента из списка файлов
935 leency 14
byte toolbar_buttons_x[6]={14,51,90,139,172,208};
905 leency 15
//
937 leency 16
dword but_num, kolichestvo, za_kadrom, curbtn, razm_scrl;
905 leency 17
byte cut_active, rename_active, del_active;
18
byte show_actions=1, show_preview=0, sort_num=1, isdir;
937 leency 19
char path[256]="/rd/1/", edit_path[256], PathHistory[2560], temp[256]; //для путей
20
char file_path[256], file_name[256]; //для файлов
21
char copyfile[256],copy_name[256]; //копирование
905 leency 22
dword file_mas[6898]; //список файлов
937 leency 23
int temp_int, j, i;
905 leency 24
dword stak[100]=0; //окно About
25
 
26
edit_box edit1= {250,252,17,0xffffff,0x94AECE,0xD3DDEB,0xffffff,0,248,#edit_path,64,6,6};
27
edit_box edit2= {250,218,80,0xFFFFCC,0x94AECE,0xFFFFCC,0xffffff,0,248,#file_name,64,6,6};
28
 
29
proc_info	Form;
30
dword buf=0, off; //для текста и буфера
31
dword devbuf=0, dev_num;
32
#include "include\LVabout.c--"
935 leency 33
#include "include\icons_f.h--"
905 leency 34
 
937 leency 35
 
36
 
37
//IPC
944 leency 38
#include "lib\Nable_lib.h--"
937 leency 39
#include "lib\ipc.h--"
40
 
41
int pLoadedImage;
42
void GetImage(dword ipath)
43
{
44
	IF (pLoadedImage) free(pLoadedImage);
45
	pLoadedImage=loadimage_viaIPC(ipath, #CurrentImage);
46
	SetEventMask(100111b); //restore normal event mask
944 leency 47
}
937 leency 48
 
49
 
905 leency 50
void main()
51
byte pressed, key, id;
52
mouse m;
937 leency 53
int pressed_y;
905 leency 54
{
944 leency 55
	devbuf= malloc(3112); //буфер где-то на 10 девайсов в левой панели
56
	ReadDir(10, devbuf, "/");
57
	dev_num=EBX;
905 leency 58
	load_dll(); //подгружает либу с едит_боксом
59
	IF (param[0]<>'') {copystr(#param,#edit_path); Goto_edit_path();}
60
	Open_Dir(#path,2);
61
	loop()
62
	{
63
		switch(WaitEvent())
64
		{
65
			CASE evMouse:
66
					id = 0;
67
					IF (del_active==1) break;
68
					m.get();
69
					//
70
					IF (vert==65535) IF (curbtn==0) FileList_ReDraw(-3); ELSE FileList_ReDraw(-1);
71
					IF (vert==1) IF (curbtn==but_num-1) FileList_ReDraw(3); ELSE FileList_ReDraw(1);
72
					//скролл
944 leency 73
					IF (razm_scrl/2+57>m.y)  || (m.y<0) || (m.y>4000) m.y=razm_scrl/2+57; //если курсор над окном
905 leency 74
					IF (m.lkm==0) pressed=0; ELSE
75
					IF (m.x>=Form.width-21) && (m.x<=Form.width-6) pressed=1;
76
					IF (pressed==1)
77
					{
78
						temp_int=za_kadrom; //сохраняем старое количество
937 leency 79
						j= razm_scrl/2;
80
						za_kadrom = m.y -j -57 * kolichestvo / onTop(22,57);
905 leency 81
						IF (but_num+za_kadrom>kolichestvo) za_kadrom=kolichestvo-but_num;
82
						IF (temp_int<>za_kadrom) List_ReDraw(); //чтоб лишний раз не перерисовывать
83
					}
84
					break;
85
//Button pressed-----------------------------------------------------------------------------
86
			case evButton:
87
				IF (edit1.flags<>64) {edit1.flags=64; edit_box_draw stdcall(#edit1);} //сбрасываем выделение при нажатии на батон
88
				id=GetButtonID();
944 leency 89
				IF (id==1) ExitProcess();
905 leency 90
				IF (del_active==1) {IF (id==301) || (id==302) Del_File(302-id); break;}
91
				switch(id)
92
				{
93
					CASE 21: GoBack(); break;//Назад
94
					CASE 23: IF (strcmp(#path,"/")<>0) Dir_Up(); break;//up!
95
					CASE 24: key=24; //cut
96
					CASE 25: goto CTRLC_MARK; //copy
97
					CASE 26: Paste(); break;//paste
98
					CASE 27: Goto_edit_path(); break; //goto edit_path
99
					CASE 31...33: //sort
100
							IF (sort_num==id-30) break;
101
							IF(sort_num==1)DrawBar(onLeft(197,163)/2+215,45,6,9,0xE4DFE1);
102
							IF(sort_num==2)DrawBar(onLeft(110,0),45,6,9,0xE4DFE1);
103
							IF(sort_num==3)DrawBar(onLeft(39,0),45,6,9,0xE4DFE1);
104
							sort_num=id-30;
105
							Open_Dir(#path,1);
106
							break;
107
					case 30: //about
108
						EAX = 51; EBX = 1;
109
						ECX = #authors; EDX = #stak;
110
						$int 40h;
111
						break;
112
					case 50: //стрелка вверх на скроле
113
						FileList_ReDraw(-1);
937 leency 114
						break;
905 leency 115
					case 51: //стрелка вниз на скроле
116
						FileList_ReDraw(1);
937 leency 117
						break;
905 leency 118
					case 78: //preview
119
						IF (show_preview==1) show_preview=0; ELSE show_preview=1;
120
						Preview();
937 leency 121
						break;
905 leency 122
					case 77: //actions
123
						IF (show_actions==1) show_actions=0; ELSE show_actions=1;
124
						Actions();	Preview();
937 leency 125
						break;
126
					case 80: //rename
127
						goto REN_MARK;
128
					case 81: //Delete file
129
						Del_Form();
130
						break;
131
					case 82: //create folder
132
						NEW_FOLDER_MARK:
133
						copystr(#path, #temp);
134
						copystr("New folder", #temp+strlen(#temp));
135
						CreateFolder(#temp);
136
						za_kadrom=curbtn=0;
137
						Open_Dir(#path,1);
138
						FOR (i=0; i
139
							IF (strcmp("New folder",file_mas[i]*304+buf+72)==0) {IF(!strcmp("..",buf+72+304))i--; FileList_ReDraw(i); break;}
140
						goto REN_MARK;
141
					case 100...120:
142
						DEVICE_MARK:
143
						copystr(id-100*304+ devbuf+72, #path);
144
						IF (path[0]=='r') copystr("/rd/1",#file_path);
145
						ELSE  {
146
							copystr("/", #file_path);
147
							copystr(#path, #file_path+strlen(#file_path));
148
							}
149
						goto OPEN_DEV;
150
					default:
151
						if (id<200) break; //кнопки из списка файлов
152
						IF (curbtn!=id-201) {FileList_ReDraw(id-201-curbtn); break;}
153
						else OPEN_MARK:
154
						if (!isdir) Run_File(#file_path); else
155
						if (strcmp(za_kadrom+curbtn+1*304 + buf+72,"..")==0) Dir_Up(); else
156
						{	OPEN_DEV:
157
								copystr(#file_path, #path);
158
								copystr("/", #path+strlen(#path));
159
								DrawBar(197,curbtn*18+57,onLeft(22,197),18,0xFFFFFF); //закрашиваем старое выделение
160
								za_kadrom=curbtn=0;
161
								Open_Dir(#path,1);
905 leency 162
						}
937 leency 163
						break;
905 leency 164
				}
165
				break;
166
//Key pressed-----------------------------------------------------------------------------
167
			case evKey:
168
				key = GetKey();
169
				IF (del_active==1)
170
					{
171
					IF (key==013) Del_File(true);
172
					IF (key==027) Del_File(false);
173
				 	break;
174
				 	}
935 leency 175
				IF (edit1.flags<>64) && (key<>13) {EAX=key<<8; edit_box_key stdcall (#edit1); break;}
176
                IF (edit2.flags<>64) && (key<>13) && (key<>27) {EAX=key<<8; edit_box_key stdcall (#edit2); break;}
905 leency 177
				switch (key)
178
				{
179
						case 209...217: id=key-109; IF(dev_num>id-100)GOTO DEVICE_MARK; break;
180
						case 8: GoBack(); break; //Назад
937 leency 181
						case 014: MoveSize(80,80,OLD,OLD); RunProgram("/sys/File Managers/Eolite", #path); break; //новое окно
905 leency 182
						case 024:  //Ctrl+X cut
183
						case 089: //Ctrl+Ins copy
184
						case 003: //Ctrl+C copy
185
								CTRLC_MARK:
186
								IF (isdir) break; //папки пока что копировать не умеем
187
								copystr(#file_name,#copy_name);
188
								copystr(#file_path,#copyfile); //вычисляем какой файл копировать
189
								IF (key==24) cut_active=1; ELSE cut_active=0;
190
								break;
191
						case 022: Paste(); break;//Ctrl+V paste
192
						case 027: //Esc
937 leency 193
								IF (rename_active==1) {Line_ReDraw(videlenie, 100);}
905 leency 194
								break;
195
						case 013:	//Enter
196
								IF (rename_active==1) {Line_ReDraw(videlenie, curbtn); break;}
197
								IF (strcmp(#path,#edit_path)<>0) Goto_edit_path();
198
								ELSE GOTO OPEN_MARK;
199
								break;
937 leency 200
						case 55: //F6 - new folder
201
								goto NEW_FOLDER_MARK;
905 leency 202
						case 56:  //IF (rename_active==1) break;//up
203
						case 178: //up
204
								FileList_ReDraw(-1);
205
								break;
206
						case 177: //down
207
								FileList_ReDraw(1);
208
								break;
209
						case 180: //home
210
								FileList_ReDraw(-za_kadrom-curbtn);
211
								break;
212
						case 181: //end
213
								FileList_ReDraw(kolichestvo-za_kadrom-curbtn+but_num);
214
								break;
215
						case 183: //Page Down
216
								FileList_ReDraw(but_num-1);
217
								break;
218
						case 184: //Page Up
219
								FileList_ReDraw(-but_num+1);
220
								break;
221
						case 051: //Нажата F2
937 leency 222
								REN_MARK:
223
								//IF (isdir==1) break; //папки пока что копировать не умеем
224
								edit2.flags=66; //делаем компонент активным
225
								DeleteButton(curbtn+201); //это чтоб можно было выделять мышью
226
								edit2.width=onLeft(24,217);
227
								edit2.top=curbtn*18+59+skin_width;
228
								edit2.size=strlen(#file_name); edit2.pos=strlen(#file_name);
229
								edit_box_draw  stdcall (#edit2);
230
								DrawBar(218,curbtn*18+58,edit2.width+1,1,0xFFFFCC); //полоса желтая сверху для одинаковости
231
								rename_active=1;
232
								break;
905 leency 233
						case 052: //Нажата F3
937 leency 234
								IF (isdir==false) RunProgram("/sys/tinypad", #file_path); break;
935 leency 235
						case 054: Open_Dir(#path,1); break; //перерисовать окно F5
236
						case 182: Del_Form(); break; //delete file
237
						default:
238
								IF (strcmp("..",buf+72+304)<>0) temp_int=0; ELSE temp_int=1;
239
								for (i=curbtn+za_kadrom+1; i
240
								{
241
									copystr(file_mas[i+temp_int]*304+buf+72,#temp);
242
									AL=DSBYTE[#temp];
243
									IF(AL>='A')&&(AL<='Z')DSBYTE[#temp]=AL|0x20;
244
									IF (temp[0]==key) {FileList_ReDraw(i-curbtn-za_kadrom); break;}
245
								}
905 leency 246
				}
247
				break;
248
				case evReDraw:	draw_window();	BREAK;
249
		}
250
		IF (rename_active==0) edit_box_mouse stdcall(#edit1); ELSE edit_box_mouse stdcall(#edit2);
251
	}
252
}
253
 
254
 
255
inline fastcall void draw_window()
256
{
257
	WindowRedrawStatus(1);
258
	skin_width = GetSkinWidth();
937 leency 259
	DefineAndDrawWindow(100,100,600,410,0x43,0x10E4DFE1,0,0,header);
260
	Form.GetInfo(SelfInfo);
905 leency 261
	IF (Form.height==skin_width+3) {WindowRedrawStatus(2); return;} //это зачёт!
262
	  IF (Form.height<280) MoveSize(OLD,OLD,OLD,280);
263
	  IF (Form.width<480) MoveSize(OLD,OLD,480,OLD);
264
	//toolbar buttons
935 leency 265
	PutPaletteImage(#toolbar,246,39,5,0,#toolbar_pal);
905 leency 266
	FOR (j=0; j<6; j++) DefineButton(toolbar_buttons_x[j],5,31,29,21+j+BT_HIDE,0xE4DFE1);
267
	//полоса адреса
268
	DrawBar(251,0,onLeft(251,60),12,0xE4DFE1); //фон над полосой адреса
269
	edit1.width=Form.width-314;
270
	edit1.top=13+skin_width;
271
	KEdit();
272
	DrawRegion(251,12,onLeft(61,251),16,0x94AECE);	//ободок
273
	DrawBar(251,29,onLeft(251,60),10,0xE4DFE1); //фон под полосой адреса
274
	DefineButton(onLeft(34,0),6,27,28,30+BT_HIDE+BT_NOFRAME,0xE4DFE1); //about
275
	DefineButton(onLeft(61,0),12,18,16,27+BT_HIDE,0xE4DFE1); //кнопка перехода
937 leency 276
	PutPaletteImage(#goto_about,56,40,Form.width-60,0,#goto_about_pal);
905 leency 277
	//прямоугольники внутри
278
	DrawRegion(6,40,Form.width-12,Form.height-skin_width-46,0x94AECE); //синий ободок
279
	DrawRegion(5,39,Form.width-10,Form.height-skin_width-44,0xE4DFE1); //фон
280
    Devices(); //панель слева на синем фоне
281
	//Buttons
282
	DrawFlatButton(197,40,onLeft(197,163),16,31,0xE4DFE1,"File");
283
	DrawFlatButton(onLeft(163,0),40,73,16,32,0xE4DFE1,"Type");
284
	DrawFlatButton(onLeft(90,0),40,68,16,33,0xE4DFE1,"Size");
285
	IF (sort_num==1) WriteText(onLeft(197,163)/2+197+18,45,0x80,0x4E78AC,"\x19",0);
286
		ELSE IF (sort_num==2) WriteText(onLeft(110,0),45,0x80,0x4E78AC,"\x19",0);
287
		ELSE WriteText(onLeft(39,0),45,0x80,0x4E78AC,"\x19",0);
288
	//прокрутка
289
	DrawFlatButton(onLeft(22,0),40,16,16,50,0xE4DFE1,"\x18");		//прокрутка вверх
290
	DrawFlatButton(onLeft(22,0),onTop(22,0),16,16,51,0xE4DFE1,"\x19");//прокрутка вниз
935 leency 291
	//
292
	//DrawBar(197,57,onLeft(22,197),onTop(57,6),0xFFFFFF); //заливка белым
293
	//
905 leency 294
	DrawBar(onLeft(22,0),57,1,onTop(22,57),0x94AECE); 			//линия слева от прокрутки
295
		but_num=onTop(6,57)/18;
296
		IF (but_num>100) but_num=1; ELSE IF (kolichestvo
935 leency 297
		FOR (j=0;j
905 leency 298
		List_ReDraw();
299
	IF (del_active==1) Del_Form();
944 leency 300
	//
905 leency 301
	WindowRedrawStatus(2);
302
}
303
 
304
 
305
void KEdit()
306
{
307
	edit1.size=strlen(#edit_path); edit1.pos=strlen(#edit_path);
308
	edit_box_draw  stdcall (#edit1);
309
}
310
 
311
 
312
inline fastcall void TVScroll() { //Прокрутка
944 leency 313
	dword on_y;
314
	IF (kolichestvo<=0) {DrawFlatButton(onLeft(22,0),57,16,onTop(22,58),0,0xE4DFE1,""); return;}
315
	on_y = za_kadrom * onTop(22,57) / kolichestvo +57;
905 leency 316
	razm_scrl=onTop(22,57) * but_num - but_num / kolichestvo;
317
	IF (razm_scrl<20) razm_scrl = 20; //устанавливаем минимальный размер скролла
318
	IF (razm_scrl>onTop(22,57)-on_y+56) || (za_kadrom+but_num>=kolichestvo) on_y=onTop(23+razm_scrl,0); //для большого списка
319
	DrawFlatButton(onLeft(22,0),on_y,16,razm_scrl,0,0xE4DFE1,"");//ползунок
320
	DrawBar(onLeft(21,0),57,15,on_y-57,0xCED0D0);//поле до ползунка
321
	DrawBar(onLeft(21,0),on_y+razm_scrl+1,15,onTop(22,57)-razm_scrl-on_y+56,0xCED0D0); //поле после ползунка
322
}
323
 
324
 
325
void FileList_ReDraw(int curbtn_)
326
{
327
	if (curbtn_<=0) //вверх
328
	{
329
		IF (za_kadrom==0) && (curbtn==0) return;
330
		IF (-curbtn_-1
331
		{
332
			Line_ReDraw(0xFFFFFF, curbtn); //белая полоса
333
			curbtn+=curbtn_;
334
			Line_ReDraw(videlenie, curbtn); //выделение
335
			return;
336
		}
337
		ELSE
338
		{
339
			IF (-curbtn_
340
			curbtn=0;
341
			List_ReDraw();
342
			return;
343
		}
344
	}
345
	else  //вниз
346
	{
347
		IF (za_kadrom==kolichestvo-but_num) && (curbtn==but_num-1) return;
348
		IF (but_num-curbtn>curbtn_)
349
		{
350
			Line_ReDraw(0xFFFFFF, curbtn); //белая полоса
351
			curbtn+=curbtn_;
352
			Line_ReDraw(videlenie, curbtn); //выделение
353
			return;
354
		}
355
		ELSE
356
		{
357
			IF(but_num+za_kadrom+curbtn_>=kolichestvo) za_kadrom=kolichestvo-but_num;  ELSE za_kadrom+=curbtn_+curbtn-but_num+1;
358
			curbtn=but_num;
359
			List_ReDraw();
360
		}
361
	}
362
}
363
 
364
 
365
void List_ReDraw()
366
{
367
	IF (kolichestvo-za_kadrom
368
	{ za_kadrom=kolichestvo-but_num; DrawBar(197,curbtn*18+57,onLeft(22,197),18,0xFFFFFF); curbtn=but_num-1; }
369
		ELSE IF (curbtn>but_num-1) curbtn=but_num-1; //это если выделение после схлопывания окна за кадром
370
	//
371
	FOR (j=0; jj) Line_ReDraw(0xFFFFFF, j); ELSE Line_ReDraw(videlenie, curbtn);
935 leency 372
		temp_int=but_num*18+57;
905 leency 373
		DrawBar(197,temp_int,onLeft(22,197),onTop(temp_int,6),0xFFFFFF); //заливка белым доконца
374
		DrawBar(onLeft(163,0),temp_int,1,onTop(temp_int,6),0xE4DFE1); //полоса серая вертикальная 1
375
		DrawBar(onLeft(90,0),temp_int,1,onTop(temp_int,6),0xE4DFE1); //полоса серая вертикальная 2
376
	TVScroll();
377
}
378
 
379
 
380
void Line_ReDraw(dword color, filenum){
937 leency 381
	dword y;//положение текста по Y;
905 leency 382
	if (rename_active==1)
383
	{
384
		rename_active=0;
385
		edit2.flags=64;
935 leency 386
		DefineButton(197,curbtn*18+57,onLeft(22,197),18,curbtn+201+BT_HIDE+BT_NOFRAME,0xFFFFFF);
937 leency 387
		IF (filenum==100) filenum=curbtn; else
905 leency 388
		{
389
			copystr(#path,#temp);
390
			copystr(#file_name,#temp+strlen(#temp));
937 leency 391
			if (strcmp(#file_path,#temp)<>0) && (strlen(#file_name)>0)
392
			IF (isdir)
393
			{
394
				//Del_File(true);
395
				DeleleFile(#file_path);
396
				IF (EAX<>0) {DrawFlatButton(Form.width-200+197/2,160,200,80,0,0xFFB6B5, "Error. Folder isn't empty."); Pause(200);}
397
				ELSE CreateFolder(#temp);
398
				Open_Dir(#path,1);
399
			}
400
			ELSE { CopyFile(#file_path,#temp);	Del_File(true); }
905 leency 401
		}
402
	}
937 leency 403
	y=filenum*18+57;
935 leency 404
	//да, я не спорю что изврат, но перерисовка зато маленькая
405
	DrawBar(197,y,3,18,color);
406
	DrawBar(200,y,16,2,color);
407
	DrawBar(197+19,y,onLeft(22+19,197),18,color);
408
	DrawBar(200,y+17,16,1,color);
905 leency 409
	//
410
	IF (strcmp(".",buf+72)<>0) off=file_mas[filenum+za_kadrom]*304 + buf+72; ELSE off=file_mas[filenum+za_kadrom+1]*304 + buf+72;
411
	EAX=ESDWORD[off-40];
412
	$shr eax,4
413
	$and eax,1
937 leency 414
	IF (color==videlenie) isdir=EAX;
935 leency 415
	if (!EAX)
905 leency 416
	{
935 leency 417
		temp_int = Put_icon(off+strlen(off)-4, y+2);
418
		WriteText(7-strlen(ConvertSize(ESDWORD[off-8]))*6+onLeft(75,0),y+6,0x80,0,ConvertSize(ESDWORD[off-8]),0); //size
937 leency 419
	} ELSE IF (!strcmp("..",off)) temp_int=Put_icon("..", y+2); ELSE temp_int=Put_icon("", y+2);
944 leency 420
	if (color==videlenie)
905 leency 421
	{
937 leency 422
		IconFairing(temp_int, y+2); //закрашиваем иконку
905 leency 423
		copystr(#path,#file_path);
424
		copystr(off,#file_name);
425
		copystr(off,#file_path+strlen(#file_path)); //итак, file_path=файлу, т.к. по-умолчанию это прога
944 leency 426
		/*IF (show_preview) && (!isdir)
427
		{
428
			GetImage(#file_path);
429
			j=dev_num*16+123;
430
			j+=show_actions*51;
431
			IF (pLoadedImage<>0) DrawImage(#CurrentImage, 22*65536+j+skin_width+18);
432
		}*/
905 leency 433
	}
935 leency 434
	temp_int = onLeft(220,160)/6;
435
	IF (strlen(off)
436
		WriteText(220,y+6,0,0,off,temp_int);  //имя файла
437
	DrawBar(onLeft(163,0),y,1,18,0xE4DFE1); //полоса серая вертикальная 1
438
	DrawBar(onLeft(90,0),y,1,18,0xE4DFE1); //полоса серая вертикальная 2
905 leency 439
}
440
 
441
 
442
void Open_Dir(dword path_,redraw){
443
  IF (buf) free(buf);
944 leency 444
	//buf = malloc(2097152);
445
	//ReadDir(6898, buf, path_);
446
    buf = malloc(32);
447
	ReadDir(0, buf, path_);
448
    EAX = buf + 8;
449
    kolichestvo = ESDWORD[EAX];
450
    buf = realloc(kolichestvo * 304 + 32, buf);
451
	ReadDir(kolichestvo, buf, path_);
452
	//
905 leency 453
	kolichestvo=EBX;
454
	//
455
	if (kolichestvo<>-1) && (redraw>0)
456
	{
457
		FOR (j=0;j0) ChangeCase(off);} //регистр
458
		FOR (j=0;j
459
		but_num=onTop(6,57)/18;
460
		IF (strcmp(".",buf+72)==0) kolichestvo--; //фильтруем элемент "."
461
		//IF (strcmp(".",buf+72)==0) copystr(304+buf+72,buf);
462
		IF (but_num>100) but_num=1; ELSE//эта странная строчка для того если размеры окна слишком маленькие
463
		IF (kolichestvo
464
		FOR (j=0;j
465
		FoldesGoUp();
466
		IF (redraw==1) List_ReDraw();
467
		copystr(path_,#edit_path);
468
		KEdit();
469
		copystr("|",#PathHistory+strlen(#PathHistory));
470
		copystr(#path,#PathHistory+strlen(#PathHistory));
471
	}
472
}
473
 
474
 
475
 
476
void FoldesGoUp()
477
{
478
	dword k=0, l=0; off=buf+72;
479
	IF (strcmp(#path,"/rd/1/")==0) || (strcmp(#path,"/fd/1/")==0) kolichestvo--;
480
	IF (strcmp(".",buf+72)<>0) && (strlen(#path)>6) kolichestvo--; //фак! это бред! хз как оно работает
935 leency 481
	FOR (j=0;j<=kolichestvo;j++)  //а папки вверх, файлы вниз
905 leency 482
	{
483
		EAX=ESDWORD[off-40];
484
		$shr eax,4
485
		$and eax,1
935 leency 486
		IF (EAX) {file_mas[k]=j; k++;}
487
			ELSE {file_mas[kolichestvo-l]=j; l++;}
905 leency 488
		off += 304;
489
	}
490
	switch(sort_num)
491
	{
492
		CASE 1: //упорядочиваем файлы по имени
493
			WriteText(onLeft(197,163)/2+215,45,0x80,0x4E78AC,"\x19",0);
494
			IF (strcmp(#path,"/")==0) break;
495
			IF (strcmp("..",buf+72+304)<>0) Sort_by_Name(k,kolichestvo-1); ELSE Sort_by_Name(k,kolichestvo);
496
			break;
497
		case 2: //упорядочиваем файлы по типу
498
			WriteText(onLeft(110,0),45,0x80,0x4E78AC,"\x19",0);
499
			IF (strcmp("..",buf+72+304)<>0) Sort_by_Type(k, kolichestvo-1); ELSE Sort_by_Type(k, kolichestvo);
500
			break;
501
		case 3:
502
			WriteText(onLeft(39,0),45,0x80,0x4E78AC,"\x19",0);
503
			IF (strcmp("..",buf+72+304)<>0) Sort_by_Size(k,kolichestvo-1); ELSE Sort_by_Size(k,kolichestvo);
504
			BREAK;
505
	}
506
	IF (strcmp(#path,"/")<>0) IF (strcmp("..",304+buf+72)<>0) Sort_by_Name(0,k-1); ELSE Sort_by_Name(2,k-1); //иногда имя папки начинается с !,&...
507
	IF (strcmp(".",buf+72)<>0) && (strlen(#path)>6) kolichestvo++;
508
}
509
 
510
 
511
dword onLeft(dword right,left) {return Form.width-right-left;}
512
dword onTop(dword down,up) {return Form.height-skin_width-down-up;}
513
 
514
 
515
void Del_Form()
516
{
517
	temp_int=Form.width-200+197/2;
518
	//типа окно
519
	FOR (i=5;i<11;i++) DeleteButton(201+i); //удаляем кнопки под формой
520
	DrawFlatButton(temp_int,160,200,80,0,0xE4DFE1, ""); //форма
937 leency 521
	WriteText(temp_int+19,175,0x80,0,"Do you really want to delete",0);
905 leency 522
	IF (strlen(#file_name)<28)
523
		{
937 leency 524
			WriteText(strlen(#file_name)*6+temp_int+20,190,0x80,0,"?",0);
525
			WriteText(temp_int+20,190,0x80,0,#file_name,0); //пишем имя
905 leency 526
		}
527
	ELSE
528
		{
937 leency 529
			WriteText(164+temp_int,190,0x80,0,"...?",0);
905 leency 530
			WriteText(temp_int+20,190,0,0,#file_name,24); //пишем имя
531
		}
532
	//кнопочки
533
	DrawFlatButton(temp_int+20,208,70,20,301,0xFFB6B5,"Yes");
534
	DrawFlatButton(temp_int+111,208,70,20,302,0xC6DFC6,"No");
535
	del_active=1;
536
}
935 leency 537
 
944 leency 538
 
905 leency 539
void Del_File(byte dodel)
935 leency 540
{
937 leency 541
	IF (dodel==true)
542
	{
543
		DeleleFile(#file_path);
544
		IF (EAX<>0) && (isdir==true) {DrawFlatButton(temp_int,160,200,80,0,0xFFB6B5, "Error. Folder isn't empty."); Pause(200);}
545
 	}
546
	del_active=0;
547
	DeleteButton(301); DeleteButton(302); //удаляем кнопочки Yes/No
548
	Open_Dir(#path,1);
549
}
905 leency 550
 
551
 
552
void Paste()
553
{
554
	IF (strcmp(#copyfile,"")==0) return; //отмена, еши ещё ничё не скопировали
555
	copystr(#path,#temp);
556
	copystr(#copy_name,#temp+strlen(#temp));
557
	if (strcmp(#copyfile,#temp)==0) //если мы копируем и вставляем в одной и той же папке
558
		{
559
			copystr(#path,#temp);
560
			copystr("new_",#temp+strlen(#temp));
561
			copystr(#copy_name,#temp+strlen(#temp));
562
		}
563
	CopyFile(#copyfile,#temp);
564
	IF (cut_active==1) //если мы выбрали вырезать
565
		{
566
			copystr(#copyfile,#file_path);
567
			Del_File(true);
568
			copyfile='';
569
			cut_active=0;
570
		}
571
	Open_Dir(#path,1);
572
}
573
 
574
 
575
void Tip(int y, dword caption, id, arrow)
576
{
577
	DrawBar(22,y,160,17,0xE4DFE1); //серое сверху
578
	WriteText(30,y+5,0x80,0,caption,0);		//text Goto:
579
	IF (id<>0) DefineButton(164,y+1,16,16,id+BT_HIDE+BT_NOFRAME,0xE4DFE1); //кнопа для стрелки
580
	WriteText(170,y+5,0x80,0,arrow,0); //стрелка вниз
581
	DrawBar(22,y+17,160,1,0x94AECE);		//подчёркивание
582
}
583
 
584
 
585
void Devices()
586
{
587
	byte dev_icon; dword drive_name[30]; char dev_name[4];
588
	DrawBar(7,41,190,15,0x00699C);		//синий прямоугольник - сверху
589
	DrawBar(7,56,15,onTop(21,41),0x00699C);	//синий прямоугольник - слева
590
	DrawBar(182,56,15,onTop(21,41),0x00699C);	//синий прямоугольник - справа
591
	//список дисков
592
	Tip(56, "Goto:", 0, "");
593
	DrawBar(22,74,160,dev_num*16+1,0xFFFFFF);	//белое
594
	for (i=0;i
595
	{
596
		DefineButton(22,i*16+74,159,16,100+i+BT_HIDE,0xE4DFE1); //создаём кнопки, а потом выводим названия дисков
597
		copystr("Unknown drive",#drive_name); //изначально неизвесный носитель
598
		dev_icon=3; //по-умолчанию устройство выглядит как жестяк
599
		copystr(i*304+ devbuf+72, #dev_name);
600
		IF (dev_name[0]=='f')  { copystr("Floppy disk /",#drive_name); dev_icon=2; }
944 leency 601
		IF (dev_name[0]=='h')  copystr("Hard disk drive /",#drive_name);
602
		IF (dev_name[0]=='b')  copystr("SATA disk drive /",#drive_name);
905 leency 603
		IF (dev_name[0]=='c')  {copystr("CD-drive /",#drive_name); dev_icon=1;}
604
		copystr(#dev_name,#drive_name+strlen(#drive_name));
605
		copystr("/",#drive_name+strlen(#drive_name));
606
		IF (dev_name[0]=='r')  { copystr("RAM-disk /rd/1/",#drive_name); dev_icon=0; }
607
	  WriteText(45,i*16+79,0x80,0,#drive_name,0);
608
	  PutImage(dev_icon*14*13*3+#devices,14,13,26,i*16+76);
935 leency 609
	}
905 leency 610
	Actions();  //функции файлов и папок
611
	Preview();
612
}
613
 
935 leency 614
 
905 leency 615
void Actions()
616
{
617
	DrawBar(22,dev_num*16+75,160,15,0x00699C); //синий прямоугольник - под девайсами
618
	if (show_actions==1)
619
	{
620
		Tip(dev_num*16+90, "Actions", 77, "\x19");
621
		DrawBar(22,dev_num*16+108,160,51,0xFFFFFF); //белое
622
		PutImage(#factions,16,44,26,dev_num*16+113); //пиктограмки
623
		//rename file
624
		DefineButton(22,dev_num*16+108,159,16,80+BT_HIDE,0xE4DFE1);
625
		WriteText(47,dev_num*16+113,0x80,0,"Rename file ",0);
626
		//delete file
627
		DefineButton(22,dev_num*16+125,159,16,81+BT_HIDE,0xE4DFE1);
628
		WriteText(47,dev_num*16+130,0x80,0,"Delete file ",0);
629
		//create folder
630
		DefineButton(22,dev_num*16+142,159,16,82+BT_HIDE,0xE4DFE1);
631
		WriteText(47,dev_num*16+147,0x80,0,"Create folder ",0);
632
		DrawBar(22,dev_num*16+159,160,15,0x00699C); //синее после Actions
633
	}
634
	ELSE
635
	{
636
	DeleteButton(80);	DeleteButton(81);	DeleteButton(82);
637
	Tip(dev_num*16+90, "Actions", 77, "\x18");
638
	DrawBar(22,dev_num*16+108,160,51,0x00699C); //синее
639
	}
640
}
641
 
642
 
643
void Dir_Up()
644
{
645
	byte temp_[256];
646
	i=strlen(#path)-1;
647
	path[i]=0x00;
648
	do i--; while (path[i]<>'/'); copystr(#path+i+1,#temp_);
649
	path[i+1]=0x00;
650
	ChangeCase(#temp_);
651
	za_kadrom=curbtn=0; //вверх списка
652
   	Open_Dir(#path,2);
653
	FOR (i=kolichestvo; i>0; i--;)	IF(strcmp(file_mas[i]*304+buf+72,#temp_)==0) BREAK;
654
	//
655
	if (i>kolichestvo-but_num)
656
	{
657
		za_kadrom=kolichestvo-but_num;
658
		IF (strcmp(".",buf+72)<>0) curbtn=i-kolichestvo+but_num; ELSE curbtn=i-kolichestvo+but_num-1;
659
	}
660
	ELSE IF (strcmp(".",buf+72)<>0) FileList_ReDraw(i); ELSE FileList_ReDraw(i-1);
661
	List_ReDraw();
662
}
663
 
664
 
665
void Preview()
944 leency 666
{
905 leency 667
	dword top_pr=dev_num*16+123;
935 leency 668
	top_pr+=show_actions*51; //начинаем ниже, если Экшнс видимы
905 leency 669
	DeleteButton(78);
670
	if (show_preview==1)
671
	{
672
		Tip(top_pr,"Preview",78,"\x19");
673
		DrawBar(22,top_pr+18,160,100,0xFFFFFF); //белое
944 leency 674
		/*WriteText(30,top_pr+30,0x80,0,"kolichestvo:",0); WriteText(105,top_pr+30,0x80,0,IntToStr(kolichestvo),0);
675
		WriteText(30,top_pr+40,0x80,0,"but_num:",0);	 WriteText(105,top_pr+40,0x80,0,IntToStr(but_num),0);
676
		WriteText(30,top_pr+50,0x80,0,"curbtn",0);		 WriteText(105,top_pr+50,0x80,0,IntToStr(curbtn),0);
677
		WriteText(30,top_pr+60,0x80,0,"ra_kadrom:",0);	 WriteText(105,top_pr+60,0x80,0,IntToStr(za_kadrom),0);
678
		WriteText(30,top_pr+70,0x80,0,#file_path,0);
679
		WriteText(30,top_pr+80,0x80,0,#file_name,0);*/
680
		//WriteText(30,top_pr+60,0x80,0,"Not realized... I think",0);
681
		//WriteText(30,top_pr+70,0x80,0,"it will be realired soon.",0);
682
		DrawBar(22,top_pr+118,160,onTop(top_pr+118,6),0x00699C); //синее
905 leency 683
	}
944 leency 684
	ELSE
685
	{
905 leency 686
		Tip(top_pr,"Preview",78,"\x18");
687
		DrawBar(22,top_pr+18,160,onTop(top_pr+18,6),0x00699C); //синее
944 leency 688
	}
905 leency 689
}
690
 
691
 
692
void Goto_edit_path()
693
{
694
	IF (strcmp(#path,#edit_path)==0) return; //проверка не в этой ли мы папке
695
 	IF (strcmp(#edit_path+strlen(#edit_path)-1,"/")<>0) copystr("/",#edit_path+strlen(#edit_path)); //если нет, + "/"
696
	Open_Dir(#edit_path,0); //проверяем если файлы в папке, так мы узнаём существует ли она
697
	IF (kolichestvo==-1) KEdit(); ELSE //просто очищаем полосу адреса
698
		{za_kadrom=curbtn=0; copystr(#edit_path,#path);}//наверх списка
699
	Open_Dir(#path,1);
700
}
701
 
702
 
703
inline fastcall void GoBack()   //вначале удаляем текущий путь, а потом копируем то, что осталось
704
{
705
	//char old_dir[256]='';
706
	i=strlen(#PathHistory)-2;
707
	//
708
	//WHILE (PathHistory[i]<>'/') { copystr(#PathHistory[i],#old_dir); i--; };
709
	//old_dir[strlen(#old_dir)-1]=0x00;
710
	//DrawTitle(#old_dir);
711
	//
712
	WHILE (PathHistory[i]<>'|') { i--; };
713
	IF (i>0) PathHistory[i]=0x00;
714
	WHILE (PathHistory[i]<>'|')	{ copystr(#PathHistory[i],#path); i--;	}
715
	IF (i>0) PathHistory[i]=0x00;
716
	za_kadrom=curbtn=0; Open_Dir(#path,1);
717
	//FOR (i=0; i
718
}
719
 
720
 
721
stop: