Subversion Repositories Kolibri OS

Rev

Go to most recent revision | Details | 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
	dec	cx
416
	rol	ecx,16
417
	mov	cx,ax
418
	mov	eax,ecx
419
	shr	eax,16
420
	sub	cx,ax
421
	cmp	cx,0
422
	jbe	@f
423
	mov	bx,fb_size_x
424
	ror	ebx,16
425
	sub	bx,fb_icon_size_x
426
	sub	bx,3
427
	rol	ebx,16
428
	mov	edx,fb_background_color	;0xffffff
429
	mcall	13
430
@@:
431
 
432
.end:
433
;	mov	fb_draw_scroll_bar,dword 1
434
	ret
435
;---------------------------------------------------------------------
436
fb_clear_line:
437
	mov	fb_draw_panel_selection_flag,0
438
	pusha
439
	shl	ebx,16
440
	shr	ebx,16
441
;	dec	ebx
442
	cmp	fb_select_panel_counter,0
443
	je	.continue
444
	mov	ax,fb_start_draw_cursor_line
445
	add	ax,fb_start_y
446
	cmp	bx,ax
447
	jne	.continue
448
	mov	fb_draw_panel_selection_flag,1
449
	jmp	.end
450
.continue:
451
	cmp	fb_all_redraw,dword 2
452
	je	.end
453
	cmp	fb_all_redraw,dword 0
454
	je	.end
455
	mov	ebx,[esp+16]
456
	mov	cx,bx
457
;	dec	cx
458
	rol	ecx,16
459
	mov	cx,fb_line_size_y
460
	mov	bx,fb_size_x
461
	ror	ebx,16
462
	sub	bx,fb_icon_size_x
463
	sub	bx,3
464
	rol	ebx,16
465
	mov	edx,fb_background_color
466
	mcall	13
467
.end:
468
	popa
469
	ret
470
;---------------------------------------------------------------------
471
fb_draw_type_size_date:
472
	pusha
473
	mov	eax,fb_type_table
474
	test	[edx-40],byte 0x10
475
	jz	.copy_type
476
	mov	[eax],dword '
477
	mov	[eax+4],word '> '
478
	mov	fb_file_name_length,0
479
	mov	fb_extension_size,0
480
	jmp	.start
481
.copy_type:
482
	mov	[eax],dword '	'
483
	mov	[eax+4],word '	'
484
.start:
485
	mov	esi,edx
486
	xor	eax,eax
487
@@:
488
	cld
489
	lodsb
490
	test	eax,eax
491
	jnz	@b
492
	mov	fb_file_name_length,esi
493
	sub	fb_file_name_length,edx
494
	mov	fb_temp_counter,esi
495
	test	[edx-40],byte	0x10
496
	jnz	.size
497
;@@:
498
	dec	esi
499
	dec	edx
500
@@:
501
	std
502
	lodsb
503
	cmp	esi,edx
504
	je	.extension_size_0
505
	cmp	al,'.'
506
	jnz	@b
507
	add	esi,2
508
	mov	fb_extension_start,esi
509
	mov	ecx,fb_temp_counter
510
	sub	ecx,esi
511
	inc	ecx
512
	mov	fb_extension_size,ecx
513
	sub	fb_file_name_length,ecx
514
	cmp	ecx,2
515
	ja	@f
516
	inc	fb_file_name_length
517
@@:
518
	sub	ecx,2
519
	cmp	ecx,4
520
	jbe	@f
521
	mov	ecx,3
522
	mov	eax,fb_type_table
523
	mov	[eax+3],word '..'
524
@@:
525
	push	edi
526
	mov	edi,fb_type_table
527
	cld
528
	rep	movsb
529
	pop	edi
530
	inc	edx
531
	jmp	.size
532
.extension_size_0:
533
	inc	edx
534
	mov	fb_extension_size,0
535
.size:
536
	mov	eax,fb_type_table
537
	test	[edx-40],byte 0x10
538
	jz	.copy_size
539
	mov	[eax+6],dword '----'
540
	mov	[eax+6+4],word '- '
541
	jmp	.date
542
;-----------------------------------------
543
.call_decimal_string:
544
	mov	ebx,fb_type_table
545
	add	ebx,6
546
	call	fb_decimal_string_4
547
	mov	[ebx],dl
548
	jmp	.size_convert_end
549
;-----------------------------------------
550
.copy_size:
551
;/0x40000000 - Gb
552
;/0x100000 - Mb
553
;/0x400 Kb
554
	mov	[eax+6],dword '    '
555
	mov	[eax+6+4],word '  '
556
	push	ebx
557
	push	edx
558
	mov	eax,[edx-40+32]
559
	mov	ebx,eax
560
	shr	eax,30 ; /(1024*1024*1024)
561
	test	eax,eax
562
	jz	@f
563
	mov	dl,byte 'G'
564
	jmp	.call_decimal_string
565
@@:
566
	mov	eax,ebx
567
	shr	eax,20 ; /(1024*1024)
568
	test	eax,eax
569
	jz	@f
570
	mov	dl,byte 'M'
571
	jmp	.call_decimal_string
572
@@:
573
	mov	eax,ebx
574
	shr	eax,10 ; /1024
575
	test	eax,eax
576
	jz	@f
577
	mov	dl,byte 'K'
578
	jmp	.call_decimal_string
579
@@:
580
	mov	eax,ebx
581
;.size_convert:
582
	mov	ebx,fb_type_table
583
	add	ebx,6
584
	call	fb_decimal_string_4
585
.size_convert_end:
586
	mov	eax,fb_type_table
587
	add	eax,6
588
	push	edi
589
	cmp	[eax],byte '0'
590
	jne	@f
591
	mov	[eax],byte ' '
592
@@:
593
	add	eax,3
594
@@:
595
	cmp	[eax+1],byte ' '
596
	jne	@f
597
	mov	esi,eax
598
	mov	edi,esi
599
	inc	edi
600
	mov	ecx,5
601
	std
602
	rep	movsb
603
	jmp	@r
604
@@:
605
	pop	edi
606
	pop	edx
607
	pop	ebx
608
;-----------------------------------------
609
.date:
610
	xor	eax,eax
611
	mov	al,[edx-40+28]
612
	push	ebx
613
	mov	ebx,fb_type_table
614
	add	ebx,12
615
	call	fb_decimal_string_2 ; day
616
	mov	al,[edx-40+29]
617
	mov	ebx,fb_type_table
618
	add	ebx,12+3
619
	call	fb_decimal_string_2 ; month
620
	mov	ax,[edx-40+30]
621
	mov	ebx,fb_type_table
622
	add	ebx,12+15
623
	call	fb_decimal_string_4 ; year
624
	mov	ebx,fb_type_table
625
	mov	ax,[ebx+12+15+2]
626
	mov	[ebx+12+6],ax
627
	pop	ebx
628
;-----------------------------------------
629
	ror	ebx,16
630
	add	bx,fb_size_x
631
	sub	ebx,122+12+15
632
	rol	ebx,16
633
	mov	ecx,fb_text_color
634
	cmp	fb_marked_file,0
635
	je	@f
636
	mov	ecx,fb_reduct_text_color	;0xff0000
637
@@:
638
	mov	edx,fb_type_table
639
	mov	esi,20
640
 
641
	mov	ax,fb_line_size_y
642
	sub	ax,fb_font_size_y
643
 
644
	push	ebx
645
	mov	bx,ax
646
	shr	ax,1
647
	test	bx,1b
648
	jz	@f
649
	inc	ax
650
@@:
651
	pop	ebx
652
	add	bx,ax
653
	cmp	fb_all_redraw,dword 2
654
	jne	.draw  ;@f
655
	and	ecx,0xffffff
656
	add	ecx,0x40000000
657
 
658
	mov	eax,fb_background_color
659
	cmp	fb_draw_panel_selection_flag,1
660
	jne	@f
661
	mov	eax,fb_select_color
662
@@:
663
	mov	edi,eax
664
.draw:
665
	mcall	4
666
	popa
667
	ret
668
;---------------------------------------------------------------------
669
fb_draw_icon:
670
	pusha
671
	xor	eax,eax
672
	mov	ax,fb_icon_size_y
673
	mov	ebx,fb_resolution_raw
674
	imul	eax,ebx
675
	mov	bx,fb_icon_size_x
676
	imul	eax,ebx
677
	mov	ebx,eax
678
	shr	eax,3
679
	test	ebx,111b
680
	jz	@f
681
	inc	eax
682
@@:
683
	test	[edx-40],byte 0x10
684
	jnz	.draw_dir_pic
685
 
686
	call	fb_get_icon_number
687
;	mov	ebx,2
688
	imul	ebx,eax	;16*16*3
689
	jmp	.draw
690
.draw_dir_pic:
691
	xor	ebx,ebx
692
	cmp	[edx],word '..'
693
	jne	.draw
694
	mov	ebx,eax	;16*16*3
695
.draw:
696
	add	ebx,fb_icon_raw_area
697
	mov	cx,fb_icon_size_x
698
	shl	ecx,16
699
	mov	cx,fb_icon_size_y
700
 
701
	mov	edx,[esp+16]
702
	ror	edx,16
703
	sub	edx,2
704
	sub	dx,fb_icon_size_x
705
	rol	edx,16
706
 
707
	mov	ax,fb_line_size_y
708
	sub	ax,fb_icon_size_y
709
	shr	ax,1
710
	add	dx,ax
711
 
712
	mov	esi,fb_resolution_raw
713
 
714
	xor	ebp,ebp
715
 
716
	push	edi
717
	mov	edi,fb_palette_raw
718
	mcall	65
719
	pop	edi
720
	popa
721
	ret
722
;---------------------------------------------------------------------
723
; Convert of a binary number in decimal string form
724
; Input:
725
;  AX - value
726
;  EBX - address of string
727
; Output:
728
;  string contains the number, marked the end of the code 0
729
fb_decimal_string_2:
730
	push	eax ebx ecx edx
731
	xor	ecx,ecx
732
	mov	[ebx],byte '0'
733
	inc	ebx
734
.p3:
735
	xor	edx,edx
736
	push	ebx
737
	mov	ebx,10
738
	div	ebx
739
	pop	ebx
740
	add	edx,48
741
	push	edx
742
	inc	ecx
743
	cmp	ax,0
744
	jne	.p3
745
	cmp	ecx,1
746
	jbe	.p4
747
	mov	ecx,2
748
	dec	ebx
749
.p4:
750
	pop	edx
751
	mov	[ebx],dl
752
	inc	ebx
753
	loop	.p4
754
	pop	edx ecx ebx eax
755
	ret
756
;---------------------------------------------------------------------
757
fb_decimal_string_4:
758
	push	eax ecx edx
759
	xor	ecx,ecx
760
	mov	[ebx],byte '0'
761
	inc	ebx
762
.p3:
763
	xor	edx,edx
764
	push	ebx
765
	mov	ebx,10
766
	div	ebx
767
	pop	ebx
768
	add	edx,48
769
	push	edx
770
	inc	ecx
771
	cmp	eax,0
772
	jne	.p3
773
	cmp	ecx,3
774
	jbe	.p4
775
	mov	ecx,4
776
	dec	ebx
777
.p4:
778
	pop	edx
779
	mov	[ebx],dl
780
	inc	ebx
781
	loop	.p4
782
	pop	edx ecx eax
783
	ret
784
;---------------------------------------------------------------------
785
fb_get_icon_number:
786
	push	eax
787
	mov	ebp,fb_extension_size
788
	test	ebp,ebp
789
	je	.end
790
	dec	ebp
791
	test	ebp,ebp
792
	je	.end
793
	dec	ebp
794
	test	ebp,ebp
795
	je		.end
796
@@:
797
	mov	edx,fb_ini_file_end
798
	sub	edx,ebp
799
	mov	eax,fb_ini_file_start
800
	dec	eax
801
.search_association:
802
	cmp	edx,eax
803
	jbe	.end
804
	mov	esi,fb_extension_start
805
	inc	eax
806
	mov	ecx,eax
807
	mov	ebx,eax
808
	cld
809
.check:
810
	lodsb
811
	test	al,al
812
	jz	@f
813
	call	fb_char_toupper
814
	shl	ax,8
815
	mov	al,[ebx]
816
	inc	ebx
817
	call	fb_char_toupper
818
	cmp	al,ah
819
	je	.check
820
	mov	eax,ecx
821
	jmp	.search_association
822
@@:
823
	mov	eax,ecx
824
	mov	esi,eax
825
	add	esi,ebp
826
	cmp	[esi],byte '='
827
	jne	.search_association
828
	inc	esi
829
	xor	ebx,ebx
830
	xor	eax,eax
831
	mov	ecx,9
832
	call	.calculate
833
	cmp al,0x30
834
	jb	.end
835
	cmp	al,0x39
836
	ja	.end
837
	sub	eax,0x30
838
@@:
839
	call	.calculate_1
840
	cmp al,0x30
841
	jb	@f
842
	cmp	al,0x39
843
	ja	@f
844
	sub	eax,0x30
845
 
846
	lea ebx,[ebx+ebx*4]
847
	shl	ebx,1
848
 
849
	dec	ecx
850
	jnz	@b
851
@@:
852
	pop	eax
853
	ret
854
.end:
855
	mov	ebx,2
856
	pop	eax
857
	ret
858
;---------------------------------------------------------------------
859
.calculate_1:
860
	add	ebx,eax
861
.calculate:
862
	xor	eax,eax
863
	cld
864
	lodsb
865
	ret
866
;---------------------------------------------------------------------
867
fb_char_toupper:
868
; convert character to uppercase, using cp866 encoding
869
; in: al=symbol
870
; out: al=converted symbol
871
	cmp	al,'a'
872
	jb	.ret
873
	cmp	al, 'z'
874
	jbe	.az
875
	cmp	al, ' '
876
	jb	.ret
877
	cmp	al, 'à'
878
	jb	.rus1
879
	cmp	al, 'ï'
880
	ja	.ret
881
; 0xE0-0xEF -> 0x90-0x9F
882
	sub	al, 'à'-''
883
.ret:
884
	ret
885
.rus1:
886
; 0xA0-0xAF -> 0x80-0x8F
887
.az:
888
	and	al, not 0x20
889
	ret
890
;---------------------------------------------------------------------
891
fb_truncated_filename_char:
892
	db	'..'
893
fb_truncated_filename_clear:
894
	db	'  '
895
;---------------------------------------------------------------------
896
;*****************************************************************************
897
;*****************************************************************************
898
; mouse event
899
;*****************************************************************************
900
;*****************************************************************************
901
fb_mouse:
902
	pusha
903
	mov	edi,dword [esp+36]
904
;-------------------------------------------------------
905
	mcall	37,2
906
	mov	ebx,fb_mouse_keys
907
	mov	fb_mouse_keys_old,ebx
908
	mov	fb_mouse_keys,eax
909
 
910
	mcall	37,1
911
	mov	ebx,fb_mouse_pos
912
	mov	fb_mouse_pos_old,ebx
913
	mov	fb_mouse_pos,eax
914
 
915
	test	eax,0x80000000
916
	jnz	.exit_fb
917
	test	eax,0x8000
918
	jnz	.exit_fb
919
 
920
	mov	ebx,eax
921
	shr	ebx,16	; x position
922
	shl	eax,16
923
	shr	eax,16	; y position
924
 
925
	mov	cx,fb_start_x
926
	cmp	bx,cx
927
	jb	.exit_fb
928
 
929
	add	cx,fb_size_x
930
	cmp	bx,cx
931
	ja	.exit_fb
932
 
933
	mov	cx,fb_start_y
934
	cmp	ax,cx
935
	jb	.exit_fb
936
 
937
	add	cx,fb_size_y
938
	cmp	ax,cx
939
	ja	.exit_fb
940
;-------------------------------------------------------
941
	cmp	fb_mouse_keys_delta,1
942
	je	.enter_1
943
 
944
	cmp	fb_mouse_keys,0
945
	jz	.exit_fb
946
.start:
947
	sub	ax,fb_start_y
948
	xor	ebx,ebx
949
	mov	bx,fb_line_size_y
950
	xor	edx,edx
951
	push	eax
952
	div	ebx
953
	pop	eax
954
	sub	eax,edx
955
	xor	edx,edx
956
	cmp	fb_select_panel_counter,edx
957
	jne	@f
958
	mov	fb_mouse_keys_delta,0
959
	jmp	.continue
960
@@:
961
	xor	edx,edx
962
	cmp	fb_start_draw_cursor_line,ax
963
	jne	@f
964
	cmp	fb_mouse_keys,edx
965
	jnz	.continue
966
@@:
967
	mov	fb_mouse_keys_delta,edx
968
.continue:
969
	xor	ebx,ebx
970
	mov	bx,fb_line_size_y
971
	imul	ebx,fb_folder_block
972
	cmp	eax,ebx
973
	jb	@f
974
	xor	edx,edx
975
	mov	dx,fb_line_size_y
976
	sub	ebx,edx
977
	cmp	bx,fb_start_draw_cursor_line
978
	je	.enter
979
	call	.store_old_cursor_line
980
	mov	fb_start_draw_cursor_line,bx
981
	jmp	.continue_1
982
@@:
983
	cmp	ax,fb_start_draw_cursor_line
984
	je	.enter
985
	call	.store_old_cursor_line
986
	mov	fb_start_draw_cursor_line,ax
987
.continue_1:
988
	test	fb_mouse_keys,10b
989
	jne	.mark_mouse
990
	jmp	.enter_1
991
.continue_2:
992
	mov	ax,fb_start_draw_cursor_line
993
	cmp	ax,fb_start_draw_cursor_line_2
994
	je	.exit_fb
995
 
996
	call	fb_draw_panel_1
997
	jmp	.exit_fb
998
.enter:
999
	cmp	fb_mouse_keys_delta,2
1000
	je	.enter_2
1001
	cmp	fb_mouse_keys_delta,1
1002
	je	.enter_1
1003
	mov	eax,fb_mouse_keys_old
1004
	cmp	fb_mouse_keys,eax
1005
	jz	.exit_fb
1006
	test	fb_mouse_keys,10b
1007
	jne	.mark_mouse
1008
	xor	edx,edx
1009
	inc	edx
1010
	mov	fb_mouse_keys_delta,edx
1011
	jmp	.exit_fb
1012
.enter_1:
1013
	mov	eax,fb_mouse_keys_old
1014
	cmp	fb_mouse_keys,eax
1015
	jz	.exit_fb
1016
	test	fb_mouse_keys,10b
1017
	jne	.mark_mouse
1018
	mov	edx,2
1019
	mov	fb_mouse_keys_delta,edx
1020
	mcall	26,9
1021
	add	eax,fb_mouse_key_delay
1022
	mov	fb_mouse_keys_tick,eax
1023
	jmp	.continue_2
1024
.enter_2:
1025
	mcall	26,9
1026
	cmp	eax,fb_mouse_keys_tick
1027
	ja	@f
1028
;	mov	eax,fb_mouse_pos_old
1029
;	cmp	eax,fb_mouse_pos
1030
;	jne	@f
1031
	mov	eax,fb_mouse_keys_old
1032
	cmp	fb_mouse_keys,eax
1033
	jz	@f
1034
	test	fb_mouse_keys,10b
1035
	jne	.mark_mouse
1036
	call	.enter_3
1037
	jmp	.exit_fb
1038
@@:
1039
	xor	eax,eax
1040
	inc	eax
1041
	mov	fb_mouse_keys_delta,eax
1042
;-------------------------------------------------------
1043
.exit_fb:
1044
file_browser_exit
1045
;-------------------------------------------------------
1046
.mark_mouse:
1047
	call	fb_key.mark_1
1048
	call	fb_draw_panel_1
1049
	xor	eax,eax
1050
	mov	fb_mouse_keys_delta,eax
1051
	jmp	.exit_fb
1052
;-------------------------------------------------------
1053
.enter_3:
1054
	xor	eax,eax
1055
	mov	fb_mouse_keys,eax
1056
	mov	fb_mouse_keys_old,eax
1057
	mov	eax,3
1058
	mov	fb_mouse_keys_delta,eax
1059
	xor	eax,eax
1060
	mov	ax,fb_start_draw_cursor_line
1061
	xor	ebx,ebx
1062
	mov	bx,fb_line_size_y
1063
	xor	edx,edx
1064
	div	ebx
1065
	add	eax,fb_start_draw_line
1066
	imul	eax,304
1067
	add	eax,32
1068
	add	eax,fb_folder_data
1069
	mov	fb_selected_BDVK_adress,eax
1070
	xor	eax,eax
1071
	mov	fb_max_name_temp_size,eax
1072
	ret
1073
;-------------------------------------------------------
1074
.store_old_cursor_line:
1075
	push	eax
1076
	mov	ax,fb_start_draw_cursor_line
1077
	mov	fb_start_draw_cursor_line_2,ax
1078
	xor	eax,eax
1079
;	mov	fb_mouse_keys_delta,eax
1080
	pop	eax
1081
	ret
1082
;*****************************************************************************
1083
;*****************************************************************************
1084
; key event
1085
; 1 - arrow down
1086
; 2 - arrow up
1087
; 3 - PageDown
1088
; 4 - PageUp
1089
; 5 - Home
1090
; 6 - End
1091
; 7 - Enter
1092
; 8 - Insert (Mark)
1093
; 9 - Mark All
1094
; 10 - Unmark All
1095
; 11 - Invert Mark
1096
;*****************************************************************************
1097
;*****************************************************************************
1098
fb_key:
1099
	pusha
1100
	mov	edi,dword [esp+36]
1101
;-------------------------------------------------------
1102
	mov	eax,fb_key_action
1103
	shl	eax,2
1104
	add	eax,dword fb_key_table
1105
	cmp	eax,fb_key_table.end
1106
	jae	.exit_fb
1107
	cmp	[eax],dword 0
1108
	je	.exit_fb
1109
	jmp	dword [eax]
1110
;-------------------------------------------------------
1111
.arrow_down:
1112
	mov	ax,fb_start_draw_cursor_line
1113
	add	ax,fb_line_size_y
1114
	add	ax,fb_line_size_y
1115
	cmp	ax,word fb_size_y
1116
	jae	@f
1117
.add_1:
1118
	call	fb_mouse.store_old_cursor_line
1119
	mov	ax,fb_start_draw_cursor_line
1120
	add	ax,fb_line_size_y
1121
	mov	fb_start_draw_cursor_line,ax
1122
	call	fb_draw_panel_1
1123
	jmp	.exit_fb
1124
@@:
1125
	mov	eax,fb_folder_block
1126
	sub	eax,fb_max_panel_line
1127
	test	eax,0x80000000
1128
	jnz	.page_down_2
1129
 
1130
	call	.prepare_data_down
1131
	ja	@f
1132
 
1133
	cmp	fb_start_draw_line,eax
1134
	je	.exit_fb
1135
@@:
1136
	inc	fb_start_draw_line
1137
	call	fb_draw_panel_3
1138
	jmp	.exit_fb
1139
;-------------------------------------------------------
1140
.arrow_up:
1141
	mov	ax,fb_start_draw_cursor_line
1142
	add	ax,fb_start_y
1143
	cmp	fb_start_y,ax
1144
	je	@f
1145
	call	fb_mouse.store_old_cursor_line
1146
	mov	ax,fb_start_draw_cursor_line
1147
	sub	ax,fb_line_size_y
1148
	mov	fb_start_draw_cursor_line,ax
1149
	call	fb_draw_panel_1
1150
	jmp	.exit_fb
1151
@@:
1152
	cmp	fb_start_draw_line,0
1153
	je	.exit_fb
1154
	dec	fb_start_draw_line
1155
	call	fb_draw_panel_3
1156
	jmp	.exit_fb
1157
;-------------------------------------------------------
1158
.page_down:
1159
	mov	eax,fb_max_panel_line
1160
	mov	ebx,fb_folder_block
1161
	sub	ebx,eax
1162
	test	ebx,0x80000000
1163
	jnz	.page_down_2
1164
	sub	ebx,fb_start_draw_line
1165
	cmp	ebx,eax
1166
	ja	.page_down_3
1167
	mov	ebx,fb_folder_block
1168
	sub	ebx,eax
1169
	call	.prepare_data_down
1170
	ja	@f
1171
	cmp	ebx,fb_start_draw_line
1172
	je	.exit_fb
1173
@@:
1174
	mov	fb_start_draw_line,ebx
1175
.page_down_0:
1176
	dec	eax
1177
	xor	ebx,ebx
1178
	mov	bx,fb_line_size_y
1179
	imul	eax,ebx
1180
.page_down_1:
1181
	call	fb_mouse.store_old_cursor_line
1182
	mov	fb_start_draw_cursor_line,ax
1183
	call	fb_draw_panel_2
1184
	jmp	.exit_fb
1185
.page_down_2:
1186
	mov	eax,fb_folder_block
1187
	sub	eax,fb_start_draw_line
1188
	dec	eax
1189
	xor	ebx,ebx
1190
	mov	bx,fb_line_size_y
1191
	imul	eax,ebx
1192
	cmp	ax,fb_start_draw_cursor_line
1193
	jbe	.exit_fb
1194
	jmp	.page_down_1
1195
.page_down_3:
1196
	add	fb_start_draw_line,eax
1197
	call	fb_draw_panel_2
1198
	jmp	.exit_fb
1199
;-------------------------------------------------------
1200
.prepare_data_down:
1201
	mov	ecx,fb_folder_block
1202
	sub	ecx,fb_start_draw_line
1203
	dec	ecx
1204
	xor	edx,edx
1205
	mov	dx,fb_line_size_y
1206
	imul	ecx,edx
1207
	cmp	cx,fb_start_draw_cursor_line
1208
	ret
1209
;-------------------------------------------------------
1210
.page_up:
1211
	mov	eax,fb_max_panel_line
1212
	mov	ebx,fb_start_draw_line
1213
	sub	ebx,eax
1214
	test	ebx,0x8000000
1215
	jz	@f
1216
	cmp	fb_start_draw_line,0
1217
	jne	.page_up_1
1218
	cmp	fb_start_draw_cursor_line,0
1219
	je	.exit_fb
1220
	mov	fb_start_draw_cursor_line,0
1221
.page_up_1:
1222
	mov	fb_start_draw_line,0
1223
	call	fb_draw_panel_2
1224
	jmp	.exit_fb
1225
@@:
1226
	sub	fb_start_draw_line,eax
1227
	call	fb_draw_panel_2
1228
	jmp	.exit_fb
1229
;-------------------------------------------------------
1230
.home:
1231
	cmp	fb_start_draw_line,0
1232
	jne	@f
1233
	cmp	fb_start_draw_cursor_line,0
1234
	je	.exit_fb
1235
@@:
1236
	mov	fb_start_draw_line,0
1237
	mov	fb_start_draw_cursor_line,0
1238
	call	fb_mouse.store_old_cursor_line
1239
	call	fb_draw_panel_2
1240
	jmp	.exit_fb
1241
;-------------------------------------------------------
1242
.end:
1243
	mov	eax,fb_folder_block
1244
	sub	eax,fb_max_panel_line
1245
	test	eax,0x80000000
1246
	jnz	.page_down_2
1247
	call	.prepare_data_down
1248
	ja	@f
1249
	cmp	eax,fb_start_draw_line
1250
	je	.exit_fb
1251
@@:
1252
	mov	fb_start_draw_line,eax
1253
	mov	eax,fb_max_panel_line
1254
	jmp	.page_down_0
1255
;-------------------------------------------------------
1256
.enter:
1257
	call	fb_mouse.enter_3
1258
	jmp	.exit_fb
1259
;-------------------------------------------------------
1260
.mark:
1261
	call	.mark_1
1262
	jmp	.arrow_down
1263
;-------------------------------------------------------
1264
.mark_1:
1265
	xor	eax,eax
1266
	mov	ax,fb_start_draw_cursor_line
1267
	xor	edx,edx
1268
	xor	ebx,ebx
1269
	mov	bx,fb_line_size_y
1270
	div	ebx
1271
	mov	esi,fb_start_draw_line
1272
	add	esi,eax
1273
	imul	esi,304
1274
	add	esi,fb_folder_data
1275
 
1276
	add	esi,32+299
1277
	mov	al,[esi]
1278
	and	al,1
1279
 
1280
	test	al,al
1281
	jnz	@f
1282
	inc	fb_marked_counter
1283
	jmp	.mark_2
1284
@@:
1285
	dec	fb_marked_counter
1286
.mark_2:
1287
	mov	al,[esi]
1288
	inc	al
1289
	and	al,1
1290
	mov	[esi],al
1291
	ret
1292
;-------------------------------------------------------
1293
.mark_all:
1294
	mov	fb_temp_counter,0
1295
.mark_all_1:
1296
	mov	ebp,fb_folder_block
1297
.mark_all_2:
1298
	mov	ebx,ebp
1299
	dec	ebx
1300
	imul	ebx,304
1301
	add	ebx,fb_folder_data
1302
	add	ebx,32+40
1303
	cmp	[ebx],word '..'
1304
	jne	.mark_all_3
1305
	cmp	[ebx+2],byte 0
1306
	je	@f
1307
.mark_all_3:
1308
	call	.select_mark_action
1309
@@:
1310
	dec	ebp
1311
	jnz	.mark_all_2
1312
 
1313
	call	fb_draw_panel_3
1314
	cmp	fb_temp_counter,0
1315
	jne	@f
1316
	mov	eax,fb_folder_block
1317
	jmp	.mark_all_4
1318
@@:
1319
	cmp	fb_temp_counter,1
1320
	jne	@f
1321
	mov	fb_marked_counter,0
1322
	jmp	.exit_fb
1323
@@:
1324
	mov	eax,fb_folder_block
1325
	sub	eax,fb_marked_counter
1326
.mark_all_4:
1327
	dec	eax
1328
	mov	fb_marked_counter,eax
1329
	jmp	.exit_fb
1330
;-------------------------------------------------------
1331
.select_mark_action:
1332
	add	ebx,299-40
1333
	cmp	fb_temp_counter,0
1334
	jne	@f
1335
	mov	[ebx],byte 1
1336
	jmp	.select_mark_action_1
1337
@@:
1338
	cmp	fb_temp_counter,1
1339
	jne	@f
1340
	mov	[ebx],byte 0
1341
	jmp	.select_mark_action_1
1342
@@:
1343
	mov	al,[ebx]
1344
	inc	al
1345
	and	al,1
1346
	mov	[ebx],al
1347
.select_mark_action_1:
1348
	ret
1349
;-------------------------------------------------------
1350
.unmark_all:
1351
	mov	fb_temp_counter,1
1352
	jmp	.mark_all_1
1353
;-------------------------------------------------------
1354
.invert_mark:
1355
	mov	fb_temp_counter,2
1356
	jmp	.mark_all_1
1357
;-------------------------------------------------------
1358
.exit_fb:
1359
file_browser_exit
1360
;-------------------------------------------------------
1361
fb_key_table:
1362
	dd	0
1363
	dd	fb_key.arrow_down	; 1
1364
	dd	fb_key.arrow_up		; 2
1365
	dd	fb_key.page_down	; 3
1366
	dd	fb_key.page_up		; 4
1367
	dd	fb_key.home		; 5
1368
	dd	fb_key.end		; 6
1369
	dd	fb_key.enter		; 7
1370
	dd	fb_key.mark		; 8
1371
	dd	fb_key.mark_all		; 9
1372
	dd	fb_key.unmark_all	; 10
1373
	dd	fb_key.invert_mark	; 11
1374
.end:
1375
	dd	0
1376
;-------------------------------------------------------
1377
fb_draw_panel_3:
1378
	mov	eax,2
1379
	mov	fb_all_redraw,eax
1380
	jmp	@f
1381
fb_draw_panel_2:
1382
	xor	eax,eax
1383
	inc	eax
1384
	mov	fb_all_redraw,eax
1385
	call	fb_draw_panel_selection
1386
@@:
1387
	call	fb_draw_folder_data
1388
	xor	eax,eax
1389
	mov	fb_all_redraw,eax
1390
	inc	eax
1391
	mov	fb_draw_scroll_bar,eax
1392
	ret
1393
 
1394
}