| This file gives some information about the code in edit.c. If you want to |
| change, add, or fix code, please read this text. If you're not interested |
| in doing actual work on edit.c only C & D will be of interest to you. |
| |
| A) basic policy |
| B) special functions |
| C) not implemented |
| D) known bugs |
| |
| A) Basic Policy |
| |
| The code has been made in such a way, that functions try to call other |
| (documented) functions if that is sufficient. This might sometimes not be |
| the most efficient way, but it keeps the code clear. This way I tried to keep |
| the number of functions that rely on the internal EDITSTATE structure as |
| low as possible. For instance EDIT_WM_Cut() simply calls EDIT_WM_Copy() and |
| EDIT_WM_Clear(). The latter two are well documented message handlers, so |
| as long as they are right EDIT_WM_Cut() will never have to change again. |
| |
| Example: |
| The best thing to do, when you want to know the offset of line 3, is calling |
| EDIT_EM_LineIndex(). Again this is a well documented message handler. Don't |
| look at es->LineDefs[2].offset. It would just be another reference to the |
| internal structure, and that would make it more difficult to change things. |
| Refer to EDIT_WM_???? and EDIT_EM_????? functions as much as possible. |
| |
| The WND * pointer is used internally whenever possible. Although it is not |
| the real HWND, it improves performance enough to use it. |
| |
| All displaying is done by invalidating regions / rects. Only |
| EDIT_EM_LineScroll() uses direct painting. This way things become much |
| faster. Although sometimes the response time might appear to be slow, it |
| would be much slower even, when everything would be painted instantly. This |
| is especially true for scrollbar tracking and selection changes.. |
| |
| |
| |
| B) Special functions |
| |
| The edit control needs to use local heap memory because applications may |
| rely on EM_GETHANDLE. This is bad, but it can't be helped, we have to live |
| with that. For this reason there is a nice EDIT_GetPointer() function, |
| which locks the heap buffer *only once*, no matter how often it is called. |
| Only at the end of the message handler EDIT_ReleasePointer() is called. You |
| don't have to worry about unlocking the heap. Calling EDIT_GetPointer() is |
| very fast if the buffer is already locked. |
| This way, the buffer gets locked / unlock only once every message, although |
| EDIT_GetPointer() may actually have been called a hundred times. |
| Only when the actual HLOCAL is needed (for example to ReAlloc), a call to |
| EDIT_ReleasePointer() is needed. Look for instance in EDIT_MakeFit(). |
| |
| This brings us to EDIT_MakeFit(). It automatically re-allocates the buffer |
| if the size parameter > buffersize. If everything is successful TRUE is |
| returned, otherwise FALSE. Only when the buffer contents may grow you need |
| to call EDIT_MakeFit(). Currently this is only in EDIT_ReplaceSel() and |
| EDIT_WM_SetText(). |
| |
| EDIT_BuildLineDefs() is the most important function in edit.c. It builds |
| the internal EDITSTATE structure. As soon as text *might* have changed, or |
| when the appearance of the text on the screen *might* have changed, call |
| this function ! This includes changes of screen size, change of the font, |
| clipboard actions, etc. etc. Most other functions that rely on EDITSTATE, |
| rely on the stuff this function builds. |
| |
| |
| |
| C) Not Implemented |
| |
| - ES_PASSWORD |
| - ES_CENTER |
| - ES_RIGHT |
| - EM_SETRECT |
| - EM_SETRECTNP |
| - EM_FMTLINES |
| - ES_AUTOVSCROLL (every multi line *is* auto vscroll) |
| - ES_AUTOHSCROLL (multi line can be yes or no, but single line only yes) |
| - WM_UNDO (=EM_UNDO) |
| - EM_CANUNDO |
| - EM_SCROLL (scrolling works, but this appears to be an undocumented message) |
| - ES_LOWERCASE |
| - ES_UPPERCASE |
| - ES_OEMCONVERT |
| - ES_WANTRETURN |
| - probably much, MUCH more |
| |
| I encountered several undocumented messages, or message parameters. |
| EditWndProc() reports any unknown message with an id > WM_USER. |
| |
| |
| |
| D) Known bugs. |
| |
| - Scrolling is weird, sometimes. The current code makes the scrollbar |
| of Notepad work, but the scrollbar code itself is broken. Currently |
| the scroll code of edit.c is *not* according to specs. Instead, it |
| is according to the broken scrollbar code. If that gets fixed, this |
| should be fixed, too. |
| - The clipboard is broken. Whenever things go wrong with |
| cut/copy/paste, it is probably the clipboard that messes up things, |
| not edit.c. |
| - Turning on WordWrap with Notepad leaves part of the horizontal |
| scrollbar visible (problem with WM_ERASEBKGND ???). |
| |
| |
| I am still very actively changing things. Especially I am working |
| on Undo capabilities. If you want to do things, other than bug fixes, |
| please mail me so we can synchronize. |
| |
| Frans van Dorsselaer |
| dorssel@rulhm1.LeidenUniv.nl |