Subversion Repositories Kolibri OS

Rev

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

Rev Author Line No. Line
1199 mario79 1
;*****************************************************************************
2
; File Browser control for Kolibri OS
3
; Copyright (c) 2009, Marat Zakiyanov aka Mario79, aka Mario
4
; All rights reserved.
5
;
6
; Redistribution and use in source and binary forms, with or without
7
; modification, are permitted provided that the following conditions are met:
8
;	 * Redistributions of source code must retain the above copyright
9
;	   notice, this list of conditions and the following disclaimer.
10
;	 * Redistributions in binary form must reproduce the above copyright
11
;	   notice, this list of conditions and the following disclaimer in the
12
;	   documentation and/or other materials provided with the distribution.
13
;	 * Neither the name of the  nor the
14
;	   names of its contributors may be used to endorse or promote products
15
;	   derived from this software without specific prior written permission.
16
;
17
; THIS SOFTWARE IS PROVIDED BY Marat Zakiyanov ''AS IS'' AND ANY
18
; EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
19
; WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
20
; DISCLAIMED. IN NO EVENT SHALL  BE LIABLE FOR ANY
21
; DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
22
; (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
23
; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
24
; ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25
; (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
26
; SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27
;*****************************************************************************
28
;*****************************************************************************
29
macro	file_browser_exit
30
{
31
popa
32
ret 4
33
}
34
;*****************************************************************************
35
macro	use_file_browser
36
{
37
file_browser:
38
fb_type				equ dword [edi]		;dword
39
fb_size_x			equ [edi+4]		;word
40
fb_start_x			equ [edi+6]		;word
41
fb_size_y			equ [edi+8]		;word
42
fb_start_y			equ [edi+10]		;word
43
fb_icon_size_y			equ word [edi+12]	;word
44
fb_icon_size_x			equ word [edi+14]	;word
45
fb_line_size_x			equ word [edi+16]	;word
46
fb_line_size_y			equ word [edi+18]	;word
47
fb_type_size_x			equ word [edi+20]	;word
48
fb_size_size_x			equ word [edi+22]	;word
49
fb_date_size_x			equ word [edi+24]	;word
50
fb_attributes_size_x		equ word [edi+26]	;word
51
fb_icon_assoc_area		equ dword [edi+28]	;dword
52
fb_icon_raw_area		equ dword [edi+32]	;dword
53
fb_resolution_raw		equ dword [edi+36]	;dword
54
fb_palette_raw			equ dword [edi+40]	;dword
55
fb_directory_path_area		equ dword [edi+44]	;dword
56
fb_file_name_area		equ dword [edi+48]	;dword
57
fb_select_flag			equ dword [edi+52]	;dword
58
fb_background_color		equ dword [edi+56]	;dword
59
fb_select_color			equ dword [edi+60]	;dword
60
fb_seclect_text_color		equ dword [edi+64]	;dword
61
fb_text_color			equ dword [edi+68]	;dword
62
fb_reduct_text_color		equ dword [edi+72]	;dword
63
fb_marked_text_color		equ dword [edi+76]	;dword
64
fb_max_panel_line		equ dword [edi+80]	;dword
65
fb_select_panel_counter		equ dword [edi+84]	;dword
66
fb_folder_block			equ dword [edi+88]	;dword
67
fb_start_draw_line		equ dword [edi+92]	;dword
68
fb_start_draw_cursor_line	equ word [edi+96]	;word
69
fb_folder_data			equ dword [edi+98]	;dword
70
fb_temp_counter			equ dword [edi+102]	;dword
71
fb_file_name_length		equ dword [edi+106]	;dword
72
fb_marked_file			equ dword [edi+110]	;dword
73
fb_extension_size		equ dword [edi+114]	;dword
74
fb_extension_start		equ dword [edi+118]	;dword
75
fb_type_table			equ dword [edi+122]	;dword
76
fb_ini_file_start		equ dword [edi+126]	;dword
77
fb_ini_file_end			equ dword [edi+130]	;dword
78
fb_draw_scroll_bar		equ dword [edi+134]	;dword
79
fb_font_size_y			equ word [edi+138]	;dword
80
fb_font_size_x			equ word [edi+140]	;dword
81
fb_mouse_keys			equ dword [edi+142]	;dword
82
fb_mouse_keys_old		equ dword [edi+146]	;dword
83
fb_mouse_pos			equ dword [edi+150]	;dword
84
fb_mouse_keys_delta		equ dword [edi+154]	;dword
85
fb_mouse_key_delay		equ dword [edi+158]	;dword
86
fb_mouse_keys_tick		equ dword [edi+162]	;dword
87
fb_start_draw_cursor_line_2	equ word [edi+166]	;dword
88
fb_all_redraw			equ dword [edi+168]	;dword
89
fb_selected_BDVK_adress		equ dword [edi+172]	;dword
90
fb_key_action			equ dword [edi+176]	;dword
91
fb_name_temp_area		equ dword [edi+180]	;dword
92
fb_max_name_temp_size		equ dword [edi+184]	;dword
93
fb_display_name_max_length	equ dword [edi+188]	;dword
94
fb_draw_panel_selection_flag	equ dword [edi+192]	;dword
95
fb_mouse_pos_old		equ dword [edi+196]	;dword
96
fb_marked_counter		equ dword [edi+200]	;dword
97
;---------------------------------------------------------------------
98
fb_draw_panel:
99
	pusha
100
	mov	edi,dword [esp+36]
101
	call	fb_clear_panel
102
	call	fb_calc_max_panel_line
103
	call	fb_calc_folder_sysdata
104
	call	fb_draw_panel_selection
105
	call	fb_draw_folder_data
106
file_browser_exit
107
;---------------------------------------------------------------------
108
fb_draw_panel_1:
109
	pusha
110
	mov	eax,fb_select_color
111
	push	eax
112
	mov	eax,fb_seclect_text_color
113
	push	eax
114
	mov	ax,fb_start_draw_cursor_line
115
	push	eax
116
	mov	eax,fb_background_color
117
	mov	fb_select_color,eax
118
	mov	eax,fb_text_color
119
	mov	fb_seclect_text_color,eax
120
	mov	ax,fb_start_draw_cursor_line_2
121
	mov	fb_start_draw_cursor_line,ax
122
	call	fb_draw_panel_selection
123
	pop	eax
124
	mov	fb_start_draw_cursor_line,ax
125
	pop	eax
126
	mov	fb_seclect_text_color,eax
127
	pop	eax
128
	mov	fb_select_color,eax
129
	call	fb_draw_panel_selection
130
	call	fb_draw_folder_data
131
	popa
132
	ret
133
;---------------------------------------------------------------------
134
fb_clear_panel:
135
	cmp	fb_all_redraw,dword 1
136
	jne	@f
137
	xor	eax,eax
138
	mov	fb_max_name_temp_size,eax
139
@@:
140
	ret
141
;---------------------------------------------------------------------
142
fb_calc_folder_sysdata:
143
	mov	eax,fb_folder_data
144
	mov	eax,[eax+4]
145
	mov	fb_folder_block,eax
146
	ret
147
;---------------------------------------------------------------------
148
fb_calc_max_panel_line:
149
	xor	eax,eax
150
	xor	ebx,ebx
151
	mov	ax,fb_size_y
152
	mov	bx,fb_line_size_y
153
	test	ebx,ebx
154
	jnz	@f
155
	inc	ebx
156
@@:
157
	xor	edx,edx
158
	div	ebx
159
	mov	fb_max_panel_line,eax
160
	ret
161
;---------------------------------------------------------------------
162
fb_draw_panel_selection:
163
	cmp	fb_all_redraw,dword 2
164
	je	.end
165
	xor	eax,eax
166
	cmp	fb_select_panel_counter,eax
167
	je	.end
168
	mov	eax,fb_folder_block
169
	sub	eax,fb_start_draw_line
170
	mov	cx,fb_start_draw_cursor_line
171
	call	fb_for_all_panel_selection
172
	mov	eax,fb_folder_block
173
	dec	eax
174
	xor	edx,edx
175
	mov	dx,fb_line_size_y
176
	imul	eax,edx
177
	cmp	ax,cx
178
	jae	@f
179
	mov	cx,ax
180
@@:
181
	mov	fb_start_draw_cursor_line,cx
182
	mov	ebx,fb_size_x
183
	add	cx,fb_start_y
184
.1:
185
	shl	ecx,16
186
	mov	cx,fb_line_size_y
187
	mov	edx,fb_select_color
188
	xor	eax,eax
189
	mov	ax,fb_icon_size_x
190
	add	eax,2
191
	sub	ebx,eax
192
	shl	eax,16
193
	push	eax
194
	add	ebx,eax
195
	mcall	13
196
	pop	ebx
197
	cmp	fb_all_redraw,dword 0
198
	je	.end
199
	mov	bx,fb_start_x
200
	ror	ebx,16
201
	mcall	13,,,fb_background_color
202
.end:
203
	ret
204
;---------------------------------------------------------------------
205
fb_for_all_panel_selection:
206
;	dec	eax
207
	xor	edx,edx
208
	mov	dx,fb_line_size_y
209
	imul	eax,edx
210
	cmp	ax,cx
211
	jae	@f
212
	mov	cx,ax
213
@@:
214
	mov	eax,fb_max_panel_line
215
	dec	eax
216
	imul	eax,edx
217
	cmp	ax,cx
218
	jae	@f
219
	mov	cx,ax
220
@@:
221
	ret
222
;---------------------------------------------------------------------
223
fb_draw_folder_data:
224
	mov	eax,fb_folder_block
225
	sub	eax,fb_max_panel_line
226
	test	eax,0x8000000
227
	jz	.ok_left
228
	mov	fb_start_draw_line,0
229
	jmp	@f
230
.ok_left:
231
	cmp	eax,fb_start_draw_line
232
	jae	@f
233
	mov	fb_start_draw_line,eax
234
@@:
235
	mov	bx,fb_start_x
236
	add	bx,3
237
	add	bx,fb_icon_size_x
238
	shl	ebx,16
239
	mov	bx,fb_start_y
240
	mov	edx,fb_start_draw_line
241
	imul	edx,304
242
	add	edx,fb_folder_data
243
	add	edx,32+40
244
	xor	eax,eax
245
.start:
246
	pusha
247
	mov	eax,edx
248
	sub	eax,fb_folder_data
249
	sub	eax,32+40
250
	xor	edx,edx
251
	mov	ebx,304
252
	div	ebx
253
	cmp	eax,fb_folder_block
254
	je	.end_1
255
;.continue_1:
256
	popa
257
	cmp	eax,fb_max_panel_line
258
	je	.end_2
259
	mov	fb_marked_file,0
260
	cmp	[edx+299-40],byte 0
261
	je	@f
262
	mov	fb_marked_file,1
263
@@:
264
	call	fb_clear_line
265
	call	fb_draw_type_size_date
266
	cmp	fb_all_redraw,dword 2
267
	je	.draw_icon
268
	cmp	fb_all_redraw,dword 0
269
	je	@f
270
.draw_icon:
271
	call	fb_draw_icon
272
@@:
273
	push	eax
274
	xor	eax,eax
275
	mov	ax,fb_size_x
276
	push	ebx edx
277
	xor	ebx,ebx
278
	mov	bx,fb_font_size_x
279
	xor	edx,edx
280
	div	ebx
281
	pop	edx ebx
282
	sub	eax,23+2+2
283
	mov	esi,fb_file_name_length
284
	mov	fb_temp_counter,0
285
	mov	fb_display_name_max_length,eax
286
	cmp	esi,eax
287
	jbe	@f
288
	mov	esi,eax
289
	mov	fb_temp_counter,1
290
@@:
291
	cmp	fb_max_name_temp_size,esi
292
	jae	@f
293
	mov	fb_max_name_temp_size,esi
294
	inc	fb_max_name_temp_size
295
@@:
296
	mov	ecx,fb_text_color
297
	cmp	fb_marked_file,0
298
	je	@f
299
	mov	ecx,fb_reduct_text_color	;0xff0000
300
@@:
301
	mov	ax,fb_line_size_y
302
	sub	ax,fb_font_size_y
303
 
304
	push	ebx
305
	mov	bx,ax
306
	shr	ax,1
307
	test	bx,1b
308
	jz	@f
309
	inc	ax
310
@@:
311
	pop	ebx
312
 
313
	push	ebx
314
	add	bx,ax
315
	call	.draw_name_temp_area
316
	xor	eax,eax
317
	mov	ax,fb_font_size_x
318
	imul	eax,fb_display_name_max_length
319
	shl	eax,16
320
	push	edx
321
	add	ebx,eax
322
	mov	esi,2
323
	mov	ecx,fb_reduct_text_color	;0xff0000
324
	mov	edx,dword fb_truncated_filename_char
325
	cmp	fb_temp_counter,0
326
	jne	@f
327
	mov	edx,dword fb_truncated_filename_clear
328
	mov	ecx,fb_text_color
329
@@:
330
	push	edi
331
 
332
	and	ecx,0x30ffffff
333
	add	ecx,0x40000000
334
	mov	eax,fb_background_color
335
	cmp	fb_draw_panel_selection_flag,1
336
	jne	@f
337
	mov	eax,fb_select_color
338
@@:
339
	mov	edi,eax
340
	mcall	4
341
	pop	edi
342
	cmp	fb_temp_counter,0
343
	je	.continue_1
344
	push	edi
345
 
346
	mov	eax,fb_background_color
347
	cmp	fb_draw_panel_selection_flag,1
348
	jne	@f
349
	mov	eax,fb_select_color
350
@@:
351
	mov	edi,eax
352
 
353
	add	ebx,1 shl 16
354
	mcall	4
355
	pop	edi
356
.continue_1:
357
	pop	edx
358
.continue:
359
	pop	ebx
360
	add	bx,fb_line_size_y
361
	add	edx,304
362
	pop	eax
363
	inc	eax
364
	jmp	.start
365
;--------------------------------------
366
.draw_name_temp_area:
367
	pusha
368
	mov	ebx,esi
369
	mov	eax,dword '    '
370
	mov	ecx,256/4
371
	cld
372
 
373
	push	edi
374
	mov	edi,fb_name_temp_area
375
	rep	stosd
376
	pop	edi
377
 
378
	mov	esi,edx
379
	mov	ecx,ebx
380
	cld
381
	mov	edi,fb_name_temp_area
382
	rep	movsb
383
	popa
384
 
385
	pusha
386
	mov	edx,fb_name_temp_area
387
 
388
	cmp	fb_all_redraw,dword 2
389
	jne	.draw_name_temp_area_1
390
	mov	esi,fb_max_name_temp_size
391
	and	ecx,0xffffff
392
	add	ecx,0x40000000
393
 
394
	mov	eax,fb_background_color
395
	cmp	fb_draw_panel_selection_flag,1
396
	jne	@f
397
	mov	eax,fb_select_color
398
@@:
399
	mov	edi,eax
400
.draw_name_temp_area_1:
401
	mcall	4
402
	popa
403
 
404
	ret
405
;--------------------------------------
406
.end_1:
407
	popa
408
.end_2:
409
	cmp	fb_all_redraw,dword 1
410
	jne	@f
411
 
412
	mov	ax,fb_start_y
413
	add	ax,fb_size_y
414
	mov	cx,bx
415
	rol	ecx,16
416
	mov	cx,ax
417
	mov	eax,ecx
418
	shr	eax,16
419
	sub	cx,ax
420
	cmp	cx,0
421
	jbe	@f
422
	mov	bx,fb_size_x
423
	ror	ebx,16
424
	sub	bx,fb_icon_size_x
425
	sub	bx,3
426
	rol	ebx,16
427
	mov	edx,fb_background_color	;0xffffff
428
	mcall	13
429
@@:
430
 
431
.end:
432
;	mov	fb_draw_scroll_bar,dword 1
433
	ret
434
;---------------------------------------------------------------------
435
fb_clear_line:
436
	mov	fb_draw_panel_selection_flag,0
437
	pusha
438
	shl	ebx,16
439
	shr	ebx,16
440
;	dec	ebx
441
	cmp	fb_select_panel_counter,0
442
	je	.continue
443
	mov	ax,fb_start_draw_cursor_line
444
	add	ax,fb_start_y
445
	cmp	bx,ax
446
	jne	.continue
447
	mov	fb_draw_panel_selection_flag,1
448
	jmp	.end
449
.continue:
450
	cmp	fb_all_redraw,dword 2
451
	je	.end
452
	cmp	fb_all_redraw,dword 0
453
	je	.end
454
	mov	ebx,[esp+16]
455
	mov	cx,bx
456
;	dec	cx
457
	rol	ecx,16
458
	mov	cx,fb_line_size_y
459
	mov	bx,fb_size_x
460
	ror	ebx,16
461
	sub	bx,fb_icon_size_x
462
	sub	bx,3
463
	rol	ebx,16
464
	mov	edx,fb_background_color
465
	mcall	13
466
.end:
467
	popa
468
	ret
469
;---------------------------------------------------------------------
470
fb_draw_type_size_date:
471
	pusha
472
	mov	eax,fb_type_table
473
	test	[edx-40],byte 0x10
474
	jz	.copy_type
475
	mov	[eax],dword '
476
	mov	[eax+4],word '> '
477
	mov	fb_file_name_length,0
478
	mov	fb_extension_size,0
479
	jmp	.start
480
.copy_type:
481
	mov	[eax],dword '	'
482
	mov	[eax+4],word '	'
483
.start:
484
	mov	esi,edx
485
	xor	eax,eax
486
@@:
487
	cld
488
	lodsb
489
	test	eax,eax
490
	jnz	@b
491
	mov	fb_file_name_length,esi
492
	sub	fb_file_name_length,edx
493
	mov	fb_temp_counter,esi
494
	test	[edx-40],byte	0x10
495
	jnz	.size
496
;@@:
497
	dec	esi
498
	dec	edx
499
@@:
500
	std
501
	lodsb
502
	cmp	esi,edx
503
	je	.extension_size_0
504
	cmp	al,'.'
505
	jnz	@b
506
	add	esi,2
507
	mov	fb_extension_start,esi
508
	mov	ecx,fb_temp_counter
509
	sub	ecx,esi
510
	inc	ecx
511
	mov	fb_extension_size,ecx
512
	sub	fb_file_name_length,ecx
513
	cmp	ecx,2
514
	ja	@f
515
	inc	fb_file_name_length
516
@@:
517
	sub	ecx,2
518
	cmp	ecx,4
519
	jbe	@f
520
	mov	ecx,3
521
	mov	eax,fb_type_table
522
	mov	[eax+3],word '..'
523
@@:
524
	push	edi
525
	mov	edi,fb_type_table
526
	cld
527
	rep	movsb
528
	pop	edi
529
	inc	edx
530
	jmp	.size
531
.extension_size_0:
532
	inc	edx
533
	mov	fb_extension_size,0
534
.size:
535
	mov	eax,fb_type_table
536
	test	[edx-40],byte 0x10
537
	jz	.copy_size
538
	mov	[eax+6],dword '----'
539
	mov	[eax+6+4],word '- '
540
	jmp	.date
541
;-----------------------------------------
542
.call_decimal_string:
543
	mov	ebx,fb_type_table
544
	add	ebx,6
545
	call	fb_decimal_string_4
546
	mov	[ebx],dl
547
	jmp	.size_convert_end
548
;-----------------------------------------
549
.copy_size:
550
;/0x40000000 - Gb
551
;/0x100000 - Mb
552
;/0x400 Kb
553
	mov	[eax+6],dword '    '
554
	mov	[eax+6+4],word '  '
555
	push	ebx
556
	push	edx
557
	mov	eax,[edx-40+32]
558
	mov	ebx,eax
559
	shr	eax,30 ; /(1024*1024*1024)
560
	test	eax,eax
561
	jz	@f
562
	mov	dl,byte 'G'
563
	jmp	.call_decimal_string
564
@@:
565
	mov	eax,ebx
566
	shr	eax,20 ; /(1024*1024)
567
	test	eax,eax
568
	jz	@f
569
	mov	dl,byte 'M'
570
	jmp	.call_decimal_string
571
@@:
572
	mov	eax,ebx
573
	shr	eax,10 ; /1024
574
	test	eax,eax
575
	jz	@f
576
	mov	dl,byte 'K'
577
	jmp	.call_decimal_string
578
@@:
579
	mov	eax,ebx
580
;.size_convert:
581
	mov	ebx,fb_type_table
582
	add	ebx,6
583
	call	fb_decimal_string_4
584
.size_convert_end:
585
	mov	eax,fb_type_table
586
	add	eax,6
587
	push	edi
588
	cmp	[eax],byte '0'
589
	jne	@f
590
	mov	[eax],byte ' '
591
@@:
592
	add	eax,3
593
@@:
594
	cmp	[eax+1],byte ' '
595
	jne	@f
596
	mov	esi,eax
597
	mov	edi,esi
598
	inc	edi
599
	mov	ecx,5
600
	std
601
	rep	movsb
602
	jmp	@r
603
@@:
604
	pop	edi
605
	pop	edx
606
	pop	ebx
607
;-----------------------------------------
608
.date:
609
	xor	eax,eax
610
	mov	al,[edx-40+28]
611
	push	ebx
612
	mov	ebx,fb_type_table
613
	add	ebx,12
614
	call	fb_decimal_string_2 ; day
615
	mov	al,[edx-40+29]
616
	mov	ebx,fb_type_table
617
	add	ebx,12+3
618
	call	fb_decimal_string_2 ; month
619
	mov	ax,[edx-40+30]
620
	mov	ebx,fb_type_table
621
	add	ebx,12+15
622
	call	fb_decimal_string_4 ; year
623
	mov	ebx,fb_type_table
624
	mov	ax,[ebx+12+15+2]
625
	mov	[ebx+12+6],ax
626
	pop	ebx
627
;-----------------------------------------
628
	ror	ebx,16
629
	add	bx,fb_size_x
630
	sub	ebx,122+12+15
631
	rol	ebx,16
632
	mov	ecx,fb_text_color
633
	cmp	fb_marked_file,0
634
	je	@f
635
	mov	ecx,fb_reduct_text_color	;0xff0000
636
@@:
637
	mov	edx,fb_type_table
638
	mov	esi,20
639
 
640
	mov	ax,fb_line_size_y
641
	sub	ax,fb_font_size_y
642
 
643
	push	ebx
644
	mov	bx,ax
645
	shr	ax,1
646
	test	bx,1b
647
	jz	@f
648
	inc	ax
649
@@:
650
	pop	ebx
651
	add	bx,ax
652
	cmp	fb_all_redraw,dword 2
653
	jne	.draw  ;@f
654
	and	ecx,0xffffff
655
	add	ecx,0x40000000
656
 
657
	mov	eax,fb_background_color
658
	cmp	fb_draw_panel_selection_flag,1
659
	jne	@f
660
	mov	eax,fb_select_color
661
@@:
662
	mov	edi,eax
663
.draw:
664
	mcall	4
665
	popa
666
	ret
667
;---------------------------------------------------------------------
668
fb_draw_icon:
669
	pusha
670
	xor	eax,eax
671
	mov	ax,fb_icon_size_y
672
	mov	ebx,fb_resolution_raw
673
	imul	eax,ebx
674
	mov	bx,fb_icon_size_x
675
	imul	eax,ebx
676
	mov	ebx,eax
677
	shr	eax,3
678
	test	ebx,111b
679
	jz	@f
680
	inc	eax
681
@@:
682
	test	[edx-40],byte 0x10
683
	jnz	.draw_dir_pic
684
 
685
	call	fb_get_icon_number
686
;	mov	ebx,2
687
	imul	ebx,eax	;16*16*3
688
	jmp	.draw
689
.draw_dir_pic:
690
	xor	ebx,ebx
691
	cmp	[edx],word '..'
692
	jne	.draw
693
	mov	ebx,eax	;16*16*3
694
.draw:
695
	add	ebx,fb_icon_raw_area
696
	mov	cx,fb_icon_size_x
697
	shl	ecx,16
698
	mov	cx,fb_icon_size_y
699
 
700
	mov	edx,[esp+16]
701
	ror	edx,16
702
	sub	edx,2
703
	sub	dx,fb_icon_size_x
704
	rol	edx,16
705
 
706
	mov	ax,fb_line_size_y
707
	sub	ax,fb_icon_size_y
708
	shr	ax,1
709
	add	dx,ax
710
 
711
	mov	esi,fb_resolution_raw
712
 
713
	xor	ebp,ebp
714
 
715
	push	edi
716
	mov	edi,fb_palette_raw
717
	mcall	65
718
	pop	edi
719
	popa
720
	ret
721
;---------------------------------------------------------------------
722
; Convert of a binary number in decimal string form
723
; Input:
724
;  AX - value
725
;  EBX - address of string
726
; Output:
727
;  string contains the number, marked the end of the code 0
728
fb_decimal_string_2:
729
	push	eax ebx ecx edx
730
	xor	ecx,ecx
731
	mov	[ebx],byte '0'
732
	inc	ebx
733
.p3:
734
	xor	edx,edx
735
	push	ebx
736
	mov	ebx,10
737
	div	ebx
738
	pop	ebx
739
	add	edx,48
740
	push	edx
741
	inc	ecx
742
	cmp	ax,0
743
	jne	.p3
744
	cmp	ecx,1
745
	jbe	.p4
746
	mov	ecx,2
747
	dec	ebx
748
.p4:
749
	pop	edx
750
	mov	[ebx],dl
751
	inc	ebx
752
	loop	.p4
753
	pop	edx ecx ebx eax
754
	ret
755
;---------------------------------------------------------------------
756
fb_decimal_string_4:
757
	push	eax ecx edx
758
	xor	ecx,ecx
759
	mov	[ebx],byte '0'
760
	inc	ebx
761
.p3:
762
	xor	edx,edx
763
	push	ebx
764
	mov	ebx,10
765
	div	ebx
766
	pop	ebx
767
	add	edx,48
768
	push	edx
769
	inc	ecx
770
	cmp	eax,0
771
	jne	.p3
772
	cmp	ecx,3
773
	jbe	.p4
774
	mov	ecx,4
775
	dec	ebx
776
.p4:
777
	pop	edx
778
	mov	[ebx],dl
779
	inc	ebx
780
	loop	.p4
781
	pop	edx ecx eax
782
	ret
783
;---------------------------------------------------------------------
784
fb_get_icon_number:
785
	push	eax
786
	mov	ebp,fb_extension_size
787
	test	ebp,ebp
788
	je	.end
789
	dec	ebp
790
	test	ebp,ebp
791
	je	.end
792
	dec	ebp
793
	test	ebp,ebp
794
	je		.end
795
@@:
796
	mov	edx,fb_ini_file_end
797
	sub	edx,ebp
798
	mov	eax,fb_ini_file_start
799
	dec	eax
800
.search_association:
801
	cmp	edx,eax
802
	jbe	.end
803
	mov	esi,fb_extension_start
804
	inc	eax
805
	mov	ecx,eax
806
	mov	ebx,eax
807
	cld
808
.check:
809
	lodsb
810
	test	al,al
811
	jz	@f
812
	call	fb_char_toupper
813
	shl	ax,8
814
	mov	al,[ebx]
815
	inc	ebx
816
	call	fb_char_toupper
817
	cmp	al,ah
818
	je	.check
819
	mov	eax,ecx
820
	jmp	.search_association
821
@@:
822
	mov	eax,ecx
823
	mov	esi,eax
824
	add	esi,ebp
825
	cmp	[esi],byte '='
826
	jne	.search_association
827
	inc	esi
828
	xor	ebx,ebx
829
	xor	eax,eax
830
	mov	ecx,9
831
	call	.calculate
832
	cmp al,0x30
833
	jb	.end
834
	cmp	al,0x39
835
	ja	.end
836
	sub	eax,0x30
837
@@:
838
	call	.calculate_1
839
	cmp al,0x30
840
	jb	@f
841
	cmp	al,0x39
842
	ja	@f
843
	sub	eax,0x30
844
 
845
	lea ebx,[ebx+ebx*4]
846
	shl	ebx,1
847
 
848
	dec	ecx
849
	jnz	@b
850
@@:
851
	pop	eax
852
	ret
853
.end:
854
	mov	ebx,2
855
	pop	eax
856
	ret
857
;---------------------------------------------------------------------
858
.calculate_1:
859
	add	ebx,eax
860
.calculate:
861
	xor	eax,eax
862
	cld
863
	lodsb
864
	ret
865
;---------------------------------------------------------------------
866
fb_char_toupper:
867
; convert character to uppercase, using cp866 encoding
868
; in: al=symbol
869
; out: al=converted symbol
870
	cmp	al,'a'
871
	jb	.ret
872
	cmp	al, 'z'
873
	jbe	.az
874
	cmp	al, ' '
875
	jb	.ret
876
	cmp	al, 'à'
877
	jb	.rus1
878
	cmp	al, 'ï'
879
	ja	.ret
880
; 0xE0-0xEF -> 0x90-0x9F
881
	sub	al, 'à'-''
882
.ret:
883
	ret
884
.rus1:
885
; 0xA0-0xAF -> 0x80-0x8F
886
.az:
887
	and	al, not 0x20
888
	ret
889
;---------------------------------------------------------------------
890
fb_truncated_filename_char:
891
	db	'..'
892
fb_truncated_filename_clear:
893
	db	'  '
894
;---------------------------------------------------------------------
895
;*****************************************************************************
896
;*****************************************************************************
897
; mouse event
898
;*****************************************************************************
899
;*****************************************************************************
900
fb_mouse:
901
	pusha
902
	mov	edi,dword [esp+36]
903
;-------------------------------------------------------
904
	mcall	37,2
905
	mov	ebx,fb_mouse_keys
906
	mov	fb_mouse_keys_old,ebx
907
	mov	fb_mouse_keys,eax
908
 
909
	mcall	37,1
910
	mov	ebx,fb_mouse_pos
911
	mov	fb_mouse_pos_old,ebx
912
	mov	fb_mouse_pos,eax
913
 
914
	test	eax,0x80000000
915
	jnz	.exit_fb
916
	test	eax,0x8000
917
	jnz	.exit_fb
918
 
919
	mov	ebx,eax
920
	shr	ebx,16	; x position
921
	shl	eax,16
922
	shr	eax,16	; y position
923
 
924
	mov	cx,fb_start_x
925
	cmp	bx,cx
926
	jb	.exit_fb
927
 
928
	add	cx,fb_size_x
929
	cmp	bx,cx
930
	ja	.exit_fb
931
 
932
	mov	cx,fb_start_y
933
	cmp	ax,cx
934
	jb	.exit_fb
935
 
936
	add	cx,fb_size_y
937
	cmp	ax,cx
938
	ja	.exit_fb
939
;-------------------------------------------------------
940
	cmp	fb_mouse_keys_delta,1
941
	je	.enter_1
942
 
943
	cmp	fb_mouse_keys,0
944
	jz	.exit_fb
945
.start:
946
	sub	ax,fb_start_y
947
	xor	ebx,ebx
948
	mov	bx,fb_line_size_y
949
	xor	edx,edx
950
	push	eax
951
	div	ebx
952
	pop	eax
953
	sub	eax,edx
954
	xor	edx,edx
955
	cmp	fb_select_panel_counter,edx
956
	jne	@f
957
	mov	fb_mouse_keys_delta,0
958
	jmp	.continue
959
@@:
960
	xor	edx,edx
961
	cmp	fb_start_draw_cursor_line,ax
962
	jne	@f
963
	cmp	fb_mouse_keys,edx
964
	jnz	.continue
965
@@:
966
	mov	fb_mouse_keys_delta,edx
967
.continue:
968
	xor	ebx,ebx
969
	mov	bx,fb_line_size_y
970
	imul	ebx,fb_folder_block
971
	cmp	eax,ebx
972
	jb	@f
973
	xor	edx,edx
974
	mov	dx,fb_line_size_y
975
	sub	ebx,edx
976
	cmp	bx,fb_start_draw_cursor_line
977
	je	.enter
978
	call	.store_old_cursor_line
979
	mov	fb_start_draw_cursor_line,bx
980
	jmp	.continue_1
981
@@:
982
	cmp	ax,fb_start_draw_cursor_line
983
	je	.enter
984
	call	.store_old_cursor_line
985
	mov	fb_start_draw_cursor_line,ax
986
.continue_1:
987
	test	fb_mouse_keys,10b
988
	jne	.mark_mouse
989
	jmp	.enter_1
990
.continue_2:
991
	mov	ax,fb_start_draw_cursor_line
992
	cmp	ax,fb_start_draw_cursor_line_2
993
	je	.exit_fb
994
 
995
	call	fb_draw_panel_1
996
	jmp	.exit_fb
997
.enter:
998
	cmp	fb_mouse_keys_delta,2
999
	je	.enter_2
1000
	cmp	fb_mouse_keys_delta,1
1001
	je	.enter_1
1002
	mov	eax,fb_mouse_keys_old
1003
	cmp	fb_mouse_keys,eax
1004
	jz	.exit_fb
1005
	test	fb_mouse_keys,10b
1006
	jne	.mark_mouse
1007
	xor	edx,edx
1008
	inc	edx
1009
	mov	fb_mouse_keys_delta,edx
1010
	jmp	.exit_fb
1011
.enter_1:
1012
	mov	eax,fb_mouse_keys_old
1013
	cmp	fb_mouse_keys,eax
1014
	jz	.exit_fb
1015
	test	fb_mouse_keys,10b
1016
	jne	.mark_mouse
1017
	mov	edx,2
1018
	mov	fb_mouse_keys_delta,edx
1019
	mcall	26,9
1020
	add	eax,fb_mouse_key_delay
1021
	mov	fb_mouse_keys_tick,eax
1022
	jmp	.continue_2
1023
.enter_2:
1024
	mcall	26,9
1025
	cmp	eax,fb_mouse_keys_tick
1026
	ja	@f
1027
;	mov	eax,fb_mouse_pos_old
1028
;	cmp	eax,fb_mouse_pos
1029
;	jne	@f
1030
	mov	eax,fb_mouse_keys_old
1031
	cmp	fb_mouse_keys,eax
1032
	jz	@f
1033
	test	fb_mouse_keys,10b
1034
	jne	.mark_mouse
1035
	call	.enter_3
1036
	jmp	.exit_fb
1037
@@:
1038
	xor	eax,eax
1039
	inc	eax
1040
	mov	fb_mouse_keys_delta,eax
1041
;-------------------------------------------------------
1042
.exit_fb:
1043
file_browser_exit
1044
;-------------------------------------------------------
1045
.mark_mouse:
1046
	call	fb_key.mark_1
1047
	call	fb_draw_panel_1
1048
	xor	eax,eax
1049
	mov	fb_mouse_keys_delta,eax
1050
	jmp	.exit_fb
1051
;-------------------------------------------------------
1052
.enter_3:
1053
	xor	eax,eax
1054
	mov	fb_mouse_keys,eax
1055
	mov	fb_mouse_keys_old,eax
1056
	mov	eax,3
1057
	mov	fb_mouse_keys_delta,eax
1058
	xor	eax,eax
1059
	mov	ax,fb_start_draw_cursor_line
1060
	xor	ebx,ebx
1061
	mov	bx,fb_line_size_y
1062
	xor	edx,edx
1063
	div	ebx
1064
	add	eax,fb_start_draw_line
1065
	imul	eax,304
1066
	add	eax,32
1067
	add	eax,fb_folder_data
1068
	mov	fb_selected_BDVK_adress,eax
1069
	xor	eax,eax
1070
	mov	fb_max_name_temp_size,eax
1071
	ret
1072
;-------------------------------------------------------
1073
.store_old_cursor_line:
1074
	push	eax
1075
	mov	ax,fb_start_draw_cursor_line
1076
	mov	fb_start_draw_cursor_line_2,ax
1077
	xor	eax,eax
1078
;	mov	fb_mouse_keys_delta,eax
1079
	pop	eax
1080
	ret
1081
;*****************************************************************************
1082
;*****************************************************************************
1083
; key event
1084
; 1 - arrow down
1085
; 2 - arrow up
1086
; 3 - PageDown
1087
; 4 - PageUp
1088
; 5 - Home
1089
; 6 - End
1090
; 7 - Enter
1091
; 8 - Insert (Mark)
1092
; 9 - Mark All
1093
; 10 - Unmark All
1094
; 11 - Invert Mark
1095
;*****************************************************************************
1096
;*****************************************************************************
1097
fb_key:
1098
	pusha
1099
	mov	edi,dword [esp+36]
1100
;-------------------------------------------------------
1101
	mov	eax,fb_key_action
1102
	shl	eax,2
1103
	add	eax,dword fb_key_table
1104
	cmp	eax,fb_key_table.end
1105
	jae	.exit_fb
1106
	cmp	[eax],dword 0
1107
	je	.exit_fb
1108
	jmp	dword [eax]
1109
;-------------------------------------------------------
1110
.arrow_down:
1111
	mov	ax,fb_start_draw_cursor_line
1112
	add	ax,fb_line_size_y
1113
	add	ax,fb_line_size_y
1114
	cmp	ax,word fb_size_y
1215 mario79 1115
	ja	@f
1199 mario79 1116
.add_1:
1117
	call	fb_mouse.store_old_cursor_line
1118
	mov	ax,fb_start_draw_cursor_line
1119
	add	ax,fb_line_size_y
1120
	mov	fb_start_draw_cursor_line,ax
1121
	call	fb_draw_panel_1
1122
	jmp	.exit_fb
1123
@@:
1124
	mov	eax,fb_folder_block
1125
	sub	eax,fb_max_panel_line
1126
	test	eax,0x80000000
1127
	jnz	.page_down_2
1128
 
1129
	call	.prepare_data_down
1130
	ja	@f
1131
 
1132
	cmp	fb_start_draw_line,eax
1133
	je	.exit_fb
1134
@@:
1135
	inc	fb_start_draw_line
1136
	call	fb_draw_panel_3
1137
	jmp	.exit_fb
1138
;-------------------------------------------------------
1139
.arrow_up:
1140
	mov	ax,fb_start_draw_cursor_line
1141
	add	ax,fb_start_y
1142
	cmp	fb_start_y,ax
1143
	je	@f
1144
	call	fb_mouse.store_old_cursor_line
1145
	mov	ax,fb_start_draw_cursor_line
1146
	sub	ax,fb_line_size_y
1147
	mov	fb_start_draw_cursor_line,ax
1148
	call	fb_draw_panel_1
1149
	jmp	.exit_fb
1150
@@:
1151
	cmp	fb_start_draw_line,0
1152
	je	.exit_fb
1153
	dec	fb_start_draw_line
1154
	call	fb_draw_panel_3
1155
	jmp	.exit_fb
1156
;-------------------------------------------------------
1157
.page_down:
1158
	mov	eax,fb_max_panel_line
1159
	mov	ebx,fb_folder_block
1160
	sub	ebx,eax
1161
	test	ebx,0x80000000
1162
	jnz	.page_down_2
1163
	sub	ebx,fb_start_draw_line
1164
	cmp	ebx,eax
1165
	ja	.page_down_3
1166
	mov	ebx,fb_folder_block
1167
	sub	ebx,eax
1168
	call	.prepare_data_down
1169
	ja	@f
1170
	cmp	ebx,fb_start_draw_line
1171
	je	.exit_fb
1172
@@:
1173
	mov	fb_start_draw_line,ebx
1174
.page_down_0:
1175
	dec	eax
1176
	xor	ebx,ebx
1177
	mov	bx,fb_line_size_y
1178
	imul	eax,ebx
1179
.page_down_1:
1180
	call	fb_mouse.store_old_cursor_line
1181
	mov	fb_start_draw_cursor_line,ax
1182
	call	fb_draw_panel_2
1183
	jmp	.exit_fb
1184
.page_down_2:
1185
	mov	eax,fb_folder_block
1186
	sub	eax,fb_start_draw_line
1187
	dec	eax
1188
	xor	ebx,ebx
1189
	mov	bx,fb_line_size_y
1190
	imul	eax,ebx
1191
	cmp	ax,fb_start_draw_cursor_line
1192
	jbe	.exit_fb
1193
	jmp	.page_down_1
1194
.page_down_3:
1195
	add	fb_start_draw_line,eax
1196
	call	fb_draw_panel_2
1197
	jmp	.exit_fb
1198
;-------------------------------------------------------
1199
.prepare_data_down:
1200
	mov	ecx,fb_folder_block
1201
	sub	ecx,fb_start_draw_line
1202
	dec	ecx
1203
	xor	edx,edx
1204
	mov	dx,fb_line_size_y
1205
	imul	ecx,edx
1206
	cmp	cx,fb_start_draw_cursor_line
1207
	ret
1208
;-------------------------------------------------------
1209
.page_up:
1210
	mov	eax,fb_max_panel_line
1211
	mov	ebx,fb_start_draw_line
1212
	sub	ebx,eax
1213
	test	ebx,0x8000000
1214
	jz	@f
1215
	cmp	fb_start_draw_line,0
1216
	jne	.page_up_1
1217
	cmp	fb_start_draw_cursor_line,0
1218
	je	.exit_fb
1219
	mov	fb_start_draw_cursor_line,0
1220
.page_up_1:
1221
	mov	fb_start_draw_line,0
1222
	call	fb_draw_panel_2
1223
	jmp	.exit_fb
1224
@@:
1225
	sub	fb_start_draw_line,eax
1226
	call	fb_draw_panel_2
1227
	jmp	.exit_fb
1228
;-------------------------------------------------------
1229
.home:
1230
	cmp	fb_start_draw_line,0
1231
	jne	@f
1232
	cmp	fb_start_draw_cursor_line,0
1233
	je	.exit_fb
1234
@@:
1235
	mov	fb_start_draw_line,0
1236
	mov	fb_start_draw_cursor_line,0
1237
	call	fb_mouse.store_old_cursor_line
1238
	call	fb_draw_panel_2
1239
	jmp	.exit_fb
1240
;-------------------------------------------------------
1241
.end:
1242
	mov	eax,fb_folder_block
1243
	sub	eax,fb_max_panel_line
1244
	test	eax,0x80000000
1245
	jnz	.page_down_2
1246
	call	.prepare_data_down
1247
	ja	@f
1248
	cmp	eax,fb_start_draw_line
1249
	je	.exit_fb
1250
@@:
1251
	mov	fb_start_draw_line,eax
1252
	mov	eax,fb_max_panel_line
1253
	jmp	.page_down_0
1254
;-------------------------------------------------------
1255
.enter:
1256
	call	fb_mouse.enter_3
1257
	jmp	.exit_fb
1258
;-------------------------------------------------------
1259
.mark:
1260
	call	.mark_1
1261
	jmp	.arrow_down
1262
;-------------------------------------------------------
1263
.mark_1:
1264
	xor	eax,eax
1265
	mov	ax,fb_start_draw_cursor_line
1266
	xor	edx,edx
1267
	xor	ebx,ebx
1268
	mov	bx,fb_line_size_y
1269
	div	ebx
1270
	mov	esi,fb_start_draw_line
1271
	add	esi,eax
1272
	imul	esi,304
1273
	add	esi,fb_folder_data
1274
 
1275
	add	esi,32+299
1276
	mov	al,[esi]
1277
	and	al,1
1278
 
1279
	test	al,al
1280
	jnz	@f
1281
	inc	fb_marked_counter
1282
	jmp	.mark_2
1283
@@:
1284
	dec	fb_marked_counter
1285
.mark_2:
1286
	mov	al,[esi]
1287
	inc	al
1288
	and	al,1
1289
	mov	[esi],al
1290
	ret
1291
;-------------------------------------------------------
1292
.mark_all:
1293
	mov	fb_temp_counter,0
1294
.mark_all_1:
1295
	mov	ebp,fb_folder_block
1296
.mark_all_2:
1297
	mov	ebx,ebp
1298
	dec	ebx
1299
	imul	ebx,304
1300
	add	ebx,fb_folder_data
1301
	add	ebx,32+40
1302
	cmp	[ebx],word '..'
1303
	jne	.mark_all_3
1304
	cmp	[ebx+2],byte 0
1305
	je	@f
1306
.mark_all_3:
1307
	call	.select_mark_action
1308
@@:
1309
	dec	ebp
1310
	jnz	.mark_all_2
1311
 
1312
	call	fb_draw_panel_3
1313
	cmp	fb_temp_counter,0
1314
	jne	@f
1315
	mov	eax,fb_folder_block
1316
	jmp	.mark_all_4
1317
@@:
1318
	cmp	fb_temp_counter,1
1319
	jne	@f
1320
	mov	fb_marked_counter,0
1321
	jmp	.exit_fb
1322
@@:
1323
	mov	eax,fb_folder_block
1324
	sub	eax,fb_marked_counter
1325
.mark_all_4:
1326
	dec	eax
1327
	mov	fb_marked_counter,eax
1328
	jmp	.exit_fb
1329
;-------------------------------------------------------
1330
.select_mark_action:
1331
	add	ebx,299-40
1332
	cmp	fb_temp_counter,0
1333
	jne	@f
1334
	mov	[ebx],byte 1
1335
	jmp	.select_mark_action_1
1336
@@:
1337
	cmp	fb_temp_counter,1
1338
	jne	@f
1339
	mov	[ebx],byte 0
1340
	jmp	.select_mark_action_1
1341
@@:
1342
	mov	al,[ebx]
1343
	inc	al
1344
	and	al,1
1345
	mov	[ebx],al
1346
.select_mark_action_1:
1347
	ret
1348
;-------------------------------------------------------
1349
.unmark_all:
1350
	mov	fb_temp_counter,1
1351
	jmp	.mark_all_1
1352
;-------------------------------------------------------
1353
.invert_mark:
1354
	mov	fb_temp_counter,2
1355
	jmp	.mark_all_1
1356
;-------------------------------------------------------
1357
.exit_fb:
1358
file_browser_exit
1359
;-------------------------------------------------------
1360
fb_key_table:
1361
	dd	0
1362
	dd	fb_key.arrow_down	; 1
1363
	dd	fb_key.arrow_up		; 2
1364
	dd	fb_key.page_down	; 3
1365
	dd	fb_key.page_up		; 4
1366
	dd	fb_key.home		; 5
1367
	dd	fb_key.end		; 6
1368
	dd	fb_key.enter		; 7
1369
	dd	fb_key.mark		; 8
1370
	dd	fb_key.mark_all		; 9
1371
	dd	fb_key.unmark_all	; 10
1372
	dd	fb_key.invert_mark	; 11
1373
.end:
1374
	dd	0
1375
;-------------------------------------------------------
1376
fb_draw_panel_3:
1377
	mov	eax,2
1378
	mov	fb_all_redraw,eax
1379
	jmp	@f
1380
fb_draw_panel_2:
1381
	xor	eax,eax
1382
	inc	eax
1383
	mov	fb_all_redraw,eax
1384
	call	fb_draw_panel_selection
1385
@@:
1386
	call	fb_draw_folder_data
1387
	xor	eax,eax
1388
	mov	fb_all_redraw,eax
1389
	inc	eax
1390
	mov	fb_draw_scroll_bar,eax
1391
	ret
1392
 
1393
}