📄 shlview.c
字号:
IShellFolder2_GetDetailsOf(This->pSF2Parent, pidl, lpdi->item.iSubItem, &sd);
if (lpnmh->code == LVN_GETDISPINFOA)
{
StrRetToStrNA( lpdi->item.pszText, lpdi->item.cchTextMax, &sd.str, NULL);
TRACE("-- text=%s\n",lpdi->item.pszText);
}
else /* LVN_GETDISPINFOW */
{
StrRetToStrNW( ((NMLVDISPINFOW *)lpdi)->item.pszText, lpdi->item.cchTextMax, &sd.str, NULL);
TRACE("-- text=%s\n",debugstr_w((WCHAR*)(lpdi->item.pszText)));
}
}
else
{
FIXME("no SF2\n");
}
}
if(lpdi->item.mask & LVIF_IMAGE) /* image requested */
{
lpdi->item.iImage = SHMapPIDLToSystemImageListIndex(This->pSFParent, pidl, 0);
}
break;
case LVN_ITEMCHANGED:
TRACE("-- LVN_ITEMCHANGED %p\n",This);
OnStateChange(This, CDBOSC_SELCHANGE); /* the browser will get the IDataObject now */
break;
case LVN_BEGINDRAG:
case LVN_BEGINRDRAG:
TRACE("-- LVN_BEGINDRAG\n");
if (ShellView_GetSelections(This))
{
IDataObject * pda;
DWORD dwAttributes = SFGAO_CANLINK;
DWORD dwEffect = DROPEFFECT_COPY | DROPEFFECT_MOVE;
if (SUCCEEDED(IShellFolder_GetUIObjectOf(This->pSFParent, This->hWnd, This->cidl, (LPCITEMIDLIST*)This->apidl, &IID_IDataObject,0,(LPVOID *)&pda)))
{
IDropSource * pds = (IDropSource*)&(This->lpvtblDropSource); /* own DropSource interface */
if (SUCCEEDED(IShellFolder_GetAttributesOf(This->pSFParent, This->cidl, (LPCITEMIDLIST*)This->apidl, &dwAttributes)))
{
if (dwAttributes & SFGAO_CANLINK)
{
dwEffect |= DROPEFFECT_LINK;
}
}
if (pds)
{
DWORD dwEffect;
DoDragDrop(pda, pds, dwEffect, &dwEffect);
}
IDataObject_Release(pda);
}
}
break;
case LVN_BEGINLABELEDITA:
{
DWORD dwAttr = SFGAO_CANRENAME;
pidl = (LPITEMIDLIST)lpdi->item.lParam;
TRACE("-- LVN_BEGINLABELEDITA %p\n",This);
IShellFolder_GetAttributesOf(This->pSFParent, 1, (LPCITEMIDLIST*)&pidl, &dwAttr);
if (SFGAO_CANRENAME & dwAttr)
{
return FALSE;
}
return TRUE;
}
case LVN_ENDLABELEDITA:
{
TRACE("-- LVN_ENDLABELEDITA %p\n",This);
if (lpdi->item.pszText)
{
HRESULT hr;
WCHAR wszNewName[MAX_PATH];
LVITEMA lvItem;
lvItem.iItem = lpdi->item.iItem;
lvItem.iSubItem = 0;
lvItem.mask = LVIF_PARAM;
SendMessageA(This->hWndList, LVM_GETITEMA, 0, (LPARAM) &lvItem);
pidl = (LPITEMIDLIST)lpdi->item.lParam;
if (!MultiByteToWideChar( CP_ACP, 0, lpdi->item.pszText, -1, wszNewName, MAX_PATH ))
wszNewName[MAX_PATH-1] = 0;
hr = IShellFolder_SetNameOf(This->pSFParent, 0, pidl, wszNewName, SHGDN_INFOLDER, &pidl);
if(SUCCEEDED(hr) && pidl)
{
lvItem.mask = LVIF_PARAM;
lvItem.lParam = (LPARAM)pidl;
SendMessageA(This->hWndList, LVM_SETITEMA, 0, (LPARAM) &lvItem);
return TRUE;
}
}
return FALSE;
}
case LVN_KEYDOWN:
{
/* MSG msg;
msg.hwnd = This->hWnd;
msg.message = WM_KEYDOWN;
msg.wParam = plvKeyDown->wVKey;
msg.lParam = 0;
msg.time = 0;
msg.pt = 0;*/
LPNMLVKEYDOWN plvKeyDown = (LPNMLVKEYDOWN) lpnmh;
/* initiate a rename of the selected file or directory */
if(plvKeyDown->wVKey == VK_F2)
{
/* see how many files are selected */
int i = ListView_GetSelectedCount(This->hWndList);
/* get selected item */
if(i == 1)
{
/* get selected item */
i = ListView_GetNextItem(This->hWndList, -1,
LVNI_SELECTED);
SendMessageW(This->hWndList, LVM_ENSUREVISIBLE, i, 0);
SendMessageW(This->hWndList, LVM_EDITLABELW, i, 0);
}
}
#if 0
TranslateAccelerator(This->hWnd, This->hAccel, &msg)
#endif
else if(plvKeyDown->wVKey == VK_DELETE)
{
UINT i;
int item_index;
LVITEMA item;
LPITEMIDLIST* pItems;
ISFHelper *psfhlp;
IShellFolder_QueryInterface(This->pSFParent, &IID_ISFHelper,
(LPVOID*)&psfhlp);
if (psfhlp == NULL)
break;
if(!(i = ListView_GetSelectedCount(This->hWndList)))
break;
/* allocate memory for the pidl array */
pItems = HeapAlloc(GetProcessHeap(), 0,
sizeof(LPITEMIDLIST) * i);
/* retrieve all selected items */
i = 0;
item_index = -1;
while(ListView_GetSelectedCount(This->hWndList) > i)
{
/* get selected item */
item_index = ListView_GetNextItem(This->hWndList,
item_index, LVNI_SELECTED);
item.iItem = item_index;
item.mask = LVIF_PARAM;
SendMessageA(This->hWndList, LVM_GETITEMA, 0, (LPARAM) &item);
/* get item pidl */
pItems[i] = (LPITEMIDLIST)item.lParam;
i++;
}
/* perform the item deletion */
ISFHelper_DeleteItems(psfhlp, i, (LPCITEMIDLIST*)pItems);
/* free pidl array memory */
HeapFree(GetProcessHeap(), 0, pItems);
}
/* Initiate a refresh */
else if(plvKeyDown->wVKey == VK_F5)
{
IShellView_Refresh((IShellView*)This);
}
else
FIXME("LVN_KEYDOWN key=0x%08x\n",plvKeyDown->wVKey);
}
break;
default:
TRACE("-- %p WM_COMMAND %x unhandled\n", This, lpnmh->code);
break;
}
return 0;
}
/**********************************************************
* ShellView_OnChange()
*/
static LRESULT ShellView_OnChange(IShellViewImpl * This, LPITEMIDLIST * Pidls, LONG wEventId)
{
TRACE("(%p)(%p,%p,0x%08x)\n", This, Pidls[0], Pidls[1], wEventId);
switch(wEventId)
{
case SHCNE_MKDIR:
case SHCNE_CREATE:
LV_AddItem(This, Pidls[0]);
break;
case SHCNE_RMDIR:
case SHCNE_DELETE:
LV_DeleteItem(This, Pidls[0]);
break;
case SHCNE_RENAMEFOLDER:
case SHCNE_RENAMEITEM:
LV_RenameItem(This, Pidls[0], Pidls[1]);
break;
case SHCNE_UPDATEITEM:
break;
}
return TRUE;
}
/**********************************************************
* ShellView_WndProc
*/
static LRESULT CALLBACK ShellView_WndProc(HWND hWnd, UINT uMessage, WPARAM wParam, LPARAM lParam)
{
IShellViewImpl * pThis = (IShellViewImpl*)GetWindowLongPtrW(hWnd, GWLP_USERDATA);
LPCREATESTRUCTA lpcs;
TRACE("(hwnd=%p msg=%x wparm=%x lparm=%lx)\n",hWnd, uMessage, wParam, lParam);
switch (uMessage)
{
case WM_NCCREATE:
lpcs = (LPCREATESTRUCTA)lParam;
pThis = (IShellViewImpl*)(lpcs->lpCreateParams);
SetWindowLongPtrW(hWnd, GWLP_USERDATA, (ULONG_PTR)pThis);
pThis->hWnd = hWnd; /*set the window handle*/
break;
case WM_SIZE: return ShellView_OnSize(pThis,LOWORD(lParam), HIWORD(lParam));
case WM_SETFOCUS: return ShellView_OnSetFocus(pThis);
case WM_KILLFOCUS: return ShellView_OnKillFocus(pThis);
case WM_CREATE: return ShellView_OnCreate(pThis);
case WM_ACTIVATE: return ShellView_OnActivate(pThis, SVUIA_ACTIVATE_FOCUS);
case WM_NOTIFY: return ShellView_OnNotify(pThis,(UINT)wParam, (LPNMHDR)lParam);
case WM_COMMAND: return ShellView_OnCommand(pThis,
GET_WM_COMMAND_ID(wParam, lParam),
GET_WM_COMMAND_CMD(wParam, lParam),
GET_WM_COMMAND_HWND(wParam, lParam));
case SHV_CHANGE_NOTIFY: return ShellView_OnChange(pThis, (LPITEMIDLIST*)wParam, (LONG)lParam);
case WM_CONTEXTMENU: ShellView_DoContextMenu(pThis, LOWORD(lParam), HIWORD(lParam), FALSE);
return 0;
case WM_SHOWWINDOW: UpdateWindow(pThis->hWndList);
break;
case WM_GETDLGCODE: return SendMessageA(pThis->hWndList,uMessage,0,0);
case WM_DESTROY:
RevokeDragDrop(pThis->hWnd);
SHChangeNotifyDeregister(pThis->hNotify);
break;
case WM_ERASEBKGND:
if ((pThis->FolderSettings.fFlags & FWF_DESKTOP) ||
(pThis->FolderSettings.fFlags & FWF_TRANSPARENT))
return 1;
break;
}
return DefWindowProcA (hWnd, uMessage, wParam, lParam);
}
/**********************************************************
*
*
* The INTERFACE of the IShellView object
*
*
**********************************************************
* IShellView_QueryInterface
*/
static HRESULT WINAPI IShellView_fnQueryInterface(IShellView * iface,REFIID riid, LPVOID *ppvObj)
{
IShellViewImpl *This = (IShellViewImpl *)iface;
TRACE("(%p)->(\n\tIID:\t%s,%p)\n",This,debugstr_guid(riid),ppvObj);
*ppvObj = NULL;
if(IsEqualIID(riid, &IID_IUnknown))
{
*ppvObj = This;
}
else if(IsEqualIID(riid, &IID_IShellView))
{
*ppvObj = (IShellView*)This;
}
else if(IsEqualIID(riid, &IID_IOleCommandTarget))
{
*ppvObj = (IOleCommandTarget*)&(This->lpvtblOleCommandTarget);
}
else if(IsEqualIID(riid, &IID_IDropTarget))
{
*ppvObj = (IDropTarget*)&(This->lpvtblDropTarget);
}
else if(IsEqualIID(riid, &IID_IDropSource))
{
*ppvObj = (IDropSource*)&(This->lpvtblDropSource);
}
else if(IsEqualIID(riid, &IID_IViewObject))
{
*ppvObj = (IViewObject*)&(This->lpvtblViewObject);
}
if(*ppvObj)
{
IUnknown_AddRef( (IUnknown*)*ppvObj );
TRACE("-- Interface: (%p)->(%p)\n",ppvObj,*ppvObj);
return S_OK;
}
TRACE("-- Interface: E_NOINTERFACE\n");
return E_NOINTERFACE;
}
/**********************************************************
* IShellView_AddRef
*/
static ULONG WINAPI IShellView_fnAddRef(IShellView * iface)
{
IShellViewImpl *This = (IShellViewImpl *)iface;
ULONG refCount = InterlockedIncrement(&This->ref);
TRACE("(%p)->(count=%u)\n", This, refCount - 1);
return refCount;
}
/**********************************************************
* IShellView_Release
*/
static ULONG WINAPI IShellView_fnRelease(IShellView * iface)
{
IShellViewImpl *This = (IShellViewImpl *)iface;
ULONG refCount = InterlockedDecrement(&This->ref);
TRACE("(%p)->(count=%i)\n", This, refCount + 1);
if (!refCount)
{
TRACE(" destroying IShellView(%p)\n",This);
DestroyWindow(This->hWndList);
if(This->pSFParent)
IShellFolder_Release(This->pSFParent);
if(This->pSF2Parent)
IShellFolder2_Release(This->pSF2Parent);
SHFree(This->apidl);
if(This->pAdvSink)
IAdviseSink_Release(This->pAdvSink);
HeapFree(GetProcessHeap(),0,This);
}
return refCount;
}
/**********************************************************
* ShellView_GetWindow
*/
static HRESULT WINAPI IShellView_fnGetWindow(IShellView * iface,HWND * phWnd)
{
IShellViewImpl *This = (IShellViewImpl *)iface;
TRACE("(%p)\n",This);
*phWnd = This->hWnd;
return S_OK;
}
static HRESULT WINAPI IShellView_fnContextSensitiveHelp(IShellView * iface,BOOL fEnterMode)
{
IShellViewImpl *This = (IShellViewImpl *)iface;
FIXME("(%p) stub\n",This);
return E_NOTIMPL;
}
/**********************************************************
* IShellView_TranslateAccelerator
*
* FIXME:
* use the accel functions
*/
static HRESULT WINAPI IShellView_fnTranslateAccelerator(IShellView * iface,LPMSG lpmsg)
{
#if 0
IShellViewImpl *This = (IShellViewImpl *)iface;
FIXME("(%p)->(%p: hwnd=%x msg=%x lp=%x wp=%x) stub\n",This,lpmsg, lpmsg->hwnd, lpmsg->message, lpmsg->lParam, lpmsg->wParam);
#endif
if ((lpmsg->message>=WM_KEYFIRST) && (lpmsg->message>=WM_KEYLAST))
{
TRACE("-- key=0x04%x\n",lpmsg->wParam) ;
}
return S_FALSE; /* not handled */
}
static HRESULT WINAPI IShellView_fnEnableModeless(IShellView * iface,BOOL fEnable)
{
IShellViewImpl *This = (IShellViewImpl *)iface;
FIXME("(%p) stub\n",This);
return E_NOTIMPL;
}
static HRESULT WINAPI IShellView_fnUIActivate(IShellView * iface,UINT uState)
{
IShellViewImpl *This = (IShellViewImpl *)iface;
/*
CHAR szName[MAX_PATH];
*/
LRESULT lResult;
int nPartArray[1] = {-1};
TRACE("(%p)->(state=%x) stub\n",This, uState);
/*don't do anything if the state isn't really changing*/
if(This->uState == uState)
{
return S_OK;
}
/*OnActivate handles the menu merging and internal state*/
ShellView_OnActivate(This, uState);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -