Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
W
wine-winehq
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-winehq
Commits
1edcfe1f
Commit
1edcfe1f
authored
Sep 17, 2002
by
Dimitrie O. Paun
Committed by
Alexandre Julliard
Sep 17, 2002
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
- Optimize the heck out of Report drawing.
- A bit of organization, for sanity's sake. - Many simplifications, cleanups, etc.
parent
35d8e529
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
450 additions
and
546 deletions
+450
-546
listview.c
dlls/comctl32/listview.c
+450
-546
No files found.
dlls/comctl32/listview.c
View file @
1edcfe1f
...
...
@@ -106,11 +106,11 @@ typedef struct tagLISTVIEW_ITEM
BOOL
valid
;
}
LISTVIEW_ITEM
;
typedef
struct
tag
LISTVIEW_SELECTION
typedef
struct
tag
RANGE
{
DWORD
lower
;
DWORD
upper
;
}
LISTVIEW_SELECTION
;
INT
lower
;
INT
upper
;
}
RANGE
;
typedef
struct
tagLISTVIEW_INFO
{
...
...
@@ -244,7 +244,7 @@ DEFINE_COMMON_NOTIFICATIONS(LISTVIEW_INFO, hwndSelf);
/*
* forward declarations
*/
static
LRESULT
LISTVIEW_GetItemT
(
LISTVIEW_INFO
*
,
LPLVITEMW
,
BOOL
,
BOOL
);
static
BOOL
LISTVIEW_GetItemT
(
LISTVIEW_INFO
*
,
LPLVITEMW
,
BOOL
,
BOOL
);
static
INT
LISTVIEW_SuperHitTestItem
(
LISTVIEW_INFO
*
,
LPLV_INTHIT
,
BOOL
);
static
INT
LISTVIEW_HitTestItem
(
LISTVIEW_INFO
*
,
LPLVHITTESTINFO
,
BOOL
);
static
void
LISTVIEW_AlignLeft
(
LISTVIEW_INFO
*
);
...
...
@@ -254,12 +254,12 @@ static void LISTVIEW_AddSelection(LISTVIEW_INFO *, INT);
static
INT
LISTVIEW_GetItemHeight
(
LISTVIEW_INFO
*
);
static
BOOL
LISTVIEW_GetItemBoundBox
(
LISTVIEW_INFO
*
,
INT
,
LPRECT
);
static
BOOL
LISTVIEW_GetItemPosition
(
LISTVIEW_INFO
*
,
INT
,
LPPOINT
);
static
LRESULT
LISTVIEW_GetItemRect
(
LISTVIEW_INFO
*
,
INT
,
LPRECT
);
static
LRESULT
LISTVIEW_GetSubItemRect
(
LISTVIEW_INFO
*
,
INT
,
INT
,
INT
,
LPRECT
);
static
BOOL
LISTVIEW_GetItemRect
(
LISTVIEW_INFO
*
,
INT
,
LPRECT
);
static
BOOL
LISTVIEW_GetSubItemRect
(
LISTVIEW_INFO
*
,
INT
,
INT
,
INT
,
LPRECT
);
static
INT
LISTVIEW_GetItemWidth
(
LISTVIEW_INFO
*
);
static
INT
LISTVIEW_GetLabelWidth
(
LISTVIEW_INFO
*
,
INT
);
static
LRESULT
LISTVIEW_GetOrigin
(
LISTVIEW_INFO
*
,
LPPOINT
);
static
LRESULT
LISTVIEW_GetViewRect
(
LISTVIEW_INFO
*
,
LPRECT
);
static
BOOL
LISTVIEW_GetOrigin
(
LISTVIEW_INFO
*
,
LPPOINT
);
static
BOOL
LISTVIEW_GetViewRect
(
LISTVIEW_INFO
*
,
LPRECT
);
static
BOOL
LISTVIEW_RemoveColumn
(
HDPA
,
INT
);
static
BOOL
LISTVIEW_RemoveSubItem
(
HDPA
,
INT
);
static
void
LISTVIEW_SetGroupSelection
(
LISTVIEW_INFO
*
,
INT
);
...
...
@@ -268,7 +268,6 @@ static BOOL LISTVIEW_SetItemPosition(LISTVIEW_INFO *, INT, LONG, LONG);
static
void
LISTVIEW_UpdateScroll
(
LISTVIEW_INFO
*
);
static
void
LISTVIEW_SetSelection
(
LISTVIEW_INFO
*
,
INT
);
static
BOOL
LISTVIEW_UpdateSize
(
LISTVIEW_INFO
*
);
static
LRESULT
LISTVIEW_SetViewRect
(
LISTVIEW_INFO
*
,
LPRECT
);
static
void
LISTVIEW_UnsupportedStyles
(
LONG
);
static
HWND
LISTVIEW_EditLabelT
(
LISTVIEW_INFO
*
,
INT
,
BOOL
);
static
LRESULT
LISTVIEW_Command
(
LISTVIEW_INFO
*
,
WPARAM
,
LPARAM
);
...
...
@@ -291,64 +290,61 @@ static HWND CreateEditLabelT(LISTVIEW_INFO *, LPCWSTR, DWORD, INT, INT, INT, INT
#define COUNTOF(array) (sizeof(array)/sizeof(array[0]))
/******** Text handling functions *************************************/
/* A text pointer is either NULL, LPSTR_TEXTCALLBACK, or points to a
* text string. The string may be ANSI or Unicode, in which case
* the boolean isW tells us the type of the string.
*
* The name of the function tell what type of strings it expects:
* W: Unicode, T: ANSI/Unicode - function of isW
*/
static
inline
BOOL
is_textW
(
LPCWSTR
text
)
{
return
text
!=
NULL
&&
text
!=
LPSTR_TEXTCALLBACKW
;
return
text
!=
NULL
&&
text
!=
LPSTR_TEXTCALLBACKW
;
}
static
inline
BOOL
is_textT
(
LPCWSTR
text
,
BOOL
isW
)
{
/* we can ignore isW since LPSTR_TEXTCALLBACKW == LPSTR_TEXTCALLBACKA */
return
is_textW
(
text
);
/* we can ignore isW since LPSTR_TEXTCALLBACKW == LPSTR_TEXTCALLBACKA */
return
is_textW
(
text
);
}
static
inline
int
textlenT
(
LPCWSTR
text
,
BOOL
isW
)
{
return
!
is_textT
(
text
,
isW
)
?
0
:
isW
?
lstrlenW
(
text
)
:
lstrlenA
((
LPCSTR
)
text
);
return
!
is_textT
(
text
,
isW
)
?
0
:
isW
?
lstrlenW
(
text
)
:
lstrlenA
((
LPCSTR
)
text
);
}
static
inline
void
textcpynT
(
LPWSTR
dest
,
BOOL
isDestW
,
LPCWSTR
src
,
BOOL
isSrcW
,
INT
max
)
{
if
(
isDestW
)
if
(
isSrcW
)
lstrcpynW
(
dest
,
src
,
max
);
else
MultiByteToWideChar
(
CP_ACP
,
0
,
(
LPCSTR
)
src
,
-
1
,
dest
,
max
);
else
if
(
isSrcW
)
WideCharToMultiByte
(
CP_ACP
,
0
,
src
,
-
1
,
(
LPSTR
)
dest
,
max
,
NULL
,
NULL
);
else
lstrcpynA
((
LPSTR
)
dest
,
(
LPCSTR
)
src
,
max
);
}
static
inline
LPCSTR
debugtext_t
(
LPCWSTR
text
,
BOOL
isW
)
{
if
(
text
==
LPSTR_TEXTCALLBACKW
)
return
"(callback)"
;
return
isW
?
debugstr_w
(
text
)
:
debugstr_a
((
LPCSTR
)
text
);
}
static
inline
LPCSTR
debugtext_tn
(
LPCWSTR
text
,
BOOL
isW
,
INT
n
)
{
if
(
text
==
LPSTR_TEXTCALLBACKW
)
return
"(callback)"
;
n
=
min
(
textlenT
(
text
,
isW
),
n
);
return
isW
?
debugstr_wn
(
text
,
n
)
:
debugstr_an
((
LPCSTR
)
text
,
n
);
if
(
isDestW
)
if
(
isSrcW
)
lstrcpynW
(
dest
,
src
,
max
);
else
MultiByteToWideChar
(
CP_ACP
,
0
,
(
LPCSTR
)
src
,
-
1
,
dest
,
max
);
else
if
(
isSrcW
)
WideCharToMultiByte
(
CP_ACP
,
0
,
src
,
-
1
,
(
LPSTR
)
dest
,
max
,
NULL
,
NULL
);
else
lstrcpynA
((
LPSTR
)
dest
,
(
LPCSTR
)
src
,
max
);
}
static
inline
LPWSTR
textdupTtoW
(
LPCWSTR
text
,
BOOL
isW
)
{
LPWSTR
wstr
=
(
LPWSTR
)
text
;
LPWSTR
wstr
=
(
LPWSTR
)
text
;
TRACE
(
"(text=%s, isW=%d)
\n
"
,
debugtext_t
(
text
,
isW
),
isW
);
if
(
!
isW
&&
is_textT
(
text
,
isW
))
{
INT
len
=
MultiByteToWideChar
(
CP_ACP
,
0
,
(
LPCSTR
)
text
,
-
1
,
NULL
,
0
);
wstr
=
HeapAlloc
(
GetProcessHeap
(),
0
,
len
*
sizeof
(
WCHAR
));
if
(
wstr
)
MultiByteToWideChar
(
CP_ACP
,
0
,
(
LPCSTR
)
text
,
-
1
,
wstr
,
len
);
}
TRACE
(
" wstr=%s
\n
"
,
debugstr_w
(
wstr
));
return
wstr
;
if
(
!
isW
&&
is_textT
(
text
,
isW
))
{
INT
len
=
MultiByteToWideChar
(
CP_ACP
,
0
,
(
LPCSTR
)
text
,
-
1
,
NULL
,
0
);
wstr
=
HeapAlloc
(
GetProcessHeap
(),
0
,
len
*
sizeof
(
WCHAR
));
if
(
wstr
)
MultiByteToWideChar
(
CP_ACP
,
0
,
(
LPCSTR
)
text
,
-
1
,
wstr
,
len
);
}
TRACE
(
" wstr=%s
\n
"
,
debugstr_w
(
wstr
));
return
wstr
;
}
static
inline
void
textfreeT
(
LPWSTR
wstr
,
BOOL
isW
)
{
if
(
!
isW
&&
is_textT
(
wstr
,
isW
))
HeapFree
(
GetProcessHeap
(),
0
,
wstr
);
if
(
!
isW
&&
is_textT
(
wstr
,
isW
))
HeapFree
(
GetProcessHeap
(),
0
,
wstr
);
}
/*
...
...
@@ -394,51 +390,102 @@ static inline int textcmpWT(LPWSTR aw, LPWSTR bt, BOOL isW)
return
1
;
}
static
inline
LRESULT
CallWindowProcT
(
WNDPROC
proc
,
HWND
hwnd
,
UINT
uMsg
,
WPARAM
wParam
,
LPARAM
lParam
,
BOOL
isW
)
static
inline
int
lstrncmpiW
(
LPCWSTR
s1
,
LPCWSTR
s2
,
int
n
)
{
if
(
isW
)
return
CallWindowProcW
(
proc
,
hwnd
,
uMsg
,
wParam
,
lParam
);
else
return
CallWindowProcA
(
proc
,
hwnd
,
uMsg
,
wParam
,
lParam
);
int
res
;
n
=
min
(
min
(
n
,
strlenW
(
s1
)),
strlenW
(
s2
));
res
=
CompareStringW
(
LOCALE_USER_DEFAULT
,
NORM_IGNORECASE
,
s1
,
n
,
s2
,
n
);
return
res
?
res
-
sizeof
(
WCHAR
)
:
res
;
}
/******** Debugging functions *****************************************/
static
inline
LPCSTR
debugtext_t
(
LPCWSTR
text
,
BOOL
isW
)
{
if
(
text
==
LPSTR_TEXTCALLBACKW
)
return
"(callback)"
;
return
isW
?
debugstr_w
(
text
)
:
debugstr_a
((
LPCSTR
)
text
);
}
static
inline
LPCSTR
debugtext_tn
(
LPCWSTR
text
,
BOOL
isW
,
INT
n
)
{
if
(
text
==
LPSTR_TEXTCALLBACKW
)
return
"(callback)"
;
n
=
min
(
textlenT
(
text
,
isW
),
n
);
return
isW
?
debugstr_wn
(
text
,
n
)
:
debugstr_an
((
LPCSTR
)
text
,
n
);
}
static
char
*
debuglvitem_t
(
LPLVITEMW
lpLVItem
,
BOOL
isW
)
{
static
int
index
=
0
;
static
char
buffers
[
20
][
256
];
char
*
buf
=
buffers
[
index
++
%
20
];
if
(
lpLVItem
==
NULL
)
return
"(null)"
;
snprintf
(
buf
,
256
,
"{mask=%x, iItem=%d, iSubItem=%d, state=%x, stateMask=%x,"
" pszText=%s, cchTextMax=%d, iImage=%d, lParam=%lx, iIndent=%d}"
,
lpLVItem
->
mask
,
lpLVItem
->
iItem
,
lpLVItem
->
iSubItem
,
lpLVItem
->
state
,
lpLVItem
->
stateMask
,
debugtext_tn
(
lpLVItem
->
pszText
,
isW
,
80
),
lpLVItem
->
cchTextMax
,
lpLVItem
->
iImage
,
lpLVItem
->
lParam
,
lpLVItem
->
iIndent
);
return
buf
;
}
static
char
*
debuglvcolumn_t
(
LPLVCOLUMNW
lpColumn
,
BOOL
isW
)
{
static
int
index
=
0
;
static
char
buffers
[
20
][
256
];
char
*
buf
=
buffers
[
index
++
%
20
];
if
(
lpColumn
==
NULL
)
return
"(null)"
;
snprintf
(
buf
,
256
,
"{mask=%x, fmt=%x, cx=%d,"
" pszText=%s, cchTextMax=%d, iSubItem=%d}"
,
lpColumn
->
mask
,
lpColumn
->
fmt
,
lpColumn
->
cx
,
lpColumn
->
mask
&
LVCF_TEXT
?
debugtext_tn
(
lpColumn
->
pszText
,
isW
,
80
)
:
""
,
lpColumn
->
mask
&
LVCF_TEXT
?
lpColumn
->
cchTextMax
:
0
,
lpColumn
->
iSubItem
);
return
buf
;
}
/******** Notification functions i************************************/
static
inline
BOOL
notify
(
LISTVIEW_INFO
*
infoPtr
,
INT
code
,
LPNMHDR
pnmh
)
{
pnmh
->
hwndFrom
=
infoPtr
->
hwndSelf
;
pnmh
->
idFrom
=
GetWindowLongW
(
infoPtr
->
hwndSelf
,
GWL_ID
);
pnmh
->
code
=
code
;
return
(
BOOL
)
SendMessageW
(
GetParent
(
infoPtr
->
hwndSelf
),
WM_NOTIFY
,
(
WPARAM
)
pnmh
->
idFrom
,
(
LPARAM
)
pnmh
);
pnmh
->
hwndFrom
=
infoPtr
->
hwndSelf
;
pnmh
->
idFrom
=
GetWindowLongW
(
infoPtr
->
hwndSelf
,
GWL_ID
);
pnmh
->
code
=
code
;
return
(
BOOL
)
SendMessageW
(
GetParent
(
infoPtr
->
hwndSelf
),
WM_NOTIFY
,
(
WPARAM
)
pnmh
->
idFrom
,
(
LPARAM
)
pnmh
);
}
static
inline
void
notify_itemactivate
(
LISTVIEW_INFO
*
infoPtr
)
{
hwnd_notify
(
infoPtr
->
hwndSelf
,
LVN_ITEMACTIVATE
);
NMHDR
nmh
;
notify
(
infoPtr
,
LVN_ITEMACTIVATE
,
&
nmh
);
}
static
inline
BOOL
listview_notify
(
LISTVIEW_INFO
*
infoPtr
,
INT
code
,
LPNMLISTVIEW
plvnm
)
static
inline
BOOL
notify_listview
(
LISTVIEW_INFO
*
infoPtr
,
INT
code
,
LPNMLISTVIEW
plvnm
)
{
return
notify
(
infoPtr
,
code
,
(
LPNMHDR
)
plvnm
);
return
notify
(
infoPtr
,
code
,
(
LPNMHDR
)
plvnm
);
}
static
int
tabNotification
[]
=
{
LVN_BEGINLABELEDITW
,
LVN_BEGINLABELEDITA
,
LVN_ENDLABELEDITW
,
LVN_ENDLABELEDITA
,
LVN_GETDISPINFOW
,
LVN_GETDISPINFOA
,
LVN_SETDISPINFOW
,
LVN_SETDISPINFOA
,
LVN_ODFINDITEMW
,
LVN_ODFINDITEMA
,
LVN_GETINFOTIPW
,
LVN_GETINFOTIPA
,
0
LVN_BEGINLABELEDITW
,
LVN_BEGINLABELEDITA
,
LVN_ENDLABELEDITW
,
LVN_ENDLABELEDITA
,
LVN_GETDISPINFOW
,
LVN_GETDISPINFOA
,
LVN_SETDISPINFOW
,
LVN_SETDISPINFOA
,
LVN_ODFINDITEMW
,
LVN_ODFINDITEMA
,
LVN_GETINFOTIPW
,
LVN_GETINFOTIPA
,
0
};
static
int
get_ansi_notification
(
INT
unicodeNotificationCode
)
{
int
*
pTabNotif
=
tabNotification
;
while
(
*
pTabNotif
&&
(
unicodeNotificationCode
!=
*
pTabNotif
++
));
if
(
*
pTabNotif
)
return
*
pTabNotif
;
ERR
(
"unknown notification %x
\n
"
,
unicodeNotificationCode
);
return
unicodeNotificationCode
;
int
*
pTabNotif
;
for
(
pTabNotif
=
tabNotification
;
*
pTabNotif
;
pTabNotif
+=
2
)
if
(
*
pTabNotif
==
unicodeNotificationCode
)
return
*
(
pTabNotif
+
1
);
ERR
(
"unknown notification %x
\n
"
,
unicodeNotificationCode
);
return
unicodeNotificationCode
;
}
/*
...
...
@@ -449,7 +496,7 @@ static int get_ansi_notification(INT unicodeNotificationCode)
pdi : dispinfo structure (can be unicode or ansi)
isW : TRUE if dispinfo is Unicode
*/
static
BOOL
dispinfo_notify
T
(
LISTVIEW_INFO
*
infoPtr
,
INT
notificationCode
,
LPNMLVDISPINFOW
pdi
,
BOOL
isW
)
static
BOOL
notify_dispinfo
T
(
LISTVIEW_INFO
*
infoPtr
,
INT
notificationCode
,
LPNMLVDISPINFOW
pdi
,
BOOL
isW
)
{
BOOL
bResult
=
FALSE
;
BOOL
convertToAnsi
=
FALSE
,
convertToUnicode
=
FALSE
;
...
...
@@ -520,135 +567,93 @@ static BOOL dispinfo_notifyT(LISTVIEW_INFO *infoPtr, INT notificationCode, LPNML
return
bResult
;
}
static
inline
LRESULT
LISTVIEW_GetItemW
(
LISTVIEW_INFO
*
infoPtr
,
LPLVITEMW
lpLVItem
,
BOOL
internal
)
static
inline
void
notify_odcachehint
(
LISTVIEW_INFO
*
infoPtr
,
INT
iFrom
,
INT
iTo
)
{
return
LISTVIEW_GetItemT
(
infoPtr
,
lpLVItem
,
internal
,
TRUE
);
NMLVCACHEHINT
nmlv
;
nmlv
.
iFrom
=
iFrom
;
nmlv
.
iTo
=
iTo
;
notify
(
infoPtr
,
LVN_ODCACHEHINT
,
&
nmlv
.
hdr
);
}
static
inline
int
lstrncmpiW
(
LPCWSTR
s1
,
LPCWSTR
s2
,
int
n
)
static
BOOL
notify_customdraw
(
LISTVIEW_INFO
*
infoPtr
,
DWORD
dwDrawStage
,
HDC
hdc
,
RECT
rc
)
{
int
res
;
NMLVCUSTOMDRAW
nmlvcd
;
TRACE
(
"(dwDrawStage=%lx, hdc=%x, rc=?)
\n
"
,
dwDrawStage
,
hdc
);
nmlvcd
.
nmcd
.
dwDrawStage
=
dwDrawStage
;
nmlvcd
.
nmcd
.
hdc
=
hdc
;
nmlvcd
.
nmcd
.
rc
=
rc
;
nmlvcd
.
nmcd
.
dwItemSpec
=
0
;
nmlvcd
.
nmcd
.
uItemState
=
0
;
nmlvcd
.
nmcd
.
lItemlParam
=
0
;
nmlvcd
.
clrText
=
infoPtr
->
clrText
;
nmlvcd
.
clrTextBk
=
infoPtr
->
clrBk
;
n
=
min
(
min
(
n
,
strlenW
(
s1
)),
strlenW
(
s2
));
res
=
CompareStringW
(
LOCALE_USER_DEFAULT
,
NORM_IGNORECASE
,
s1
,
n
,
s2
,
n
);
return
res
?
res
-
sizeof
(
WCHAR
)
:
res
;
return
(
BOOL
)
notify
(
infoPtr
,
NM_CUSTOMDRAW
,
&
nmlvcd
.
nmcd
.
hdr
);
}
static
char
*
debuglvitem_t
(
LPLVITEMW
lpLVItem
,
BOOL
isW
)
/* FIXME: we should inline this where it's called somehow
* I think we need to pass in the structure
*/
static
BOOL
notify_customdrawitem
(
LISTVIEW_INFO
*
infoPtr
,
HDC
hdc
,
UINT
iItem
,
UINT
iSubItem
,
UINT
uItemDrawState
)
{
static
int
index
=
0
;
static
char
buffers
[
20
][
256
];
char
*
buf
=
buffers
[
index
++
%
20
];
if
(
lpLVItem
==
NULL
)
return
"(null)"
;
snprintf
(
buf
,
256
,
"{mask=%x, iItem=%d, iSubItem=%d, state=%x, stateMask=%x,"
" pszText=%s, cchTextMax=%d, iImage=%d, lParam=%lx, iIndent=%d}"
,
lpLVItem
->
mask
,
lpLVItem
->
iItem
,
lpLVItem
->
iSubItem
,
lpLVItem
->
state
,
lpLVItem
->
stateMask
,
debugtext_tn
(
lpLVItem
->
pszText
,
isW
,
80
),
lpLVItem
->
cchTextMax
,
lpLVItem
->
iImage
,
lpLVItem
->
lParam
,
lpLVItem
->
iIndent
);
return
buf
;
NMLVCUSTOMDRAW
nmlvcd
;
UINT
uItemState
;
RECT
itemRect
;
LVITEMW
item
;
BOOL
bReturn
;
item
.
iItem
=
iItem
;
item
.
mask
=
LVIF_PARAM
;
LISTVIEW_GetItemT
(
infoPtr
,
&
item
,
TRUE
,
TRUE
);
uItemState
=
0
;
if
(
LISTVIEW_GetItemState
(
infoPtr
,
iItem
,
LVIS_SELECTED
))
uItemState
|=
CDIS_SELECTED
;
if
(
LISTVIEW_GetItemState
(
infoPtr
,
iItem
,
LVIS_FOCUSED
))
uItemState
|=
CDIS_FOCUS
;
if
(
iItem
==
infoPtr
->
nHotItem
)
uItemState
|=
CDIS_HOT
;
itemRect
.
left
=
LVIR_BOUNDS
;
LISTVIEW_GetItemRect
(
infoPtr
,
iItem
,
&
itemRect
);
nmlvcd
.
nmcd
.
dwDrawStage
=
CDDS_ITEM
|
uItemDrawState
;
nmlvcd
.
nmcd
.
hdc
=
hdc
;
nmlvcd
.
nmcd
.
rc
=
itemRect
;
nmlvcd
.
nmcd
.
dwItemSpec
=
iItem
;
nmlvcd
.
nmcd
.
uItemState
=
uItemState
;
nmlvcd
.
nmcd
.
lItemlParam
=
item
.
lParam
;
nmlvcd
.
clrText
=
infoPtr
->
clrText
;
nmlvcd
.
clrTextBk
=
infoPtr
->
clrBk
;
nmlvcd
.
iSubItem
=
iSubItem
;
TRACE
(
"drawstage=%lx hdc=%x item=%lx, itemstate=%x, lItemlParam=%lx
\n
"
,
nmlvcd
.
nmcd
.
dwDrawStage
,
nmlvcd
.
nmcd
.
hdc
,
nmlvcd
.
nmcd
.
dwItemSpec
,
nmlvcd
.
nmcd
.
uItemState
,
nmlvcd
.
nmcd
.
lItemlParam
);
bReturn
=
notify
(
infoPtr
,
NM_CUSTOMDRAW
,
&
nmlvcd
.
nmcd
.
hdr
);
infoPtr
->
clrText
=
nmlvcd
.
clrText
;
infoPtr
->
clrBk
=
nmlvcd
.
clrTextBk
;
return
bReturn
;
}
static
char
*
debuglvcolumn_t
(
LPLVCOLUMNW
lpColumn
,
BOOL
isW
)
/******** Misc helper functions ************************************/
static
inline
LRESULT
CallWindowProcT
(
WNDPROC
proc
,
HWND
hwnd
,
UINT
uMsg
,
WPARAM
wParam
,
LPARAM
lParam
,
BOOL
isW
)
{
static
int
index
=
0
;
static
char
buffers
[
20
][
256
];
char
*
buf
=
buffers
[
index
++
%
20
];
if
(
lpColumn
==
NULL
)
return
"(null)"
;
snprintf
(
buf
,
256
,
"{mask=%x, fmt=%x, cx=%d,"
" pszText=%s, cchTextMax=%d, iSubItem=%d}"
,
lpColumn
->
mask
,
lpColumn
->
fmt
,
lpColumn
->
cx
,
lpColumn
->
mask
&
LVCF_TEXT
?
debugtext_tn
(
lpColumn
->
pszText
,
isW
,
80
)
:
""
,
lpColumn
->
mask
&
LVCF_TEXT
?
lpColumn
->
cchTextMax
:
0
,
lpColumn
->
iSubItem
);
return
buf
;
}
static
BOOL
LISTVIEW_SendCustomDrawNotify
(
LISTVIEW_INFO
*
infoPtr
,
DWORD
dwDrawStage
,
HDC
hdc
,
RECT
rc
)
{
NMLVCUSTOMDRAW
nmcdhdr
;
LPNMCUSTOMDRAW
nmcd
;
TRACE
(
"(dwDrawStage=%lx, hdc=%x, rc=?)
\n
"
,
dwDrawStage
,
hdc
);
nmcd
=
&
nmcdhdr
.
nmcd
;
nmcd
->
hdr
.
hwndFrom
=
infoPtr
->
hwndSelf
;
nmcd
->
hdr
.
idFrom
=
GetWindowLongW
(
infoPtr
->
hwndSelf
,
GWL_ID
);
nmcd
->
hdr
.
code
=
NM_CUSTOMDRAW
;
nmcd
->
dwDrawStage
=
dwDrawStage
;
nmcd
->
hdc
=
hdc
;
nmcd
->
rc
.
left
=
rc
.
left
;
nmcd
->
rc
.
right
=
rc
.
right
;
nmcd
->
rc
.
bottom
=
rc
.
bottom
;
nmcd
->
rc
.
top
=
rc
.
top
;
nmcd
->
dwItemSpec
=
0
;
nmcd
->
uItemState
=
0
;
nmcd
->
lItemlParam
=
0
;
nmcdhdr
.
clrText
=
infoPtr
->
clrText
;
nmcdhdr
.
clrTextBk
=
infoPtr
->
clrBk
;
return
(
BOOL
)
SendMessageW
(
GetParent
(
infoPtr
->
hwndSelf
),
WM_NOTIFY
,
(
WPARAM
)
nmcd
->
hdr
.
idFrom
,
(
LPARAM
)
&
nmcdhdr
);
}
static
BOOL
LISTVIEW_SendCustomDrawItemNotify
(
LISTVIEW_INFO
*
infoPtr
,
HDC
hdc
,
UINT
iItem
,
UINT
iSubItem
,
UINT
uItemDrawState
)
{
NMLVCUSTOMDRAW
nmcdhdr
;
LPNMCUSTOMDRAW
nmcd
;
DWORD
dwDrawStage
,
dwItemSpec
;
UINT
uItemState
;
INT
retval
;
RECT
itemRect
;
LVITEMW
item
;
ZeroMemory
(
&
item
,
sizeof
(
item
));
item
.
iItem
=
iItem
;
item
.
mask
=
LVIF_PARAM
;
ListView_GetItemW
(
infoPtr
->
hwndSelf
,
&
item
);
dwDrawStage
=
CDDS_ITEM
|
uItemDrawState
;
dwItemSpec
=
iItem
;
uItemState
=
0
;
if
(
LISTVIEW_GetItemState
(
infoPtr
,
iItem
,
LVIS_SELECTED
))
uItemState
|=
CDIS_SELECTED
;
if
(
LISTVIEW_GetItemState
(
infoPtr
,
iItem
,
LVIS_FOCUSED
))
uItemState
|=
CDIS_FOCUS
;
if
(
iItem
==
infoPtr
->
nHotItem
)
uItemState
|=
CDIS_HOT
;
itemRect
.
left
=
LVIR_BOUNDS
;
LISTVIEW_GetItemRect
(
infoPtr
,
iItem
,
&
itemRect
);
nmcd
=
&
nmcdhdr
.
nmcd
;
nmcd
->
hdr
.
hwndFrom
=
infoPtr
->
hwndSelf
;
nmcd
->
hdr
.
idFrom
=
GetWindowLongW
(
infoPtr
->
hwndSelf
,
GWL_ID
);
nmcd
->
hdr
.
code
=
NM_CUSTOMDRAW
;
nmcd
->
dwDrawStage
=
dwDrawStage
;
nmcd
->
hdc
=
hdc
;
nmcd
->
rc
.
left
=
itemRect
.
left
;
nmcd
->
rc
.
right
=
itemRect
.
right
;
nmcd
->
rc
.
bottom
=
itemRect
.
bottom
;
nmcd
->
rc
.
top
=
itemRect
.
top
;
nmcd
->
dwItemSpec
=
dwItemSpec
;
nmcd
->
uItemState
=
uItemState
;
nmcd
->
lItemlParam
=
item
.
lParam
;
nmcdhdr
.
clrText
=
infoPtr
->
clrText
;
nmcdhdr
.
clrTextBk
=
infoPtr
->
clrBk
;
nmcdhdr
.
iSubItem
=
iSubItem
;
TRACE
(
"drawstage=%lx hdc=%x item=%lx, itemstate=%x, lItemlParam=%lx
\n
"
,
nmcd
->
dwDrawStage
,
nmcd
->
hdc
,
nmcd
->
dwItemSpec
,
nmcd
->
uItemState
,
nmcd
->
lItemlParam
);
retval
=
SendMessageW
(
GetParent
(
infoPtr
->
hwndSelf
),
WM_NOTIFY
,
(
WPARAM
)
nmcd
->
hdr
.
idFrom
,
(
LPARAM
)
&
nmcdhdr
);
infoPtr
->
clrText
=
nmcdhdr
.
clrText
;
infoPtr
->
clrBk
=
nmcdhdr
.
clrTextBk
;
return
(
BOOL
)
retval
;
if
(
isW
)
return
CallWindowProcW
(
proc
,
hwnd
,
uMsg
,
wParam
,
lParam
);
else
return
CallWindowProcA
(
proc
,
hwnd
,
uMsg
,
wParam
,
lParam
);
}
/******** Internal API functions ************************************/
static
inline
BOOL
LISTVIEW_GetItemW
(
LISTVIEW_INFO
*
infoPtr
,
LPLVITEMW
lpLVItem
,
BOOL
internal
)
{
return
LISTVIEW_GetItemT
(
infoPtr
,
lpLVItem
,
internal
,
TRUE
);
}
static
inline
int
LISTVIEW_GetType
(
LISTVIEW_INFO
*
infoPtr
)
...
...
@@ -668,9 +673,9 @@ static inline int LISTVIEW_GetType(LISTVIEW_INFO *infoPtr)
*/
static
inline
INT
LISTVIEW_GetCountPerRow
(
LISTVIEW_INFO
*
infoPtr
)
{
INT
nListWidth
=
infoPtr
->
rcList
.
right
-
infoPtr
->
rcList
.
left
;
INT
nListWidth
=
infoPtr
->
rcList
.
right
-
infoPtr
->
rcList
.
left
;
return
max
(
nListWidth
/
infoPtr
->
nItemWidth
,
1
);
return
max
(
nListWidth
/
infoPtr
->
nItemWidth
,
1
);
}
/***
...
...
@@ -686,26 +691,29 @@ static inline INT LISTVIEW_GetCountPerRow(LISTVIEW_INFO *infoPtr)
*/
static
inline
INT
LISTVIEW_GetCountPerColumn
(
LISTVIEW_INFO
*
infoPtr
)
{
INT
nListHeight
=
infoPtr
->
rcList
.
bottom
-
infoPtr
->
rcList
.
top
;
INT
nListHeight
=
infoPtr
->
rcList
.
bottom
-
infoPtr
->
rcList
.
top
;
return
max
(
nListHeight
/
infoPtr
->
nItemHeight
,
1
);
return
max
(
nListHeight
/
infoPtr
->
nItemHeight
,
1
);
}
/***
* DESCRIPTION:
* Retrieves the
count of visible items. Note that the returned count may
*
be a bit larger than the actual count
.
* Retrieves the
range of visible items. Note that the upper limit
*
may be a bit larger than the actual last visible item
.
*
* PARAMETER(S):
* [I] infoPtr : valid pointer to the listview structure
*
* RETURN:
* maximum
visible item count
* maximum
range of visible items
*/
static
INT
LISTVIEW_GetVisibleCount
(
LISTVIEW_INFO
*
infoPtr
)
static
RANGE
LISTVIEW_GetVisibleRange
(
LISTVIEW_INFO
*
infoPtr
)
{
UINT
uView
=
LISTVIEW_GetType
(
infoPtr
);
INT
nPerCol
,
nPerRow
;
RANGE
visrange
;
visrange
.
lower
=
LISTVIEW_GetTopIndex
(
infoPtr
);
if
(
uView
==
LVS_REPORT
)
{
...
...
@@ -723,7 +731,11 @@ static INT LISTVIEW_GetVisibleCount(LISTVIEW_INFO *infoPtr)
nPerRow
=
LISTVIEW_GetCountPerRow
(
infoPtr
)
+
1
;
}
return
nPerCol
*
nPerRow
;
visrange
.
upper
=
visrange
.
lower
+
nPerCol
*
nPerRow
;
if
(
visrange
.
upper
>
GETITEMCOUNT
(
infoPtr
))
visrange
.
upper
=
GETITEMCOUNT
(
infoPtr
);
return
visrange
;
}
...
...
@@ -1053,13 +1065,11 @@ static inline void LISTVIEW_ToggleFocusRect(LISTVIEW_INFO *infoPtr)
*/
static
void
LISTVIEW_InvalidateSelectedItems
(
LISTVIEW_INFO
*
infoPtr
)
{
INT
i
,
nTop
,
nBottom
;
RANGE
visrange
;
INT
i
;
nTop
=
LISTVIEW_GetTopIndex
(
infoPtr
);
nBottom
=
nTop
+
LISTVIEW_GetVisibleCount
(
infoPtr
);
if
(
nBottom
>
GETITEMCOUNT
(
infoPtr
))
nBottom
=
GETITEMCOUNT
(
infoPtr
);
for
(
i
=
nTop
;
i
<=
nBottom
;
i
++
)
visrange
=
LISTVIEW_GetVisibleRange
(
infoPtr
);
for
(
i
=
visrange
.
lower
;
i
<=
visrange
.
upper
;
i
++
)
{
if
(
LISTVIEW_GetItemState
(
infoPtr
,
i
,
LVIS_SELECTED
))
{
...
...
@@ -1165,7 +1175,7 @@ static void LISTVIEW_AlignTop(LISTVIEW_INFO *infoPtr)
rcView
.
bottom
=
ptItem
.
y
-
off_y
;
}
LISTVIEW_SetViewRect
(
infoPtr
,
&
rcView
)
;
infoPtr
->
rcView
=
rcView
;
}
}
...
...
@@ -1230,40 +1240,10 @@ static void LISTVIEW_AlignLeft(LISTVIEW_INFO *infoPtr)
rcView
.
right
=
ptItem
.
x
;
}
LISTVIEW_SetViewRect
(
infoPtr
,
&
rcView
)
;
infoPtr
->
rcView
=
rcView
;
}
}
/***
* DESCRIPTION:
* Set the bounding rectangle of all the items.
*
* PARAMETER(S):
* [I] infoPtr : valid pointer to the listview structure
* [I] LPRECT : bounding rectangle
*
* RETURN:
* SUCCESS : TRUE
* FAILURE : FALSE
*/
static
LRESULT
LISTVIEW_SetViewRect
(
LISTVIEW_INFO
*
infoPtr
,
LPRECT
lprcView
)
{
BOOL
bResult
=
FALSE
;
TRACE
(
"(left=%d, top=%d, right=%d, bottom=%d)
\n
"
,
lprcView
->
left
,
lprcView
->
top
,
lprcView
->
right
,
lprcView
->
bottom
);
if
(
lprcView
!=
NULL
)
{
bResult
=
TRUE
;
infoPtr
->
rcView
.
left
=
lprcView
->
left
;
infoPtr
->
rcView
.
top
=
lprcView
->
top
;
infoPtr
->
rcView
.
right
=
lprcView
->
right
;
infoPtr
->
rcView
.
bottom
=
lprcView
->
bottom
;
}
return
bResult
;
}
/***
* DESCRIPTION:
...
...
@@ -1271,35 +1251,29 @@ static LRESULT LISTVIEW_SetViewRect(LISTVIEW_INFO *infoPtr, LPRECT lprcView)
*
* PARAMETER(S):
* [I] infoPtr : valid pointer to the listview structure
* [O]
LPRECT
: bounding rectangle
* [O]
lprcView
: bounding rectangle
*
* RETURN:
* SUCCESS : TRUE
* FAILURE : FALSE
*/
static
LRESULT
LISTVIEW_GetViewRect
(
LISTVIEW_INFO
*
infoPtr
,
LPRECT
lprcView
)
static
BOOL
LISTVIEW_GetViewRect
(
LISTVIEW_INFO
*
infoPtr
,
LPRECT
lprcView
)
{
BOOL
bResult
=
FALSE
;
POINT
ptOrigin
;
POINT
ptOrigin
;
TRACE
(
"(lprcView=%p)
\n
"
,
lprcView
);
TRACE
(
"(lprcView=%p)
\n
"
,
lprcView
);
if
(
lprcView
!=
NULL
)
{
bResult
=
LISTVIEW_GetOrigin
(
infoPtr
,
&
ptOrigin
);
if
(
bResult
)
{
lprcView
->
left
=
infoPtr
->
rcView
.
left
+
ptOrigin
.
x
;
lprcView
->
top
=
infoPtr
->
rcView
.
top
+
ptOrigin
.
y
;
lprcView
->
right
=
infoPtr
->
rcView
.
right
+
ptOrigin
.
x
;
lprcView
->
bottom
=
infoPtr
->
rcView
.
bottom
+
ptOrigin
.
y
;
}
if
(
!
lprcView
)
return
FALSE
;
if
(
!
LISTVIEW_GetOrigin
(
infoPtr
,
&
ptOrigin
))
return
FALSE
;
*
lprcView
=
infoPtr
->
rcView
;
OffsetRect
(
lprcView
,
ptOrigin
.
x
,
ptOrigin
.
y
);
TRACE
(
"(left=%d, top=%d, right=%d, bottom=%d)
\n
"
,
lprcView
->
left
,
lprcView
->
top
,
lprcView
->
right
,
lprcView
->
bottom
);
}
return
bResult
;
return
TRUE
;
}
/***
...
...
@@ -1446,28 +1420,22 @@ static void LISTVIEW_SaveTextMetrics(LISTVIEW_INFO *infoPtr)
*/
static
INT
LISTVIEW_GetItemHeight
(
LISTVIEW_INFO
*
infoPtr
)
{
UINT
uView
=
LISTVIEW_GetType
(
infoPtr
);
INT
nItemHeight
=
0
;
INT
nItemHeight
;
if
(
uView
==
LVS_ICON
)
{
nItemHeight
=
infoPtr
->
iconSpacing
.
cy
;
}
else
{
if
(
infoPtr
->
himlState
||
infoPtr
->
himlSmall
)
nItemHeight
=
max
(
infoPtr
->
ntmHeight
,
infoPtr
->
iconSize
.
cy
)
+
HEIGHT_PADDING
;
if
(
LISTVIEW_GetType
(
infoPtr
)
==
LVS_ICON
)
nItemHeight
=
infoPtr
->
iconSpacing
.
cy
;
else
if
(
infoPtr
->
himlState
||
infoPtr
->
himlSmall
)
nItemHeight
=
max
(
infoPtr
->
ntmHeight
,
infoPtr
->
iconSize
.
cy
)
+
HEIGHT_PADDING
;
else
nItemHeight
=
infoPtr
->
ntmHeight
;
}
nItemHeight
=
infoPtr
->
ntmHeight
;
return
nItemHeight
;
return
nItemHeight
;
}
#if 0
static void LISTVIEW_PrintSelectionRanges(LISTVIEW_INFO *infoPtr)
{
LISTVIEW_SELECTION
*selection;
RANGE
*selection;
INT topSelection = infoPtr->hdpaSelectionRanges->nItemCount;
INT i;
...
...
@@ -1496,11 +1464,9 @@ static void LISTVIEW_PrintSelectionRanges(LISTVIEW_INFO *infoPtr)
*/
static
INT
CALLBACK
LISTVIEW_CompareSelectionRanges
(
LPVOID
range1
,
LPVOID
range2
,
LPARAM
flags
)
{
if
(((
LISTVIEW_SELECTION
*
)(
range1
))
->
upper
<
((
LISTVIEW_SELECTION
*
)(
range2
))
->
lower
)
if
(((
RANGE
*
)
range1
)
->
upper
<
((
RANGE
*
)
range2
)
->
lower
)
return
-
1
;
if
(((
LISTVIEW_SELECTION
*
)(
range2
))
->
upper
<
((
LISTVIEW_SELECTION
*
)(
range1
))
->
lower
)
if
(((
RANGE
*
)
range2
)
->
upper
<
((
RANGE
*
)
range1
)
->
lower
)
return
1
;
return
0
;
}
...
...
@@ -1510,7 +1476,7 @@ static INT CALLBACK LISTVIEW_CompareSelectionRanges(LPVOID range1, LPVOID range2
*/
static
BOOL
add_selection_range
(
LISTVIEW_INFO
*
infoPtr
,
INT
lower
,
INT
upper
,
BOOL
adj_sel_only
)
{
LISTVIEW_SELECTION
selection
;
RANGE
selection
;
LVITEMW
lvItem
;
INT
index
,
i
;
...
...
@@ -1524,10 +1490,10 @@ static BOOL add_selection_range(LISTVIEW_INFO *infoPtr, INT lower, INT upper, BO
if
(
index
==
-
1
)
{
LISTVIEW_SELECTION
*
newsel
;
RANGE
*
newsel
;
/* create the brand new selection to insert */
newsel
=
(
LISTVIEW_SELECTION
*
)
COMCTL32_Alloc
(
sizeof
(
LISTVIEW_SELECTION
));
newsel
=
(
RANGE
*
)
COMCTL32_Alloc
(
sizeof
(
RANGE
));
if
(
!
newsel
)
return
FALSE
;
newsel
->
lower
=
lower
;
newsel
->
upper
=
upper
;
...
...
@@ -1542,19 +1508,19 @@ static BOOL add_selection_range(LISTVIEW_INFO *infoPtr, INT lower, INT upper, BO
}
else
{
LISTVIEW_SELECTION
*
chksel
,
*
mrgsel
;
RANGE
*
chksel
,
*
mrgsel
;
INT
fromindex
,
mergeindex
;
chksel
=
DPA_GetPtr
(
infoPtr
->
hdpaSelectionRanges
,
index
);
if
(
!
chksel
)
return
FALSE
;
TRACE
(
"Merge with index %i (%
lu - %lu
)
\n
"
,
index
,
chksel
->
lower
,
chksel
->
upper
);
TRACE
(
"Merge with index %i (%
d - %d
)
\n
"
,
index
,
chksel
->
lower
,
chksel
->
upper
);
chksel
->
lower
=
min
(
lower
,
chksel
->
lower
);
chksel
->
upper
=
max
(
upper
,
chksel
->
upper
);
TRACE
(
"New range %i (%
lu - %lu
)
\n
"
,
index
,
chksel
->
lower
,
chksel
->
upper
);
TRACE
(
"New range %i (%
d - %d
)
\n
"
,
index
,
chksel
->
lower
,
chksel
->
upper
);
/* merge now common selection ranges */
fromindex
=
0
;
...
...
@@ -1585,8 +1551,7 @@ static BOOL add_selection_range(LISTVIEW_INFO *infoPtr, INT lower, INT upper, BO
}
while
(
1
);
}
/* FIXME: do we really need it? */
DPA_Sort
(
infoPtr
->
hdpaSelectionRanges
,
LISTVIEW_CompareSelectionRanges
,
0
);
/*DPA_Sort(infoPtr->hdpaSelectionRanges, LISTVIEW_CompareSelectionRanges, 0);*/
if
(
adj_sel_only
)
return
TRUE
;
...
...
@@ -1605,7 +1570,7 @@ static BOOL add_selection_range(LISTVIEW_INFO *infoPtr, INT lower, INT upper, BO
*/
static
BOOL
remove_selection_range
(
LISTVIEW_INFO
*
infoPtr
,
INT
lower
,
INT
upper
,
BOOL
adj_sel_only
)
{
LISTVIEW_SELECTION
remsel
,
tmpsel
,
*
chksel
;
RANGE
remsel
,
tmpsel
,
*
chksel
;
BOOL
done
=
FALSE
;
LVITEMW
lvItem
;
INT
index
,
i
;
...
...
@@ -1616,7 +1581,7 @@ static BOOL remove_selection_range(LISTVIEW_INFO *infoPtr, INT lower, INT upper,
remsel
.
lower
=
lower
;
remsel
.
upper
=
upper
;
TRACE
(
"range: (%
lu - %lu
)
\n
"
,
remsel
.
lower
,
remsel
.
upper
);
TRACE
(
"range: (%
d - %d
)
\n
"
,
remsel
.
lower
,
remsel
.
upper
);
do
{
...
...
@@ -1627,7 +1592,7 @@ static BOOL remove_selection_range(LISTVIEW_INFO *infoPtr, INT lower, INT upper,
chksel
=
DPA_GetPtr
(
infoPtr
->
hdpaSelectionRanges
,
index
);
if
(
!
chksel
)
return
FALSE
;
TRACE
(
"Matches range index %i (%
lu-%lu
)
\n
"
,
TRACE
(
"Matches range index %i (%
d - %d
)
\n
"
,
index
,
chksel
->
lower
,
chksel
->
upper
);
/* case 1: Same range */
...
...
@@ -1658,16 +1623,15 @@ static BOOL remove_selection_range(LISTVIEW_INFO *infoPtr, INT lower, INT upper,
/* case 5: fully internal */
else
{
LISTVIEW_SELECTION
*
newsel
=
(
LISTVIEW_SELECTION
*
)
COMCTL32_Alloc
(
sizeof
(
LISTVIEW_SELECTION
));
RANGE
*
newsel
=
(
RANGE
*
)
COMCTL32_Alloc
(
sizeof
(
RANGE
));
if
(
!
newsel
)
return
FALSE
;
tmpsel
=
*
chksel
;
newsel
->
lower
=
chksel
->
lower
;
newsel
->
upper
=
remsel
.
lower
-
1
;
chksel
->
lower
=
remsel
.
upper
+
1
;
DPA_InsertPtr
(
infoPtr
->
hdpaSelectionRanges
,
index
,
newsel
);
/*FIXME: why do we need the sort??? */
DPA_Sort
(
infoPtr
->
hdpaSelectionRanges
,
LISTVIEW_CompareSelectionRanges
,
0
);
/*DPA_Sort(infoPtr->hdpaSelectionRanges, LISTVIEW_CompareSelectionRanges, 0);*/
chksel
=
&
tmpsel
;
}
...
...
@@ -1731,7 +1695,7 @@ static inline BOOL LISTVIEW_RemoveSelectionRange(LISTVIEW_INFO *infoPtr, INT low
*/
static
LRESULT
LISTVIEW_RemoveAllSelections
(
LISTVIEW_INFO
*
infoPtr
)
{
LISTVIEW_SELECTION
*
sel
;
RANGE
*
sel
;
static
BOOL
removing_all_selections
=
FALSE
;
if
(
removing_all_selections
)
return
TRUE
;
...
...
@@ -1783,15 +1747,15 @@ static inline BOOL LISTVIEW_SetItemFocus(LISTVIEW_INFO *infoPtr, INT nItem)
*
* PARAMETER(S):
* [I] infoPtr : valid pointer to the listview structure
* [I]
INT
: item index
* [I]
INT
: Direction of shift, +1 or -1.
* [I]
nItem
: item index
* [I]
direction
: Direction of shift, +1 or -1.
*
* RETURN:
* None
*/
static
void
LISTVIEW_ShiftIndices
(
LISTVIEW_INFO
*
infoPtr
,
INT
nItem
,
INT
direction
)
{
LISTVIEW_SELECTION
selection
,
*
checkselection
;
RANGE
selection
,
*
checkselection
;
INT
index
;
TRACE
(
"Shifting %iu, %i steps
\n
"
,
nItem
,
direction
);
...
...
@@ -1865,7 +1829,6 @@ static void LISTVIEW_AddGroupSelection(LISTVIEW_INFO *infoPtr, INT nItem)
if
(
nFirst
==
-
1
)
nFirst
=
nItem
;
ZeroMemory
(
&
item
,
sizeof
(
item
));
item
.
stateMask
=
LVIS_SELECTED
;
item
.
state
=
LVIS_SELECTED
;
...
...
@@ -1896,7 +1859,6 @@ static void LISTVIEW_AddSelection(LISTVIEW_INFO *infoPtr, INT nItem)
{
LVITEMW
item
;
ZeroMemory
(
&
item
,
sizeof
(
item
));
item
.
state
=
LVIS_SELECTED
;
item
.
stateMask
=
LVIS_SELECTED
;
...
...
@@ -1906,35 +1868,6 @@ static void LISTVIEW_AddSelection(LISTVIEW_INFO *infoPtr, INT nItem)
infoPtr
->
nSelectionMark
=
nItem
;
}
/***
* DESCRIPTION:
* Selects items based on view coordinates.
*
* PARAMETER(S):
* [I] infoPtr : valid pointer to the listview structure
* [I] rcSelRect : selection rectangle
*
* RETURN:
* None
*/
static
void
LISTVIEW_SetSelectionRect
(
LISTVIEW_INFO
*
infoPtr
,
RECT
rcSelRect
)
{
POINT
ptItem
;
INT
i
;
LVITEMW
item
;
ZeroMemory
(
&
item
,
sizeof
(
item
));
item
.
stateMask
=
LVIS_SELECTED
;
/* FIXME: shouldn't we iterate over visible items only? */
for
(
i
=
0
;
i
<
GETITEMCOUNT
(
infoPtr
);
i
++
)
{
LISTVIEW_GetItemPosition
(
infoPtr
,
i
,
&
ptItem
);
item
.
state
=
PtInRect
(
&
rcSelRect
,
ptItem
)
?
LVIS_SELECTED
:
0
;
LISTVIEW_SetItemState
(
infoPtr
,
i
,
&
item
);
}
}
/***
* DESCRIPTION:
...
...
@@ -1949,57 +1882,45 @@ static void LISTVIEW_SetSelectionRect(LISTVIEW_INFO *infoPtr, RECT rcSelRect)
*/
static
void
LISTVIEW_SetGroupSelection
(
LISTVIEW_INFO
*
infoPtr
,
INT
nItem
)
{
UINT
uView
=
LISTVIEW_GetType
(
infoPtr
);
LVITEMW
item
;
ZeroMemory
(
&
item
,
sizeof
(
item
))
;
item
.
stateMask
=
LVIS_SELECTED
;
UINT
uView
=
LISTVIEW_GetType
(
infoPtr
);
INT
i
,
nFirst
,
nLast
;
LVITEMW
item
;
POINT
ptItem
;
RECT
rcSel
;
if
((
uView
==
LVS_LIST
)
||
(
uView
==
LVS_REPORT
))
{
INT
i
;
INT
nFirst
,
nLast
;
item
.
stateMask
=
LVIS_SELECTED
;
if
(
infoPtr
->
nSelectionMark
==
-
1
)
if
(
(
uView
==
LVS_LIST
)
||
(
uView
==
LVS_REPORT
)
)
{
infoPtr
->
nSelectionMark
=
nFirst
=
nLast
=
nItem
;
if
(
infoPtr
->
nSelectionMark
==
-
1
)
infoPtr
->
nSelectionMark
=
nFirst
=
nLast
=
nItem
;
else
{
nFirst
=
min
(
infoPtr
->
nSelectionMark
,
nItem
);
nLast
=
max
(
infoPtr
->
nSelectionMark
,
nItem
);
}
}
else
{
nFirst
=
min
(
infoPtr
->
nSelectionMark
,
nItem
);
nLast
=
max
(
infoPtr
->
nSelectionMark
,
nItem
);
RECT
rcItem
,
rcSelMark
;
LISTVIEW_GetItemBoundBox
(
infoPtr
,
nItem
,
&
rcItem
);
LISTVIEW_GetItemBoundBox
(
infoPtr
,
infoPtr
->
nSelectionMark
,
&
rcSelMark
);
UnionRect
(
&
rcSel
,
&
rcItem
,
&
rcSelMark
);
nFirst
=
nLast
=
-
1
;
}
for
(
i
=
0
;
i
<=
GETITEMCOUNT
(
infoPtr
);
i
++
)
{
if
((
i
<
nFirst
)
||
(
i
>
nLast
))
item
.
state
=
0
;
else
item
.
state
=
LVIS_SELECTED
;
LISTVIEW_SetItemState
(
infoPtr
,
i
,
&
item
);
if
(
nFirst
>
-
1
)
item
.
state
=
(
i
<
nFirst
)
||
(
i
>
nLast
)
?
0
:
LVIS_SELECTED
;
else
{
LISTVIEW_GetItemPosition
(
infoPtr
,
i
,
&
ptItem
);
item
.
state
=
PtInRect
(
&
rcSel
,
ptItem
)
?
LVIS_SELECTED
:
0
;
}
LISTVIEW_SetItemState
(
infoPtr
,
i
,
&
item
);
}
}
else
{
RECT
rcItem
;
RECT
rcSelMark
;
RECT
rcSel
;
LISTVIEW_GetItemBoundBox
(
infoPtr
,
nItem
,
&
rcItem
);
LISTVIEW_GetItemBoundBox
(
infoPtr
,
infoPtr
->
nSelectionMark
,
&
rcSelMark
);
rcSel
.
left
=
min
(
rcSelMark
.
left
,
rcItem
.
left
);
rcSel
.
top
=
min
(
rcSelMark
.
top
,
rcItem
.
top
);
rcSel
.
right
=
max
(
rcSelMark
.
right
,
rcItem
.
right
);
rcSel
.
bottom
=
max
(
rcSelMark
.
bottom
,
rcItem
.
bottom
);
LISTVIEW_SetSelectionRect
(
infoPtr
,
rcSel
);
TRACE
(
"item %d (%d,%d)-(%d,%d), mark %d (%d,%d)-(%d,%d), sel (%d,%d)-(%d,%d)
\n
"
,
nItem
,
rcItem
.
left
,
rcItem
.
top
,
rcItem
.
right
,
rcItem
.
bottom
,
infoPtr
->
nSelectionMark
,
rcSelMark
.
left
,
rcSelMark
.
top
,
rcSelMark
.
right
,
rcSelMark
.
bottom
,
rcSel
.
left
,
rcSel
.
top
,
rcSel
.
right
,
rcSel
.
bottom
);
}
LISTVIEW_SetItemFocus
(
infoPtr
,
nItem
);
LISTVIEW_SetItemFocus
(
infoPtr
,
nItem
);
}
/***
...
...
@@ -2015,16 +1936,15 @@ static void LISTVIEW_SetGroupSelection(LISTVIEW_INFO *infoPtr, INT nItem)
*/
static
void
LISTVIEW_SetSelection
(
LISTVIEW_INFO
*
infoPtr
,
INT
nItem
)
{
LVITEMW
lvItem
;
LVITEMW
lvItem
;
LISTVIEW_RemoveAllSelections
(
infoPtr
);
LISTVIEW_RemoveAllSelections
(
infoPtr
);
ZeroMemory
(
&
lvItem
,
sizeof
(
lvItem
));
lvItem
.
state
=
LVIS_FOCUSED
|
LVIS_SELECTED
;
lvItem
.
stateMask
=
LVIS_FOCUSED
|
LVIS_SELECTED
;
LISTVIEW_SetItemState
(
infoPtr
,
nItem
,
&
lvItem
);
lvItem
.
state
=
LVIS_FOCUSED
|
LVIS_SELECTED
;
lvItem
.
stateMask
=
LVIS_FOCUSED
|
LVIS_SELECTED
;
LISTVIEW_SetItemState
(
infoPtr
,
nItem
,
&
lvItem
);
infoPtr
->
nSelectionMark
=
nItem
;
infoPtr
->
nSelectionMark
=
nItem
;
}
/***
...
...
@@ -2093,14 +2013,12 @@ static BOOL LISTVIEW_KeySelection(LISTVIEW_INFO *infoPtr, INT nItem)
*/
static
INT
LISTVIEW_GetItemAtPt
(
LISTVIEW_INFO
*
infoPtr
,
POINT
pt
)
{
INT
i
,
nTop
,
nBottom
;
RANGE
visrange
;
RECT
rcItem
;
INT
i
;
nTop
=
LISTVIEW_GetTopIndex
(
infoPtr
);
nBottom
=
nTop
+
LISTVIEW_GetVisibleCount
(
infoPtr
);
if
(
nBottom
>
GETITEMCOUNT
(
infoPtr
))
nBottom
=
GETITEMCOUNT
(
infoPtr
);
for
(
i
=
nTop
;
i
<=
nBottom
;
i
++
)
visrange
=
LISTVIEW_GetVisibleRange
(
infoPtr
);
for
(
i
=
visrange
.
lower
;
i
<=
visrange
.
upper
;
i
++
)
{
rcItem
.
left
=
LVIR_SELECTBOUNDS
;
if
(
LISTVIEW_GetItemRect
(
infoPtr
,
i
,
&
rcItem
))
...
...
@@ -2335,7 +2253,7 @@ static BOOL set_main_item(LISTVIEW_INFO *infoPtr, LPLVITEMW lpLVItem, BOOL isW)
nmlv
.
uNewState
=
lpLVItem
->
state
;
nmlv
.
uOldState
=
oldState
;
nmlv
.
uChanged
=
LVIF_STATE
;
listview_notify
(
infoPtr
,
LVN_ITEMCHANGED
,
&
nmlv
);
notify_listview
(
infoPtr
,
LVN_ITEMCHANGED
,
&
nmlv
);
return
TRUE
;
}
...
...
@@ -2376,7 +2294,7 @@ static BOOL set_main_item(LISTVIEW_INFO *infoPtr, LPLVITEMW lpLVItem, BOOL isW)
nmlv
.
lParam
=
lpItem
->
lParam
;
/* send LVN_ITEMCHANGING notification, if the item is not being inserted */
if
(
lpItem
->
valid
&&
listview_notify
(
infoPtr
,
LVN_ITEMCHANGING
,
&
nmlv
))
if
(
lpItem
->
valid
&&
notify_listview
(
infoPtr
,
LVN_ITEMCHANGING
,
&
nmlv
))
return
FALSE
;
/* copy information */
...
...
@@ -2429,7 +2347,7 @@ static BOOL set_main_item(LISTVIEW_INFO *infoPtr, LPLVITEMW lpLVItem, BOOL isW)
/* send LVN_ITEMCHANGED notification */
nmlv
.
lParam
=
lpItem
->
lParam
;
listview_notify
(
infoPtr
,
LVN_ITEMCHANGED
,
&
nmlv
);
notify_listview
(
infoPtr
,
LVN_ITEMCHANGED
,
&
nmlv
);
return
TRUE
;
}
...
...
@@ -2623,11 +2541,10 @@ static void LISTVIEW_DrawSubItem(LISTVIEW_INFO *infoPtr, HDC hdc, INT nItem, INT
nItem
,
nSubItem
);
/* get information needed for drawing the item */
ZeroMemory
(
&
lvItem
,
sizeof
(
lvItem
));
lvItem
.
mask
=
LVIF_TEXT
;
lvItem
.
iItem
=
nItem
;
lvItem
.
iSubItem
=
nSubItem
;
lvItem
.
cchTextMax
=
DISP_TEXT_SIZE
;
lvItem
.
cchTextMax
=
COUNTOF
(
szDispText
)
;
lvItem
.
pszText
=
szDispText
;
*
lvItem
.
pszText
=
'\0'
;
LISTVIEW_GetItemW
(
infoPtr
,
&
lvItem
,
TRUE
);
...
...
@@ -3099,158 +3016,145 @@ static void LISTVIEW_DrawLargeItem(LISTVIEW_INFO *infoPtr, HDC hdc, INT nItem, R
*/
static
void
LISTVIEW_RefreshReport
(
LISTVIEW_INFO
*
infoPtr
,
HDC
hdc
,
DWORD
cdmode
)
{
SCROLLINFO
scrollInfo
;
INT
nDrawPosY
=
infoPtr
->
rcList
.
top
;
INT
nColumnCount
;
RECT
rcItem
,
rcFull
,
*
lprcFocus
;
INT
j
;
INT
nItem
;
INT
nLast
;
BOOL
FullSelected
;
DWORD
cditemmode
=
CDRF_DODEFAULT
;
LONG
lStyle
=
GetWindowLongW
(
infoPtr
->
hwndSelf
,
GWL_STYLE
);
INT
scrollOffset
;
TRACE
(
"
\n
"
);
nItem
=
ListView_GetTopIndex
(
infoPtr
->
hwndSelf
);
/* add 1 for displaying a partial item at the bottom */
nLast
=
min
(
nItem
+
LISTVIEW_GetCountPerColumn
(
infoPtr
)
+
1
,
GETITEMCOUNT
(
infoPtr
));
/* send cache hint notification */
if
(
lStyle
&
LVS_OWNERDATA
)
{
NMLVCACHEHINT
nmlv
;
nmlv
.
hdr
.
hwndFrom
=
infoPtr
->
hwndSelf
;
nmlv
.
hdr
.
idFrom
=
GetWindowLongW
(
infoPtr
->
hwndSelf
,
GWL_ID
);
nmlv
.
hdr
.
code
=
LVN_ODCACHEHINT
;
nmlv
.
iFrom
=
nItem
;
nmlv
.
iTo
=
nLast
;
SendMessageW
(
GetParent
(
infoPtr
->
hwndSelf
),
WM_NOTIFY
,
(
WPARAM
)
nmlv
.
hdr
.
idFrom
,
(
LPARAM
)
&
nmlv
);
}
nColumnCount
=
Header_GetItemCount
(
infoPtr
->
hwndHeader
);
infoPtr
->
nColumnCount
=
nColumnCount
;
/* update nColumnCount */
FullSelected
=
infoPtr
->
dwExStyle
&
LVS_EX_FULLROWSELECT
;
/* nothing to draw */
if
(
GETITEMCOUNT
(
infoPtr
)
==
0
)
return
;
SCROLLINFO
scrollInfo
;
INT
rgntype
,
scrollOffset
,
nDrawPosY
,
j
;
INT
nTop
,
nItem
,
nLast
,
nUpdateHeight
,
nUpdateWidth
;
INT
nColumnCount
,
nFirstCol
,
nLastCol
;
RECT
rcItem
,
rcClip
,
*
lprcFocus
,
*
lprcCols
;
BOOL
bFullSelected
;
DWORD
cditemmode
=
CDRF_DODEFAULT
;
LONG
lStyle
=
GetWindowLongW
(
infoPtr
->
hwndSelf
,
GWL_STYLE
);
UINT
uID
=
GetWindowLongW
(
infoPtr
->
hwndSelf
,
GWL_ID
);
/* if we have focus, precompute full select rect, if need be */
if
(
infoPtr
->
bFocus
&&
FullSelected
)
{
RECT
br
;
TRACE
(
"
\n
"
);
Header_GetItemRect
(
infoPtr
->
hwndHeader
,
0
,
&
rcFull
);
Header_GetItemRect
(
infoPtr
->
hwndHeader
,
nColumnCount
-
1
,
&
br
)
;
/* nothing to draw */
if
(
GETITEMCOUNT
(
infoPtr
)
==
0
)
return
;
rcFull
.
left
+=
REPORT_MARGINX
;
rcFull
.
right
=
max
(
rcFull
.
left
,
br
.
right
-
REPORT_MARGINX
);
}
/* figure out what to draw */
rgntype
=
GetClipBox
(
hdc
,
&
rcClip
);
if
(
rgntype
==
NULLREGION
)
return
;
nUpdateHeight
=
rcClip
.
bottom
-
rcClip
.
top
+
1
;
nUpdateWidth
=
rcClip
.
right
-
rcClip
.
left
;
nTop
=
LISTVIEW_GetTopIndex
(
infoPtr
);
nItem
=
nTop
+
(
rcClip
.
top
-
infoPtr
->
rcList
.
top
)
/
infoPtr
->
nItemHeight
;
nLast
=
nItem
+
nUpdateHeight
/
infoPtr
->
nItemHeight
;
if
(
nUpdateHeight
%
infoPtr
->
nItemHeight
)
nLast
++
;
/* send cache hint notification */
if
(
lStyle
&
LVS_OWNERDATA
)
notify_odcachehint
(
infoPtr
,
nItem
,
nLast
);
/* cache column info */
nColumnCount
=
Header_GetItemCount
(
infoPtr
->
hwndHeader
);
infoPtr
->
nColumnCount
=
nColumnCount
;
/* update nColumnCount */
lprcCols
=
COMCTL32_Alloc
(
nColumnCount
*
sizeof
(
RECT
));
if
(
!
lprcCols
)
return
;
for
(
j
=
0
;
j
<
nColumnCount
;
j
++
)
Header_GetItemRect
(
infoPtr
->
hwndHeader
,
j
,
&
lprcCols
[
j
]);
/* Get scroll bar info once before loop */
ZeroMemory
(
&
scrollInfo
,
sizeof
(
SCROLLINFO
));
scrollInfo
.
cbSize
=
sizeof
(
SCROLLINFO
);
scrollInfo
.
fMask
=
SIF_POS
;
GetScrollInfo
(
infoPtr
->
hwndSelf
,
SB_HORZ
,
&
scrollInfo
);
scrollOffset
=
scrollInfo
.
nPos
;
for
(;
nItem
<
nLast
;
nItem
++
)
{
/* Do Owner Draw */
if
(
lStyle
&
LVS_OWNERDRAWFIXED
)
/* Get scroll bar info once before loop */
ZeroMemory
(
&
scrollInfo
,
sizeof
(
SCROLLINFO
));
scrollInfo
.
cbSize
=
sizeof
(
SCROLLINFO
);
scrollInfo
.
fMask
=
SIF_POS
;
GetScrollInfo
(
infoPtr
->
hwndSelf
,
SB_HORZ
,
&
scrollInfo
);
scrollOffset
=
scrollInfo
.
nPos
;
/* we now narrow the columns as well */
nLastCol
=
nColumnCount
-
1
;
for
(
nFirstCol
=
0
;
nFirstCol
<
nColumnCount
;
nFirstCol
++
)
if
(
lprcCols
[
nFirstCol
].
right
-
scrollOffset
>=
rcClip
.
left
)
break
;
for
(
nLastCol
=
nColumnCount
-
1
;
nLastCol
>=
0
;
nLastCol
--
)
if
(
lprcCols
[
nLastCol
].
left
-
scrollOffset
<
rcClip
.
right
)
break
;
/* a last few bits before we start drawing */
TRACE
(
"nTop=%d, nItem=%d, nLast=%d, nFirstCol=%d, nLastCol=%d
\n
"
,
nTop
,
nItem
,
nLast
,
nFirstCol
,
nLastCol
);
bFullSelected
=
infoPtr
->
dwExStyle
&
LVS_EX_FULLROWSELECT
;
nDrawPosY
=
infoPtr
->
rcList
.
top
+
(
nItem
-
nTop
)
*
infoPtr
->
nItemHeight
;
/* iterate through the invalidated rows */
for
(;
nItem
<
nLast
;
nItem
++
,
nDrawPosY
+=
infoPtr
->
nItemHeight
)
{
UINT
uID
=
GetWindowLongW
(
infoPtr
->
hwndSelf
,
GWL_ID
);
DRAWITEMSTRUCT
dis
;
LVITEMW
item
;
RECT
br
;
TRACE
(
"Owner Drawn
\n
"
);
dis
.
CtlType
=
ODT_LISTVIEW
;
dis
.
CtlID
=
uID
;
dis
.
itemID
=
nItem
;
dis
.
itemAction
=
ODA_DRAWENTIRE
;
dis
.
itemState
=
0
;
if
(
LISTVIEW_GetItemState
(
infoPtr
,
nItem
,
LVIS_SELECTED
))
dis
.
itemState
|=
ODS_SELECTED
;
if
(
LISTVIEW_GetItemState
(
infoPtr
,
nItem
,
LVIS_FOCUSED
))
dis
.
itemState
|=
ODS_FOCUS
;
dis
.
hwndItem
=
infoPtr
->
hwndSelf
;
dis
.
hDC
=
hdc
;
Header_GetItemRect
(
infoPtr
->
hwndHeader
,
nColumnCount
-
1
,
&
br
);
dis
.
rcItem
.
left
=
-
scrollOffset
;
dis
.
rcItem
.
right
=
max
(
dis
.
rcItem
.
left
,
br
.
right
-
scrollOffset
);
dis
.
rcItem
.
top
=
nDrawPosY
;
dis
.
rcItem
.
bottom
=
dis
.
rcItem
.
top
+
infoPtr
->
nItemHeight
;
ZeroMemory
(
&
item
,
sizeof
(
item
));
item
.
iItem
=
nItem
;
item
.
mask
=
LVIF_PARAM
;
ListView_GetItemW
(
infoPtr
->
hwndSelf
,
&
item
);
dis
.
itemData
=
item
.
lParam
;
if
(
SendMessageW
(
GetParent
(
infoPtr
->
hwndSelf
),
WM_DRAWITEM
,(
WPARAM
)
uID
,(
LPARAM
)
&
dis
))
{
nDrawPosY
+=
infoPtr
->
nItemHeight
;
continue
;
/* if owner wants to take a first stab at it, have it his way... */
if
(
lStyle
&
LVS_OWNERDRAWFIXED
)
{
DRAWITEMSTRUCT
dis
;
LVITEMW
item
;
TRACE
(
"Owner Drawn
\n
"
);
dis
.
CtlType
=
ODT_LISTVIEW
;
dis
.
CtlID
=
uID
;
dis
.
itemID
=
nItem
;
dis
.
itemAction
=
ODA_DRAWENTIRE
;
dis
.
itemState
=
0
;
if
(
LISTVIEW_GetItemState
(
infoPtr
,
nItem
,
LVIS_SELECTED
))
dis
.
itemState
|=
ODS_SELECTED
;
if
(
LISTVIEW_GetItemState
(
infoPtr
,
nItem
,
LVIS_FOCUSED
))
dis
.
itemState
|=
ODS_FOCUS
;
dis
.
hwndItem
=
infoPtr
->
hwndSelf
;
dis
.
hDC
=
hdc
;
dis
.
rcItem
.
left
=
lprcCols
[
0
].
left
;
dis
.
rcItem
.
right
=
lprcCols
[
nColumnCount
-
1
].
right
;
dis
.
rcItem
.
top
=
nDrawPosY
;
dis
.
rcItem
.
bottom
=
dis
.
rcItem
.
top
+
infoPtr
->
nItemHeight
;
OffsetRect
(
&
dis
.
rcItem
,
-
scrollOffset
,
0
);
item
.
iItem
=
nItem
;
item
.
iSubItem
=
0
;
item
.
mask
=
LVIF_PARAM
;
dis
.
itemData
=
LISTVIEW_GetItemW
(
infoPtr
,
&
item
,
TRUE
)
?
item
.
lParam
:
0
;
if
(
SendMessageW
(
GetParent
(
infoPtr
->
hwndSelf
),
WM_DRAWITEM
,
uID
,
(
LPARAM
)
&
dis
))
continue
;
}
}
/* if we have focus, calculate focus rect */
if
(
infoPtr
->
bFocus
&&
LISTVIEW_GetItemState
(
infoPtr
,
nItem
,
LVIS_FOCUSED
))
lprcFocus
=
&
infoPtr
->
rcFocus
;
else
lprcFocus
=
0
;
for
(
j
=
0
;
j
<
nColumnCount
;
j
++
)
{
if
(
cdmode
&
CDRF_NOTIFYITEMDRAW
)
cditemmode
=
LISTVIEW_SendCustomDrawItemNotify
(
infoPtr
,
hdc
,
nItem
,
j
,
CDDS_ITEMPREPAINT
);
if
(
cditemmode
&
CDRF_SKIPDEFAULT
)
continue
;
Header_GetItemRect
(
infoPtr
->
hwndHeader
,
j
,
&
rcItem
);
rcItem
.
left
+=
REPORT_MARGINX
;
rcItem
.
right
=
max
(
rcItem
.
left
,
rcItem
.
right
-
REPORT_MARGINX
);
rcItem
.
top
=
nDrawPosY
;
rcItem
.
bottom
=
rcItem
.
top
+
infoPtr
->
nItemHeight
;
/* if we have focus, mark to calculate focus rect */
if
(
infoPtr
->
bFocus
&&
LISTVIEW_GetItemState
(
infoPtr
,
nItem
,
LVIS_FOCUSED
))
lprcFocus
=
&
infoPtr
->
rcFocus
;
else
lprcFocus
=
0
;
/* Offset the Scroll Bar Pos */
rcItem
.
left
-=
scrollOffset
;
rcItem
.
right
-=
scrollOffset
;
/* iterate through the invalidated columns */
for
(
j
=
nFirstCol
;
j
<=
nLastCol
;
j
++
)
{
if
(
cdmode
&
CDRF_NOTIFYITEMDRAW
)
cditemmode
=
notify_customdrawitem
(
infoPtr
,
hdc
,
nItem
,
j
,
CDDS_ITEMPREPAINT
);
if
(
cditemmode
&
CDRF_SKIPDEFAULT
)
continue
;
rcItem
=
lprcCols
[
j
];
rcItem
.
left
+=
REPORT_MARGINX
;
rcItem
.
right
=
max
(
rcItem
.
left
,
rcItem
.
right
-
REPORT_MARGINX
);
rcItem
.
top
=
nDrawPosY
;
rcItem
.
bottom
=
rcItem
.
top
+
infoPtr
->
nItemHeight
;
/* Offset the Scroll Bar Pos */
OffsetRect
(
&
rcItem
,
-
scrollOffset
,
0
);
if
(
j
==
0
)
LISTVIEW_DrawItem
(
infoPtr
,
hdc
,
nItem
,
rcItem
,
bFullSelected
,
lprcFocus
);
else
LISTVIEW_DrawSubItem
(
infoPtr
,
hdc
,
nItem
,
j
,
rcItem
,
bFullSelected
);
if
(
j
==
0
)
LISTVIEW_DrawItem
(
infoPtr
,
hdc
,
nItem
,
rcItem
,
FullSelected
,
lprcFocus
);
else
LISTVIEW_DrawSubItem
(
infoPtr
,
hdc
,
nItem
,
j
,
rcItem
,
FullSelected
);
if
(
cditemmode
&
CDRF_NOTIFYPOSTPAINT
)
notify_customdrawitem
(
infoPtr
,
hdc
,
nItem
,
0
,
CDDS_ITEMPOSTPAINT
);
}
if
(
cditemmode
&
CDRF_NOTIFYPOSTPAINT
)
LISTVIEW_SendCustomDrawItemNotify
(
infoPtr
,
hdc
,
nItem
,
0
,
CDDS_ITEMPOSTPAINT
);
}
/* Adjust focus if we have it, and we are in full select */
if
(
lprcFocus
&&
FullSelected
)
{
rcFull
.
top
=
nDrawPosY
;
rcFull
.
bottom
=
rcFull
.
top
+
infoPtr
->
nItemHeight
;
infoPtr
->
rcFocus
=
rcFull
;
/* Adjust focus if we have it, and we are in full select */
if
(
lprcFocus
&&
bFullSelected
)
{
infoPtr
->
rcFocus
.
left
=
lprcCols
[
0
].
left
+
REPORT_MARGINX
;
infoPtr
->
rcFocus
.
right
=
max
(
infoPtr
->
rcFocus
.
left
,
lprcCols
[
nColumnCount
-
1
].
right
-
REPORT_MARGINX
);
infoPtr
->
rcFocus
.
top
=
nDrawPosY
;
infoPtr
->
rcFocus
.
bottom
=
infoPtr
->
rcFocus
.
top
+
infoPtr
->
nItemHeight
;
}
}
nDrawPosY
+=
infoPtr
->
nItemHeight
;
}
COMCTL32_Free
(
lprcCols
);
}
/***
...
...
@@ -3297,7 +3201,7 @@ static void LISTVIEW_RefreshList(LISTVIEW_INFO *infoPtr, HDC hdc, DWORD cdmode)
return
;
if
(
cdmode
&
CDRF_NOTIFYITEMDRAW
)
cditemmode
=
LISTVIEW_SendCustomDrawItemNotify
(
infoPtr
,
hdc
,
nItem
,
0
,
cditemmode
=
notify_customdrawitem
(
infoPtr
,
hdc
,
nItem
,
0
,
CDDS_ITEMPREPAINT
);
if
(
cditemmode
&
CDRF_SKIPDEFAULT
)
continue
;
...
...
@@ -3316,7 +3220,7 @@ static void LISTVIEW_RefreshList(LISTVIEW_INFO *infoPtr, HDC hdc, DWORD cdmode)
LISTVIEW_DrawItem
(
infoPtr
,
hdc
,
nItem
,
rcItem
,
FALSE
,
lprcFocus
);
if
(
cditemmode
&
CDRF_NOTIFYPOSTPAINT
)
LISTVIEW_SendCustomDrawItemNotify
(
infoPtr
,
hdc
,
nItem
,
0
,
notify_customdrawitem
(
infoPtr
,
hdc
,
nItem
,
0
,
CDDS_ITEMPOSTPAINT
);
}
...
...
@@ -3354,7 +3258,7 @@ static void LISTVIEW_RefreshIcon(LISTVIEW_INFO *infoPtr, HDC hdc, BOOL bSmall, D
for
(
i
=
0
;
i
<
GETITEMCOUNT
(
infoPtr
);
i
++
)
{
if
(
cdmode
&
CDRF_NOTIFYITEMDRAW
)
cditemmode
=
LISTVIEW_SendCustomDrawItemNotify
(
infoPtr
,
hdc
,
i
,
0
,
cditemmode
=
notify_customdrawitem
(
infoPtr
,
hdc
,
i
,
0
,
CDDS_ITEMPREPAINT
);
if
(
cditemmode
&
CDRF_SKIPDEFAULT
)
continue
;
...
...
@@ -3391,7 +3295,7 @@ static void LISTVIEW_RefreshIcon(LISTVIEW_INFO *infoPtr, HDC hdc, BOOL bSmall, D
}
}
if
(
cditemmode
&
CDRF_NOTIFYPOSTPAINT
)
LISTVIEW_SendCustomDrawItemNotify
(
infoPtr
,
hdc
,
i
,
0
,
notify_customdrawitem
(
infoPtr
,
hdc
,
i
,
0
,
CDDS_ITEMPOSTPAINT
);
}
}
...
...
@@ -3418,7 +3322,7 @@ static void LISTVIEW_Refresh(LISTVIEW_INFO *infoPtr, HDC hdc)
GetClientRect
(
infoPtr
->
hwndSelf
,
&
rcClient
);
cdmode
=
LISTVIEW_SendCustomDrawNotify
(
infoPtr
,
CDDS_PREPAINT
,
hdc
,
rcClient
);
cdmode
=
notify_customdraw
(
infoPtr
,
CDDS_PREPAINT
,
hdc
,
rcClient
);
if
(
cdmode
==
CDRF_SKIPDEFAULT
)
return
;
infoPtr
->
bIsDrawing
=
TRUE
;
...
...
@@ -3448,7 +3352,7 @@ static void LISTVIEW_Refresh(LISTVIEW_INFO *infoPtr, HDC hdc)
SelectObject
(
hdc
,
hOldFont
);
if
(
cdmode
&
CDRF_NOTIFYPOSTPAINT
)
LISTVIEW_SendCustomDrawNotify
(
infoPtr
,
CDDS_POSTPAINT
,
hdc
,
rcClient
);
notify_customdraw
(
infoPtr
,
CDDS_POSTPAINT
,
hdc
,
rcClient
);
infoPtr
->
bIsDrawing
=
FALSE
;
}
...
...
@@ -3607,7 +3511,7 @@ static LRESULT LISTVIEW_DeleteAllItems(LISTVIEW_INFO *infoPtr)
suppressed */
ZeroMemory
(
&
nmlv
,
sizeof
(
NMLISTVIEW
));
nmlv
.
iItem
=
-
1
;
bSuppress
=
listview_notify
(
infoPtr
,
LVN_DELETEALLITEMS
,
&
nmlv
);
bSuppress
=
notify_listview
(
infoPtr
,
LVN_DELETEALLITEMS
,
&
nmlv
);
for
(
i
=
0
;
i
<
GETITEMCOUNT
(
infoPtr
);
i
++
)
{
...
...
@@ -3636,7 +3540,7 @@ static LRESULT LISTVIEW_DeleteAllItems(LISTVIEW_INFO *infoPtr)
/* send LVN_DELETEITEM notification */
nmlv
.
iItem
=
i
;
nmlv
.
lParam
=
lpItem
->
lParam
;
listview_notify
(
infoPtr
,
LVN_DELETEITEM
,
&
nmlv
);
notify_listview
(
infoPtr
,
LVN_DELETEITEM
,
&
nmlv
);
}
/* free item string */
...
...
@@ -3882,7 +3786,7 @@ static BOOL LISTVIEW_EndEditLabelT(LISTVIEW_INFO *infoPtr, LPWSTR pszText, BOOL
dispInfo
.
item
.
lParam
=
lpItem
->
lParam
;
/* Do we need to update the Item Text */
if
(
dispinfo_notify
T
(
infoPtr
,
LVN_ENDLABELEDITW
,
&
dispInfo
,
isW
))
if
(
notify_dispinfo
T
(
infoPtr
,
LVN_ENDLABELEDITW
,
&
dispInfo
,
isW
))
if
(
lpItem
->
hdr
.
pszText
!=
LPSTR_TEXTCALLBACKW
&&
!
(
lStyle
&
LVS_OWNERDATA
))
bResult
=
textsetptrT
(
&
lpItem
->
hdr
.
pszText
,
pszText
,
isW
);
...
...
@@ -3974,7 +3878,7 @@ static HWND LISTVIEW_EditLabelT(LISTVIEW_INFO *infoPtr, INT nItem, BOOL isW)
dispInfo
.
item
.
iImage
=
lpItem
->
hdr
.
iImage
;
dispInfo
.
item
.
lParam
=
lpItem
->
lParam
;
if
(
dispinfo_notify
T
(
infoPtr
,
LVN_BEGINLABELEDITW
,
&
dispInfo
,
isW
))
if
(
notify_dispinfo
T
(
infoPtr
,
LVN_BEGINLABELEDITW
,
&
dispInfo
,
isW
))
return
0
;
rect
.
left
=
LVIR_LABEL
;
...
...
@@ -4569,7 +4473,7 @@ static LRESULT LISTVIEW_GetImageList(LISTVIEW_INFO *infoPtr, INT nImageList)
*/
static
inline
BOOL
is_item_selected
(
LISTVIEW_INFO
*
infoPtr
,
INT
nItem
)
{
LISTVIEW_SELECTION
selection
=
{
nItem
,
nItem
};
RANGE
selection
=
{
nItem
,
nItem
};
return
DPA_Search
(
infoPtr
->
hdpaSelectionRanges
,
&
selection
,
0
,
LISTVIEW_CompareSelectionRanges
,
0
,
DPAS_SORTED
)
!=
-
1
;
...
...
@@ -4591,7 +4495,7 @@ static inline BOOL is_item_selected(LISTVIEW_INFO *infoPtr, INT nItem)
* SUCCESS : TRUE
* FAILURE : FALSE
*/
static
LRESULT
LISTVIEW_GetItemT
(
LISTVIEW_INFO
*
infoPtr
,
LPLVITEMW
lpLVItem
,
BOOL
internal
,
BOOL
isW
)
static
BOOL
LISTVIEW_GetItemT
(
LISTVIEW_INFO
*
infoPtr
,
LPLVITEMW
lpLVItem
,
BOOL
internal
,
BOOL
isW
)
{
NMLVDISPINFOW
dispInfo
;
LISTVIEW_ITEM
*
lpItem
;
...
...
@@ -4642,7 +4546,7 @@ static LRESULT LISTVIEW_GetItemT(LISTVIEW_INFO *infoPtr, LPLVITEMW lpLVItem, BOO
{
memcpy
(
&
dispInfo
.
item
,
lpLVItem
,
sizeof
(
LVITEMW
));
dispInfo
.
item
.
stateMask
&=
infoPtr
->
uCallbackMask
;
dispinfo_notify
T
(
infoPtr
,
LVN_GETDISPINFOW
,
&
dispInfo
,
isW
);
notify_dispinfo
T
(
infoPtr
,
LVN_GETDISPINFOW
,
&
dispInfo
,
isW
);
memcpy
(
lpLVItem
,
&
dispInfo
.
item
,
sizeof
(
LVITEMW
));
TRACE
(
" getdispinfo(1):lpLVItem=%s
\n
"
,
debuglvitem_t
(
lpLVItem
,
isW
));
}
...
...
@@ -4713,7 +4617,7 @@ static LRESULT LISTVIEW_GetItemT(LISTVIEW_INFO *infoPtr, LPLVITEMW lpLVItem, BOO
dispInfo
.
item
.
iItem
=
lpLVItem
->
iItem
;
dispInfo
.
item
.
iSubItem
=
lpLVItem
->
iSubItem
;
dispInfo
.
item
.
lParam
=
lpItem
->
lParam
;
dispinfo_notify
T
(
infoPtr
,
LVN_GETDISPINFOW
,
&
dispInfo
,
isW
);
notify_dispinfo
T
(
infoPtr
,
LVN_GETDISPINFOW
,
&
dispInfo
,
isW
);
TRACE
(
" getdispinfo(2):item=%s
\n
"
,
debuglvitem_t
(
&
dispInfo
.
item
,
isW
));
}
...
...
@@ -5116,7 +5020,7 @@ static void LISTVIEW_UpdateLargeItemLabelRect (LISTVIEW_INFO *infoPtr, int nItem
* is the one with the focus. Ensure that the control's record of which
* item has the focus agrees with the items' records.
*/
static
LRESULT
LISTVIEW_GetItemRect
(
LISTVIEW_INFO
*
infoPtr
,
INT
nItem
,
LPRECT
lprc
)
static
BOOL
LISTVIEW_GetItemRect
(
LISTVIEW_INFO
*
infoPtr
,
INT
nItem
,
LPRECT
lprc
)
{
UINT
uView
=
LISTVIEW_GetType
(
infoPtr
);
BOOL
bResult
=
FALSE
;
...
...
@@ -5495,7 +5399,7 @@ static LRESULT LISTVIEW_GetItemRect(LISTVIEW_INFO *infoPtr, INT nItem, LPRECT lp
}
static
LRESULT
LISTVIEW_GetSubItemRect
(
LISTVIEW_INFO
*
infoPtr
,
INT
nItem
,
INT
nSubItem
,
INT
static
BOOL
LISTVIEW_GetSubItemRect
(
LISTVIEW_INFO
*
infoPtr
,
INT
nItem
,
INT
nSubItem
,
INT
flags
,
LPRECT
lprc
)
{
UINT
uView
=
LISTVIEW_GetType
(
infoPtr
);
...
...
@@ -5809,7 +5713,7 @@ static LRESULT LISTVIEW_GetNextItem(LISTVIEW_INFO *infoPtr, INT nItem, UINT uFla
* SUCCESS : TRUE
* FAILURE : FALSE
*/
static
LRESULT
LISTVIEW_GetOrigin
(
LISTVIEW_INFO
*
infoPtr
,
LPPOINT
lpptOrigin
)
static
BOOL
LISTVIEW_GetOrigin
(
LISTVIEW_INFO
*
infoPtr
,
LPPOINT
lpptOrigin
)
{
LONG
lStyle
=
GetWindowLongW
(
infoPtr
->
hwndSelf
,
GWL_STYLE
);
UINT
uView
=
lStyle
&
LVS_TYPEMASK
;
...
...
@@ -6383,7 +6287,7 @@ static LRESULT LISTVIEW_InsertItemT(LISTVIEW_INFO *infoPtr, LPLVITEMW lpLVItem,
ZeroMemory
(
&
nmlv
,
sizeof
(
NMLISTVIEW
));
nmlv
.
iItem
=
nItem
;
nmlv
.
lParam
=
lpItem
->
lParam
;
listview_notify
(
infoPtr
,
LVN_INSERTITEM
,
&
nmlv
);
notify_listview
(
infoPtr
,
LVN_INSERTITEM
,
&
nmlv
);
/* align items (set position of each item) */
if
((
uView
==
LVS_SMALLICON
)
||
(
uView
==
LVS_ICON
))
...
...
@@ -7047,7 +6951,7 @@ static BOOL LISTVIEW_SetItemCount(LISTVIEW_INFO *infoPtr, INT nItems, DWORD dwFl
*/
do
{
LISTVIEW_SELECTION
*
selection
;
RANGE
*
selection
;
selection
=
DPA_GetPtr
(
infoPtr
->
hdpaSelectionRanges
,
0
);
if
(
selection
)
LISTVIEW_RemoveSelectionRange
(
infoPtr
,
selection
->
lower
,
...
...
@@ -8055,7 +7959,7 @@ static LRESULT LISTVIEW_LButtonDblClk(LISTVIEW_INFO *infoPtr, WORD wKey, POINTS
}
nmlv
.
ptAction
.
x
=
pts
.
x
;
nmlv
.
ptAction
.
y
=
pts
.
y
;
listview_notify
(
infoPtr
,
NM_DBLCLK
,
&
nmlv
);
notify_listview
(
infoPtr
,
NM_DBLCLK
,
&
nmlv
);
/* To send the LVN_ITEMACTIVATE, it must be on an Item */
...
...
@@ -8195,7 +8099,7 @@ static LRESULT LISTVIEW_LButtonUp(LISTVIEW_INFO *infoPtr, WORD wKey, POINTS pts)
}
nmlv
.
ptAction
.
x
=
pts
.
x
;
nmlv
.
ptAction
.
y
=
pts
.
y
;
listview_notify
(
infoPtr
,
NM_CLICK
,
&
nmlv
);
notify_listview
(
infoPtr
,
NM_CLICK
,
&
nmlv
);
/* set left button flag */
infoPtr
->
bLButtonDown
=
FALSE
;
...
...
@@ -8300,7 +8204,7 @@ static LRESULT LISTVIEW_Notify(LISTVIEW_INFO *infoPtr, INT nCtrlId, LPNMHDR lpnm
ZeroMemory
(
&
nmlv
,
sizeof
(
NMLISTVIEW
));
nmlv
.
iItem
=
-
1
;
nmlv
.
iSubItem
=
((
LPNMHEADERW
)
lpnmh
)
->
iItem
;
listview_notify
(
infoPtr
,
LVN_COLUMNCLICK
,
&
nmlv
);
notify_listview
(
infoPtr
,
LVN_COLUMNCLICK
,
&
nmlv
);
}
else
if
(
lpnmh
->
code
==
NM_RELEASEDCAPTURE
)
{
...
...
@@ -8464,7 +8368,7 @@ static LRESULT LISTVIEW_RButtonDown(LISTVIEW_INFO *infoPtr, WORD wKey, POINTS pt
}
nmlv
.
ptAction
.
x
=
pts
.
x
;
nmlv
.
ptAction
.
y
=
pts
.
y
;
listview_notify
(
infoPtr
,
NM_RCLICK
,
&
nmlv
);
notify_listview
(
infoPtr
,
NM_RCLICK
,
&
nmlv
);
return
0
;
}
...
...
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