Subversion Repositories Kolibri OS

Rev

Rev 1215 | 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
1243 mario79 939
 
940
	cmp	fb_mouse_keys,0
941
	jz	@f
942
	mov	fb_select_flag,1
943
@@:
1199 mario79 944
;-------------------------------------------------------
945
	cmp	fb_mouse_keys_delta,1
946
	je	.enter_1
947
 
948
	cmp	fb_mouse_keys,0
949
	jz	.exit_fb
950
.start:
951
	sub	ax,fb_start_y
952
	xor	ebx,ebx
953
	mov	bx,fb_line_size_y
954
	xor	edx,edx
955
	push	eax
956
	div	ebx
957
	pop	eax
958
	sub	eax,edx
959
	xor	edx,edx
960
	cmp	fb_select_panel_counter,edx
961
	jne	@f
962
	mov	fb_mouse_keys_delta,0
963
	jmp	.continue
964
@@:
965
	xor	edx,edx
966
	cmp	fb_start_draw_cursor_line,ax
967
	jne	@f
968
	cmp	fb_mouse_keys,edx
969
	jnz	.continue
970
@@:
971
	mov	fb_mouse_keys_delta,edx
972
.continue:
973
	xor	ebx,ebx
974
	mov	bx,fb_line_size_y
975
	imul	ebx,fb_folder_block
976
	cmp	eax,ebx
977
	jb	@f
978
	xor	edx,edx
979
	mov	dx,fb_line_size_y
980
	sub	ebx,edx
981
	cmp	bx,fb_start_draw_cursor_line
982
	je	.enter
983
	call	.store_old_cursor_line
984
	mov	fb_start_draw_cursor_line,bx
985
	jmp	.continue_1
986
@@:
987
	cmp	ax,fb_start_draw_cursor_line
988
	je	.enter
989
	call	.store_old_cursor_line
990
	mov	fb_start_draw_cursor_line,ax
991
.continue_1:
992
	test	fb_mouse_keys,10b
993
	jne	.mark_mouse
994
	jmp	.enter_1
995
.continue_2:
996
	mov	ax,fb_start_draw_cursor_line
997
	cmp	ax,fb_start_draw_cursor_line_2
998
	je	.exit_fb
999
 
1000
	call	fb_draw_panel_1
1001
	jmp	.exit_fb
1002
.enter:
1003
	cmp	fb_mouse_keys_delta,2
1004
	je	.enter_2
1005
	cmp	fb_mouse_keys_delta,1
1006
	je	.enter_1
1007
	mov	eax,fb_mouse_keys_old
1008
	cmp	fb_mouse_keys,eax
1009
	jz	.exit_fb
1010
	test	fb_mouse_keys,10b
1011
	jne	.mark_mouse
1012
	xor	edx,edx
1013
	inc	edx
1014
	mov	fb_mouse_keys_delta,edx
1015
	jmp	.exit_fb
1016
.enter_1:
1017
	mov	eax,fb_mouse_keys_old
1018
	cmp	fb_mouse_keys,eax
1019
	jz	.exit_fb
1020
	test	fb_mouse_keys,10b
1021
	jne	.mark_mouse
1022
	mov	edx,2
1023
	mov	fb_mouse_keys_delta,edx
1024
	mcall	26,9
1025
	add	eax,fb_mouse_key_delay
1026
	mov	fb_mouse_keys_tick,eax
1027
	jmp	.continue_2
1028
.enter_2:
1029
	mcall	26,9
1030
	cmp	eax,fb_mouse_keys_tick
1031
	ja	@f
1032
;	mov	eax,fb_mouse_pos_old
1033
;	cmp	eax,fb_mouse_pos
1034
;	jne	@f
1035
	mov	eax,fb_mouse_keys_old
1036
	cmp	fb_mouse_keys,eax
1037
	jz	@f
1038
	test	fb_mouse_keys,10b
1039
	jne	.mark_mouse
1040
	call	.enter_3
1041
	jmp	.exit_fb
1042
@@:
1043
	xor	eax,eax
1044
	inc	eax
1045
	mov	fb_mouse_keys_delta,eax
1046
;-------------------------------------------------------
1047
.exit_fb:
1048
file_browser_exit
1049
;-------------------------------------------------------
1050
.mark_mouse:
1051
	call	fb_key.mark_1
1052
	call	fb_draw_panel_1
1053
	xor	eax,eax
1054
	mov	fb_mouse_keys_delta,eax
1055
	jmp	.exit_fb
1056
;-------------------------------------------------------
1057
.enter_3:
1058
	xor	eax,eax
1059
	mov	fb_mouse_keys,eax
1060
	mov	fb_mouse_keys_old,eax
1061
	mov	eax,3
1062
	mov	fb_mouse_keys_delta,eax
1063
	xor	eax,eax
1064
	mov	ax,fb_start_draw_cursor_line
1065
	xor	ebx,ebx
1066
	mov	bx,fb_line_size_y
1067
	xor	edx,edx
1068
	div	ebx
1069
	add	eax,fb_start_draw_line
1070
	imul	eax,304
1071
	add	eax,32
1072
	add	eax,fb_folder_data
1073
	mov	fb_selected_BDVK_adress,eax
1074
	xor	eax,eax
1075
	mov	fb_max_name_temp_size,eax
1076
	ret
1077
;-------------------------------------------------------
1078
.store_old_cursor_line:
1079
	push	eax
1080
	mov	ax,fb_start_draw_cursor_line
1081
	mov	fb_start_draw_cursor_line_2,ax
1082
	xor	eax,eax
1083
;	mov	fb_mouse_keys_delta,eax
1084
	pop	eax
1085
	ret
1086
;*****************************************************************************
1087
;*****************************************************************************
1088
; key event
1089
; 1 - arrow down
1090
; 2 - arrow up
1091
; 3 - PageDown
1092
; 4 - PageUp
1093
; 5 - Home
1094
; 6 - End
1095
; 7 - Enter
1096
; 8 - Insert (Mark)
1097
; 9 - Mark All
1098
; 10 - Unmark All
1099
; 11 - Invert Mark
1100
;*****************************************************************************
1101
;*****************************************************************************
1102
fb_key:
1103
	pusha
1104
	mov	edi,dword [esp+36]
1105
;-------------------------------------------------------
1106
	mov	eax,fb_key_action
1107
	shl	eax,2
1108
	add	eax,dword fb_key_table
1109
	cmp	eax,fb_key_table.end
1110
	jae	.exit_fb
1111
	cmp	[eax],dword 0
1112
	je	.exit_fb
1113
	jmp	dword [eax]
1114
;-------------------------------------------------------
1115
.arrow_down:
1116
	mov	ax,fb_start_draw_cursor_line
1117
	add	ax,fb_line_size_y
1118
	add	ax,fb_line_size_y
1119
	cmp	ax,word fb_size_y
1215 mario79 1120
	ja	@f
1199 mario79 1121
.add_1:
1122
	call	fb_mouse.store_old_cursor_line
1123
	mov	ax,fb_start_draw_cursor_line
1124
	add	ax,fb_line_size_y
1125
	mov	fb_start_draw_cursor_line,ax
1126
	call	fb_draw_panel_1
1127
	jmp	.exit_fb
1128
@@:
1129
	mov	eax,fb_folder_block
1130
	sub	eax,fb_max_panel_line
1131
	test	eax,0x80000000
1132
	jnz	.page_down_2
1133
 
1134
	call	.prepare_data_down
1135
	ja	@f
1136
 
1137
	cmp	fb_start_draw_line,eax
1138
	je	.exit_fb
1139
@@:
1140
	inc	fb_start_draw_line
1141
	call	fb_draw_panel_3
1142
	jmp	.exit_fb
1143
;-------------------------------------------------------
1144
.arrow_up:
1145
	mov	ax,fb_start_draw_cursor_line
1146
	add	ax,fb_start_y
1147
	cmp	fb_start_y,ax
1148
	je	@f
1149
	call	fb_mouse.store_old_cursor_line
1150
	mov	ax,fb_start_draw_cursor_line
1151
	sub	ax,fb_line_size_y
1152
	mov	fb_start_draw_cursor_line,ax
1153
	call	fb_draw_panel_1
1154
	jmp	.exit_fb
1155
@@:
1156
	cmp	fb_start_draw_line,0
1157
	je	.exit_fb
1158
	dec	fb_start_draw_line
1159
	call	fb_draw_panel_3
1160
	jmp	.exit_fb
1161
;-------------------------------------------------------
1162
.page_down:
1163
	mov	eax,fb_max_panel_line
