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
7e65349c
Commit
7e65349c
authored
Aug 18, 2010
by
David Hedberg
Committed by
Alexandre Julliard
Aug 18, 2010
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
explorerframe: Implement SetItemState and GetItemState.
parent
4507905f
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
724 additions
and
4 deletions
+724
-4
nstc.c
dlls/explorerframe/nstc.c
+128
-4
msg.h
dlls/explorerframe/tests/msg.h
+116
-0
nstc.c
dlls/explorerframe/tests/nstc.c
+480
-0
No files found.
dlls/explorerframe/nstc.c
View file @
7e65349c
...
...
@@ -254,6 +254,53 @@ static nstc_root *root_for_treeitem(NSTC2Impl *This, HTREEITEM hitem)
return
root
;
}
/* Find a shellitem in the tree, starting from the given node. */
static
HTREEITEM
search_for_shellitem
(
NSTC2Impl
*
This
,
HTREEITEM
node
,
IShellItem
*
psi
)
{
IShellItem
*
psi_node
;
HTREEITEM
next
,
result
=
NULL
;
HRESULT
hr
;
int
cmpo
;
TRACE
(
"%p, %p, %p
\n
"
,
This
,
node
,
psi
);
/* Check this node */
psi_node
=
shellitem_from_treeitem
(
This
,
node
);
hr
=
IShellItem_Compare
(
psi
,
psi_node
,
SICHINT_DISPLAY
,
&
cmpo
);
if
(
hr
==
S_OK
)
return
node
;
/* Any children? */
next
=
(
HTREEITEM
)
SendMessageW
(
This
->
hwnd_tv
,
TVM_GETNEXTITEM
,
TVGN_CHILD
,
(
LPARAM
)
node
);
if
(
next
)
{
result
=
search_for_shellitem
(
This
,
next
,
psi
);
if
(
result
)
return
result
;
}
/* Try our next sibling. */
next
=
(
HTREEITEM
)
SendMessageW
(
This
->
hwnd_tv
,
TVM_GETNEXTITEM
,
TVGN_NEXT
,
(
LPARAM
)
node
);
if
(
next
)
result
=
search_for_shellitem
(
This
,
next
,
psi
);
return
result
;
}
static
HTREEITEM
treeitem_from_shellitem
(
NSTC2Impl
*
This
,
IShellItem
*
psi
)
{
HTREEITEM
root
;
TRACE
(
"%p, %p
\n
"
,
This
,
psi
);
root
=
(
HTREEITEM
)
SendMessageW
(
This
->
hwnd_tv
,
TVM_GETNEXTITEM
,
TVGN_ROOT
,
0
);
if
(
!
root
)
return
NULL
;
return
search_for_shellitem
(
This
,
root
,
psi
);
}
static
int
get_icon
(
LPCITEMIDLIST
lpi
,
UINT
extra_flags
)
{
SHFILEINFOW
sfi
;
...
...
@@ -1070,8 +1117,61 @@ static HRESULT WINAPI NSTC2_fnSetItemState(INameSpaceTreeControl2* iface,
NSTCITEMSTATE
nstcisFlags
)
{
NSTC2Impl
*
This
=
(
NSTC2Impl
*
)
iface
;
FIXME
(
"stub, %p (%p, %x, %x)
\n
"
,
This
,
psi
,
nstcisMask
,
nstcisFlags
);
return
E_NOTIMPL
;
TVITEMEXW
tvi
;
HTREEITEM
hitem
;
TRACE
(
"%p (%p, %x, %x)
\n
"
,
This
,
psi
,
nstcisMask
,
nstcisFlags
);
hitem
=
treeitem_from_shellitem
(
This
,
psi
);
if
(
!
hitem
)
return
E_INVALIDARG
;
/* Passing both NSTCIS_SELECTED and NSTCIS_SELECTEDNOEXPAND results
in two TVM_SETITEMW's */
if
((
nstcisMask
&
nstcisFlags
)
&
NSTCIS_SELECTED
)
{
SendMessageW
(
This
->
hwnd_tv
,
TVM_SELECTITEM
,
TVGN_CARET
,
(
LPARAM
)
hitem
);
SendMessageW
(
This
->
hwnd_tv
,
TVM_ENSUREVISIBLE
,
0
,
(
LPARAM
)
hitem
);
}
if
((
nstcisMask
&
nstcisFlags
)
&
NSTCIS_SELECTEDNOEXPAND
)
{
SendMessageW
(
This
->
hwnd_tv
,
TVM_SELECTITEM
,
TVGN_CARET
|
TVSI_NOSINGLEEXPAND
,
(
LPARAM
)
hitem
);
}
/* If NSTCIS_EXPANDED is among the flags, the mask is ignored. */
if
((
nstcisMask
|
nstcisFlags
)
&
NSTCIS_EXPANDED
)
{
WPARAM
arg
=
nstcisFlags
&
NSTCIS_EXPANDED
?
TVE_EXPAND
:
TVE_COLLAPSE
;
SendMessageW
(
This
->
hwnd_tv
,
TVM_EXPAND
,
arg
,
(
LPARAM
)
hitem
);
}
if
(
nstcisMask
&
NSTCIS_DISABLED
)
tvi
.
mask
=
TVIF_STATE
|
TVIF_STATEEX
;
else
if
(
((
nstcisMask
^
nstcisFlags
)
&
(
NSTCIS_SELECTED
|
NSTCIS_EXPANDED
|
NSTCIS_SELECTEDNOEXPAND
))
||
((
nstcisMask
|
nstcisFlags
)
&
NSTCIS_BOLD
)
||
(
nstcisFlags
&
NSTCIS_DISABLED
)
)
tvi
.
mask
=
TVIF_STATE
;
else
tvi
.
mask
=
0
;
if
(
tvi
.
mask
)
{
tvi
.
stateMask
=
tvi
.
state
=
0
;
tvi
.
stateMask
|=
((
nstcisFlags
^
nstcisMask
)
&
NSTCIS_SELECTED
)
?
TVIS_SELECTED
:
0
;
tvi
.
stateMask
|=
(
nstcisMask
|
nstcisFlags
)
&
NSTCIS_BOLD
?
TVIS_BOLD
:
0
;
tvi
.
state
|=
(
nstcisMask
&
nstcisFlags
)
&
NSTCIS_BOLD
?
TVIS_BOLD
:
0
;
if
((
nstcisMask
&
NSTCIS_EXPANDED
)
^
(
nstcisFlags
&
NSTCIS_EXPANDED
))
{
tvi
.
stateMask
=
0
;
}
tvi
.
uStateEx
=
(
nstcisFlags
&
nstcisMask
)
&
NSTCIS_DISABLED
?
TVIS_EX_DISABLED
:
0
;
tvi
.
hItem
=
hitem
;
SendMessageW
(
This
->
hwnd_tv
,
TVM_SETITEMW
,
0
,
(
LPARAM
)
&
tvi
);
}
return
S_OK
;
}
static
HRESULT
WINAPI
NSTC2_fnGetItemState
(
INameSpaceTreeControl2
*
iface
,
...
...
@@ -1080,8 +1180,32 @@ static HRESULT WINAPI NSTC2_fnGetItemState(INameSpaceTreeControl2* iface,
NSTCITEMSTATE
*
pnstcisFlags
)
{
NSTC2Impl
*
This
=
(
NSTC2Impl
*
)
iface
;
FIXME
(
"stub, %p (%p, %x, %p)
\n
"
,
This
,
psi
,
nstcisMask
,
pnstcisFlags
);
return
E_NOTIMPL
;
HTREEITEM
hitem
;
TVITEMEXW
tvi
;
TRACE
(
"%p (%p, %x, %p)
\n
"
,
This
,
psi
,
nstcisMask
,
pnstcisFlags
);
hitem
=
treeitem_from_shellitem
(
This
,
psi
);
if
(
!
hitem
)
return
E_INVALIDARG
;
*
pnstcisFlags
=
0
;
tvi
.
hItem
=
hitem
;
tvi
.
mask
=
TVIF_STATE
;
tvi
.
stateMask
=
TVIS_SELECTED
|
TVIS_EXPANDED
|
TVIS_BOLD
;
if
(
nstcisMask
&
NSTCIS_DISABLED
)
tvi
.
mask
|=
TVIF_STATEEX
;
SendMessageW
(
This
->
hwnd_tv
,
TVM_GETITEMW
,
0
,
(
LPARAM
)
&
tvi
);
*
pnstcisFlags
|=
(
tvi
.
state
&
TVIS_SELECTED
)
?
NSTCIS_SELECTED
:
0
;
*
pnstcisFlags
|=
(
tvi
.
state
&
TVIS_EXPANDED
)
?
NSTCIS_EXPANDED
:
0
;
*
pnstcisFlags
|=
(
tvi
.
state
&
TVIS_BOLD
)
?
NSTCIS_BOLD
:
0
;
*
pnstcisFlags
|=
(
tvi
.
uStateEx
&
TVIS_EX_DISABLED
)
?
NSTCIS_DISABLED
:
0
;
*
pnstcisFlags
&=
nstcisMask
;
return
S_OK
;
}
static
HRESULT
WINAPI
NSTC2_fnGetSelectedItems
(
INameSpaceTreeControl2
*
iface
,
...
...
dlls/explorerframe/tests/msg.h
0 → 100644
View file @
7e65349c
/* Message Sequence Testing Code
*
* Copyright (C) 2007 James Hawkins
* Copyright (C) 2007 Lei Zhang
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
#include <assert.h>
#include <windows.h>
#include "wine/test.h"
/* undocumented SWP flags - from SDK 3.1 */
#define SWP_NOCLIENTSIZE 0x0800
#define SWP_NOCLIENTMOVE 0x1000
typedef
enum
{
sent
=
0x1
,
posted
=
0x2
,
parent
=
0x4
,
wparam
=
0x8
,
lparam
=
0x10
,
defwinproc
=
0x20
,
beginpaint
=
0x40
,
optional
=
0x80
,
hook
=
0x100
,
winevent_hook
=
0x200
,
id
=
0x400
}
msg_flags_t
;
struct
message
{
UINT
message
;
/* the WM_* code */
msg_flags_t
flags
;
/* message props */
WPARAM
wParam
;
/* expected value of wParam */
LPARAM
lParam
;
/* expected value of lParam */
UINT
id
;
/* extra message data: id of the window,
notify code etc. */
};
struct
msg_sequence
{
int
count
;
int
size
;
struct
message
*
sequence
;
};
static
void
add_message
(
struct
msg_sequence
**
seq
,
int
sequence_index
,
const
struct
message
*
msg
)
{
struct
msg_sequence
*
msg_seq
=
seq
[
sequence_index
];
if
(
!
msg_seq
->
sequence
)
{
msg_seq
->
size
=
10
;
msg_seq
->
sequence
=
HeapAlloc
(
GetProcessHeap
(),
0
,
msg_seq
->
size
*
sizeof
(
struct
message
));
}
if
(
msg_seq
->
count
==
msg_seq
->
size
)
{
msg_seq
->
size
*=
2
;
msg_seq
->
sequence
=
HeapReAlloc
(
GetProcessHeap
(),
0
,
msg_seq
->
sequence
,
msg_seq
->
size
*
sizeof
(
struct
message
));
}
assert
(
msg_seq
->
sequence
);
msg_seq
->
sequence
[
msg_seq
->
count
].
message
=
msg
->
message
;
msg_seq
->
sequence
[
msg_seq
->
count
].
flags
=
msg
->
flags
;
msg_seq
->
sequence
[
msg_seq
->
count
].
wParam
=
msg
->
wParam
;
msg_seq
->
sequence
[
msg_seq
->
count
].
lParam
=
msg
->
lParam
;
msg_seq
->
sequence
[
msg_seq
->
count
].
id
=
msg
->
id
;
msg_seq
->
count
++
;
}
static
void
flush_sequence
(
struct
msg_sequence
**
seg
,
int
sequence_index
)
{
struct
msg_sequence
*
msg_seq
=
seg
[
sequence_index
];
HeapFree
(
GetProcessHeap
(),
0
,
msg_seq
->
sequence
);
msg_seq
->
sequence
=
NULL
;
msg_seq
->
count
=
msg_seq
->
size
=
0
;
}
static
void
flush_sequences
(
struct
msg_sequence
**
seq
,
int
n
)
{
int
i
;
for
(
i
=
0
;
i
<
n
;
i
++
)
flush_sequence
(
seq
,
i
);
}
/* ok_sequence is stripped out as it is not currently used. */
static
void
init_msg_sequences
(
struct
msg_sequence
**
seq
,
int
n
)
{
int
i
;
for
(
i
=
0
;
i
<
n
;
i
++
)
seq
[
i
]
=
HeapAlloc
(
GetProcessHeap
(),
HEAP_ZERO_MEMORY
,
sizeof
(
struct
msg_sequence
));
}
dlls/explorerframe/tests/nstc.c
View file @
7e65349c
...
...
@@ -25,6 +25,8 @@
#include "shlobj.h"
#include "wine/test.h"
#include "msg.h"
static
HWND
hwnd
;
/* "Intended for internal use" */
...
...
@@ -34,6 +36,15 @@ static HRESULT (WINAPI *pSHCreateShellItem)(LPCITEMIDLIST,IShellFolder*,LPCITEMI
static
HRESULT
(
WINAPI
*
pSHGetIDListFromObject
)(
IUnknown
*
,
PIDLIST_ABSOLUTE
*
);
static
HRESULT
(
WINAPI
*
pSHCreateItemFromParsingName
)(
PCWSTR
,
IBindCtx
*
,
REFIID
,
void
**
);
#define NUM_MSG_SEQUENCES 1
#define TREEVIEW_SEQ_INDEX 0
static
struct
msg_sequence
*
sequences
[
NUM_MSG_SEQUENCES
];
/* Keep a copy of the last structure passed by TVM_SETITEMW */
static
TVITEMEXW
last_tvi
;
static
int
tvi_count
;
static
void
init_function_pointers
(
void
)
{
HMODULE
hmod
;
...
...
@@ -463,6 +474,62 @@ static HWND get_treeview_hwnd(INameSpaceTreeControl *pnstc)
return
treeview
;
}
static
LRESULT
WINAPI
treeview_subclass_proc
(
HWND
hwnd_tv
,
UINT
message
,
WPARAM
wParam
,
LPARAM
lParam
)
{
WNDPROC
oldproc
=
(
WNDPROC
)
GetWindowLongPtrW
(
hwnd_tv
,
GWLP_USERDATA
);
static
LONG
defwndproc_counter
=
0
;
LRESULT
ret
;
struct
message
msg
;
msg
.
message
=
message
;
msg
.
flags
=
sent
|
wparam
|
lparam
;
if
(
defwndproc_counter
)
msg
.
flags
|=
defwinproc
;
msg
.
wParam
=
wParam
;
msg
.
lParam
=
lParam
;
msg
.
id
=
0
;
add_message
(
sequences
,
TREEVIEW_SEQ_INDEX
,
&
msg
);
if
(
message
==
TVM_SETITEMW
)
{
memcpy
(
&
last_tvi
,
(
void
*
)
lParam
,
sizeof
(
TVITEMEXW
));
tvi_count
++
;
}
defwndproc_counter
++
;
ret
=
CallWindowProcW
(
oldproc
,
hwnd_tv
,
message
,
wParam
,
lParam
);
defwndproc_counter
--
;
return
ret
;
}
static
BOOL
subclass_treeview
(
INameSpaceTreeControl
*
pnstc
)
{
HWND
hwnd_tv
;
WNDPROC
oldproc
=
NULL
;
hwnd_tv
=
get_treeview_hwnd
(
pnstc
);
if
(
hwnd_tv
)
{
oldproc
=
(
WNDPROC
)
SetWindowLongPtrW
(
hwnd_tv
,
GWLP_WNDPROC
,
(
LONG_PTR
)
treeview_subclass_proc
);
SetWindowLongPtrW
(
hwnd_tv
,
GWLP_USERDATA
,
(
LONG_PTR
)
oldproc
);
ok
(
oldproc
!=
NULL
,
"Failed to subclass.
\n
"
);
}
return
oldproc
?
TRUE
:
FALSE
;
}
static
UINT
get_msg_count
(
struct
msg_sequence
**
seq
,
int
sequence_index
,
UINT
message
)
{
struct
msg_sequence
*
msg_seq
=
seq
[
sequence_index
];
UINT
i
,
count
=
0
;
for
(
i
=
0
;
i
<
msg_seq
->
count
;
i
++
)
if
(
msg_seq
->
sequence
[
i
].
message
==
message
)
count
++
;
return
count
;
}
/* Returns FALSE if the NamespaceTreeControl failed to be instantiated. */
static
BOOL
test_initialization
(
void
)
{
...
...
@@ -1087,6 +1154,148 @@ static void test_basics(void)
hr
=
INameSpaceTreeControl_CollapseAll
(
pnstc
);
ok
(
hr
==
S_OK
,
"Got 0x%08x
\n
"
,
hr
);
/* SetItemState message checks */
res
=
subclass_treeview
(
pnstc
);
ok
(
res
,
"Failed to subclass treeview.
\n
"
);
if
(
res
)
{
UINT
isMask
,
isFlags
;
hr
=
INameSpaceTreeControl_AppendRoot
(
pnstc
,
psidesktop
,
SHCONTF_NONFOLDERS
|
SHCONTF_FOLDERS
,
0
,
NULL
);
ok
(
hr
==
S_OK
,
"Got (0x%08x)
\n
"
,
hr
);
flush_sequences
(
sequences
,
NUM_MSG_SEQUENCES
);
/* A special case -
* The first expansion results in an "unrelated" TVM_SETITEMW being sent
* (mask == 0x50 (TVIF_CHILDREN|TVIF_HANDLE) )
*/
tvi_count
=
0
;
hr
=
INameSpaceTreeControl_SetItemState
(
pnstc
,
psidesktop
,
NSTCIS_EXPANDED
,
NSTCIS_EXPANDED
);
ok
(
hr
==
S_OK
,
"Got 0x%08x
\n
"
,
hr
);
todo_wine
{
ok
(
tvi_count
==
1
,
"Got %d
\n
"
,
tvi_count
);
ok
(
last_tvi
.
mask
==
0x50
,
"Got mask %x, expected 0x50
\n
"
,
last_tvi
.
mask
);
}
tvi_count
=
0
;
hr
=
INameSpaceTreeControl_SetItemState
(
pnstc
,
psidesktop
,
NSTCIS_EXPANDED
,
NSTCIS_EXPANDED
);
ok
(
hr
==
S_OK
,
"Got 0x%08x
\n
"
,
hr
);
ok
(
tvi_count
==
0
,
"Got %d
\n
"
,
tvi_count
);
/* Test all the combinations of NSTCIS_SELECTED to NSTCIS_SELECTEDNOEXPAND */
flush_sequences
(
sequences
,
NUM_MSG_SEQUENCES
);
for
(
isMask
=
0
;
isMask
<=
0x1f
;
isMask
++
)
{
for
(
isFlags
=
0
;
isFlags
<=
0x1f
;
isFlags
++
)
{
UINT
select_sent
,
select_sent_vista
,
ensurev_sent
,
expand_sent
;
TVITEMEXW
tviexp
;
UINT
msg_count
;
flush_sequences
(
sequences
,
NUM_MSG_SEQUENCES
);
tvi_count
=
0
;
hr
=
INameSpaceTreeControl_SetItemState
(
pnstc
,
psidesktop
,
isMask
,
isFlags
);
ok
(
hr
==
S_OK
,
"(%x|%x)Got 0x%08x
\n
"
,
isMask
,
isFlags
,
hr
);
/*****************************/
/* Calculate expected values */
/*****************************/
/* Number of TVM_SELECTITEM/TVM_ENSUREVISIBLE and TVM_EXPAND sent */
select_sent
=
((
isMask
&
isFlags
)
&
NSTCIS_SELECTED
)
?
1
:
0
;
select_sent_vista
=
ensurev_sent
=
select_sent
;
select_sent
+=
((
isMask
&
isFlags
)
&
NSTCIS_SELECTEDNOEXPAND
)
?
1
:
0
;
select_sent_vista
+=
((
isMask
&
isFlags
)
&
NSTCIS_EXPANDED
)
?
1
:
0
;
expand_sent
=
((
isMask
|
isFlags
)
&
NSTCIS_EXPANDED
)
?
1
:
0
;
/* Possible TWM_SETITEMW message and its contents */
if
(
isMask
&
NSTCIS_DISABLED
)
tviexp
.
mask
=
TVIF_STATE
|
TVIF_STATEEX
;
else
if
(
((
isMask
^
isFlags
)
&
(
NSTCIS_SELECTED
|
NSTCIS_EXPANDED
|
NSTCIS_SELECTEDNOEXPAND
))
||
((
isMask
|
isFlags
)
&
NSTCIS_BOLD
)
||
(
isFlags
&
NSTCIS_DISABLED
)
)
tviexp
.
mask
=
TVIF_STATE
;
else
tviexp
.
mask
=
0
;
if
(
tviexp
.
mask
)
{
tviexp
.
stateMask
=
tviexp
.
state
=
0
;
tviexp
.
stateMask
|=
((
isMask
^
isFlags
)
&
NSTCIS_SELECTED
)
?
TVIS_SELECTED
:
0
;
tviexp
.
stateMask
|=
(
isMask
|
isFlags
)
&
NSTCIS_BOLD
?
TVIS_BOLD
:
0
;
tviexp
.
state
|=
(
isMask
&
isFlags
)
&
NSTCIS_BOLD
?
TVIS_BOLD
:
0
;
if
((
isMask
&
NSTCIS_EXPANDED
)
^
(
isFlags
&
NSTCIS_EXPANDED
))
{
tviexp
.
stateMask
=
0
;
}
tviexp
.
uStateEx
=
(
isFlags
&
isMask
)
&
NSTCIS_DISABLED
?
TVIS_EX_DISABLED
:
0
;
}
else
{
/* Make sure that no tests accidentally succeeded
* (and avoid a gcc warning) */
tviexp
.
stateMask
=
tviexp
.
state
=
tviexp
.
uStateEx
=
-
1
;
}
/*****************************/
/* Check the values. */
/*****************************/
msg_count
=
get_msg_count
(
sequences
,
TREEVIEW_SEQ_INDEX
,
TVM_SELECTITEM
);
ok
(
msg_count
==
select_sent
||
broken
(
msg_count
==
select_sent_vista
),
"(%x|%x) Got msg_count %d, expected %d (%d)
\n
"
,
isMask
,
isFlags
,
msg_count
,
select_sent
,
select_sent_vista
);
msg_count
=
get_msg_count
(
sequences
,
TREEVIEW_SEQ_INDEX
,
TVM_ENSUREVISIBLE
);
ok
(
msg_count
==
ensurev_sent
||
broken
(
msg_count
==
0
/* Vista */
),
"(%x|%x) Got msg_count %d, expected %d
\n
"
,
isMask
,
isFlags
,
msg_count
,
ensurev_sent
);
msg_count
=
get_msg_count
(
sequences
,
TREEVIEW_SEQ_INDEX
,
TVM_EXPAND
);
ok
(
msg_count
==
expand_sent
,
"(%x|%x) Got msg_count %d, expected %d
\n
"
,
isMask
,
isFlags
,
msg_count
,
expand_sent
);
msg_count
=
get_msg_count
(
sequences
,
TREEVIEW_SEQ_INDEX
,
TVM_SETITEMW
);
if
(
!
tviexp
.
mask
)
{
/* Four special cases for vista */
BOOL
vista_check
=
(
(
isMask
==
0x10
&&
isFlags
==
0x10
)
||
(
isMask
==
0x11
&&
isFlags
==
0x11
)
||
(
isMask
==
0x12
&&
isFlags
==
0x12
)
||
(
isMask
==
0x13
&&
isFlags
==
0x13
)
);
ok
(
msg_count
==
0
||
broken
(
msg_count
==
1
&&
vista_check
),
"(%x|%x) Got msg_count %d (tviexp.mask %x)
\n
"
,
isMask
,
isFlags
,
msg_count
,
tviexp
.
mask
);
}
else
{
ok
(
msg_count
==
1
,
"(%x|%x) Got msg_count %d, expected 1
\n
"
,
isMask
,
isFlags
,
msg_count
);
ok
(
last_tvi
.
mask
==
tviexp
.
mask
,
"(%x|%x) Got mask %x, expected %x
\n
"
,
isMask
,
isFlags
,
last_tvi
.
mask
,
tviexp
.
mask
);
ok
(
last_tvi
.
stateMask
==
tviexp
.
stateMask
,
"(%x|%x) Got stateMask %x, expected %x
\n
"
,
isMask
,
isFlags
,
last_tvi
.
stateMask
,
tviexp
.
stateMask
);
ok
(
last_tvi
.
state
==
tviexp
.
state
,
"(%x|%x) Got state %x, expected %x
\n
"
,
isMask
,
isFlags
,
last_tvi
.
state
,
tviexp
.
state
);
ok
(
last_tvi
.
uStateEx
==
tviexp
.
uStateEx
,
"(%x|%x) Got uStateEx %x, expected %x
\n
"
,
isMask
,
isFlags
,
last_tvi
.
uStateEx
,
tviexp
.
uStateEx
);
}
}
}
hr
=
INameSpaceTreeControl_RemoveAllRoots
(
pnstc
);
ok
(
hr
==
S_OK
,
"Got (0x%08x)
\n
"
,
hr
);
}
IShellItem_Release
(
psidesktop
);
IShellItem_Release
(
psidesktop2
);
IShellItem_Release
(
psitestdir
);
...
...
@@ -1119,6 +1328,7 @@ static void test_events(void)
IShellItem
*
psidesktop
;
IOleWindow
*
pow
;
LPITEMIDLIST
pidl_desktop
;
NSTCITEMSTATE
itemstate
;
DWORD
cookie1
,
cookie2
;
HWND
hwnd_tv
;
HRESULT
hr
;
...
...
@@ -1317,6 +1527,275 @@ static void test_events(void)
hr
=
INameSpaceTreeControl_RemoveAllRoots
(
pnstc
);
process_msgs
();
ok
(
hr
==
S_OK
,
"Got 0x%08x
\n
"
,
hr
);
ok_event
(
pnstceimpl
,
OnItemDeleted
);
ok_no_events
(
pnstceimpl
);
hr
=
INameSpaceTreeControl_AppendRoot
(
pnstc
,
psidesktop
,
SHCONTF_FOLDERS
|
SHCONTF_NONFOLDERS
,
0
,
NULL
);
ok
(
hr
==
S_OK
,
"Got (0x%08x)
\n
"
,
hr
);
process_msgs
();
ok_event_count_broken
(
pnstceimpl
,
OnItemAdded
,
1
,
0
/* Vista */
);
ok_no_events
(
pnstceimpl
);
hr
=
INameSpaceTreeControl_GetItemState
(
pnstc
,
psidesktop
,
0xffff
,
&
itemstate
);
ok
(
hr
==
S_OK
,
"Got (0x%08x)
\n
"
,
hr
);
ok
(
itemstate
==
NSTCIS_NONE
,
"itemstate is 0x%08x
\n
"
,
itemstate
);
process_msgs
();
ok_no_events
(
pnstceimpl
);
/* Expand the root */
itemstate
|=
NSTCIS_EXPANDED
;
hr
=
INameSpaceTreeControl_SetItemState
(
pnstc
,
psidesktop
,
0xffff
,
itemstate
);
ok
(
hr
==
S_OK
,
"Got (0x%08x)
\n
"
,
hr
);
process_msgs
();
ok_event_count
(
pnstceimpl
,
OnBeforeExpand
,
1
);
ok_event_broken
(
pnstceimpl
,
OnItemAdded
);
/* Does not fire on Vista */
ok_event_count
(
pnstceimpl
,
OnAfterExpand
,
1
);
todo_wine
{
ok_event_count_broken
(
pnstceimpl
,
OnSelectionChanged
,
1
,
0
/* Vista*/
);
}
ok_no_events
(
pnstceimpl
);
hr
=
INameSpaceTreeControl_GetItemState
(
pnstc
,
psidesktop
,
0xffff
,
&
itemstate
);
ok
(
hr
==
S_OK
,
"Got (0x%08x)
\n
"
,
hr
);
ok
(
itemstate
&
NSTCIS_EXPANDED
,
"Item not expanded.
\n
"
);
todo_wine
{
ok
(
itemstate
==
(
NSTCIS_SELECTED
|
NSTCIS_EXPANDED
)
||
broken
(
itemstate
==
NSTCIS_EXPANDED
)
/* Vista */
,
"itemstate is 0x%08x
\n
"
,
itemstate
);
process_msgs
();
ok_event_count_broken
(
pnstceimpl
,
OnSelectionChanged
,
1
,
0
/* Vista*/
);
}
ok_no_events
(
pnstceimpl
);
/* Deselect the root */
itemstate
&=
~
NSTCIS_SELECTED
;
hr
=
INameSpaceTreeControl_SetItemState
(
pnstc
,
psidesktop
,
0xffff
,
itemstate
);
ok
(
hr
==
S_OK
,
"Got (0x%08x)
\n
"
,
hr
);
process_msgs
();
ok_no_events
(
pnstceimpl
);
hr
=
INameSpaceTreeControl_GetItemState
(
pnstc
,
psidesktop
,
0xffff
,
&
itemstate
);
ok
(
hr
==
S_OK
,
"Got (0x%08x)
\n
"
,
hr
);
ok
(
itemstate
==
(
NSTCIS_EXPANDED
),
"itemstate is 0x%08x
\n
"
,
itemstate
);
ok_no_events
(
pnstceimpl
);
hr
=
INameSpaceTreeControl_CollapseAll
(
pnstc
);
ok
(
hr
==
S_OK
,
"Got (0x%08x)
\n
"
,
hr
);
ok_no_events
(
pnstceimpl
);
/* Delete all roots */
hr
=
INameSpaceTreeControl_RemoveAllRoots
(
pnstc
);
ok
(
hr
==
S_OK
,
"Got (0x%08x)
\n
"
,
hr
);
ok_event_count
(
pnstceimpl
,
OnItemDeleted
,
1
);
ok_no_events
(
pnstceimpl
);
/* Get/SetItemState */
if
(
0
)
{
/* Crashes on Windows 7 */
hr
=
INameSpaceTreeControl_SetItemState
(
pnstc
,
NULL
,
0
,
0
);
hr
=
INameSpaceTreeControl_GetItemState
(
pnstc
,
NULL
,
0
,
NULL
);
hr
=
INameSpaceTreeControl_GetItemState
(
pnstc
,
psidesktop
,
0
,
NULL
);
hr
=
INameSpaceTreeControl_GetItemState
(
pnstc
,
NULL
,
0
,
&
itemstate
);
hr
=
INameSpaceTreeControl_GetItemState
(
pnstc
,
psidesktop
,
0
,
NULL
);
hr
=
INameSpaceTreeControl_GetItemState
(
pnstc
,
NULL
,
0
,
&
itemstate
);
}
itemstate
=
0xDEADBEEF
;
hr
=
INameSpaceTreeControl_GetItemState
(
pnstc
,
psidesktop
,
0xffff
,
&
itemstate
);
ok
(
hr
==
E_INVALIDARG
,
"Got (0x%08x)
\n
"
,
hr
);
hr
=
INameSpaceTreeControl_SetItemState
(
pnstc
,
psidesktop
,
0xffff
,
0
);
ok
(
hr
==
E_INVALIDARG
,
"Got (0x%08x)
\n
"
,
hr
);
ok_no_events
(
pnstceimpl
);
hr
=
INameSpaceTreeControl_AppendRoot
(
pnstc
,
psidesktop
,
SHCONTF_FOLDERS
|
SHCONTF_NONFOLDERS
,
0
,
NULL
);
ok
(
hr
==
S_OK
,
"Got (0x%08x)
\n
"
,
hr
);
process_msgs
();
ok_event_count_broken
(
pnstceimpl
,
OnItemAdded
,
1
,
0
/* Vista */
);
ok_no_events
(
pnstceimpl
);
itemstate
=
0xDEADBEEF
;
hr
=
INameSpaceTreeControl_GetItemState
(
pnstc
,
psidesktop
,
0xffff
,
&
itemstate
);
ok
(
hr
==
S_OK
,
"Got (0x%08x)
\n
"
,
hr
);
ok
(
itemstate
==
NSTCIS_NONE
,
"itemstate is 0x%08x
\n
"
,
itemstate
);
ok_no_events
(
pnstceimpl
);
hr
=
INameSpaceTreeControl_SetItemState
(
pnstc
,
psidesktop
,
0
,
0xffff
);
ok
(
hr
==
S_OK
,
"Got (0x%08x)
\n
"
,
hr
);
process_msgs
();
todo_wine
{
ok_event_count
(
pnstceimpl
,
OnBeforeExpand
,
0
);
ok_event_count
(
pnstceimpl
,
OnAfterExpand
,
0
);
ok_event_count
(
pnstceimpl
,
OnItemAdded
,
0
);
}
ok_no_events
(
pnstceimpl
);
itemstate
=
0xDEADBEEF
;
hr
=
INameSpaceTreeControl_GetItemState
(
pnstc
,
psidesktop
,
0xffff
,
&
itemstate
);
ok
(
hr
==
S_OK
,
"Got (0x%08x)
\n
"
,
hr
);
todo_wine
ok
(
itemstate
==
NSTCIS_NONE
,
"itemstate is 0x%08x
\n
"
,
itemstate
);
ok_no_events
(
pnstceimpl
);
hr
=
INameSpaceTreeControl_SetItemState
(
pnstc
,
psidesktop
,
0xffff
,
0
);
ok
(
hr
==
S_OK
,
"Got (0x%08x)
\n
"
,
hr
);
process_msgs
();
ok_no_events
(
pnstceimpl
);
itemstate
=
0xDEADBEEF
;
hr
=
INameSpaceTreeControl_GetItemState
(
pnstc
,
psidesktop
,
0xffff
,
&
itemstate
);
ok
(
hr
==
S_OK
,
"Got (0x%08x)
\n
"
,
hr
);
ok
(
itemstate
==
NSTCIS_NONE
,
"itemstate is 0x%08x
\n
"
,
itemstate
);
ok_no_events
(
pnstceimpl
);
hr
=
INameSpaceTreeControl_SetItemState
(
pnstc
,
psidesktop
,
0xffff
,
NSTCIS_SELECTED
);
ok
(
hr
==
S_OK
,
"Got (0x%08x)
\n
"
,
hr
);
process_msgs
();
ok_event_count
(
pnstceimpl
,
OnSelectionChanged
,
1
);
ok_no_events
(
pnstceimpl
);
itemstate
=
0xDEADBEEF
;
hr
=
INameSpaceTreeControl_GetItemState
(
pnstc
,
psidesktop
,
0xffff
,
&
itemstate
);
ok
(
hr
==
S_OK
,
"Got (0x%08x)
\n
"
,
hr
);
ok
(
itemstate
==
NSTCIS_SELECTED
,
"itemstate is 0x%08x
\n
"
,
itemstate
);
ok_no_events
(
pnstceimpl
);
hr
=
INameSpaceTreeControl_SetItemState
(
pnstc
,
psidesktop
,
NSTCIS_EXPANDED
,
NSTCIS_SELECTED
);
ok
(
hr
==
S_OK
,
"Got (0x%08x)
\n
"
,
hr
);
process_msgs
();
ok_no_events
(
pnstceimpl
);
itemstate
=
0xDEADBEEF
;
hr
=
INameSpaceTreeControl_GetItemState
(
pnstc
,
psidesktop
,
0xffff
,
&
itemstate
);
ok
(
hr
==
S_OK
,
"Got (0x%08x)
\n
"
,
hr
);
ok
(
itemstate
==
NSTCIS_SELECTED
,
"itemstate is 0x%08x
\n
"
,
itemstate
);
ok_no_events
(
pnstceimpl
);
hr
=
INameSpaceTreeControl_SetItemState
(
pnstc
,
psidesktop
,
0xffff
,
0
);
ok
(
hr
==
S_OK
,
"Got (0x%08x)
\n
"
,
hr
);
process_msgs
();
ok_no_events
(
pnstceimpl
);
itemstate
=
0xDEADBEEF
;
hr
=
INameSpaceTreeControl_GetItemState
(
pnstc
,
psidesktop
,
0xffff
,
&
itemstate
);
ok
(
hr
==
S_OK
,
"Got (0x%08x)
\n
"
,
hr
);
ok
(
itemstate
==
NSTCIS_SELECTED
,
"itemstate is 0x%08x
\n
"
,
itemstate
);
ok_no_events
(
pnstceimpl
);
hr
=
INameSpaceTreeControl_SetItemState
(
pnstc
,
psidesktop
,
0xffff
,
NSTCIS_SELECTEDNOEXPAND
);
ok
(
hr
==
S_OK
,
"Got (0x%08x)
\n
"
,
hr
);
process_msgs
();
ok_no_events
(
pnstceimpl
);
itemstate
=
0xDEADBEEF
;
hr
=
INameSpaceTreeControl_GetItemState
(
pnstc
,
psidesktop
,
0xffff
,
&
itemstate
);
ok
(
hr
==
S_OK
,
"Got (0x%08x)
\n
"
,
hr
);
ok
(
itemstate
==
NSTCIS_SELECTED
,
"itemstate is 0x%08x
\n
"
,
itemstate
);
ok_no_events
(
pnstceimpl
);
hr
=
INameSpaceTreeControl_SetItemState
(
pnstc
,
psidesktop
,
0xffff
,
NSTCIS_EXPANDED
);
ok
(
hr
==
S_OK
,
"Got (0x%08x)
\n
"
,
hr
);
process_msgs
();
todo_wine
{
ok_event_count
(
pnstceimpl
,
OnBeforeExpand
,
1
);
ok_event_broken
(
pnstceimpl
,
OnItemAdded
);
/* Does not fire on Vista */
ok_event_count
(
pnstceimpl
,
OnAfterExpand
,
1
);
}
ok_no_events
(
pnstceimpl
);
itemstate
=
0xDEADBEEF
;
hr
=
INameSpaceTreeControl_GetItemState
(
pnstc
,
psidesktop
,
0xffff
,
&
itemstate
);
ok
(
hr
==
S_OK
,
"Got (0x%08x)
\n
"
,
hr
);
ok
(
itemstate
==
NSTCIS_EXPANDED
,
"itemstate is 0x%08x
\n
"
,
itemstate
);
ok_no_events
(
pnstceimpl
);
hr
=
INameSpaceTreeControl_SetItemState
(
pnstc
,
psidesktop
,
0xffff
,
0
);
ok
(
hr
==
S_OK
,
"Got (0x%08x)
\n
"
,
hr
);
process_msgs
();
ok_no_events
(
pnstceimpl
);
itemstate
=
0xDEADBEEF
;
hr
=
INameSpaceTreeControl_GetItemState
(
pnstc
,
psidesktop
,
0xffff
,
&
itemstate
);
ok
(
hr
==
S_OK
,
"Got (0x%08x)
\n
"
,
hr
);
ok
(
itemstate
==
NSTCIS_NONE
,
"itemstate is 0x%08x
\n
"
,
itemstate
);
ok_no_events
(
pnstceimpl
);
hr
=
INameSpaceTreeControl_SetItemState
(
pnstc
,
psidesktop
,
0xffff
,
0xffff
);
ok
(
hr
==
S_OK
,
"Got (0x%08x)
\n
"
,
hr
);
process_msgs
();
ok_no_events
(
pnstceimpl
);
itemstate
=
0xDEADBEEF
;
hr
=
INameSpaceTreeControl_GetItemState
(
pnstc
,
psidesktop
,
0xffff
,
&
itemstate
);
ok
(
hr
==
S_OK
,
"Got (0x%08x)
\n
"
,
hr
);
todo_wine
{
ok
(
itemstate
==
(
NSTCIS_EXPANDED
|
NSTCIS_BOLD
|
NSTCIS_DISABLED
),
"itemstate is 0x%08x
\n
"
,
itemstate
);
}
ok_no_events
(
pnstceimpl
);
hr
=
INameSpaceTreeControl_SetItemState
(
pnstc
,
psidesktop
,
NSTCIS_SELECTED
,
NSTCIS_SELECTED
);
ok
(
hr
==
S_OK
,
"Got (0x%08x)
\n
"
,
hr
);
process_msgs
();
ok_no_events
(
pnstceimpl
);
itemstate
=
0xDEADBEEF
;
hr
=
INameSpaceTreeControl_GetItemState
(
pnstc
,
psidesktop
,
0xffff
,
&
itemstate
);
ok
(
hr
==
S_OK
,
"Got (0x%08x)
\n
"
,
hr
);
todo_wine
{
ok
(
itemstate
==
(
NSTCIS_EXPANDED
|
NSTCIS_BOLD
|
NSTCIS_DISABLED
),
"itemstate is 0x%08x
\n
"
,
itemstate
);
}
ok_no_events
(
pnstceimpl
);
hr
=
INameSpaceTreeControl_SetItemState
(
pnstc
,
psidesktop
,
NSTCIS_SELECTED
|
NSTCIS_DISABLED
,
NSTCIS_SELECTED
);
ok
(
hr
==
S_OK
,
"Got (0x%08x)
\n
"
,
hr
);
process_msgs
();
ok_no_events
(
pnstceimpl
);
itemstate
=
0xDEADBEEF
;
hr
=
INameSpaceTreeControl_GetItemState
(
pnstc
,
psidesktop
,
0xffff
,
&
itemstate
);
ok
(
hr
==
S_OK
,
"Got (0x%08x)
\n
"
,
hr
);
ok
(
itemstate
==
(
NSTCIS_BOLD
|
NSTCIS_EXPANDED
),
"itemstate is 0x%08x
\n
"
,
itemstate
);
ok_no_events
(
pnstceimpl
);
hr
=
INameSpaceTreeControl_SetItemState
(
pnstc
,
psidesktop
,
NSTCIS_SELECTED
,
NSTCIS_SELECTED
);
ok
(
hr
==
S_OK
,
"Got (0x%08x)
\n
"
,
hr
);
process_msgs
();
ok_no_events
(
pnstceimpl
);
itemstate
=
0xDEADBEEF
;
hr
=
INameSpaceTreeControl_GetItemState
(
pnstc
,
psidesktop
,
0xffff
,
&
itemstate
);
ok
(
hr
==
S_OK
,
"Got (0x%08x)
\n
"
,
hr
);
ok
(
itemstate
==
(
NSTCIS_BOLD
|
NSTCIS_EXPANDED
),
"itemstate is 0x%08x
\n
"
,
itemstate
);
ok_no_events
(
pnstceimpl
);
hr
=
INameSpaceTreeControl_SetItemState
(
pnstc
,
psidesktop
,
0xffff
&
~
NSTCIS_DISABLED
,
0
);
ok
(
hr
==
S_OK
,
"Got (0x%08x)
\n
"
,
hr
);
process_msgs
();
ok_no_events
(
pnstceimpl
);
itemstate
=
0xDEADBEEF
;
hr
=
INameSpaceTreeControl_GetItemState
(
pnstc
,
psidesktop
,
0xffff
,
&
itemstate
);
ok
(
hr
==
S_OK
,
"Got (0x%08x)
\n
"
,
hr
);
ok
(
itemstate
==
(
NSTCIS_BOLD
),
"itemstate is 0x%08x
\n
"
,
itemstate
);
ok_no_events
(
pnstceimpl
);
hr
=
INameSpaceTreeControl_RemoveAllRoots
(
pnstc
);
ok
(
hr
==
S_OK
,
"Got (0x%08x)
\n
"
,
hr
);
ok_event_count
(
pnstceimpl
,
OnItemDeleted
,
1
);
ok_no_events
(
pnstceimpl
);
hr
=
INameSpaceTreeControl_QueryInterface
(
pnstc
,
&
IID_IOleWindow
,
(
void
**
)
&
pow
);
ok
(
hr
==
S_OK
,
"Got 0x%08x
\n
"
,
hr
);
...
...
@@ -1368,6 +1847,7 @@ START_TEST(nstc)
OleInitialize
(
NULL
);
setup_window
();
init_function_pointers
();
init_msg_sequences
(
sequences
,
NUM_MSG_SEQUENCES
);
if
(
test_initialization
())
{
...
...
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