Subversion Repositories Kolibri OS

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
7452 0CodErr 1
.586
2
.Model Flat, StdCall
3
Option CaseMap: None
4
 
5
Public EXPORTS
6
 
7
FALSE = 0
8
TRUE  = Not FALSE
9
 
10
CStr Macro QuotedText:VarArg
11
Local LocalText
12
.Const
13
LocalText db QuotedText,0
14
.Code
15
ExitM 
16
EndM
17
 
18
RepArg Macro Arg
19
  Local NewStr
20
    Quot SubStr , 1, 1
21
  IfIdn Quot, <">
22
    .Data
23
      NewStr db Arg,0
24
    .Code
25
    ExitM 
26
  Else
27
    ExitM 
28
  EndIf
29
EndM
30
 
31
@ Macro Function:Req, Args:VarArg
32
  Arg equ 
33
  For Var, 
34
    Arg CatStr Arg, <, RepArg(Var)>
35
  EndM
36
  Arg
37
  ExitM 
38
EndM
39
 
40
TMem Struct
41
  State   Dword ?
42
  Caption Dword ?
43
  Prompt  Dword ?
44
  Default Dword ?
45
  Flags   Dword ?
46
  Error   Dword ?
47
  Result  Dword ?
48
TMem EndS
49
 
50
TEditBox Struct
51
  x_size             Dword  ?
52
  left               SDword ?
53
  top                SDword ?
54
  color              Dword  ?
55
  shift_color        Dword  ?
56
  focus_border_color Dword  ?
57
  blur_border_color  Dword  ?
58
  text_color         Dword  ?
59
  max                Dword  ?
60
  text               Dword  ?
61
  mouse_variable     Dword  ?
62
  flags              Dword  ?
63
  count              Dword  ?
64
  pos                Dword  ?
65
  offs               Dword  ?
66
  cl_curs_x          SWord  ?
67
  cl_curs_y          SWord  ?
68
  shift              Word   ?
69
  shift_old          Word   ?
70
  height             Dword  ?
71
  char_width         Dword  ?
72
TEditBox EndS
73
 
74
TStandartColors Struct
75
  frames           Dword ?
76
  grab             Dword ?
77
  grab_button      Dword ?
78
  grab_button_text Dword ?
79
  grab_text        Dword ?
80
  work             Dword ?
81
  work_button      Dword ?
82
  work_button_text Dword ?
83
  work_text        Dword ?
84
  work_graph       Dword ?
85
TStandartColors EndS
86
 
87
TRect Struct
88
  Left   SDword ?
89
  Top    SDword ?
90
  Right  SDword ?
91
  Bottom SDword ?
92
TRect EndS
93
 
94
TBox Struct
95
  Left  SDword ?
96
  Top   SDword ?
97
  SizeX Dword  ?
98
  SizeY Dword  ?
99
TBox EndS
100
 
101
TSize Struct
102
  SizeY Word ?
103
  SizeX Word ?
104
TSize EndS
105
 
106
TLongPoint Struct
107
  Y SDword ?
108
  X SDword ?
109
TLongPoint EndS
110
 
111
TPoint Struct
112
  Y SWord ?
113
  X SWord ?
114
TPoint EndS
115
 
116
TKeyboardInput Struct
117
  Flag Byte ?
118
  Code Byte ?
119
  Union
120
    Scan    Byte ?
121
    Control Word ?
122
  EndS
123
TKeyboardInput EndS
124
 
125
TButtonInput Struct
126
  MouseButton Byte ?
127
  ID          Word ?
128
  HiID        Byte ?
129
TButtonInput EndS
130
 
131
TThreadInfo Struct
132
  CpuUsage     Dword ?
133
  WinStackPos  Word ?
134
  reserved0    Word ?
135
  reserved1    Word ?
136
  ThreadName   Byte 11 Dup (?)
137
  reserved2    Byte ?
138
  MemAddress   Dword ?
139
  MemUsage     Dword ?
140
  Identifier   Dword ?
141
  Window       TBox <>
142
  ThreadState  Word ?
143
  reserved3    Word ?
144
  Client       TBox <>
145
  WindowState  Byte ?
146
  EventMask    Dword ?
147
  KeyboardMode Byte ?
148
  reserved4    Byte 948 Dup (?)
149
TThreadInfo EndS
150
 
151
IfDef     LANG_IT
152
  szCancel equ 
153
ElseIfDef LANG_SP
154
  szCancel equ 
155
ElseIfDef LANG_RU
156
  szCancel equ 
157
ElseIfDef LANG_EN
158
  szCancel equ 
159
Else
160
  .Err LANG_??
161
EndIf
162
 
163
WINDOW_BORDER_SIZE = 5
164
 
165
; Events
166
REDRAW_EVENT      = 1
167
KEY_EVENT         = 2
168
BUTTON_EVENT      = 3
169
BACKGROUND_EVENT  = 5
170
MOUSE_EVENT       = 6
171
IPC_EVENT         = 7
172
NETWORK_EVENT     = 8
173
DEBUG_EVENT       = 9
174
 
175
; Window Style Constants
176
WS_SKINNED_FIXED  = 4000000H
177
WS_COORD_CLIENT   = 20000000H
178
WS_CAPTION        = 10000000H
179
 
180
; Caption Style Constants
181
CS_MOVABLE        = 0
182
 
183
; Event Mask Constants
184
EM_REDRAW         = 001H
185
EM_KEY            = 002H
186
EM_BUTTON         = 004H
187
EM_BACKGROUND     = 010H
188
EM_MOUSE          = 020H
189
EM_IPC            = 040H
190
EM_NETWORK        = 080H
191
EM_DEBUG          = 100H
192
 
193
; Draw zero terminated string for DrawText
194
DT_ZSTRING        = 080000000H
195
 
196
; Charset specifiers for DrawText
197
DT_CP866_8X16     = 10000000H
198
DT_CP866_6X9      = 00000000H
199
 
200
; Button identifiers
201
BUTTON_CLOSE      = 1
202
BUTTON_OK         = 10
203
BUTTON_CANCEL     = 20
204
 
205
KEY_CODE_ENTER   = 13
206
KEY_CODE_ESCAPE  = 27
207
 
208
; Flags = [mouse|screen|parent][number|string]
209
IBF_STRING = 0      ; в буфер будет записана строка         ; string will be written to the buffer
210
IBF_NUMBER = 1      ; в буфер будет записано число          ; number will be written to the buffer
211
IBF_MOUSE_REL = 0   ; относительно положения указателя мыши ; relative to the mouse pointer
212
IBF_SCREEN_REL = 8  ; относительно экрана                   ; relative to the screen
213
IBF_PARENT_REL = 16 ; относительно родительского окна       ; relative to the parent window
214
 
215
; Errors
216
IBE_NO_ERROR = 0        ; успешно, нет ошибки            ; success
217
IBE_NUMBER_OVERFLOW = 1 ; переполнение при вводе числа   ; number greater than 0xFFFFFFFFFFFFFFFF
218
IBE_RESULT_TOO_LONG = 2 ; результат не умещается в буфер ; result does not fit into buffer
219
 
220
EDIT1_TEXT_BUFFER_SIZE = 1000
221
 
222
EditBoxDraw_proto     TypeDef Proto :Ptr
223
EditBoxKey_proto      TypeDef Proto :Ptr
224
EditBoxMouse_proto    TypeDef Proto :Ptr
225
EditBoxSetText_proto  TypeDef Proto :Ptr, :Ptr
226
 
227
EditBoxDraw_proc      TypeDef Ptr EditBoxDraw_proto
228
EditBoxKey_proc       TypeDef Ptr EditBoxKey_proto
229
EditBoxMouse_proc     TypeDef Ptr EditBoxMouse_proto
230
EditBoxSetText_proc   TypeDef Ptr EditBoxSetText_proto
231
 
232
InputBox Proto Buffer:Ptr, Caption:Ptr, Prompt:Ptr, Default:Ptr, Flags:Dword, BufferSize:Dword, RedrawProc:Ptr
233
 
234
; -------------------------------------------------------- ;
235
.Data; --------------------------------------------------- ;
236
; -------------------------------------------------------- ;
237
Edit1 TEditBox <\
238
      0,\
239
      5,\
240
      26,\
241
      00FFFFFFH,\
242
      00A4C4E4H,\
243
      0,\
244
      0,\
245
      DT_CP866_8X16,\
246
      EDIT1_TEXT_BUFFER_SIZE,\
247
      Offset Edit1TextBuffer,\
248
      Offset Edit1MouseVariable,\
249
      4002H,\
250
      0,\
251
      0,\
252
      0,\
253
      0,\
254
      0,\
255
      0,\
256
      0\
257
>
258
 
259
Mem Dword Offset InpuBox_Mem
260
 
261
FontHeight Dword 9
262
 
263
Initialized db FALSE
264
 
265
; -------------------------------------------------------- ;
266
.Data? ; ------------------------------------------------- ;
267
; -------------------------------------------------------- ;
268
BoxLib         Dword ?
269
 
270
EditBoxDraw     EditBoxDraw_proc    ?
271
EditBoxKey      EditBoxKey_proc     ?
272
EditBoxMouse    EditBoxMouse_proc   ?
273
EditBoxSetText  EditBoxSetText_proc ?
274
 
275
SC TStandartColors <>
276
Window TBox <>
277
Screen TSize <>
278
 
279
Key TKeyboardInput <>
280
Button TButtonInput <>
281
 
282
Align 4
283
ThreadInfo TThreadInfo <>
284
 
285
Align 4
286
ParentThreadInfo TThreadInfo <>
287
 
288
Align 4
289
Margin Dword ?
290
PromptPos TLongPoint <>
291
ButtonCancel TBox <>
292
ButtonOK TBox <>
293
 
294
WinCaption Dword ?
295
TextPrompt Dword ?
296
TextDefault Dword ?
297
TextOK Dword ?
298
TextCancel Dword ?
299
 
300
TextOKLeft     Dword ?
301
TextOKTop      Dword ?
302
TextCancelLeft Dword ?
303
TextCancelTop  Dword ?
304
 
305
TextFlags Dword ?
306
 
307
FontWidth Dword ?
308
 
309
MousePos TPoint <>
310
 
311
ParentID Dword ?
312
ParentSlot Dword ?
313
 
314
Edit1MouseVariable Dword ?
315
 
316
Align 4
317
Edit1TextBuffer Byte EDIT1_TEXT_BUFFER_SIZE + 2 Dup (?) ; buffer for Edit1.text
318
 
319
Align 4
320
InpuBox_Mem Byte SizeOf(TMem) + SizeOf(Qword) Dup (?)
321
 
322
Align 4
323
Byte 256 Dup (?)
324
InputBox_Thread_StackTop Label Dword
325
; -------------------------------------------------------- ;
326
.Code ; -------------------------------------------------- ;
327
; -------------------------------------------------------- ;
328
; convert a string, which represents an signed integer to a number
329
; if a number too large(greater than 0xFFFFFFFFFFFFFFFF) then return 0xFFFFFFFFFFFFFFFF and the CARRY flag
330
a2i Proc Uses ebx esi edi S:Ptr
331
Local LoDword:Dword, HiDword:Dword, Tmp:Dword
332
   mov    edi, 10
333
   mov    esi, S
334
   xor    eax, eax
335
   xor    edx, edx
336
   xor    ebx, ebx
337
   mov    LoDword, eax
338
   mov    HiDword, eax
339
   movzx  ecx, Byte Ptr [esi]
340
   inc    esi
341
   cmp    cl, '-'
342
   jne    @no_sign
343
   dec    ebx
344
@next:
345
   movzx  ecx, Byte Ptr [esi]
346
   inc    esi
347
@no_sign:
348
   sub    cl, 48
349
   cmp    cl, 9
350
   jnbe   @done
351
   mov    eax, HiDword
352
   mul    edi           ; multiply by 10
353
   jc     @overflow     ; CF flag are set if edx is not 0
354
   mov    Tmp, eax
355
   mov    eax, LoDword
356
   mul    edi           ; multiply by 10
357
   add    edx, Tmp
358
   jc     @overflow
359
   add    eax, ecx
360
   adc    edx, 0
361
   mov    LoDword, eax
362
   mov    HiDword, edx
363
   jnc    @next
364
@overflow:
365
   mov    eax, -1       ; RETURN 0xFFFFFFFFFFFFFFFF
366
   mov    edx, eax
367
   jmp    @exit
368
@done:
369
   add    eax, ebx
370
   adc    edx, ebx
371
   xor    eax, ebx
372
   xor    edx, ebx
373
@exit:
374
  ret
375
a2i EndP
376
; -------------------------------------------------------- ;
377
Align 4
378
MemCpy Proc Uses esi edi Src:Ptr, Dst:Ptr, Count:Dword
379
  mov    edi, Dst
380
  mov    esi, Src
381
  mov    ecx, Count
382
  mov    edx, ecx
383
  shr    ecx, 2
384
  and    edx, 3
385
  rep movsd
386
  mov    ecx, edx
387
  rep movsb
388
  ret
389
MemCpy EndP
390
; -------------------------------------------------------- ;
391
Align 4
392
StrLen Proc Uses edi Src:Ptr
393
  mov    edi, Src
394
  mov    ecx, 0FFFFFFFFH
395
  xor    al, al
396
  repne scasb
397
  mov    eax, 0FFFFFFFEH
398
  sub    eax, ecx
399
  ret
400
StrLen EndP
401
; -------------------------------------------------------- ;
402
Align 4
403
StrCpy Proc Uses esi edi Src:Ptr, Dst:Ptr
404
  mov    edi, Src
405
  mov    ecx, 0FFFFFFFFH
406
  mov    esi, edi
407
  xor    eax, eax
408
  repne scasb
409
  not    ecx
410
  mov    edi, Dst
411
  mov    edx, ecx
412
  shr    ecx, 2
413
  and    edx, 3
414
  rep movsd
415
  mov    ecx, edx
416
  rep movsb
417
  mov    eax, edi
418
  ret
419
StrCpy EndP
420
; -------------------------------------------------------- ;
421
Align 4
422
GetThreadInfo Proc Uses ebx Slot:Dword, Buffer: Ptr TThreadInfo
423
  mov    eax, 9
424
  mov    ebx, Buffer
425
  mov    ecx, Slot
426
  int    64
427
  ret
428
GetThreadInfo EndP
429
; -------------------------------------------------------- ;
430
Align 4
431
ActivateWindow Proc Uses ebx Slot:Dword
432
  mov    eax, 18
433
  mov    ebx, 3
