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
4a5d1000
Commit
4a5d1000
authored
Jun 18, 2008
by
Alex Villacís Lasso
Committed by
Alexandre Julliard
Jun 19, 2008
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
richedit: Add more tests for URL autodetection on WM_CHAR, make them pass under Wine.
parent
38d7ba6e
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
290 additions
and
16 deletions
+290
-16
editor.c
dlls/riched20/editor.c
+131
-16
editor.h
dlls/riched20/editor.h
+2
-0
editor.c
dlls/riched20/tests/editor.c
+157
-0
No files found.
dlls/riched20/editor.c
View file @
4a5d1000
...
...
@@ -1558,6 +1558,7 @@ ME_KeyDown(ME_TextEditor *editor, WORD nKey)
else
return
TRUE
;
ME_CommitUndo
(
editor
);
ME_UpdateSelectionLinkAttribute
(
editor
);
ME_UpdateRepaint
(
editor
);
ME_SendRequestResize
(
editor
,
FALSE
);
return
TRUE
;
...
...
@@ -2456,19 +2457,7 @@ static LRESULT RichEditWndProc_common(HWND hWnd, UINT msg, WPARAM wParam,
TRACE
(
"WM_SETTEXT - NULL
\n
"
);
if
(
editor
->
AutoURLDetect_bEnable
)
{
int
cMin
=
0
,
cMax
=
-
1
;
while
(
ME_FindNextURLCandidate
(
editor
,
cMin
,
cMax
,
&
cMin
,
&
cMax
))
{
if
(
ME_IsCandidateAnURL
(
editor
,
cMin
,
cMax
))
{
CHARFORMAT2W
link
;
link
.
cbSize
=
sizeof
(
link
);
link
.
dwMask
=
CFM_LINK
;
link
.
dwEffects
=
CFE_LINK
;
ME_SetCharFormat
(
editor
,
cMin
,
cMax
-
cMin
,
&
link
);
}
cMin
=
cMax
;
cMax
=
-
1
;
}
ME_UpdateLinkAttribute
(
editor
,
0
,
-
1
);
}
ME_SetSelection
(
editor
,
0
,
0
);
editor
->
nModifyStep
=
0
;
...
...
@@ -3052,9 +3041,7 @@ static LRESULT RichEditWndProc_common(HWND hWnd, UINT msg, WPARAM wParam,
CHAR
charA
=
wParam
;
MultiByteToWideChar
(
CP_ACP
,
0
,
&
charA
,
1
,
&
wstr
,
1
);
}
if
(
editor
->
AutoURLDetect_bEnable
)
ME_AutoURLDetect
(
editor
,
wstr
);
switch
(
wstr
)
{
case
1
:
/* Ctrl-A */
...
...
@@ -3103,6 +3090,9 @@ static LRESULT RichEditWndProc_common(HWND hWnd, UINT msg, WPARAM wParam,
ME_ReleaseStyle
(
style
);
ME_CommitUndo
(
editor
);
}
if
(
editor
->
AutoURLDetect_bEnable
)
ME_UpdateSelectionLinkAttribute
(
editor
);
ME_UpdateRepaint
(
editor
);
}
return
0
;
...
...
@@ -3887,3 +3877,128 @@ BOOL ME_IsCandidateAnURL(ME_TextEditor *editor, int sel_min, int sel_max)
if
(
bufferW
!=
NULL
)
heap_free
(
bufferW
);
return
FALSE
;
}
/**
* This proc walks through the indicated selection and evaluates whether each
* section identified by ME_FindNextURLCandidate and in-between sections have
* their proper CFE_LINK attributes set or unset. If the CFE_LINK attribute is
* not what it is supposed to be, this proc sets or unsets it as appropriate.
*
* Returns TRUE if at least one section was modified.
*/
BOOL
ME_UpdateLinkAttribute
(
ME_TextEditor
*
editor
,
int
sel_min
,
int
sel_max
)
{
BOOL
modified
=
FALSE
;
int
cMin
,
cMax
;
if
(
sel_max
==
-
1
)
sel_max
=
ME_GetTextLength
(
editor
);
do
{
int
beforeURL
[
2
];
int
inURL
[
2
];
CHARFORMAT2W
link
;
if
(
ME_FindNextURLCandidate
(
editor
,
sel_min
,
sel_max
,
&
cMin
,
&
cMax
))
{
/* Section before candidate is not an URL */
beforeURL
[
0
]
=
sel_min
;
beforeURL
[
1
]
=
cMin
;
if
(
ME_IsCandidateAnURL
(
editor
,
cMin
,
cMax
))
{
inURL
[
0
]
=
cMin
;
inURL
[
1
]
=
cMax
;
}
else
{
beforeURL
[
1
]
=
cMax
;
inURL
[
0
]
=
inURL
[
1
]
=
-
1
;
}
sel_min
=
cMax
;
}
else
{
/* No more candidates until end of selection */
beforeURL
[
0
]
=
sel_min
;
beforeURL
[
1
]
=
sel_max
;
inURL
[
0
]
=
inURL
[
1
]
=
-
1
;
sel_min
=
sel_max
;
}
if
(
beforeURL
[
0
]
<
beforeURL
[
1
])
{
/* CFE_LINK effect should be consistently unset */
link
.
cbSize
=
sizeof
(
link
);
ME_GetCharFormat
(
editor
,
beforeURL
[
0
],
beforeURL
[
1
],
&
link
);
/* FIXME: Workaround for what looks like a bug - ME_GetCharFormat does not
clear the CFM_LINK flag when selection spans text without CFE_LINK,
followed by CFE_LINK set. This needs a test for EM_GETCHARFORMAT */
#if 0
if (!(link.dwMask & CFM_LINK) || (link.dwEffects & CFE_LINK))
{
#endif
/* CFE_LINK must be unset from this range */
memset
(
&
link
,
0
,
sizeof
(
CHARFORMAT2W
));
link
.
cbSize
=
sizeof
(
link
);
link
.
dwMask
=
CFM_LINK
;
link
.
dwEffects
=
0
;
ME_SetCharFormat
(
editor
,
beforeURL
[
0
],
beforeURL
[
1
]
-
beforeURL
[
0
],
&
link
);
modified
=
TRUE
;
#if 0
}
#endif
}
if
(
inURL
[
0
]
<
inURL
[
1
])
{
/* CFE_LINK effect should be consistently set */
link
.
cbSize
=
sizeof
(
link
);
ME_GetCharFormat
(
editor
,
inURL
[
0
],
inURL
[
1
],
&
link
);
if
(
!
(
link
.
dwMask
&
CFM_LINK
)
||
!
(
link
.
dwEffects
&
CFE_LINK
))
{
/* CFE_LINK must be set on this range */
memset
(
&
link
,
0
,
sizeof
(
CHARFORMAT2W
));
link
.
cbSize
=
sizeof
(
link
);
link
.
dwMask
=
CFM_LINK
;
link
.
dwEffects
=
CFE_LINK
;
ME_SetCharFormat
(
editor
,
inURL
[
0
],
inURL
[
1
]
-
inURL
[
0
],
&
link
);
modified
=
TRUE
;
}
}
}
while
(
sel_min
<
sel_max
);
return
modified
;
}
void
ME_UpdateSelectionLinkAttribute
(
ME_TextEditor
*
editor
)
{
ME_DisplayItem
*
startPara
,
*
endPara
;
ME_DisplayItem
*
item
;
int
dummy
;
int
from
,
to
;
ME_GetSelection
(
editor
,
&
from
,
&
to
);
if
(
from
>
to
)
from
^=
to
,
to
^=
from
,
from
^=
to
;
startPara
=
NULL
;
endPara
=
NULL
;
/* Find paragraph previous to the one that contains start cursor */
item
=
ME_FindItemAtOffset
(
editor
,
diRun
,
from
,
&
dummy
);
if
(
item
)
{
startPara
=
ME_FindItemBack
(
item
,
diParagraph
);
item
=
ME_FindItemBack
(
startPara
,
diParagraph
);
if
(
item
)
startPara
=
item
;
}
/* Find paragraph that contains end cursor */
item
=
ME_FindItemAtOffset
(
editor
,
diRun
,
to
,
&
dummy
);
if
(
item
)
{
endPara
=
ME_FindItemFwd
(
item
,
diParagraph
);
}
if
(
startPara
&&
endPara
)
{
ME_UpdateLinkAttribute
(
editor
,
startPara
->
member
.
para
.
nCharOfs
,
endPara
->
member
.
para
.
nCharOfs
);
}
else
if
(
startPara
)
{
ME_UpdateLinkAttribute
(
editor
,
startPara
->
member
.
para
.
nCharOfs
,
-
1
);
}
}
dlls/riched20/editor.h
View file @
4a5d1000
...
...
@@ -282,6 +282,8 @@ extern void DoWrap(ME_TextEditor *editor);
extern
BOOL
ME_FindNextURLCandidate
(
ME_TextEditor
*
editor
,
int
sel_min
,
int
sel_max
,
int
*
candidate_min
,
int
*
candidate_max
);
extern
BOOL
ME_IsCandidateAnURL
(
ME_TextEditor
*
editor
,
int
sel_min
,
int
sel_max
);
BOOL
ME_UpdateLinkAttribute
(
ME_TextEditor
*
editor
,
int
sel_min
,
int
sel_max
);
void
ME_UpdateSelectionLinkAttribute
(
ME_TextEditor
*
editor
);
/* undo.c */
ME_UndoItem
*
ME_AddUndoItem
(
ME_TextEditor
*
editor
,
ME_DIType
type
,
const
ME_DisplayItem
*
pdi
);
...
...
dlls/riched20/tests/editor.c
View file @
4a5d1000
...
...
@@ -1040,6 +1040,7 @@ static void test_EM_AUTOURLDETECT(void)
"This is some text with X
\\
on it"
,
};
char
buffer
[
1024
];
MSG
msg
;
parent
=
new_static_wnd
(
NULL
);
hwndRichEdit
=
new_richedit
(
parent
);
...
...
@@ -1222,6 +1223,162 @@ static void test_EM_AUTOURLDETECT(void)
hwndRichEdit
=
NULL
;
}
#define INSERT_CR \
do { \
keybd_event('\r', 0x1c, 0, 0); \
keybd_event('\r', 0x1c, KEYEVENTF_KEYUP, 0); \
while (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) { \
TranslateMessage(&msg); \
DispatchMessage(&msg); \
} \
} while (0)
#define INSERT_BS \
do { \
keybd_event(0x08, 0x0e, 0, 0); \
keybd_event(0x08, 0x0e, KEYEVENTF_KEYUP, 0); \
while (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) { \
TranslateMessage(&msg); \
DispatchMessage(&msg); \
} \
} while (0)
/* Test detection of URLs within normal text - WM_CHAR case. */
for
(
i
=
0
;
i
<
sizeof
(
urls
)
/
sizeof
(
struct
urls_s
);
i
++
)
{
hwndRichEdit
=
new_richedit
(
parent
);
for
(
j
=
0
;
j
<
sizeof
(
templates_delim
)
/
sizeof
(
const
char
*
);
j
++
)
{
char
*
at_pos
;
int
at_offset
;
int
end_offset
;
int
u
,
v
;
at_pos
=
strchr
(
templates_delim
[
j
],
'X'
);
at_offset
=
at_pos
-
templates_delim
[
j
];
end_offset
=
at_offset
+
strlen
(
urls
[
i
].
text
);
SendMessage
(
hwndRichEdit
,
EM_AUTOURLDETECT
,
TRUE
,
0
);
SendMessage
(
hwndRichEdit
,
WM_SETTEXT
,
0
,
0
);
for
(
u
=
0
;
templates_delim
[
j
][
u
];
u
++
)
{
if
(
templates_delim
[
j
][
u
]
==
'\r'
)
{
INSERT_CR
;
}
else
if
(
templates_delim
[
j
][
u
]
!=
'X'
)
{
SendMessage
(
hwndRichEdit
,
WM_CHAR
,
templates_delim
[
j
][
u
],
1
);
}
else
{
for
(
v
=
0
;
urls
[
i
].
text
[
v
];
v
++
)
{
SendMessage
(
hwndRichEdit
,
WM_CHAR
,
urls
[
i
].
text
[
v
],
1
);
}
}
}
SendMessage
(
hwndRichEdit
,
WM_GETTEXT
,
sizeof
(
buffer
),
(
LPARAM
)
buffer
);
trace
(
"Using template: %s
\n
"
,
templates_delim
[
j
]);
/* This assumes no templates start with the URL itself, and that they
have at least two characters before the URL text */
ok
(
!
check_CFE_LINK_selection
(
hwndRichEdit
,
0
,
1
),
"CFE_LINK incorrectly set in (%d-%d), text: %s
\n
"
,
0
,
1
,
buffer
);
ok
(
!
check_CFE_LINK_selection
(
hwndRichEdit
,
at_offset
-
2
,
at_offset
-
1
),
"CFE_LINK incorrectly set in (%d-%d), text: %s
\n
"
,
at_offset
-
2
,
at_offset
-
1
,
buffer
);
ok
(
!
check_CFE_LINK_selection
(
hwndRichEdit
,
at_offset
-
1
,
at_offset
),
"CFE_LINK incorrectly set in (%d-%d), text: %s
\n
"
,
at_offset
-
1
,
at_offset
,
buffer
);
if
(
urls
[
i
].
is_url
)
{
ok
(
check_CFE_LINK_selection
(
hwndRichEdit
,
at_offset
,
at_offset
+
1
),
"CFE_LINK not set in (%d-%d), text: %s
\n
"
,
at_offset
,
at_offset
+
1
,
buffer
);
ok
(
check_CFE_LINK_selection
(
hwndRichEdit
,
end_offset
-
1
,
end_offset
),
"CFE_LINK not set in (%d-%d), text: %s
\n
"
,
end_offset
-
1
,
end_offset
,
buffer
);
}
else
{
ok
(
!
check_CFE_LINK_selection
(
hwndRichEdit
,
at_offset
,
at_offset
+
1
),
"CFE_LINK incorrectly set in (%d-%d), text: %s
\n
"
,
at_offset
,
at_offset
+
1
,
buffer
);
ok
(
!
check_CFE_LINK_selection
(
hwndRichEdit
,
end_offset
-
1
,
end_offset
),
"CFE_LINK incorrectly set in (%d-%d), text: %s
\n
"
,
end_offset
-
1
,
end_offset
,
buffer
);
}
if
(
buffer
[
end_offset
]
!=
'\0'
)
{
ok
(
!
check_CFE_LINK_selection
(
hwndRichEdit
,
end_offset
,
end_offset
+
1
),
"CFE_LINK incorrectly set in (%d-%d), text: %s
\n
"
,
end_offset
,
end_offset
+
1
,
buffer
);
if
(
buffer
[
end_offset
+
1
]
!=
'\0'
)
{
ok
(
!
check_CFE_LINK_selection
(
hwndRichEdit
,
end_offset
+
1
,
end_offset
+
2
),
"CFE_LINK incorrectly set in (%d-%d), text: %s
\n
"
,
end_offset
+
1
,
end_offset
+
2
,
buffer
);
}
}
/* The following will insert a paragraph break after the first character
of the URL candidate, thus breaking the URL. It is expected that the
CFE_LINK attribute should break across both pieces of the URL */
SendMessage
(
hwndRichEdit
,
EM_SETSEL
,
at_offset
+
1
,
at_offset
+
1
);
INSERT_CR
;
SendMessage
(
hwndRichEdit
,
WM_GETTEXT
,
sizeof
(
buffer
),
(
LPARAM
)
buffer
);
ok
(
!
check_CFE_LINK_selection
(
hwndRichEdit
,
0
,
1
),
"CFE_LINK incorrectly set in (%d-%d), text: %s
\n
"
,
0
,
1
,
buffer
);
ok
(
!
check_CFE_LINK_selection
(
hwndRichEdit
,
at_offset
-
2
,
at_offset
-
1
),
"CFE_LINK incorrectly set in (%d-%d), text: %s
\n
"
,
at_offset
-
2
,
at_offset
-
1
,
buffer
);
ok
(
!
check_CFE_LINK_selection
(
hwndRichEdit
,
at_offset
-
1
,
at_offset
),
"CFE_LINK incorrectly set in (%d-%d), text: %s
\n
"
,
at_offset
-
1
,
at_offset
,
buffer
);
ok
(
!
check_CFE_LINK_selection
(
hwndRichEdit
,
at_offset
,
at_offset
+
1
),
"CFE_LINK incorrectly set in (%d-%d), text: %s
\n
"
,
at_offset
,
at_offset
+
1
,
buffer
);
/* end_offset moved because of paragraph break */
ok
(
!
check_CFE_LINK_selection
(
hwndRichEdit
,
end_offset
-
1
,
end_offset
),
"CFE_LINK incorrectly set in (%d-%d), text: %s
\n
"
,
end_offset
,
end_offset
+
1
,
buffer
);
if
(
buffer
[
end_offset
+
1
]
!=
'\0'
)
{
ok
(
!
check_CFE_LINK_selection
(
hwndRichEdit
,
end_offset
+
1
,
end_offset
+
2
),
"CFE_LINK incorrectly set in (%d-%d), text: %s
\n
"
,
end_offset
+
1
,
end_offset
+
2
,
buffer
);
if
(
buffer
[
end_offset
+
2
]
!=
'\0'
)
{
ok
(
!
check_CFE_LINK_selection
(
hwndRichEdit
,
end_offset
+
2
,
end_offset
+
3
),
"CFE_LINK incorrectly set in (%d-%d), text: %s
\n
"
,
end_offset
+
2
,
end_offset
+
3
,
buffer
);
}
}
/* The following will remove the just-inserted paragraph break, thus
restoring the URL */
SendMessage
(
hwndRichEdit
,
EM_SETSEL
,
at_offset
+
2
,
at_offset
+
2
);
INSERT_BS
;
SendMessage
(
hwndRichEdit
,
WM_GETTEXT
,
sizeof
(
buffer
),
(
LPARAM
)
buffer
);
ok
(
!
check_CFE_LINK_selection
(
hwndRichEdit
,
0
,
1
),
"CFE_LINK incorrectly set in (%d-%d), text: %s
\n
"
,
0
,
1
,
buffer
);
ok
(
!
check_CFE_LINK_selection
(
hwndRichEdit
,
at_offset
-
2
,
at_offset
-
1
),
"CFE_LINK incorrectly set in (%d-%d), text: %s
\n
"
,
at_offset
-
2
,
at_offset
-
1
,
buffer
);
ok
(
!
check_CFE_LINK_selection
(
hwndRichEdit
,
at_offset
-
1
,
at_offset
),
"CFE_LINK incorrectly set in (%d-%d), text: %s
\n
"
,
at_offset
-
1
,
at_offset
,
buffer
);
if
(
urls
[
i
].
is_url
)
{
ok
(
check_CFE_LINK_selection
(
hwndRichEdit
,
at_offset
,
at_offset
+
1
),
"CFE_LINK not set in (%d-%d), text: %s
\n
"
,
at_offset
,
at_offset
+
1
,
buffer
);
ok
(
check_CFE_LINK_selection
(
hwndRichEdit
,
end_offset
-
1
,
end_offset
),
"CFE_LINK not set in (%d-%d), text: %s
\n
"
,
end_offset
-
1
,
end_offset
,
buffer
);
}
else
{
ok
(
!
check_CFE_LINK_selection
(
hwndRichEdit
,
at_offset
,
at_offset
+
1
),
"CFE_LINK incorrectly set in (%d-%d), text: %s
\n
"
,
at_offset
,
at_offset
+
1
,
buffer
);
ok
(
!
check_CFE_LINK_selection
(
hwndRichEdit
,
end_offset
-
1
,
end_offset
),
"CFE_LINK incorrectly set in (%d-%d), text: %s
\n
"
,
end_offset
-
1
,
end_offset
,
buffer
);
}
if
(
buffer
[
end_offset
]
!=
'\0'
)
{
ok
(
!
check_CFE_LINK_selection
(
hwndRichEdit
,
end_offset
,
end_offset
+
1
),
"CFE_LINK incorrectly set in (%d-%d), text: %s
\n
"
,
end_offset
,
end_offset
+
1
,
buffer
);
if
(
buffer
[
end_offset
+
1
]
!=
'\0'
)
{
ok
(
!
check_CFE_LINK_selection
(
hwndRichEdit
,
end_offset
+
1
,
end_offset
+
2
),
"CFE_LINK incorrectly set in (%d-%d), text: %s
\n
"
,
end_offset
+
1
,
end_offset
+
2
,
buffer
);
}
}
}
DestroyWindow
(
hwndRichEdit
);
hwndRichEdit
=
NULL
;
}
DestroyWindow
(
parent
);
}
...
...
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