Subversion Repositories Kolibri OS

Rev

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

Rev Author Line No. Line
1524 dunkaist 1
;   RTF READER FOR KOLIBRI >= 0.7.7.0
31 halyavin 2
;   Written in pure assembler by Ivushkin Andrey aka Willow
1515 dunkaist 3
;   Menu_bar and scroll_bar from box_lib provided by dunkaist
31 halyavin 4
;---------------------------------------------------------------------
5
M64 equ 64*1024
6
N_A equ 0x412f4e
7
RTFSIZE equ M64
8
RTFSTACKSIZE equ M64
9
BGIFONTSIZE equ 120*1024
10
ESPSIZE equ M64
1515 dunkaist 11
LMARGIN equ 15
31 halyavin 12
CHARW equ 6
13
CHARH equ 11
14
WINW  equ 600
15
WINH  equ 450
2813 leency 16
WIN_COLOR equ 0x73f0f0f0
31 halyavin 17
DEFCOLOR equ 0x303030
18
RENDER equ FREE
19
 
529 spraid 20
BGIFONT_PATH equ '/sys/fonts/'
31 halyavin 21
FONT_NAME equ 'LITT'
1515 dunkaist 22
TOP = 45
31 halyavin 23
MODE equ RTF
24
INVALHEX equ 0
25
RTF_COLORLESS equ 1
26
RTF_ALIGNLESS equ 2
27
RTF_NO1STLINE equ 4
28
RTF_OPENING   equ 8
29
RTF_HELP      equ 16
30
RTF_VALID     equ 32
31
RTF_BLIND     equ 64
32
RTF_TOEOF     equ 128
33
RTF_BOTTOM    equ 256
34
STEPBYSTEP equ 10
35
DEBUG_BLOCK equ 10
36
SHOWALIGN equ 10
37
GUTTER equ 10
38
BENCH  equ 0;1
39
syms equ 12
40
 
1515 dunkaist 41
;-------------------------------
42
 
2813 leency 43
SCROLL_WIDTH_SIZE       equ     15
1515 dunkaist 44
AR_OFFSET               equ     10
45
 
46
;-------------------------------
47
 
134 diamond 48
  use32              ; включить 32-битный режим ассемблера
49
  org    0x0         ; адресация с нуля
31 halyavin 50
 
134 diamond 51
  db     'MENUET01'  ; 8-байтный идентификатор MenuetOS
52
  dd     0x01        ; версия заголовка (всегда 1)
53
  dd     START       ; адрес первой команды
54
  dd     I_END0      ; размер программы
55
  dd     esp_end     ; количество памяти
56
  dd     sys_mem     ; адрес вершины стэка
7433 leency 57
  dd     fname_buf   ; адрес буфера для параметров
58
  dd     cur_dir_path ; путь к программе
31 halyavin 59
 
7433 leency 60
include '../../../config.inc' ;for nightbuild
1515 dunkaist 61
include '../../../macros.inc' ; макросы облегчают жизнь ассемблерщиков!
62
include '../../../develop/libraries/box_lib/trunk/box_lib.mac'
63
include '../../../develop/libraries/box_lib/load_lib.mac'
1418 mario79 64
 
1512 mario79 65
@use_library
66
 
7433 leency 67
; include '../../../debug.inc'
1418 mario79 68
 
7433 leency 69
TOP=TOP+4
70
include 'bgifont.inc'
31 halyavin 71
include 'rtf_lite.inc'
72
;---------------------------------------------------------------------
73
;---  НАЧАЛО ПРОГРАММЫ  ----------------------------------------------
74
;---------------------------------------------------------------------
75
START:
1418 mario79 76
        mcall 68, 11
3944 mario79 77
        mcall 40, 0x80000027
1418 mario79 78
 
1512 mario79 79
load_libraries l_libs_start,end_l_libs
80
 
1515 dunkaist 81
;OpenDialog     initialisation
82
        push    dword OpenDialog_data
83
        call    [OpenDialog_Init]
1512 mario79 84
 
31 halyavin 85
    mov  [pitch],2
86
    mov  edx,FONT_NAME
87
    mov  edi,save_limit
88
    BGIfont_Prepare
89
 start2:
90
    cmp  byte[fname_buf],0
134 diamond 91
    je   load_file;top_red
31 halyavin 92
    jmp  noactivate
93
 prep_load:
1524 dunkaist 94
    mov  [is_scroll_bar_needed],    0
31 halyavin 95
;    mcall 18,3,dword[prcinfo+30]
96
 noactivate:
97
;    and  ebp,not RTF_OPENING
98
;    and  ebp,not RTF_HELP
99
 
100
;    and  [mode],not RTF_OPENING
101
    and  [mode],not (RTF_HELP+RTF_OPENING)
102
    mov  ecx,16
103
    mov  edi,fileinfo.name
104
    mov  esi,fname_buf
105
    rep  movsd
106
 load_file:
139 diamond 107
        mov     eax, 70
108
        and     [fileattr+32], 0
109
        mov     ebx, attrinfo
485 heavyiron 110
        mcall
139 diamond 111
        mov     ebx, [fileattr+32]
112
        test    eax, eax
113
        jz      .sizok
114
        mov     dword [fileinfo.name], N_A
115
.sizok:
31 halyavin 116
    and  [wSave],0
1515 dunkaist 117
;    mov  [HClick],-100
31 halyavin 118
    mov  eax,ebx
119
    and  eax,RTFSIZE-1
120
    add  eax,I_END
121
    mov  [tail],eax
122
    shr  ebx,16
123
;    dpd ebx
124
    mov  [max_block],ebx
125
    xor  eax,eax
126
    mov  ecx,256
127
    mov  edi,fileinfo.name
128
    repne scasb
129
    sub  edi,fileinfo.name+1
130
    mov  [fname_size],edi
131
top_red:
132
    mov  [top],TOP
1515 dunkaist 133
    mov  [scroll_bar_data_vertical.position],0
134 diamond 134
red:                    ; перерисовать окно
135
    call draw_window    ; вызываем процедуру отрисовки окна
31 halyavin 136
 
137
;---------------------------------------------------------------------
138
;---  ЦИКЛ ОБРАБОТКИ СОБЫТИЙ  ----------------------------------------
139
;---------------------------------------------------------------------
140
 
141
still:
134 diamond 142
    mcall 10            ; функция 10 - ждать события
31 halyavin 143
 
134 diamond 144
    cmp  eax,1          ; перерисовать окно ?
145
    je   red            ; если да - на метку red
146
    cmp  eax,3          ; нажата кнопка ?
147
    je   button         ; если да - на button
1515 dunkaist 148
    cmp  eax,6
149
    je   mouse
31 halyavin 150
 
151
;---------------------------------------------------------------------
152
 
153
 
2194 leency 154
key:                  ; нажата клавиша на клавиатуре
155
    mcall 2           ; функция 2 - считать код символа (в ah)
156
	;Leency[
157
	cmp eax,1
158
	jne .getkeyi
159
	mov ah,dh
160
	jmp .next
161
 
162
.getkeyi:
163
	mov dh,ah
164
	jmp key
165
 
166
.next: 	;]Leency
134 diamond 167
    cmp  ah,104         ; HELP
31 halyavin 168
    jne  .nohelp
169
  .help:
1524 dunkaist 170
    mov  [is_scroll_bar_needed],    0
31 halyavin 171
    xor  [mode],RTF_HELP
172
    test [mode],RTF_HELP
134 diamond 173
    jz   load_file
1515 dunkaist 174
    mov  dword[HDoc],200                        ; it makes the help page not scroll
31 halyavin 175
    mov  ecx,help_end-help_file
176
    mov  [block_end],ecx
177
    add  [block_end],I_END
178
    mov  [tail],ecx
179
    add  [tail],I_END
180
    mov  esi,help_file
181
    mov  edi,I_END
182
    rep  movsb
183
;    or   [mode],RTF_HELP
184
    xor  eax,eax
185
    mov  [max_block],eax
186
    jmp  top_red
187
  .nohelp:
188
;    test [mode],RTF_HELP
189
;    jz   .nohelp2
190
;    and  [mode],not RTF_HELP
191
;    cmp  dword[fileinfo.name],N_A
192
;    je   still
193
;    jmp  prep_load
194
  .nohelp2:
134 diamond 195
    cmp  ah,114         ; R - redraw
196
    je   red
197
    cmp  ah,99          ; C - color
31 halyavin 198
    jne  .nocolor
199
  .color:
200
    xor  [mode],RTF_COLORLESS
201
    jmp  red
202
  .nocolor:
134 diamond 203
    cmp  ah,97          ; A - alignment
31 halyavin 204
    jne  .noalign
205
  .alignment:
206
    xor  [mode],RTF_ALIGNLESS
207
    jmp  red
208
  .noalign:
134 diamond 209
    cmp  ah,44          ; < - pitch dec
31 halyavin 210
    jne  .nopd
211
  .decp:
212
    dec  [pitch]
213
    jmp  red
214
  .nopd:
134 diamond 215
    cmp  ah,46          ; < - pitch inc
31 halyavin 216
    jne  .nopi
217
  .incp:
218
    inc  [pitch]
219
    jmp  red
220
  .nopi:
134 diamond 221
    cmp  ah,180         ; Home
222
    je   top_red
1515 dunkaist 223
 
1524 dunkaist 224
    cmp  dword[is_scroll_bar_needed], 0
1515 dunkaist 225
     je  still
226
 
31 halyavin 227
    mov  ebx,dword[prcinfo+46]
228
    sub  ebx,TOP+15
229
    cmp  ah,183 ;PgDn
230
    jne  .nopgdn
1515 dunkaist 231
;    sub  [top],bx
232
 
1524 dunkaist 233
    cmp  dword[is_scroll_bar_needed], 0
1515 dunkaist 234
     je  still
235
 
236
    mov  eax, [scroll_bar_data_vertical.position]
237
    add  eax, AR_OFFSET*7
238
    mov  ebx, [scroll_bar_data_vertical.max_area]
239
    sub  ebx, [scroll_bar_data_vertical.cur_area]
240
    cmp  eax, ebx
241
    mov  dword[scroll_bar_data_vertical.position], eax
242
    jl  @f
243
    mov  dword[scroll_bar_data_vertical.position], ebx
244
  @@:
245
    call Set_position
31 halyavin 246
    jmp  red
247
  .nopgdn:
248
    cmp  ah,177 ;arrDn
249
    jne  .noardn
1515 dunkaist 250
;    sub  [top],CHARH
251
 
1524 dunkaist 252
    cmp  dword[is_scroll_bar_needed], 0
1515 dunkaist 253
     je  still
254
 
255
    mov  eax, [scroll_bar_data_vertical.position]
256
    add  eax, AR_OFFSET
257
    mov  ebx, [scroll_bar_data_vertical.max_area]
258
    sub  ebx, [scroll_bar_data_vertical.cur_area]
259
    cmp  eax, ebx
260
    mov  dword[scroll_bar_data_vertical.position], eax
261
    jl  @f
262
    mov  dword[scroll_bar_data_vertical.position], ebx
263
  @@:
264
    call Set_position
265
 
31 halyavin 266
    jmp  red
267
  .noardn:
268
    mov  cx,[top]
269
    cmp  ah,184 ;PgUp
270
    jne  .nopgup
1515 dunkaist 271
;    add  [top],bx
272
;    cmp  [top],TOP
273
;    jl   red
274
;    mov  [top],TOP
275
;    cmp  cx,[top]
276
;    je   still
277
 
1524 dunkaist 278
    cmp  dword[is_scroll_bar_needed], 0
1515 dunkaist 279
     je  still
280
 
281
    cmp  dword[scroll_bar_data_vertical.position], AR_OFFSET*7
282
    sub  dword[scroll_bar_data_vertical.position], AR_OFFSET*7
283
    jg  @f
284
    mov  dword[scroll_bar_data_vertical.position], 0
285
  @@:
286
    call Set_position
31 halyavin 287
    jmp  red
288
  .nopgup:
289
    cmp  ah,178 ;arrUp
290
    jne  .noarup
1515 dunkaist 291
;    add  [top],CHARH
292
 
1524 dunkaist 293
    cmp  dword[is_scroll_bar_needed], 0
1515 dunkaist 294
     je  still
295
 
296
    cmp  dword[scroll_bar_data_vertical.position], AR_OFFSET
297
    sub  dword[scroll_bar_data_vertical.position], AR_OFFSET
298
    jg  @f
299
    mov  dword[scroll_bar_data_vertical.position], 0
300
  @@:
301
    call Set_position
302
 
303
;    cmp  [top],TOP
304
;    jl   red
305
;    mov  [top],TOP
306
;    cmp  cx,[top]
307
;    je   still
31 halyavin 308
    jmp  red
309
  .noarup:
310
    cmp  ah,56 ;zoom+
311
    jne  .noplus
312
  .zplus:
313
    fld  [FreeFontscale]
314
    fmul [Zoomscale]
315
  .zoom:
316
    fstp [FreeFontscale]
317
    jmp  red
318
  .noplus:
319
    cmp  ah,54 ;zoom-
320
    jne  .nominus
321
  .zminus:
322
    fld  [FreeFontscale]
323
    fdiv [Zoomscale]
324
    jmp  .zoom
325
  .nominus:
1515 dunkaist 326
    cmp  ah,0xB5        ; end
327
    jne  .pre_file_open
328
  .end:
329
 
1524 dunkaist 330
    cmp  dword[is_scroll_bar_needed], 0
1515 dunkaist 331
     je  still
332
 
1524 dunkaist 333
    mov  eax, [scroll_bar_data_vertical.max_area]
334
    sub  eax, [scroll_bar_data_vertical.cur_area]
335
    mov  dword[scroll_bar_data_vertical.position], eax
1515 dunkaist 336
    call Set_position
337
    jmp  red
338
  .pre_file_open:
134 diamond 339
    cmp  ah,108         ; L - load
1512 mario79 340
    jne  still
31 halyavin 341
  .file_open:
1418 mario79 342
;---------------------------------------------------------------------
343
;OpenDialog_start:
1515 dunkaist 344
;       copy_path       open_dialog_name,path,library_path,0
345
 
346
        push    dword OpenDialog_data
347
        call    [OpenDialog_Start]
1418 mario79 348
 
1515 dunkaist 349
;       cmp     [OpenDialog_data.status],2 ; OpenDialog does not start
350
;       je      .sysxtree  ;    some kind of alternative, instead OpenDialog
351
        cmp     [OpenDialog_data.status],1
352
        je      prep_load
353
        jmp     still
1418 mario79 354
;---------------------------------------------------------------------
1512 mario79 355
;.sysxtree:
356
;    or   [mode],RTF_OPENING
357
;    opendialog draw_window, prep_load, st_1, fname_buf
358
;  st_1:
359
;    and  [mode],not RTF_OPENING
360
;    jmp  still;red
361
;  stilld:
362
;    jmp  still
31 halyavin 363
;---------------------------------------------------------------------
364
 
365
  button:
134 diamond 366
    mcall 17            ; 17 - получить идентификатор нажатой кнопки
31 halyavin 367
 
1515 dunkaist 368
    cmp   ah, 1         ; если нажата кнопка с номером 1,
369
    je    .exit
370
    jmp still
371
 
31 halyavin 372
  .exit:
134 diamond 373
    mcall -1            ; иначе конец программы
1515 dunkaist 374
 
375
 
31 halyavin 376
;---------------------------------------------------------------------
1515 dunkaist 377
;---  MOUSE EVENT PROCESSING  ----------------------------------------
378
;---------------------------------------------------------------------
379
mouse:
380
        mcall   37,7
381
        test    eax,    eax
382
        je      .menu_bar_1;.mouse
383
        jmp     still
384
 
385
 
386
.menu_bar_1:
387
        call    .set_mouse_flag
388
@@:
389
        push    dword menu_data_1       ;mouse event for Menu 1
390
        call    [menu_bar_mouse]
391
        cmp     [menu_data_1.click],dword 1
392
        jne     .menu_bar_2
393
        cmp     [menu_data_1.cursor_out],dword 0
394
        jne     .analyse_out_menu_1
395
        jmp     .menu_bar_1
396
.menu_bar_2:
397
        push    dword menu_data_2
398
        call    [menu_bar_mouse]
399
        cmp     [menu_data_2.click],dword 1
400
        jne     .menu_bar_3
401
        cmp     [menu_data_2.cursor_out],dword 0
402
        jne     .analyse_out_menu_2
403
        jmp     .menu_bar_1
404
.menu_bar_3:
405
        push    dword menu_data_3
406
        call    [menu_bar_mouse]
407
        cmp     [menu_data_3.click],dword 1
408
        jne     .scroll_bar
409
        cmp     [menu_data_3.cursor_out],dword 0
410
        jne     .analyse_out_menu_3
411
        jmp     .menu_bar_1
412
 
413
.set_mouse_flag:
414
        xor     eax,eax
415
        inc     eax
416
        mov     [menu_data_1.get_mouse_flag],eax
417
        mov     [menu_data_2.get_mouse_flag],eax
418
        mov     [menu_data_3.get_mouse_flag],eax
419
        ret
420
 
421
.analyse_out_menu_1:
422
        cmp     [menu_data_1.cursor_out],dword 1
423
        je      key.file_open
424
        cmp     [menu_data_1.cursor_out],dword 2
425
        je      button.exit
426
        jmp     red
427
 
428
.analyse_out_menu_2:
429
        cmp     [menu_data_2.cursor_out],dword 1
430
        je      key.zplus
431
        cmp     [menu_data_2.cursor_out],dword 2
432
        je      key.zminus
433
        cmp     [menu_data_2.cursor_out],dword 3
434
        je      key.incp
435
        cmp     [menu_data_2.cursor_out],dword 4
436
        je      key.decp
437
        cmp     [menu_data_2.cursor_out],dword 5
438
        je      key.alignment
439
        cmp     [menu_data_2.cursor_out],dword 6
440
        je      key.color
441
        jmp     red
442
 
443
.analyse_out_menu_3:
444
        cmp     [menu_data_3.cursor_out],dword 1
445
        je      key.help
446
        jmp     red
447
 
448
.scroll_bar:
1524 dunkaist 449
        cmp     dword[is_scroll_bar_needed], 0
1515 dunkaist 450
        je      still
451
.vertical:
452
        mov     eax,[scroll_bar_data_vertical.max_area]
453
        cmp     eax,[scroll_bar_data_vertical.cur_area]
454
        jbe     still
455
; mouse event for Vertical ScrollBar
456
 
457
        push    dword scroll_bar_data_vertical
458
        call    [scrollbar_ver_mouse]
459
 
460
        call    Set_position
461
 
462
        mov     eax,scroll_bar_data_vertical.redraw
463
        xor     ebx,ebx
464
        cmp     [eax],ebx
465
        je      @f
466
        mov     [eax],ebx
467
        jmp     red
468
@@:
469
        cmp     [scroll_bar_data_vertical.delta2],0
470
        jne     still
471
.other:
472
        jmp     still
473
;---------------------------------------------------------------------
31 halyavin 474
;---  ОПРЕДЕЛЕНИЕ И ОТРИСОВКА ОКНА  ----------------------------------
475
;---------------------------------------------------------------------
476
 
477
draw_window:
478
 
1524 dunkaist 479
    mcall 9, procinfo2, -1
2074 dunkaist 480
    test [procinfo2.wnd_state], 0x04
481
    jz   @f
482
    mcall 0, <10,WINW>, <100,WINH>, WIN_COLOR,0x80000000, window_title
483
    ret
484
  @@:
1524 dunkaist 485
    mov  edx, -1
486
    mov  esi, -1
487
 
488
    mov  eax, [procinfo2.box.width]
1525 dunkaist 489
    cmp  eax, [window_width]
1524 dunkaist 490
     je  @f
491
    mov  [is_scroll_bar_needed],    0
1525 dunkaist 492
    cmp  eax, 140
493
     jnl @f
494
    mov  eax, 140
1524 dunkaist 495
  @@:
1525 dunkaist 496
    mov  edx, eax
497
    mov  [window_width],    eax
1524 dunkaist 498
 
499
    mov  eax, [procinfo2.box.height]
1525 dunkaist 500
    cmp  eax, [window_height]
1524 dunkaist 501
     je  @f
502
    mov  [is_scroll_bar_needed],    0
1525 dunkaist 503
    cmp  eax, 80
504
     jnl @f
505
    mov  eax, 80
1524 dunkaist 506
  @@:
1525 dunkaist 507
    mov  esi, eax
508
    mov  [window_height],   eax
1524 dunkaist 509
 
510
    mcall 67, -1, -1
511
 
1515 dunkaist 512
    mcall 12, 1
513
;    mcall 0, <10,WINW>, <100,WINH>, WIN_COLOR,0x805080D0, 0x005080D0
514
;    mcall 4, <8,8>, 0x10DDEEFF, title, titlesize-title
515
    mcall 0, <10,WINW>, <100,WINH>, WIN_COLOR,0x80000000, window_title
2813 leency 516
 
1524 dunkaist 517
;---------------------------------------------
2813 leency 518
    mcall 9, procinfo2, -1
519
 
520
	mcall 48,4
521
	mov [skin_height], eax
522
 
523
	mov  ebx,0*65536-9
524
    add  ebx, [procinfo2.box.width]
525
 
526
	cmp  [is_scroll_bar_needed], 0
527
	je  @f
528
	  sub ebx, SCROLL_WIDTH_SIZE
529
	  dec ebx
530
	@@:
531
 
532
	mov  ecx, 19*65536-23
533
    add  ecx, [procinfo2.box.height]
534
	sub  ecx, [skin_height]
535
 
536
	mov  eax, 13
537
	mov  edx, 0xf0f0f0
538
	int 0x40
539
;---------------------------------------------
1524 dunkaist 540
    cmp  [is_scroll_bar_needed],    0
541
     je  @f
542
    call Set_scroll_position
543
        xor     eax,eax
544
        inc     eax
545
        mov     [scroll_bar_data_vertical.all_redraw],eax
546
; draw for Vertical ScrollBar
547
        push    dword scroll_bar_data_vertical
548
        call    [scrollbar_ver_draw]
549
; reset all_redraw flag
550
        xor     eax,eax
551
        mov     [scroll_bar_data_vertical.all_redraw],eax
552
  @@:
553
;---------------------------------------------
2813 leency 554
	;po-moumu eto govno mamonta
555
 
556
    ;mcall 47,0x30000,isymImplemented,<114,8>, 0x10DDEEFF
557
    ;add  edx,36 shl 16
558
    ;mcall ,,isymMax
31 halyavin 559
    add  edx,40 shl 16
560
    mov  esi,0x104e00e7;0x10f27840
561
    cmp  dword[fileinfo.name],N_A
562
    jne  .noNA
563
    mov  esi,0x10ff0000
564
  .noNA:
1524 dunkaist 565
;    mcall 4,edx,esi,fileinfo.name,[fname_size]
2813 leency 566
    mcall 9,prcinfo,-1
31 halyavin 567
    and  [mode],not RTF_TOEOF
568
    mov  ebx,[edi+42]
569
    cmp  ebx,[wSave]
134 diamond 570
    je   .nochg
31 halyavin 571
  .chg:
572
    mov  [wSave],ebx
134 diamond 573
    or   [mode],RTF_TOEOF
31 halyavin 574
    and  [HDoc],0
575
    and  [line_count],0
1515 dunkaist 576
;    mov  [HClick],-100
31 halyavin 577
  .nochg:
1195 diamond 578
 
1515 dunkaist 579
;---------------------------------------------
1524 dunkaist 580
    call  Set_scroll_position
1195 diamond 581
 
2813 leency 582
;---------------------------------------------
1515 dunkaist 583
    mov ebx, dword[prcinfo+0x3E]
584
    mcall     38, , 65536*18+18, 0x8b8b89
585
    inc ebx
586
    mcall     13, , 65536*0+18, 0xe9e9e2
587
;---------------------------------------------
588
; draw for Menu 1
589
        push    dword menu_data_1
590
        call    [menu_bar_draw]
591
; draw for Menu 2
592
        push    dword menu_data_2
593
        call    [menu_bar_draw]
594
; draw for Menu 3
595
        push    dword menu_data_3
596
        call    [menu_bar_draw]
597
;---------------------------------------------
1195 diamond 598
 
2813 leency 599
    sub  dword[prcinfo+42],2*LMARGIN+SCROLL_WIDTH_SIZE
1515 dunkaist 600
    sub  dword[prcinfo+46],CHARH+25
601
 
31 halyavin 602
 if GUTTER eq 1
603
    mov  ebx,LMARGIN shl 16+20
604
    mov  ecx,20
605
    mov  eax,4
606
    mov  edx,arrow
607
    mov  esi,1
608
  .loop1:
609
    push ecx
610
    mcall ,,0xff0000
611
    pop  ecx
612
    add  ebx,50 shl 16
613
    loop .loop1
614
 end if
615
 if MODE eq RTF
616
    test [mode],RTF_OPENING
617
    jne  .ex
618
    and  [mode],not (RTF_BOTTOM);+RTF_TOEOF)
619
    mov  [colorptr],colortbl
620
    mov  eax,DEFCOLOR
621
    mov  edi,colortbl
622
    mov  ecx,16
623
    rep  stosd
624
    xor  eax,eax
625
    mov  [cGroup],eax
626
    mov  edi,Chp
627
    mov  ecx,SIZE_save
628
    rep  stosb
629
    mov  ax,[top]
630
    mov  word[Free+6],10
631
    mov  word[Free+4],ax
632
    mov  esi,I_END
633
    call RtfParse
1515 dunkaist 634
;    dpd  eax
635
;    dps  'Lines='
31 halyavin 636
    mov  eax,[line_count]
1515 dunkaist 637
;    dpd  eax
638
;    newline
31 halyavin 639
;    movzx  eax,word[Free+4]
640
;    dpd  eax
641
    mov  eax,dword[prcinfo+42]
642
    mov  edx,WIN_COLOR
643
    call draw_progress
644
if BENCH eq 1
645
    mcall 26,9
646
    sub  eax,[bench]
1515 dunkaist 647
;    dps  <13,10,'Bench='>
648
;    dpd  eax
31 halyavin 649
end if
650
 else
651
    mov  [char],0
652
    mov  ebx,10 shl 16+TOP
653
    mov  ecx,16
654
  .l0:
655
    push ecx
656
    mov  ecx,16
657
  .l1:
658
    push ecx
659
    mcall 4,,0x10000000,char,1
660
    pop  ecx
661
    inc  [char]
662
    add  ebx,(CHARW+3) shl 16
663
    loop .l1
664
    pop  ecx
665
    add  ebx,CHARH+2
666
    and  ebx,0x0000ffff
667
    add  ebx,10 shl 16
668
    loop .l0
669
 end if
670
 .ex:
1515 dunkaist 671
call Set_position
672
;---------------------------------------------
1524 dunkaist 673
    cmp  dword[is_scroll_bar_needed], 0
1515 dunkaist 674
     je  @f
675
        xor     eax,eax
676
        inc     eax
677
        mov     [scroll_bar_data_vertical.all_redraw],eax
678
; draw for Vertical ScrollBar
679
        push    dword scroll_bar_data_vertical
680
        call    [scrollbar_ver_draw]
681
; reset all_redraw flag
682
        xor     eax,eax
683
        mov     [scroll_bar_data_vertical.all_redraw],eax
684
  @@:
685
;---------------------------------------------
686
    mcall 12, 2
687
    ret
31 halyavin 688
 
1515 dunkaist 689
;---------------------------------------------------------------------
690
Set_position:
691
    mov  eax, dword[prcinfo+46]
692
    cmp  eax, [HDoc]
1524 dunkaist 693
    mov  dword[is_scroll_bar_needed], 0
1515 dunkaist 694
     jnl .quit
1524 dunkaist 695
    mov  dword[is_scroll_bar_needed], 1
1515 dunkaist 696
 
697
    mov  eax, [scroll_bar_data_vertical.max_area]
698
    mul  dword[prcinfo+46]
699
    div  dword[HDoc]
700
    cmp  eax, [scroll_bar_data_vertical.max_area]
701
    mov  dword[scroll_bar_data_vertical.cur_area],eax
702
     jng @f
703
    mov  eax, [scroll_bar_data_vertical.max_area]
704
    mov  dword[scroll_bar_data_vertical.cur_area], eax
705
  @@:
706
    mov eax, [HDoc]
707
    cmp eax, dword[prcinfo+46]
708
    sub eax, dword[prcinfo+46]
1524 dunkaist 709
    add eax, 20                    ; height of clear area under text when you are at the end of document
1515 dunkaist 710
     jg @f
711
    mov eax, 0
712
  @@:
713
    mul [scroll_bar_data_vertical.position]
714
    mov ebx, [scroll_bar_data_vertical.max_area]
715
    sub ebx, [scroll_bar_data_vertical.cur_area]
716
    div ebx
717
 
718
    mov dword[top], TOP
719
    sub dword[top], eax
720
 
721
  .quit:
722
    ret
723
;---------------------------------------------------------------------
1524 dunkaist 724
Set_scroll_position:
725
    mcall 9, procinfo2, -1
726
    mov eax, dword[procinfo2+0x3E]
2813 leency 727
    sub eax, SCROLL_WIDTH_SIZE
1524 dunkaist 728
    mov word[scroll_bar_data_vertical.start_x], ax
729
 
730
    mov eax, dword[procinfo2+0x42]
731
    sub eax, 17
732
    mov word[scroll_bar_data_vertical.size_y], ax
733
 
734
    ret
735
;---------------------------------------------------------------------
736
 
31 halyavin 737
if GUTTER eq 1
738
   arrow db 0x19
739
end if
740
;---------------------------------------------------------------------
741
;---  ДАННЫЕ ПРОГРАММЫ  ----------------------------------------------
742
;---------------------------------------------------------------------
743
 
744
; интерфейс программы многоязычный
745
;  Вы можете задать язык в MACROS.INC (lang fix язык)
485 heavyiron 746
 
2813 leency 747
window_title:           db      'RtfRead v1.4',0
1524 dunkaist 748
is_scroll_bar_needed    dd      0x0
1525 dunkaist 749
window_width            dd      0x0
750
window_height           dd      0x0
2813 leency 751
skin_height             dd      0x0
1418 mario79 752
;---------------------------------------------------------------------
1512 mario79 753
l_libs_start:
754
 
755
library01  l_libs system_dir_ProcLib+9, cur_dir_path, library_path, system_dir_ProcLib, \
756
err_message_found_lib2, head_f_l, ProcLib_import, err_message_import2, head_f_i
757
 
1524 dunkaist 758
library02  l_libs system_dir_Boxlib+9, cur_dir_path, library_path, system_dir_Boxlib, \
1515 dunkaist 759
err_message_found_lib1, head_f_l, Box_lib_import, err_message_import1, head_f_i
760
 
1512 mario79 761
end_l_libs:
762
;---------------------------------------------------------------------
1515 dunkaist 763
system_dir_ProcLib      db '/sys/lib/proc_lib.obj',0
764
system_dir_Boxlib       db '/sys/lib/box_lib.obj',0
1512 mario79 765
 
766
head_f_i:
1515 dunkaist 767
head_f_l                db 'error',0
1512 mario79 768
 
1515 dunkaist 769
err_message_found_lib1  db 'box_lib.obj - Not found!',0
770
err_message_found_lib2  db 'proc_lib.obj - Not found!',0
1512 mario79 771
 
1515 dunkaist 772
err_message_import1     db 'box_lib.obj - Wrong import!',0
773
err_message_import2     db 'proc_lib.obj - Wrong import!',0
1512 mario79 774
 
775
;---------------------------------------------------------------------
776
align 4
777
ProcLib_import:
1515 dunkaist 778
OpenDialog_Init         dd aOpenDialog_Init
779
OpenDialog_Start        dd aOpenDialog_Start
780
;OpenDialog__Version    dd aOpenDialog_Version
1512 mario79 781
        dd      0
782
        dd      0
1515 dunkaist 783
aOpenDialog_Init        db 'OpenDialog_init',0
784
aOpenDialog_Start       db 'OpenDialog_start',0
785
;aOpenDialog_Version    db 'Version_OpenDialog',0
1512 mario79 786
;---------------------------------------------------------------------
1418 mario79 787
OpenDialog_data:
1515 dunkaist 788
.type                   dd 0
789
.procinfo               dd procinfo ;+4
790
.com_area_name          dd communication_area_name ;+8
791
.com_area               dd 0 ;+12
792
.opendir_pach           dd temp_dir_pach ;+16
793
.dir_default_pach       dd communication_area_default_pach ;+20
794
.start_path             dd open_dialog_path ;+24
795
.draw_window            dd draw_window ;+28
796
.status                 dd 0 ;+32
797
.openfile_pach          dd fname_buf ;+36
798
.filename_area          dd 0    ;+40
799
.filter_area            dd Filter
1582 mario79 800
.x:
801
.x_size			dw 420 ;+48 ; Window X size
802
.x_start		dw 10 ;+50 ; Window X position
803
.y:
804
.y_size			dw 320 ;+52 ; Window y size
805
.y_start		dw 10 ;+54 ; Window Y position
31 halyavin 806
 
1418 mario79 807
communication_area_name:
1515 dunkaist 808
        db 'FFFFFFFF_open_dialog',0
1418 mario79 809
open_dialog_path:
1702 Lrz 810
if __nightbuild eq yes
811
    db '/sys/MANAGERS/opendial',0
812
else
813
    db '/sys/File Managers/opendial',0
814
end if
1418 mario79 815
communication_area_default_pach:
1515 dunkaist 816
        db '/rd/1',0
1418 mario79 817
 
818
Filter:
1436 mario79 819
dd Filter.end - Filter
820
.1:
1418 mario79 821
db 'RTF',0
822
.end:
823
db 0
824
;---------------------------------------------------------------------
139 diamond 825
attrinfo:
826
        dd      5
827
        dd      0
828
        dd      0
829
        dd      0
830
        dd      fileattr
831
        db      0
832
        dd      fileinfo.name
833
 
31 halyavin 834
fileinfo:
835
  dd 0
836
.block:
837
  dd 0
139 diamond 838
  dd 0
31 halyavin 839
.size  dd 1
840
  dd I_END
841
.name:
1515 dunkaist 842
 
31 halyavin 843
;  db '/HD/1/RTF/texts/index_ru.RTF',0
844
 
845
   rb  256-($-.name)
846
;---------------------------------------------------------------------
1515 dunkaist 847
align   4
848
Box_lib_import:
849
 
850
menu_bar_draw           dd aMenu_bar_draw
851
menu_bar_mouse          dd aMenu_bar_mouse
852
 
853
scrollbar_ver_draw      dd aScrollbar_ver_draw
854
scrollbar_ver_mouse     dd aScrollbar_ver_mouse
855
 
856
        dd 0
857
        dd 0
858
 
859
aMenu_bar_draw          db 'menu_bar_draw',0
860
aMenu_bar_mouse         db 'menu_bar_mouse',0
861
;aVersion_menu_bar       db 'version_menu_bar',0
862
 
863
aScrollbar_ver_draw     db 'scrollbar_v_draw',0
864
aScrollbar_ver_mouse    db 'scrollbar_v_mouse',0
865
;---------------------------------------------------------------------
866
align   4
867
menu_data_1:
868
.type:          dd 0    ;+0
869
.x:
870
.size_x         dw 40   ;+4
871
.start_x        dw 2    ;+6
872
.y:
873
.size_y         dw 15   ;+8
874
.start_y        dw 2    ;+10
875
.text_pointer:  dd menu_text_area       ;0      ;+12
876
.pos_pointer:   dd menu_text_area.1     ;0      ;+16
877
.text_end       dd menu_text_area.end   ;0      ;+20
878
.mouse_pos      dd 0    ;+24
879
.mouse_keys     dd 0    ;+28
880
.x1:
881
.size_x1        dw 40   ;+32
882
.start_x1       dw 2    ;+34
883
.y1:
884
.size_y1        dw 100  ;+36
885
.start_y1       dw 18   ;+38
886
.bckg_col       dd 0xeeeeee     ;+40
887
.frnt_col       dd 0xff ;+44
888
.menu_col       dd 0xffffff     ;+48
889
.select         dd 0    ;+52
890
.out_select     dd 0    ;+56
891
.buf_adress     dd 0    ;+60
892
.procinfo       dd 0    ;+64
893
.click          dd 0    ;+68
894
.cursor         dd 0    ;+72
895
.cursor_old     dd 0    ;+76
896
.interval       dd 16   ;+80
897
.cursor_max     dd 0    ;+84
898
.extended_key   dd 0    ;+88
899
.menu_sel_col   dd 0x00cc00     ;+92
900
.bckg_text_col  dd 0    ;+96
901
.frnt_text_col  dd 0xffffff     ;+100
902
.mouse_keys_old dd 0    ;+104
903
.font_height    dd 8    ;+108
904
.cursor_out     dd 0    ;+112
905
.get_mouse_flag dd 0    ;+116
906
 
907
menu_text_area:
908
        db 'File',0
909
.1:
910
        db 'Open',0
911
        db 'Exit',0
912
.end:
913
        db 0
914
;---------------------------------------------------------------------
915
align   4
916
menu_data_2:
917
.type:          dd 0    ;+0
918
.x:
919
.size_x         dw 40   ;+4
920
.start_x        dw 43   ;+6
921
.y:
922
.size_y         dw 15   ;+8
923
.start_y        dw 2    ;+10
924
.text_pointer:  dd menu_text_area_2     ;0      ;+12
925
.pos_pointer:   dd menu_text_area_2.1   ;0      ;+16
926
.text_end       dd menu_text_area_2.end ;0      ;+20
927
.mouse_pos      dd 0    ;+24
928
.mouse_keys     dd 0    ;+28
929
.x1:
930
.size_x1        dw 50   ;+32
931
.start_x1       dw 43   ;+34
932
.y1:
933
.size_y1        dw 100  ;+36
934
.start_y1       dw 18   ;+38
935
.bckg_col       dd 0xeeeeee     ;+40
936
.frnt_col       dd 0xff ;+44
937
.menu_col       dd 0xffffff     ;+48
938
.select         dd 0    ;+52
939
.out_select     dd 0    ;+56
940
.buf_adress     dd 0    ;+60
941
.procinfo       dd 0    ;+64
942
.click          dd 0    ;+68
943
.cursor         dd 0    ;+72
944
.cursor_old     dd 0    ;+76
945
.interval       dd 16   ;+80
946
.cursor_max     dd 0    ;+84
947
.extended_key   dd 0    ;+88
948
.menu_sel_col   dd 0x00cc00     ;+92
949
.bckg_text_col  dd 0    ;       +96
950
.frnt_text_col  dd 0xffffff     ;+100
951
.mouse_keys_old dd 0    ;+104
952
.font_height    dd 8    ;+108
953
.cursor_out     dd 0    ;+112
954
.get_mouse_flag dd 0    ;+116
955
 
956
menu_text_area_2:
957
        db 'View',0
958
.1:
959
        db 'Zoom +',0
960
        db 'Zoom -',0
1524 dunkaist 961
        db ' > >',0
962
        db ' << ',0
1515 dunkaist 963
        db 'Align',0
964
        db 'Color',0
965
.end:
966
        db 0