1164
	mov	ebx,fb_folder_block
1165
	sub	ebx,eax
1166
	test	ebx,0x80000000
1167
	jnz	.page_down_2
1168
	sub	ebx,fb_start_draw_line
1169
	cmp	ebx,eax
1170
	ja	.page_down_3
1171
	mov	ebx,fb_folder_block
1172
	sub	ebx,eax
1173
	call	.prepare_data_down
1174
	ja	@f
1175
	cmp	ebx,fb_start_draw_line
1176
	je	.exit_fb
1177
@@:
1178
	mov	fb_start_draw_line,ebx
1179
.page_down_0:
1180
	dec	eax
1181
	xor	ebx,ebx
1182
	mov	bx,fb_line_size_y
1183
	imul	eax,ebx
1184
.page_down_1:
1185
	call	fb_mouse.store_old_cursor_line
1186
	mov	fb_start_draw_cursor_line,ax
1187
	call	fb_draw_panel_2
1188
	jmp	.exit_fb
1189
.page_down_2:
1190
	mov	eax,fb_folder_block
1191
	sub	eax,fb_start_draw_line
1192
	dec	eax
1193
	xor	ebx,ebx
1194
	mov	bx,fb_line_size_y
1195
	imul	eax,ebx
1196
	cmp	ax,fb_start_draw_cursor_line
1197
	jbe	.exit_fb
1198
	jmp	.page_down_1
1199
.page_down_3:
1200
	add	fb_start_draw_line,eax
1201
	call	fb_draw_panel_2
1202
	jmp	.exit_fb
1203
;-------------------------------------------------------
1204
.prepare_data_down:
1205
	mov	ecx,fb_folder_block
1206
	sub	ecx,fb_start_draw_line
1207
	dec	ecx
1208
	xor	edx,edx
1209
	mov	dx,fb_line_size_y
1210
	imul	ecx,edx
1211
	cmp	cx,fb_start_draw_cursor_line
1212
	ret
1213
;-------------------------------------------------------
1214
.page_up:
1215
	mov	eax,fb_max_panel_line
1216
	mov	ebx,fb_start_draw_line
1217
	sub	ebx,eax
1218
	test	ebx,0x8000000
1219
	jz	@f
1220
	cmp	fb_start_draw_line,0
1221
	jne	.page_up_1
1222
	cmp	fb_start_draw_cursor_line,0
1223
	je	.exit_fb
1224
	mov	fb_start_draw_cursor_line,0
1225
.page_up_1:
1226
	mov	fb_start_draw_line,0
1227
	call	fb_draw_panel_2
1228
	jmp	.exit_fb
1229
@@:
1230
	sub	fb_start_draw_line,eax
1231
	call	fb_draw_panel_2
1232
	jmp	.exit_fb
1233
;-------------------------------------------------------
1234
.home:
1235
	cmp	fb_start_draw_line,0
1236
	jne	@f
1237
	cmp	fb_start_draw_cursor_line,0
1238
	je	.exit_fb
1239
@@:
1240
	mov	fb_start_draw_line,0
1241
	mov	fb_start_draw_cursor_line,0
1242
	call	fb_mouse.store_old_cursor_line
1243
	call	fb_draw_panel_2
1244
	jmp	.exit_fb
1245
;-------------------------------------------------------
1246
.end:
1247
	mov	eax,fb_folder_block
1248
	sub	eax,fb_max_panel_line
1249
	test	eax,0x80000000
1250
	jnz	.page_down_2
1251
	call	.prepare_data_down
1252
	ja	@f
1253
	cmp	eax,fb_start_draw_line
1254
	je	.exit_fb
1255
@@:
1256
	mov	fb_start_draw_line,eax
1257
	mov	eax,fb_max_panel_line
1258
	jmp	.page_down_0
1259
;-------------------------------------------------------
1260
.enter:
1261
	call	fb_mouse.enter_3
1262
	jmp	.exit_fb
1263
;-------------------------------------------------------
1264
.mark:
1265
	call	.mark_1
1266
	jmp	.arrow_down
1267
;-------------------------------------------------------
1268
.mark_1:
1269
	xor	eax,eax
1270
	mov	ax,fb_start_draw_cursor_line
1271
	xor	edx,edx
1272
	xor	ebx,ebx
1273
	mov	bx,fb_line_size_y
1274
	div	ebx
1275
	mov	esi,fb_start_draw_line
1276
	add	esi,eax
1277
	imul	esi,304
1278
	add	esi,fb_folder_data
1279
 
1280
	add	esi,32+299
1281
	mov	al,[esi]
1282
	and	al,1
1283
 
1284
	test	al,al
1285
	jnz	@f
1286
	inc	fb_marked_counter
1287
	jmp	.mark_2
1288
@@:
1289
	dec	fb_marked_counter
1290
.mark_2:
1291
	mov	al,[esi]
1292
	inc	al
1293
	and	al,1
1294
	mov	[esi],al
1295
	ret
1296
;-------------------------------------------------------
1297
.mark_all:
1298
	mov	fb_temp_counter,0
1299
.mark_all_1:
1300
	mov	ebp,fb_folder_block
1301
.mark_all_2:
1302
	mov	ebx,ebp
1303
	dec	ebx
1304
	imul	ebx,304
1305
	add	ebx,fb_folder_data
1306
	add	ebx,32+40
1307
	cmp	[ebx],word '..'
1308
	jne	.mark_all_3
1309
	cmp	[ebx+2],byte 0
1310
	je	@f
1311
.mark_all_3:
1312
	call	.select_mark_action
1313
@@:
1314
	dec	ebp
1315
	jnz	.mark_all_2
1316
 
1317
	call	fb_draw_panel_3
1318
	cmp	fb_temp_counter,0
1319
	jne	@f
1320
	mov	eax,fb_folder_block
1321
	jmp	.mark_all_4
1322
@@:
1323
	cmp	fb_temp_counter,1
1324
	jne	@f
1325
	mov	fb_marked_counter,0
1326
	jmp	.exit_fb
1327
@@:
1328
	mov	eax,fb_folder_block
1329
	sub	eax,fb_marked_counter
1330
.mark_all_4:
1331
	dec	eax
1332
	mov	fb_marked_counter,eax
1333
	jmp	.exit_fb
1334
;-------------------------------------------------------
1335
.select_mark_action:
1336
	add	ebx,299-40
1337
	cmp	fb_temp_counter,0
1338
	jne	@f
1339
	mov	[ebx],byte 1
1340
	jmp	.select_mark_action_1
1341
@@:
1342
	cmp	fb_temp_counter,1
1343
	jne	@f
1344
	mov	[ebx],byte 0
1345
	jmp	.select_mark_action_1
1346
@@:
1347
	mov	al,[ebx]
1348
	inc	al
1349
	and	al,1
1350
	mov	[ebx],al
1351
.select_mark_action_1:
1352
	ret
1353
;-------------------------------------------------------
1354
.unmark_all:
1355
	mov	fb_temp_counter,1
1356
	jmp	.mark_all_1
1357
;-------------------------------------------------------
1358
.invert_mark:
1359
	mov	fb_temp_counter,2
1360
	jmp	.mark_all_1
1361
;-------------------------------------------------------
1362
.exit_fb:
1363
file_browser_exit
1364
;-------------------------------------------------------
1365
fb_key_table:
1366
	dd	0
1367
	dd	fb_key.arrow_down	; 1
1368
	dd	fb_key.arrow_up		; 2
1369
	dd	fb_key.page_down	; 3
1370
	dd	fb_key.page_up		; 4
1371
	dd	fb_key.home		; 5
1372
	dd	fb_key.end		; 6
1373
	dd	fb_key.enter		; 7
1374
	dd	fb_key.mark		; 8
1375
	dd	fb_key.mark_all		; 9
1376
	dd	fb_key.unmark_all	; 10
1377
	dd	fb_key.invert_mark	; 11
1378
.end:
1379
	dd	0
1380
;-------------------------------------------------------
1381
fb_draw_panel_3:
1382
	mov	eax,2
1383
	mov	fb_all_redraw,eax
1384
	jmp	@f
1385
fb_draw_panel_2:
1386
	xor	eax,eax
1387
	inc	eax
1388
	mov	fb_all_redraw,eax
1389
	call	fb_draw_panel_selection
1390
@@:
1391
	call	fb_draw_folder_data
1392
	xor	eax,eax
1393
	mov	fb_all_redraw,eax
1394
	inc	eax
1395
	mov	fb_draw_scroll_bar,eax
1396
	ret
1397
 
1398
}