Rev 259 | Go to most recent revision | Details | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
178 | heavyiron | 1 | struct TBOX |
2 | x dw ? |
||
3 | width dw ? |
||
4 | y dw ? |
||
5 | height dw ? |
||
6 | sel.x db ? |
||
7 | pos.x db ? |
||
8 | ofs.x db ? |
||
9 | length db ? |
||
10 | text rb 255 |
||
11 | ends |
||
12 | |||
13 | virtual at ebp |
||
14 | tbox TBOX |
||
15 | end virtual |
||
16 | |||
17 | tb.pos.x db ? |
||
18 | tb.sel.x db ? |
||
19 | tb.sel.selected db ? |
||
20 | |||
21 | func textbox.get_width |
||
22 | push ebx edx |
||
23 | movzx eax,[tbox.width-2] |
||
24 | add eax,-6 |
||
25 | xor edx,edx |
||
26 | mov ebx,6 |
||
27 | div ebx |
||
28 | movzx ebx,[tbox.length] |
||
29 | cmp eax,ebx |
||
30 | jle @f |
||
31 | mov eax,ebx |
||
32 | @@: pop edx ebx |
||
33 | ret |
||
34 | endf |
||
35 | |||
36 | func textbox.delete_selection |
||
37 | cmp [tb.sel.selected],0 |
||
38 | je .exit.2 |
||
39 | pushad |
||
40 | movzx ecx,[tbox.length] |
||
41 | sub cl,[tb.sel.x] |
||
42 | lea eax,[tbox.text] |
||
43 | movzx esi,[tb.pos.x] |
||
44 | movzx edi,[tb.sel.x] |
||
45 | add esi,eax |
||
46 | add edi,eax |
||
47 | mov eax,esi |
||
48 | sub eax,edi |
||
49 | sub [tbox.length],al |
||
50 | cld |
||
51 | rep movsb |
||
52 | |||
53 | .exit: |
||
54 | mov al,[tb.sel.x] |
||
55 | mov [tbox.pos.x],al |
||
56 | mov [tbox.sel.x],al |
||
57 | popad |
||
58 | clc |
||
59 | ret |
||
60 | |||
61 | .exit.2: |
||
62 | stc |
||
63 | ret |
||
64 | endf |
||
65 | |||
66 | func textbox.draw ; TBOX* ebp |
||
67 | call textbox.get_width |
||
68 | movzx ebx,[tbox.pos.x] |
||
69 | sub bl,[tbox.ofs.x] |
||
70 | sub ebx,eax |
||
71 | jle @f |
||
72 | mov bl,[tbox.pos.x] |
||
73 | sub bl,al |
||
74 | mov [tbox.ofs.x],bl |
||
75 | @@: |
||
76 | mov [tb.sel.selected],0 |
||
77 | mov al,[tbox.pos.x] |
||
78 | mov ah,[tbox.sel.x] |
||
79 | cmp al,ah |
||
80 | je @f |
||
81 | inc [tb.sel.selected] |
||
82 | ja @f |
||
83 | xchg al,ah |
||
84 | @@: mov [tb.pos.x],al |
||
85 | mov [tb.sel.x],ah |
||
86 | |||
87 | mcall 13,dword[tbox.x],dword[tbox.y],[color_tbl+4*5];[sc.work] |
||
88 | call draw_framerect |
||
89 | |||
90 | call textbox.get_width |
||
91 | mov esi,eax |
||
92 | mov edi,eax |
||
93 | |||
94 | cmp ebp,[focused_tb] |
||
95 | je @f |
||
96 | mov ebx,dword[tbox.x] |
||
97 | mov bx,[tbox.y+2] |
||
98 | movzx eax,[tbox.height-2] |
||
99 | shr eax,1 |
||
100 | add eax,4*65536-4 |
||
101 | add ebx,eax |
||
102 | lea edx,[tbox.text] |
||
103 | ; movzx esi,[tbox.length] |
||
104 | mcall 4,,[color_tbl+4*0];[sc.work_text] |
||
105 | ret |
||
106 | |||
107 | @@: movzx eax,[tb.pos.x] |
||
108 | cmp al,[tb.sel.x] |
||
109 | je @f |
||
110 | sub al,[tbox.ofs.x] |
||
111 | jz @f |
||
112 | movzx ebx,[tb.sel.x] |
||
113 | sub bl,[tbox.ofs.x] |
||
114 | jge .lp1 |
||
115 | xor ebx,ebx |
||
116 | .lp1: push eax ebx |
||
117 | sub eax,ebx |
||
118 | mov ecx,edi |
||
119 | sub ecx,ebx |
||
120 | cmp eax,ecx |
||
121 | jbe .lp2 |
||
122 | mov eax,ecx |
||
123 | .lp2: imul eax,6 |
||
124 | imul ebx,6 |
||
125 | movzx ecx,[tbox.x+2] |
||
126 | add ecx,3 |
||
127 | ; sub eax,ebx |
||
128 | add ebx,ecx |
||
129 | shl ebx,16 |
||
130 | add ebx,eax |
||
131 | movzx ecx,[tbox.height-2] |
||
132 | shr ecx,1 |
||
133 | add cx,[tbox.y+2] |
||
134 | shl ecx,16 |
||
135 | add ecx,-5*65536+10 |
||
136 | mcall 13,,,[color_tbl+4*7];0x0000007F |
||
137 | |||
138 | mov esi,[esp] |
||
139 | lea edx,[tbox.text] |
||
140 | movzx eax,[tbox.ofs.x] |
||
141 | add edx,eax |
||
142 | mov ebx,dword[tbox.x] |
||
143 | mov bx,[tbox.y+2] |
||
144 | movzx eax,[tbox.height-2] |
||
145 | shr eax,1 |
||
146 | add eax,4*65536-4 |
||
147 | add ebx,eax |
||
148 | mov eax,4 |
||
149 | or esi,esi |
||
150 | jz .lp3 |
||
151 | mcall ,,[color_tbl+4*0];[sc.work_text] |
||
152 | .lp3: sub edi,esi |
||
153 | jnz .lp4 |
||
154 | add esp,8 |
||
155 | jmp .exit |
||
156 | .lp4: |
||
157 | add edx,esi |
||
158 | imul esi,6*65536 |
||
159 | add ebx,esi |
||
160 | pop ecx esi |
||
161 | sub esi,ecx |
||
162 | cmp esi,edi |
||
163 | jbe .lp5 |
||
164 | mov esi,edi |
||
165 | .lp5: |
||
166 | mcall ,,[color_tbl+4*6];0x00FFFFFF |
||
167 | sub edi,esi |
||
168 | jz .exit |
||
169 | add edx,esi |
||
170 | imul esi,6*65536 |
||
171 | add ebx,esi |
||
172 | lea ecx,[tbox.text] |
||
173 | ; sub ecx,edx |
||
174 | ; add edi,ecx |
||
175 | mcall ,,[color_tbl+4*0],,edi;[sc.work_text],,edi |
||
176 | jmp .exit |
||
177 | |||
178 | @@: lea edx,[tbox.text] |
||
179 | movzx eax,[tbox.ofs.x] |
||
180 | add edx,eax |
||
181 | mov ebx,dword[tbox.x] |
||
182 | mov bx,[tbox.y+2] |
||
183 | movzx eax,[tbox.height-2] |
||
184 | shr eax,1 |
||
185 | add eax,4*65536-4 |
||
186 | add ebx,eax |
||
187 | movzx eax,[tbox.ofs.x] |
||
188 | call textbox.get_width |
||
189 | mov esi,eax |
||
190 | mcall 4,,[color_tbl+4*0];[sc.work_text] |
||
191 | |||
192 | .exit: |
||
193 | movzx ebx,[tbox.pos.x] |
||
194 | movzx eax,[tbox.ofs.x] |
||
195 | sub ebx,eax |
||
196 | imul ebx,6 |
||
197 | movzx eax,[tbox.x+2] |
||
198 | add eax,3 |
||
199 | add ebx,eax |
||
200 | push bx |
||
201 | shl ebx,16 |
||
202 | pop bx |
||
203 | movzx ecx,[tbox.height-2] |
||
204 | shr ecx,1 |
||
205 | add cx,[tbox.y+2] |
||
206 | push cx |
||
207 | shl ecx,16 |
||
208 | pop cx |
||
209 | add ecx,-5*65536+4 |
||
210 | mcall 38,,,0x01000000 |
||
211 | add ebx,0x00010001 |
||
212 | mcall |
||
213 | ret |
||
214 | endf |
||
215 | |||
216 | func textbox.key |
||
217 | mov ebp,[focused_tb] |
||
218 | mov esi,accel_table_textbox |
||
219 | .acc: cmp ebx,[esi] |
||
220 | jne @f |
||
221 | call dword[esi+4] |
||
222 | jmp .exit.2 |
||
223 | @@: add esi,8 |
||
224 | cmp byte[esi],0 |
||
225 | jne .acc |
||
226 | |||
227 | test byte[shi+2],0x06 |
||
228 | jnz .exit |
||
229 | cmp [tbox.length],255 |
||
230 | je .exit |
||
231 | |||
232 | movzx eax,[chr] |
||
233 | movzx eax,[eax+key0] |
||
234 | or al,al |
||
235 | jz .exit |
||
236 | mov al,[eax+key1] |
||
237 | cmp [tb_casesen],0 |
||
238 | je @f |
||
239 | cmp al,$60 |
||
240 | jle @f |
||
241 | add al,[add_table-$60+eax] |
||
242 | @@: |
||
243 | call textbox.delete_selection |
||
244 | |||
245 | mov ecx,255 |
||
246 | sub cl,[tbox.pos.x] |
||
247 | lea edi,[tbox.text] |
||
248 | add edi,255 |
||
249 | lea esi,[edi-1] |
||
250 | std |
||
251 | rep movsb |
||
252 | stosb |
||
253 | cld |
||
254 | inc [tbox.length] |
||
255 | call key.tb.right |
||
256 | |||
257 | .exit.2: |
||
258 | call textbox.draw |
||
259 | .exit: |
||
260 | ret |
||
261 | endf |
||
262 | |||
263 | textbox.mouse: |
||
264 | ret |
||
265 | |||
266 | func key.tb.bkspace |
||
267 | call textbox.delete_selection |
||
268 | jnc @f |
||
269 | |||
270 | cmp [tbox.pos.x],0 |
||
271 | je @f |
||
272 | call key.tb.left |
||
273 | jmp key.tb.del.direct |
||
274 | |||
275 | @@: ret |
||
276 | endf |
||
277 | |||
278 | func key.tb.home |
||
279 | xor al,al |
||
280 | mov [tbox.pos.x],al |
||
281 | mov [tbox.sel.x],al |
||
282 | mov [tbox.ofs.x],al |
||
283 | ret |
||
284 | endf |
||
285 | |||
286 | func key.tb.left |
||
287 | mov al,[tbox.pos.x] |
||
288 | mov [tbox.sel.x],al |
||
289 | dec al |
||
290 | js @f |
||
291 | mov [tbox.pos.x],al |
||
292 | mov [tbox.sel.x],al |
||
293 | cmp [tbox.ofs.x],al |
||
294 | jl @f |
||
295 | sub [tbox.ofs.x],8 |
||
296 | jge @f |
||
297 | mov [tbox.ofs.x],0 |
||
298 | @@: ret |
||
299 | endf |
||
300 | |||
301 | func key.tb.right |
||
302 | call textbox.get_width |
||
303 | mov bl,[tbox.pos.x] |
||
304 | mov [tbox.sel.x],bl |
||
305 | inc bl |
||
306 | cmp bl,[tbox.length] |
||
307 | ja @f |
||
308 | mov [tbox.pos.x],bl |
||
309 | mov [tbox.sel.x],bl |
||
310 | sub bl,[tbox.ofs.x] |
||
311 | cmp bl,al |
||
312 | jbe @f |
||
313 | inc [tbox.ofs.x] |
||
314 | @@: ret |
||
315 | endf |
||
316 | |||
317 | func key.tb.end |
||
318 | call textbox.get_width |
||
319 | movzx ebx,[tbox.length] |
||
320 | mov [tbox.pos.x],bl |
||
321 | mov [tbox.sel.x],bl |
||
322 | sub ebx,eax |
||
323 | jge @f |
||
324 | xor bl,bl |
||
325 | @@: mov [tbox.ofs.x],bl |
||
326 | ret |
||
327 | endf |
||
328 | |||
329 | func key.tb.del |
||
330 | call textbox.delete_selection |
||
331 | jnc @f |
||
332 | .direct: |
||
333 | movzx ecx,[tbox.length] |
||
334 | sub cl,[tbox.pos.x] |
||
335 | jz @f |
||
336 | lea eax,[tbox.text] |
||
337 | movzx edi,[tbox.pos.x] |
||
338 | add edi,eax |
||
339 | lea esi,[edi+1] |
||
340 | dec [tbox.length] |
||
341 | cld |
||
342 | rep movsb |
||
343 | |||
344 | @@: ret |
||
345 | endf |
||
346 | |||
347 | func key.tb.shift_home |
||
348 | xor al,al |
||
349 | mov [tbox.pos.x],al |
||
350 | mov [tbox.ofs.x],al |
||
351 | ret |
||
352 | endf |
||
353 | |||
354 | func key.tb.shift_left |
||
355 | mov al,[tbox.pos.x] |
||
356 | dec al |
||
357 | js @f |
||
358 | mov [tbox.pos.x],al |
||
359 | cmp [tbox.ofs.x],al |
||
360 | jl @f |
||
361 | sub [tbox.ofs.x],8 |
||
362 | jge @f |
||
363 | mov [tbox.ofs.x],0 |
||
364 | @@: ret |
||
365 | endf |
||
366 | |||
367 | func key.tb.shift_right |
||
368 | call textbox.get_width |
||
369 | mov bl,[tbox.pos.x] |
||
370 | inc bl |
||
371 | cmp bl,[tbox.length] |
||
372 | ja @f |
||
373 | mov [tbox.pos.x],bl |
||
374 | sub bl,[tbox.ofs.x] |
||
375 | cmp bl,al |
||
376 | jbe @f |
||
377 | inc [tbox.ofs.x] |
||
378 | @@: ret |
||
379 | endf |
||
380 | |||
381 | func key.tb.shift_end |
||
382 | call textbox.get_width |
||
383 | movzx ebx,[tbox.length] |
||
384 | mov [tbox.pos.x],bl |
||
385 | sub ebx,eax |
||
386 | jge @f |
||
387 | xor bl,bl |
||
388 | @@: mov [tbox.ofs.x],bl |
||
389 | ret |
||
390 | endf |