mirror of
https://github.com/reactos/reactos.git
synced 2025-08-05 20:03:12 +00:00
[SHELL32] Display cut items as ghosted (#7739)
- When Ctrl+X is pressed on a selected item, it will appear ghosted until another clipboard action takes place. - Generate SHCNE_UPDATE* notifications when file attributes change. - When an items hidden attribute is changed (filesystem notification), we must update the ghosted state. CORE-9465
This commit is contained in:
parent
c3505bb4f6
commit
f1a66daeeb
12 changed files with 158 additions and 46 deletions
|
@ -661,7 +661,7 @@ HRESULT WINAPI CNetConUiObject::InvokeCommand(LPCMINVOKECOMMANDINFO lpcmi)
|
||||||
{
|
{
|
||||||
HRESULT hr;
|
HRESULT hr;
|
||||||
CComPtr<IShellView> psv;
|
CComPtr<IShellView> psv;
|
||||||
hr = IUnknown_QueryService(m_pUnknown, SID_IFolderView, IID_PPV_ARG(IShellView, &psv));
|
hr = IUnknown_QueryService(m_pUnknown, SID_SFolderView, IID_PPV_ARG(IShellView, &psv));
|
||||||
if (SUCCEEDED(hr))
|
if (SUCCEEDED(hr))
|
||||||
{
|
{
|
||||||
SVSIF selFlags = SVSI_DESELECTOTHERS | SVSI_EDIT | SVSI_ENSUREVISIBLE | SVSI_FOCUSED | SVSI_SELECT;
|
SVSIF selFlags = SVSI_DESELECTOTHERS | SVSI_EDIT | SVSI_ENSUREVISIBLE | SVSI_FOCUSED | SVSI_SELECT;
|
||||||
|
|
|
@ -238,6 +238,7 @@ private:
|
||||||
CComPtr<ICommDlgBrowser> m_pCommDlgBrowser;
|
CComPtr<ICommDlgBrowser> m_pCommDlgBrowser;
|
||||||
CComPtr<IFolderFilter> m_pFolderFilter;
|
CComPtr<IFolderFilter> m_pFolderFilter;
|
||||||
CComPtr<IShellFolderViewDual> m_pShellFolderViewDual;
|
CComPtr<IShellFolderViewDual> m_pShellFolderViewDual;
|
||||||
|
ClipboardViewerChain m_ClipboardChain;
|
||||||
CListView m_ListView;
|
CListView m_ListView;
|
||||||
HWND m_hWndParent;
|
HWND m_hWndParent;
|
||||||
FOLDERSETTINGS m_FolderSettings;
|
FOLDERSETTINGS m_FolderSettings;
|
||||||
|
@ -274,6 +275,7 @@ private:
|
||||||
BOOL m_isEditing;
|
BOOL m_isEditing;
|
||||||
BOOL m_isParentFolderSpecial;
|
BOOL m_isParentFolderSpecial;
|
||||||
bool m_ScheduledStatusbarUpdate;
|
bool m_ScheduledStatusbarUpdate;
|
||||||
|
bool m_HasCutItems;
|
||||||
|
|
||||||
CLSID m_Category;
|
CLSID m_Category;
|
||||||
BOOL m_Destroyed;
|
BOOL m_Destroyed;
|
||||||
|
@ -313,6 +315,9 @@ public:
|
||||||
HRESULT LoadColumn(UINT FoldCol, UINT ListCol, BOOL Insert, UINT ForceWidth = 0);
|
HRESULT LoadColumn(UINT FoldCol, UINT ListCol, BOOL Insert, UINT ForceWidth = 0);
|
||||||
HRESULT LoadColumns(SIZE_T *pColList = NULL, UINT ColListCount = 0);
|
HRESULT LoadColumns(SIZE_T *pColList = NULL, UINT ColListCount = 0);
|
||||||
void ColumnListChanged();
|
void ColumnListChanged();
|
||||||
|
SFGAOF GetItemAttributes(PCUITEMID_CHILD pidl, UINT Query);
|
||||||
|
SFGAOF GetItemAttributes(int i, UINT Query);
|
||||||
|
void RefreshGhostedState();
|
||||||
PCUITEMID_CHILD _PidlByItem(int i);
|
PCUITEMID_CHILD _PidlByItem(int i);
|
||||||
PCUITEMID_CHILD _PidlByItem(LVITEM& lvItem);
|
PCUITEMID_CHILD _PidlByItem(LVITEM& lvItem);
|
||||||
int LV_FindItemByPidl(PCUITEMID_CHILD pidl);
|
int LV_FindItemByPidl(PCUITEMID_CHILD pidl);
|
||||||
|
@ -485,6 +490,8 @@ public:
|
||||||
LRESULT OnCustomItem(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled);
|
LRESULT OnCustomItem(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled);
|
||||||
LRESULT OnSettingChange(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled);
|
LRESULT OnSettingChange(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled);
|
||||||
LRESULT OnInitMenuPopup(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled);
|
LRESULT OnInitMenuPopup(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled);
|
||||||
|
LRESULT OnChangeCBChain(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled);
|
||||||
|
LRESULT OnDrawClipboard(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled);
|
||||||
|
|
||||||
virtual VOID OnFinalMessage(HWND) override;
|
virtual VOID OnFinalMessage(HWND) override;
|
||||||
|
|
||||||
|
@ -542,6 +549,8 @@ public:
|
||||||
MESSAGE_HANDLER(CWM_GETISHELLBROWSER, OnGetShellBrowser)
|
MESSAGE_HANDLER(CWM_GETISHELLBROWSER, OnGetShellBrowser)
|
||||||
MESSAGE_HANDLER(WM_SETTINGCHANGE, OnSettingChange)
|
MESSAGE_HANDLER(WM_SETTINGCHANGE, OnSettingChange)
|
||||||
MESSAGE_HANDLER(WM_INITMENUPOPUP, OnInitMenuPopup)
|
MESSAGE_HANDLER(WM_INITMENUPOPUP, OnInitMenuPopup)
|
||||||
|
MESSAGE_HANDLER(WM_CHANGECBCHAIN, OnChangeCBChain)
|
||||||
|
MESSAGE_HANDLER(WM_DRAWCLIPBOARD, OnDrawClipboard)
|
||||||
END_MSG_MAP()
|
END_MSG_MAP()
|
||||||
|
|
||||||
BEGIN_COM_MAP(CDefView)
|
BEGIN_COM_MAP(CDefView)
|
||||||
|
@ -592,6 +601,7 @@ CDefView::CDefView() :
|
||||||
m_isEditing(FALSE),
|
m_isEditing(FALSE),
|
||||||
m_isParentFolderSpecial(FALSE),
|
m_isParentFolderSpecial(FALSE),
|
||||||
m_ScheduledStatusbarUpdate(false),
|
m_ScheduledStatusbarUpdate(false),
|
||||||
|
m_HasCutItems(false),
|
||||||
m_Destroyed(FALSE)
|
m_Destroyed(FALSE)
|
||||||
{
|
{
|
||||||
ZeroMemory(&m_FolderSettings, sizeof(m_FolderSettings));
|
ZeroMemory(&m_FolderSettings, sizeof(m_FolderSettings));
|
||||||
|
@ -1287,6 +1297,18 @@ BOOL CDefView::_Sort(int Col)
|
||||||
return m_ListView.SortItems(ListViewCompareItems, this);
|
return m_ListView.SortItems(ListViewCompareItems, this);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
SFGAOF CDefView::GetItemAttributes(PCUITEMID_CHILD pidl, UINT Query)
|
||||||
|
{
|
||||||
|
SFGAOF Attr = (SFGAOF)Query;
|
||||||
|
return SUCCEEDED(m_pSFParent->GetAttributesOf(1, &pidl, &Attr)) ? (Attr & Query) : 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
SFGAOF CDefView::GetItemAttributes(int i, UINT Query)
|
||||||
|
{
|
||||||
|
PCUITEMID_CHILD pItem = _PidlByItem(i);
|
||||||
|
return pItem ? GetItemAttributes(pItem, Query) : 0;
|
||||||
|
}
|
||||||
|
|
||||||
PCUITEMID_CHILD CDefView::_PidlByItem(int i)
|
PCUITEMID_CHILD CDefView::_PidlByItem(int i)
|
||||||
{
|
{
|
||||||
if (!m_ListView)
|
if (!m_ListView)
|
||||||
|
@ -1342,13 +1364,15 @@ int CDefView::LV_AddItem(PCUITEMID_CHILD pidl)
|
||||||
if (_DoFolderViewCB(SFVM_ADDINGOBJECT, 0, (LPARAM)pidl) == S_FALSE)
|
if (_DoFolderViewCB(SFVM_ADDINGOBJECT, 0, (LPARAM)pidl) == S_FALSE)
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
lvItem.mask = LVIF_TEXT | LVIF_IMAGE | LVIF_PARAM; // set mask
|
lvItem.mask = LVIF_TEXT | LVIF_IMAGE | LVIF_PARAM | LVIF_STATE;
|
||||||
lvItem.iItem = m_ListView.GetItemCount(); // add item to lists end
|
lvItem.iItem = m_ListView.GetItemCount(); // add item to lists end
|
||||||
lvItem.iSubItem = 0;
|
lvItem.iSubItem = 0;
|
||||||
lvItem.lParam = reinterpret_cast<LPARAM>(ILClone(pidl)); // set item's data
|
lvItem.lParam = reinterpret_cast<LPARAM>(ILClone(pidl)); // set item's data
|
||||||
lvItem.pszText = LPSTR_TEXTCALLBACKW; // get text on a callback basis
|
lvItem.pszText = LPSTR_TEXTCALLBACKW; // get text on a callback basis
|
||||||
lvItem.iImage = I_IMAGECALLBACK; // get image on a callback basis
|
lvItem.iImage = I_IMAGECALLBACK; // get image on a callback basis
|
||||||
lvItem.stateMask = LVIS_CUT;
|
lvItem.stateMask = LVIS_CUT;
|
||||||
|
if (m_HasCutItems)
|
||||||
|
lvItem.state = GetItemAttributes(pidl, SFGAO_HIDDEN | SFGAO_GHOSTED) ? LVIS_CUT : 0;
|
||||||
|
|
||||||
return m_ListView.InsertItem(&lvItem);
|
return m_ListView.InsertItem(&lvItem);
|
||||||
}
|
}
|
||||||
|
@ -1422,14 +1446,21 @@ BOOLEAN CDefView::LV_UpdateItem(PCUITEMID_CHILD pidl)
|
||||||
|
|
||||||
if (-1 != nItem)
|
if (-1 != nItem)
|
||||||
{
|
{
|
||||||
_DoFolderViewCB(SFVM_UPDATINGOBJECT, 0, (LPARAM)pidl);
|
_DoFolderViewCB(SFVM_UPDATINGOBJECT, nItem, (LPARAM)pidl);
|
||||||
|
|
||||||
lvItem.mask = LVIF_IMAGE;
|
lvItem.mask = LVIF_IMAGE | LVIF_STATE;
|
||||||
lvItem.iItem = nItem;
|
lvItem.iItem = nItem;
|
||||||
lvItem.iSubItem = 0;
|
lvItem.iSubItem = 0;
|
||||||
lvItem.iImage = SHMapPIDLToSystemImageListIndex(m_pSFParent, pidl, 0);
|
lvItem.iImage = SHMapPIDLToSystemImageListIndex(m_pSFParent, pidl, 0);
|
||||||
m_ListView.SetItem(&lvItem);
|
lvItem.stateMask = LVIS_CUT;
|
||||||
m_ListView.Update(nItem);
|
if (m_HasCutItems)
|
||||||
|
lvItem.state = GetItemAttributes(pidl, SFGAO_HIDDEN | SFGAO_GHOSTED) ? LVIS_CUT : 0;
|
||||||
|
PCUITEMID_CHILD pidlOld = _PidlByItem(nItem);
|
||||||
|
if (pidlOld && (lvItem.lParam = reinterpret_cast<LPARAM>(ILClone(pidl))) != NULL)
|
||||||
|
lvItem.mask |= LVIF_PARAM;
|
||||||
|
if (m_ListView.SetItem(&lvItem) && lvItem.lParam && pidlOld)
|
||||||
|
ILFree(const_cast<PUITEMID_CHILD>(pidlOld));
|
||||||
|
for (UINT i = 0; m_ListView.SetItemText(nItem, i, LPSTR_TEXTCALLBACK); ++i) {} // Update all columns
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1597,6 +1628,8 @@ LRESULT CDefView::OnDestroy(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHand
|
||||||
m_Destroyed = TRUE;
|
m_Destroyed = TRUE;
|
||||||
RevokeDragDrop(m_hWnd);
|
RevokeDragDrop(m_hWnd);
|
||||||
SHChangeNotifyDeregister(m_hNotify);
|
SHChangeNotifyDeregister(m_hNotify);
|
||||||
|
m_hNotify = NULL;
|
||||||
|
m_ClipboardChain.Unhook(m_hWnd);
|
||||||
if (m_pFileMenu)
|
if (m_pFileMenu)
|
||||||
{
|
{
|
||||||
IUnknown_SetSite(m_pFileMenu, NULL);
|
IUnknown_SetSite(m_pFileMenu, NULL);
|
||||||
|
@ -1607,7 +1640,6 @@ LRESULT CDefView::OnDestroy(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHand
|
||||||
DestroyMenu(m_hMenu);
|
DestroyMenu(m_hMenu);
|
||||||
m_hMenu = NULL;
|
m_hMenu = NULL;
|
||||||
}
|
}
|
||||||
m_hNotify = NULL;
|
|
||||||
SHFree(m_pidlParent);
|
SHFree(m_pidlParent);
|
||||||
m_pidlParent = NULL;
|
m_pidlParent = NULL;
|
||||||
}
|
}
|
||||||
|
@ -2672,18 +2704,14 @@ LRESULT CDefView::OnNotify(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandl
|
||||||
TRACE("-- text=%s\n", debugstr_w(lpdi->item.pszText));
|
TRACE("-- text=%s\n", debugstr_w(lpdi->item.pszText));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if(lpdi->item.mask & LVIF_IMAGE) /* image requested */
|
if (lpdi->item.mask & LVIF_IMAGE)
|
||||||
{
|
{
|
||||||
lpdi->item.iImage = SHMapPIDLToSystemImageListIndex(m_pSFParent, pidl, 0);
|
lpdi->item.iImage = SHMapPIDLToSystemImageListIndex(m_pSFParent, pidl, 0);
|
||||||
}
|
}
|
||||||
if(lpdi->item.mask & LVIF_STATE)
|
if (lpdi->item.mask & LVIF_STATE)
|
||||||
{
|
{
|
||||||
ULONG attributes = SFGAO_HIDDEN;
|
if ((lpdi->item.stateMask & LVIS_CUT) && GetItemAttributes(pidl, SFGAO_HIDDEN | SFGAO_GHOSTED))
|
||||||
if (SUCCEEDED(m_pSFParent->GetAttributesOf(1, &pidl, &attributes)))
|
lpdi->item.state |= LVIS_CUT;
|
||||||
{
|
|
||||||
if (attributes & SFGAO_HIDDEN)
|
|
||||||
lpdi->item.state |= LVIS_CUT;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
lpdi->item.mask |= LVIF_DI_SETITEM;
|
lpdi->item.mask |= LVIF_DI_SETITEM;
|
||||||
break;
|
break;
|
||||||
|
@ -2924,7 +2952,10 @@ LRESULT CDefView::OnChangeNotify(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &
|
||||||
break;
|
break;
|
||||||
case SHCNE_UPDATEDIR:
|
case SHCNE_UPDATEDIR:
|
||||||
case SHCNE_ATTRIBUTES:
|
case SHCNE_ATTRIBUTES:
|
||||||
Refresh();
|
if (child0)
|
||||||
|
LV_UpdateItem(child0);
|
||||||
|
else
|
||||||
|
Refresh();
|
||||||
UpdateStatusbar();
|
UpdateStatusbar();
|
||||||
break;
|
break;
|
||||||
case SHCNE_FREESPACE:
|
case SHCNE_FREESPACE:
|
||||||
|
@ -3029,6 +3060,31 @@ LRESULT CDefView::OnInitMenuPopup(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
LRESULT CDefView::OnChangeCBChain(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled)
|
||||||
|
{
|
||||||
|
bHandled = TRUE;
|
||||||
|
return m_ClipboardChain.HandleChangeCBChain(wParam, lParam);
|
||||||
|
}
|
||||||
|
|
||||||
|
LRESULT CDefView::OnDrawClipboard(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled)
|
||||||
|
{
|
||||||
|
bHandled = TRUE;
|
||||||
|
const LRESULT res = m_ClipboardChain.HandleDrawClipboard(wParam, lParam);
|
||||||
|
if (m_HasCutItems)
|
||||||
|
{
|
||||||
|
m_ClipboardChain.Unhook(m_hWnd);
|
||||||
|
m_HasCutItems = false;
|
||||||
|
m_ListView.SetItemState(-1, 0, LVIS_CUT); // Somebody copied or pasted, nothing can be "cut" anymore
|
||||||
|
m_ListView.SendMessageW(LVM_SETCALLBACKMASK, m_ListView.SendMessageW(LVM_GETCALLBACKMASK, 0, 0) | LVIS_CUT, 0);
|
||||||
|
}
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
void CDefView::RefreshGhostedState()
|
||||||
|
{
|
||||||
|
for (UINT i = 0, c = m_ListView.GetItemCount(); i < c; ++i)
|
||||||
|
m_ListView.SetItemState(i, GetItemAttributes(i, SFGAO_HIDDEN | SFGAO_GHOSTED) ? LVIS_CUT : 0, LVIS_CUT);
|
||||||
|
}
|
||||||
|
|
||||||
// The INTERFACE of the IShellView object
|
// The INTERFACE of the IShellView object
|
||||||
|
|
||||||
|
@ -3563,12 +3619,12 @@ HRESULT STDMETHODCALLTYPE CDefView::Item(int iItemIndex, PITEMID_CHILD *ppidl)
|
||||||
HRESULT STDMETHODCALLTYPE CDefView::ItemCount(UINT uFlags, int *pcItems)
|
HRESULT STDMETHODCALLTYPE CDefView::ItemCount(UINT uFlags, int *pcItems)
|
||||||
{
|
{
|
||||||
TRACE("(%p)->(%u %p)\n", this, uFlags, pcItems);
|
TRACE("(%p)->(%u %p)\n", this, uFlags, pcItems);
|
||||||
|
if (uFlags != SVGIO_ALLVIEW && uFlags != SVGIO_SELECTION)
|
||||||
if (uFlags != SVGIO_ALLVIEW)
|
FIXME("some flags unsupported, %x\n", uFlags & ~(SVGIO_ALLVIEW | SVGIO_SELECTION));
|
||||||
FIXME("some flags unsupported, %x\n", uFlags & ~SVGIO_ALLVIEW);
|
if ((uFlags & SVGIO_TYPE_MASK) == SVGIO_SELECTION)
|
||||||
|
*pcItems = m_ListView.GetSelectedCount();
|
||||||
*pcItems = m_ListView.GetItemCount();
|
else
|
||||||
|
*pcItems = m_ListView.GetItemCount();
|
||||||
return S_OK;
|
return S_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -3827,14 +3883,15 @@ HRESULT STDMETHODCALLTYPE CDefView::SelectAndPositionItem(LPCITEMIDLIST item, UI
|
||||||
|
|
||||||
HRESULT STDMETHODCALLTYPE CDefView::Rearrange(LPARAM sort)
|
HRESULT STDMETHODCALLTYPE CDefView::Rearrange(LPARAM sort)
|
||||||
{
|
{
|
||||||
FIXME("(%p)->(%ld) stub\n", this, sort);
|
_Sort(LOWORD(sort & SHCIDS_COLUMNMASK));
|
||||||
return E_NOTIMPL;
|
return S_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
HRESULT STDMETHODCALLTYPE CDefView::GetArrangeParam(LPARAM *sort)
|
HRESULT STDMETHODCALLTYPE CDefView::GetArrangeParam(LPARAM *sort)
|
||||||
{
|
{
|
||||||
FIXME("(%p)->(%p) stub\n", this, sort);
|
int col = m_sortInfo.ListColumn;
|
||||||
return E_NOTIMPL;
|
*sort = col != LISTVIEW_SORT_INFO::UNSPECIFIEDCOLUMN ? col : 0;
|
||||||
|
return col != LISTVIEW_SORT_INFO::UNSPECIFIEDCOLUMN ? S_OK : S_FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
HRESULT STDMETHODCALLTYPE CDefView::ArrangeGrid()
|
HRESULT STDMETHODCALLTYPE CDefView::ArrangeGrid()
|
||||||
|
@ -3927,8 +3984,8 @@ HRESULT STDMETHODCALLTYPE CDefView::SetRedraw(BOOL redraw)
|
||||||
|
|
||||||
HRESULT STDMETHODCALLTYPE CDefView::GetSelectedCount(UINT *count)
|
HRESULT STDMETHODCALLTYPE CDefView::GetSelectedCount(UINT *count)
|
||||||
{
|
{
|
||||||
FIXME("(%p)->(%p) stub\n", this, count);
|
*count = m_ListView.GetSelectedCount();
|
||||||
return E_NOTIMPL;
|
return S_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
HRESULT STDMETHODCALLTYPE CDefView::GetSelectedObjects(PCUITEMID_CHILD **pidl, UINT *items)
|
HRESULT STDMETHODCALLTYPE CDefView::GetSelectedObjects(PCUITEMID_CHILD **pidl, UINT *items)
|
||||||
|
@ -3998,8 +4055,26 @@ HRESULT STDMETHODCALLTYPE CDefView::IsBkDropTarget(IDropTarget *drop_target)
|
||||||
|
|
||||||
HRESULT STDMETHODCALLTYPE CDefView::SetClipboard(BOOL move)
|
HRESULT STDMETHODCALLTYPE CDefView::SetClipboard(BOOL move)
|
||||||
{
|
{
|
||||||
FIXME("(%p)->(%d) stub\n", this, move);
|
if (!move)
|
||||||
return E_NOTIMPL;
|
return S_OK;
|
||||||
|
|
||||||
|
UINT CutCount = 0;
|
||||||
|
for (int i = -1; (i = m_ListView.GetNextItem(i, LVNI_SELECTED)) != -1;)
|
||||||
|
{
|
||||||
|
if (!CutCount++)
|
||||||
|
{
|
||||||
|
// Turn off the LVIS_CUT LVM_SETCALLBACKMASK optimization
|
||||||
|
m_ListView.SendMessageW(LVM_SETCALLBACKMASK, m_ListView.SendMessageW(LVM_GETCALLBACKMASK, 0, 0) & ~LVIS_CUT, 0);
|
||||||
|
RefreshGhostedState();
|
||||||
|
}
|
||||||
|
m_ListView.SetItemState(i, LVIS_CUT, LVIS_CUT);
|
||||||
|
}
|
||||||
|
if (CutCount)
|
||||||
|
{
|
||||||
|
m_ClipboardChain.Hook(m_hWnd);
|
||||||
|
m_HasCutItems = true;
|
||||||
|
}
|
||||||
|
return S_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
HRESULT STDMETHODCALLTYPE CDefView::SetPoints(IDataObject *obj)
|
HRESULT STDMETHODCALLTYPE CDefView::SetPoints(IDataObject *obj)
|
||||||
|
@ -4622,12 +4697,9 @@ HRESULT WINAPI CDefView::GetAdvise(DWORD *pAspects, DWORD *pAdvf, IAdviseSink **
|
||||||
|
|
||||||
HRESULT STDMETHODCALLTYPE CDefView::QueryService(REFGUID guidService, REFIID riid, void **ppvObject)
|
HRESULT STDMETHODCALLTYPE CDefView::QueryService(REFGUID guidService, REFIID riid, void **ppvObject)
|
||||||
{
|
{
|
||||||
if (IsEqualIID(guidService, SID_IShellBrowser) && m_pShellBrowser)
|
if (IsEqualIID(guidService, SID_SFolderView))
|
||||||
return m_pShellBrowser->QueryInterface(riid, ppvObject);
|
|
||||||
else if (IsEqualIID(guidService, SID_IFolderView))
|
|
||||||
return QueryInterface(riid, ppvObject);
|
return QueryInterface(riid, ppvObject);
|
||||||
|
return m_pShellBrowser ? IUnknown_QueryService(m_pShellBrowser, guidService, riid, ppvObject) : E_NOINTERFACE;
|
||||||
return E_NOINTERFACE;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
HRESULT CDefView::_MergeToolbar()
|
HRESULT CDefView::_MergeToolbar()
|
||||||
|
@ -4674,8 +4746,7 @@ HRESULT CDefView_CreateInstance(IShellFolder *pFolder, REFIID riid, LPVOID * ppv
|
||||||
return ShellObjectCreatorInit<CDefView>(pFolder, riid, ppvOut);
|
return ShellObjectCreatorInit<CDefView>(pFolder, riid, ppvOut);
|
||||||
}
|
}
|
||||||
|
|
||||||
HRESULT WINAPI SHCreateShellFolderView(const SFV_CREATE *pcsfv,
|
HRESULT WINAPI SHCreateShellFolderView(const SFV_CREATE *pcsfv, IShellView **ppsv)
|
||||||
IShellView **ppsv)
|
|
||||||
{
|
{
|
||||||
CComPtr<IShellView> psv;
|
CComPtr<IShellView> psv;
|
||||||
HRESULT hRes;
|
HRESULT hRes;
|
||||||
|
|
|
@ -70,7 +70,7 @@ BOOL CDefViewBckgrndMenu::_bIsDesktopBrowserMenu()
|
||||||
|
|
||||||
/* Get a pointer to the shell browser */
|
/* Get a pointer to the shell browser */
|
||||||
CComPtr<IShellView> psv;
|
CComPtr<IShellView> psv;
|
||||||
HRESULT hr = IUnknown_QueryService(m_site, SID_IFolderView, IID_PPV_ARG(IShellView, &psv));
|
HRESULT hr = IUnknown_QueryService(m_site, SID_SFolderView, IID_PPV_ARG(IShellView, &psv));
|
||||||
if (FAILED_UNEXPECTEDLY(hr))
|
if (FAILED_UNEXPECTEDLY(hr))
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
|
||||||
|
@ -265,7 +265,7 @@ CDefViewBckgrndMenu::InvokeCommand(LPCMINVOKECOMMANDINFO lpcmi)
|
||||||
|
|
||||||
/* Get a pointer to the shell browser */
|
/* Get a pointer to the shell browser */
|
||||||
CComPtr<IShellView> psv;
|
CComPtr<IShellView> psv;
|
||||||
HRESULT hr = IUnknown_QueryService(m_site, SID_IFolderView, IID_PPV_ARG(IShellView, &psv));
|
HRESULT hr = IUnknown_QueryService(m_site, SID_SFolderView, IID_PPV_ARG(IShellView, &psv));
|
||||||
if (FAILED_UNEXPECTEDLY(hr))
|
if (FAILED_UNEXPECTEDLY(hr))
|
||||||
return hr;
|
return hr;
|
||||||
|
|
||||||
|
|
|
@ -1031,10 +1031,16 @@ HRESULT CDefaultContextMenu::DoCopyOrCut(LPCMINVOKECOMMANDINFOEX lpcmi, BOOL bCo
|
||||||
GlobalUnlock(medium.hGlobal);
|
GlobalUnlock(medium.hGlobal);
|
||||||
m_pDataObj->SetData(&formatetc, &medium, TRUE);
|
m_pDataObj->SetData(&formatetc, &medium, TRUE);
|
||||||
|
|
||||||
|
CComPtr<IShellFolderView> psfv;
|
||||||
|
if (SUCCEEDED(IUnknown_QueryService(m_site, SID_SFolderView, IID_PPV_ARG(IShellFolderView, &psfv))))
|
||||||
|
psfv->SetPoints(m_pDataObj);
|
||||||
|
|
||||||
HRESULT hr = OleSetClipboard(m_pDataObj);
|
HRESULT hr = OleSetClipboard(m_pDataObj);
|
||||||
if (FAILED_UNEXPECTEDLY(hr))
|
if (FAILED_UNEXPECTEDLY(hr))
|
||||||
return hr;
|
return hr;
|
||||||
|
|
||||||
|
if (psfv)
|
||||||
|
psfv->SetClipboard(!bCopy);
|
||||||
return S_OK;
|
return S_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1161,7 +1167,7 @@ CDefaultContextMenu::DoCreateNewFolder(
|
||||||
return S_OK;
|
return S_OK;
|
||||||
|
|
||||||
/* Get a pointer to the shell view */
|
/* Get a pointer to the shell view */
|
||||||
hr = IUnknown_QueryService(m_site, SID_IFolderView, IID_PPV_ARG(IShellView, &psv));
|
hr = IUnknown_QueryService(m_site, SID_SFolderView, IID_PPV_ARG(IShellView, &psv));
|
||||||
if (FAILED_UNEXPECTEDLY(hr))
|
if (FAILED_UNEXPECTEDLY(hr))
|
||||||
return S_OK;
|
return S_OK;
|
||||||
|
|
||||||
|
|
|
@ -430,7 +430,7 @@ HRESULT CNewMenu::SelectNewItem(LONG wEventId, UINT uFlags, LPWSTR pszName, BOOL
|
||||||
return S_OK;
|
return S_OK;
|
||||||
|
|
||||||
/* Get a pointer to the shell view */
|
/* Get a pointer to the shell view */
|
||||||
hr = IUnknown_QueryService(m_pSite, SID_IFolderView, IID_PPV_ARG(IShellView, &lpSV));
|
hr = IUnknown_QueryService(m_pSite, SID_SFolderView, IID_PPV_ARG(IShellView, &lpSV));
|
||||||
if (FAILED_UNEXPECTEDLY(hr))
|
if (FAILED_UNEXPECTEDLY(hr))
|
||||||
return S_OK;
|
return S_OK;
|
||||||
|
|
||||||
|
|
|
@ -468,7 +468,7 @@ HRESULT WINAPI CFSDropTarget::Drop(IDataObject *pDataObject,
|
||||||
if (*pdwEffect == DROPEFFECT_MOVE && m_site)
|
if (*pdwEffect == DROPEFFECT_MOVE && m_site)
|
||||||
{
|
{
|
||||||
CComPtr<IShellFolderView> psfv;
|
CComPtr<IShellFolderView> psfv;
|
||||||
HRESULT hr = IUnknown_QueryService(m_site, SID_IFolderView, IID_PPV_ARG(IShellFolderView, &psfv));
|
HRESULT hr = IUnknown_QueryService(m_site, SID_SFolderView, IID_PPV_ARG(IShellFolderView, &psfv));
|
||||||
if (SUCCEEDED(hr) && psfv->IsDropOnSource(this) == S_OK)
|
if (SUCCEEDED(hr) && psfv->IsDropOnSource(this) == S_OK)
|
||||||
{
|
{
|
||||||
_RepositionItems(psfv, pDataObject, pt);
|
_RepositionItems(psfv, pDataObject, pt);
|
||||||
|
|
|
@ -505,7 +505,7 @@ fail:
|
||||||
return mem;
|
return mem;
|
||||||
}
|
}
|
||||||
|
|
||||||
typedef struct
|
typedef struct _FILEOPDATA
|
||||||
{
|
{
|
||||||
PCUITEMID_CHILD_ARRAY apidl;
|
PCUITEMID_CHILD_ARRAY apidl;
|
||||||
UINT cidl, index;
|
UINT cidl, index;
|
||||||
|
|
|
@ -322,7 +322,7 @@ InvokeIExecuteCommandWithDataObject(
|
||||||
_In_opt_ LPCMINVOKECOMMANDINFOEX pICI,
|
_In_opt_ LPCMINVOKECOMMANDINFOEX pICI,
|
||||||
_In_opt_ IUnknown *pSite);
|
_In_opt_ IUnknown *pSite);
|
||||||
|
|
||||||
typedef enum {
|
typedef enum _FILEOPCALLBACKEVENT {
|
||||||
FOCE_STARTOPERATIONS,
|
FOCE_STARTOPERATIONS,
|
||||||
FOCE_FINISHOPERATIONS,
|
FOCE_FINISHOPERATIONS,
|
||||||
FOCE_PREMOVEITEM,
|
FOCE_PREMOVEITEM,
|
||||||
|
|
|
@ -299,7 +299,8 @@ GetFilterFromEvents(DWORD fEvents)
|
||||||
return (FILE_NOTIFY_CHANGE_FILE_NAME |
|
return (FILE_NOTIFY_CHANGE_FILE_NAME |
|
||||||
FILE_NOTIFY_CHANGE_DIR_NAME |
|
FILE_NOTIFY_CHANGE_DIR_NAME |
|
||||||
FILE_NOTIFY_CHANGE_CREATION |
|
FILE_NOTIFY_CHANGE_CREATION |
|
||||||
FILE_NOTIFY_CHANGE_SIZE);
|
FILE_NOTIFY_CHANGE_SIZE |
|
||||||
|
FILE_NOTIFY_CHANGE_ATTRIBUTES);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Restart a watch by using ReadDirectoryChangesW function
|
// Restart a watch by using ReadDirectoryChangesW function
|
||||||
|
|
|
@ -90,3 +90,37 @@ SHELL_CreateFallbackExtractIconForNoAssocFile(REFIID riid, LPVOID *ppvOut)
|
||||||
const int id = IDI_SHELL_DOCUMENT;
|
const int id = IDI_SHELL_DOCUMENT;
|
||||||
return SHELL_CreateShell32DefaultExtractIcon(id > 1 ? -id : 0, riid, ppvOut);
|
return SHELL_CreateShell32DefaultExtractIcon(id > 1 ? -id : 0, riid, ppvOut);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
struct ClipboardViewerChain
|
||||||
|
{
|
||||||
|
HWND m_hWndNext = HWND_BOTTOM;
|
||||||
|
|
||||||
|
void Unhook(HWND hWnd)
|
||||||
|
{
|
||||||
|
if (m_hWndNext != HWND_BOTTOM)
|
||||||
|
ChangeClipboardChain(hWnd, m_hWndNext);
|
||||||
|
m_hWndNext = HWND_BOTTOM;
|
||||||
|
}
|
||||||
|
|
||||||
|
void Hook(HWND hWnd)
|
||||||
|
{
|
||||||
|
if (m_hWndNext == HWND_BOTTOM)
|
||||||
|
m_hWndNext = SetClipboardViewer(hWnd);
|
||||||
|
}
|
||||||
|
|
||||||
|
LRESULT HandleChangeCBChain(WPARAM wParam, LPARAM lParam)
|
||||||
|
{
|
||||||
|
if (m_hWndNext == (HWND)wParam)
|
||||||
|
return (LRESULT)(m_hWndNext = (HWND)lParam);
|
||||||
|
else if (m_hWndNext && m_hWndNext != HWND_BOTTOM)
|
||||||
|
return ::SendMessageW(m_hWndNext, WM_CHANGECBCHAIN, wParam, lParam);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
LRESULT HandleDrawClipboard(WPARAM wParam, LPARAM lParam)
|
||||||
|
{
|
||||||
|
if (m_hWndNext && m_hWndNext != HWND_BOTTOM)
|
||||||
|
return ::SendMessageW(m_hWndNext, WM_DRAWCLIPBOARD, wParam, lParam);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
|
@ -898,6 +898,7 @@ interface IFolderView : IUnknown
|
||||||
[in] DWORD flags
|
[in] DWORD flags
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
cpp_quote("#define SID_SFolderView IID_IFolderView")
|
||||||
|
|
||||||
[v1_enum] enum tagSORTDIRECTION
|
[v1_enum] enum tagSORTDIRECTION
|
||||||
{
|
{
|
||||||
|
|
|
@ -211,7 +211,6 @@ DEFINE_GUID(IID_IPinnedList, 0xBBD20037, 0xBC0E, 0x42F1, 0x91, 0x3
|
||||||
|
|
||||||
#define SID_STravelLogCursor IID_ITravelLogStg
|
#define SID_STravelLogCursor IID_ITravelLogStg
|
||||||
#define SID_IBandSite IID_IBandSite
|
#define SID_IBandSite IID_IBandSite
|
||||||
#define SID_IFolderView IID_IFolderView
|
|
||||||
#define SID_IShellBrowser IID_IShellBrowser
|
#define SID_IShellBrowser IID_IShellBrowser
|
||||||
|
|
||||||
#endif // __SHLGUID_UNDOC_H
|
#endif // __SHLGUID_UNDOC_H
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue