4 * Copyright David W. Metcalfe, 1994
5 * Copyright William Magro, 1995, 1996
6 * Copyright Frans van Dorsselaer, 1996
11 * UNDER CONSTRUCTION, please read EDIT.TODO
25 #define BUFLIMIT_MULTI 65534 /* maximum text buffer length (not including '\0') */
26 #define BUFLIMIT_SINGLE 32766
27 #define BUFSTART_MULTI 1024 /* starting length for multi-line control */
28 #define BUFSTART_SINGLE 256 /* starting length for single line control */
29 #define GROWLENGTH 64 /* buffers grow by this much */
30 #define HSCROLL_FRACTION 3 /* scroll window by 1/3 width */
49 UINT TextWidth
; /* width of the widest line in pixels */
54 UINT XOffset
; /* offset of the viewport in pixels */
55 UINT FirstVisibleLine
;
57 UINT LineHeight
; /* height of a screen line in pixels */
58 UINT AveCharWidth
; /* average character width in pixels */
63 UINT SelStart
; /* offset of selection start, == SelEnd if no selection */
64 UINT SelEnd
; /* offset of selection end == current caret position */
67 EDITWORDBREAKPROC WordBreakProc
;
72 #define SWAP_UINT(x,y) do { UINT temp = (UINT)(x); (x) = (UINT)(y); (y) = temp; } while(0)
73 #define ORDER_UINT(x,y) do { if ((UINT)(y) < (UINT)(x)) SWAP_UINT((x),(y)); } while(0)
75 /* macros to access window styles */
76 #define IsMultiLine(wndPtr) ((wndPtr)->dwStyle & ES_MULTILINE)
77 #define IsVScrollBar(wndPtr) ((wndPtr)->dwStyle & WS_VSCROLL)
78 #define IsHScrollBar(wndPtr) ((wndPtr)->dwStyle & WS_HSCROLL)
79 #define IsReadOnly(wndPtr) ((wndPtr)->dwStyle & ES_READONLY)
80 #define IsWordWrap(wndPtr) (((wndPtr)->dwStyle & ES_AUTOHSCROLL) == 0)
81 #define IsPassword(wndPtr) ((wndPtr)->dwStyle & ES_PASSWORD)
82 #define IsLower(wndPtr) ((wndPtr)->dwStyle & ES_LOWERCASE)
83 #define IsUpper(wndPtr) ((wndPtr)->dwStyle & ES_UPPERCASE)
85 #define EDITSTATEPTR(wndPtr) (*(EDITSTATE **)((wndPtr)->wExtra))
87 #define EDIT_SEND_CTLCOLOR(wndPtr,hdc) \
88 (SendMessage32A((wndPtr)->parent->hwndSelf, WM_CTLCOLOREDIT, \
89 (WPARAM32)(hdc), (LPARAM)(wndPtr)->hwndSelf ))
90 #define EDIT_NOTIFY_PARENT(wndPtr, wNotifyCode) \
91 (SendMessage32A((wndPtr)->parent->hwndSelf, WM_COMMAND, \
92 MAKEWPARAM((wndPtr)->wIDmenu, wNotifyCode), \
93 (LPARAM)(wndPtr)->hwndSelf ))
94 #define DPRINTF_EDIT_MSG(str) \
95 dprintf_edit(stddeb, \
96 "edit: " str ": hwnd=%04x, wParam=%04x, lParam=%08x\n", \
97 (UINT32)hwnd, (UINT32)wParam, (UINT32)lParam)
100 /*********************************************************************
104 * Files like these should really be kept in alphabetical order.
107 LRESULT
EditWndProc(HWND hwnd
, UINT msg
, WPARAM16 wParam
, LPARAM lParam
);
109 static void EDIT_BuildLineDefs(WND
*wndPtr
);
110 static INT
EDIT_CallWordBreakProc(WND
*wndPtr
, char *s
, INT index
, INT count
, INT action
);
111 static UINT
EDIT_ColFromWndX(WND
*wndPtr
, UINT line
, INT x
);
112 static void EDIT_DelEnd(WND
*wndPtr
);
113 static void EDIT_DelLeft(WND
*wndPtr
);
114 static void EDIT_DelRight(WND
*wndPtr
);
115 static UINT
EDIT_GetAveCharWidth(WND
*wndPtr
);
116 static UINT
EDIT_GetLineHeight(WND
*wndPtr
);
117 static void EDIT_GetLineRect(WND
*wndPtr
, UINT line
, UINT scol
, UINT ecol
, LPRECT16 rc
);
118 static char * EDIT_GetPointer(WND
*wndPtr
);
119 static char * EDIT_GetPasswordPointer(WND
*wndPtr
);
120 static LRESULT
EDIT_GetRect(WND
*wndPtr
, WPARAM32 wParam
, LPARAM lParam
);
121 static BOOL
EDIT_GetRedraw(WND
*wndPtr
);
122 static UINT
EDIT_GetTextWidth(WND
*wndPtr
);
123 static UINT
EDIT_GetVisibleLineCount(WND
*wndPtr
);
124 static UINT
EDIT_GetWndWidth(WND
*wndPtr
);
125 static UINT
EDIT_GetXOffset(WND
*wndPtr
);
126 static void EDIT_InvalidateText(WND
*wndPtr
, UINT start
, UINT end
);
127 static UINT
EDIT_LineFromWndY(WND
*wndPtr
, INT y
);
128 static BOOL
EDIT_MakeFit(WND
*wndPtr
, UINT size
);
129 static void EDIT_MoveBackward(WND
*wndPtr
, BOOL extend
);
130 static void EDIT_MoveDownward(WND
*wndPtr
, BOOL extend
);
131 static void EDIT_MoveEnd(WND
*wndPtr
, BOOL extend
);
132 static void EDIT_MoveForward(WND
*wndPtr
, BOOL extend
);
133 static void EDIT_MoveHome(WND
*wndPtr
, BOOL extend
);
134 static void EDIT_MovePageDown(WND
*wndPtr
, BOOL extend
);
135 static void EDIT_MovePageUp(WND
*wndPtr
, BOOL extend
);
136 static void EDIT_MoveUpward(WND
*wndPtr
, BOOL extend
);
137 static void EDIT_MoveWordBackward(WND
*wndPtr
, BOOL extend
);
138 static void EDIT_MoveWordForward(WND
*wndPtr
, BOOL extend
);
139 static void EDIT_PaintLine(WND
*wndPtr
, HDC32 hdc
, UINT line
, BOOL rev
);
140 static UINT
EDIT_PaintText(WND
*wndPtr
, HDC32 hdc
, INT x
, INT y
, UINT line
, UINT col
, UINT count
, BOOL rev
);
141 static void EDIT_ReleasePointer(WND
*wndPtr
);
142 static LRESULT
EDIT_ReplaceSel(WND
*wndPtr
, WPARAM32 wParam
, LPARAM lParam
);
143 static void EDIT_ScrollIntoView(WND
*wndPtr
);
144 static INT
EDIT_WndXFromCol(WND
*wndPtr
, UINT line
, UINT col
);
145 static INT
EDIT_WndYFromLine(WND
*wndPtr
, UINT line
);
146 static INT
EDIT_WordBreakProc(char *s
, INT index
, INT count
, INT action
);
148 static LRESULT
EDIT_EM_CanUndo(WND
*wndPtr
, WPARAM32 wParam
, LPARAM lParam
);
149 static LRESULT
EDIT_EM_EmptyUndoBuffer(WND
*wndPtr
, WPARAM32 wParam
, LPARAM lParam
);
150 static LRESULT
EDIT_EM_FmtLines(WND
*wndPtr
, WPARAM32 wParam
, LPARAM lParam
);
151 static LRESULT
EDIT_EM_GetFirstVisibleLine(WND
*wndPtr
, WPARAM32 wParam
, LPARAM lParam
);
152 static LRESULT
EDIT_EM_GetHandle(WND
*wndPtr
, WPARAM32 wParam
, LPARAM lParam
);
153 static LRESULT
EDIT_EM_GetLine(WND
*wndPtr
, WPARAM32 wParam
, LPARAM lParam
);
154 static LRESULT
EDIT_EM_GetLineCount(WND
*wndPtr
, WPARAM32 wParam
, LPARAM lParam
);
155 static LRESULT
EDIT_EM_GetModify(WND
*wndPtr
, WPARAM32 wParam
, LPARAM lParam
);
156 static LRESULT
EDIT_EM_GetPasswordChar(WND
*wndPtr
, WPARAM32 wParam
, LPARAM lParam
);
157 static LRESULT
EDIT_EM_GetRect(WND
*wndPtr
, WPARAM32 wParam
, LPARAM lParam
);
158 static LRESULT
EDIT_EM_GetSel(WND
*wndPtr
, WPARAM32 wParam
, LPARAM lParam
);
159 static LRESULT
EDIT_EM_GetThumb(WND
*wndPtr
, WPARAM32 wParam
, LPARAM lParam
);
160 static LRESULT
EDIT_EM_GetWordBreakProc(WND
*wndPtr
, WPARAM32 wParam
, LPARAM lParam
);
161 static LRESULT
EDIT_EM_LimitText(WND
*wndPtr
, WPARAM32 wParam
, LPARAM lParam
);
162 static LRESULT
EDIT_EM_LineFromChar(WND
*wndPtr
, WPARAM32 wParam
, LPARAM lParam
);
163 static LRESULT
EDIT_EM_LineIndex(WND
*wndPtr
, WPARAM32 wParam
, LPARAM lParam
);
164 static LRESULT
EDIT_EM_LineLength(WND
*wndPtr
, WPARAM32 wParam
, LPARAM lParam
);
165 static LRESULT
EDIT_EM_LineScroll(WND
*wndPtr
, WPARAM32 wParam
, LPARAM lParam
);
166 static LRESULT
EDIT_EM_ReplaceSel(WND
*wndPtr
, WPARAM32 wParam
, LPARAM lParam
);
167 static LRESULT
EDIT_EM_Scroll(WND
*wndPtr
, WPARAM32 wParam
, LPARAM lParam
);
168 static LRESULT
EDIT_EM_SetHandle(WND
*wndPtr
, WPARAM32 wParam
, LPARAM lParam
);
169 static LRESULT
EDIT_EM_SetModify(WND
*wndPtr
, WPARAM32 wParam
, LPARAM lParam
);
170 static LRESULT
EDIT_EM_SetPasswordChar(WND
*wndPtr
, WPARAM32 wParam
, LPARAM lParam
);
171 static LRESULT
EDIT_EM_SetReadOnly(WND
*wndPtr
, WPARAM32 wParam
, LPARAM lParam
);
172 static LRESULT
EDIT_EM_SetRect(WND
*wndPtr
, WPARAM32 wParam
, LPARAM lParam
);
173 static LRESULT
EDIT_EM_SetRectNP(WND
*wndPtr
, WPARAM32 wParam
, LPARAM lParam
);
174 static LRESULT
EDIT_EM_SetSel(WND
*wndPtr
, WPARAM32 wParam
, LPARAM lParam
);
175 static LRESULT
EDIT_EM_SetTabStops(WND
*wndPtr
, WPARAM32 wParam
, LPARAM lParam
);
176 static LRESULT
EDIT_EM_SetWordBreakProc(WND
*wndPtr
, WPARAM32 wParam
, LPARAM lParam
);
177 static LRESULT
EDIT_EM_Undo(WND
*wndPtr
, WPARAM32 wParam
, LPARAM lParam
);
179 static LRESULT
EDIT_WM_Char(WND
*wndPtr
, WPARAM32 wParam
, LPARAM lParam
);
180 static LRESULT
EDIT_WM_Clear(WND
*wndPtr
, WPARAM32 wParam
, LPARAM lParam
);
181 static LRESULT
EDIT_WM_Copy(WND
*wndPtr
, WPARAM32 wParam
, LPARAM lParam
);
182 static LRESULT
EDIT_WM_Cut(WND
*wndPtr
, WPARAM32 wParam
, LPARAM lParam
);
183 static LRESULT
EDIT_WM_Create(WND
*wndPtr
, WPARAM32 wParam
, LPARAM lParam
);
184 static LRESULT
EDIT_WM_Destroy(WND
*wndPtr
, WPARAM32 wParam
, LPARAM lParam
);
185 static LRESULT
EDIT_WM_Enable(WND
*wndPtr
, WPARAM32 wParam
, LPARAM lParam
);
186 static LRESULT
EDIT_WM_EraseBkGnd(WND
*wndPtr
, WPARAM32 wParam
, LPARAM lParam
);
187 static LRESULT
EDIT_WM_GetDlgCode(WND
*wndPtr
, WPARAM32 wParam
, LPARAM lParam
);
188 static LRESULT
EDIT_WM_GetFont(WND
*wndPtr
, WPARAM32 wParam
, LPARAM lParam
);
189 static LRESULT
EDIT_WM_GetText(WND
*wndPtr
, WPARAM32 wParam
, LPARAM lParam
);
190 static LRESULT
EDIT_WM_GetTextLength(WND
*wndPtr
, WPARAM32 wParam
, LPARAM lParam
);
191 static LRESULT
EDIT_WM_HScroll(WND
*wndPtr
, WPARAM32 wParam
, LPARAM lParam
);
192 static LRESULT
EDIT_WM_KeyDown(WND
*wndPtr
, WPARAM32 wParam
, LPARAM lParam
);
193 static LRESULT
EDIT_WM_KillFocus(WND
*wndPtr
, WPARAM32 wParam
, LPARAM lParam
);
194 static LRESULT
EDIT_WM_LButtonDblClk(WND
*wndPtr
, WPARAM32 wParam
, LPARAM lParam
);
195 static LRESULT
EDIT_WM_LButtonDown(WND
*wndPtr
, WPARAM32 wParam
, LPARAM lParam
);
196 static LRESULT
EDIT_WM_LButtonUp(WND
*wndPtr
, WPARAM32 wParam
, LPARAM lParam
);
197 static LRESULT
EDIT_WM_MouseMove(WND
*wndPtr
, WPARAM32 wParam
, LPARAM lParam
);
198 static LRESULT
EDIT_WM_Paint(WND
*wndPtr
, WPARAM32 wParam
, LPARAM lParam
);
199 static LRESULT
EDIT_WM_Paste(WND
*wndPtr
, WPARAM32 wParam
, LPARAM lParam
);
200 static LRESULT
EDIT_WM_SetCursor(WND
*wndPtr
, WPARAM32 wParam
, LPARAM lParam
);
201 static LRESULT
EDIT_WM_SetFocus(WND
*wndPtr
, WPARAM32 wParam
, LPARAM lParam
);
202 static LRESULT
EDIT_WM_SetFont(WND
*wndPtr
, WPARAM32 wParam
, LPARAM lParam
);
203 static LRESULT
EDIT_WM_SetRedraw(WND
*wndPtr
, WPARAM32 wParam
, LPARAM lParam
);
204 static LRESULT
EDIT_WM_SetText(WND
*wndPtr
, WPARAM32 wParam
, LPARAM lParam
);
205 static LRESULT
EDIT_WM_Size(WND
*wndPtr
, WPARAM32 wParam
, LPARAM lParam
);
206 static LRESULT
EDIT_WM_VScroll(WND
*wndPtr
, WPARAM32 wParam
, LPARAM lParam
);
209 /*********************************************************************
211 * General shortcuts for variable names:
215 * UINT s; offset of selection start
216 * UINT e; offset of selection end
217 * UINT sl; line on which the selection starts
218 * UINT el; line on which the selection ends
219 * UINT sc; column on which the selection starts
220 * UINT ec; column on which the selection ends
221 * UINT li; line index (offset)
222 * UINT fv; first visible line
223 * UINT vlc; vissible line count
224 * UINT lc; line count
225 * UINT lh; line height (in pixels)
226 * UINT tw; text width (in pixels)
227 * UINT ww; window width (in pixels)
228 * UINT cw; character width (average, in pixels)
233 /*********************************************************************
238 LRESULT
EditWndProc(HWND hwnd
, UINT msg
, WPARAM16 wParam
, LPARAM lParam
)
240 LRESULT lResult
= 0L;
241 WND
*wndPtr
= WIN_FindWndPtr(hwnd
);
243 if ((!EDITSTATEPTR(wndPtr
)) && (msg
!= WM_CREATE
))
244 return DefWindowProc16(hwnd
, msg
, wParam
, lParam
);
248 DPRINTF_EDIT_MSG("EM_CANUNDO");
249 lResult
= EDIT_EM_CanUndo(wndPtr
, wParam
, lParam
);
251 case EM_EMPTYUNDOBUFFER
:
252 DPRINTF_EDIT_MSG("EM_EMPTYUNDOBUFFER");
253 lResult
= EDIT_EM_EmptyUndoBuffer(wndPtr
, wParam
, lParam
);
256 DPRINTF_EDIT_MSG("EM_FMTLINES");
257 lResult
= EDIT_EM_FmtLines(wndPtr
, wParam
, lParam
);
259 case EM_GETFIRSTVISIBLELINE
:
260 DPRINTF_EDIT_MSG("EM_GETFIRSTVISIBLELINE");
261 lResult
= EDIT_EM_GetFirstVisibleLine(wndPtr
, wParam
, lParam
);
264 DPRINTF_EDIT_MSG("EM_GETHANDLE");
265 lResult
= EDIT_EM_GetHandle(wndPtr
, wParam
, lParam
);
268 DPRINTF_EDIT_MSG("EM_GETLINE");
269 lResult
= EDIT_EM_GetLine(wndPtr
, wParam
, lParam
);
271 case EM_GETLINECOUNT
:
272 DPRINTF_EDIT_MSG("EM_GETLINECOUNT");
273 lResult
= EDIT_EM_GetLineCount(wndPtr
, wParam
, lParam
);
276 DPRINTF_EDIT_MSG("EM_GETMODIFY");
277 lResult
= EDIT_EM_GetModify(wndPtr
, wParam
, lParam
);
279 case EM_GETPASSWORDCHAR
:
280 DPRINTF_EDIT_MSG("EM_GETPASSWORDCHAR");
281 lResult
= EDIT_EM_GetPasswordChar(wndPtr
, wParam
, lParam
);
284 DPRINTF_EDIT_MSG("EM_GETRECT");
285 lResult
= EDIT_EM_GetRect(wndPtr
, wParam
, lParam
);
288 DPRINTF_EDIT_MSG("EM_GETSEL");
289 lResult
= EDIT_EM_GetSel(wndPtr
, wParam
, lParam
);
292 DPRINTF_EDIT_MSG("EM_GETTHUMB");
293 lResult
= EDIT_EM_GetThumb(wndPtr
, wParam
, lParam
);
295 case EM_GETWORDBREAKPROC
:
296 DPRINTF_EDIT_MSG("EM_GETWORDBREAKPROC");
297 lResult
= EDIT_EM_GetWordBreakProc(wndPtr
, wParam
, lParam
);
300 DPRINTF_EDIT_MSG("EM_LIMITTEXT");
301 lResult
= EDIT_EM_LimitText(wndPtr
, wParam
, lParam
);
303 case EM_LINEFROMCHAR
:
304 DPRINTF_EDIT_MSG("EM_LINEFROMCHAR");
305 lResult
= EDIT_EM_LineFromChar(wndPtr
, wParam
, lParam
);
308 DPRINTF_EDIT_MSG("EM_LINEINDEX");
309 lResult
= EDIT_EM_LineIndex(wndPtr
, wParam
, lParam
);
312 DPRINTF_EDIT_MSG("EM_LINELENGTH");
313 lResult
= EDIT_EM_LineLength(wndPtr
, wParam
, lParam
);
316 DPRINTF_EDIT_MSG("EM_LINESCROLL");
317 lResult
= EDIT_EM_LineScroll(wndPtr
, wParam
, lParam
);
320 DPRINTF_EDIT_MSG("EM_REPLACESEL");
321 lResult
= EDIT_EM_ReplaceSel(wndPtr
, wParam
, lParam
);
324 DPRINTF_EDIT_MSG("EM_SCROLL");
325 lResult
= EDIT_EM_Scroll(wndPtr
, wParam
, lParam
);
328 DPRINTF_EDIT_MSG("EM_SETHANDLE");
329 lResult
= EDIT_EM_SetHandle(wndPtr
, wParam
, lParam
);
332 DPRINTF_EDIT_MSG("EM_SETMODIFY");
333 lResult
= EDIT_EM_SetModify(wndPtr
, wParam
, lParam
);
335 case EM_SETPASSWORDCHAR
:
336 DPRINTF_EDIT_MSG("EM_SETPASSWORDCHAR");
337 lResult
= EDIT_EM_SetPasswordChar(wndPtr
, wParam
, lParam
);
340 DPRINTF_EDIT_MSG("EM_SETREADONLY");
341 lResult
= EDIT_EM_SetReadOnly(wndPtr
, wParam
, lParam
);
344 DPRINTF_EDIT_MSG("EM_SETRECT");
345 lResult
= EDIT_EM_SetRect(wndPtr
, wParam
, lParam
);
348 DPRINTF_EDIT_MSG("EM_SETRECTNP");
349 lResult
= EDIT_EM_SetRectNP(wndPtr
, wParam
, lParam
);
352 DPRINTF_EDIT_MSG("EM_SETSEL");
353 lResult
= EDIT_EM_SetSel(wndPtr
, wParam
, lParam
);
356 DPRINTF_EDIT_MSG("EM_SETTABSTOPS");
357 lResult
= EDIT_EM_SetTabStops(wndPtr
, wParam
, lParam
);
359 case EM_SETWORDBREAKPROC
:
360 DPRINTF_EDIT_MSG("EM_SETWORDBREAKPROC");
361 lResult
= EDIT_EM_SetWordBreakProc(wndPtr
, wParam
, lParam
);
365 DPRINTF_EDIT_MSG("EM_UNDO / WM_UNDO");
366 lResult
= EDIT_EM_Undo(wndPtr
, wParam
, lParam
);
369 DPRINTF_EDIT_MSG("WM_GETDLGCODE");
370 lResult
= EDIT_WM_GetDlgCode(wndPtr
, wParam
, lParam
);
373 DPRINTF_EDIT_MSG("WM_CHAR");
374 lResult
= EDIT_WM_Char(wndPtr
, wParam
, lParam
);
377 DPRINTF_EDIT_MSG("WM_CLEAR");
378 lResult
= EDIT_WM_Clear(wndPtr
, wParam
, lParam
);
381 DPRINTF_EDIT_MSG("WM_COPY");
382 lResult
= EDIT_WM_Copy(wndPtr
, wParam
, lParam
);
385 DPRINTF_EDIT_MSG("WM_CREATE");
386 lResult
= EDIT_WM_Create(wndPtr
, wParam
, lParam
);
389 DPRINTF_EDIT_MSG("WM_CUT");
390 lResult
= EDIT_WM_Cut(wndPtr
, wParam
, lParam
);
393 DPRINTF_EDIT_MSG("WM_DESTROY");
394 lResult
= EDIT_WM_Destroy(wndPtr
, wParam
, lParam
);
397 DPRINTF_EDIT_MSG("WM_ENABLE");
398 lResult
= EDIT_WM_Enable(wndPtr
, wParam
, lParam
);
401 DPRINTF_EDIT_MSG("WM_ERASEBKGND");
402 lResult
= EDIT_WM_EraseBkGnd(wndPtr
, wParam
, lParam
);
405 DPRINTF_EDIT_MSG("WM_GETFONT");
406 lResult
= EDIT_WM_GetFont(wndPtr
, wParam
, lParam
);
409 DPRINTF_EDIT_MSG("WM_GETTEXT");
410 lResult
= EDIT_WM_GetText(wndPtr
, wParam
, lParam
);
412 case WM_GETTEXTLENGTH
:
413 DPRINTF_EDIT_MSG("WM_GETTEXTLENGTH");
414 lResult
= EDIT_WM_GetTextLength(wndPtr
, wParam
, lParam
);
417 DPRINTF_EDIT_MSG("WM_HSCROLL");
418 lResult
= EDIT_WM_HScroll(wndPtr
, wParam
, lParam
);
421 DPRINTF_EDIT_MSG("WM_KEYDOWN");
422 lResult
= EDIT_WM_KeyDown(wndPtr
, wParam
, lParam
);
425 DPRINTF_EDIT_MSG("WM_KILLFOCUS");
426 lResult
= EDIT_WM_KillFocus(wndPtr
, wParam
, lParam
);
428 case WM_LBUTTONDBLCLK
:
429 DPRINTF_EDIT_MSG("WM_LBUTTONDBLCLK");
430 lResult
= EDIT_WM_LButtonDblClk(wndPtr
, wParam
, lParam
);
433 DPRINTF_EDIT_MSG("WM_LBUTTONDOWN");
434 lResult
= EDIT_WM_LButtonDown(wndPtr
, wParam
, lParam
);
437 DPRINTF_EDIT_MSG("WM_LBUTTONUP");
438 lResult
= EDIT_WM_LButtonUp(wndPtr
, wParam
, lParam
);
442 * DPRINTF_EDIT_MSG("WM_MOUSEMOVE");
444 lResult
= EDIT_WM_MouseMove(wndPtr
, wParam
, lParam
);
447 DPRINTF_EDIT_MSG("WM_PAINT");
448 lResult
= EDIT_WM_Paint(wndPtr
, wParam
, lParam
);
451 DPRINTF_EDIT_MSG("WM_PASTE");
452 lResult
= EDIT_WM_Paste(wndPtr
, wParam
, lParam
);
456 * DPRINTF_EDIT_MSG("WM_SETCURSOR");
458 lResult
= EDIT_WM_SetCursor(wndPtr
, wParam
, lParam
);
461 DPRINTF_EDIT_MSG("WM_SETFOCUS");
462 lResult
= EDIT_WM_SetFocus(wndPtr
, wParam
, lParam
);
465 DPRINTF_EDIT_MSG("WM_SETFONT");
466 lResult
= EDIT_WM_SetFont(wndPtr
, wParam
, lParam
);
469 DPRINTF_EDIT_MSG("WM_SETREDRAW");
470 lResult
= EDIT_WM_SetRedraw(wndPtr
, wParam
, lParam
);
473 DPRINTF_EDIT_MSG("WM_SETTEXT");
474 lResult
= EDIT_WM_SetText(wndPtr
, wParam
, lParam
);
477 DPRINTF_EDIT_MSG("WM_SIZE");
478 lResult
= EDIT_WM_Size(wndPtr
, wParam
, lParam
);
481 DPRINTF_EDIT_MSG("WM_VSCROLL");
482 lResult
= EDIT_WM_VScroll(wndPtr
, wParam
, lParam
);
485 /* Some programs pass messages obtained through
486 * RegisterWindowMessage() (>= 0xc000); we just ignore them
488 if ((msg
>= WM_USER
) && (msg
< 0xc000))
489 fprintf(stdnimp
, "edit: undocumented message %d >= WM_USER, please report.\n", msg
);
490 lResult
= DefWindowProc16(hwnd
, msg
, wParam
, lParam
);
493 EDIT_ReleasePointer(wndPtr
);
498 /*********************************************************************
502 * Build array of pointers to text lines.
503 * Lines can end with '\0' (last line), nothing (if it is too long),
504 * a delimiter (usually ' '), a soft return '\r\r\n' or a hard return '\r\n'
507 static void EDIT_BuildLineDefs(WND
*wndPtr
)
509 EDITSTATE
*es
= EDITSTATEPTR(wndPtr
);
510 char *text
= EDIT_GetPasswordPointer(wndPtr
);
511 int ww
= EDIT_GetWndWidth(wndPtr
);
521 hdc
= GetDC32(wndPtr
->hwndSelf
);
522 hFont
= (HFONT16
)EDIT_WM_GetFont(wndPtr
, 0, 0L);
524 oldFont
= SelectObject(hdc
, hFont
);
526 if (!IsMultiLine(wndPtr
)) {
528 es
->LineDefs
= xrealloc(es
->LineDefs
, sizeof(LINEDEF
));
529 es
->LineDefs
[0].offset
= 0;
530 es
->LineDefs
[0].length
= EDIT_WM_GetTextLength(wndPtr
, 0, 0L);
531 es
->LineDefs
[0].ending
= END_0
;
532 es
->TextWidth
= LOWORD(GetTabbedTextExtent(hdc
, text
,
533 es
->LineDefs
[0].length
,
534 es
->NumTabStops
, es
->TabStops
));
539 if (!(cp
= strstr(start
, "\r\n"))) {
541 length
= strlen(start
);
542 } else if ((cp
> start
) && (*(cp
- 1) == '\r')) {
544 length
= cp
- start
- 1;
549 width
= LOWORD(GetTabbedTextExtent(hdc
, start
, length
,
550 es
->NumTabStops
, es
->TabStops
));
552 if (IsWordWrap(wndPtr
) && (width
> ww
)) {
556 next
= EDIT_CallWordBreakProc(wndPtr
, start
,
557 prev
+ 1, length
, WB_RIGHT
);
558 width
= LOWORD(GetTabbedTextExtent(hdc
, start
, next
,
559 es
->NumTabStops
, es
->TabStops
));
560 } while (width
<= ww
);
566 width
= LOWORD(GetTabbedTextExtent(hdc
, start
, next
,
567 es
->NumTabStops
, es
->TabStops
));
568 } while (width
<= ww
);
572 if (EDIT_CallWordBreakProc(wndPtr
, start
, length
- 1,
573 length
, WB_ISDELIMITER
)) {
575 ending
= END_DELIMIT
;
578 width
= LOWORD(GetTabbedTextExtent(hdc
, start
, length
,
579 es
->NumTabStops
, es
->TabStops
));
582 es
->LineDefs
= xrealloc(es
->LineDefs
, (es
->LineCount
+ 1) * sizeof(LINEDEF
));
583 es
->LineDefs
[es
->LineCount
].offset
= start
- text
;
584 es
->LineDefs
[es
->LineCount
].length
= length
;
585 es
->LineDefs
[es
->LineCount
].ending
= ending
;
587 es
->TextWidth
= MAX(es
->TextWidth
, width
);
603 } while (*start
|| (ending
== END_SOFT
) || (ending
== END_HARD
));
606 SelectObject(hdc
, oldFont
);
607 ReleaseDC32(wndPtr
->hwndSelf
, hdc
);
613 /*********************************************************************
615 * EDIT_CallWordBreakProc
617 * Call appropriate WordBreakProc (internal or external).
620 static INT
EDIT_CallWordBreakProc(WND
*wndPtr
, char *s
, INT index
, INT count
, INT action
)
622 EDITWORDBREAKPROC wbp
= (EDITWORDBREAKPROC
)EDIT_EM_GetWordBreakProc(wndPtr
, 0, 0L);
624 if (!wbp
) return EDIT_WordBreakProc(s
, index
, count
, action
);
627 /* We need a SEGPTR here */
629 EDITSTATE
*es
= EDITSTATEPTR(wndPtr
);
630 SEGPTR ptr
= LOCAL_LockSegptr( wndPtr
->hInstance
, es
->hBuf
) +
631 (UINT16
)(s
- EDIT_GetPointer(wndPtr
));
632 INT ret
= CallWordBreakProc( (FARPROC16
)wbp
, ptr
,
633 index
, count
, action
);
634 LOCAL_Unlock( wndPtr
->hInstance
, es
->hBuf
);
640 /*********************************************************************
644 * Calculates, for a given line and X-coordinate on the screen, the column.
647 static UINT
EDIT_ColFromWndX(WND
*wndPtr
, UINT line
, INT x
)
649 UINT lc
= (UINT
)EDIT_EM_GetLineCount(wndPtr
, 0, 0L);
650 UINT li
= (UINT
)EDIT_EM_LineIndex(wndPtr
, line
, 0L);
651 UINT ll
= (UINT
)EDIT_EM_LineLength(wndPtr
, li
, 0L);
654 line
= MAX(0, MIN(line
, lc
- 1));
655 for (i
= 0 ; i
< ll
; i
++)
656 if (EDIT_WndXFromCol(wndPtr
, line
, i
) >= x
)
662 /*********************************************************************
666 * Delete all characters on this line to right of cursor.
669 static void EDIT_DelEnd(WND
*wndPtr
)
671 EDIT_EM_SetSel(wndPtr
, 1, MAKELPARAM(-1, 0));
672 EDIT_MoveEnd(wndPtr
, TRUE
);
673 EDIT_WM_Clear(wndPtr
, 0, 0L);
677 /*********************************************************************
681 * Delete character to left of cursor.
684 static void EDIT_DelLeft(WND
*wndPtr
)
686 EDIT_EM_SetSel(wndPtr
, 1, MAKELPARAM(-1, 0));
687 EDIT_MoveBackward(wndPtr
, TRUE
);
688 EDIT_WM_Clear(wndPtr
, 0, 0L);
692 /*********************************************************************
696 * Delete character to right of cursor.
699 static void EDIT_DelRight(WND
*wndPtr
)
701 EDIT_EM_SetSel(wndPtr
, 1, MAKELPARAM(-1, 0));
702 EDIT_MoveForward(wndPtr
, TRUE
);
703 EDIT_WM_Clear(wndPtr
, 0, 0L);
707 /*********************************************************************
709 * EDIT_GetAveCharWidth
712 static UINT
EDIT_GetAveCharWidth(WND
*wndPtr
)
714 EDITSTATE
*es
= EDITSTATEPTR(wndPtr
);
716 return es
->AveCharWidth
;
720 /*********************************************************************
725 static UINT
EDIT_GetLineHeight(WND
*wndPtr
)
727 EDITSTATE
*es
= EDITSTATEPTR(wndPtr
);
729 return es
->LineHeight
;
733 /*********************************************************************
737 * Calculates the bounding rectangle for a line from a starting
738 * column to an ending column.
741 static void EDIT_GetLineRect(WND
*wndPtr
, UINT line
, UINT scol
, UINT ecol
, LPRECT16 rc
)
743 rc
->top
= EDIT_WndYFromLine(wndPtr
, line
);
744 rc
->bottom
= rc
->top
+ EDIT_GetLineHeight(wndPtr
);
745 rc
->left
= EDIT_WndXFromCol(wndPtr
, line
, scol
);
746 rc
->right
= ((INT
)ecol
== -1) ? EDIT_GetWndWidth(wndPtr
) :
747 EDIT_WndXFromCol(wndPtr
, line
, ecol
);
751 /*********************************************************************
755 * This acts as a LOCAL_Lock(), but it locks only once. This way
756 * you can call it whenever you like, without unlocking.
759 static char *EDIT_GetPointer(WND
*wndPtr
)
761 EDITSTATE
*es
= EDITSTATEPTR(wndPtr
);
763 if (!es
->text
&& es
->hBuf
)
764 es
->text
= LOCAL_Lock(wndPtr
->hInstance
, es
->hBuf
);
769 /*********************************************************************
771 * EDIT_GetPasswordPointer
775 static char *EDIT_GetPasswordPointer(WND
*wndPtr
)
777 EDITSTATE
*es
= EDITSTATEPTR(wndPtr
);
778 char *text
= xstrdup(EDIT_GetPointer(wndPtr
));
781 if(es
->PasswordChar
) {
784 if(*p
!= '\r' && *p
!= '\n')
785 *p
= es
->PasswordChar
;
793 /*********************************************************************
797 * Beware: This is not the function called on EM_GETRECT.
798 * It expects a (LPRECT) in lParam, not a (SEGPTR).
799 * It is used internally, as if there were no pointer difficulties.
802 static LRESULT
EDIT_GetRect(WND
*wndPtr
, WPARAM32 wParam
, LPARAM lParam
)
804 GetClientRect16( wndPtr
->hwndSelf
, (LPRECT16
)lParam
);
809 /*********************************************************************
814 static BOOL
EDIT_GetRedraw(WND
*wndPtr
)
816 EDITSTATE
*es
= EDITSTATEPTR(wndPtr
);
822 /*********************************************************************
827 static UINT
EDIT_GetTextWidth(WND
*wndPtr
)
829 EDITSTATE
*es
= EDITSTATEPTR(wndPtr
);
831 return es
->TextWidth
;
835 /*********************************************************************
837 * EDIT_GetVisibleLineCount
840 static UINT
EDIT_GetVisibleLineCount(WND
*wndPtr
)
844 EDIT_GetRect(wndPtr
, 0, (LPARAM
)&rc
);
845 return MAX(1, MAX(rc
.bottom
- rc
.top
, 0) / EDIT_GetLineHeight(wndPtr
));
849 /*********************************************************************
854 static UINT
EDIT_GetWndWidth(WND
*wndPtr
)
858 EDIT_GetRect(wndPtr
, 0, (LPARAM
)&rc
);
859 return rc
.right
- rc
.left
;
863 /*********************************************************************
868 static UINT
EDIT_GetXOffset(WND
*wndPtr
)
870 EDITSTATE
*es
= EDITSTATEPTR(wndPtr
);
876 /*********************************************************************
878 * EDIT_InvalidateText
880 * Invalidate the text from offset start upto, but not including,
881 * offset end. Useful for (re)painting the selection.
882 * Regions outside the linewidth are not invalidated.
883 * end == -1 means end == TextLength.
884 * start and end need not be ordered.
887 static void EDIT_InvalidateText(WND
*wndPtr
, UINT start
, UINT end
)
889 UINT fv
= (UINT
)EDIT_EM_GetFirstVisibleLine(wndPtr
, 0, 0L);
890 UINT vlc
= EDIT_GetVisibleLineCount(wndPtr
);
904 end
= (UINT
)EDIT_WM_GetTextLength(wndPtr
, 0, 0L);
905 ORDER_UINT(start
, end
);
906 sl
= (UINT
)EDIT_EM_LineFromChar(wndPtr
, start
, 0L);
907 el
= (UINT
)EDIT_EM_LineFromChar(wndPtr
, end
, 0L);
908 if ((el
< fv
) || (sl
> fv
+ vlc
))
911 sc
= start
- (UINT
)EDIT_EM_LineIndex(wndPtr
, sl
, 0L);
912 ec
= end
- (UINT
)EDIT_EM_LineIndex(wndPtr
, el
, 0L);
919 ec
= (UINT
)EDIT_EM_LineLength(wndPtr
,
920 (UINT
)EDIT_EM_LineIndex(wndPtr
, el
, 0L), 0L);
922 EDIT_GetRect(wndPtr
, 0, (LPARAM
)&rcWnd
);
924 EDIT_GetLineRect(wndPtr
, sl
, sc
, ec
, &rcLine
);
925 if (IntersectRect16(&rcUpdate
, &rcWnd
, &rcLine
))
926 InvalidateRect16( wndPtr
->hwndSelf
, &rcUpdate
, FALSE
);
928 EDIT_GetLineRect(wndPtr
, sl
, sc
,
929 (UINT
)EDIT_EM_LineLength(wndPtr
,
930 (UINT
)EDIT_EM_LineIndex(wndPtr
, sl
, 0L), 0L),
932 if (IntersectRect16(&rcUpdate
, &rcWnd
, &rcLine
))
933 InvalidateRect16( wndPtr
->hwndSelf
, &rcUpdate
, FALSE
);
934 for (l
= sl
+ 1 ; l
< el
; l
++) {
935 EDIT_GetLineRect(wndPtr
, l
, 0,
936 (UINT
)EDIT_EM_LineLength(wndPtr
,
937 (UINT
)EDIT_EM_LineIndex(wndPtr
, l
, 0L), 0L),
939 if (IntersectRect16(&rcUpdate
, &rcWnd
, &rcLine
))
940 InvalidateRect16(wndPtr
->hwndSelf
, &rcUpdate
, FALSE
);
942 EDIT_GetLineRect(wndPtr
, el
, 0, ec
, &rcLine
);
943 if (IntersectRect16(&rcUpdate
, &rcWnd
, &rcLine
))
944 InvalidateRect16( wndPtr
->hwndSelf
, &rcUpdate
, FALSE
);
949 /*********************************************************************
953 * Calculates, for a given Y-coordinate on the screen, the line.
956 static UINT
EDIT_LineFromWndY(WND
*wndPtr
, INT y
)
958 UINT fv
= (UINT
)EDIT_EM_GetFirstVisibleLine(wndPtr
, 0, 0L);
959 UINT lh
= EDIT_GetLineHeight(wndPtr
);
960 UINT lc
= (UINT
)EDIT_EM_GetLineCount(wndPtr
, 0, 0L);
962 return MAX(0, MIN(lc
- 1, y
/ lh
+ fv
));
966 /*********************************************************************
970 * Try to fit size + 1 bytes in the buffer. Constrain to limits.
973 static BOOL
EDIT_MakeFit(WND
*wndPtr
, UINT size
)
975 EDITSTATE
*es
= EDITSTATEPTR(wndPtr
);
977 if (size
<= es
->BufSize
)
979 if (size
> es
->BufLimit
)
981 size
= ((size
/ GROWLENGTH
) + 1) * GROWLENGTH
;
982 if (size
> es
->BufLimit
)
985 dprintf_edit(stddeb
, "edit: EDIT_MakeFit: trying to ReAlloc to %d+1\n", size
);
987 if (LOCAL_ReAlloc(wndPtr
->hInstance
, es
->hBuf
, size
+ 1, LMEM_MOVEABLE
)) {
988 es
->BufSize
= MIN(LOCAL_Size(wndPtr
->hInstance
, es
->hBuf
) - 1, es
->BufLimit
);
995 /*********************************************************************
1000 static void EDIT_MoveBackward(WND
*wndPtr
, BOOL extend
)
1002 UINT s
= LOWORD(EDIT_EM_GetSel(wndPtr
, 0, 0L));
1003 UINT e
= HIWORD(EDIT_EM_GetSel(wndPtr
, 0, 0L));
1004 UINT l
= (UINT
)EDIT_EM_LineFromChar(wndPtr
, e
, 0L);
1005 UINT li
= (UINT
)EDIT_EM_LineIndex(wndPtr
, l
, 0L);
1009 li
= (UINT
)EDIT_EM_LineIndex(wndPtr
, l
- 1, 0L);
1010 e
= li
+ (UINT
)EDIT_EM_LineLength(wndPtr
, li
, 0L);
1016 EDIT_EM_SetSel(wndPtr
, 0, MAKELPARAM(s
, e
));
1020 /*********************************************************************
1025 static void EDIT_MoveDownward(WND
*wndPtr
, BOOL extend
)
1027 UINT s
= LOWORD(EDIT_EM_GetSel(wndPtr
, 0, 0L));
1028 UINT e
= HIWORD(EDIT_EM_GetSel(wndPtr
, 0, 0L));
1029 UINT l
= (UINT
)EDIT_EM_LineFromChar(wndPtr
, e
, 0L);
1030 UINT lc
= (UINT
)EDIT_EM_GetLineCount(wndPtr
, e
, 0L);
1031 UINT li
= (UINT
)EDIT_EM_LineIndex(wndPtr
, l
, 0L);
1035 x
= EDIT_WndXFromCol(wndPtr
, l
, e
- li
);
1037 e
= (UINT
)EDIT_EM_LineIndex(wndPtr
, l
, 0L) +
1038 EDIT_ColFromWndX(wndPtr
, l
, x
);
1042 EDIT_EM_SetSel(wndPtr
, 0, MAKELPARAM(s
, e
));
1046 /*********************************************************************
1051 static void EDIT_MoveEnd(WND
*wndPtr
, BOOL extend
)
1053 UINT s
= LOWORD(EDIT_EM_GetSel(wndPtr
, 0, 0L));
1054 UINT e
= HIWORD(EDIT_EM_GetSel(wndPtr
, 0, 0L));
1055 UINT l
= (UINT
)EDIT_EM_LineFromChar(wndPtr
, e
, 0L);
1056 UINT ll
= (UINT
)EDIT_EM_LineLength(wndPtr
, e
, 0L);
1057 UINT li
= (UINT
)EDIT_EM_LineIndex(wndPtr
, l
, 0L);
1062 EDIT_EM_SetSel(wndPtr
, 0, MAKELPARAM(s
, e
));
1066 /*********************************************************************
1071 static void EDIT_MoveForward(WND
*wndPtr
, BOOL extend
)
1073 UINT s
= LOWORD(EDIT_EM_GetSel(wndPtr
, 0, 0L));
1074 UINT e
= HIWORD(EDIT_EM_GetSel(wndPtr
, 0, 0L));
1075 UINT l
= (UINT
)EDIT_EM_LineFromChar(wndPtr
, e
, 0L);
1076 UINT lc
= (UINT
)EDIT_EM_GetLineCount(wndPtr
, e
, 0L);
1077 UINT ll
= (UINT
)EDIT_EM_LineLength(wndPtr
, e
, 0L);
1078 UINT li
= (UINT
)EDIT_EM_LineIndex(wndPtr
, l
, 0L);
1082 e
= (UINT
)EDIT_EM_LineIndex(wndPtr
, l
+ 1, 0L);
1087 EDIT_EM_SetSel(wndPtr
, 0, MAKELPARAM(s
, e
));
1091 /*********************************************************************
1095 * Home key: move to beginning of line.
1098 static void EDIT_MoveHome(WND
*wndPtr
, BOOL extend
)
1100 UINT s
= LOWORD(EDIT_EM_GetSel(wndPtr
, 0, 0L));
1101 UINT e
= HIWORD(EDIT_EM_GetSel(wndPtr
, 0, 0L));
1102 UINT l
= (UINT
)EDIT_EM_LineFromChar(wndPtr
, e
, 0L);
1103 UINT li
= (UINT
)EDIT_EM_LineIndex(wndPtr
, l
, 0L);
1108 EDIT_EM_SetSel(wndPtr
, 0, MAKELPARAM(s
, e
));
1112 /*********************************************************************
1117 static void EDIT_MovePageDown(WND
*wndPtr
, BOOL extend
)
1119 UINT s
= LOWORD(EDIT_EM_GetSel(wndPtr
, 0, 0L));
1120 UINT e
= HIWORD(EDIT_EM_GetSel(wndPtr
, 0, 0L));
1121 UINT l
= (UINT
)EDIT_EM_LineFromChar(wndPtr
, e
, 0L);
1122 UINT lc
= (UINT
)EDIT_EM_GetLineCount(wndPtr
, e
, 0L);
1123 UINT li
= (UINT
)EDIT_EM_LineIndex(wndPtr
, l
, 0L);
1127 x
= EDIT_WndXFromCol(wndPtr
, l
, e
- li
);
1128 l
= MIN(lc
- 1, l
+ EDIT_GetVisibleLineCount(wndPtr
));
1129 e
= (UINT
)EDIT_EM_LineIndex(wndPtr
, l
, 0L) +
1130 EDIT_ColFromWndX(wndPtr
, l
, x
);
1134 EDIT_EM_SetSel(wndPtr
, 0, MAKELPARAM(s
, e
));
1138 /*********************************************************************
1143 static void EDIT_MovePageUp(WND
*wndPtr
, BOOL extend
)
1145 UINT s
= LOWORD(EDIT_EM_GetSel(wndPtr
, 0, 0L));
1146 UINT e
= HIWORD(EDIT_EM_GetSel(wndPtr
, 0, 0L));
1147 UINT l
= (UINT
)EDIT_EM_LineFromChar(wndPtr
, e
, 0L);
1148 UINT li
= (UINT
)EDIT_EM_LineIndex(wndPtr
, l
, 0L);
1152 x
= EDIT_WndXFromCol(wndPtr
, l
, e
- li
);
1153 l
= MAX(0, l
- EDIT_GetVisibleLineCount(wndPtr
));
1154 e
= (UINT
)EDIT_EM_LineIndex(wndPtr
, l
, 0L) +
1155 EDIT_ColFromWndX(wndPtr
, l
, x
);
1159 EDIT_EM_SetSel(wndPtr
, 0, MAKELPARAM(s
, e
));
1163 /*********************************************************************
1168 static void EDIT_MoveUpward(WND
*wndPtr
, BOOL extend
)
1170 UINT s
= LOWORD(EDIT_EM_GetSel(wndPtr
, 0, 0L));
1171 UINT e
= HIWORD(EDIT_EM_GetSel(wndPtr
, 0, 0L));
1172 UINT l
= (UINT
)EDIT_EM_LineFromChar(wndPtr
, e
, 0L);
1173 UINT li
= (UINT
)EDIT_EM_LineIndex(wndPtr
, l
, 0L);
1177 x
= EDIT_WndXFromCol(wndPtr
, l
, e
- li
);
1179 e
= (UINT
)EDIT_EM_LineIndex(wndPtr
, l
, 0L) +
1180 EDIT_ColFromWndX(wndPtr
, l
, x
);
1184 EDIT_EM_SetSel(wndPtr
, 0, MAKELPARAM(s
, e
));
1188 /*********************************************************************
1190 * EDIT_MoveWordBackward
1193 static void EDIT_MoveWordBackward(WND
*wndPtr
, BOOL extend
)
1195 UINT s
= LOWORD(EDIT_EM_GetSel(wndPtr
, 0, 0L));
1196 UINT e
= HIWORD(EDIT_EM_GetSel(wndPtr
, 0, 0L));
1197 UINT l
= (UINT
)EDIT_EM_LineFromChar(wndPtr
, e
, 0L);
1198 UINT ll
= (UINT
)EDIT_EM_LineLength(wndPtr
, e
, 0L);
1199 UINT li
= (UINT
)EDIT_EM_LineIndex(wndPtr
, l
, 0L);
1204 li
= (UINT
)EDIT_EM_LineIndex(wndPtr
, l
- 1, 0L);
1205 e
= li
+ (UINT
)EDIT_EM_LineLength(wndPtr
, li
, 0L);
1208 text
= EDIT_GetPointer(wndPtr
);
1209 e
= li
+ (UINT
)EDIT_CallWordBreakProc(wndPtr
,
1210 text
+ li
, e
- li
, ll
, WB_LEFT
);
1214 EDIT_EM_SetSel(wndPtr
, 0, MAKELPARAM(s
, e
));
1218 /*********************************************************************
1220 * EDIT_MoveWordForward
1223 static void EDIT_MoveWordForward(WND
*wndPtr
, BOOL extend
)
1225 UINT s
= LOWORD(EDIT_EM_GetSel(wndPtr
, 0, 0L));
1226 UINT e
= HIWORD(EDIT_EM_GetSel(wndPtr
, 0, 0L));
1227 UINT l
= (UINT
)EDIT_EM_LineFromChar(wndPtr
, e
, 0L);
1228 UINT lc
= (UINT
)EDIT_EM_GetLineCount(wndPtr
, e
, 0L);
1229 UINT ll
= (UINT
)EDIT_EM_LineLength(wndPtr
, e
, 0L);
1230 UINT li
= (UINT
)EDIT_EM_LineIndex(wndPtr
, l
, 0L);
1235 e
= (UINT
)EDIT_EM_LineIndex(wndPtr
, l
+ 1, 0L);
1237 text
= EDIT_GetPointer(wndPtr
);
1238 e
= li
+ (UINT
)EDIT_CallWordBreakProc(wndPtr
,
1239 text
+ li
, e
- li
+ 1, ll
, WB_RIGHT
);
1243 EDIT_EM_SetSel(wndPtr
, 0, MAKELPARAM(s
, e
));
1247 /*********************************************************************
1252 static void EDIT_PaintLine(WND
*wndPtr
, HDC32 hdc
, UINT line
, BOOL rev
)
1254 UINT fv
= (UINT
)EDIT_EM_GetFirstVisibleLine(wndPtr
, 0, 0L);
1255 UINT vlc
= EDIT_GetVisibleLineCount(wndPtr
);
1256 UINT lc
= (UINT
)EDIT_EM_GetLineCount(wndPtr
, 0, 0L);
1264 if ((line
< fv
) || (line
> fv
+ vlc
) || (line
>= lc
))
1267 dprintf_edit(stddeb
, "edit: EDIT_PaintLine: line=%d\n", line
);
1269 x
= EDIT_WndXFromCol(wndPtr
, line
, 0);
1270 y
= EDIT_WndYFromLine(wndPtr
, line
);
1271 li
= (UINT
)EDIT_EM_LineIndex(wndPtr
, line
, 0L);
1272 ll
= (UINT
)EDIT_EM_LineLength(wndPtr
, li
, 0L);
1273 s
= LOWORD(EDIT_EM_GetSel(wndPtr
, 0, 0L));
1274 e
= HIWORD(EDIT_EM_GetSel(wndPtr
, 0, 0L));
1276 s
= MIN(li
+ ll
, MAX(li
, s
));
1277 e
= MIN(li
+ ll
, MAX(li
, e
));
1278 if (rev
&& (s
!= e
) &&
1279 ((GetFocus32() == wndPtr
->hwndSelf
) ||
1280 (wndPtr
->dwStyle
& ES_NOHIDESEL
))) {
1281 x
+= EDIT_PaintText(wndPtr
, hdc
, x
, y
, line
, 0, s
- li
, FALSE
);
1282 x
+= EDIT_PaintText(wndPtr
, hdc
, x
, y
, line
, s
- li
, e
- s
, TRUE
);
1283 x
+= EDIT_PaintText(wndPtr
, hdc
, x
, y
, line
, e
- li
, li
+ ll
- e
, FALSE
);
1285 x
+= EDIT_PaintText(wndPtr
, hdc
, x
, y
, line
, 0, ll
, FALSE
);
1289 /*********************************************************************
1294 static UINT
EDIT_PaintText(WND
*wndPtr
, HDC32 hdc
, INT x
, INT y
, UINT line
, UINT col
, UINT count
, BOOL rev
)
1296 EDITSTATE
*es
= EDITSTATEPTR(wndPtr
);
1306 BkColor
= GetBkColor(hdc
);
1307 TextColor
= GetTextColor(hdc
);
1309 SetBkColor(hdc
, GetSysColor(COLOR_HIGHLIGHT
));
1310 SetTextColor(hdc
, GetSysColor(COLOR_HIGHLIGHTTEXT
));
1312 text
= EDIT_GetPasswordPointer(wndPtr
);
1313 li
= (UINT
)EDIT_EM_LineIndex(wndPtr
, line
, 0L);
1314 xoff
= EDIT_GetXOffset(wndPtr
);
1315 ret
= LOWORD(TabbedTextOut(hdc
, x
, y
, text
+ li
+ col
, count
,
1316 es
->NumTabStops
, es
->TabStops
, -xoff
));
1319 SetBkColor(hdc
, BkColor
);
1320 SetTextColor(hdc
, TextColor
);
1326 /*********************************************************************
1328 * EDIT_ReleasePointer
1330 * This is the only helper function that can be called with es = NULL.
1331 * It is called at the end of EditWndProc() to unlock the buffer.
1334 static void EDIT_ReleasePointer(WND
*wndPtr
)
1336 EDITSTATE
*es
= EDITSTATEPTR(wndPtr
);
1340 if (es
->text
&& es
->hBuf
)
1341 LOCAL_Unlock(wndPtr
->hInstance
, es
->hBuf
);
1346 /*********************************************************************
1350 * Beware: This is not the function called on EM_REPLACESEL.
1351 * It expects a (char *) in lParam, not a (SEGPTR).
1352 * It is used internally, as if there were no pointer difficulties.
1355 static LRESULT
EDIT_ReplaceSel(WND
*wndPtr
, WPARAM32 wParam
, LPARAM lParam
)
1357 const char *str
= (char *)lParam
;
1358 int strl
= strlen(str
);
1359 UINT tl
= (UINT
)EDIT_WM_GetTextLength(wndPtr
, 0, 0L);
1360 UINT s
= LOWORD(EDIT_EM_GetSel(wndPtr
, 0, 0L));
1361 UINT e
= HIWORD(EDIT_EM_GetSel(wndPtr
, 0, 0L));
1368 if (!EDIT_MakeFit(wndPtr
, tl
- (e
- s
) + strl
)) {
1369 EDIT_NOTIFY_PARENT(wndPtr
, EN_MAXTEXT
);
1372 redraw
= EDIT_GetRedraw(wndPtr
);
1373 EDIT_WM_SetRedraw(wndPtr
, FALSE
, 0L);
1374 EDIT_WM_Clear(wndPtr
, 0, 0L);
1375 tl
= EDIT_WM_GetTextLength(wndPtr
, 0, 0L);
1376 e
= HIWORD(EDIT_EM_GetSel(wndPtr
, 0, 0L));
1377 text
= EDIT_GetPointer(wndPtr
);
1378 for (p
= text
+ tl
; p
>= text
+ e
; p
--)
1380 for (i
= 0 , p
= text
+ e
; i
< strl
; i
++)
1383 AnsiUpperBuff(p
, strl
);
1384 else if(IsLower(wndPtr
))
1385 AnsiLowerBuff(p
, strl
);
1386 EDIT_BuildLineDefs(wndPtr
);
1388 EDIT_EM_SetSel(wndPtr
, 0, MAKELPARAM(e
, e
));
1389 EDIT_EM_SetModify(wndPtr
, TRUE
, 0L);
1390 EDIT_NOTIFY_PARENT(wndPtr
, EN_UPDATE
);
1391 EDIT_WM_SetRedraw(wndPtr
, redraw
, 0L);
1393 InvalidateRect32( wndPtr
->hwndSelf
, NULL
, TRUE
);
1394 EDIT_NOTIFY_PARENT(wndPtr
, EN_CHANGE
);
1400 /*********************************************************************
1402 * EDIT_ScrollIntoView
1404 * Makes sure the caret is visible.
1407 static void EDIT_ScrollIntoView(WND
*wndPtr
)
1409 UINT e
= HIWORD(EDIT_EM_GetSel(wndPtr
, 0, 0L));
1410 UINT l
= (UINT
)EDIT_EM_LineFromChar(wndPtr
, e
, 0L);
1411 UINT li
= (UINT
)EDIT_EM_LineIndex(wndPtr
, l
, 0L);
1412 UINT fv
= (UINT
)EDIT_EM_GetFirstVisibleLine(wndPtr
, 0, 0L);
1413 UINT vlc
= EDIT_GetVisibleLineCount(wndPtr
);
1414 UINT ww
= EDIT_GetWndWidth(wndPtr
);
1415 UINT cw
= EDIT_GetAveCharWidth(wndPtr
);
1416 INT x
= EDIT_WndXFromCol(wndPtr
, l
, e
- li
);
1421 dy
= l
- vlc
+ 1 - fv
;
1425 dx
= x
- ww
/ HSCROLL_FRACTION
/ cw
* cw
;
1427 dx
= x
- (HSCROLL_FRACTION
- 1) * ww
/ HSCROLL_FRACTION
/ cw
* cw
;
1429 EDIT_EM_LineScroll(wndPtr
, 0, MAKELPARAM(dy
, dx
));
1431 EDIT_NOTIFY_PARENT(wndPtr
, EN_VSCROLL
);
1433 EDIT_NOTIFY_PARENT(wndPtr
, EN_HSCROLL
);
1438 /*********************************************************************
1442 * Calculates, for a given line and column, the X-coordinate on the screen.
1445 static INT
EDIT_WndXFromCol(WND
*wndPtr
, UINT line
, UINT col
)
1447 EDITSTATE
*es
= EDITSTATEPTR(wndPtr
);
1448 char *text
= EDIT_GetPasswordPointer(wndPtr
);
1452 HFONT16 oldFont
= 0;
1453 UINT lc
= (UINT
)EDIT_EM_GetLineCount(wndPtr
, 0, 0L);
1454 UINT li
= (UINT
)EDIT_EM_LineIndex(wndPtr
, line
, 0L);
1455 UINT ll
= (UINT
)EDIT_EM_LineLength(wndPtr
, li
, 0L);
1456 UINT xoff
= EDIT_GetXOffset(wndPtr
);
1458 hdc
= GetDC32(wndPtr
->hwndSelf
);
1459 hFont
= (HFONT16
)EDIT_WM_GetFont(wndPtr
, 0, 0L);
1461 oldFont
= SelectObject(hdc
, hFont
);
1462 line
= MAX(0, MIN(line
, lc
- 1));
1464 ret
= LOWORD(GetTabbedTextExtent(hdc
,
1466 es
->NumTabStops
, es
->TabStops
)) - xoff
;
1468 SelectObject(hdc
, oldFont
);
1469 ReleaseDC32(wndPtr
->hwndSelf
, hdc
);
1475 /*********************************************************************
1479 * Calculates, for a given line, the Y-coordinate on the screen.
1482 static INT
EDIT_WndYFromLine(WND
*wndPtr
, UINT line
)
1484 UINT fv
= (UINT
)EDIT_EM_GetFirstVisibleLine(wndPtr
, 0, 0L);
1485 UINT lh
= EDIT_GetLineHeight(wndPtr
);
1487 return (line
- fv
) * lh
;
1491 /*********************************************************************
1493 * EDIT_WordBreakProc
1495 * Find the beginning of words.
1496 * Note: unlike the specs for a WordBreakProc, this function only
1497 * allows to be called without linebreaks between s[0] upto
1498 * s[count - 1]. Remember it is only called
1499 * internally, so we can decide this for ourselves.
1502 static INT
EDIT_WordBreakProc(char *s
, INT index
, INT count
, INT action
)
1506 dprintf_edit(stddeb
, "edit: EDIT_WordBreakProc: s=%p, index=%d"
1507 ", count=%d, action=%d\n", s
, index
, count
, action
);
1515 if (s
[index
] == ' ') {
1516 while (index
&& (s
[index
] == ' '))
1519 while (index
&& (s
[index
] != ' '))
1521 if (s
[index
] == ' ')
1525 while (index
&& (s
[index
] != ' '))
1527 if (s
[index
] == ' ')
1537 if (s
[index
] == ' ')
1538 while ((index
< count
) && (s
[index
] == ' ')) index
++;
1540 while (s
[index
] && (s
[index
] != ' ') && (index
< count
))
1542 while ((s
[index
] == ' ') && (index
< count
)) index
++;
1546 case WB_ISDELIMITER
:
1547 ret
= (s
[index
] == ' ');
1550 fprintf(stderr
, "edit: EDIT_WordBreakProc: unknown action code, please report !\n");
1557 /*********************************************************************
1562 static LRESULT
EDIT_EM_CanUndo(WND
*wndPtr
, WPARAM32 wParam
, LPARAM lParam
)
1568 /*********************************************************************
1570 * EM_EMPTYUNDOBUFFER
1573 static LRESULT
EDIT_EM_EmptyUndoBuffer(WND
*wndPtr
, WPARAM32 wParam
, LPARAM lParam
)
1579 /*********************************************************************
1584 static LRESULT
EDIT_EM_FmtLines(WND
*wndPtr
, WPARAM32 wParam
, LPARAM lParam
)
1586 fprintf(stdnimp
, "edit: EM_FMTLINES: message not implemented.\n");
1587 return wParam
? -1L : 0L;
1591 /*********************************************************************
1593 * EM_GETFIRSTVISIBLELINE
1596 static LRESULT
EDIT_EM_GetFirstVisibleLine(WND
*wndPtr
, WPARAM32 wParam
, LPARAM lParam
)
1598 EDITSTATE
*es
= EDITSTATEPTR(wndPtr
);
1600 return (LRESULT
)es
->FirstVisibleLine
;
1604 /*********************************************************************
1609 static LRESULT
EDIT_EM_GetHandle(WND
*wndPtr
, WPARAM32 wParam
, LPARAM lParam
)
1611 EDITSTATE
*es
= EDITSTATEPTR(wndPtr
);
1613 return (LRESULT
)es
->hBuf
;
1617 /*********************************************************************
1622 static LRESULT
EDIT_EM_GetLine(WND
*wndPtr
, WPARAM32 wParam
, LPARAM lParam
)
1629 UINT lc
= (UINT
)EDIT_EM_GetLineCount(wndPtr
, 0, 0L);
1631 if (!IsMultiLine(wndPtr
))
1633 if ((UINT
)wParam
>= lc
)
1635 text
= EDIT_GetPointer(wndPtr
);
1636 src
= text
+ (UINT
)EDIT_EM_LineIndex(wndPtr
, wParam
, 0L);
1637 dst
= (char *)PTR_SEG_TO_LIN(lParam
);
1638 len
= MIN(*(WORD
*)dst
, (UINT
)EDIT_EM_LineLength(wndPtr
, wParam
, 0L));
1639 for (i
= 0 ; i
< len
; i
++) {
1644 return (LRESULT
)len
;
1648 /*********************************************************************
1653 static LRESULT
EDIT_EM_GetLineCount(WND
*wndPtr
, WPARAM32 wParam
, LPARAM lParam
)
1655 EDITSTATE
*es
= EDITSTATEPTR(wndPtr
);
1657 return (LRESULT
)es
->LineCount
;
1661 /*********************************************************************
1666 static LRESULT
EDIT_EM_GetModify(WND
*wndPtr
, WPARAM32 wParam
, LPARAM lParam
)
1668 EDITSTATE
*es
= EDITSTATEPTR(wndPtr
);
1670 return (LRESULT
)es
->TextChanged
;
1674 /*********************************************************************
1676 * EM_GETPASSWORDCHAR
1679 static LRESULT
EDIT_EM_GetPasswordChar(WND
*wndPtr
, WPARAM32 wParam
, LPARAM lParam
)
1681 EDITSTATE
*es
= EDITSTATEPTR(wndPtr
);
1683 return (LRESULT
)es
->PasswordChar
;
1687 /*********************************************************************
1692 static LRESULT
EDIT_EM_GetRect(WND
*wndPtr
, WPARAM32 wParam
, LPARAM lParam
)
1694 return EDIT_GetRect(wndPtr
, wParam
, (LPARAM
)PTR_SEG_TO_LIN(lParam
));
1698 /*********************************************************************
1703 static LRESULT
EDIT_EM_GetSel(WND
*wndPtr
, WPARAM32 wParam
, LPARAM lParam
)
1705 EDITSTATE
*es
= EDITSTATEPTR(wndPtr
);
1707 return MAKELONG(es
->SelStart
, es
->SelEnd
);
1711 /*********************************************************************
1715 * FIXME: undocumented: is this right ?
1718 static LRESULT
EDIT_EM_GetThumb(WND
*wndPtr
, WPARAM32 wParam
, LPARAM lParam
)
1720 return MAKELONG(EDIT_WM_VScroll(wndPtr
, EM_GETTHUMB
, 0L),
1721 EDIT_WM_HScroll(wndPtr
, EM_GETTHUMB
, 0L));
1725 /*********************************************************************
1727 * EM_GETWORDBREAKPROC
1730 static LRESULT
EDIT_EM_GetWordBreakProc(WND
*wndPtr
, WPARAM32 wParam
, LPARAM lParam
)
1732 EDITSTATE
*es
= EDITSTATEPTR(wndPtr
);
1734 return (LRESULT
)es
->WordBreakProc
;
1738 /*********************************************************************
1743 static LRESULT
EDIT_EM_LimitText(WND
*wndPtr
, WPARAM32 wParam
, LPARAM lParam
)
1745 EDITSTATE
*es
= EDITSTATEPTR(wndPtr
);
1747 if (IsMultiLine(wndPtr
)) {
1749 es
->BufLimit
= MIN((UINT
)wParam
, BUFLIMIT_MULTI
);
1751 es
->BufLimit
= BUFLIMIT_MULTI
;
1754 es
->BufLimit
= MIN((UINT
)wParam
, BUFLIMIT_SINGLE
);
1756 es
->BufLimit
= BUFLIMIT_SINGLE
;
1762 /*********************************************************************
1767 static LRESULT
EDIT_EM_LineFromChar(WND
*wndPtr
, WPARAM32 wParam
, LPARAM lParam
)
1771 if (!IsMultiLine(wndPtr
))
1773 if ((INT
)wParam
== -1)
1774 wParam
= HIWORD(EDIT_EM_GetSel(wndPtr
, 0, 0L));
1775 l
= (UINT
)EDIT_EM_GetLineCount(wndPtr
, 0, 0L) - 1;
1776 while ((UINT
)EDIT_EM_LineIndex(wndPtr
, l
, 0L) > (UINT
)wParam
)
1782 /*********************************************************************
1787 static LRESULT
EDIT_EM_LineIndex(WND
*wndPtr
, WPARAM32 wParam
, LPARAM lParam
)
1789 EDITSTATE
*es
= EDITSTATEPTR(wndPtr
);
1792 UINT lc
= (UINT
)EDIT_EM_GetLineCount(wndPtr
, 0, 0L);
1794 if ((INT
)wParam
== -1) {
1795 e
= HIWORD(EDIT_EM_GetSel(wndPtr
, 0, 0L));
1797 while (es
->LineDefs
[l
].offset
> e
)
1799 return (LRESULT
)es
->LineDefs
[l
].offset
;
1801 if ((UINT
)wParam
>= lc
)
1803 return (LRESULT
)es
->LineDefs
[(UINT
)wParam
].offset
;
1807 /*********************************************************************
1812 static LRESULT
EDIT_EM_LineLength(WND
*wndPtr
, WPARAM32 wParam
, LPARAM lParam
)
1814 EDITSTATE
*es
= EDITSTATEPTR(wndPtr
);
1820 if (!IsMultiLine(wndPtr
))
1821 return (LRESULT
)es
->LineDefs
[0].length
;
1822 if ((INT
)wParam
== -1) {
1823 s
= LOWORD(EDIT_EM_GetSel(wndPtr
, 0, 0L));
1824 e
= HIWORD(EDIT_EM_GetSel(wndPtr
, 0, 0L));
1825 sl
= (UINT
)EDIT_EM_LineFromChar(wndPtr
, s
, 0L);
1826 el
= (UINT
)EDIT_EM_LineFromChar(wndPtr
, e
, 0L);
1827 return (LRESULT
)(s
- es
->LineDefs
[sl
].offset
+
1828 es
->LineDefs
[el
].offset
+
1829 es
->LineDefs
[el
].length
- e
);
1831 return (LRESULT
)es
->LineDefs
[(UINT
)EDIT_EM_LineFromChar(wndPtr
, wParam
, 0L)].length
;
1835 /*********************************************************************
1840 static LRESULT
EDIT_EM_LineScroll(WND
*wndPtr
, WPARAM32 wParam
, LPARAM lParam
)
1842 EDITSTATE
*es
= EDITSTATEPTR(wndPtr
);
1843 UINT lc
= (UINT
)EDIT_EM_GetLineCount(wndPtr
, 0, 0L);
1844 UINT fv
= (UINT
)EDIT_EM_GetFirstVisibleLine(wndPtr
, 0, 0L);
1845 UINT nfv
= MAX(0, fv
+ (INT
)LOWORD(lParam
));
1846 UINT xoff
= EDIT_GetXOffset(wndPtr
);
1847 UINT nxoff
= MAX(0, xoff
+ (INT
)HIWORD(lParam
));
1848 UINT tw
= EDIT_GetTextWidth(wndPtr
);
1859 dy
= EDIT_WndYFromLine(wndPtr
, fv
) - EDIT_WndYFromLine(wndPtr
, nfv
);
1861 if (wndPtr
->hwndSelf
== GetFocus32())
1862 HideCaret(wndPtr
->hwndSelf
);
1863 if (EDIT_GetRedraw(wndPtr
))
1864 ScrollWindow(wndPtr
->hwndSelf
, dx
, dy
, NULL
, NULL
);
1865 es
->FirstVisibleLine
= nfv
;
1866 es
->XOffset
= nxoff
;
1867 if (IsVScrollBar(wndPtr
))
1868 SetScrollPos32(wndPtr
->hwndSelf
, SB_VERT
,
1869 EDIT_WM_VScroll(wndPtr
, EM_GETTHUMB
, 0L), TRUE
);
1870 if (IsHScrollBar(wndPtr
))
1871 SetScrollPos32(wndPtr
->hwndSelf
, SB_HORZ
,
1872 EDIT_WM_HScroll(wndPtr
, EM_GETTHUMB
, 0L), TRUE
);
1873 if (wndPtr
->hwndSelf
== GetFocus32()) {
1874 GetCaretPos16(&pos
);
1875 SetCaretPos(pos
.x
+ dx
, pos
.y
+ dy
);
1876 ShowCaret(wndPtr
->hwndSelf
);
1883 /*********************************************************************
1888 static LRESULT
EDIT_EM_ReplaceSel(WND
*wndPtr
, WPARAM32 wParam
, LPARAM lParam
)
1890 return (LRESULT
)EDIT_ReplaceSel(wndPtr
, wParam
,
1891 (LPARAM
)(char *)PTR_SEG_TO_LIN(lParam
));
1895 /*********************************************************************
1899 * FIXME: undocumented message.
1902 static LRESULT
EDIT_EM_Scroll(WND
*wndPtr
, WPARAM32 wParam
, LPARAM lParam
)
1904 fprintf(stdnimp
, "edit: EM_SCROLL: message not implemented (undocumented), please report.\n");
1909 /*********************************************************************
1914 static LRESULT
EDIT_EM_SetHandle(WND
*wndPtr
, WPARAM32 wParam
, LPARAM lParam
)
1916 EDITSTATE
*es
= EDITSTATEPTR(wndPtr
);
1918 if (IsMultiLine(wndPtr
)) {
1919 EDIT_ReleasePointer(wndPtr
);
1921 * old buffer is freed by caller
1923 es
->hBuf
= (HLOCAL16
)wParam
;
1924 es
->BufSize
= LOCAL_Size(wndPtr
->hInstance
, es
->hBuf
) - 1;
1926 es
->FirstVisibleLine
= 0;
1927 es
->SelStart
= es
->SelEnd
= 0;
1928 EDIT_EM_EmptyUndoBuffer(wndPtr
, 0, 0L);
1929 EDIT_EM_SetModify(wndPtr
, FALSE
, 0L);
1930 EDIT_BuildLineDefs(wndPtr
);
1931 if (EDIT_GetRedraw(wndPtr
))
1932 InvalidateRect32( wndPtr
->hwndSelf
, NULL
, TRUE
);
1933 EDIT_ScrollIntoView(wndPtr
);
1939 /*********************************************************************
1944 static LRESULT
EDIT_EM_SetModify(WND
*wndPtr
, WPARAM32 wParam
, LPARAM lParam
)
1946 EDITSTATE
*es
= EDITSTATEPTR(wndPtr
);
1948 es
->TextChanged
= (BOOL
)wParam
;
1953 /*********************************************************************
1955 * EM_SETPASSWORDCHAR
1958 static LRESULT
EDIT_EM_SetPasswordChar(WND
*wndPtr
, WPARAM32 wParam
, LPARAM lParam
)
1960 EDITSTATE
*es
= EDITSTATEPTR(wndPtr
);
1962 es
->PasswordChar
= (char)wParam
;
1967 /*********************************************************************
1972 static LRESULT
EDIT_EM_SetReadOnly(WND
*wndPtr
, WPARAM32 wParam
, LPARAM lParam
)
1975 wndPtr
->dwStyle
|= ES_READONLY
;
1977 wndPtr
->dwStyle
&= ~(DWORD
)ES_READONLY
;
1982 /*********************************************************************
1987 static LRESULT
EDIT_EM_SetRect(WND
*wndPtr
, WPARAM32 wParam
, LPARAM lParam
)
1989 fprintf(stdnimp
,"edit: EM_SETRECT: message not implemented, please report.\n");
1994 /*********************************************************************
1999 static LRESULT
EDIT_EM_SetRectNP(WND
*wndPtr
, WPARAM32 wParam
, LPARAM lParam
)
2001 fprintf(stdnimp
,"edit: EM_SETRECTNP: message not implemented, please report.\n");
2006 /*********************************************************************
2011 static LRESULT
EDIT_EM_SetSel(WND
*wndPtr
, WPARAM32 wParam
, LPARAM lParam
)
2013 EDITSTATE
*es
= EDITSTATEPTR(wndPtr
);
2014 UINT ns
= LOWORD(lParam
);
2015 UINT ne
= HIWORD(lParam
);
2016 UINT s
= LOWORD(EDIT_EM_GetSel(wndPtr
, 0, 0L));
2017 UINT e
= HIWORD(EDIT_EM_GetSel(wndPtr
, 0, 0L));
2020 UINT tl
= (UINT
)EDIT_WM_GetTextLength(wndPtr
, 0, 0L);
2022 if ((INT
)ns
== -1) {
2032 if (wndPtr
->hwndSelf
== GetFocus32()) {
2033 el
= (UINT
)EDIT_EM_LineFromChar(wndPtr
, ne
, 0L);
2034 eli
= (UINT
)EDIT_EM_LineIndex(wndPtr
, el
, 0L);
2035 SetCaretPos(EDIT_WndXFromCol(wndPtr
, el
, ne
- eli
),
2036 EDIT_WndYFromLine(wndPtr
, el
));
2039 EDIT_ScrollIntoView(wndPtr
);
2040 if (EDIT_GetRedraw(wndPtr
)) {
2048 EDIT_InvalidateText(wndPtr
, s
, e
);
2049 EDIT_InvalidateText(wndPtr
, ns
, ne
);
2051 EDIT_InvalidateText(wndPtr
, s
, ne
);
2057 /*********************************************************************
2062 static LRESULT
EDIT_EM_SetTabStops(WND
*wndPtr
, WPARAM32 wParam
, LPARAM lParam
)
2064 EDITSTATE
*es
= EDITSTATEPTR(wndPtr
);
2066 if (!IsMultiLine(wndPtr
))
2070 es
->NumTabStops
= (UINT
)wParam
;
2072 es
->TabStops
= NULL
;
2074 es
->TabStops
= (LPINT16
)xmalloc(wParam
* sizeof(INT16
));
2075 memcpy(es
->TabStops
, (LPINT16
)PTR_SEG_TO_LIN(lParam
),
2076 (UINT
)wParam
* sizeof(INT16
));
2082 /*********************************************************************
2084 * EM_SETWORDBREAKPROC
2087 static LRESULT
EDIT_EM_SetWordBreakProc(WND
*wndPtr
, WPARAM32 wParam
, LPARAM lParam
)
2089 EDITSTATE
*es
= EDITSTATEPTR(wndPtr
);
2091 es
->WordBreakProc
= (EDITWORDBREAKPROC
)lParam
;
2096 /*********************************************************************
2101 static LRESULT
EDIT_EM_Undo(WND
*wndPtr
, WPARAM32 wParam
, LPARAM lParam
)
2107 /*********************************************************************
2112 static LRESULT
EDIT_WM_Char(WND
*wndPtr
, WPARAM32 wParam
, LPARAM lParam
)
2115 unsigned char c
= (unsigned char)wParam
;
2120 if (IsMultiLine(wndPtr
)) {
2121 if (IsReadOnly(wndPtr
)) {
2122 EDIT_MoveHome(wndPtr
, FALSE
);
2123 EDIT_MoveDownward(wndPtr
, FALSE
);
2125 EDIT_ReplaceSel(wndPtr
, 0, (LPARAM
)"\r\n");
2129 if (IsMultiLine(wndPtr
) && !IsReadOnly(wndPtr
))
2130 EDIT_ReplaceSel(wndPtr
, 0, (LPARAM
)"\t");
2133 if (!IsReadOnly(wndPtr
) && (c
>= ' ') && (c
!= 127)) {
2136 EDIT_ReplaceSel(wndPtr
, 0, (LPARAM
)str
);
2144 /*********************************************************************
2149 static LRESULT
EDIT_WM_Clear(WND
*wndPtr
, WPARAM32 wParam
, LPARAM lParam
)
2151 UINT s
= LOWORD(EDIT_EM_GetSel(wndPtr
, 0, 0L));
2152 UINT e
= HIWORD(EDIT_EM_GetSel(wndPtr
, 0, 0L));
2157 redraw
= EDIT_GetRedraw(wndPtr
);
2158 EDIT_WM_SetRedraw(wndPtr
, FALSE
, 0L);
2160 text
= EDIT_GetPointer(wndPtr
);
2161 strcpy(text
+ s
, text
+ e
);
2162 EDIT_BuildLineDefs(wndPtr
);
2163 EDIT_EM_SetSel(wndPtr
, 0, MAKELPARAM(s
, s
));
2164 EDIT_EM_SetModify(wndPtr
, TRUE
, 0L);
2165 EDIT_NOTIFY_PARENT(wndPtr
, EN_UPDATE
);
2166 EDIT_WM_SetRedraw(wndPtr
, redraw
, 0L);
2168 InvalidateRect32( wndPtr
->hwndSelf
, NULL
, TRUE
);
2169 EDIT_NOTIFY_PARENT(wndPtr
, EN_CHANGE
);
2176 /*********************************************************************
2181 static LRESULT
EDIT_WM_Copy(WND
*wndPtr
, WPARAM32 wParam
, LPARAM lParam
)
2183 UINT s
= LOWORD(EDIT_EM_GetSel(wndPtr
, 0, 0L));
2184 UINT e
= HIWORD(EDIT_EM_GetSel(wndPtr
, 0, 0L));
2194 hdst
= GlobalAlloc16(GMEM_MOVEABLE
, (DWORD
)(e
- s
+ 1));
2195 dst
= GlobalLock16(hdst
);
2196 text
= EDIT_GetPointer(wndPtr
);
2198 for (i
= 0 ; i
< e
- s
; i
++)
2201 GlobalUnlock16(hdst
);
2202 OpenClipboard(wndPtr
->hwndSelf
);
2204 SetClipboardData(CF_TEXT
, hdst
);
2210 /*********************************************************************
2215 static LRESULT
EDIT_WM_Create(WND
*wndPtr
, WPARAM32 wParam
, LPARAM lParam
)
2217 CREATESTRUCT16
*cs
= (CREATESTRUCT16
*)PTR_SEG_TO_LIN(lParam
);
2221 es
= xmalloc(sizeof(EDITSTATE
));
2222 memset(es
, 0, sizeof(EDITSTATE
));
2223 *(EDITSTATE
**)wndPtr
->wExtra
= es
;
2225 if (cs
->style
& WS_VSCROLL
)
2226 cs
->style
|= ES_AUTOVSCROLL
;
2227 if (cs
->style
& WS_HSCROLL
)
2228 cs
->style
|= ES_AUTOHSCROLL
;
2230 /* remove the WS_CAPTION style if it has been set - this is really a */
2231 /* pseudo option made from a combination of WS_BORDER and WS_DLGFRAME */
2232 if ((cs
->style
& WS_BORDER
) && (cs
->style
& WS_DLGFRAME
))
2233 cs
->style
^= WS_DLGFRAME
;
2235 if (IsMultiLine(wndPtr
)) {
2236 es
->BufSize
= BUFSTART_MULTI
;
2237 es
->BufLimit
= BUFLIMIT_MULTI
;
2238 es
->PasswordChar
= '\0';
2240 es
->BufSize
= BUFSTART_SINGLE
;
2241 es
->BufLimit
= BUFLIMIT_SINGLE
;
2242 es
->PasswordChar
= (cs
->style
& ES_PASSWORD
) ? '*' : '\0';
2244 if (!LOCAL_HeapSize(wndPtr
->hInstance
)) {
2245 if (!LocalInit(wndPtr
->hInstance
, 0,
2246 GlobalSize16(wndPtr
->hInstance
))) {
2247 fprintf(stderr
, "edit: WM_CREATE: could not initialize local heap\n");
2250 dprintf_edit(stddeb
, "edit: WM_CREATE: local heap initialized\n");
2252 if (!(es
->hBuf
= LOCAL_Alloc(wndPtr
->hInstance
, LMEM_MOVEABLE
, es
->BufSize
+ 1))) {
2253 fprintf(stderr
, "edit: WM_CREATE: unable to allocate buffer\n");
2256 es
->BufSize
= LOCAL_Size(wndPtr
->hInstance
, es
->hBuf
) - 1;
2257 text
= EDIT_GetPointer(wndPtr
);
2259 EDIT_BuildLineDefs(wndPtr
);
2260 EDIT_WM_SetFont(wndPtr
, 0, 0L);
2261 if (cs
->lpszName
&& *(char *)PTR_SEG_TO_LIN(cs
->lpszName
) != '\0')
2262 EDIT_EM_ReplaceSel(wndPtr
, FALSE
, (LPARAM
)cs
->lpszName
);
2263 EDIT_WM_SetRedraw(wndPtr
, TRUE
, 0L);
2268 /*********************************************************************
2273 static LRESULT
EDIT_WM_Cut(WND
*wndPtr
, WPARAM32 wParam
, LPARAM lParam
)
2275 EDIT_WM_Copy(wndPtr
, 0, 0L);
2276 EDIT_WM_Clear(wndPtr
, 0, 0L);
2281 /*********************************************************************
2286 static LRESULT
EDIT_WM_Destroy(WND
*wndPtr
, WPARAM32 wParam
, LPARAM lParam
)
2288 EDITSTATE
*es
= EDITSTATEPTR(wndPtr
);
2293 EDIT_ReleasePointer(wndPtr
);
2294 LOCAL_Free(wndPtr
->hInstance
, es
->hBuf
);
2296 *(EDITSTATE
**)&wndPtr
->wExtra
= NULL
;
2301 /*********************************************************************
2306 static LRESULT
EDIT_WM_Enable(WND
*wndPtr
, WPARAM32 wParam
, LPARAM lParam
)
2308 EDIT_InvalidateText(wndPtr
, 0, -1);
2313 /*********************************************************************
2318 static LRESULT
EDIT_WM_EraseBkGnd(WND
*wndPtr
, WPARAM32 wParam
, LPARAM lParam
)
2323 hBrush
= (HBRUSH16
)EDIT_SEND_CTLCOLOR(wndPtr
, wParam
);
2325 hBrush
= (HBRUSH16
)GetStockObject(WHITE_BRUSH
);
2327 GetClientRect16(wndPtr
->hwndSelf
, &rc
);
2328 IntersectClipRect((HDC16
)wParam
, rc
.left
, rc
.top
, rc
.right
, rc
.bottom
);
2329 GetClipBox16((HDC16
)wParam
, &rc
);
2331 * FIXME: specs say that we should UnrealizeObject() the brush,
2332 * but the specs of UnrealizeObject() say that we shouldn't
2333 * unrealize a stock object. The default brush that
2334 * DefWndProc() returns is ... a stock object.
2336 FillRect16((HDC16
)wParam
, &rc
, hBrush
);
2341 /*********************************************************************
2346 static LRESULT
EDIT_WM_GetDlgCode(WND
*wndPtr
, WPARAM32 wParam
, LPARAM lParam
)
2348 return DLGC_HASSETSEL
| DLGC_WANTCHARS
| DLGC_WANTARROWS
;
2352 /*********************************************************************
2357 static LRESULT
EDIT_WM_GetFont(WND
*wndPtr
, WPARAM32 wParam
, LPARAM lParam
)
2359 EDITSTATE
*es
= EDITSTATEPTR(wndPtr
);
2361 return (LRESULT
)es
->hFont
;
2365 /*********************************************************************
2370 static LRESULT
EDIT_WM_GetText(WND
*wndPtr
, WPARAM32 wParam
, LPARAM lParam
)
2372 char *text
= EDIT_GetPointer(wndPtr
);
2374 LRESULT lResult
= 0L;
2377 if ((UINT
)wParam
> len
) {
2378 strcpy((char *)PTR_SEG_TO_LIN(lParam
), text
);
2379 lResult
= (LRESULT
)len
;
2385 /*********************************************************************
2390 static LRESULT
EDIT_WM_GetTextLength(WND
*wndPtr
, WPARAM32 wParam
, LPARAM lParam
)
2392 char *text
= EDIT_GetPointer(wndPtr
);
2394 return (LRESULT
)strlen(text
);
2398 /*********************************************************************
2402 * FIXME: scrollbar code itself is broken, so this one is a hack.
2405 static LRESULT
EDIT_WM_HScroll(WND
*wndPtr
, WPARAM32 wParam
, LPARAM lParam
)
2407 UINT ww
= EDIT_GetWndWidth(wndPtr
);
2408 UINT tw
= EDIT_GetTextWidth(wndPtr
);
2409 UINT cw
= EDIT_GetAveCharWidth(wndPtr
);
2410 UINT xoff
= EDIT_GetXOffset(wndPtr
);
2423 dx
= -ww
/ HSCROLL_FRACTION
/ cw
* cw
;
2426 dx
= ww
/ HSCROLL_FRACTION
/ cw
* cw
;
2438 case SB_THUMBPOSITION
:
2439 dx
= LOWORD(lParam
) * tw
/ 100 - xoff
;
2441 /* The next two are undocumented ! */
2443 ret
= tw
? MAKELONG(xoff
* 100 / tw
, 0) : 0;
2446 dx
= LOWORD(lParam
);
2453 EDIT_EM_LineScroll(wndPtr
, 0, MAKELPARAM(0, dx
));
2455 EDIT_NOTIFY_PARENT(wndPtr
, EN_HSCROLL
);
2461 /*********************************************************************
2465 * Handling of special keys that don't produce a WM_CHAR
2466 * (i.e. non-printable keys) & Backspace & Delete
2469 static LRESULT
EDIT_WM_KeyDown(WND
*wndPtr
, WPARAM32 wParam
, LPARAM lParam
)
2471 UINT s
= LOWORD(EDIT_EM_GetSel(wndPtr
, 0, 0L));
2472 UINT e
= HIWORD(EDIT_EM_GetSel(wndPtr
, 0, 0L));
2476 if (GetKeyState(VK_MENU
) & 0x8000)
2479 shift
= GetKeyState(VK_SHIFT
) & 0x8000;
2480 control
= GetKeyState(VK_CONTROL
) & 0x8000;
2485 if (IsMultiLine(wndPtr
) && (wParam
== VK_UP
))
2486 EDIT_MoveUpward(wndPtr
, shift
);
2489 EDIT_MoveWordBackward(wndPtr
, shift
);
2491 EDIT_MoveBackward(wndPtr
, shift
);
2495 if (IsMultiLine(wndPtr
) && (wParam
== VK_DOWN
))
2496 EDIT_MoveDownward(wndPtr
, shift
);
2498 EDIT_MoveWordForward(wndPtr
, shift
);
2500 EDIT_MoveForward(wndPtr
, shift
);
2503 EDIT_MoveHome(wndPtr
, shift
);
2506 EDIT_MoveEnd(wndPtr
, shift
);
2509 if (IsMultiLine(wndPtr
))
2510 EDIT_MovePageUp(wndPtr
, shift
);
2513 if (IsMultiLine(wndPtr
))
2514 EDIT_MovePageDown(wndPtr
, shift
);
2517 if (!IsReadOnly(wndPtr
) && !control
)
2519 EDIT_WM_Clear(wndPtr
, 0, 0L);
2521 EDIT_DelLeft(wndPtr
);
2524 if (!IsReadOnly(wndPtr
) && !(shift
&& control
))
2527 EDIT_WM_Cut(wndPtr
, 0, 0L);
2529 EDIT_WM_Clear(wndPtr
, 0, 0L);
2532 EDIT_DelLeft(wndPtr
);
2534 EDIT_DelEnd(wndPtr
);
2536 EDIT_DelRight(wndPtr
);
2541 if (!IsReadOnly(wndPtr
))
2542 EDIT_WM_Paste(wndPtr
, 0, 0L);
2544 EDIT_WM_Copy(wndPtr
, 0, 0L);
2551 /*********************************************************************
2556 static LRESULT
EDIT_WM_KillFocus(WND
*wndPtr
, WPARAM32 wParam
, LPARAM lParam
)
2562 if(!(wndPtr
->dwStyle
& ES_NOHIDESEL
)) {
2563 s
= LOWORD(EDIT_EM_GetSel(wndPtr
, 0, 0L));
2564 e
= HIWORD(EDIT_EM_GetSel(wndPtr
, 0, 0L));
2565 EDIT_InvalidateText(wndPtr
, s
, e
);
2567 EDIT_NOTIFY_PARENT(wndPtr
, EN_KILLFOCUS
);
2572 /*********************************************************************
2576 * The caret position has been set on the WM_LBUTTONDOWN message
2579 static LRESULT
EDIT_WM_LButtonDblClk(WND
*wndPtr
, WPARAM32 wParam
, LPARAM lParam
)
2582 UINT e
= HIWORD(EDIT_EM_GetSel(wndPtr
, 0, 0L));
2583 UINT l
= (UINT
)EDIT_EM_LineFromChar(wndPtr
, e
, 0L);
2584 UINT li
= (UINT
)EDIT_EM_LineIndex(wndPtr
, l
, 0L);
2585 UINT ll
= (UINT
)EDIT_EM_LineLength(wndPtr
, e
, 0L);
2586 char *text
= EDIT_GetPointer(wndPtr
);
2588 s
= li
+ EDIT_CallWordBreakProc (wndPtr
, text
+ li
, e
- li
, ll
, WB_LEFT
);
2589 e
= li
+ EDIT_CallWordBreakProc(wndPtr
, text
+ li
, e
- li
, ll
, WB_RIGHT
);
2590 EDIT_EM_SetSel(wndPtr
, 0, MAKELPARAM(s
, e
));
2595 /*********************************************************************
2600 static LRESULT
EDIT_WM_LButtonDown(WND
*wndPtr
, WPARAM32 wParam
, LPARAM lParam
)
2602 INT x
= (INT
)LOWORD(lParam
);
2603 INT y
= (INT
)HIWORD(lParam
);
2604 UINT l
= EDIT_LineFromWndY(wndPtr
, y
);
2608 UINT fv
= (UINT
)EDIT_EM_GetFirstVisibleLine(wndPtr
, 0, 0L);
2609 UINT vlc
= EDIT_GetVisibleLineCount(wndPtr
);
2612 SetFocus32(wndPtr
->hwndSelf
);
2613 SetCapture32(wndPtr
->hwndSelf
);
2614 l
= MIN(fv
+ vlc
- 1, MAX(fv
, l
));
2615 x
= MIN(EDIT_GetWndWidth(wndPtr
), MAX(0, x
));
2616 c
= EDIT_ColFromWndX(wndPtr
, l
, x
);
2617 li
= (UINT
)EDIT_EM_LineIndex(wndPtr
, l
, 0L);
2619 if (GetKeyState(VK_SHIFT
) & 0x8000)
2620 s
= LOWORD(EDIT_EM_GetSel(wndPtr
, 0, 0L));
2623 EDIT_EM_SetSel(wndPtr
, 0, MAKELPARAM(s
, e
));
2628 /*********************************************************************
2633 static LRESULT
EDIT_WM_LButtonUp(WND
*wndPtr
, WPARAM32 wParam
, LPARAM lParam
)
2635 if (GetCapture32() == wndPtr
->hwndSelf
)
2641 /*********************************************************************
2646 static LRESULT
EDIT_WM_MouseMove(WND
*wndPtr
, WPARAM32 wParam
, LPARAM lParam
)
2657 if (GetCapture32() == wndPtr
->hwndSelf
) {
2658 x
= (INT
)LOWORD(lParam
);
2659 y
= (INT
)HIWORD(lParam
);
2660 fv
= (UINT
)EDIT_EM_GetFirstVisibleLine(wndPtr
, 0, 0L);
2661 vlc
= EDIT_GetVisibleLineCount(wndPtr
);
2662 l
= EDIT_LineFromWndY(wndPtr
, y
);
2663 l
= MIN(fv
+ vlc
- 1, MAX(fv
, l
));
2664 x
= MIN(EDIT_GetWndWidth(wndPtr
), MAX(0, x
));
2665 c
= EDIT_ColFromWndX(wndPtr
, l
, x
);
2666 s
= LOWORD(EDIT_EM_GetSel(wndPtr
, 0, 0L));
2667 li
= (UINT
)EDIT_EM_LineIndex(wndPtr
, l
, 0L);
2668 EDIT_EM_SetSel(wndPtr
, 1, MAKELPARAM(s
, li
+ c
));
2674 /*********************************************************************
2679 static LRESULT
EDIT_WM_Paint(WND
*wndPtr
, WPARAM32 wParam
, LPARAM lParam
)
2683 UINT fv
= (UINT
)EDIT_EM_GetFirstVisibleLine(wndPtr
, 0, 0L);
2684 UINT vlc
= EDIT_GetVisibleLineCount(wndPtr
);
2685 UINT lc
= (UINT
)EDIT_EM_GetLineCount(wndPtr
, 0, 0L);
2688 HFONT16 oldFont
= 0;
2692 BOOL rev
= IsWindowEnabled(wndPtr
->hwndSelf
) &&
2693 ((GetFocus32() == wndPtr
->hwndSelf
) ||
2694 (wndPtr
->dwStyle
& ES_NOHIDESEL
));
2696 hdc
= BeginPaint16(wndPtr
->hwndSelf
, &ps
);
2697 GetClientRect16(wndPtr
->hwndSelf
, &rc
);
2698 IntersectClipRect(hdc
, rc
.left
, rc
.top
, rc
.right
, rc
.bottom
);
2699 hFont
= EDIT_WM_GetFont(wndPtr
, 0, 0L);
2701 oldFont
= SelectObject(hdc
, hFont
);
2702 EDIT_SEND_CTLCOLOR(wndPtr
, hdc
);
2703 if (!IsWindowEnabled(wndPtr
->hwndSelf
))
2704 SetTextColor(hdc
, GetSysColor(COLOR_GRAYTEXT
));
2705 GetClipBox16(hdc
, &rcRgn
);
2706 for (i
= fv
; i
<= MIN(fv
+ vlc
, fv
+ lc
- 1) ; i
++ ) {
2707 EDIT_GetLineRect(wndPtr
, i
, 0, -1, &rcLine
);
2708 if (IntersectRect16(&rc
, &rcRgn
, &rcLine
))
2709 EDIT_PaintLine(wndPtr
, hdc
, i
, rev
);
2712 SelectObject(hdc
, oldFont
);
2713 EndPaint16(wndPtr
->hwndSelf
, &ps
);
2718 /*********************************************************************
2723 static LRESULT
EDIT_WM_Paste(WND
*wndPtr
, WPARAM32 wParam
, LPARAM lParam
)
2728 OpenClipboard(wndPtr
->hwndSelf
);
2729 if ((hsrc
= GetClipboardData(CF_TEXT
))) {
2730 src
= (char *)GlobalLock16(hsrc
);
2731 EDIT_ReplaceSel(wndPtr
, 0, (LPARAM
)src
);
2732 GlobalUnlock16(hsrc
);
2739 /*********************************************************************
2744 static LRESULT
EDIT_WM_SetCursor(WND
*wndPtr
, WPARAM32 wParam
, LPARAM lParam
)
2746 if (LOWORD(lParam
) == HTCLIENT
) {
2747 SetCursor(LoadCursor16(0, IDC_IBEAM
));
2754 /*********************************************************************
2759 static LRESULT
EDIT_WM_SetFocus(WND
*wndPtr
, WPARAM32 wParam
, LPARAM lParam
)
2761 UINT s
= LOWORD(EDIT_EM_GetSel(wndPtr
, 0, 0L));
2762 UINT e
= HIWORD(EDIT_EM_GetSel(wndPtr
, 0, 0L));
2764 CreateCaret(wndPtr
->hwndSelf
, 0, 2, EDIT_GetLineHeight(wndPtr
));
2765 EDIT_EM_SetSel(wndPtr
, 1, MAKELPARAM(s
, e
));
2766 if(!(wndPtr
->dwStyle
& ES_NOHIDESEL
))
2767 EDIT_InvalidateText(wndPtr
, s
, e
);
2768 ShowCaret(wndPtr
->hwndSelf
);
2769 EDIT_NOTIFY_PARENT(wndPtr
, EN_SETFOCUS
);
2774 /*********************************************************************
2779 static LRESULT
EDIT_WM_SetFont(WND
*wndPtr
, WPARAM32 wParam
, LPARAM lParam
)
2782 EDITSTATE
*es
= EDITSTATEPTR(wndPtr
);
2783 LPARAM sel
= EDIT_EM_GetSel(wndPtr
, 0, 0L);
2785 HFONT16 oldFont
= 0;
2787 es
->hFont
= (HFONT16
)wParam
;
2788 hdc
= GetDC32(wndPtr
->hwndSelf
);
2790 oldFont
= SelectObject(hdc
, es
->hFont
);
2791 GetTextMetrics16(hdc
, &tm
);
2792 es
->LineHeight
= HIWORD(GetTextExtent(hdc
, "X", 1));
2793 es
->AveCharWidth
= tm
.tmAveCharWidth
;
2795 SelectObject(hdc
, oldFont
);
2796 ReleaseDC32(wndPtr
->hwndSelf
, hdc
);
2797 EDIT_BuildLineDefs(wndPtr
);
2798 if ((BOOL
)lParam
&& EDIT_GetRedraw(wndPtr
))
2799 InvalidateRect32( wndPtr
->hwndSelf
, NULL
, TRUE
);
2800 if (wndPtr
->hwndSelf
== GetFocus32()) {
2802 CreateCaret(wndPtr
->hwndSelf
, 0, 2, EDIT_GetLineHeight(wndPtr
));
2803 EDIT_EM_SetSel(wndPtr
, 1, sel
);
2804 ShowCaret(wndPtr
->hwndSelf
);
2810 /*********************************************************************
2815 static LRESULT
EDIT_WM_SetRedraw(WND
*wndPtr
, WPARAM32 wParam
, LPARAM lParam
)
2817 EDITSTATE
*es
= EDITSTATEPTR(wndPtr
);
2819 es
->Redraw
= (BOOL
)wParam
;
2824 /*********************************************************************
2829 static LRESULT
EDIT_WM_SetText(WND
*wndPtr
, WPARAM32 wParam
, LPARAM lParam
)
2831 EDIT_EM_SetSel(wndPtr
, 1, MAKELPARAM(0, -1));
2832 EDIT_WM_Clear(wndPtr
, 0, 0L);
2834 EDIT_EM_ReplaceSel(wndPtr
, 0, lParam
);
2835 EDIT_EM_EmptyUndoBuffer(wndPtr
, 0, 0L);
2836 EDIT_EM_SetModify(wndPtr
, TRUE
, 0L);
2837 EDIT_ScrollIntoView(wndPtr
);
2842 /*********************************************************************
2847 static LRESULT
EDIT_WM_Size(WND
*wndPtr
, WPARAM32 wParam
, LPARAM lParam
)
2849 if (EDIT_GetRedraw(wndPtr
) &&
2850 ((wParam
== SIZE_MAXIMIZED
) ||
2851 (wParam
== SIZE_RESTORED
))) {
2852 if (IsMultiLine(wndPtr
) && IsWordWrap(wndPtr
))
2853 EDIT_BuildLineDefs(wndPtr
);
2854 InvalidateRect32( wndPtr
->hwndSelf
, NULL
, TRUE
);
2860 /*********************************************************************
2864 * FIXME: scrollbar code itself is broken, so this one is a hack.
2867 static LRESULT
EDIT_WM_VScroll(WND
*wndPtr
, WPARAM32 wParam
, LPARAM lParam
)
2869 UINT lc
= (UINT
)EDIT_EM_GetLineCount(wndPtr
, 0, 0L);
2870 UINT fv
= (UINT
)EDIT_EM_GetFirstVisibleLine(wndPtr
, 0, 0L);
2871 UINT vlc
= EDIT_GetVisibleLineCount(wndPtr
);
2899 case SB_THUMBPOSITION
:
2900 dy
= LOWORD(lParam
) * (lc
- 1) / 100 - fv
;
2902 /* The next two are undocumented ! */
2904 ret
= (lc
> 1) ? MAKELONG(fv
* 100 / (lc
- 1), 0) : 0L;
2907 dy
= LOWORD(lParam
);
2914 EDIT_EM_LineScroll(wndPtr
, 0, MAKELPARAM(dy
, 0));
2916 EDIT_NOTIFY_PARENT(wndPtr
, EN_VSCROLL
);