Subversion Repositories Kolibri OS

Rev

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

Rev Author Line No. Line
449 Lrz 1
;  04.04.2007 Модернизировал систему выделения, существенно переделано управление и обработка, добавленно блокирования обработки других боксов, во время выделения мышкой текста, для этого в текст программы необходимо добавить идентификатор бокса т.е. dd 0x0 и в него будет помещаться укаатель на editbox
439 Lrz 2
;  30.03.2007 Переделал процедуру выделения, теперь текст выделяется только только мышкой
404 Lrz 3
;  09.03.2007 Дописал управление mouse + shift  выделение и перемещение
396 Lrz 4
;  07.03.2007 Дописал управление с shift home + end усправил несколько багов
391 Lrz 5
;  06.03.2007 Переписал полностью алгоритм управления shift
348 Lrz 6
;  15.02.2007 улучшение снятия выделения и перерисовки очищаемой области, значительно приятнее работает компонент
7
;  13.02.2007 убрал по возможности мерцание, улучшена обработка перерисовки фона
8
; добавил фитчу внесения 0х0 по адресу ed_size иначе у Maxxx32 были несостыковки в коде. Причина в том, что оптимизация была сведена к тому, что я не чистил символы в буфере, когда удалял, я просто их не выводил, и потом, когда вносился новый символ, он попросту затирал уже имеющийся. Если бы, программа обрабатывала конец строки по ed_size, проблемы не возникло. Но сейчас этот недостаток исправлен.
306 Lrz 9
;  01.02.2007 доработка edit_box, исправил баги.
295 Lrz 10
;  26.01.2007 нормальная работа компанента исправил фукцию .check_offset
11
;  24.01.2007 пофиксел баги вызваные не правильным кодом )).
289 Lrz 12
;  22.01.2007 избавился от глюков при работе с выделением и удаление, корректная работа клавишей del & backspase
13
;  20.01.2007 реализовал выделение текста по shift
234 Lrz 14
;  12.12.2006 реализовал поддержку кнопки insert и сегодя компонент почти работает!!!!
15
;  07.12.2006 продолжается работа над переработкой компонента,изменениям подверглись многие функции, переработан вывод текста, а така же алгоритм внесения символов.
16
;  03.09.2006 по возможности отказался от 16 битной арифметики, добавил новые баги
17
;  09.08.2006 произведена оптимизация работы конпок DEL и Backspace, уменьшен размер выполняемого кода.
18
;  21.07.2006 добавлена функция кнопки Del, теперь можно удалять символы при помощи данной клавиши
19
; Автор: Евтихов Максим (Maxxxx32) email: maxxxxm@mail.ru
20
; Дата последних изменений: 13.06.06 10:40
21
;  Напишите в исходном коде своей программы use_edit_box,
22
; это вставит необходимые процедуры в код вашей программы.
23
;  Процедуры:
24
;   edit_box.draw - полная перерисовка;
25
;   edit_box.key - обработка клавиатуры;
26
;   edit_box.mouse - обработка мыши;
27
;   edit_box.focus - установка фокуса;
28
;   edit_box.blur - его размывание;
29
;   edit_box.get_n - получить количество прорисовываемых символов.
30
;  При вызове любых из этих процедур в регистре edi следует
31
; оставить указатель на структуру.
32
;  Пример структуры:
33
; some_edit edit_box 100,10,30,0x00ffffff,0,0x00aaaaaa,0,255,some_edit_text
34
; длина, высота, верх, цвет фона, цвет рамки, если выбран,
35
; цвет рамки, если не выбран, максимальное количество символов,
36
; указатель на буфер, где будут хранится символы. Буфер должен
37
; оканчиваться нулем, например если максимальное количество 255:
38
;  some_edit_text:
39
;       rb      256 ;255+1
40
 
41
;  Пример вызова процедуры:
42
;       mov     edi,some_edit
43
;       call    edit_box.draw
44
 
45
;  При вызове процедуры edit_box.key код клавиши должен
46
; находится в ah, то есть перед вызовом этой процедуры надо вызвать
47
; 2-ую сисемную функцию, например:
48
;       mov     eax,2
49
;       int     0x40
50
;       mov     edi,some_edit1
51
;       call    edit_box.key
52
;       mov     edi,some_edit2
53
;       call    edit_box.key
54
;  Перед вызовом обработчика мыши следует проверить, является ли окно
55
; активным.
56
;  Если щелчок мыши был пройзведен за пределами edit box
57
; фокус теряется.
58
macro use_edit_box
59
{
60
edit_box:
61
ed_width	equ [edi]		;ширина компонента
62
ed_left 	equ [edi+4]             ;положение по оси х
63
ed_top		equ [edi+8]             ;положение по оси у
64
ed_color	equ [edi+12]		;цвет фона компонента
65
ed_focus_border_color	equ [edi+16]	;цвет рамки компонента
66
ed_blur_border_color	equ [edi+20]    ;цвет не активного компонента
67
ed_text_color	equ [edi+24]            ;цвет текста
282 Lrz 68
ed_max		equ [edi+28]                    ;кол-во символов которые можно максимально ввести
69
ed_text 	equ [edi+32]                    ;указатель на буфер
70
ed_flags	equ [edi+36]            ;флаги
71
ed_size equ [edi+38]                    ;кол-во символов
72
ed_pos	equ [edi+42]                    ;позиция курсора
73
ed_offset	equ [edi+46]            ;смещение
74
cl_curs_x	equ [edi+50]		;предыдущее координата курсора по х
75
cl_curs_y	equ [edi+54]		;предыдущее координата курсора по у
396 Lrz 76
ed_shift_pos	equ [edi+58]            ;положение курсора
77
ed_shift_pos_old equ [edi+62]           ;старое положение курсора
234 Lrz 78
;==========================================================
79
;=== процедура прорисовки =================================
80
;==========================================================
81
.draw:
82
pusha
83
;--- рисуем рамку ---
84
	call	.draw_border		; Функция стабильна
85
.draw_bg_cursor_text:
86
;--- изменяем смещение, если надо ---
87
	call	.check_offset		;вычисление позиции курсора стабильна
88
;--- рисуем внутреннюю область ---
89
	call	.draw_bg                ;нарисовать прямоугольник рабочей области
402 Lrz 90
;---- рисуем выделение, по shift если есть
91
	call	.draw_shift
234 Lrz 92
.draw_cursor_text:
93
;--- рисуем курсор ---
94
	;--- может его не надо рисовать ----
282 Lrz 95
	test	word ed_flags,ed_focus
234 Lrz 96
	je	@f
97
	call	.draw_cursor
98
@@:
99
	call	.draw_text
100
popa
101
ret
102
;----------------------------------------------------------
402 Lrz 103
;--- процедура прорисовки выделеной части -----------------
104
;----------------------------------------------------------
105
.draw_shift:
106
	test	word ed_flags,ed_shift_bac ;установка флага, выделенной области
107
	jz	@f
108
        mov	ebp,shift_color
109
        mov	ebx,dword	ed_shift_pos
110
	call	.sh_cl_
111
@@:	ret
112
 
113
 
114
;----------------------------------------------------------
234 Lrz 115
;--- процедура прорисовки текста --------------------------
116
;----------------------------------------------------------
117
.draw_text:
118
;--- вычисляем, сколько помещается символов ---
119
;--- чтобы мусор не рисовать ---
120
	call 	.get_n
121
	mov	esi,ed_size
122
        mov	ebx,ed_offset
123
	sub	esi,ebx
124
	cmp	eax,esi
125
	jae	@F
126
	mov	esi,eax		;чтобы не выходить за пределы экрана
402 Lrz 127
;--- рисуем текст ---
234 Lrz 128
@@: 	mov	eax,4
129
	mov	ebx,ed_left
306 Lrz 130
	mov	edx,ed_offset
234 Lrz 131
	add	ebx,2
132
	shl	ebx,16
133
	mov	bx,ed_top
134
	add	ebx,4
135
	mov	ecx,ed_text_color
136
	add	edx,ed_text
137
	int	0x40
138
ret
139
;----------------------------------------------------------
140
;--- процедура прорисовки фона ----------------------------
141
;входные данные
142
;eax
292 Lrz 143
;edx - color
234 Lrz 144
;----------------------------------------------------------
343 Lrz 145
;вход только цвет edx
234 Lrz 146
.draw_bg:
147
	mov	ebx,ed_left
148
	add	ebx,1
149
	shl	ebx,16
150
	mov	bx,ed_width
151
	sub	ebx,1
391 Lrz 152
       	mov	edx,ed_color
153
.draw_bg_eax:
234 Lrz 154
	mov	ecx,ed_top
306 Lrz 155
	mov	eax,13
234 Lrz 156
	add	ecx,1
157
	shl	ecx,16
158
	mov	cx,ed_height
391 Lrz 159
	dec	ecx
306 Lrz 160
        int	0x40
234 Lrz 161
ret
162
 
163
;----------------------------------------------------------
164
;--- процедура получения количества символов в текущей щирине компонента --------------
165
;----------------------------------------------------------
166
.get_n:
306 Lrz 167
	mov	eax,ed_width	;получем ширину компонента
234 Lrz 168
	xor	edx,edx   ;результат распологается в паре edx:eax в eax - остаток
169
	sub	eax,4		;вычтим 4
170
	mov	ebx,6		;загрузми делитель
171
	div	ebx		;размделим на 6
172
ret
173
;----------------------------------------------------------
174
;--- процедура рисования курсора --------------------------
175
;----------------------------------------------------------
391 Lrz 176
;входные ebp- цвет
234 Lrz 177
.clear_cursor:
391 Lrz 178
	mov	edx,ebp
234 Lrz 179
	mov	ebx,cl_curs_x
180
	mov	ecx,cl_curs_y
181
	jmp	.draw_curs
182
.draw_cursor:
183
	mov	edx,ed_text_color
184
	mov	ebx,ed_pos
185
	mov	ecx,ed_offset
186
	sub	ebx,ecx
187
 
188
	lea     ebx,[ebx*2+ebx]
189
	shl     ebx,1
190
	;imul	ebx,6
191
	add	bx,ed_left
306 Lrz 192
	mov	ecx,ed_top
234 Lrz 193
	inc	ebx
306 Lrz 194
	add	ecx,2
234 Lrz 195
	mov	ebp,ebx
196
	shl	ebx,16
197
	mov	bx,bp
198
	mov	ebp,ecx
199
 
200
	shl	ecx,16
201
	mov	cx,bp
202
	add	cx,ed_height-4
203
 
204
	mov	cl_curs_x,ebx
205
	mov	cl_curs_y,ecx
206
.draw_curs:
207
	mov	eax,38
208
	int	0x40
209
ret
210
;----------------------------------------------------------
211
;--- процедура рисования рамки ----------------------------
212
;----------------------------------------------------------
213
.draw_border:
214
;--- цвет рамки ---
396 Lrz 215
	test	word ed_flags,ed_focus
234 Lrz 216
	mov	edx,ed_focus_border_color
217
	jne     @f
218
	mov	edx,ed_blur_border_color