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
Expand all
Show whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
244 additions
and
4 deletions
+244
-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
+0
-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
This diff is collapsed.
Click to expand it.
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