434
  mov    ecx, Slot
435
  int    64
436
  ret
437
ActivateWindow  EndP
438
; -------------------------------------------------------- ;
439
Align 4
440
GetSlotById Proc Uses ebx ID:Dword
441
  mov    eax, 18
442
  mov    ebx, 21
443
  mov    ecx, ID
444
  int    64
445
  ret
446
GetSlotById  EndP
447
; -------------------------------------------------------- ;
448
Align 4
449
SetEventMask Proc Uses ebx EventMask:Dword
450
  mov    eax, 40
451
  mov    ebx, EventMask
452
  int    64
453
  ret
454
SetEventMask EndP
455
; -------------------------------------------------------- ;
456
Align 4
457
WaitEvent Proc
458
  mov    eax, 10
459
  int    64
460
  ret
461
WaitEvent EndP
462
; -------------------------------------------------------- ;
463
Align 4
464
GetButton Proc
465
  mov    eax, 17
466
  int    64
467
  ret
468
GetButton EndP
469
; -------------------------------------------------------- ;
470
Align 4
471
GetKey Proc
472
  mov    eax, 2
473
  int    64
474
  ret
475
GetKey EndP
476
; -------------------------------------------------------- ;
477
Align 4
478
BeginDraw Proc
479
  push   ebx
480
  mov    eax, 12
481
  mov    ebx, 1
482
  int    64
483
  pop    ebx
484
  ret
485
BeginDraw EndP
486
; -------------------------------------------------------- ;
487
Align 4
488
EndDraw Proc
489
  push   ebx
490
  mov    eax, 12
491
  mov    ebx, 2
492
  int    64
493
  pop    ebx
494
  ret
495
EndDraw EndP
496
; -------------------------------------------------------- ;
497
Align 4
498
DrawWindow Proc Left:SDword, Top:SDword, Right:SDword, Bottom:SDword, Caption:Ptr, BackColor:Dword, Style:Dword, CapStyle:Dword
499
  push   ebx
500
  push   edi
501
  push   esi
502
  xor    eax, eax
503
  mov    ebx, Left
504
  mov    ecx, Top
505
  shl    ebx, 16
506
  shl    ecx, 16
507
  or     ebx, Right
508
  or     ecx, Bottom
509
  mov    edx, Style
510
  or     edx, BackColor
511
  mov    edi, Caption
512
  mov    esi, CapStyle
513
  int    64
514
  pop    esi
515
  pop    edi
516
  pop    ebx
517
  ret
518
DrawWindow EndP
519
; -------------------------------------------------------- ;
520
Align 4
521
ThreadTerminate Proc
522
  mov    eax, 0FFFFFFFFH
523
  int    64
524
  ret
525
ThreadTerminate EndP
526
; -------------------------------------------------------- ;
527
Align 4
528
LoadLibrary Proc Path:Ptr
529
  push   ebx
530
  mov    eax, 68
531
  mov    ebx, 19
532
  mov    ecx, Path
533
  int    64
534
  pop    ebx
535
  ret
536
LoadLibrary EndP
537
; -------------------------------------------------------- ;
538
Align 4
539
GetProcAddress Proc hLib:Ptr, ProcName:Ptr
540
  push   esi
541
  push   edi
542
  push   ebx
543
  mov    edx, hLib
544
  xor    eax, eax
545
  test   edx, edx
546
  jz     @end
547
  mov    edi, ProcName
548
  mov    ecx, 0FFFFFFFFH
549
  repne scasb
550
  mov    ebx, ecx
551
  not    ebx
552
@next:
553
  mov    esi, [edx]
554
  test   esi, esi
555
  jz     @end
556
  mov    ecx, ebx
557
  mov    edi, ProcName
558
  add    edx, 8
559
  repe cmpsb
560
  jne    @next
561
  mov    eax, [edx - 4]
562
@end:
563
  pop    ebx
564
  pop    edi
565
  pop    esi
566
  ret
567
GetProcAddress EndP
568
; -------------------------------------------------------- ;
569
Align 4
570
GetScreenSize Proc
571
  push   ebx
572
  mov    eax, 61
573
  mov    ebx, 1
574
  int    64
575
  pop    ebx
576
  ret
577
GetScreenSize EndP
578
; -------------------------------------------------------- ;
579
Align 4
580
GetSkinHeight Proc
581
  push   ebx
582
  mov    eax, 48
583
  mov    ebx, 4
584
  int    64
585
  pop    ebx
586
  ret
587
GetSkinHeight EndP
588
; -------------------------------------------------------- ;
589
Align 4
590
GetFontHeight Proc
591
  push   ebx
592
  mov    eax, 48
593
  mov    ebx, 11
594
  int    64
595
  pop    ebx
596
  ret
597
GetFontHeight EndP
598
; -------------------------------------------------------- ;
599
Align 4
600
DrawButton Proc Left:SDword, Top:SDword, Right:SDword, Bottom:SDword, BackColor:Dword, Style:Dword, ID:Dword
601
  push   ebx
602
  push   esi
603
  mov    eax, 8
604
  mov    ebx, Left
605
  mov    ecx, Top
606
  shl    ebx, 16
607
  shl    ecx, 16
608
  or     ebx, Right
609
  or     ecx, Bottom
610
  mov    edx, ID
611
  or     edx, Style
612
  mov    esi, BackColor
613
  int    64
614
  pop    esi
615
  pop    ebx
616
  ret
617
DrawButton EndP
618
; -------------------------------------------------------- ;
619
Align 4
620
GetStandardColors Proc ColorTable:Ptr, TableSize:Dword
621
  push   ebx
622
  mov    eax, 48
623
  mov    ebx, 3
624
  mov    ecx, ColorTable
625
  mov    edx, TableSize
626
  int    64
627
  pop    ebx
628
  ret
629
GetStandardColors EndP
630
; -------------------------------------------------------- ;
631
Align 4
632
DrawText Proc X:SDword, Y:SDword, Text:Ptr, ForeColor:Dword, BackColor:Dword, Flags:Dword, Count:Dword
633
  push   ebx
634
  push   edi
635
  push   esi
636
  mov    eax, 4
637
  mov    ebx, X
638
  shl    ebx, 16
639
  or     ebx, Y
640
  mov    ecx, Flags
641
  or     ecx, ForeColor
642
  mov    edx, Text
643
  mov    edi, BackColor
644
  mov    esi, Count
645
  int    64
646
  pop    esi
647
  pop    edi
648
  pop    ebx
649
  ret
650
DrawText EndP
651
; -------------------------------------------------------- ;
652
Align 4
653
GetMousePos Proc
654
  push   ebx
655
  mov    eax, 37
656
  mov    ebx, 0
657
  int    64
658
  pop    ebx
659
  ret
660
GetMousePos EndP
661
; -------------------------------------------------------- ;
662
Align 4
663
ThreadCreate Proc Uses ebx Entry:Ptr, Stack:Ptr
664
  mov    eax, 51
665
  mov    ebx, 1
666
  mov    ecx, Entry
667
  mov    edx, Stack
668
  int    64
669
  ret
670
ThreadCreate EndP
671
; -------------------------------------------------------- ;
672
Align 4
673
InputBox Proc Uses ebx esi edi Buffer:Ptr, Caption:Ptr, Prompt:Ptr, Default:Ptr, Flags:Dword, BufferSize:Dword, RedrawProc:Ptr
674
Local InputBoxID:Dword, InputBoxSlot:Dword, SharedMemorySize:Dword
675
Local EventMask:Dword, Result:Dword
676
  Invoke GetThreadInfo, 0FFFFFFFFH, Offset ParentThreadInfo
677
 
678
  mov eax, ParentThreadInfo.Identifier
679
  mov ParentID, eax
680
  mov ParentSlot, @(GetSlotById, ParentID)
681
 
682
  mov ebx, Mem
683
  mov [ebx][TMem.State], FALSE
684
 
685
  mov eax, Caption
686
  mov [ebx][TMem.Caption], eax
687
 
688
  mov eax, Prompt
689
  mov [ebx][TMem.Prompt], eax
690
 
691
  mov eax, Default
692
  mov [ebx][TMem.Default], eax
693
 
694
  mov eax, Flags
695
  mov [ebx][TMem.Flags], eax
696
 
697
  mov EventMask, @(SetEventMask, EM_REDRAW)
698
 
699
  mov InputBoxID, @(ThreadCreate, Offset InputBox_Thread, Offset InputBox_Thread_StackTop)
700
  mov InputBoxSlot, @(GetSlotById, InputBoxID)
701
  .Repeat
702
    Invoke WaitEvent
703
    Invoke ActivateWindow, InputBoxSlot
704
    .If RedrawProc != 0
705
      call RedrawProc
706
    .EndIf
707
  .Until Dword Ptr [ebx][TMem.State] == TRUE
708
 
709
  .If Flags & IBF_NUMBER
710
    .If [ebx][TMem.Error] != IBE_NUMBER_OVERFLOW
711
      mov edi, [ebx][TMem.Result]
712
      add edi, SizeOf(Qword) - 1
713
      mov edx, edi
714
      mov ecx, SizeOf(Qword)
715
      std
716
      xor al, al
717
      repe scasb
718
      cld
719
      lea eax, [ecx + 1]
720
      .If eax > BufferSize
721
        mov [ebx][TMem.Error], IBE_RESULT_TOO_LONG
722
      .EndIf
723
      Invoke MemCpy, [ebx][TMem.Result], Buffer, BufferSize
724
    .EndIf
725
  .Else
726
    .If @(StrLen, [ebx][TMem.Result]) <= BufferSize
727
      Invoke StrCpy, [ebx][TMem.Result], Buffer
728
    .Else
729
      mov [ebx][TMem.Error], IBE_RESULT_TOO_LONG
730
      mov eax, BufferSize
731
      dec eax
732
      mov edi, Buffer
733
      add edi, eax
734
      mov Byte Ptr [edi], 0
735
      Invoke MemCpy, [ebx][TMem.Result], Buffer, eax
736
    .EndIf
737
  .EndIf
738
 
739
  mov eax, [ebx][TMem.Error]
740
  mov Result, eax
741
 
742
  Invoke SetEventMask, EventMask
743
  Invoke ActivateWindow, @(GetSlotById, ParentThreadInfo.Identifier)
744
 
745
  mov eax, Result
746
  ret
747
InputBox EndP
748
; -------------------------------------------------------- ;
749
Align 4
750
OnRedraw Proc
751
        Invoke BeginDraw
752
        Invoke GetStandardColors, Offset SC, SizeOf(SC)
753
        mov MousePos, @(GetMousePos)
754
        mov FontHeight, @(GetFontHeight)
755
        .If FontHeight > 9
756
          mov FontHeight, 16
757
        .EndIf
758
;
759
        .If FontHeight > 9
760
          mov eax, DT_ZSTRING + DT_CP866_8X16
761
          mov Edit1.text_color, DT_CP866_8X16
762
          mov FontWidth, 8
763
        .Else
764
          mov eax, DT_ZSTRING + DT_CP866_6X9
765
          mov Edit1.text_color, DT_CP866_6X9
766
          mov FontWidth, 6
767
        .EndIf
768
        mov TextFlags, eax
769
;
770
        mov ebx, Mem
771
 
772
        mov eax, [ebx][TMem.Caption]
773
        mov WinCaption, eax
774
        mov eax, [ebx][TMem.Prompt]
775
        mov TextPrompt, eax
776
 
777
        mov TextOK, CStr("   OK   ")
778
        mov TextCancel, szCancel
779
 
780
        mov eax, SC.work_graph
781
        mov Edit1.focus_border_color, eax
782
; Margin = FontHeight / 2
783
        mov eax, FontHeight
784
        shr eax, 1
785
        mov Margin, eax
786
; Window.SizeY =
787
;   GetSkinHeight + Margin + FontHeight + Margin + 1 + FontHeight + 1 + Margin + FontHeight + Margin + FontWidth + Margin + WINDOW_BORDER_SIZE
788
        Invoke GetSkinHeight
789
        add eax, Margin
790
        add eax, FontHeight
791
        add eax, Margin
792
        add eax, 1
793
        add eax, FontHeight
794
        add eax, 1
795
        add eax, Margin
796
        add eax, FontHeight
797
        add eax, Margin
798
        add eax, FontWidth
799
        add eax, Margin
800
        add eax, WINDOW_BORDER_SIZE
801
        mov Window.SizeY, eax
802
; Window.SizeX = Screen.SizeX / 4
803
        mov Screen, @(GetScreenSize)
804
        movzx  eax, Screen.SizeX
805
        shr eax, 2
806
        mov Window.SizeX, eax
807
        .If (ebx != 0) && ([ebx][TMem.Flags] & IBF_SCREEN_REL)
808
; Window.Left = (Screen.SizeX - Window.SizeX) / 2
809
          movzx eax, Screen.SizeX
810
          sub eax, Window.SizeX
811
          shr eax, 1
812
          mov Window.Left, eax
813
; Window.Top = (Screen.SizeY - Window.SizeY) / 2
814
          movzx eax, Screen.SizeY
815
          sub eax, Window.SizeX
816
          shr eax, 1
817
          mov Window.Top, eax
818
        .ElseIf (ebx != 0) && ([ebx][TMem.Flags] & IBF_PARENT_REL)
819
          Invoke GetThreadInfo, ParentSlot, Offset ThreadInfo
820
; Window.Left = (Parent.SizeX - Window.SizeX) / 2 + Parent.Left
821
          mov    eax, ThreadInfo.Window.SizeX
822
          sub    eax, Window.SizeX
823
          shr    eax, 1
824
          cdq             ;
825
          xor    eax, edx ; eax = abs(eax)
826
          sub    eax, edx ;
827
          mov    edx, eax
828
          mov    eax, ThreadInfo.Window.Left
829
          add    eax, edx
830
          mov    Window.Left, eax
831
; Window.Left = (Parent.SizeY - Window.SizeY) / 2 + Parent.Top
832
          mov    eax, ThreadInfo.Window.SizeY
833
          sub    eax, Window.SizeY
834
          shr    eax, 1
835
          cdq             ;
836
          xor    eax, edx ; eax = abs(eax)
837
          sub    eax, edx ;
838
          mov    edx, eax
839
          mov    eax, ThreadInfo.Window.Top
840
          add    eax, edx
841
          mov    Window.Top, eax
842
        .Else ;------------------------------------------------
843
; Window.Left = MousePos.X - Window.SizeX / 2
844
          movzx eax, MousePos.X
845
          mov ecx, Window.SizeX
846
          shr ecx, 1
847
          sub eax, ecx
848
          .If SIGN?
849
            xor eax, eax
850
          .EndIf
851
          mov Window.Left, eax
852
; Window.Top = MousePos.Y - Window.SizeY / 2
853
          movzx eax, MousePos.Y
854
          mov ecx, Window.SizeY
855
          shr ecx, 1
856
          sub eax, ecx
857
          .If SIGN?
858
            xor eax, eax
859
          .EndIf
860
          mov Window.Top, eax
861
        .EndIf ;-----------------------------------------------
862
; PromptPos.X = Margin
863
; PromptPos.Y = Margin
864
; Edit1.left = Margin
865
        mov eax, Margin
866
        mov PromptPos.X, eax
867
        mov PromptPos.Y, eax
868
        mov Edit1.left, eax
869
; Edit1.x_size = Window.SizeX - WINDOW_BORDER_SIZE * 2
870
        mov eax, Window.SizeX
871
        sub eax, WINDOW_BORDER_SIZE * 2
872
        sub eax, Margin
873
        sub eax, Margin
874
        mov Edit1.x_size, eax
875
; Edit1.top = Margin + FontHeight + Margin
876
        mov eax, Margin
877
        add eax, FontHeight
878
        add eax, Margin
879
        mov Edit1.top, eax
880
; ButtonCancel.SizeX = StrLen(szCancel) * FontWidth + FontWidth
881
; ButtonOK.SizeX = ButtonCancel.SizeX
882
        mov eax, FontWidth
883
        imul eax, 8
884
        mov ecx, FontWidth
885
        add eax, ecx
886
        mov ButtonCancel.SizeX, eax
887
        mov ButtonOK.SizeX, eax
888
; ButtonCancel.SizeY = FontHeight + FontWidth
889
; ButtonOK.SizeY = ButtonCancel.SizeY
890
        mov eax, FontHeight
891
        mov ecx, FontWidth
892
        add eax, ecx
893
        mov ButtonCancel.SizeY, eax
894
        mov ButtonOK.SizeY, eax
895
; ButtonCancel.Top = Edit1.top + 1 + FontHeight + 1 + Margin + Margin
896
; ButtonOK.Top = ButtonCancel.Top
897
        mov eax, Edit1.top
898
        add eax, 1
899
        add eax, FontHeight
900
        add eax, 1
901
        add eax, Margin
902
        add eax, Margin
903
        mov ButtonCancel.Top, eax
904
        mov ButtonOK.Top, eax
905
; ButtonCancel.Left = Window.SizeX - WINDOW_BORDER_SIZE * 2 - Margin - ButtonCancel.SizeX
906
; ButtonOK.Left = ButtonCancel.Left - Margin - ButtonOK.SizeX
907
        mov eax, Window.SizeX
908
        sub eax, WINDOW_BORDER_SIZE * 2
909
        sub eax, Margin
910
        sub eax, ButtonCancel.SizeX
911
        mov ButtonCancel.Left, eax
912
        sub eax, Margin
913
        sub eax, ButtonOK.SizeX
914
        mov ButtonOK.Left, eax
915
; TextOKLeft = ButtonOK.Left + FontWidth / 2 + 1
916
; TextOKTop = ButtonOK.Top + FontWidth / 2 + 1
917
        mov eax, ButtonOK.Left
918
        mov edx, ButtonOK.Top
919
        mov ecx, FontWidth
920
        shr ecx, 1
921
        add ecx, 1
922
        add eax, ecx
923
        add edx, ecx
924
        mov TextOKLeft, eax
925
        mov TextOKTop, edx
926
; TextCancelLeft = ButtonCancel.Left + FontWidth / 2 + 1
927
; TextCancelTop = ButtonCancel.Top + FontWidth / 2 + 1
928
        mov eax, ButtonCancel.Left
929
        mov edx, ButtonCancel.Top
930
        mov ecx, FontWidth
931
        shr ecx, 1
932
        add ecx, 1
933
        add eax, ecx
934
        add edx, ecx
935
        mov TextCancelLeft, eax
936
        mov TextCancelTop, edx
937
;
938
        Invoke DrawWindow, Window.Left, Window.Top, Window.SizeX, Window.SizeY, WinCaption, SC.work, WS_SKINNED_FIXED + WS_COORD_CLIENT + WS_CAPTION, CS_MOVABLE
939
        Invoke DrawText, PromptPos.X, PromptPos.Y, TextPrompt, SC.work_text, 0, TextFlags, 0
940
        Invoke DrawButton, ButtonOK.Left, ButtonOK.Top, ButtonOK.SizeX, ButtonOK.SizeY, SC.work_button, 0, BUTTON_OK
941
        Invoke DrawText, TextOKLeft, TextOKTop, TextOK, SC.work_button_text, 0, TextFlags, 0
942
        Invoke DrawButton, ButtonCancel.Left, ButtonCancel.Top, ButtonCancel.SizeX, ButtonCancel.SizeY, SC.work_button, 0, BUTTON_CANCEL
943
        Invoke DrawText, TextCancelLeft, TextCancelTop, TextCancel, SC.work_button_text, 0, TextFlags, 0
944
        Invoke EditBoxDraw, Offset Edit1
945
        Invoke EndDraw
946
        ret
947
OnRedraw Endp
948
; -------------------------------------------------------- ;
949
Align 4
950
OK Proc
951
  mov ebx, Mem
952
  .If [ebx][TMem.Flags] & IBF_NUMBER
953
 
954
    lea edi, [ebx + SizeOf(TMem)]
955
    mov [ebx][TMem.Result], edi
956
 
957
    mov [edi], @(a2i, Edit1.text)
958
    mov [edi + SizeOf(Dword)], edx
959
    .If CARRY?
960
      mov [ebx][TMem.Error], IBE_NUMBER_OVERFLOW
961
    .Else
962
      mov [ebx][TMem.Error], IBE_NO_ERROR
963
    .EndIf
964
  .Else
965
    mov eax, Edit1.text
966
    mov [ebx][TMem.Result], eax
967
    mov [ebx][TMem.Error], IBE_NO_ERROR
968
  .EndIf
969
  mov [ebx][TMem.State], TRUE
970
  Invoke ActivateWindow, ParentSlot
971
  Invoke ThreadTerminate
972
  ret
973
OK Endp
974
; -------------------------------------------------------- ;
975
Align 4
976
Cancel Proc
977
  mov ebx, Mem
978
  .If [ebx][TMem.Flags] & IBF_NUMBER
979
 
980
     lea edi, [ebx + SizeOf(TMem)]
981
 
982
     mov [ebx][TMem.Result], edi
983
     mov [edi], @(a2i, [ebx][TMem.Default])
984
     mov [edi + SizeOf(Dword)], edx
985
    .If CARRY?
986
      mov [ebx][TMem.Error], IBE_NUMBER_OVERFLOW
987
    .Else
988
      mov [ebx][TMem.Error], IBE_NO_ERROR
989
    .EndIf
990
  .Else
991
    mov eax, [ebx][TMem.Default]
992
    mov [ebx][TMem.Result], eax
993
    mov [ebx][TMem.Error], IBE_NO_ERROR
994
  .EndIf
995
  mov [ebx][TMem.State], TRUE
996
  Invoke ActivateWindow, ParentSlot
997
  Invoke ThreadTerminate
998
  ret
999
Cancel Endp
1000
; -------------------------------------------------------- ;
1001
Align 4
1002
InputBox_Thread:
1003
 .If Initialized == FALSE
1004
   mov BoxLib,         @(LoadLibrary, CStr("/sys/lib/box_lib.obj"))
1005
   mov EditBoxDraw,    @(GetProcAddress, BoxLib, CStr("edit_box"))
1006
   mov EditBoxKey,     @(GetProcAddress, BoxLib, CStr("edit_box_key"))
1007
   mov EditBoxMouse,   @(GetProcAddress, BoxLib, CStr("edit_box_mouse"))
1008
   mov EditBoxSetText, @(GetProcAddress, BoxLib, CStr("edit_box_set_text"))
1009
 
1010
   mov Initialized, TRUE
1011
 .EndIf
1012
 
1013
  mov ebx, Mem
1014
 
1015
  Invoke EditBoxSetText, Offset Edit1, [ebx][TMem.Default]
1016
 
1017
  Invoke SetEventMask, EM_REDRAW + EM_KEY + EM_BUTTON + EM_MOUSE
1018
 
1019
  .Repeat
1020
    Invoke WaitEvent
1021
    .If eax == REDRAW_EVENT
1022
      Invoke  OnRedraw
1023
    .ElseIf eax == KEY_EVENT
1024
      mov Key, @(GetKey)
1025
      .If Key.Code == KEY_CODE_ENTER
1026
        Invoke OK
1027
      .ElseIf Key.Code == KEY_CODE_ESCAPE
1028
        Invoke Cancel
1029
      .Else
1030
        Invoke EditBoxKey, Offset Edit1
1031
      .EndIf
1032
    .ElseIf eax == BUTTON_EVENT
1033
      mov Button, @(GetButton)
1034
      .If Button.ID == BUTTON_CLOSE
1035
        Invoke Cancel
1036
      .ElseIf Button.ID == BUTTON_OK
1037
        Invoke OK
1038
      .ElseIf Button.ID == BUTTON_CANCEL
1039
        Invoke Cancel
1040
      .EndIf
1041
    .ElseIf eax == MOUSE_EVENT
1042
      Invoke EditBoxMouse, Offset Edit1
1043
    .EndIf
1044
  .Until 0
1045
; -------------------------------------------------------- ;
1046
Align 16
1047
EXPORTS Label Dword
1048
Dword	CStr("InputBox"),	Offset InputBox
1049
Dword	0, 0
1050
; -------------------------------------------------------- ;
1051
END