967
;---------------------------------------------------------------------
968
align   4
969
menu_data_3:
970
.type:          dd 0    ;+0
971
.x:
972
.size_x         dw 40   ;+4
973
.start_x        dw 84   ;+6
974
.y:
975
.size_y         dw 15   ;+8
976
.start_y        dw 2    ;+10
977
.text_pointer:  dd menu_text_area_3     ;0      ;+12
978
.pos_pointer:   dd menu_text_area_3.1   ;0      ;+16
979
.text_end       dd menu_text_area_3.end ;0      ;+20
980
.mouse_pos      dd 0    ;+24
981
.mouse_keys     dd 0    ;+28
982
.x1:
983
.size_x1        dw 40   ;+32
984
.start_x1       dw 84   ;+34
985
.y1:
986
.size_y1        dw 100  ;+36
987
.start_y1       dw 18   ;+38
988
.bckg_col       dd 0xeeeeee     ;+40
989
.frnt_col       dd 0xff ;+44
990
.menu_col       dd 0xffffff     ;+48
991
.select         dd 0    ;+52
992
.out_select     dd 0    ;+56
993
.buf_adress     dd 0    ;+60
994
.procinfo       dd 0    ;+64
995
.click          dd 0    ;+68
996
.cursor         dd 0    ;+72
997
.cursor_old     dd 0    ;+76
998
.interval       dd 16   ;+80
999
.cursor_max     dd 0    ;+84
1000
.extended_key   dd 0    ;+88
1001
.menu_sel_col   dd 0x00cc00     ;+92
1002
.bckg_text_col  dd 0    ;       +96
1003
.frnt_text_col  dd 0xffffff     ;+100
1004
.mouse_keys_old dd 0    ;+104
1005
.font_height    dd 8    ;+108
1006
.cursor_out     dd 0    ;+112
1007
.get_mouse_flag dd 0    ;+116
1008
 
1009
menu_text_area_3:
1010
        db 'Help',0
1011
.1:
1012
        db 'Home',0
1013
.end:
1014
        db 0
1015
;---------------------------------------------------------------------
1016
align   4
1017
scroll_bar_data_vertical:
1018
.x:
2813 leency 1019
.size_x         dw SCROLL_WIDTH_SIZE;+0
1515 dunkaist 1020
.start_x        dw WINW-25  ;+2
1021
.y:
1022
.size_y         dw WINH-45  ;+4
1023
.start_y        dw 19   ;+6
2813 leency 1024
.btn_high       dd SCROLL_WIDTH_SIZE    ;+8
1025
.type           dd 0    ;+12
1515 dunkaist 1026
.max_area       dd 300       ;+16
1027
.cur_area       dd 50   ;+20
1028
.position       dd 0    ;+24
1029
.bckg_col       dd 0xAAAAAA     ;+28
1030
.frnt_col       dd 0xCCCCCC     ;+32
1031
.line_col       dd 0    ;+36
1032
.redraw         dd 0    ;+40
1033
.delta          dw 0    ;+44
1034
.delta2         dw 0    ;+46
1035
.run_x:
1036
.r_size_x       dw 0    ;+48
1037
.r_start_x      dw 0    ;+50
1038
.run_y:
1039
.r_size_y       dw 0    ;+52
1040
.r_start_y      dw 0    ;+54
1041
.m_pos          dd 0    ;+56
1042
.m_pos_2        dd 0    ;+60
1043
.m_keys         dd 0    ;+64
1044
.run_size       dd 0    ;+68
1045
.position2      dd 0    ;+72
1046
.work_size      dd 0    ;+76
1047
.all_redraw     dd 0    ;+80
1048
.ar_offset      dd AR_OFFSET   ;+84
2805 dunkaist 1049
 
1515 dunkaist 1050
;---------------------------------------------------------------------
2805 dunkaist 1051
;blind db ?
7433 leency 1052
 
2805 dunkaist 1053
  Zoomscale dd 1.15
1054
  FreeFontscale dd 0.04
7433 leency 1055
 
2805 dunkaist 1056
  Free BGIfree FONT_NAME,0,0,1.0,1.0,char,1,0x44000000,0
7433 leency 1057
 
1058
 
1524 dunkaist 1059
I_END0:
2805 dunkaist 1060
fname_buf:
1061
        rb      1024+16
1062
fileattr rd 40/4
1063
if BENCH eq 1
1064
  bench dd ?
1065
end if
1066
tail dd ?
1067
cGroup dd ?
1068
Chp:
1069
  CHP
1070
Pap:
1071
  PAP
1072
Sep:
1073
  SEP
1074
Dop:
1075
  DOP
1076
rds db ?
1077
ris db ?
1078
cbBin dd ?
1079
lParam dd ?
1080
fSkipDestIfUnk db ?
1081
mode dd ?
1082
curheight dw ?
1083
maxheight dw ?
1084
RetroBlock dd ?
1085
RetroSave:
1086
  SAVE
1087
prcinfo rb 1024
1088
RetroPtr dd ?
1089
colorptr dd ?
1090
colortbl rd 16
1091
ct_end:
1092
fname_size dd ?
1093
max_block dd ?
1094
cur_block dd ?
1095
HDoc dd ?
1096
;HClick dd ?
1097
top dw ?
1098
line_count dd ?
1099
par_count  dd ?
1100
char db ?
1101
pitch db ?
1102
wSave dd ?
1103
RetroXY dd ?
1104
RetroGroup dd ?
1105
 
1106
save_stack:
1107
rb RTFSTACKSIZE
1108
save_limit:
1109
rb BGIFONTSIZE
1110
 
1111
listptr dd ?
1112
szKeyword rb 31
1113
szParameter rb 21
1114
block_end dd ?
1115
 
7433 leency 1116
help_file:
1117
    file  'reader.rtf'
1118
help_end:
1119
 
1120
litt_file:
1121
	file 'litt.chr'
1122
litt_end:
1123
 
2805 dunkaist 1124
;---------------------------------------------------------------------
134 diamond 1125
I_END:                             ; метка конца программы
31 halyavin 1126
rb RTFSIZE
1127
esp1:
1128
rb ESPSIZE
3939 mario79 1129
procinfo process_information
1524 dunkaist 1130
procinfo2 process_information
1418 mario79 1131
;---------------------------------------------------------------------
1132
temp_dir_pach:
1133
        rb 4096
1512 mario79 1134
cur_dir_path:
1515 dunkaist 1135
        rb 4096
1512 mario79 1136
library_path:
1515 dunkaist 1137
        rb 4096
1418 mario79 1138
;---------------------------------------------------------------------
1524 dunkaist 1139
    rb ESPSIZE                      ;stack
134 diamond 1140
esp_end:
1524 dunkaist 1141
sys_mem: