BOOL m_isEditing;
CLSID m_Category;
- BOOL m_Destroyed;
- private:
+ BOOL m_Destroyed;
+ private:
HRESULT _MergeToolbar();
+ BOOL _Sort();
public:
CDefView();
// Windows returns E_NOINTERFACE for IOleWindow
// COM_INTERFACE_ENTRY_IID(IID_IOleWindow, IOleWindow)
COM_INTERFACE_ENTRY_IID(IID_IShellView, IShellView)
+ COM_INTERFACE_ENTRY_IID(IID_CDefView, IShellView)
COM_INTERFACE_ENTRY_IID(IID_IShellView2, IShellView2)
COM_INTERFACE_ENTRY_IID(IID_IFolderView, IFolderView)
COM_INTERFACE_ENTRY_IID(IID_IShellFolderView, IShellFolderView)
return nDiff;
}
+BOOL CDefView::_Sort()
+{
+ HWND hHeader;
+ HDITEM hColumn;
+
+ if ((m_ListView.GetWindowLongPtr(GWL_STYLE) & ~LVS_NOSORTHEADER) == 0)
+ return TRUE;
+
+ hHeader = (HWND)m_ListView.SendMessage(LVM_GETHEADER, 0, 0);
+ ZeroMemory(&hColumn, sizeof(hColumn));
+
+ /* If the sorting column changed, remove the sorting style from the old column */
+ if ( (m_sortInfo.nLastHeaderID != -1) &&
+ (m_sortInfo.nLastHeaderID != m_sortInfo.nHeaderID) )
+ {
+ hColumn.mask = HDI_FORMAT;
+ Header_GetItem(hHeader, m_sortInfo.nLastHeaderID, &hColumn);
+ hColumn.fmt &= ~(HDF_SORTUP | HDF_SORTDOWN);
+ Header_SetItem(hHeader, m_sortInfo.nLastHeaderID, &hColumn);
+ }
+
+ /* Set the sorting style to the new column */
+ hColumn.mask = HDI_FORMAT;
+ Header_GetItem(hHeader, m_sortInfo.nHeaderID, &hColumn);
+
+ hColumn.fmt &= (m_sortInfo.bIsAscending ? ~HDF_SORTDOWN : ~HDF_SORTUP );
+ hColumn.fmt |= (m_sortInfo.bIsAscending ? HDF_SORTUP : HDF_SORTDOWN);
+ Header_SetItem(hHeader, m_sortInfo.nHeaderID, &hColumn);
+
+ /* Sort the list, using the current values of nHeaderID and bIsAscending */
+ m_sortInfo.nLastHeaderID = m_sortInfo.nHeaderID;
+ return m_ListView.SortItems(ListViewCompareItems, this);
+}
+
PCUITEMID_CHILD CDefView::_PidlByItem(int i)
{
return reinterpret_cast<PCUITEMID_CHILD>(m_ListView.GetItemData(i));
FIXME("no m_pSF2Parent\n");
}
m_sortInfo.bIsAscending = TRUE;
- m_sortInfo.nLastHeaderID = m_sortInfo.nHeaderID;
- m_ListView.SortItems(ListViewCompareItems, this);
+ _Sort();
/*turn the listview's redrawing back on and force it to draw*/
m_ListView.SetRedraw(TRUE);
CheckToolbar();
break;
- /* the menu-ID's for sorting are 0x30... see shrec.rc */
+ /* the menu-ID's for sorting are 0x30... see shrec.rc */
case 0x30:
case 0x31:
case 0x32:
case 0x33:
m_sortInfo.nHeaderID = dwCmdID - 0x30;
m_sortInfo.bIsAscending = TRUE;
- m_sortInfo.nLastHeaderID = m_sortInfo.nHeaderID;
- m_ListView.SortItems(ListViewCompareItems, this);
+ _Sort();
break;
case FCIDM_SHVIEW_SNAPTOGRID:
m_sortInfo.bIsAscending = !m_sortInfo.bIsAscending;
else
m_sortInfo.bIsAscending = TRUE;
- m_sortInfo.nLastHeaderID = m_sortInfo.nHeaderID;
-
- m_ListView.SortItems(ListViewCompareItems, this);
+ _Sort();
break;
case LVN_GETDISPINFOA:
if (SUCCEEDED(m_pSFParent->GetUIObjectOf(m_hWnd, m_cidl, m_apidl, IID_NULL_PPV_ARG(IDataObject, &pda))))
{
+ LPNMLISTVIEW params = (LPNMLISTVIEW)lParam;
+
if (SUCCEEDED(m_pSFParent->GetAttributesOf(m_cidl, m_apidl, &dwAttributes)))
{
if (dwAttributes & SFGAO_CANLINK)
DWORD dwEffect2;
m_pSourceDataObject = pda;
- m_ptFirstMousePos = ((LPNMLISTVIEW)lParam)->ptAction;
+ m_ptFirstMousePos = params->ptAction;
ClientToScreen(&m_ptFirstMousePos);
+ HIMAGELIST big_icons, small_icons;
+ Shell_GetImageLists(&big_icons, &small_icons);
+ PCUITEMID_CHILD pidl = _PidlByItem(params->iItem);
+ int iIcon = SHMapPIDLToSystemImageListIndex(m_pSFParent, pidl, 0);
+ POINT ptItem;
+ m_ListView.GetItemPosition(params->iItem, &ptItem);
+
+ ImageList_BeginDrag(big_icons, iIcon, params->ptAction.x - ptItem.x, params->ptAction.y - ptItem.y);
+
DoDragDrop(pda, this, dwEffect, &dwEffect2);
m_pSourceDataObject.Release();
/* If anything failed, m_pCurDropTarget should be NULL now, which ought to be a save state. */
if (FAILED(hr))
+ {
+ *pdwEffect = DROPEFFECT_NONE;
return hr;
+ }
- /* Notify the item just entered via DragEnter. */
- hr = m_pCurDropTarget->DragEnter(m_pCurDataObject, grfKeyState, pt, pdwEffect);
-
- if (m_iDragOverItem != -1 && pdwEffect != DROPEFFECT_NONE)
+ if (m_iDragOverItem != -1)
{
SelectItem(m_iDragOverItem, SVSI_SELECT);
}
- return hr;
+ /* Notify the item just entered via DragEnter. */
+ return m_pCurDropTarget->DragEnter(m_pCurDataObject, grfKeyState, pt, pdwEffect);
}
HRESULT WINAPI CDefView::DragEnter(IDataObject *pDataObject, DWORD grfKeyState, POINTL pt, DWORD *pdwEffect)
/* Get a hold on the data object for later calls to DragEnter on the sub-folders */
m_pCurDataObject = pDataObject;
- return drag_notify_subitem(grfKeyState, pt, pdwEffect);
+ HRESULT hr = drag_notify_subitem(grfKeyState, pt, pdwEffect);
+ if (SUCCEEDED(hr))
+ {
+ POINT ptClient = {pt.x, pt.y};
+ ScreenToClient(&ptClient);
+ ImageList_DragEnter(m_hWnd, ptClient.x, ptClient.y);
+ }
+
+ return hr;
}
HRESULT WINAPI CDefView::DragOver(DWORD grfKeyState, POINTL pt, DWORD *pdwEffect)
{
+ POINT ptClient = {pt.x, pt.y};
+ ScreenToClient(&ptClient);
+ ImageList_DragMove(ptClient.x, ptClient.y);
return drag_notify_subitem(grfKeyState, pt, pdwEffect);
}
HRESULT WINAPI CDefView::DragLeave()
{
+ ImageList_DragLeave(m_hWnd);
+
if (m_pCurDropTarget)
{
m_pCurDropTarget->DragLeave();
{
ERR("GetKeyState(VK_LBUTTON): %d\n", GetKeyState(VK_LBUTTON));
+ ImageList_DragLeave(m_hWnd);
+ ImageList_EndDrag();
+
if ((m_iDragOverItem == -1 || m_pCurDropTarget == NULL) &&
(*pdwEffect & DROPEFFECT_MOVE) &&
/*(GetKeyState(VK_LBUTTON) != 0) &&*/
return S_OK;
}
-/**********************************************************
- * IShellView_Constructor
- */
-HRESULT WINAPI IShellView_Constructor(IShellFolder *pFolder, IShellView **newView)
+
+HRESULT CDefView_CreateInstance(IShellFolder *pFolder, REFIID riid, LPVOID * ppvOut)
+{
+ return ShellObjectCreatorInit<CDefView>(pFolder, riid, ppvOut);
+}
+
+HRESULT WINAPI SHCreateShellFolderViewEx(
+ LPCSFV psvcbi, /* [in] shelltemplate struct */
+ IShellView **ppsv) /* [out] IShellView pointer */
{
- return ShellObjectCreatorInit<CDefView>(pFolder, IID_IShellView, newView);
+ CComPtr<IShellView> psv;
+ HRESULT hRes;
+
+ TRACE("sf=%p pidl=%p cb=%p mode=0x%08x parm=%p\n",
+ psvcbi->pshf, psvcbi->pidl, psvcbi->pfnCallback,
+ psvcbi->fvm, psvcbi->psvOuter);
+
+ *ppsv = NULL;
+ hRes = CDefView_CreateInstance(psvcbi->pshf, IID_PPV_ARG(IShellView, &psv));
+ if (FAILED_UNEXPECTEDLY(hRes))
+ return hRes;
+
+ *ppsv = psv.Detach();
+ return hRes;
}
-HRESULT WINAPI CDefView_Constructor(IShellFolder *pFolder, REFIID riid, LPVOID * ppvOut)
+HRESULT WINAPI SHCreateShellFolderView(const SFV_CREATE *pcsfv,
+ IShellView **ppsv)
{
- return ShellObjectCreatorInit<CDefView>(pFolder, riid, ppvOut);
+ CComPtr<IShellView> psv;
+ HRESULT hRes;
+
+ *ppsv = NULL;
+ if (!pcsfv || pcsfv->cbSize != sizeof(*pcsfv))
+ return E_INVALIDARG;
+
+ TRACE("sf=%p outer=%p callback=%p\n",
+ pcsfv->pshf, pcsfv->psvOuter, pcsfv->psfvcb);
+
+ hRes = CDefView_CreateInstance(pcsfv->pshf, IID_PPV_ARG(IShellView, &psv));
+ if (FAILED(hRes))
+ return hRes;
+
+ *ppsv = psv.Detach();
+ return hRes;
}