1 /******************************************************************************
2 *
3 * Copyright (C) 2004-2007, The Gentee Group. All rights reserved.
4 * This file is part of the Gentee open source project - http://www.gentee.com.
5 *
6 * THIS FILE IS PROVIDED UNDER THE TERMS OF THE GENTEE LICENSE ("AGREEMENT").
7 * ANY USE, REPRODUCTION OR DISTRIBUTION OF THIS FILE CONSTITUTES RECIPIENTS
8 * ACCEPTANCE OF THE AGREEMENT.
9 *
10 * ID: vis.edit 17.07.07 0.0.A.
11 *
12 * Author: Alexander Krivonogov ( gentee )
13 *
14 ******************************************************************************/
15
16 /* Компонента vEdit, порождена от vCtrl
17 События
18 onChange - изменение текста
19 */
20 type vEdit <inherit = vCtrl>
21 {
22 //Hidden fields
23 uint fNewText
24 uint pBorder
25 uint pChanged
26 uint pReadOnly
27 ustr pText
28 uint pPassword
29 uint pMaxLen
30 uint pMultiline
31 uint pWordWrap
32 uint pScrollBars
33
34 //Events
35 evEvent OnChange
36 }
37
38
39 define <export>{
40 //Режим отображения полос прокрутки ScrollBars
41 sbNone = 0
42 sbHorz = 1
43 sbVert = 2
44 sbBoth = 3
45 }
46
47 /*------------------------------------------------------------------------------
48 Public methods
49 */
50
51 /*Метод Sel( uint start, uint len )
52 Выделить часть текста
53 start - позизия начала выделения
54 len - длина выделения в символах
55 */
56 method vEdit.Sel( uint start, uint len )
57 {
58 this.WinMsg( $EM_SETSEL, start, start + len )
59 }
60
61 /*Метод SelAll()
62 Выделить весь текст
63 */
64 method vEdit.SelAll()
65 {
66 this.Sel( 0, -1 )
67 }
68
69
70 /*------------------------------------------------------------------------------
71 Properties
72 */
73 /* Свойство uint ReadOnly - Get Set
74 Усотанавливает или определяет можно ли изменять текст
75 1 - текст изменять нельзя
76 0 - текст изменять можно
77 */
78 property uint vEdit.ReadOnly
79 {
80 return this.pReadOnly
81 }
82
83 property vEdit.ReadOnly( uint val )
84 {
85 if val != this.pReadOnly
86 {
87 this.pReadOnly = val
88 this.WinMsg( $EM_SETREADONLY, val )
89 }
90 }
91
92 /*Свойство ustr Text - Get Set
93 Получить, установить редактируемый текст
94 */
95 method vEdit.iSetText()
96 {
97 SetWindowText( this.hwnd, .pText.ptr() )
98 }
99
100 method vEdit.iGetText()
101 {
102 uint res = GetWindowTextLength( this.hwnd )
103 .pText.reserve( res + 1 )
104 GetWindowText( this.hwnd, .pText.ptr(), res + 1 )
105 .pText.setlen( res )
106 }
107
108 property ustr vEdit.Text <result>
109 {
110 result = .pText
111 }
112
113 property vEdit.Text( ustr val )
114 {
115 if val != .pText
116 {
117 .pText = val
118 this.fNewText = 1
119 .iSetText()
120 this.fNewText = 0
121 }
122 }
123
124 /*Свойство ustr MaxLen - Get Set
125 Получить, установить максимальную длину текста в символах
126 */
127 method vEdit.iSetMaxLen()
128 {
129 this.WinMsg( $EM_LIMITTEXT, .pMaxLen )
130 }
131
132 property uint vEdit.MaxLen
133 {
134 return this.pMaxLen//this.WinMsg( $EM_GETLIMITTEXT )
135 }
136
137 property vEdit.MaxLen( uint val )
138 {
139 if .pMaxLen != val
140 {
141 .pMaxLen = val
142 .iSetMaxLen()
143 }
144 }
145
146 /*Свойство ustr Password - Get Set
147 Получить, установить режим ввода пароля
148 1 - режим ввода пароля включен
149 0 - режим ввода параоля отключен
150 */
151 property uint vEdit.Password
152 {
153 return .pPassword
154 }
155
156 property vEdit.Password( uint val )
157 {
158 if .pPassword != val
159 {
160 .pPassword = val
161 this.WinMsg( $EM_SETPASSWORDCHAR, ?( val,'*', 0 ))
162 .Invalidate()
163 }
164 }
165
166 /*Свойство ustr Border - Get Set
167 Установить, получить наличие рамки у поля ввода
168 1 - рамка есть
169 0 - рамки нет
170 */
171 property vEdit.Border( uint val )
172 {
173 .pBorder = val
174 uint style = GetWindowLong( this.hwnd, $GWL_EXSTYLE )
175 if val : style |= $WS_EX_CLIENTEDGE
176 else : style &= ~$WS_EX_CLIENTEDGE
177 SetWindowLong( this.hwnd, $GWL_EXSTYLE, style )
178 SetWindowPos( this.hwnd, 0, 0, 0, 0, 0, $SWP_FRAMECHANGED |
179 $SWP_NOACTIVATE | $SWP_NOZORDER | $SWP_NOMOVE | $SWP_NOSIZE )
180 }
181
182 property uint vEdit.Border
183 {
184 return .pBorder
185 }
186
187
188 /*Свойство ustr SelStart - Get Set
189 Получить, установить начало выделенного текста
190 */
191 property uint vEdit.SelStart
192 {
193 uint start
194 this.WinMsg( $EM_GETSEL, &start, 0 )
195 return start
196 }
197
198 property vEdit.SelStart( uint val )
199 {
200 this.Sel( val, 0 )
201 }
202
203 /*Свойство ustr SelLen - Get Set
204 Получить, установить длину выделенного текста
205 */
206 property uint vEdit.SelLen
207 {
208 uint start, end
209 this.WinMsg( $EM_GETSEL, &start, &end )
210 return end - start
211 }
212
213 property vEdit.SelLen( uint val )
214 {
215 this.Sel( this.SelStart, val )
216 }
217
218 /*Свойство ustr SelStart - Get
219 Получить/вствавить вместо выделенный текст
220 */
221 property ustr vEdit.SelText<result>
222 {
223 uint start, end
224 this.WinMsg( $EM_GETSEL, &start, &end )
225 result.substr( this.Text, start, end-start )
226 }
227
228 property vEdit.SelText( ustr val )
229 {
230 uint start, end
231 this.WinMsg( $EM_GETSEL, &start, &end )
232 this.pText.replace( start, end - start, val )
233 .iSetText()
234 this.WinMsg( $EM_SETSEL, start, start + *val )
235 }
236
237
238 /*Свойство uint Changed - Get, Set
239 Получить, установить признак изменения текста
240 */
241 property uint vEdit.Changed
242 {
243 return this.pChanged
244 }
245
246 property vEdit.Changed( uint val )
247 {
248 this.pChanged = val
249 }
250
251
252 /*Свойство uint Multiline - Get, Set
253 Получить, установить многострочный режим
254 */
255 property uint vEdit.Multiline
256 {
257 return this.pMultiline
258 }
259
260 property vEdit.Multiline( uint val )
261 {
262 if this.pMultiline != val
263 {
264 this.pMultiline = val
265 .Virtual( $mReCreateWin )
266 }
267 }
268
269 /*Свойство uint WordWrap - Get, Set
270 Получить, установить режим переноса по словам, работает при Multiline = 1
271 */
272 property uint vEdit.WordWrap
273 {
274 return this.pWordWrap
275 }
276
277 property vEdit.WordWrap( uint val )
278 {
279 if this.pWordWrap != val
280 {
281 this.pWordWrap = val
282 .Virtual( $mReCreateWin )
283 }
284 }
285
286
287 /*Свойство uint ScrollBars - Get, Set
288 Получить, установить режим отображения полос прокрутки
289 */
290 property uint vEdit.ScrollBars
291 {
292 return this.pScrollBars
293 }
294
295 property vEdit.ScrollBars( uint val )
296 {
297 if this.pScrollBars != val
298 {
299 this.pScrollBars = val
300 .Virtual( $mReCreateWin )
301 }
302 }
303
304 /*------------------------------------------------------------------------------
305 Virtual methods
306 */
307 method vEdit vEdit.mCreateWin <alias=vEdit_mWin>()
308 {
309 uint exstyle
310 uint style = /*$ES_AUTOHSCROLL |*/ $WS_CHILD | $WS_CLIPSIBLINGS
311 if .pBorder : exstyle |= $WS_EX_CLIENTEDGE
312 if .pReadOnly : style |= $ES_READONLY
313 if .pPassword : style |= $ES_PASSWORD
314 if .pMultiline
315 {
316 style |= $ES_WANTRETURN | $ES_MULTILINE | $ES_AUTOVSCROLL
317 if !.pWordWrap : style |= $ES_AUTOHSCROLL
318 }
319 else : style |= $ES_AUTOHSCROLL
320 if .pScrollBars & $sbHorz : style |= $WS_HSCROLL
321 if .pScrollBars & $sbVert : style |= $WS_VSCROLL
322
323 .CreateWin( "EDIT".ustr(), exstyle, style )
324 this->vCtrl.mCreateWin()
325 .iSetMaxLen()
326 .iSetText()
327 return this
328 }
329
330 method uint vEdit.mWinCmd <alias=vEdit_mWinCmd>( uint ntfcmd, uint id )
331 {
332 if ntfcmd == $EN_CHANGE
333 {
334 this.pChanged = !this.fNewText
335 .iGetText()
336 this.OnChange.Run( this )
337 }
338 return 0
339 }
340
341 method vEdit.mFocus <alias=vEdit_mFocus> ( evparValUint eu )
342 {
343 this->vCtrl.mFocus( eu )
344 if !.pMultiline && eu.val && !( GetKeyState($VK_LBUTTON) & 0x1000 )
345 {
346 this.SelAll()
347 }
348 }
349
350 /*Виртуальный метод uint vEdit.mSetName - Установка заголовка в режиме проектирования
351 */
352 method uint vEdit.mSetName <alias=vEdit_mSetName>( str newname )
353 {
354 ifdef $DESIGNING {
355 if !.p_loading && .Text == .Name
356 {
357 .Text = newname.ustr()
358 }
359 }
360 return 1
361 }
362
363 /*------------------------------------------------------------------------------
364 Registration
365 */
366 method vEdit vEdit.init( )
367 {
368 this.pTypeId = vEdit
369
370 this.pBorder = 1
371 this.pTabStop = 1
372 this.pCanFocus = 1
373 this.loc.width = 100
374 this.loc.height = 25
375 this.pMaxLen = 0x8000
376 return this
377 }
378
379 func init_vEdit <entry>()
380 {
381 regcomp( vEdit, "vEdit", vCtrl, $vCtrl_last,
382 %{ %{ $mCreateWin, vEdit_mWin },
383 %{ $mWinCmd, vEdit_mWinCmd },
384 %{ $mFocus, vEdit_mFocus },
385 %{ $mSetName, vEdit_mSetName }
386 },
387 0->collection )
388
389 ifdef $DESIGNING {
390 cm.AddComp( vEdit, 1, "Windows", "edit" )
391
392 cm.AddProps( vEdit, %{
393 //"TabOrder" , uint , 0,
394 "Text" , ustr , 0,
395 "MaxLen" , uint , 0,
396 "Border" , uint , 1,
397 "Password" , uint , 0,
398 "Multiline", uint , 0,
399 "WordWrap" , uint , 0,
400 "ScrollBars", uint , 0,
401 "ReadOnly", uint, 0
402 })
403
404 cm.AddEvents( vEdit, %{
405 "OnChange" , "evparEvent"
406 })
407
408 cm.AddPropVals( vEdit, "ScrollBars", %{
409 "sbNone", $sbNone,
410 "sbHorz", $sbHorz,
411 "sbVert", $sbVert,
412 "sbBoth", $sbBoth
413 })
414 }
415 }