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
e9fa0599
Commit
e9fa0599
authored
Jan 10, 2012
by
Nikolay Sivov
Committed by
Alexandre Julliard
Jan 10, 2012
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
shell32: Merge ShellView menu implementations into a single file.
parent
de0813c7
Hide whitespace changes
Inline
Side-by-side
Showing
12 changed files
with
425 additions
and
534 deletions
+425
-534
Makefile.in
dlls/shell32/Makefile.in
+1
-2
cpanelfolder.c
dlls/shell32/cpanelfolder.c
+1
-1
shell32_main.h
dlls/shell32/shell32_main.h
+2
-2
shfldr_desktop.c
dlls/shell32/shfldr_desktop.c
+2
-2
shfldr_fs.c
dlls/shell32/shfldr_fs.c
+1
-1
shfldr_mycomp.c
dlls/shell32/shfldr_mycomp.c
+1
-1
shfldr_netplaces.c
dlls/shell32/shfldr_netplaces.c
+1
-1
shfldr_unixfs.c
dlls/shell32/shfldr_unixfs.c
+1
-1
shlmenu.c
dlls/shell32/shlmenu.c
+2
-2
shlview.c
dlls/shell32/shlview.c
+2
-2
shlview_cmenu.c
dlls/shell32/shlview_cmenu.c
+411
-61
shv_bg_cmenu.c
dlls/shell32/shv_bg_cmenu.c
+0
-458
No files found.
dlls/shell32/Makefile.in
View file @
e9fa0599
...
...
@@ -46,9 +46,8 @@ C_SRCS = \
shlfsbind.c
\
shlmenu.c
\
shlview.c
\
shlview_cmenu.c
\
shpolicy.c
\
shv_bg_cmenu.c
\
shv_item_cmenu.c
\
systray.c
\
trash.c
\
xdg.c
...
...
dlls/shell32/cpanelfolder.c
View file @
e9fa0599
...
...
@@ -600,7 +600,7 @@ static HRESULT WINAPI ISF_ControlPanel_fnGetUIObjectOf(IShellFolder2 *iface, HWN
*
ppvOut
=
NULL
;
if
(
IsEqualIID
(
riid
,
&
IID_IContextMenu
)
&&
(
cidl
>=
1
))
{
pObj
=
(
LPUNKNOWN
)
I
SvItemCm
_Constructor
((
IShellFolder
*
)
iface
,
This
->
pidlRoot
,
apidl
,
cidl
);
pObj
=
(
LPUNKNOWN
)
I
temMenu
_Constructor
((
IShellFolder
*
)
iface
,
This
->
pidlRoot
,
apidl
,
cidl
);
hr
=
S_OK
;
}
else
if
(
IsEqualIID
(
riid
,
&
IID_IDataObject
)
&&
(
cidl
>=
1
))
{
pObj
=
(
LPUNKNOWN
)
IDataObject_Constructor
(
hwndOwner
,
This
->
pidlRoot
,
apidl
,
cidl
);
...
...
dlls/shell32/shell32_main.h
View file @
e9fa0599
...
...
@@ -78,8 +78,8 @@ LPDATAOBJECT IDataObject_Constructor(HWND hwndOwner, LPCITEMIDLIST myPidl, LPCIT
LPENUMFORMATETC
IEnumFORMATETC_Constructor
(
UINT
,
const
FORMATETC
[])
DECLSPEC_HIDDEN
;
LPCLASSFACTORY
IClassFactory_Constructor
(
REFCLSID
)
DECLSPEC_HIDDEN
;
IContextMenu2
*
I
SvItemCm_Constructor
(
LPSHELLFOLDER
pSFParent
,
LPCITEMIDLIST
pidl
,
const
LPCITEMIDLIST
*
aPidls
,
UINT
uItemCount
)
DECLSPEC_HIDDEN
;
IContextMenu2
*
ISvBgCm_Constructor
(
LPSHELLFOLDER
pSFParent
,
BOOL
bDesktop
)
DECLSPEC_HIDDEN
;
IContextMenu2
*
I
temMenu_Constructor
(
IShellFolder
*
,
LPCITEMIDLIST
,
const
LPCITEMIDLIST
*
,
UINT
)
DECLSPEC_HIDDEN
;
IContextMenu2
*
BackgroundMenu_Constructor
(
IShellFolder
*
,
BOOL
)
DECLSPEC_HIDDEN
;
LPSHELLVIEW
IShellView_Constructor
(
LPSHELLFOLDER
)
DECLSPEC_HIDDEN
;
HRESULT
WINAPI
IFSFolder_Constructor
(
IUnknown
*
pUnkOuter
,
REFIID
riid
,
LPVOID
*
ppv
)
DECLSPEC_HIDDEN
;
...
...
dlls/shell32/shfldr_desktop.c
View file @
e9fa0599
...
...
@@ -530,9 +530,9 @@ static HRESULT WINAPI ISF_Desktop_fnGetUIObjectOf (IShellFolder2 * iface,
if
(
IsEqualIID
(
riid
,
&
IID_IContextMenu
))
{
if
(
cidl
>
0
)
pObj
=
(
LPUNKNOWN
)
I
SvItemCm
_Constructor
(
(
IShellFolder
*
)
iface
,
This
->
pidlRoot
,
apidl
,
cidl
);
pObj
=
(
LPUNKNOWN
)
I
temMenu
_Constructor
(
(
IShellFolder
*
)
iface
,
This
->
pidlRoot
,
apidl
,
cidl
);
else
pObj
=
(
LPUNKNOWN
)
ISvBgCm
_Constructor
(
(
IShellFolder
*
)
iface
,
TRUE
);
pObj
=
(
LPUNKNOWN
)
BackgroundMenu
_Constructor
(
(
IShellFolder
*
)
iface
,
TRUE
);
hr
=
S_OK
;
}
else
if
(
IsEqualIID
(
riid
,
&
IID_IDataObject
)
&&
(
cidl
>=
1
))
...
...
dlls/shell32/shfldr_fs.c
View file @
e9fa0599
...
...
@@ -744,7 +744,7 @@ IShellFolder_fnGetUIObjectOf (IShellFolder2 * iface,
}
if
(
IsEqualIID
(
riid
,
&
IID_IContextMenu
)
&&
(
cidl
>=
1
))
{
pObj
=
(
LPUNKNOWN
)
I
SvItemCm
_Constructor
((
IShellFolder
*
)
iface
,
pObj
=
(
LPUNKNOWN
)
I
temMenu
_Constructor
((
IShellFolder
*
)
iface
,
This
->
pidlRoot
,
apidl
,
cidl
);
hr
=
S_OK
;
}
else
if
(
IsEqualIID
(
riid
,
&
IID_IDataObject
)
&&
(
cidl
>=
1
))
{
...
...
dlls/shell32/shfldr_mycomp.c
View file @
e9fa0599
...
...
@@ -532,7 +532,7 @@ static HRESULT WINAPI ISF_MyComputer_fnGetUIObjectOf (IShellFolder2 * iface,
if
(
IsEqualIID
(
riid
,
&
IID_IContextMenu
)
&&
(
cidl
>=
1
))
{
pObj
=
(
LPUNKNOWN
)
I
SvItemCm
_Constructor
((
IShellFolder
*
)
iface
,
pObj
=
(
LPUNKNOWN
)
I
temMenu
_Constructor
((
IShellFolder
*
)
iface
,
This
->
pidlRoot
,
apidl
,
cidl
);
hr
=
S_OK
;
}
...
...
dlls/shell32/shfldr_netplaces.c
View file @
e9fa0599
...
...
@@ -426,7 +426,7 @@ static HRESULT WINAPI ISF_NetworkPlaces_fnGetUIObjectOf (IShellFolder2 * iface,
if
(
IsEqualIID
(
riid
,
&
IID_IContextMenu
)
&&
(
cidl
>=
1
))
{
pObj
=
(
LPUNKNOWN
)
I
SvItemCm
_Constructor
((
IShellFolder
*
)
iface
,
This
->
pidlRoot
,
apidl
,
cidl
);
pObj
=
(
LPUNKNOWN
)
I
temMenu
_Constructor
((
IShellFolder
*
)
iface
,
This
->
pidlRoot
,
apidl
,
cidl
);
hr
=
S_OK
;
}
else
if
(
IsEqualIID
(
riid
,
&
IID_IDataObject
)
&&
(
cidl
>=
1
))
...
...
dlls/shell32/shfldr_unixfs.c
View file @
e9fa0599
...
...
@@ -1167,7 +1167,7 @@ static HRESULT WINAPI UnixFolder_IShellFolder2_GetUIObjectOf(IShellFolder2* ifac
}
if
(
IsEqualIID
(
&
IID_IContextMenu
,
riid
))
{
*
ppvOut
=
I
SvItemCm
_Constructor
((
IShellFolder
*
)
iface
,
This
->
m_pidlLocation
,
apidl
,
cidl
);
*
ppvOut
=
I
temMenu
_Constructor
((
IShellFolder
*
)
iface
,
This
->
m_pidlLocation
,
apidl
,
cidl
);
return
S_OK
;
}
else
if
(
IsEqualIID
(
&
IID_IDataObject
,
riid
))
{
*
ppvOut
=
IDataObject_Constructor
(
hwndOwner
,
This
->
m_pidlLocation
,
apidl
,
cidl
);
...
...
dlls/shell32/shlmenu.c
View file @
e9fa0599
...
...
@@ -1275,7 +1275,7 @@ HRESULT WINAPI CDefFolderMenu_Create2(LPCITEMIDLIST pidlFolder, HWND hwnd, UINT
}
else
folder_pidl
=
ILClone
(
pidlFolder
);
system_menu
=
(
IContextMenu
*
)
I
SvItemCm
_Constructor
(
psf
,
folder_pidl
,(
const
LPCITEMIDLIST
*
)
apidl
,
cidl
);
system_menu
=
(
IContextMenu
*
)
I
temMenu
_Constructor
(
psf
,
folder_pidl
,(
const
LPCITEMIDLIST
*
)
apidl
,
cidl
);
hres
=
SHELL_CreateContextMenu
(
hwnd
,
system_menu
,
psf
,
folder_pidl
,
apidl
,
cidl
,
ahkeys
,
nKeys
,
&
IID_IContextMenu
,(
void
**
)
ppcm
);
IContextMenu_Release
(
system_menu
);
ILFree
(
folder_pidl
);
...
...
@@ -1300,7 +1300,7 @@ HRESULT WINAPI SHCreateDefaultContextMenu(const DEFCONTEXTMENU *pdcm, REFIID rii
folder_pidl
=
ILClone
(
pdcm
->
pidlFolder
);
if
(
pdcm
->
cKeys
==
0
)
FIXME
(
"Loading shell extensions using IQueryAssociations not yet supported
\n
"
);
system_menu
=
(
IContextMenu
*
)
I
SvItemCm
_Constructor
(
folder
,
folder_pidl
,(
const
LPCITEMIDLIST
*
)
pdcm
->
apidl
,
pdcm
->
cidl
);
system_menu
=
(
IContextMenu
*
)
I
temMenu
_Constructor
(
folder
,
folder_pidl
,(
const
LPCITEMIDLIST
*
)
pdcm
->
apidl
,
pdcm
->
cidl
);
ret
=
SHELL_CreateContextMenu
(
pdcm
->
hwnd
,
system_menu
,
folder
,
folder_pidl
,(
LPCITEMIDLIST
*
)
pdcm
->
apidl
,
pdcm
->
cidl
,
pdcm
->
aKeys
,
pdcm
->
cKeys
,
riid
,
ppv
);
IContextMenu_Release
(
system_menu
);
ILFree
(
folder_pidl
);
...
...
dlls/shell32/shlview.c
View file @
e9fa0599
...
...
@@ -1095,7 +1095,7 @@ static void ShellView_DoContextMenu(IShellViewImpl * This, WORD x, WORD y, BOOL
{
hMenu
=
CreatePopupMenu
();
pCM
=
ISvBgCm
_Constructor
(
This
->
pSFParent
,
FALSE
);
pCM
=
BackgroundMenu
_Constructor
(
This
->
pSFParent
,
FALSE
);
IContextMenu2_QueryContextMenu
(
pCM
,
hMenu
,
0
,
FCIDM_SHVIEWFIRST
,
FCIDM_SHVIEWLAST
,
0
);
uCommand
=
TrackPopupMenu
(
hMenu
,
TPM_LEFTALIGN
|
TPM_RETURNCMD
,
x
,
y
,
0
,
This
->
hWnd
,
NULL
);
...
...
@@ -2050,7 +2050,7 @@ static HRESULT WINAPI IShellView_fnGetItemObject(IShellView2 *iface, UINT uItem,
if
(
IsEqualIID
(
&
IID_IContextMenu
,
riid
))
{
*
ppvOut
=
ISvBgCm
_Constructor
(
This
->
pSFParent
,
FALSE
);
*
ppvOut
=
BackgroundMenu
_Constructor
(
This
->
pSFParent
,
FALSE
);
hr
=
S_OK
;
}
else
...
...
dlls/shell32/sh
v_item
_cmenu.c
→
dlls/shell32/sh
lview
_cmenu.c
View file @
e9fa0599
/*
* IContextMenu for items in the shellview
*
* Copyright 1998, 2000 Juergen Schmied <juergen.schmied@debitel.net>
* Copyright 1998-2000 Juergen Schmied <juergen.schmied@debitel.net>,
* <juergen.schmied@metronet.de>
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
...
...
@@ -42,7 +43,6 @@
WINE_DEFAULT_DEBUG_CHANNEL
(
shell
);
typedef
struct
{
IContextMenu2
IContextMenu2_iface
;
...
...
@@ -51,28 +51,32 @@ typedef struct
UINT
verb_offset
;
}
ContextMenu
;
/**************************************************************************
* IContextMenu Implementation
*/
typedef
struct
{
ContextMenu
menu
;
LPITEMIDLIST
pidl
;
/* root pidl */
LPITEMIDLIST
*
apidl
;
/* array of child pidls */
UINT
cidl
;
BOOL
bAllValues
;
}
Item
CmImpl
;
}
Item
Menu
;
static
inline
Item
CmImpl
*
impl_from_IContextMenu2
(
IContextMenu2
*
iface
)
static
inline
Item
Menu
*
impl_from_IContextMenu2_Item
(
IContextMenu2
*
iface
)
{
return
CONTAINING_RECORD
(
iface
,
Item
CmImpl
,
menu
.
IContextMenu2_iface
);
return
CONTAINING_RECORD
(
iface
,
Item
Menu
,
menu
.
IContextMenu2_iface
);
}
/**************************************************************************
* ISvItemCm_CanRenameItems()
*/
static
BOOL
ISvItemCm_CanRenameItems
(
ItemCmImpl
*
This
)
typedef
struct
{
ContextMenu
menu
;
BOOL
desktop
;
}
BackgroundMenu
;
static
inline
BackgroundMenu
*
impl_from_IContextMenu2_Back
(
IContextMenu2
*
iface
)
{
return
CONTAINING_RECORD
(
iface
,
BackgroundMenu
,
menu
.
IContextMenu2_iface
);
}
static
BOOL
ItemMenu_CanRenameItems
(
ItemMenu
*
This
)
{
DWORD
attr
;
...
...
@@ -86,12 +90,9 @@ static BOOL ISvItemCm_CanRenameItems(ItemCmImpl *This)
return
attr
&
SFGAO_CANRENAME
;
}
/**************************************************************************
* ISvItemCm_fnQueryInterface
*/
static
HRESULT
WINAPI
ISvItemCm_fnQueryInterface
(
IContextMenu2
*
iface
,
REFIID
riid
,
LPVOID
*
ppvObj
)
static
HRESULT
WINAPI
ItemMenu_QueryInterface
(
IContextMenu2
*
iface
,
REFIID
riid
,
LPVOID
*
ppvObj
)
{
Item
CmImpl
*
This
=
impl_from_IContextMenu2
(
iface
);
Item
Menu
*
This
=
impl_from_IContextMenu2_Item
(
iface
);
TRACE
(
"(%p)->(
\n\t
IID:
\t
%s,%p)
\n
"
,
This
,
debugstr_guid
(
riid
),
ppvObj
);
...
...
@@ -118,12 +119,9 @@ static HRESULT WINAPI ISvItemCm_fnQueryInterface(IContextMenu2 *iface, REFIID ri
return
E_NOINTERFACE
;
}
/**************************************************************************
* ISvItemCm_fnAddRef
*/
static
ULONG
WINAPI
ISvItemCm_fnAddRef
(
IContextMenu2
*
iface
)
static
ULONG
WINAPI
ItemMenu_AddRef
(
IContextMenu2
*
iface
)
{
Item
CmImpl
*
This
=
impl_from_IContextMenu2
(
iface
);
Item
Menu
*
This
=
impl_from_IContextMenu2_Item
(
iface
);
ULONG
refCount
=
InterlockedIncrement
(
&
This
->
menu
.
ref
);
TRACE
(
"(%p)->(count=%u)
\n
"
,
This
,
refCount
-
1
);
...
...
@@ -131,12 +129,9 @@ static ULONG WINAPI ISvItemCm_fnAddRef(IContextMenu2 *iface)
return
refCount
;
}
/**************************************************************************
* ISvItemCm_fnRelease
*/
static
ULONG
WINAPI
ISvItemCm_fnRelease
(
IContextMenu2
*
iface
)
static
ULONG
WINAPI
ItemMenu_Release
(
IContextMenu2
*
iface
)
{
Item
CmImpl
*
This
=
impl_from_IContextMenu2
(
iface
);
Item
Menu
*
This
=
impl_from_IContextMenu2_Item
(
iface
);
ULONG
refCount
=
InterlockedDecrement
(
&
This
->
menu
.
ref
);
TRACE
(
"(%p)->(count=%i)
\n
"
,
This
,
refCount
+
1
);
...
...
@@ -158,10 +153,7 @@ static ULONG WINAPI ISvItemCm_fnRelease(IContextMenu2 *iface)
return
refCount
;
}
/**************************************************************************
* ISvItemCm_fnQueryContextMenu()
*/
static
HRESULT
WINAPI
ISvItemCm_fnQueryContextMenu
(
static
HRESULT
WINAPI
ItemMenu_QueryContextMenu
(
IContextMenu2
*
iface
,
HMENU
hmenu
,
UINT
indexMenu
,
...
...
@@ -169,7 +161,7 @@ static HRESULT WINAPI ISvItemCm_fnQueryContextMenu(
UINT
idCmdLast
,
UINT
uFlags
)
{
Item
CmImpl
*
This
=
impl_from_IContextMenu2
(
iface
);
Item
Menu
*
This
=
impl_from_IContextMenu2_Item
(
iface
);
INT
uIDMax
;
TRACE
(
"(%p)->(hmenu=%p indexmenu=%x cmdfirst=%x cmdlast=%x flags=%x )
\n
"
,
This
,
hmenu
,
indexMenu
,
idCmdFirst
,
idCmdLast
,
uFlags
);
...
...
@@ -212,7 +204,7 @@ static HRESULT WINAPI ISvItemCm_fnQueryContextMenu(
if
(
uFlags
&
~
CMF_CANRENAME
)
RemoveMenu
(
hmenu
,
FCIDM_SHVIEW_RENAME
,
MF_BYCOMMAND
);
else
EnableMenuItem
(
hmenu
,
FCIDM_SHVIEW_RENAME
,
MF_BYCOMMAND
|
I
SvItemCm
_CanRenameItems
(
This
)
?
MFS_ENABLED
:
MFS_DISABLED
);
EnableMenuItem
(
hmenu
,
FCIDM_SHVIEW_RENAME
,
MF_BYCOMMAND
|
I
temMenu
_CanRenameItems
(
This
)
?
MFS_ENABLED
:
MFS_DISABLED
);
return
MAKE_HRESULT
(
SEVERITY_SUCCESS
,
0
,
uIDMax
-
idCmdFirst
);
}
...
...
@@ -225,7 +217,7 @@ static HRESULT WINAPI ISvItemCm_fnQueryContextMenu(
* for folders only
*/
static
void
DoOpenExplore
(
Item
CmImpl
*
This
,
HWND
hwnd
,
LPCSTR
verb
)
static
void
DoOpenExplore
(
Item
Menu
*
This
,
HWND
hwnd
,
LPCSTR
verb
)
{
UINT
i
,
bFolderFound
=
FALSE
;
LPITEMIDLIST
pidlFQ
;
...
...
@@ -264,7 +256,7 @@ static void DoOpenExplore(ItemCmImpl *This, HWND hwnd, LPCSTR verb)
*
* deletes the currently selected items
*/
static
void
DoDelete
(
Item
CmImpl
*
This
)
static
void
DoDelete
(
Item
Menu
*
This
)
{
ISFHelper
*
psfhlp
;
...
...
@@ -281,7 +273,7 @@ static void DoDelete(ItemCmImpl *This)
*
* copies the currently selected items into the clipboard
*/
static
BOOL
DoCopyOrCut
(
Item
CmImpl
*
This
,
HWND
hwnd
,
BOOL
bCut
)
static
BOOL
DoCopyOrCut
(
Item
Menu
*
This
,
HWND
hwnd
,
BOOL
bCut
)
{
LPSHELLBROWSER
lpSB
;
LPSHELLVIEW
lpSV
;
...
...
@@ -322,7 +314,7 @@ static BOOL CALLBACK Properties_AddPropSheetCallback(HPROPSHEETPAGE hpage, LPARA
/**************************************************************************
* DoOpenProperties
*/
static
void
DoOpenProperties
(
Item
CmImpl
*
This
,
HWND
hwnd
)
static
void
DoOpenProperties
(
Item
Menu
*
This
,
HWND
hwnd
)
{
static
const
UINT
MAX_PROP_PAGES
=
99
;
static
const
WCHAR
wszFolder
[]
=
{
'F'
,
'o'
,
'l'
,
'd'
,
'e'
,
'r'
,
0
};
...
...
@@ -423,14 +415,11 @@ static void DoOpenProperties(ItemCmImpl *This, HWND hwnd)
FIXME
(
"No property pages found.
\n
"
);
}
/**************************************************************************
* ISvItemCm_fnInvokeCommand()
*/
static
HRESULT
WINAPI
ISvItemCm_fnInvokeCommand
(
static
HRESULT
WINAPI
ItemMenu_InvokeCommand
(
IContextMenu2
*
iface
,
LPCMINVOKECOMMANDINFO
lpcmi
)
{
Item
CmImpl
*
This
=
impl_from_IContextMenu2
(
iface
);
Item
Menu
*
This
=
impl_from_IContextMenu2_Item
(
iface
);
if
(
lpcmi
->
cbSize
!=
sizeof
(
CMINVOKECOMMANDINFO
))
FIXME
(
"Is an EX structure
\n
"
);
...
...
@@ -511,10 +500,7 @@ static HRESULT WINAPI ISvItemCm_fnInvokeCommand(
return
S_OK
;
}
/**************************************************************************
* ISvItemCm_fnGetCommandString()
*/
static
HRESULT
WINAPI
ISvItemCm_fnGetCommandString
(
static
HRESULT
WINAPI
ItemMenu_GetCommandString
(
IContextMenu2
*
iface
,
UINT_PTR
idCommand
,
UINT
uFlags
,
...
...
@@ -522,7 +508,7 @@ static HRESULT WINAPI ISvItemCm_fnGetCommandString(
LPSTR
lpszName
,
UINT
uMaxNameLen
)
{
Item
CmImpl
*
This
=
impl_from_IContextMenu2
(
iface
);
Item
Menu
*
This
=
impl_from_IContextMenu2_Item
(
iface
);
HRESULT
hr
=
E_INVALIDARG
;
...
...
@@ -567,18 +553,17 @@ static HRESULT WINAPI ISvItemCm_fnGetCommandString(
}
/**************************************************************************
* ISvItemCm_fnHandleMenuMsg()
* NOTES
* should be only in IContextMenu2 and IContextMenu3
* is nevertheless called from word95
*/
static
HRESULT
WINAPI
I
SvItemCm_fn
HandleMenuMsg
(
static
HRESULT
WINAPI
I
temMenu_
HandleMenuMsg
(
IContextMenu2
*
iface
,
UINT
uMsg
,
WPARAM
wParam
,
LPARAM
lParam
)
{
Item
CmImpl
*
This
=
impl_from_IContextMenu2
(
iface
);
Item
Menu
*
This
=
impl_from_IContextMenu2_Item
(
iface
);
TRACE
(
"(%p)->(msg=%x wp=%lx lp=%lx)
\n
"
,
This
,
uMsg
,
wParam
,
lParam
);
...
...
@@ -587,20 +572,20 @@ static HRESULT WINAPI ISvItemCm_fnHandleMenuMsg(
static
const
IContextMenu2Vtbl
ItemContextMenuVtbl
=
{
ISvItemCm_fn
QueryInterface
,
ISvItemCm_fn
AddRef
,
ISvItemCm_fn
Release
,
ISvItemCm_fn
QueryContextMenu
,
ISvItemCm_fn
InvokeCommand
,
ISvItemCm_fn
GetCommandString
,
ISvItemCm_fn
HandleMenuMsg
ItemMenu_
QueryInterface
,
ItemMenu_
AddRef
,
ItemMenu_
Release
,
ItemMenu_
QueryContextMenu
,
ItemMenu_
InvokeCommand
,
ItemMenu_
GetCommandString
,
ItemMenu_
HandleMenuMsg
};
IContextMenu2
*
I
SvItemCm
_Constructor
(
IShellFolder
*
parent
,
LPCITEMIDLIST
pidl
,
const
LPCITEMIDLIST
*
apidl
,
UINT
cidl
)
{
Item
CmImpl
*
cm
;
IContextMenu2
*
I
temMenu
_Constructor
(
IShellFolder
*
parent
,
LPCITEMIDLIST
pidl
,
const
LPCITEMIDLIST
*
apidl
,
UINT
cidl
)
{
Item
Menu
*
cm
;
UINT
u
;
cm
=
HeapAlloc
(
GetProcessHeap
(),
0
,
sizeof
(
Item
CmImpl
));
cm
=
HeapAlloc
(
GetProcessHeap
(),
0
,
sizeof
(
Item
Menu
));
cm
->
menu
.
IContextMenu2_iface
.
lpVtbl
=
&
ItemContextMenuVtbl
;
cm
->
menu
.
ref
=
1
;
cm
->
menu
.
verb_offset
=
0
;
...
...
@@ -621,3 +606,368 @@ IContextMenu2 *ISvItemCm_Constructor(IShellFolder *parent, LPCITEMIDLIST pidl, c
return
&
cm
->
menu
.
IContextMenu2_iface
;
}
/* Background menu implementation */
static
HRESULT
WINAPI
BackgroundMenu_QueryInterface
(
IContextMenu2
*
iface
,
REFIID
riid
,
void
**
ppvObj
)
{
BackgroundMenu
*
This
=
impl_from_IContextMenu2_Back
(
iface
);
TRACE
(
"(%p)->(%s %p)
\n
"
,
This
,
debugstr_guid
(
riid
),
ppvObj
);
*
ppvObj
=
NULL
;
if
(
IsEqualIID
(
riid
,
&
IID_IUnknown
)
||
IsEqualIID
(
riid
,
&
IID_IContextMenu
)
||
IsEqualIID
(
riid
,
&
IID_IContextMenu2
))
{
*
ppvObj
=
This
;
}
else
if
(
IsEqualIID
(
riid
,
&
IID_IShellExtInit
))
/*IShellExtInit*/
{
FIXME
(
"-- LPSHELLEXTINIT pointer requested
\n
"
);
}
if
(
*
ppvObj
)
{
IUnknown_AddRef
((
IUnknown
*
)
*
ppvObj
);
TRACE
(
"-- Interface: (%p)->(%p)
\n
"
,
ppvObj
,
*
ppvObj
);
return
S_OK
;
}
TRACE
(
"-- Interface: E_NOINTERFACE
\n
"
);
return
E_NOINTERFACE
;
}
static
ULONG
WINAPI
BackgroundMenu_AddRef
(
IContextMenu2
*
iface
)
{
BackgroundMenu
*
This
=
impl_from_IContextMenu2_Back
(
iface
);
ULONG
ref
=
InterlockedIncrement
(
&
This
->
menu
.
ref
);
TRACE
(
"(%p)->(%u)
\n
"
,
This
,
ref
);
return
ref
;
}
static
ULONG
WINAPI
BackgroundMenu_Release
(
IContextMenu2
*
iface
)
{
BackgroundMenu
*
This
=
impl_from_IContextMenu2_Back
(
iface
);
ULONG
ref
=
InterlockedDecrement
(
&
This
->
menu
.
ref
);
TRACE
(
"(%p)->(%u)
\n
"
,
This
,
ref
);
if
(
!
ref
)
{
if
(
This
->
menu
.
parent
)
IShellFolder_Release
(
This
->
menu
.
parent
);
HeapFree
(
GetProcessHeap
(),
0
,
This
);
}
return
ref
;
}
static
HRESULT
WINAPI
BackgroundMenu_QueryContextMenu
(
IContextMenu2
*
iface
,
HMENU
hMenu
,
UINT
indexMenu
,
UINT
idCmdFirst
,
UINT
idCmdLast
,
UINT
uFlags
)
{
BackgroundMenu
*
This
=
impl_from_IContextMenu2_Back
(
iface
);
HMENU
hMyMenu
;
UINT
idMax
;
HRESULT
hr
;
TRACE
(
"(%p)->(hmenu=%p indexmenu=%x cmdfirst=%x cmdlast=%x flags=%x )
\n
"
,
This
,
hMenu
,
indexMenu
,
idCmdFirst
,
idCmdLast
,
uFlags
);
This
->
menu
.
verb_offset
=
idCmdFirst
;
hMyMenu
=
LoadMenuA
(
shell32_hInstance
,
"MENU_002"
);
if
(
uFlags
&
CMF_DEFAULTONLY
)
{
HMENU
ourMenu
=
GetSubMenu
(
hMyMenu
,
0
);
UINT
oldDef
=
GetMenuDefaultItem
(
hMenu
,
TRUE
,
GMDI_USEDISABLED
);
UINT
newDef
=
GetMenuDefaultItem
(
ourMenu
,
TRUE
,
GMDI_USEDISABLED
);
if
(
newDef
!=
oldDef
)
SetMenuDefaultItem
(
hMenu
,
newDef
,
TRUE
);
if
(
newDef
!=
0xFFFFFFFF
)
hr
=
MAKE_HRESULT
(
SEVERITY_SUCCESS
,
FACILITY_NULL
,
newDef
+
1
);
else
hr
=
MAKE_HRESULT
(
SEVERITY_SUCCESS
,
FACILITY_NULL
,
0
);
}
else
{
idMax
=
Shell_MergeMenus
(
hMenu
,
GetSubMenu
(
hMyMenu
,
0
),
indexMenu
,
idCmdFirst
,
idCmdLast
,
MM_SUBMENUSHAVEIDS
);
hr
=
MAKE_HRESULT
(
SEVERITY_SUCCESS
,
FACILITY_NULL
,
idMax
-
idCmdFirst
);
}
DestroyMenu
(
hMyMenu
);
TRACE
(
"(%p)->returning 0x%x
\n
"
,
This
,
hr
);
return
hr
;
}
static
void
DoNewFolder
(
BackgroundMenu
*
This
,
IShellView
*
psv
)
{
ISFHelper
*
psfhlp
;
WCHAR
wszName
[
MAX_PATH
];
IShellFolder_QueryInterface
(
This
->
menu
.
parent
,
&
IID_ISFHelper
,
(
LPVOID
*
)
&
psfhlp
);
if
(
psfhlp
)
{
LPITEMIDLIST
pidl
;
ISFHelper_GetUniqueName
(
psfhlp
,
wszName
,
MAX_PATH
);
ISFHelper_AddFolder
(
psfhlp
,
0
,
wszName
,
&
pidl
);
if
(
psv
)
{
/* if we are in a shellview do labeledit */
IShellView_SelectItem
(
psv
,
pidl
,(
SVSI_DESELECTOTHERS
|
SVSI_EDIT
|
SVSI_ENSUREVISIBLE
|
SVSI_FOCUSED
|
SVSI_SELECT
));
}
SHFree
(
pidl
);
ISFHelper_Release
(
psfhlp
);
}
}
static
BOOL
DoPaste
(
BackgroundMenu
*
This
)
{
BOOL
bSuccess
=
FALSE
;
IDataObject
*
pda
;
TRACE
(
"
\n
"
);
if
(
SUCCEEDED
(
OleGetClipboard
(
&
pda
)))
{
STGMEDIUM
medium
;
FORMATETC
formatetc
;
TRACE
(
"pda=%p
\n
"
,
pda
);
/* Set the FORMATETC structure*/
InitFormatEtc
(
formatetc
,
RegisterClipboardFormatW
(
CFSTR_SHELLIDLISTW
),
TYMED_HGLOBAL
);
/* Get the pidls from IDataObject */
if
(
SUCCEEDED
(
IDataObject_GetData
(
pda
,
&
formatetc
,
&
medium
)))
{
LPITEMIDLIST
*
apidl
;
LPITEMIDLIST
pidl
;
IShellFolder
*
psfFrom
=
NULL
,
*
psfDesktop
;
LPIDA
lpcida
=
GlobalLock
(
medium
.
u
.
hGlobal
);
TRACE
(
"cida=%p
\n
"
,
lpcida
);
apidl
=
_ILCopyCidaToaPidl
(
&
pidl
,
lpcida
);
/* bind to the source shellfolder */
SHGetDesktopFolder
(
&
psfDesktop
);
if
(
psfDesktop
)
{
IShellFolder_BindToObject
(
psfDesktop
,
pidl
,
NULL
,
&
IID_IShellFolder
,
(
LPVOID
*
)
&
psfFrom
);
IShellFolder_Release
(
psfDesktop
);
}
if
(
psfFrom
)
{
/* get source and destination shellfolder */
ISFHelper
*
psfhlpdst
,
*
psfhlpsrc
;
IShellFolder_QueryInterface
(
This
->
menu
.
parent
,
&
IID_ISFHelper
,
(
LPVOID
*
)
&
psfhlpdst
);
IShellFolder_QueryInterface
(
psfFrom
,
&
IID_ISFHelper
,
(
LPVOID
*
)
&
psfhlpsrc
);
/* do the copy/move */
if
(
psfhlpdst
&&
psfhlpsrc
)
{
ISFHelper_CopyItems
(
psfhlpdst
,
psfFrom
,
lpcida
->
cidl
,
(
LPCITEMIDLIST
*
)
apidl
);
/* FIXME handle move
ISFHelper_DeleteItems(psfhlpsrc, lpcida->cidl, apidl);
*/
}
if
(
psfhlpdst
)
ISFHelper_Release
(
psfhlpdst
);
if
(
psfhlpsrc
)
ISFHelper_Release
(
psfhlpsrc
);
IShellFolder_Release
(
psfFrom
);
}
_ILFreeaPidl
(
apidl
,
lpcida
->
cidl
);
SHFree
(
pidl
);
/* release the medium*/
ReleaseStgMedium
(
&
medium
);
}
IDataObject_Release
(
pda
);
}
#if 0
HGLOBAL hMem;
OpenClipboard(NULL);
hMem = GetClipboardData(CF_HDROP);
if(hMem)
{
char * pDropFiles = GlobalLock(hMem);
if(pDropFiles)
{
int len, offset = sizeof(DROPFILESTRUCT);
while( pDropFiles[offset] != 0)
{
len = strlen(pDropFiles + offset);
TRACE("%s\n", pDropFiles + offset);
offset += len+1;
}
}
GlobalUnlock(hMem);
}
CloseClipboard();
#endif
return
bSuccess
;
}
static
HRESULT
WINAPI
BackgroundMenu_InvokeCommand
(
IContextMenu2
*
iface
,
LPCMINVOKECOMMANDINFO
lpcmi
)
{
BackgroundMenu
*
This
=
impl_from_IContextMenu2_Back
(
iface
);
LPSHELLBROWSER
lpSB
;
LPSHELLVIEW
lpSV
=
NULL
;
HWND
hWndSV
=
0
;
TRACE
(
"(%p)->(invcom=%p verb=%p wnd=%p)
\n
"
,
This
,
lpcmi
,
lpcmi
->
lpVerb
,
lpcmi
->
hwnd
);
/* get the active IShellView */
if
((
lpSB
=
(
LPSHELLBROWSER
)
SendMessageA
(
lpcmi
->
hwnd
,
CWM_GETISHELLBROWSER
,
0
,
0
)))
{
if
(
SUCCEEDED
(
IShellBrowser_QueryActiveShellView
(
lpSB
,
&
lpSV
)))
{
IShellView_GetWindow
(
lpSV
,
&
hWndSV
);
}
}
if
(
HIWORD
(
lpcmi
->
lpVerb
))
{
TRACE
(
"%s
\n
"
,
lpcmi
->
lpVerb
);
if
(
!
strcmp
(
lpcmi
->
lpVerb
,
CMDSTR_NEWFOLDERA
))
{
DoNewFolder
(
This
,
lpSV
);
}
else
if
(
!
strcmp
(
lpcmi
->
lpVerb
,
CMDSTR_VIEWLISTA
))
{
if
(
hWndSV
)
SendMessageA
(
hWndSV
,
WM_COMMAND
,
MAKEWPARAM
(
FCIDM_SHVIEW_LISTVIEW
,
0
),
0
);
}
else
if
(
!
strcmp
(
lpcmi
->
lpVerb
,
CMDSTR_VIEWDETAILSA
))
{
if
(
hWndSV
)
SendMessageA
(
hWndSV
,
WM_COMMAND
,
MAKEWPARAM
(
FCIDM_SHVIEW_REPORTVIEW
,
0
),
0
);
}
else
{
FIXME
(
"please report: unknown verb %s
\n
"
,
lpcmi
->
lpVerb
);
}
}
else
{
switch
(
LOWORD
(
lpcmi
->
lpVerb
)
-
This
->
menu
.
verb_offset
)
{
case
FCIDM_SHVIEW_REFRESH
:
if
(
lpSV
)
IShellView_Refresh
(
lpSV
);
break
;
case
FCIDM_SHVIEW_NEWFOLDER
:
DoNewFolder
(
This
,
lpSV
);
break
;
case
FCIDM_SHVIEW_INSERT
:
DoPaste
(
This
);
break
;
case
FCIDM_SHVIEW_PROPERTIES
:
if
(
This
->
desktop
)
{
ShellExecuteA
(
lpcmi
->
hwnd
,
"open"
,
"rundll32.exe shell32.dll,Control_RunDLL desk.cpl"
,
NULL
,
NULL
,
SW_SHOWNORMAL
);
}
else
{
FIXME
(
"launch item properties dialog
\n
"
);
}
break
;
default:
/* if it's an id just pass it to the parent shv */
if
(
hWndSV
)
SendMessageA
(
hWndSV
,
WM_COMMAND
,
MAKEWPARAM
(
LOWORD
(
lpcmi
->
lpVerb
),
0
),
0
);
break
;
}
}
if
(
lpSV
)
IShellView_Release
(
lpSV
);
/* QueryActiveShellView does AddRef */
return
S_OK
;
}
static
HRESULT
WINAPI
BackgroundMenu_GetCommandString
(
IContextMenu2
*
iface
,
UINT_PTR
idCommand
,
UINT
uFlags
,
UINT
*
lpReserved
,
LPSTR
lpszName
,
UINT
uMaxNameLen
)
{
BackgroundMenu
*
This
=
impl_from_IContextMenu2_Back
(
iface
);
TRACE
(
"(%p)->(idcom=%lx flags=%x %p name=%p len=%x)
\n
"
,
This
,
idCommand
,
uFlags
,
lpReserved
,
lpszName
,
uMaxNameLen
);
/* test the existence of the menu items, the file dialog enables
the buttons according to this */
if
(
uFlags
==
GCS_VALIDATEA
)
{
if
(
HIWORD
(
idCommand
))
{
if
(
!
strcmp
((
LPSTR
)
idCommand
,
CMDSTR_VIEWLISTA
)
||
!
strcmp
((
LPSTR
)
idCommand
,
CMDSTR_VIEWDETAILSA
)
||
!
strcmp
((
LPSTR
)
idCommand
,
CMDSTR_NEWFOLDERA
))
{
return
S_OK
;
}
}
}
FIXME
(
"unknown command string
\n
"
);
return
E_FAIL
;
}
static
HRESULT
WINAPI
BackgroundMenu_HandleMenuMsg
(
IContextMenu2
*
iface
,
UINT
uMsg
,
WPARAM
wParam
,
LPARAM
lParam
)
{
BackgroundMenu
*
This
=
impl_from_IContextMenu2_Back
(
iface
);
FIXME
(
"(%p)->(msg=%x wp=%lx lp=%lx)
\n
"
,
This
,
uMsg
,
wParam
,
lParam
);
return
E_NOTIMPL
;
}
static
const
IContextMenu2Vtbl
BackgroundContextMenuVtbl
=
{
BackgroundMenu_QueryInterface
,
BackgroundMenu_AddRef
,
BackgroundMenu_Release
,
BackgroundMenu_QueryContextMenu
,
BackgroundMenu_InvokeCommand
,
BackgroundMenu_GetCommandString
,
BackgroundMenu_HandleMenuMsg
};
IContextMenu2
*
BackgroundMenu_Constructor
(
IShellFolder
*
parent
,
BOOL
desktop
)
{
BackgroundMenu
*
cm
;
cm
=
HeapAlloc
(
GetProcessHeap
(),
0
,
sizeof
(
*
cm
));
cm
->
menu
.
IContextMenu2_iface
.
lpVtbl
=
&
BackgroundContextMenuVtbl
;
cm
->
menu
.
ref
=
1
;
cm
->
menu
.
parent
=
parent
;
cm
->
menu
.
verb_offset
=
0
;
cm
->
desktop
=
desktop
;
if
(
parent
)
IShellFolder_AddRef
(
parent
);
TRACE
(
"(%p)->()
\n
"
,
cm
);
return
&
cm
->
menu
.
IContextMenu2_iface
;
}
dlls/shell32/shv_bg_cmenu.c
deleted
100644 → 0
View file @
de0813c7
/*
* IContextMenu
* ShellView Background Context Menu (shv_bg_cm)
*
* Copyright 1999 Juergen Schmied <juergen.schmied@metronet.de>
*
* 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 <string.h>
#define COBJMACROS
#define NONAMELESSUNION
#define NONAMELESSSTRUCT
#include "wine/debug.h"
#include "windef.h"
#include "wingdi.h"
#include "pidl.h"
#include "shlobj.h"
#include "shell32_main.h"
#include "shellfolder.h"
#include "undocshell.h"
WINE_DEFAULT_DEBUG_CHANNEL
(
shell
);
/**************************************************************************
* IContextMenu Implementation
*/
typedef
struct
{
IContextMenu2
IContextMenu2_iface
;
IShellFolder
*
pSFParent
;
LONG
ref
;
BOOL
bDesktop
;
UINT
verb_offset
;
}
BgCmImpl
;
static
inline
BgCmImpl
*
impl_from_IContextMenu2
(
IContextMenu2
*
iface
)
{
return
CONTAINING_RECORD
(
iface
,
BgCmImpl
,
IContextMenu2_iface
);
}
/**************************************************************************
* ISVBgCm_fnQueryInterface
*/
static
HRESULT
WINAPI
ISVBgCm_fnQueryInterface
(
IContextMenu2
*
iface
,
REFIID
riid
,
LPVOID
*
ppvObj
)
{
BgCmImpl
*
This
=
impl_from_IContextMenu2
(
iface
);
TRACE
(
"(%p)->(
\n\t
IID:
\t
%s,%p)
\n
"
,
This
,
debugstr_guid
(
riid
),
ppvObj
);
*
ppvObj
=
NULL
;
if
(
IsEqualIID
(
riid
,
&
IID_IUnknown
)
||
IsEqualIID
(
riid
,
&
IID_IContextMenu
)
||
IsEqualIID
(
riid
,
&
IID_IContextMenu2
))
{
*
ppvObj
=
This
;
}
else
if
(
IsEqualIID
(
riid
,
&
IID_IShellExtInit
))
/*IShellExtInit*/
{
FIXME
(
"-- LPSHELLEXTINIT pointer requested
\n
"
);
}
if
(
*
ppvObj
)
{
IUnknown_AddRef
((
IUnknown
*
)
*
ppvObj
);
TRACE
(
"-- Interface: (%p)->(%p)
\n
"
,
ppvObj
,
*
ppvObj
);
return
S_OK
;
}
TRACE
(
"-- Interface: E_NOINTERFACE
\n
"
);
return
E_NOINTERFACE
;
}
/**************************************************************************
* ISVBgCm_fnAddRef
*/
static
ULONG
WINAPI
ISVBgCm_fnAddRef
(
IContextMenu2
*
iface
)
{
BgCmImpl
*
This
=
impl_from_IContextMenu2
(
iface
);
ULONG
refCount
=
InterlockedIncrement
(
&
This
->
ref
);
TRACE
(
"(%p)->(count=%u)
\n
"
,
This
,
refCount
-
1
);
return
refCount
;
}
/**************************************************************************
* ISVBgCm_fnRelease
*/
static
ULONG
WINAPI
ISVBgCm_fnRelease
(
IContextMenu2
*
iface
)
{
BgCmImpl
*
This
=
impl_from_IContextMenu2
(
iface
);
ULONG
refCount
=
InterlockedDecrement
(
&
This
->
ref
);
TRACE
(
"(%p)->(count=%i)
\n
"
,
This
,
refCount
+
1
);
if
(
!
refCount
)
{
TRACE
(
" destroying IContextMenu(%p)
\n
"
,
This
);
if
(
This
->
pSFParent
)
IShellFolder_Release
(
This
->
pSFParent
);
HeapFree
(
GetProcessHeap
(),
0
,
This
);
}
return
refCount
;
}
/**************************************************************************
* ISVBgCm_fnQueryContextMenu()
*/
static
HRESULT
WINAPI
ISVBgCm_fnQueryContextMenu
(
IContextMenu2
*
iface
,
HMENU
hMenu
,
UINT
indexMenu
,
UINT
idCmdFirst
,
UINT
idCmdLast
,
UINT
uFlags
)
{
BgCmImpl
*
This
=
impl_from_IContextMenu2
(
iface
);
HMENU
hMyMenu
;
UINT
idMax
;
HRESULT
hr
;
TRACE
(
"(%p)->(hmenu=%p indexmenu=%x cmdfirst=%x cmdlast=%x flags=%x )
\n
"
,
This
,
hMenu
,
indexMenu
,
idCmdFirst
,
idCmdLast
,
uFlags
);
This
->
verb_offset
=
idCmdFirst
;
hMyMenu
=
LoadMenuA
(
shell32_hInstance
,
"MENU_002"
);
if
(
uFlags
&
CMF_DEFAULTONLY
)
{
HMENU
ourMenu
=
GetSubMenu
(
hMyMenu
,
0
);
UINT
oldDef
=
GetMenuDefaultItem
(
hMenu
,
TRUE
,
GMDI_USEDISABLED
);
UINT
newDef
=
GetMenuDefaultItem
(
ourMenu
,
TRUE
,
GMDI_USEDISABLED
);
if
(
newDef
!=
oldDef
)
SetMenuDefaultItem
(
hMenu
,
newDef
,
TRUE
);
if
(
newDef
!=
0xFFFFFFFF
)
hr
=
MAKE_HRESULT
(
SEVERITY_SUCCESS
,
FACILITY_NULL
,
newDef
+
1
);
else
hr
=
MAKE_HRESULT
(
SEVERITY_SUCCESS
,
FACILITY_NULL
,
0
);
}
else
{
idMax
=
Shell_MergeMenus
(
hMenu
,
GetSubMenu
(
hMyMenu
,
0
),
indexMenu
,
idCmdFirst
,
idCmdLast
,
MM_SUBMENUSHAVEIDS
);
hr
=
MAKE_HRESULT
(
SEVERITY_SUCCESS
,
FACILITY_NULL
,
idMax
-
idCmdFirst
);
}
DestroyMenu
(
hMyMenu
);
TRACE
(
"(%p)->returning 0x%x
\n
"
,
This
,
hr
);
return
hr
;
}
/**************************************************************************
* DoNewFolder
*/
static
void
DoNewFolder
(
BgCmImpl
*
This
,
IShellView
*
psv
)
{
ISFHelper
*
psfhlp
;
WCHAR
wszName
[
MAX_PATH
];
IShellFolder_QueryInterface
(
This
->
pSFParent
,
&
IID_ISFHelper
,
(
LPVOID
*
)
&
psfhlp
);
if
(
psfhlp
)
{
LPITEMIDLIST
pidl
;
ISFHelper_GetUniqueName
(
psfhlp
,
wszName
,
MAX_PATH
);
ISFHelper_AddFolder
(
psfhlp
,
0
,
wszName
,
&
pidl
);
if
(
psv
)
{
/* if we are in a shellview do labeledit */
IShellView_SelectItem
(
psv
,
pidl
,(
SVSI_DESELECTOTHERS
|
SVSI_EDIT
|
SVSI_ENSUREVISIBLE
|
SVSI_FOCUSED
|
SVSI_SELECT
));
}
SHFree
(
pidl
);
ISFHelper_Release
(
psfhlp
);
}
}
/**************************************************************************
* DoPaste
*/
static
BOOL
DoPaste
(
BgCmImpl
*
This
)
{
BOOL
bSuccess
=
FALSE
;
IDataObject
*
pda
;
TRACE
(
"
\n
"
);
if
(
SUCCEEDED
(
OleGetClipboard
(
&
pda
)))
{
STGMEDIUM
medium
;
FORMATETC
formatetc
;
TRACE
(
"pda=%p
\n
"
,
pda
);
/* Set the FORMATETC structure*/
InitFormatEtc
(
formatetc
,
RegisterClipboardFormatW
(
CFSTR_SHELLIDLISTW
),
TYMED_HGLOBAL
);
/* Get the pidls from IDataObject */
if
(
SUCCEEDED
(
IDataObject_GetData
(
pda
,
&
formatetc
,
&
medium
)))
{
LPITEMIDLIST
*
apidl
;
LPITEMIDLIST
pidl
;
IShellFolder
*
psfFrom
=
NULL
,
*
psfDesktop
;
LPIDA
lpcida
=
GlobalLock
(
medium
.
u
.
hGlobal
);
TRACE
(
"cida=%p
\n
"
,
lpcida
);
apidl
=
_ILCopyCidaToaPidl
(
&
pidl
,
lpcida
);
/* bind to the source shellfolder */
SHGetDesktopFolder
(
&
psfDesktop
);
if
(
psfDesktop
)
{
IShellFolder_BindToObject
(
psfDesktop
,
pidl
,
NULL
,
&
IID_IShellFolder
,
(
LPVOID
*
)
&
psfFrom
);
IShellFolder_Release
(
psfDesktop
);
}
if
(
psfFrom
)
{
/* get source and destination shellfolder */
ISFHelper
*
psfhlpdst
,
*
psfhlpsrc
;
IShellFolder_QueryInterface
(
This
->
pSFParent
,
&
IID_ISFHelper
,
(
LPVOID
*
)
&
psfhlpdst
);
IShellFolder_QueryInterface
(
psfFrom
,
&
IID_ISFHelper
,
(
LPVOID
*
)
&
psfhlpsrc
);
/* do the copy/move */
if
(
psfhlpdst
&&
psfhlpsrc
)
{
ISFHelper_CopyItems
(
psfhlpdst
,
psfFrom
,
lpcida
->
cidl
,
(
LPCITEMIDLIST
*
)
apidl
);
/* FIXME handle move
ISFHelper_DeleteItems(psfhlpsrc, lpcida->cidl, apidl);
*/
}
if
(
psfhlpdst
)
ISFHelper_Release
(
psfhlpdst
);
if
(
psfhlpsrc
)
ISFHelper_Release
(
psfhlpsrc
);
IShellFolder_Release
(
psfFrom
);
}
_ILFreeaPidl
(
apidl
,
lpcida
->
cidl
);
SHFree
(
pidl
);
/* release the medium*/
ReleaseStgMedium
(
&
medium
);
}
IDataObject_Release
(
pda
);
}
#if 0
HGLOBAL hMem;
OpenClipboard(NULL);
hMem = GetClipboardData(CF_HDROP);
if(hMem)
{
char * pDropFiles = GlobalLock(hMem);
if(pDropFiles)
{
int len, offset = sizeof(DROPFILESTRUCT);
while( pDropFiles[offset] != 0)
{
len = strlen(pDropFiles + offset);
TRACE("%s\n", pDropFiles + offset);
offset += len+1;
}
}
GlobalUnlock(hMem);
}
CloseClipboard();
#endif
return
bSuccess
;
}
/**************************************************************************
* ISVBgCm_fnInvokeCommand()
*/
static
HRESULT
WINAPI
ISVBgCm_fnInvokeCommand
(
IContextMenu2
*
iface
,
LPCMINVOKECOMMANDINFO
lpcmi
)
{
BgCmImpl
*
This
=
impl_from_IContextMenu2
(
iface
);
LPSHELLBROWSER
lpSB
;
LPSHELLVIEW
lpSV
=
NULL
;
HWND
hWndSV
=
0
;
TRACE
(
"(%p)->(invcom=%p verb=%p wnd=%p)
\n
"
,
This
,
lpcmi
,
lpcmi
->
lpVerb
,
lpcmi
->
hwnd
);
/* get the active IShellView */
if
((
lpSB
=
(
LPSHELLBROWSER
)
SendMessageA
(
lpcmi
->
hwnd
,
CWM_GETISHELLBROWSER
,
0
,
0
)))
{
if
(
SUCCEEDED
(
IShellBrowser_QueryActiveShellView
(
lpSB
,
&
lpSV
)))
{
IShellView_GetWindow
(
lpSV
,
&
hWndSV
);
}
}
if
(
HIWORD
(
lpcmi
->
lpVerb
))
{
TRACE
(
"%s
\n
"
,
lpcmi
->
lpVerb
);
if
(
!
strcmp
(
lpcmi
->
lpVerb
,
CMDSTR_NEWFOLDERA
))
{
DoNewFolder
(
This
,
lpSV
);
}
else
if
(
!
strcmp
(
lpcmi
->
lpVerb
,
CMDSTR_VIEWLISTA
))
{
if
(
hWndSV
)
SendMessageA
(
hWndSV
,
WM_COMMAND
,
MAKEWPARAM
(
FCIDM_SHVIEW_LISTVIEW
,
0
),
0
);
}
else
if
(
!
strcmp
(
lpcmi
->
lpVerb
,
CMDSTR_VIEWDETAILSA
))
{
if
(
hWndSV
)
SendMessageA
(
hWndSV
,
WM_COMMAND
,
MAKEWPARAM
(
FCIDM_SHVIEW_REPORTVIEW
,
0
),
0
);
}
else
{
FIXME
(
"please report: unknown verb %s
\n
"
,
lpcmi
->
lpVerb
);
}
}
else
{
switch
(
LOWORD
(
lpcmi
->
lpVerb
)
-
This
->
verb_offset
)
{
case
FCIDM_SHVIEW_REFRESH
:
if
(
lpSV
)
IShellView_Refresh
(
lpSV
);
break
;
case
FCIDM_SHVIEW_NEWFOLDER
:
DoNewFolder
(
This
,
lpSV
);
break
;
case
FCIDM_SHVIEW_INSERT
:
DoPaste
(
This
);
break
;
case
FCIDM_SHVIEW_PROPERTIES
:
if
(
This
->
bDesktop
)
{
ShellExecuteA
(
lpcmi
->
hwnd
,
"open"
,
"rundll32.exe shell32.dll,Control_RunDLL desk.cpl"
,
NULL
,
NULL
,
SW_SHOWNORMAL
);
}
else
{
FIXME
(
"launch item properties dialog
\n
"
);
}
break
;
default:
/* if it's an id just pass it to the parent shv */
if
(
hWndSV
)
SendMessageA
(
hWndSV
,
WM_COMMAND
,
MAKEWPARAM
(
LOWORD
(
lpcmi
->
lpVerb
),
0
),
0
);
break
;
}
}
if
(
lpSV
)
IShellView_Release
(
lpSV
);
/* QueryActiveShellView does AddRef */
return
S_OK
;
}
/**************************************************************************
* ISVBgCm_fnGetCommandString()
*
*/
static
HRESULT
WINAPI
ISVBgCm_fnGetCommandString
(
IContextMenu2
*
iface
,
UINT_PTR
idCommand
,
UINT
uFlags
,
UINT
*
lpReserved
,
LPSTR
lpszName
,
UINT
uMaxNameLen
)
{
BgCmImpl
*
This
=
impl_from_IContextMenu2
(
iface
);
TRACE
(
"(%p)->(idcom=%lx flags=%x %p name=%p len=%x)
\n
"
,
This
,
idCommand
,
uFlags
,
lpReserved
,
lpszName
,
uMaxNameLen
);
/* test the existence of the menu items, the file dialog enables
the buttons according to this */
if
(
uFlags
==
GCS_VALIDATEA
)
{
if
(
HIWORD
(
idCommand
))
{
if
(
!
strcmp
((
LPSTR
)
idCommand
,
CMDSTR_VIEWLISTA
)
||
!
strcmp
((
LPSTR
)
idCommand
,
CMDSTR_VIEWDETAILSA
)
||
!
strcmp
((
LPSTR
)
idCommand
,
CMDSTR_NEWFOLDERA
))
{
return
S_OK
;
}
}
}
FIXME
(
"unknown command string
\n
"
);
return
E_FAIL
;
}
/**************************************************************************
* ISVBgCm_fnHandleMenuMsg()
*/
static
HRESULT
WINAPI
ISVBgCm_fnHandleMenuMsg
(
IContextMenu2
*
iface
,
UINT
uMsg
,
WPARAM
wParam
,
LPARAM
lParam
)
{
BgCmImpl
*
This
=
impl_from_IContextMenu2
(
iface
);
FIXME
(
"(%p)->(msg=%x wp=%lx lp=%lx)
\n
"
,
This
,
uMsg
,
wParam
,
lParam
);
return
E_NOTIMPL
;
}
/**************************************************************************
* IContextMenu2 VTable
*
*/
static
const
IContextMenu2Vtbl
BackgroundContextMenuVtbl
=
{
ISVBgCm_fnQueryInterface
,
ISVBgCm_fnAddRef
,
ISVBgCm_fnRelease
,
ISVBgCm_fnQueryContextMenu
,
ISVBgCm_fnInvokeCommand
,
ISVBgCm_fnGetCommandString
,
ISVBgCm_fnHandleMenuMsg
};
IContextMenu2
*
ISvBgCm_Constructor
(
IShellFolder
*
pSFParent
,
BOOL
bDesktop
)
{
BgCmImpl
*
cm
;
cm
=
HeapAlloc
(
GetProcessHeap
(),
0
,
sizeof
(
*
cm
));
cm
->
IContextMenu2_iface
.
lpVtbl
=
&
BackgroundContextMenuVtbl
;
cm
->
ref
=
1
;
cm
->
pSFParent
=
pSFParent
;
cm
->
bDesktop
=
bDesktop
;
cm
->
verb_offset
=
0
;
if
(
pSFParent
)
IShellFolder_AddRef
(
pSFParent
);
TRACE
(
"(%p)->()
\n
"
,
cm
);
return
&
cm
->
IContextMenu2_iface
;
}
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