- create a resource string for "create link"

- implement a custom context menu for the control panel items
- action "create link is not yet implemented

svn path=/trunk/; revision=35096
This commit is contained in:
Johannes Anderwald 2008-08-04 13:43:10 +00:00
parent c2aea64e7d
commit 578b10c107
30 changed files with 225 additions and 5 deletions

View file

@ -18,7 +18,7 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
#include "config.h"
#include "wine/config.h"
#include "wine/port.h"
#include <stdlib.h>
@ -63,24 +63,33 @@ typedef struct {
const IPersistFolder2Vtbl *lpVtblPersistFolder2;
const IShellExecuteHookWVtbl *lpVtblShellExecuteHookW;
const IShellExecuteHookAVtbl *lpVtblShellExecuteHookA;
const IContextMenu2Vtbl *lpVtblContextMenu;
IUnknown *pUnkOuter; /* used for aggregation */
/* both paths are parsible from the desktop */
LPITEMIDLIST pidlRoot; /* absolute pidl */
int dwAttributes; /* attributes returned by GetAttributesOf FIXME: use it */
LPCITEMIDLIST *apidl;
UINT cidl;
} ICPanelImpl;
static const IShellFolder2Vtbl vt_ShellFolder2;
static const IPersistFolder2Vtbl vt_PersistFolder2;
static const IShellExecuteHookWVtbl vt_ShellExecuteHookW;
static const IShellExecuteHookAVtbl vt_ShellExecuteHookA;
static const IContextMenu2Vtbl vt_ContextMenu;
static inline ICPanelImpl *impl_from_IPersistFolder2( IPersistFolder2 *iface )
{
return (ICPanelImpl *)((char*)iface - FIELD_OFFSET(ICPanelImpl, lpVtblPersistFolder2));
}
static inline ICPanelImpl *impl_from_IContextMenu( IContextMenu2 *iface )
{
return (ICPanelImpl *)((char*)iface - FIELD_OFFSET(ICPanelImpl, lpVtblContextMenu));
}
static inline ICPanelImpl *impl_from_IShellExecuteHookW( IShellExecuteHookW *iface )
{
return (ICPanelImpl *)((char*)iface - FIELD_OFFSET(ICPanelImpl, lpVtblShellExecuteHookW));
@ -105,6 +114,7 @@ static inline ICPanelImpl *impl_from_IShellExecuteHookA( IShellExecuteHookA *ifa
#define _IShellExecuteHookW_(This) (IShellExecuteHookW*)&(This->lpVtblShellExecuteHookW)
#define _IShellExecuteHookA_(This) (IShellExecuteHookA*)&(This->lpVtblShellExecuteHookA)
/***********************************************************************
* IShellFolder [ControlPanel] implementation
*/
@ -135,10 +145,13 @@ HRESULT WINAPI IControlPanel_Constructor(IUnknown* pUnkOuter, REFIID riid, LPVOI
return E_OUTOFMEMORY;
sf->ref = 0;
sf->apidl = NULL;
sf->cidl = 0;
sf->lpVtbl = &vt_ShellFolder2;
sf->lpVtblPersistFolder2 = &vt_PersistFolder2;
sf->lpVtblShellExecuteHookW = &vt_ShellExecuteHookW;
sf->lpVtblShellExecuteHookA = &vt_ShellExecuteHookA;
sf->lpVtblContextMenu = &vt_ContextMenu;
sf->pidlRoot = _ILCreateControlPanel(); /* my qualified pidl */
sf->pUnkOuter = pUnkOuter ? pUnkOuter : _IUnknown_ (sf);
@ -611,7 +624,10 @@ ISF_ControlPanel_fnGetUIObjectOf(IShellFolder2 * iface,
*ppvOut = NULL;
if (IsEqualIID(riid, &IID_IContextMenu) &&(cidl >= 1)) {
hr = CDefFolderMenu_Create2(This->pidlRoot, hwndOwner, cidl, apidl, (IShellFolder*)iface, NULL, 0, NULL, (IContextMenu**)&pObj);
pObj = (IUnknown*)(&This->lpVtblContextMenu);
This->apidl = apidl;
This->cidl = cidl;
IUnknown_AddRef(pObj);
} else if (IsEqualIID(riid, &IID_IDataObject) &&(cidl >= 1)) {
pObj = (LPUNKNOWN) IDataObject_Constructor(hwndOwner, This->pidlRoot, apidl, cidl);
hr = S_OK;
@ -1100,3 +1116,178 @@ static const IShellExecuteHookAVtbl vt_ShellExecuteHookA =
IShellExecuteHookA_fnRelease,
IShellExecuteHookA_fnExecute
};
/**************************************************************************
* IContextMenu2 Implementation
*/
/************************************************************************
* ICPanel_IContextMenu_QueryInterface
*/
static HRESULT WINAPI ICPanel_IContextMenu2_QueryInterface(IContextMenu2 * iface, REFIID iid, LPVOID * ppvObject)
{
ICPanelImpl *This = impl_from_IContextMenu(iface);
TRACE("(%p)\n", This);
return IUnknown_QueryInterface(_IUnknown_(This), iid, ppvObject);
}
/************************************************************************
* ICPanel_IContextMenu_AddRef
*/
static ULONG WINAPI ICPanel_IContextMenu2_AddRef(IContextMenu2 * iface)
{
ICPanelImpl *This = impl_from_IContextMenu(iface);
TRACE("(%p)->(count=%u)\n", This, This->ref);
return IUnknown_AddRef(_IUnknown_(This));
}
/************************************************************************
* ICPanel_IContextMenu_Release
*/
static ULONG WINAPI ICPanel_IContextMenu2_Release(IContextMenu2 * iface)
{
ICPanelImpl *This = impl_from_IContextMenu(iface);
TRACE("(%p)->(count=%u)\n", This, This->ref);
return IUnknown_Release(_IUnknown_(This));
}
/**************************************************************************
* ICPanel_IContextMenu_QueryContextMenu()
*/
static HRESULT WINAPI ICPanel_IContextMenu2_QueryContextMenu(
IContextMenu2 *iface,
HMENU hMenu,
UINT indexMenu,
UINT idCmdFirst,
UINT idCmdLast,
UINT uFlags)
{
char szBuffer[30] = {0};
ULONG Count = 1;
ICPanelImpl *This = impl_from_IContextMenu(iface);
TRACE("(%p)->(hmenu=%p indexmenu=%x cmdfirst=%x cmdlast=%x flags=%x )\n",
This, hMenu, indexMenu, idCmdFirst, idCmdLast, uFlags);
if (LoadStringA(shell32_hInstance, IDS_OPEN, szBuffer, sizeof(szBuffer)/sizeof(char)))
{
szBuffer[(sizeof(szBuffer)/sizeof(char))-1] = L'\0';
_InsertMenuItem(hMenu, indexMenu++, TRUE, idCmdFirst + Count, MFT_STRING, szBuffer, MFS_DEFAULT);
Count++;
}
if (LoadStringA(shell32_hInstance, IDS_CREATELINK, szBuffer, sizeof(szBuffer)/sizeof(char)))
{
if (Count)
{
_InsertMenuItem(hMenu, indexMenu++, TRUE, idCmdFirst + Count, MFT_SEPARATOR, NULL, MFS_DEFAULT);
}
szBuffer[(sizeof(szBuffer)/sizeof(char))-1] = L'\0';
_InsertMenuItem(hMenu, indexMenu++, TRUE, idCmdFirst + Count, MFT_STRING, szBuffer, MFS_DEFAULT);
Count++;
}
return MAKE_HRESULT(SEVERITY_SUCCESS, 0, Count);
}
/**************************************************************************
* ICPanel_IContextMenu_InvokeCommand()
*/
static HRESULT WINAPI ICPanel_IContextMenu2_InvokeCommand(
IContextMenu2 *iface,
LPCMINVOKECOMMANDINFO lpcmi)
{
WCHAR szBuffer[100];
SHELLEXECUTEINFOW sei;
ICPanelImpl *This = impl_from_IContextMenu(iface);
sprintfW(szBuffer, L"verb %p\n", lpcmi->lpVerb);
MessageBoxW(NULL, szBuffer, L"invoke", MB_OK);
if (lpcmi->lpVerb == MAKEINTRESOURCE(1))
{
ZeroMemory(&sei, sizeof(sei));
sei.cbSize = sizeof(sei);
sei.fMask = SEE_MASK_INVOKEIDLIST;
sei.lpIDList = ILCombine(This->pidlRoot, This->apidl[0]);
sei.hwnd = lpcmi->hwnd;
sei.nShow = SW_SHOWNORMAL;
sei.lpVerb = L"open";
ShellExecuteExW(&sei);
if (sei.hInstApp <= (HINSTANCE)32)
return E_FAIL;
}
else if (lpcmi->lpVerb == MAKEINTRESOURCE(2))
{
/* FIXME
* retrieve CSIDL_DESKTOPDIRECTORY path,
* retrieve name from pidl and create a link there
*/
FIXME("implement shortcuthandling\n");
return NOERROR;
}
TRACE("(%p)->(invcom=%p verb=%p wnd=%p)\n",This,lpcmi,lpcmi->lpVerb, lpcmi->hwnd);
return S_OK;
}
/**************************************************************************
* ICPanel_IContextMenu_GetCommandString()
*
*/
static HRESULT WINAPI ICPanel_IContextMenu2_GetCommandString(
IContextMenu2 *iface,
UINT_PTR idCommand,
UINT uFlags,
UINT* lpReserved,
LPSTR lpszName,
UINT uMaxNameLen)
{
ICPanelImpl *This = impl_from_IContextMenu(iface);
TRACE("(%p)->(idcom=%lx flags=%x %p name=%p len=%x)\n",This, idCommand, uFlags, lpReserved, lpszName, uMaxNameLen);
FIXME("unknown command string\n");
return E_FAIL;
}
/**************************************************************************
* ICPanel_IContextMenu_HandleMenuMsg()
*/
static HRESULT WINAPI ICPanel_IContextMenu2_HandleMenuMsg(
IContextMenu2 *iface,
UINT uMsg,
WPARAM wParam,
LPARAM lParam)
{
ICPanelImpl *This = impl_from_IContextMenu(iface);
TRACE("ICPanel_IContextMenu_HandleMenuMsg (%p)->(msg=%x wp=%lx lp=%lx)\n",This, uMsg, wParam, lParam);
return E_NOTIMPL;
}
static const IContextMenu2Vtbl vt_ContextMenu =
{
ICPanel_IContextMenu2_QueryInterface,
ICPanel_IContextMenu2_AddRef,
ICPanel_IContextMenu2_Release,
ICPanel_IContextMenu2_QueryContextMenu,
ICPanel_IContextMenu2_InvokeCommand,
ICPanel_IContextMenu2_GetCommandString,
ICPanel_IContextMenu2_HandleMenuMsg
};

View file

@ -611,6 +611,7 @@ BEGIN
IDS_VIEW_DETAILS "&Подробен"
IDS_SELECT "Избор"
IDS_OPEN "Отваряне"
IDS_CREATELINK "Създаване на &връзка"
IDS_CREATEFOLDER_DENIED "Създаването на нова папка е невъзможно: недостатъчни права."
IDS_CREATEFOLDER_CAPTION "Грешка при създаване на нова папка"

View file

@ -608,7 +608,7 @@ BEGIN
IDS_VIEW_DETAILS "&Details"
IDS_SELECT "Select"
IDS_OPEN "Open"
IDS_CREATELINK "Create &Link"
IDS_CREATEFOLDER_DENIED "Unable to create new Folder: Permission denied."
IDS_CREATEFOLDER_CAPTION "Error during creation of a new folder"
IDS_DELETEITEM_CAPTION "Confirm file deletion"

View file

@ -610,6 +610,7 @@ BEGIN
IDS_VIEW_DETAILS "&Podrobnosti"
IDS_SELECT "Vybrat"
IDS_OPEN "Otevřít"
IDS_CREATELINK "Vytvoøit zástupc&e"
IDS_CREATEFOLDER_DENIED "Nelze vytvořit novou složku, protože přístup byl odepřen."
IDS_CREATEFOLDER_CAPTION "Chyba při pokusu vytvořit nový adresář"

View file

@ -608,6 +608,7 @@ BEGIN
IDS_VIEW_DETAILS "&Details"
IDS_SELECT "Select"
IDS_OPEN "Open"
IDS_CREATELINK "Create &Link"
IDS_CREATEFOLDER_DENIED "Unable to create new Folder: Permission denied."
IDS_CREATEFOLDER_CAPTION "Error during creation of a new folder"

View file

@ -610,6 +610,7 @@ BEGIN
IDS_VIEW_DETAILS "&Details"
IDS_SELECT "Auswählen"
IDS_OPEN "Öffnen"
IDS_CREATELINK "&Verknüpfung erstellen"
IDS_CREATEFOLDER_DENIED "Es konnte kein neues Verzeichnis erstellt werden: Zugriff verweigert."
IDS_CREATEFOLDER_CAPTION "Es trat ein Fehler beim Erstellen eines neuen Verzeichnisses auf."

View file

@ -608,6 +608,7 @@ BEGIN
IDS_VIEW_DETAILS "Λ&επτομέρειες"
IDS_SELECT "Επιλογή"
IDS_OPEN "’νοιγμα"
IDS_CREATELINK "Δημιουργία &συντόμευσης"
IDS_CREATEFOLDER_DENIED "Δεν ήταν δυνατή η δημιουργία του φακέλου: Δεν επιτρέπεται η πρόσβαση."
IDS_CREATEFOLDER_CAPTION "Σφάλμα κατά την δημιουργία νέου φακέλου"

View file

@ -608,6 +608,7 @@ BEGIN
IDS_VIEW_DETAILS "&Details"
IDS_SELECT "Select"
IDS_OPEN "Open"
IDS_CREATELINK "Create &Link"
IDS_CREATEFOLDER_DENIED "Unable to create new Folder: Permission denied."
IDS_CREATEFOLDER_CAPTION "Error during creation of a new folder"

View file

@ -609,6 +609,7 @@ BEGIN
IDS_VIEW_DETAILS "&Details"
IDS_SELECT "Select"
IDS_OPEN "Open"
IDS_CREATELINK "Create &Link"
IDS_CREATEFOLDER_DENIED "Unable to create new Folder: Permission denied."
IDS_CREATEFOLDER_CAPTION "Error during creation of a new folder"

View file

@ -610,6 +610,7 @@ BEGIN
IDS_VIEW_DETAILS "&Detalles"
IDS_SELECT "Seleccionar"
IDS_OPEN "Abrir"
IDS_CREATELINK "C&rear acceso directo"
IDS_CREATEFOLDER_DENIED "No se puede crear nueva carpeta: Permiso denegado."
IDS_CREATEFOLDER_CAPTION "Error durante la creación de una nueva carpeta"

View file

@ -608,6 +608,7 @@ BEGIN
IDS_VIEW_DETAILS "&Tiedot"
IDS_SELECT "Valitse"
IDS_OPEN "Avaa"
IDS_CREATELINK "Lu&o Linkki"
IDS_CREATEFOLDER_DENIED "Uutta kansiota ei voitu luoda: Oikeudet eivät riitä."
IDS_CREATEFOLDER_CAPTION "Virhe luotaessa uutta kansiota"

View file

@ -612,6 +612,7 @@ BEGIN
IDS_VIEW_DETAILS "&Détails"
IDS_SELECT "Sélectionner"
IDS_OPEN "Ouvrir"
IDS_CREATELINK "Créer un &lien"
IDS_CREATEFOLDER_DENIED "Impossible de créer le nouveau dossier : permission refusée."
IDS_CREATEFOLDER_CAPTION "Erreur lors de la création du nouveau dossier"

View file

@ -611,6 +611,7 @@ BEGIN
IDS_VIEW_DETAILS "Részletek"
IDS_SELECT "Kiválaszt"
IDS_OPEN "Megnyit"
IDS_CREATELINK "Parancsikon létrehozása"
IDS_CREATEFOLDER_DENIED "Nem hozható létre új mappa: Nincs hozzá engedélyed."
IDS_CREATEFOLDER_CAPTION "Hiba a mappa létrehozásakor"

View file

@ -609,6 +609,7 @@ BEGIN
IDS_VIEW_DETAILS "&Dettagli"
IDS_SELECT "Selezione"
IDS_OPEN "Apri"
IDS_CREATELINK "&Crea Collegamento"
IDS_CREATEFOLDER_DENIED "Impossibile creare la cartella: Accesso negato."
IDS_CREATEFOLDER_CAPTION "Errore durante la creazione della cartella"

View file

@ -608,6 +608,7 @@ BEGIN
IDS_VIEW_DETAILS "詳細(&D)"
IDS_SELECT "選択"
IDS_OPEN "開く"
IDS_CREATELINK "ショートカットの作成(&L)"
IDS_CREATEFOLDER_DENIED "新しいフォルダを作成できませんでした: アクセス権がありません。"
IDS_CREATEFOLDER_CAPTION "新しいフォルダの作成中にエラーが発生しました"

View file

@ -608,6 +608,7 @@ BEGIN
IDS_VIEW_DETAILS "&Details"
IDS_SELECT "Select"
IDS_OPEN "Open"
IDS_CREATELINK "Create &Link"
IDS_CREATEFOLDER_DENIED "Unable to create new Folder: Permission denied."
IDS_CREATEFOLDER_CAPTION "Error during creation of a new folder"

View file

@ -608,6 +608,7 @@ BEGIN
IDS_VIEW_DETAILS "&Details"
IDS_SELECT "Select"
IDS_OPEN "Open"
IDS_CREATELINK "Create &Link"
IDS_CREATEFOLDER_DENIED "Unable to create new Folder: Permission denied."
IDS_CREATEFOLDER_CAPTION "Error during creation of a new folder"

View file

@ -587,6 +587,7 @@ BEGIN
IDS_VIEW_DETAILS "&Detaljer"
IDS_SELECT "Velg"
IDS_OPEN "Åpne"
IDS_CREATELINK "&Opprett snarvei"
IDS_CREATEFOLDER_DENIED "Kunne ikke opprette ny mappe: tilgang nektet."
IDS_CREATEFOLDER_CAPTION "Klarte ikke opprette ny mappe"

View file

@ -614,6 +614,7 @@ BEGIN
IDS_VIEW_DETAILS "&Szczegóły"
IDS_SELECT "Zaznacz"
IDS_OPEN "Otwórz"
IDS_CREATELINK "Utwórz &Skrót"
IDS_CREATEFOLDER_DENIED "Nie mogę utworzyć nowego katalogu: Brak dostępu."
IDS_CREATEFOLDER_CAPTION "Błšd przy tworzeniu nowego katalogu."

View file

@ -610,6 +610,7 @@ BEGIN
IDS_VIEW_DETAILS "&Detalhes"
IDS_SELECT "Selecionar"
IDS_OPEN "Abrir"
IDS_CREATELINK "Criar a&talho"
IDS_CREATEFOLDER_DENIED "Não pode criar nova pasta: Permissão negada."
IDS_CREATEFOLDER_CAPTION "Erro durante a criação da nova pasta"

View file

@ -610,6 +610,7 @@ BEGIN
IDS_VIEW_DETAILS "&Detalhes"
IDS_SELECT "Seleccionar"
IDS_OPEN "Abrir"
IDS_CREATELINK "Create &Link"
IDS_CREATEFOLDER_DENIED "Não é possível criar nova pasta: Permissão negada."
IDS_CREATEFOLDER_CAPTION "Erro durante a criação da nova pasta"

View file

@ -607,6 +607,7 @@ BEGIN
IDS_VIEW_DETAILS "&Подробно"
IDS_SELECT "&Выбрать"
IDS_OPEN "&Открыть"
IDS_CREATELINK "Создать &ярлык"
IDS_CREATEFOLDER_DENIED "Невозможно создать папку - нет полномочий."
IDS_CREATEFOLDER_CAPTION "Ошибка во время создания папки"

View file

@ -614,6 +614,7 @@ BEGIN
IDS_VIEW_DETAILS "&Podrobnosti"
IDS_SELECT "Vybrať"
IDS_OPEN "Otvoriť"
IDS_CREATELINK "Vytvori<72> o&dkaz"
IDS_CREATEFOLDER_DENIED "Nie je možné vytvoriť nový priečinok: Prístup zamietnutý."
IDS_CREATEFOLDER_CAPTION "Chyba počas vytvárania nového priečinka"

View file

@ -608,6 +608,7 @@ BEGIN
IDS_VIEW_DETAILS "&Details"
IDS_SELECT "Select"
IDS_OPEN "Open"
IDS_CREATELINK "Create &Link"
IDS_CREATEFOLDER_DENIED "Unable to create new Folder: Permission denied."
IDS_CREATEFOLDER_CAPTION "Error during creation of a new folder"

View file

@ -608,6 +608,7 @@ BEGIN
IDS_VIEW_DETAILS "&Details"
IDS_SELECT "Select"
IDS_OPEN "Open"
IDS_CREATELINK "Create &Link"
IDS_CREATEFOLDER_DENIED "Unable to create new Folder: Permission denied."
IDS_CREATEFOLDER_CAPTION "Error during creation of a new folder"

View file

@ -608,6 +608,7 @@ BEGIN
IDS_VIEW_DETAILS "&Ayrýntýlý"
IDS_SELECT "Seç"
IDS_OPEN "Aç"
IDS_CREATELINK "Kýsayol O&luţtur"
IDS_CREATEFOLDER_DENIED "Yeni dizin oluþturulamýyor: Eriþim engellendi."
IDS_CREATEFOLDER_CAPTION "Dizin oluþturma sýrasýnda hata"

View file

@ -600,6 +600,7 @@ BEGIN
IDS_DESKTOP "Ðîáî÷èé ñò³ë"
IDS_MYCOMPUTER "̳é Êîìï'þòåð"
IDS_RECYCLEBIN_FOLDER_NAME "Êîøèê"
IDS_CONTROLPANEL "Ďŕíĺëü ęĺđóâŕíí˙"
/* context menus */
IDS_VIEW_LARGE "&Âåëèê³ çíà÷êè"
@ -608,7 +609,7 @@ BEGIN
IDS_VIEW_DETAILS "&Ïîäðîáèö³"
IDS_SELECT "Âè&áðàòè"
IDS_OPEN "³&äêðèòè"
IDS_CONTROLPANEL "Ďŕíĺëü ęĺđóâŕíí˙"
IDS_CREATELINK "Ńňâîđčňč &˙đëčę"
IDS_CREATEFOLDER_DENIED "Íå âäàëîñÿ ñòâîðèòè íîâó ïàïêó: ³äìîâà ó äîñòóï³."
IDS_CREATEFOLDER_CAPTION "Ïîìèëêà ïðè ñòâîðåíí³ íîâî¿ ïàïêè"

View file

@ -597,6 +597,7 @@ BEGIN
IDS_VIEW_DETAILS "详细信息(&D)"
IDS_SELECT "Select"
IDS_OPEN "Open"
IDS_CREATELINK "创建快捷方式(&L)"
IDS_CREATEFOLDER_DENIED "Unable to create new Folder: Permission denied."
IDS_CREATEFOLDER_CAPTION "Error during creation of a new folder"

View file

@ -609,6 +609,7 @@ BEGIN
IDS_VIEW_DETAILS "&Details"
IDS_SELECT "Select"
IDS_OPEN "Open"
IDS_CREATELINK "Create &Link"
IDS_CREATEFOLDER_DENIED "Unable to create new Folder: Permission denied."
IDS_CREATEFOLDER_CAPTION "Error during creation of a new folder"

View file

@ -141,6 +141,8 @@
#define IDS_PLAY_VERB 305
#define IDS_PREVIEW_VERB 306
#define IDS_FILE_FOLDER 307
#define IDS_CREATELINK 308
/* Note: this string is referenced from the registry */
#define IDS_RECYCLEBIN_FOLDER_NAME 8964