Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
W
wine-cw
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Registry
Registry
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
wine
wine-cw
Commits
f1184b46
Commit
f1184b46
authored
Aug 15, 2005
by
Phil Krylov
Committed by
Alexandre Julliard
Aug 15, 2005
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Added EM_SETRECT, EM_SETRECTNP, and WM_SETREDRAW message handling.
Added support for GT_SELECTION flag in EM_GETTEXTEX handler.
parent
61b2fba9
Hide whitespace changes
Inline
Side-by-side
Showing
5 changed files
with
150 additions
and
62 deletions
+150
-62
context.c
dlls/riched20/context.c
+1
-1
editor.c
dlls/riched20/editor.c
+119
-46
editstr.h
dlls/riched20/editstr.h
+2
-0
paint.c
dlls/riched20/paint.c
+26
-14
richedit.h
include/richedit.h
+2
-1
No files found.
dlls/riched20/context.c
View file @
f1184b46
...
...
@@ -28,7 +28,7 @@ void ME_InitContext(ME_Context *c, ME_TextEditor *editor, HDC hDC)
c
->
pt
.
x
=
0
;
c
->
pt
.
y
=
0
;
c
->
hbrMargin
=
CreateSolidBrush
(
RGB
(
224
,
224
,
224
));
GetClientRect
(
editor
->
hWnd
,
&
c
->
rcView
)
;
c
->
rcView
=
editor
->
rcFormat
;
}
void
ME_DestroyContext
(
ME_Context
*
c
)
...
...
dlls/riched20/editor.c
View file @
f1184b46
...
...
@@ -58,7 +58,7 @@
+ EM_GETPARAFORMAT
- EM_GETPASSWORDCHAR 2.0
- EM_GETPUNCTUATION 1.0asian
-
EM_GETRECT
+
EM_GETRECT
- EM_GETREDONAME 2.0
+ EM_GETSEL
+ EM_GETSELTEXT (ANSI&Unicode)
...
...
@@ -106,8 +106,8 @@
- EM_SETPASSWORDCHAR 2.0
- EM_SETPUNCTUATION 1.0asian
+ EM_SETREADONLY no beep on modification attempt
-
EM_SETRECT
- EM_SETRECTNP (EM_SETRECT without repainting) - not supported in RICHEDIT
+
EM_SETRECT
+ EM_SETRECTNP (EM_SETRECT without repainting)
+ EM_SETSEL
- EM_SETSCROLLPOS 3.0
- EM_SETTABSTOPS 3.0
...
...
@@ -613,8 +613,11 @@ static LRESULT ME_StreamIn(ME_TextEditor *editor, DWORD format, EDITSTREAM *stre
ME_CommitUndo
(
editor
);
ME_ReleaseStyle
(
style
);
editor
->
nEventMask
=
nEventMask
;
InvalidateRect
(
editor
->
hWnd
,
NULL
,
TRUE
);
ME_UpdateRepaint
(
editor
);
if
(
editor
->
bRedraw
)
{
InvalidateRect
(
editor
->
hWnd
,
NULL
,
TRUE
);
ME_UpdateRepaint
(
editor
);
}
if
(
!
(
format
&
SFF_SELECTION
))
{
ME_ClearTempStyle
(
editor
);
}
...
...
@@ -748,6 +751,8 @@ ME_TextEditor *ME_MakeEditor(HWND hWnd) {
ed
->
nLastSelStart
=
ed
->
nLastSelEnd
=
0
;
ed
->
nScrollPosY
=
0
;
ed
->
nZoomNumerator
=
ed
->
nZoomDenominator
=
0
;
ed
->
bRedraw
=
TRUE
;
GetClientRect
(
hWnd
,
&
ed
->
rcFormat
);
for
(
i
=
0
;
i
<
HFONT_CACHE_SIZE
;
i
++
)
{
ed
->
pFontCache
[
i
].
nRefs
=
0
;
...
...
@@ -1016,12 +1021,11 @@ get_msg_name(UINT msg)
* RichEditANSIWndProc (RICHED20.10)
*/
LRESULT
WINAPI
RichEditANSIWndProc
(
HWND
hWnd
,
UINT
msg
,
WPARAM
wParam
,
LPARAM
lParam
)
{
HDC
hDC
;
PAINTSTRUCT
ps
;
SCROLLINFO
si
;
ME_TextEditor
*
editor
=
(
ME_TextEditor
*
)
GetWindowLongW
(
hWnd
,
0
);
TRACE
(
"msg %d (%s) %08x %08lx
\n
"
,
msg
,
get_msg_name
(
msg
),
wParam
,
lParam
);
TRACE
(
"hWnd %p msg %d (%s) %08x %08lx
\n
"
,
hWnd
,
msg
,
get_msg_name
(
msg
),
wParam
,
lParam
);
switch
(
msg
)
{
...
...
@@ -1043,7 +1047,6 @@ LRESULT WINAPI RichEditANSIWndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lP
/* UNSUPPORTED_MSG(EM_GETOLEINTERFACE) separate stub */
UNSUPPORTED_MSG
(
EM_GETOPTIONS
)
UNSUPPORTED_MSG
(
EM_GETPASSWORDCHAR
)
UNSUPPORTED_MSG
(
EM_GETRECT
)
UNSUPPORTED_MSG
(
EM_GETREDONAME
)
UNSUPPORTED_MSG
(
EM_GETSCROLLPOS
)
UNSUPPORTED_MSG
(
EM_GETTEXTMODE
)
...
...
@@ -1067,8 +1070,6 @@ LRESULT WINAPI RichEditANSIWndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lP
UNSUPPORTED_MSG
(
EM_SETOPTIONS
)
UNSUPPORTED_MSG
(
EM_SETPALETTE
)
UNSUPPORTED_MSG
(
EM_SETPASSWORDCHAR
)
UNSUPPORTED_MSG
(
EM_SETRECT
)
UNSUPPORTED_MSG
(
EM_SETRECTNP
)
UNSUPPORTED_MSG
(
EM_SETSCROLLPOS
)
UNSUPPORTED_MSG
(
EM_SETTABSTOPS
)
UNSUPPORTED_MSG
(
EM_SETTARGETDEVICE
)
...
...
@@ -1190,9 +1191,12 @@ LRESULT WINAPI RichEditANSIWndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lP
if
(
wParam
)
editor
->
rgbBackColor
=
-
1
;
else
editor
->
rgbBackColor
=
lParam
;
InvalidateRect
(
hWnd
,
NULL
,
TRUE
);
UpdateWindow
(
hWnd
);
editor
->
rgbBackColor
=
lParam
;
if
(
editor
->
bRedraw
)
{
InvalidateRect
(
hWnd
,
NULL
,
TRUE
);
UpdateWindow
(
hWnd
);
}
return
lColor
;
}
case
EM_GETMODIFY
:
...
...
@@ -1277,10 +1281,13 @@ LRESULT WINAPI RichEditANSIWndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lP
if
(
nPos
<
0
)
nPos
=
0
;
if
(
nPos
!=
editor
->
nScrollPosY
)
{
ScrollWindow
(
hWnd
,
0
,
editor
->
nScrollPosY
-
nPos
,
NULL
,
NULL
);
if
(
editor
->
bRedraw
)
{
ScrollWindow
(
hWnd
,
0
,
editor
->
nScrollPosY
-
nPos
,
NULL
,
NULL
);
SetScrollPos
(
hWnd
,
SB_VERT
,
nPos
,
TRUE
);
UpdateWindow
(
hWnd
);
}
editor
->
nScrollPosY
=
nPos
;
SetScrollPos
(
hWnd
,
SB_VERT
,
nPos
,
TRUE
);
UpdateWindow
(
hWnd
);
}
return
TRUE
;
/* Should return false if a single line richedit control */
}
...
...
@@ -1429,20 +1436,35 @@ LRESULT WINAPI RichEditANSIWndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lP
case
EM_GETTEXTEX
:
{
GETTEXTEX
*
ex
=
(
GETTEXTEX
*
)
wParam
;
int
nStart
,
nCount
;
if
(
ex
->
flags
!=
0
)
FIXME
(
"Unhandled EM_GETTEXTEX flags 0x%lx
\n
"
,
ex
->
flags
);
if
(
ex
->
flags
&
~
(
GT_SELECTION
|
GT_USECRLF
)
)
FIXME
(
"GETTEXTEX flags 0x%08lx not supported
\n
"
,
ex
->
flags
&
~
(
GT_SELECTION
|
GT_USECRLF
)
);
if
(
IsWindowUnicode
(
hWnd
))
return
ME_GetTextW
(
editor
,
(
LPWSTR
)
lParam
,
0
,
ex
->
cb
,
FALSE
);
if
(
ex
->
flags
&
GT_SELECTION
)
{
ME_GetSelection
(
editor
,
&
nStart
,
&
nCount
);
nCount
-=
nStart
;
nCount
=
min
(
nCount
,
ex
->
cb
-
1
);
}
else
{
LPWSTR
buffer
=
HeapAlloc
(
GetProcessHeap
(),
0
,
ex
->
cb
*
sizeof
(
WCHAR
));
nStart
=
0
;
nCount
=
ex
->
cb
-
1
;
}
if
(
ex
->
codepage
==
1200
||
IsWindowUnicode
(
hWnd
))
{
nCount
=
min
(
nCount
,
ex
->
cb
/
sizeof
(
WCHAR
)
-
1
);
return
ME_GetTextW
(
editor
,
(
LPWSTR
)
lParam
,
nStart
,
nCount
,
ex
->
flags
&
GT_USECRLF
);
}
else
{
LPWSTR
buffer
=
HeapAlloc
(
GetProcessHeap
(),
0
,
(
nCount
+
1
)
*
sizeof
(
WCHAR
));
DWORD
buflen
=
ex
->
cb
;
LRESULT
rc
;
DWORD
flags
=
0
;
buflen
=
ME_GetTextW
(
editor
,
buffer
,
0
,
buflen
,
FALSE
);
buflen
=
ME_GetTextW
(
editor
,
buffer
,
nStart
,
nCount
,
ex
->
flags
&
GT_USECRLF
);
rc
=
WideCharToMultiByte
(
ex
->
codepage
,
flags
,
buffer
,
buflen
,
(
LPSTR
)
lParam
,
ex
->
cb
,
ex
->
lpDefaultChar
,
ex
->
lpUsedDefaultChar
);
HeapFree
(
GetProcessHeap
(),
0
,
buffer
);
...
...
@@ -1463,12 +1485,12 @@ LRESULT WINAPI RichEditANSIWndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lP
{
TEXTRANGEW
*
rng
=
(
TEXTRANGEW
*
)
lParam
;
if
(
IsWindowUnicode
(
hWnd
))
return
ME_GetTextW
(
editor
,
rng
->
lpstrText
,
rng
->
chrg
.
cpMin
,
rng
->
chrg
.
cpMax
-
rng
->
chrg
.
cpMin
,
FALSE
);
return
ME_GetTextW
(
editor
,
rng
->
lpstrText
,
rng
->
chrg
.
cpMin
,
rng
->
chrg
.
cpMax
-
rng
->
chrg
.
cpMin
,
editor
->
bEmulateVersion10
);
else
{
int
nLen
=
rng
->
chrg
.
cpMax
-
rng
->
chrg
.
cpMin
;
WCHAR
*
p
=
ALLOC_N_OBJ
(
WCHAR
,
nLen
+
1
);
int
nChars
=
ME_GetTextW
(
editor
,
p
,
rng
->
chrg
.
cpMin
,
nLen
,
FALSE
);
int
nChars
=
ME_GetTextW
(
editor
,
p
,
rng
->
chrg
.
cpMin
,
nLen
,
editor
->
bEmulateVersion10
);
/* FIXME this is a potential security hole (buffer overrun)
if you know more about wchar->mbyte conversion please explain
*/
...
...
@@ -1476,7 +1498,6 @@ LRESULT WINAPI RichEditANSIWndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lP
FREE_OBJ
(
p
);
return
nChars
;
}
return
ME_GetTextW
(
editor
,
rng
->
lpstrText
,
rng
->
chrg
.
cpMin
,
rng
->
chrg
.
cpMax
-
rng
->
chrg
.
cpMin
,
FALSE
);
}
case
EM_GETLINECOUNT
:
{
...
...
@@ -1611,9 +1632,15 @@ LRESULT WINAPI RichEditANSIWndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lP
ReleaseCapture
();
break
;
case
WM_PAINT
:
hDC
=
BeginPaint
(
hWnd
,
&
ps
);
ME_PaintContent
(
editor
,
hDC
,
FALSE
,
&
ps
.
rcPaint
);
EndPaint
(
hWnd
,
&
ps
);
if
(
editor
->
bRedraw
)
{
HDC
hDC
;
PAINTSTRUCT
ps
;
hDC
=
BeginPaint
(
hWnd
,
&
ps
);
ME_PaintContent
(
editor
,
hDC
,
FALSE
,
&
ps
.
rcPaint
);
EndPaint
(
hWnd
,
&
ps
);
}
break
;
case
WM_SETFOCUS
:
ME_ShowCaret
(
editor
);
...
...
@@ -1625,14 +1652,17 @@ LRESULT WINAPI RichEditANSIWndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lP
return
0
;
case
WM_ERASEBKGND
:
{
HDC
hDC
=
(
HDC
)
wParam
;
RECT
rc
;
COLORREF
rgbBG
=
ME_GetBackColor
(
editor
);
if
(
GetUpdateRect
(
hWnd
,
&
rc
,
TRUE
))
if
(
editor
->
bRedraw
)
{
HBRUSH
hbr
=
CreateSolidBrush
(
rgbBG
);
FillRect
(
hDC
,
&
rc
,
hbr
);
DeleteObject
(
hbr
);
HDC
hDC
=
(
HDC
)
wParam
;
RECT
rc
;
COLORREF
rgbBG
=
ME_GetBackColor
(
editor
);
if
(
GetUpdateRect
(
hWnd
,
&
rc
,
TRUE
))
{
HBRUSH
hbr
=
CreateSolidBrush
(
rgbBG
);
FillRect
(
hDC
,
&
rc
,
hbr
);
DeleteObject
(
hbr
);
}
}
return
1
;
}
...
...
@@ -1715,10 +1745,13 @@ LRESULT WINAPI RichEditANSIWndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lP
break
;
}
if
(
nPos
!=
editor
->
nScrollPosY
)
{
ScrollWindow
(
hWnd
,
0
,
editor
->
nScrollPosY
-
nPos
,
NULL
,
NULL
);
if
(
editor
->
bRedraw
)
{
ScrollWindow
(
hWnd
,
0
,
editor
->
nScrollPosY
-
nPos
,
NULL
,
NULL
);
SetScrollPos
(
hWnd
,
SB_VERT
,
nPos
,
TRUE
);
UpdateWindow
(
hWnd
);
}
editor
->
nScrollPosY
=
nPos
;
SetScrollPos
(
hWnd
,
SB_VERT
,
nPos
,
TRUE
);
UpdateWindow
(
hWnd
);
}
break
;
}
...
...
@@ -1735,15 +1768,54 @@ LRESULT WINAPI RichEditANSIWndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lP
if
(
nPos
<
0
)
nPos
=
0
;
if
(
nPos
!=
editor
->
nScrollPosY
)
{
ScrollWindow
(
hWnd
,
0
,
editor
->
nScrollPosY
-
nPos
,
NULL
,
NULL
);
if
(
editor
->
bRedraw
)
{
ScrollWindow
(
hWnd
,
0
,
editor
->
nScrollPosY
-
nPos
,
NULL
,
NULL
);
SetScrollPos
(
hWnd
,
SB_VERT
,
nPos
,
TRUE
);
UpdateWindow
(
hWnd
);
}
editor
->
nScrollPosY
=
nPos
;
SetScrollPos
(
hWnd
,
SB_VERT
,
nPos
,
TRUE
);
UpdateWindow
(
hWnd
);
}
break
;
}
case
EM_GETRECT
:
{
*
((
RECT
*
)
lParam
)
=
editor
->
rcFormat
;
return
0
;
}
case
EM_SETRECT
:
case
EM_SETRECTNP
:
{
if
(
lParam
)
{
RECT
*
rc
=
(
RECT
*
)
lParam
;
if
(
wParam
)
{
editor
->
rcFormat
.
left
+=
rc
->
left
;
editor
->
rcFormat
.
top
+=
rc
->
top
;
editor
->
rcFormat
.
right
+=
rc
->
right
;
editor
->
rcFormat
.
bottom
+=
rc
->
bottom
;
}
else
{
editor
->
rcFormat
=
*
rc
;
}
}
else
{
GetClientRect
(
hWnd
,
&
editor
->
rcFormat
);
}
if
(
msg
!=
EM_SETRECTNP
)
ME_RewrapRepaint
(
editor
);
return
0
;
}
case
WM_SETREDRAW
:
editor
->
bRedraw
=
wParam
;
return
0
;
case
WM_SIZE
:
{
GetClientRect
(
hWnd
,
&
editor
->
rcFormat
);
ME_RewrapRepaint
(
editor
);
return
DefWindowProcW
(
hWnd
,
msg
,
wParam
,
lParam
);
}
...
...
@@ -1837,11 +1909,12 @@ int ME_GetTextW(ME_TextEditor *editor, WCHAR *buffer, int nStart, int nChars, in
if
(
item
->
member
.
run
.
nFlags
&
MERF_ENDPARA
)
{
if
(
bCRLF
)
{
*
buffer
++
=
'\r'
;
*
buffer
++
=
'\r'
;
if
(
bCRLF
)
{
*
buffer
=
'\n'
;
nWritten
++
;
}
*
buffer
=
'\n'
;
}
assert
(
nLen
==
1
);
}
else
...
...
dlls/riched20/editstr.h
View file @
f1184b46
...
...
@@ -270,6 +270,8 @@ typedef struct tagME_TextEditor
BOOL
bScrollX
,
bScrollY
;
int
nScrollPosY
;
int
nZoomNumerator
,
nZoomDenominator
;
RECT
rcFormat
;
BOOL
bRedraw
;
}
ME_TextEditor
;
typedef
struct
tagME_Context
...
...
dlls/riched20/paint.c
View file @
f1184b46
...
...
@@ -154,12 +154,15 @@ void ME_Repaint(ME_TextEditor *editor)
if
(
ME_WrapMarkedParagraphs
(
editor
))
{
ME_UpdateScrollBar
(
editor
);
}
hDC
=
GetDC
(
editor
->
hWnd
);
ME_HideCaret
(
editor
);
ME_PaintContent
(
editor
,
hDC
,
TRUE
,
NULL
);
ReleaseDC
(
editor
->
hWnd
,
hDC
);
ME_ShowCaret
(
editor
);
ME_EnsureVisible
(
editor
,
pCursor
->
pRun
);
if
(
editor
->
bRedraw
)
{
hDC
=
GetDC
(
editor
->
hWnd
);
ME_HideCaret
(
editor
);
ME_PaintContent
(
editor
,
hDC
,
TRUE
,
NULL
);
ReleaseDC
(
editor
->
hWnd
,
hDC
);
ME_ShowCaret
(
editor
);
ME_EnsureVisible
(
editor
,
pCursor
->
pRun
);
}
}
void
ME_UpdateRepaint
(
ME_TextEditor
*
editor
)
...
...
@@ -415,10 +418,13 @@ void ME_Scroll(ME_TextEditor *editor, int cx, int cy)
GetScrollInfo
(
hWnd
,
SB_VERT
,
&
si
);
si
.
nPos
=
editor
->
nScrollPosY
-=
cy
;
SetScrollInfo
(
hWnd
,
SB_VERT
,
&
si
,
TRUE
);
if
(
abs
(
cy
)
>
editor
->
sizeWindow
.
cy
)
InvalidateRect
(
editor
->
hWnd
,
NULL
,
TRUE
);
else
ScrollWindowEx
(
hWnd
,
cx
,
cy
,
NULL
,
NULL
,
NULL
,
NULL
,
SW_ERASE
|
SW_INVALIDATE
);
if
(
editor
->
bRedraw
)
{
if
(
abs
(
cy
)
>
editor
->
sizeWindow
.
cy
)
InvalidateRect
(
editor
->
hWnd
,
NULL
,
TRUE
);
else
ScrollWindowEx
(
hWnd
,
cx
,
cy
,
NULL
,
NULL
,
NULL
,
NULL
,
SW_ERASE
|
SW_INVALIDATE
);
}
}
void
ME_UpdateScrollBar
(
ME_TextEditor
*
editor
)
...
...
@@ -495,14 +501,20 @@ void ME_EnsureVisible(ME_TextEditor *editor, ME_DisplayItem *pRun)
if
(
yrel
<
0
)
{
editor
->
nScrollPosY
=
y
;
SetScrollPos
(
hWnd
,
SB_VERT
,
y
,
TRUE
);
ScrollWindow
(
hWnd
,
0
,
-
yrel
,
NULL
,
NULL
);
UpdateWindow
(
hWnd
);
if
(
editor
->
bRedraw
)
{
ScrollWindow
(
hWnd
,
0
,
-
yrel
,
NULL
,
NULL
);
UpdateWindow
(
hWnd
);
}
}
else
if
(
yrel
+
yheight
>
editor
->
sizeWindow
.
cy
)
{
int
newy
=
y
+
yheight
-
editor
->
sizeWindow
.
cy
;
editor
->
nScrollPosY
=
newy
;
SetScrollPos
(
hWnd
,
SB_VERT
,
newy
,
TRUE
);
ScrollWindow
(
hWnd
,
0
,
-
(
newy
-
yold
),
NULL
,
NULL
);
UpdateWindow
(
hWnd
);
if
(
editor
->
bRedraw
)
{
ScrollWindow
(
hWnd
,
0
,
-
(
newy
-
yold
),
NULL
,
NULL
);
UpdateWindow
(
hWnd
);
}
}
}
...
...
include/richedit.h
View file @
f1184b46
...
...
@@ -654,9 +654,10 @@ typedef LONG (*EDITWORDBREAKPROCEX)(char*,LONG,BYTE,INT);
#define TM_SINGLECODEPAGE 0x00000010
#define TM_MULTICODEPAGE 0x00000020
/* GETTEXT structure flags */
/* GETTEXT
EX
structure flags */
#define GT_DEFAULT 0x00000000
#define GT_USECRLF 0x00000001
#define GT_SELECTION 0x00000002
/* Options of the EM_SETTYPOGRAPHYOPTIONS message */
#define TO_ADVANCEDTYPOGRAPHY 0x00000001
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment