13. Reorder of columns doesn't work - might be bug in comctl32
*/
-#include <precomp.h>
+#include "precomp.h"
+
+#include <atlwin.h>
+#include <rosctrls.h>
WINE_DEFAULT_DEBUG_CHANNEL(shell);
static const WCHAR SV_CLASS_NAME[] = {'S', 'H', 'E', 'L', 'L', 'D', 'L', 'L', '_', 'D', 'e', 'f', 'V', 'i', 'e', 'w', 0};
typedef struct
-{ BOOL bIsAscending;
+{
+ BOOL bIsAscending;
INT nHeaderID;
INT nLastHeaderID;
} LISTVIEW_SORT_INFO, *LPLISTVIEW_SORT_INFO;
public CComObjectRootEx<CComMultiThreadModelNoCS>,
public IShellView,
public IFolderView,
+ public IShellFolderView,
public IOleCommandTarget,
public IDropTarget,
public IDropSource,
public IServiceProvider
{
private:
- CComPtr<IShellFolder> pSFParent;
- CComPtr<IShellFolder2> pSF2Parent;
- CComPtr<IShellBrowser> pShellBrowser;
- CComPtr<ICommDlgBrowser> pCommDlgBrowser;
- HWND hWndList; /* ListView control */
- HWND hWndParent;
- FOLDERSETTINGS FolderSettings;
- HMENU hMenu;
- UINT uState;
- UINT cidl;
- LPITEMIDLIST *apidl;
- LISTVIEW_SORT_INFO ListViewSortInfo;
- ULONG hNotify; /* change notification handle */
- HANDLE hAccel;
- DWORD dwAspects;
- DWORD dwAdvf;
- CComPtr<IAdviseSink> pAdvSink;
+ CComPtr<IShellFolder> m_pSFParent;
+ CComPtr<IShellFolder2> m_pSF2Parent;
+ CComPtr<IShellBrowser> m_pShellBrowser;
+ CComPtr<ICommDlgBrowser> m_pCommDlgBrowser;
+ CListView m_ListView;
+ HWND m_hWndParent;
+ FOLDERSETTINGS m_FolderSettings;
+ HMENU m_hMenu;
+ BOOL m_menusLoaded;
+ UINT m_uState;
+ UINT m_cidl;
+ LPITEMIDLIST *m_apidl;
+ LISTVIEW_SORT_INFO m_sortInfo;
+ ULONG m_hNotify; /* change notification handle */
+ HACCEL m_hAccel;
+ DWORD m_dwAspects;
+ DWORD m_dwAdvf;
+ CComPtr<IAdviseSink> m_pAdvSink;
// for drag and drop
- CComPtr<IDropTarget> pCurDropTarget; /* The sub-item, which is currently dragged over */
- CComPtr<IDataObject> pCurDataObject; /* The dragged data-object */
- LONG iDragOverItem; /* Dragged over item's index, iff pCurDropTarget != NULL */
- UINT cScrollDelay; /* Send a WM_*SCROLL msg every 250 ms during drag-scroll */
- POINT ptLastMousePos; /* Mouse position at last DragOver call */
+ CComPtr<IDropTarget> m_pCurDropTarget; /* The sub-item, which is currently dragged over */
+ CComPtr<IDataObject> m_pCurDataObject; /* The dragged data-object */
+ LONG m_iDragOverItem; /* Dragged over item's index, iff m_pCurDropTarget != NULL */
+ UINT m_cScrollDelay; /* Send a WM_*SCROLL msg every 250 ms during drag-scroll */
+ POINT m_ptLastMousePos; /* Mouse position at last DragOver call */
//
- CComPtr<IContextMenu2> pCM;
+ CComPtr<IContextMenu> m_pCM;
+
+ BOOL m_isEditing;
+
+ CLSID m_Category;
+ HMENU m_hView;
+ private:
+
+ HRESULT _MergeToolbar();
+
public:
CDefView();
~CDefView();
void UpdateListColors();
BOOL InitList();
static INT CALLBACK CompareItems(LPVOID lParam1, LPVOID lParam2, LPARAM lpData);
- static INT CALLBACK ListViewCompareItems(LPVOID lParam1, LPVOID lParam2, LPARAM lpData);
+ static INT CALLBACK ListViewCompareItems(LPARAM lParam1, LPARAM lParam2, LPARAM lpData);
int LV_FindItemByPidl(LPCITEMIDLIST pidl);
BOOLEAN LV_AddItem(LPCITEMIDLIST pidl);
BOOLEAN LV_DeleteItem(LPCITEMIDLIST pidl);
static INT CALLBACK fill_list(LPVOID ptr, LPVOID arg);
HRESULT FillList();
HMENU BuildFileMenu();
- void MergeFileMenu(HMENU hSubMenu);
- void MergeViewMenu(HMENU hSubMenu);
+ void PrepareShowFileMenu(HMENU hSubMenu);
+ void PrepareShowViewMenu(HMENU hSubMenu);
UINT GetSelections();
HRESULT OpenSelectedItems();
void OnDeactivate();
void DoActivate(UINT uState);
HRESULT drag_notify_subitem(DWORD grfKeyState, POINTL pt, DWORD *pdwEffect);
+ LRESULT OnExplorerCommand(UINT uCommand, BOOL bUseSelection);
// *** IOleWindow methods ***
virtual HRESULT STDMETHODCALLTYPE GetWindow(HWND *lphwnd);
virtual HRESULT STDMETHODCALLTYPE GetDefaultSpacing(POINT *ppt);
virtual HRESULT STDMETHODCALLTYPE GetAutoArrange();
virtual HRESULT STDMETHODCALLTYPE SelectItem(int iItem, DWORD dwFlags);
- virtual HRESULT STDMETHODCALLTYPE SelectAndPositionItems(UINT cidl, LPCITEMIDLIST *apidl, POINT *apt, DWORD dwFlags);
+ virtual HRESULT STDMETHODCALLTYPE SelectAndPositionItems(UINT cidl, PCUITEMID_CHILD_ARRAY apidl, POINT *apt, DWORD dwFlags);
+
+ // *** IShellFolderView methods ***
+ virtual HRESULT STDMETHODCALLTYPE Rearrange(LPARAM sort);
+ virtual HRESULT STDMETHODCALLTYPE GetArrangeParam(LPARAM *sort);
+ virtual HRESULT STDMETHODCALLTYPE ArrangeGrid();
+ virtual HRESULT STDMETHODCALLTYPE AutoArrange();
+ virtual HRESULT STDMETHODCALLTYPE AddObject(PITEMID_CHILD pidl, UINT *item);
+ virtual HRESULT STDMETHODCALLTYPE GetObject(PITEMID_CHILD *pidl, UINT item);
+ virtual HRESULT STDMETHODCALLTYPE RemoveObject(PITEMID_CHILD pidl, UINT *item);
+ virtual HRESULT STDMETHODCALLTYPE GetObjectCount(UINT *count);
+ virtual HRESULT STDMETHODCALLTYPE SetObjectCount(UINT count, UINT flags);
+ virtual HRESULT STDMETHODCALLTYPE UpdateObject(PITEMID_CHILD pidl_old, PITEMID_CHILD pidl_new, UINT *item);
+ virtual HRESULT STDMETHODCALLTYPE RefreshObject(PITEMID_CHILD pidl, UINT *item);
+ virtual HRESULT STDMETHODCALLTYPE SetRedraw(BOOL redraw);
+ virtual HRESULT STDMETHODCALLTYPE GetSelectedCount(UINT *count);
+ virtual HRESULT STDMETHODCALLTYPE GetSelectedObjects(PCUITEMID_CHILD **pidl, UINT *items);
+ virtual HRESULT STDMETHODCALLTYPE IsDropOnSource(IDropTarget *drop_target);
+ virtual HRESULT STDMETHODCALLTYPE GetDragPoint(POINT *pt);
+ virtual HRESULT STDMETHODCALLTYPE GetDropPoint(POINT *pt);
+ virtual HRESULT STDMETHODCALLTYPE MoveIcons(IDataObject *obj);
+ virtual HRESULT STDMETHODCALLTYPE SetItemPos(PCUITEMID_CHILD pidl, POINT *pt);
+ virtual HRESULT STDMETHODCALLTYPE IsBkDropTarget(IDropTarget *drop_target);
+ virtual HRESULT STDMETHODCALLTYPE SetClipboard(BOOL move);
+ virtual HRESULT STDMETHODCALLTYPE SetPoints(IDataObject *obj);
+ virtual HRESULT STDMETHODCALLTYPE GetItemSpacing(ITEMSPACING *spacing);
+ virtual HRESULT STDMETHODCALLTYPE SetCallback(IShellFolderViewCB *new_cb, IShellFolderViewCB **old_cb);
+ virtual HRESULT STDMETHODCALLTYPE Select(UINT flags);
+ virtual HRESULT STDMETHODCALLTYPE QuerySupport(UINT *support);
+ virtual HRESULT STDMETHODCALLTYPE SetAutomationObject(IDispatch *disp);
// *** IOleCommandTarget methods ***
virtual HRESULT STDMETHODCALLTYPE QueryStatus(const GUID *pguidCmdGroup, ULONG cCmds, OLECMD prgCmds[ ], OLECMDTEXT *pCmdText);
LRESULT OnChangeNotify(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 OnInitMenuPopup(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled);
static ATL::CWndClassInfo& GetWndClassInfo()
{
MESSAGE_HANDLER(WM_SYSCOLORCHANGE, OnSysColorChange)
MESSAGE_HANDLER(CWM_GETISHELLBROWSER, OnGetShellBrowser)
MESSAGE_HANDLER(WM_SETTINGCHANGE, OnSettingChange)
+ MESSAGE_HANDLER(WM_INITMENUPOPUP, OnInitMenuPopup)
END_MSG_MAP()
BEGIN_COM_MAP(CDefView)
COM_INTERFACE_ENTRY_IID(IID_IOleWindow, IOleWindow)
COM_INTERFACE_ENTRY_IID(IID_IShellView, IShellView)
COM_INTERFACE_ENTRY_IID(IID_IFolderView, IFolderView)
+ COM_INTERFACE_ENTRY_IID(IID_IShellFolderView, IShellFolderView)
COM_INTERFACE_ENTRY_IID(IID_IOleCommandTarget, IOleCommandTarget)
COM_INTERFACE_ENTRY_IID(IID_IDropTarget, IDropTarget)
COM_INTERFACE_ENTRY_IID(IID_IDropSource, IDropSource)
#define GET_WM_COMMAND_HWND(wp, lp) (HWND)(lp)
#define GET_WM_COMMAND_CMD(wp, lp) HIWORD(wp)
-/*
- Items merged into the toolbar and the filemenu
-*/
-typedef struct
-{ int idCommand;
- int iImage;
- int idButtonString;
- int idMenuString;
- BYTE bState;
- BYTE bStyle;
-} MYTOOLINFO, *LPMYTOOLINFO;
-
-static const MYTOOLINFO Tools[] =
-{
- { FCIDM_SHVIEW_BIGICON, 0, 0, IDS_VIEW_LARGE, TBSTATE_ENABLED, BTNS_BUTTON },
- { FCIDM_SHVIEW_SMALLICON, 0, 0, IDS_VIEW_SMALL, TBSTATE_ENABLED, BTNS_BUTTON },
- { FCIDM_SHVIEW_LISTVIEW, 0, 0, IDS_VIEW_LIST, TBSTATE_ENABLED, BTNS_BUTTON },
- { FCIDM_SHVIEW_REPORTVIEW, 0, 0, IDS_VIEW_DETAILS, TBSTATE_ENABLED, BTNS_BUTTON },
- { -1, 0, 0, 0, 0, 0}
-};
-
typedef void (CALLBACK *PFNSHGETSETTINGSPROC)(LPSHELLFLAGSTATE lpsfs, DWORD dwMask);
-CDefView::CDefView()
-{
- hWndList = NULL;
- hWndParent = NULL;
- FolderSettings.fFlags = 0;
- FolderSettings.ViewMode = 0;
- hMenu = NULL;
- uState = 0;
- cidl = 0;
- apidl = NULL;
- ListViewSortInfo.bIsAscending = FALSE;
- ListViewSortInfo.nHeaderID = 0;
- ListViewSortInfo.nLastHeaderID = 0;
- hNotify = 0;
- hAccel = NULL;
- dwAspects = 0;
- dwAdvf = 0;
- iDragOverItem = 0;
- cScrollDelay = 0;
- ptLastMousePos.x = 0;
- ptLastMousePos.y = 0;
+CDefView::CDefView() :
+ m_ListView(),
+ m_hWndParent(NULL),
+ m_hMenu(NULL),
+ m_menusLoaded(FALSE),
+ m_uState(0),
+ m_cidl(0),
+ m_apidl(NULL),
+ m_hNotify(0),
+ m_hAccel(NULL),
+ m_dwAspects(0),
+ m_dwAdvf(0),
+ m_iDragOverItem(0),
+ m_cScrollDelay(0),
+ m_isEditing(FALSE),
+ m_hView(NULL)
+{
+ ZeroMemory(&m_FolderSettings, sizeof(m_FolderSettings));
+ ZeroMemory(&m_sortInfo, sizeof(m_sortInfo));
+ ZeroMemory(&m_ptLastMousePos, sizeof(m_ptLastMousePos));
+ ZeroMemory(&m_Category, sizeof(m_Category));
}
CDefView::~CDefView()
{
TRACE(" destroying IShellView(%p)\n", this);
- SHFree(apidl);
+ if (m_hWnd)
+ {
+ DestroyViewWindow();
+ }
+
+ SHFree(m_apidl);
}
HRESULT WINAPI CDefView::Initialize(IShellFolder *shellFolder)
{
- pSFParent = shellFolder;
- shellFolder->QueryInterface(IID_IShellFolder2, (LPVOID *)&pSF2Parent);
+ m_pSFParent = shellFolder;
+ shellFolder->QueryInterface(IID_PPV_ARG(IShellFolder2, &m_pSF2Parent));
return S_OK;
}
{
HRESULT ret = S_OK;
- if (pCommDlgBrowser.p != NULL)
+ if (m_pCommDlgBrowser.p != NULL)
{
TRACE("ICommDlgBrowser::IncludeObject pidl=%p\n", pidl);
- ret = pCommDlgBrowser->IncludeObject((IShellView *)this, pidl);
+ ret = m_pCommDlgBrowser->IncludeObject((IShellView *)this, pidl);
TRACE("--0x%08x\n", ret);
}
{
HRESULT ret = S_FALSE;
- if (pCommDlgBrowser.p != NULL)
+ if (m_pCommDlgBrowser.p != NULL)
{
TRACE("ICommDlgBrowser::OnDefaultCommand\n");
- ret = pCommDlgBrowser->OnDefaultCommand((IShellView *)this);
+ ret = m_pCommDlgBrowser->OnDefaultCommand((IShellView *)this);
TRACE("-- returns %08x\n", ret);
}
{
HRESULT ret = S_FALSE;
- if (pCommDlgBrowser.p != NULL)
+ if (m_pCommDlgBrowser.p != NULL)
{
TRACE("ICommDlgBrowser::OnStateChange flags=%x\n", uFlags);
- ret = pCommDlgBrowser->OnStateChange((IShellView *)this, uFlags);
+ ret = m_pCommDlgBrowser->OnStateChange((IShellView *)this, uFlags);
TRACE("--\n");
}
TRACE("\n");
- if (pCommDlgBrowser != NULL)
+ if (m_pCommDlgBrowser != NULL)
{
- pShellBrowser->SendControlMsg(FCW_TOOLBAR, TB_CHECKBUTTON,
- FCIDM_TB_SMALLICON, (FolderSettings.ViewMode == FVM_LIST) ? TRUE : FALSE, &result);
- pShellBrowser->SendControlMsg(FCW_TOOLBAR, TB_CHECKBUTTON,
- FCIDM_TB_REPORTVIEW, (FolderSettings.ViewMode == FVM_DETAILS) ? TRUE : FALSE, &result);
- pShellBrowser->SendControlMsg(FCW_TOOLBAR, TB_ENABLEBUTTON,
+ m_pShellBrowser->SendControlMsg(FCW_TOOLBAR, TB_CHECKBUTTON,
+ FCIDM_TB_SMALLICON, (m_FolderSettings.ViewMode == FVM_LIST) ? TRUE : FALSE, &result);
+ m_pShellBrowser->SendControlMsg(FCW_TOOLBAR, TB_CHECKBUTTON,
+ FCIDM_TB_REPORTVIEW, (m_FolderSettings.ViewMode == FVM_DETAILS) ? TRUE : FALSE, &result);
+ m_pShellBrowser->SendControlMsg(FCW_TOOLBAR, TB_ENABLEBUTTON,
FCIDM_TB_SMALLICON, TRUE, &result);
- pShellBrowser->SendControlMsg(FCW_TOOLBAR, TB_ENABLEBUTTON,
+ m_pShellBrowser->SendControlMsg(FCW_TOOLBAR, TB_ENABLEBUTTON,
FCIDM_TB_REPORTVIEW, TRUE, &result);
}
}
TRACE("(%p)\n", this);
- tmpstyle = ::GetWindowLongPtrW(hWndList, GWL_STYLE);
- ::SetWindowLongPtrW(hWndList, GWL_STYLE, dwAdd | (tmpstyle & ~dwRemove));
+ tmpstyle = ::GetWindowLongPtrW(m_ListView, GWL_STYLE);
+ ::SetWindowLongPtrW(m_ListView, GWL_STYLE, dwAdd | (tmpstyle & ~dwRemove));
}
/**********************************************************
LVS_SHAREIMAGELISTS | LVS_EDITLABELS | LVS_AUTOARRANGE;
dwExStyle = WS_EX_CLIENTEDGE;
- if (FolderSettings.fFlags & FWF_DESKTOP)
+ if (m_FolderSettings.fFlags & FWF_DESKTOP)
dwStyle |= LVS_ALIGNLEFT;
else
- dwStyle |= LVS_ALIGNTOP;
+ dwStyle |= LVS_ALIGNTOP | LVS_SHOWSELALWAYS;
- switch (FolderSettings.ViewMode)
+ switch (m_FolderSettings.ViewMode)
{
case FVM_ICON:
dwStyle |= LVS_ICON;
break;
}
- if (FolderSettings.fFlags & FWF_AUTOARRANGE)
+ if (m_FolderSettings.fFlags & FWF_AUTOARRANGE)
dwStyle |= LVS_AUTOARRANGE;
- if (FolderSettings.fFlags & FWF_DESKTOP)
- FolderSettings.fFlags |= FWF_NOCLIENTEDGE | FWF_NOSCROLL;
+ if (m_FolderSettings.fFlags & FWF_DESKTOP)
+ m_FolderSettings.fFlags |= FWF_NOCLIENTEDGE | FWF_NOSCROLL;
- if (FolderSettings.fFlags & FWF_SINGLESEL)
+ if (m_FolderSettings.fFlags & FWF_SINGLESEL)
dwStyle |= LVS_SINGLESEL;
- if (FolderSettings.fFlags & FWF_NOCLIENTEDGE)
+ if (m_FolderSettings.fFlags & FWF_NOCLIENTEDGE)
dwExStyle &= ~WS_EX_CLIENTEDGE;
- hWndList = CreateWindowExW( dwExStyle,
- WC_LISTVIEWW,
- NULL,
- dwStyle,
- 0, 0, 0, 0,
- m_hWnd,
- (HMENU)ID_LISTVIEW,
- shell32_hInstance,
- NULL);
-
- if (!hWndList)
+ RECT rcListView = {0,0,0,0};
+ m_ListView.Create(m_hWnd, rcListView, NULL,dwStyle, dwExStyle, ID_LISTVIEW);
+
+ if (!m_ListView)
return FALSE;
- ListViewSortInfo.bIsAscending = TRUE;
- ListViewSortInfo.nHeaderID = -1;
- ListViewSortInfo.nLastHeaderID = -1;
+ m_sortInfo.bIsAscending = TRUE;
+ m_sortInfo.nHeaderID = -1;
+ m_sortInfo.nLastHeaderID = -1;
UpdateListColors();
void CDefView::UpdateListColors()
{
- if (FolderSettings.fFlags & FWF_DESKTOP)
+ if (m_FolderSettings.fFlags & FWF_DESKTOP)
{
/* Check if drop shadows option is enabled */
BOOL bDropShadow = FALSE;
L"ListviewShadow", RRF_RT_DWORD, NULL, &bDropShadow, &cbDropShadow);
if (bDropShadow && SystemParametersInfoW(SPI_GETDESKWALLPAPER, _countof(wszBuf), wszBuf, 0) && wszBuf[0])
{
- SendMessageW(hWndList, LVM_SETTEXTBKCOLOR, 0, CLR_NONE);
- SendMessageW(hWndList, LVM_SETBKCOLOR, 0, CLR_NONE);
- SendMessageW(hWndList, LVM_SETTEXTCOLOR, 0, RGB(255, 255, 255));
- SendMessageW(hWndList, LVM_SETEXTENDEDLISTVIEWSTYLE, LVS_EX_TRANSPARENTSHADOWTEXT, LVS_EX_TRANSPARENTSHADOWTEXT);
+ m_ListView.SetTextBkColor(CLR_NONE);
+ m_ListView.SetBkColor(CLR_NONE);
+ m_ListView.SetTextColor(RGB(255, 255, 255));
+ m_ListView.SetExtendedListViewStyle(LVS_EX_TRANSPARENTSHADOWTEXT, LVS_EX_TRANSPARENTSHADOWTEXT);
}
else
{
COLORREF crDesktop = GetSysColor(COLOR_DESKTOP);
- SendMessageW(hWndList, LVM_SETTEXTBKCOLOR, 0, crDesktop);
- SendMessageW(hWndList, LVM_SETBKCOLOR, 0, crDesktop);
+ m_ListView.SetTextBkColor(crDesktop);
+ m_ListView.SetBkColor(crDesktop);
if (GetRValue(crDesktop) + GetGValue(crDesktop) + GetBValue(crDesktop) > 128 * 3)
- SendMessageW(hWndList, LVM_SETTEXTCOLOR, 0, RGB(0, 0, 0));
+ m_ListView.SetTextColor(RGB(0, 0, 0));
else
- SendMessageW(hWndList, LVM_SETTEXTCOLOR, 0, RGB(255, 255, 255));
- SendMessageW(hWndList, LVM_SETEXTENDEDLISTVIEWSTYLE, LVS_EX_TRANSPARENTSHADOWTEXT, 0);
+ m_ListView.SetTextColor(RGB(255, 255, 255));
+ m_ListView.SetExtendedListViewStyle(LVS_EX_TRANSPARENTSHADOWTEXT);
}
}
}
*/
BOOL CDefView::InitList()
{
- LVCOLUMNW lvColumn;
SHELLDETAILS sd;
WCHAR szTemp[50];
TRACE("%p\n", this);
- SendMessageW(hWndList, LVM_DELETEALLITEMS, 0, 0);
+ m_ListView.DeleteAllItems();
- lvColumn.mask = LVCF_FMT | LVCF_WIDTH | LVCF_TEXT;
- lvColumn.pszText = szTemp;
-
- if (pSF2Parent)
+ if (m_pSF2Parent)
{
for (int i = 0; 1; i++)
{
- if (FAILED(pSF2Parent->GetDetailsOf(NULL, i, &sd)))
+ if (FAILED(m_pSF2Parent->GetDetailsOf(NULL, i, &sd)))
break;
-
- lvColumn.fmt = sd.fmt;
- lvColumn.cx = sd.cxChar * 8; /* chars->pixel */
StrRetToStrNW( szTemp, 50, &sd.str, NULL);
- SendMessageW(hWndList, LVM_INSERTCOLUMNW, i, (LPARAM) &lvColumn);
+ m_ListView.InsertColumn(i, szTemp, sd.fmt, sd.cxChar * 8);
+
}
}
else
FIXME("no SF2\n");
}
- SendMessageW(hWndList, LVM_SETIMAGELIST, LVSIL_SMALL, (LPARAM)ShellSmallIconList);
- SendMessageW(hWndList, LVM_SETIMAGELIST, LVSIL_NORMAL, (LPARAM)ShellBigIconList);
+ m_ListView.SetImageList(ShellBigIconList, LVSIL_NORMAL);
+ m_ListView.SetImageList(ShellSmallIconList, LVSIL_SMALL);
return TRUE;
}
* the way this function works is only usable if we had only
* filesystemfolders (25/10/99 jsch)
*/
-INT CALLBACK CDefView::ListViewCompareItems(LPVOID lParam1, LPVOID lParam2, LPARAM lpData)
+INT CALLBACK CDefView::ListViewCompareItems(LPARAM lParam1, LPARAM lParam2, LPARAM lpData)
{
INT nDiff = 0;
FILETIME fd1, fd2;
*/
int CDefView::LV_FindItemByPidl(LPCITEMIDLIST pidl)
{
- LVITEMW lvItem;
- lvItem.iSubItem = 0;
- lvItem.mask = LVIF_PARAM;
+ int cItems = m_ListView.GetItemCount();
- for (lvItem.iItem = 0;
- SendMessageW(hWndList, LVM_GETITEMW, 0, (LPARAM) &lvItem);
- lvItem.iItem++)
+ for (int i = 0; i<cItems; i++)
{
- LPITEMIDLIST currentpidl = (LPITEMIDLIST) lvItem.lParam;
- HRESULT hr = pSFParent->CompareIDs(0, pidl, currentpidl);
+ LPITEMIDLIST currentpidl = reinterpret_cast<LPITEMIDLIST>(m_ListView.GetItemData(i));
+ HRESULT hr = m_pSFParent->CompareIDs(0, pidl, currentpidl);
if (SUCCEEDED(hr) && !HRESULT_CODE(hr))
{
- return lvItem.iItem;
+ return i;
}
}
return -1;
TRACE("(%p)(pidl=%p)\n", this, pidl);
lvItem.mask = LVIF_TEXT | LVIF_IMAGE | LVIF_PARAM; /*set the mask*/
- lvItem.iItem = ListView_GetItemCount(hWndList); /*add the item to the end of the list*/
+ lvItem.iItem = m_ListView.GetItemCount(); /*add the item to the end of the list*/
lvItem.iSubItem = 0;
- lvItem.lParam = (LPARAM) ILClone(ILFindLastID(pidl)); /*set the item's data*/
- lvItem.pszText = LPSTR_TEXTCALLBACKW; /*get text on a callback basis*/
- lvItem.iImage = I_IMAGECALLBACK; /*get the image on a callback basis*/
+ lvItem.lParam = (LPARAM) ILClone(ILFindLastID(pidl)); /*set the item's data*/
+ lvItem.pszText = LPSTR_TEXTCALLBACKW; /*get text on a callback basis*/
+ lvItem.iImage = I_IMAGECALLBACK; /*get the image on a callback basis*/
- if (SendMessageW(hWndList, LVM_INSERTITEMW, 0, (LPARAM)&lvItem) == -1)
+ if (m_ListView.InsertItem(&lvItem) == -1)
return FALSE;
else
return TRUE;
nIndex = LV_FindItemByPidl(ILFindLastID(pidl));
- return (-1 == ListView_DeleteItem(hWndList, nIndex)) ? FALSE : TRUE;
+ return (-1 == m_ListView.DeleteItem(nIndex)) ? FALSE : TRUE;
}
/**********************************************************
{
lvItem.mask = LVIF_PARAM; /* only the pidl */
lvItem.iItem = nItem;
- SendMessageW(hWndList, LVM_GETITEMW, 0, (LPARAM) &lvItem);
+ m_ListView.GetItem(&lvItem);
SHFree((LPITEMIDLIST)lvItem.lParam);
lvItem.mask = LVIF_PARAM|LVIF_IMAGE;
lvItem.iItem = nItem;
lvItem.lParam = (LPARAM) ILClone(ILFindLastID(pidlNew)); /* set the item's data */
- lvItem.iImage = SHMapPIDLToSystemImageListIndex(pSFParent, pidlNew, 0);
- SendMessageW(hWndList, LVM_SETITEMW, 0, (LPARAM) &lvItem);
- SendMessageW(hWndList, LVM_UPDATE, nItem, 0);
+ lvItem.iImage = SHMapPIDLToSystemImageListIndex(m_pSFParent, pidlNew, 0);
+ m_ListView.SetItem(&lvItem);
+ m_ListView.Update(nItem);
return TRUE; /* FIXME: better handling */
}
INT CALLBACK CDefView::fill_list( LPVOID ptr, LPVOID arg )
{
LPITEMIDLIST pidl = (LPITEMIDLIST)ptr;
- CDefView *pThis = (CDefView *)arg;
+ CDefView *pThis = static_cast<CDefView *>(arg);
/* in a commdlg This works as a filemask*/
if (pThis->IncludeObject(pidl) == S_OK)
pThis->LV_AddItem(pidl);
TRACE("%p\n", this);
/* get the itemlist from the shfolder*/
- hRes = pSFParent->EnumObjects(m_hWnd, SHCONTF_NONFOLDERS | SHCONTF_FOLDERS, &pEnumIDList);
+ hRes = m_pSFParent->EnumObjects(m_hWnd, SHCONTF_NONFOLDERS | SHCONTF_FOLDERS, &pEnumIDList);
if (hRes != S_OK)
{
if (hRes == S_FALSE)
}
/* sort the array */
- DPA_Sort(hdpa, CompareItems, (LPARAM)pSFParent.p);
+ DPA_Sort(hdpa, CompareItems, (LPARAM)m_pSFParent.p);
/*turn the listview's redrawing off*/
- SendMessageA(hWndList, WM_SETREDRAW, FALSE, 0);
+ m_ListView.SetRedraw(FALSE);
DPA_DestroyCallback( hdpa, fill_list, (void *)this);
/*turn the listview's redrawing back on and force it to draw*/
- SendMessageA(hWndList, WM_SETREDRAW, TRUE, 0);
+ m_ListView.SetRedraw(TRUE);
pEnumIDList->Release(); /* destroy the list*/
LRESULT CDefView::OnShowWindow(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled)
{
- ::UpdateWindow(hWndList);
+ m_ListView.UpdateWindow();
bHandled = FALSE;
return 0;
}
LRESULT CDefView::OnGetDlgCode(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled)
{
- return SendMessageW(hWndList, uMsg, 0, 0);
+ return m_ListView.SendMessageW(uMsg, 0, 0);
}
LRESULT CDefView::OnDestroy(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled)
{
+ if (m_hMenu)
+ DestroyMenu(m_hMenu);
RevokeDragDrop(m_hWnd);
- SHChangeNotifyDeregister(hNotify);
+ SHChangeNotifyDeregister(m_hNotify);
bHandled = FALSE;
return 0;
}
LRESULT CDefView::OnEraseBackground(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled)
{
- if (FolderSettings.fFlags & (FWF_DESKTOP | FWF_TRANSPARENT))
+ if (m_FolderSettings.fFlags & (FWF_DESKTOP | FWF_TRANSPARENT))
return SendMessageW(GetParent(), WM_ERASEBKGND, wParam, lParam); /* redirect to parent */
bHandled = FALSE;
UpdateListColors();
/* Forward WM_SYSCOLORCHANGE to common controls */
- return SendMessageW(hWndList, uMsg, 0, 0);
+ return m_ListView.SendMessageW(uMsg, 0, 0);
}
LRESULT CDefView::OnGetShellBrowser(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled)
{
- return (LRESULT)pShellBrowser.p;
+ return (LRESULT)m_pShellBrowser.p;
}
/**********************************************************
}
}
- if (SUCCEEDED(this->QueryInterface(IID_IDropTarget, (LPVOID*)&pdt)))
- RegisterDragDrop(m_hWnd, pdt);
+ if (SUCCEEDED(QueryInterface(IID_PPV_ARG(IDropTarget, &pdt))))
+ {
+ if (FAILED(RegisterDragDrop(m_hWnd, pdt)))
+ ERR("Registering Drag Drop Failed");
+ }
/* register for receiving notifications */
- pSFParent->QueryInterface(IID_IPersistFolder2, (LPVOID*)&ppf2);
+ m_pSFParent->QueryInterface(IID_PPV_ARG(IPersistFolder2, &ppf2));
if (ppf2)
{
ppf2->GetCurFolder((LPITEMIDLIST*)&ntreg.pidl);
ntreg.fRecursive = TRUE;
- hNotify = SHChangeNotifyRegister(m_hWnd, SHCNF_IDLIST, SHCNE_ALLEVENTS, SHV_CHANGE_NOTIFY, 1, &ntreg);
+ m_hNotify = SHChangeNotifyRegister(m_hWnd, SHCNF_IDLIST, SHCNE_ALLEVENTS, SHV_CHANGE_NOTIFY, 1, &ntreg);
SHFree((LPITEMIDLIST)ntreg.pidl);
}
- hAccel = LoadAcceleratorsA(shell32_hInstance, "shv_accel");
+ m_hAccel = LoadAcceleratorsW(shell32_hInstance, MAKEINTRESOURCEW(IDA_SHELLVIEW));
return S_OK;
}
* #### Handling of the menus ####
*/
-/**********************************************************
-* ShellView_BuildFileMenu()
-*/
HMENU CDefView::BuildFileMenu()
-{ WCHAR szText[MAX_PATH];
- MENUITEMINFOW mii;
- int nTools, i;
- HMENU hSubMenu;
+{
+ HRESULT hr;
+ CComPtr<IContextMenu> cm;
- TRACE("(%p)\n", this);
+ GetSelections();
- hSubMenu = CreatePopupMenu();
- if (hSubMenu)
- {
- /*get the number of items in our global array*/
- for(nTools = 0; Tools[nTools].idCommand != -1; nTools++) {}
+ LPCITEMIDLIST * apidl = (LPCITEMIDLIST *)m_apidl;
- /*add the menu items*/
- for(i = 0; i < nTools; i++)
- {
- LoadStringW(shell32_hInstance, Tools[i].idMenuString, szText, MAX_PATH);
+ hr = m_pSFParent->GetUIObjectOf(m_hWnd, m_cidl, apidl, IID_NULL_PPV_ARG(IContextMenu, &cm));
+ if (FAILED(hr))
+ return NULL;
- ZeroMemory(&mii, sizeof(mii));
- mii.cbSize = sizeof(mii);
- mii.fMask = MIIM_TYPE | MIIM_ID | MIIM_STATE;
+ HMENU hmenu = CreatePopupMenu();
- if(BTNS_SEP != Tools[i].bStyle) /* no separator*/
- {
- mii.fType = MFT_STRING;
- mii.fState = MFS_ENABLED;
- mii.dwTypeData = szText;
- mii.wID = Tools[i].idCommand;
- }
- else
- {
- mii.fType = MFT_SEPARATOR;
- }
- /* tack This item onto the end of the menu */
- InsertMenuItemW(hSubMenu, (UINT) - 1, TRUE, &mii);
- }
- }
+ //FIXME: get proper numbers ?
+ const UINT first = 0x7800;
+ const UINT last = 0x7A00;
+ hr = cm->QueryContextMenu(hmenu, 0, first, last, 0);
+ if (FAILED(hr))
+ return NULL;
- TRACE("-- return (menu=%p)\n", hSubMenu);
- return hSubMenu;
+ // TODO: filter or something
+
+ return hmenu;
}
-/**********************************************************
-* ShellView_MergeFileMenu()
-*/
-void CDefView::MergeFileMenu(HMENU hSubMenu)
+void CDefView::PrepareShowFileMenu(HMENU hSubMenu)
{
TRACE("(%p)->(submenu=%p) stub\n", this, hSubMenu);
- if (hSubMenu)
- { /*insert This item at the beginning of the menu */
- _InsertMenuItemW(hSubMenu, 0, TRUE, 0, MFT_SEPARATOR, NULL, MFS_ENABLED);
- _InsertMenuItemW(hSubMenu, 0, TRUE, IDM_MYFILEITEM, MFT_STRING, L"dummy45", MFS_ENABLED);
+ if (!hSubMenu)
+ return;
+
+ /* Cleanup the items added previously */
+ for (int i = 0; i < GetMenuItemCount(hSubMenu); )
+ {
+ MENUITEMINFOW mii;
+ mii.cbSize = sizeof(mii);
+ mii.fMask = MIIM_ID;
+ GetMenuItemInfoW(hSubMenu, i, TRUE, &mii);
+
+ if (mii.wID < 0x8000)
+ {
+ DeleteMenu(hSubMenu, i, MF_BYPOSITION);
+ }
+ else
+ {
+ i++;
+ }
}
+ /* Insert This item at the beginning of the menu. */
+ _InsertMenuItemW(hSubMenu, 0, TRUE, 0, MFT_SEPARATOR, NULL, MFS_ENABLED);
+ _InsertMenuItemW(hSubMenu, 0, TRUE, IDM_MYFILEITEM + 4, MFT_STRING, L"Properties", MFS_DISABLED);
+ _InsertMenuItemW(hSubMenu, 0, TRUE, IDM_MYFILEITEM + 3, MFT_STRING, L"Rename", MFS_DISABLED);
+ _InsertMenuItemW(hSubMenu, 0, TRUE, IDM_MYFILEITEM + 2, MFT_STRING, L"Delete", MFS_DISABLED);
+ _InsertMenuItemW(hSubMenu, 0, TRUE, IDM_MYFILEITEM + 1, MFT_STRING, L"Create Shortcut", MFS_DISABLED);
+ _InsertMenuItemW(hSubMenu, 0, TRUE, 0, MFT_SEPARATOR, NULL, MFS_ENABLED);
+ _InsertMenuItemW(hSubMenu, 0, TRUE, IDM_MYFILEITEM, MFT_STRING, L"New", MFS_ENABLED);
+
+ HMENU menubase = BuildFileMenu();
+ if (menubase)
+ {
+ int count = ::GetMenuItemCount(menubase);
+
+ for (int i = 0; i < count; i++)
+ {
+ WCHAR label[128];
+
+ MENUITEMINFOW mii = { 0 };
+ mii.cbSize = sizeof(mii);
+ mii.fMask = MIIM_STATE | MIIM_ID | MIIM_SUBMENU | MIIM_CHECKMARKS | MIIM_DATA | MIIM_STRING | MIIM_BITMAP | MIIM_FTYPE;
+ mii.dwTypeData = label;
+ mii.cch = _countof(label);
+ ::GetMenuItemInfoW(menubase, i, TRUE, &mii);
+
+ TRACE("Adding item %d label %S type %d\n", mii.wID, mii.dwTypeData, mii.fType);
+
+ mii.fType |= MFT_RADIOCHECK;
+
+ ::InsertMenuItemW(hSubMenu, IDM_MYFILEITEM, FALSE, &mii);
+ }
+
+ _InsertMenuItemW(hSubMenu, IDM_MYFILEITEM, FALSE, 0, MFT_SEPARATOR, NULL, MFS_ENABLED);
+
+ ::DestroyMenu(menubase);
+ }
TRACE("--\n");
}
-/**********************************************************
-* ShellView_MergeViewMenu()
-*/
-void CDefView::MergeViewMenu(HMENU hSubMenu)
+void CDefView::PrepareShowViewMenu(HMENU hSubMenu)
{
TRACE("(%p)->(submenu=%p)\n", this, hSubMenu);
- if (hSubMenu)
- {
- /*add a separator at the correct position in the menu*/
- MENUITEMINFOW mii;
- static WCHAR view[] = L"View";
-
- _InsertMenuItemW(hSubMenu, FCIDM_MENU_VIEW_SEP_OPTIONS, FALSE, 0, MFT_SEPARATOR, NULL, MFS_ENABLED);
+ if (!hSubMenu)
+ return;
- ZeroMemory(&mii, sizeof(mii));
- mii.cbSize = sizeof(mii);
- mii.fMask = MIIM_SUBMENU | MIIM_TYPE | MIIM_DATA;
- mii.fType = MFT_STRING;
- mii.dwTypeData = view;
- mii.hSubMenu = LoadMenuW(shell32_hInstance, L"MENU_001");
- InsertMenuItemW(hSubMenu, FCIDM_MENU_VIEW_SEP_OPTIONS, FALSE, &mii);
+ if (m_FolderSettings.ViewMode >= FVM_FIRST && m_FolderSettings.ViewMode <= FVM_LAST)
+ {
+ UINT iItemFirst = FCIDM_SHVIEW_BIGICON;
+ UINT iItemLast = iItemFirst + FVM_LAST - FVM_FIRST;
+ UINT iItem = iItemFirst + m_FolderSettings.ViewMode - FVM_FIRST;
+ CheckMenuRadioItem(hSubMenu, iItemFirst, iItemLast, iItem, MF_BYCOMMAND);
}
}
/**********************************************************
* ShellView_GetSelections()
*
-* - fills the this->apidl list with the selected objects
+* - fills the m_apidl list with the selected objects
*
* RETURNS
* number of selected items
*/
UINT CDefView::GetSelections()
{
- LVITEMW lvItem;
- UINT i = 0;
-
- SHFree(apidl);
+ SHFree(m_apidl);
- cidl = ListView_GetSelectedCount(hWndList);
- apidl = (LPITEMIDLIST*)SHAlloc(cidl * sizeof(LPITEMIDLIST));
-
- TRACE("selected=%i\n", cidl);
-
- if (apidl)
+ m_cidl = m_ListView.GetSelectedCount();
+ m_apidl = (LPITEMIDLIST*)SHAlloc(m_cidl * sizeof(LPITEMIDLIST));
+ if (!m_apidl)
{
- TRACE("-- Items selected =%u\n", cidl);
+ m_cidl = 0;
+ return 0;
+ }
- lvItem.mask = LVIF_STATE | LVIF_PARAM;
- lvItem.stateMask = LVIS_SELECTED;
- lvItem.iItem = 0;
- lvItem.iSubItem = 0;
- lvItem.state = 0;
+ TRACE("-- Items selected =%u\n", m_cidl);
- while(SendMessageW(hWndList, LVM_GETITEMW, 0, (LPARAM)&lvItem) && (i < cidl))
- {
- if(lvItem.state & LVIS_SELECTED)
- {
- apidl[i] = (LPITEMIDLIST)lvItem.lParam;
- i++;
- if (i == cidl)
- break;
- TRACE("-- selected Item found\n");
- }
- lvItem.iItem++;
- }
+ UINT i = 0;
+ int lvIndex = -1;
+ while ((lvIndex = m_ListView.GetNextItem(lvIndex, LVNI_SELECTED)) > -1)
+ {
+ m_apidl[i] = (LPITEMIDLIST)m_ListView.GetItemData(lvIndex);
+ i++;
+ if (i == m_cidl)
+ break;
+ TRACE("-- selected Item found\n");
}
- return cidl;
+ return m_cidl;
}
/**********************************************************
*/
HRESULT CDefView::OpenSelectedItems()
{
- static UINT CF_IDLIST = 0;
- HRESULT hr;
- CComPtr<IDataObject> selection;
- CComPtr<IContextMenu> cm;
- HMENU hmenu;
- FORMATETC fetc;
- STGMEDIUM stgm;
- LPIDA pIDList;
- LPCITEMIDLIST parent_pidl;
- WCHAR parent_path[MAX_PATH];
- LPCWSTR parent_dir = NULL;
- SFGAOF attribs;
- int i;
- CMINVOKECOMMANDINFOEX ici;
- MENUITEMINFOW info;
+ HMENU hMenu;
+ CMINVOKECOMMANDINFO cmi;
+ UINT uCommand;
+ HRESULT hResult;
- if (0 == GetSelections())
- {
+ m_cidl = m_ListView.GetSelectedCount();
+ if (m_cidl == 0)
return S_OK;
- }
-
- hr = pSFParent->GetUIObjectOf(m_hWnd, cidl,
- (LPCITEMIDLIST*)apidl, IID_IContextMenu,
- 0, (LPVOID *)&cm);
-
- if (SUCCEEDED(hr))
- {
- hmenu = CreatePopupMenu();
- if (hmenu)
- {
- hr = IUnknown_SetSite(cm, (IShellView *)this);
- if (SUCCEEDED(cm->QueryContextMenu(hmenu, 0, 0x20, 0x7fff, CMF_DEFAULTONLY)))
- {
- INT def = -1, n = GetMenuItemCount(hmenu);
-
- for ( i = 0; i < n; i++ )
- {
- memset( &info, 0, sizeof info );
- info.cbSize = sizeof info;
- info.fMask = MIIM_FTYPE | MIIM_STATE | MIIM_ID;
- if (GetMenuItemInfoW( hmenu, i, TRUE, &info))
- {
- if (info.fState & MFS_DEFAULT)
- {
- def = info.wID;
- break;
- }
- }
- }
- if (def != -1)
- {
- memset( &ici, 0, sizeof ici );
- ici.cbSize = sizeof ici;
- ici.lpVerb = MAKEINTRESOURCEA( def );
- ici.hwnd = m_hWnd;
-
- hr = cm->InvokeCommand((LPCMINVOKECOMMANDINFO)&ici);
- if (hr == S_OK)
- {
- DestroyMenu(hmenu);
- hr = IUnknown_SetSite(cm, NULL);
- return S_OK;
- }
- else
- ERR("InvokeCommand failed: %x\n", hr);
- }
- else
- ERR("No default context menu item\n");
-
- }
- DestroyMenu( hmenu );
- hr = IUnknown_SetSite(cm, NULL);
- }
- }
-
+ hResult = OnDefaultCommand();
+ if (hResult == S_OK)
+ return hResult;
- hr = pSFParent->GetUIObjectOf(m_hWnd, cidl,
- (LPCITEMIDLIST*)apidl, IID_IDataObject,
- 0, (LPVOID *)&selection);
+ hMenu = CreatePopupMenu();
+ if (!hMenu)
+ return E_FAIL;
+ hResult = GetItemObject( SVGIO_SELECTION, IID_PPV_ARG(IContextMenu, &m_pCM));
+ if (FAILED(hResult))
+ goto cleanup;
+ hResult = IUnknown_SetSite(m_pCM, (IShellView *)this);
+ //if (FAILED( hResult))
+ // goto cleanup;
- if (FAILED(hr))
- return hr;
+ hResult = m_pCM->QueryContextMenu(hMenu, 0, 0x20, 0x7fff, CMF_DEFAULTONLY);
+ if (FAILED(hResult))
+ goto cleanup;
- if (0 == CF_IDLIST)
+ uCommand = GetMenuDefaultItem(hMenu, FALSE, 0);
+ if (uCommand == (UINT)-1)
{
- CF_IDLIST = RegisterClipboardFormatW(CFSTR_SHELLIDLIST);
+ hResult = E_FAIL;
+ goto cleanup;
}
- fetc.cfFormat = CF_IDLIST;
- fetc.ptd = NULL;
- fetc.dwAspect = DVASPECT_CONTENT;
- fetc.lindex = -1;
- fetc.tymed = TYMED_HGLOBAL;
-
- hr = selection->QueryGetData(&fetc);
- if (FAILED(hr))
- return hr;
-
- hr = selection->GetData(&fetc, &stgm);
- if (FAILED(hr))
- return hr;
+ ZeroMemory(&cmi, sizeof(cmi));
+ cmi.cbSize = sizeof(cmi);
+ cmi.lpVerb = (LPCSTR)MAKEINTRESOURCEA(uCommand);
+ cmi.hwnd = m_hWnd;
- pIDList = (LPIDA)GlobalLock(stgm.hGlobal);
+ hResult = m_pCM->InvokeCommand(&cmi);
- parent_pidl = (LPCITEMIDLIST) ((LPBYTE)pIDList + pIDList->aoffset[0]);
- hr = pSFParent->GetAttributesOf(1, &parent_pidl, &attribs);
- if (SUCCEEDED(hr) && (attribs & SFGAO_FILESYSTEM) &&
- SHGetPathFromIDListW(parent_pidl, parent_path))
- {
- parent_dir = parent_path;
- }
+cleanup:
+
+ if (hMenu)
+ DestroyMenu(hMenu);
- for (i = pIDList->cidl; i > 0; --i)
+ if (m_pCM)
{
- LPCITEMIDLIST pidl;
-
- pidl = (LPCITEMIDLIST)((LPBYTE)pIDList + pIDList->aoffset[i]);
-
- attribs = SFGAO_FOLDER;
- hr = pSFParent->GetAttributesOf(1, &pidl, &attribs);
-
- if (SUCCEEDED(hr) && ! (attribs & SFGAO_FOLDER))
- {
- SHELLEXECUTEINFOW shexinfo;
-
- shexinfo.cbSize = sizeof(SHELLEXECUTEINFOW);
- shexinfo.fMask = SEE_MASK_INVOKEIDLIST; /* SEE_MASK_IDLIST is also possible. */
- shexinfo.hwnd = NULL;
- shexinfo.lpVerb = NULL;
- shexinfo.lpFile = NULL;
- shexinfo.lpParameters = NULL;
- shexinfo.lpDirectory = parent_dir;
- shexinfo.nShow = SW_NORMAL;
- shexinfo.lpIDList = ILCombine(parent_pidl, pidl);
-
- ShellExecuteExW(&shexinfo); /* Discard error/success info */
-
- ILFree((LPITEMIDLIST)shexinfo.lpIDList);
- }
+ IUnknown_SetSite(m_pCM, NULL);
+ m_pCM.Release();
}
- GlobalUnlock(stgm.hGlobal);
- ReleaseStgMedium(&stgm);
-
- return S_OK;
+ return hResult;
}
/**********************************************************
WORD x;
WORD y;
UINT uCommand;
- DWORD wFlags;
HMENU hMenu;
- BOOL fExplore;
- HWND hwndTree;
CMINVOKECOMMANDINFO cmi;
HRESULT hResult;
// for some reason I haven't figured out, we sometimes recurse into this method
- if (pCM != NULL)
+ if (m_pCM != NULL)
return 0;
x = LOWORD(lParam);
TRACE("(%p)->(0x%08x 0x%08x) stub\n", this, x, y);
- fExplore = FALSE;
- hwndTree = NULL;
-
- /* look, what's selected and create a context menu object of it*/
- if (GetSelections())
- {
- pSFParent->GetUIObjectOf(hWndParent, cidl, (LPCITEMIDLIST*)apidl, IID_IContextMenu, NULL, (LPVOID *)&pCM);
+ hMenu = CreatePopupMenu();
+ if (!hMenu)
+ return E_FAIL;
- if (pCM)
- {
- TRACE("-- pContextMenu\n");
- hMenu = CreatePopupMenu();
+ m_cidl = m_ListView.GetSelectedCount();
- if (hMenu)
- {
- hResult = IUnknown_SetSite(pCM, (IShellView *)this);
+ hResult = GetItemObject( m_cidl ? SVGIO_SELECTION : SVGIO_BACKGROUND, IID_PPV_ARG(IContextMenu, &m_pCM));
+ if (FAILED( hResult))
+ goto cleanup;
- /* See if we are in Explore or Open mode. If the browser's tree is present, we are in Explore mode.*/
- if (SUCCEEDED(pShellBrowser->GetControlWindow(FCW_TREE, &hwndTree)) && hwndTree)
- {
- TRACE("-- explore mode\n");
- fExplore = TRUE;
- }
+ hResult = IUnknown_SetSite(m_pCM, (IShellView *)this);
+ //if (FAILED( hResult))
+ // goto cleanup;
- /* build the flags depending on what we can do with the selected item */
- wFlags = CMF_NORMAL | (cidl != 1 ? 0 : CMF_CANRENAME) | (fExplore ? CMF_EXPLORE : 0);
+ hResult = m_pCM->QueryContextMenu(hMenu, 0, FCIDM_SHVIEWFIRST, FCIDM_SHVIEWLAST, CMF_NORMAL);
+ if (FAILED( hResult))
+ goto cleanup;
- /* let the ContextMenu merge its items in */
- if (SUCCEEDED(pCM->QueryContextMenu(hMenu, 0, FCIDM_SHVIEWFIRST, FCIDM_SHVIEWLAST, wFlags )))
- {
- if (FolderSettings.fFlags & FWF_DESKTOP)
- SetMenuDefaultItem(hMenu, FCIDM_SHVIEW_OPEN, MF_BYCOMMAND);
+ if (m_FolderSettings.fFlags & FWF_DESKTOP)
+ SetMenuDefaultItem(hMenu, FCIDM_SHVIEW_OPEN, MF_BYCOMMAND);
- TRACE("-- track popup\n");
- uCommand = TrackPopupMenu(hMenu,
- TPM_LEFTALIGN | TPM_RETURNCMD | TPM_LEFTBUTTON | TPM_RIGHTBUTTON,
- x, y, 0, m_hWnd, NULL);
+ uCommand = TrackPopupMenu(hMenu,
+ TPM_LEFTALIGN | TPM_RETURNCMD | TPM_LEFTBUTTON | TPM_RIGHTBUTTON,
+ x, y, 0, m_hWnd, NULL);
+ if (uCommand == 0)
+ goto cleanup;
- if (uCommand > 0)
- {
- TRACE("-- uCommand=%u\n", uCommand);
+ if (uCommand == FCIDM_SHVIEW_OPEN && OnDefaultCommand() == S_OK)
+ goto cleanup;
- if (uCommand == FCIDM_SHVIEW_OPEN && pCommDlgBrowser.p != NULL)
- {
- TRACE("-- dlg: OnDefaultCommand\n");
- if (OnDefaultCommand() != S_OK)
- OpenSelectedItems();
- }
- else
- {
- TRACE("-- explore -- invoke command\n");
- ZeroMemory(&cmi, sizeof(cmi));
- cmi.cbSize = sizeof(cmi);
- cmi.hwnd = hWndParent; /* this window has to answer CWM_GETISHELLBROWSER */
- cmi.lpVerb = (LPCSTR)MAKEINTRESOURCEA(uCommand);
- pCM->InvokeCommand(&cmi);
- }
- }
+ ZeroMemory(&cmi, sizeof(cmi));
+ cmi.cbSize = sizeof(cmi);
+ cmi.lpVerb = (LPCSTR)MAKEINTRESOURCEA(uCommand);
+ cmi.hwnd = m_hWnd;
+ m_pCM->InvokeCommand(&cmi);
- hResult = IUnknown_SetSite(pCM, NULL);
- DestroyMenu(hMenu);
- }
- }
- pCM.Release();
- }
- }
- else /* background context menu */
+cleanup:
+
+ if (m_pCM)
{
- hMenu = CreatePopupMenu();
-
- CDefFolderMenu_Create2(NULL, NULL, cidl, (LPCITEMIDLIST*)apidl, pSFParent, NULL, 0, NULL, (IContextMenu**)&pCM);
- pCM->QueryContextMenu(hMenu, 0, FCIDM_SHVIEWFIRST, FCIDM_SHVIEWLAST, 0);
+ IUnknown_SetSite(m_pCM, NULL);
+ m_pCM.Release();
+ }
- uCommand = TrackPopupMenu(hMenu,
- TPM_LEFTALIGN | TPM_RETURNCMD | TPM_LEFTBUTTON | TPM_RIGHTBUTTON,
- x, y, 0, m_hWnd, NULL);
+ if (hMenu)
DestroyMenu(hMenu);
- TRACE("-- (%p)->(uCommand=0x%08x )\n", this, uCommand);
+ return 0;
+}
+
+LRESULT CDefView::OnExplorerCommand(UINT uCommand, BOOL bUseSelection)
+{
+ HRESULT hResult;
+ CMINVOKECOMMANDINFO cmi;
+ HMENU hMenu;
+
+ hMenu = CreatePopupMenu();
+ if (!hMenu)
+ return 0;
+
+ hResult = GetItemObject( bUseSelection ? SVGIO_SELECTION : SVGIO_BACKGROUND, IID_PPV_ARG(IContextMenu, &m_pCM));
+ if (FAILED( hResult))
+ goto cleanup;
- ZeroMemory(&cmi, sizeof(cmi));
- cmi.cbSize = sizeof(cmi);
- cmi.lpVerb = (LPCSTR)MAKEINTRESOURCEA(uCommand);
- cmi.hwnd = hWndParent;
- pCM->InvokeCommand(&cmi);
+ hResult = IUnknown_SetSite(m_pCM, (IShellView *)this);
+ //if (FAILED( hResult))
+ // goto cleanup;
- pCM.Release();
+ hResult = m_pCM->QueryContextMenu(hMenu, 0, FCIDM_SHVIEWFIRST, FCIDM_SHVIEWLAST, CMF_NORMAL);
+ if (FAILED( hResult))
+ goto cleanup;
+
+ ZeroMemory(&cmi, sizeof(cmi));
+ cmi.cbSize = sizeof(cmi);
+ cmi.lpVerb = (LPCSTR)MAKEINTRESOURCEA(uCommand);
+ cmi.hwnd = m_hWnd;
+ m_pCM->InvokeCommand(&cmi);
+
+cleanup:
+
+ if (m_pCM)
+ {
+ IUnknown_SetSite(m_pCM, NULL);
+ m_pCM.Release();
}
+ if (hMenu)
+ DestroyMenu(hMenu);
+
return 0;
}
TRACE("%p width=%u height=%u\n", this, wWidth, wHeight);
/*resize the ListView to fit our window*/
- if (hWndList)
+ if (m_ListView)
{
- ::MoveWindow(hWndList, 0, 0, wWidth, wHeight, TRUE);
+ ::MoveWindow(m_ListView, 0, 0, wWidth, wHeight, TRUE);
}
return 0;
{
TRACE("%p\n", this);
- if (uState != SVUIA_DEACTIVATE)
+ if (m_uState != SVUIA_DEACTIVATE)
{
- if (hMenu)
- {
- pShellBrowser->SetMenuSB(0, 0, 0);
- pShellBrowser->RemoveMenusSB(hMenu);
- DestroyMenu(hMenu);
- hMenu = 0;
- }
+ // TODO: cleanup menu after deactivation
- uState = SVUIA_DEACTIVATE;
+ m_uState = SVUIA_DEACTIVATE;
}
}
void CDefView::DoActivate(UINT uState)
{
- OLEMENUGROUPWIDTHS omw = { {0, 0, 0, 0, 0, 0} };
- MENUITEMINFOA mii;
- CHAR szText[MAX_PATH];
-
TRACE("%p uState=%x\n", this, uState);
/*don't do anything if the state isn't really changing */
- if (this->uState == uState)
+ if (m_uState == uState)
{
return;
}
- OnDeactivate();
-
- /*only do This if we are active */
- if(uState != SVUIA_DEACTIVATE)
+ if (uState == SVUIA_DEACTIVATE)
{
- /*merge the menus */
- hMenu = CreateMenu();
-
- if(hMenu)
+ OnDeactivate();
+ }
+ else
+ {
+ if(m_hMenu)
{
- pShellBrowser->InsertMenusSB(hMenu, &omw);
- TRACE("-- after fnInsertMenusSB\n");
+ if (!m_menusLoaded)
+ {
+ MENUITEMINFOW mii = { 0 };
- /*build the top level menu get the menu item's text*/
- strcpy(szText, "dummy 31");
+ /* initialize EDIT menu */
+ mii.cbSize = sizeof(mii);
+ mii.fMask = MIIM_SUBMENU;
+ if (::GetMenuItemInfoW(m_hMenu, FCIDM_MENU_EDIT, FALSE, &mii))
+ {
+ HMENU hSubMenu = mii.hSubMenu;
- ZeroMemory(&mii, sizeof(mii));
- mii.cbSize = sizeof(mii);
- mii.fMask = MIIM_SUBMENU | MIIM_TYPE | MIIM_STATE;
- mii.fType = MFT_STRING;
- mii.fState = MFS_ENABLED;
- mii.dwTypeData = szText;
- mii.hSubMenu = BuildFileMenu();
-
- /*insert our menu into the menu bar*/
- if (mii.hSubMenu)
- {
- InsertMenuItemA(hMenu, FCIDM_MENU_HELP, FALSE, &mii);
- }
+ HMENU menubase = ::LoadMenuW(shell32_hInstance, L"MENU_003");
- /*get the view menu so we can merge with it*/
- ZeroMemory(&mii, sizeof(mii));
- mii.cbSize = sizeof(mii);
- mii.fMask = MIIM_SUBMENU;
+ int count = ::GetMenuItemCount(menubase);
+ for (int i = 0; i < count; i++)
+ {
+ WCHAR label[128];
- if (GetMenuItemInfoA(hMenu, FCIDM_MENU_VIEW, FALSE, &mii))
- {
- MergeViewMenu(mii.hSubMenu);
- }
+ ZeroMemory(&mii, sizeof(mii));
+ mii.cbSize = sizeof(mii);
+ mii.fMask = MIIM_STATE | MIIM_ID | MIIM_SUBMENU | MIIM_CHECKMARKS | MIIM_DATA | MIIM_STRING | MIIM_BITMAP | MIIM_FTYPE;
+ mii.dwTypeData = label;
+ mii.cch = _countof(label);
+ ::GetMenuItemInfoW(menubase, i, TRUE, &mii);
+
+ TRACE("Adding item %d label %S type %d\n", mii.wID, mii.dwTypeData, mii.fType);
+
+ mii.fType |= MFT_RADIOCHECK;
+
+ ::InsertMenuItemW(hSubMenu, FCIDM_MENU_VIEW_SEP_OPTIONS, FALSE, &mii);
+ }
+
+ ::DestroyMenu(menubase);
+ }
+
+ /* initialize VIEW menu */
- /*add the items that should only be added if we have the focus*/
- if (SVUIA_ACTIVATE_FOCUS == uState)
- {
- /*get the file menu so we can merge with it */
- ZeroMemory(&mii, sizeof(mii));
mii.cbSize = sizeof(mii);
mii.fMask = MIIM_SUBMENU;
-
- if (GetMenuItemInfoA(hMenu, FCIDM_MENU_FILE, FALSE, &mii))
+ if (::GetMenuItemInfoW(m_hMenu, FCIDM_MENU_VIEW, FALSE, &mii))
{
- MergeFileMenu(mii.hSubMenu);
+ HMENU menubase = ::LoadMenuW(shell32_hInstance, L"MENU_001");
+
+ HMENU hSubMenu = mii.hSubMenu;
+
+ m_hView = CreatePopupMenu();
+
+ _InsertMenuItemW(hSubMenu, FCIDM_MENU_VIEW_SEP_OPTIONS, FALSE, 0, MFT_SEPARATOR, NULL, MFS_ENABLED);
+
+ int count = ::GetMenuItemCount(menubase);
+ for (int i = 0; i < count; i++)
+ {
+ WCHAR label[128];
+
+ ZeroMemory(&mii, sizeof(mii));
+ mii.cbSize = sizeof(mii);
+ mii.fMask = MIIM_STATE | MIIM_ID | MIIM_SUBMENU | MIIM_CHECKMARKS | MIIM_DATA | MIIM_STRING | MIIM_BITMAP | MIIM_FTYPE;
+ mii.dwTypeData = label;
+ mii.cch = _countof(label);
+ ::GetMenuItemInfoW(menubase, i, TRUE, &mii);
+
+ ::AppendMenuW(m_hView, mii.fType, mii.wID, mii.dwTypeData);
+
+ TRACE("Adding item %d label %S type %d\n", mii.wID, mii.dwTypeData, mii.fType);
+
+ mii.fType |= MFT_RADIOCHECK;
+
+ ::InsertMenuItemW(hSubMenu, FCIDM_MENU_VIEW_SEP_OPTIONS, FALSE, &mii);
+ }
+
+ ::DestroyMenu(menubase);
}
+
+
+ TRACE("-- before fnSetMenuSB\n");
+ m_pShellBrowser->SetMenuSB(m_hMenu, 0, m_hWnd);
+
+ m_menusLoaded = TRUE;
}
+ }
- TRACE("-- before fnSetMenuSB\n");
- pShellBrowser->SetMenuSB(hMenu, 0, m_hWnd);
+ if (SVUIA_ACTIVATE_FOCUS == uState)
+ {
+ m_ListView.SetFocus();
}
}
- this->uState = uState;
+
+ m_uState = uState;
TRACE("--\n");
}
should always be done before merging menus (OnActivate merges the
menus) if one of our windows has the focus.*/
- pShellBrowser->OnViewWindowActive((IShellView *)this);
+ m_pShellBrowser->OnViewWindowActive((IShellView *)this);
DoActivate(SVUIA_ACTIVATE_FOCUS);
/* Set the focus to the listview */
- ::SetFocus(hWndList);
+ m_ListView.SetFocus();
/* Notify the ICommDlgBrowser interface */
OnStateChange(CDBOSC_SETFOCUS);
switch (dwCmdID)
{
case FCIDM_SHVIEW_SMALLICON:
- FolderSettings.ViewMode = FVM_SMALLICON;
+ m_FolderSettings.ViewMode = FVM_SMALLICON;
SetStyle (LVS_SMALLICON, LVS_TYPEMASK);
CheckToolbar();
break;
case FCIDM_SHVIEW_BIGICON:
- FolderSettings.ViewMode = FVM_ICON;
+ m_FolderSettings.ViewMode = FVM_ICON;
SetStyle (LVS_ICON, LVS_TYPEMASK);
CheckToolbar();
break;
case FCIDM_SHVIEW_LISTVIEW:
- FolderSettings.ViewMode = FVM_LIST;
+ m_FolderSettings.ViewMode = FVM_LIST;
SetStyle (LVS_LIST, LVS_TYPEMASK);
CheckToolbar();
break;
case FCIDM_SHVIEW_REPORTVIEW:
- FolderSettings.ViewMode = FVM_DETAILS;
+ m_FolderSettings.ViewMode = FVM_DETAILS;
SetStyle (LVS_REPORT, LVS_TYPEMASK);
CheckToolbar();
break;
case 0x31:
case 0x32:
case 0x33:
- ListViewSortInfo.nHeaderID = (LPARAM) (dwCmdID - 0x30);
- ListViewSortInfo.bIsAscending = TRUE;
- ListViewSortInfo.nLastHeaderID = ListViewSortInfo.nHeaderID;
- SendMessageA(hWndList, LVM_SORTITEMS, (WPARAM) &ListViewSortInfo, (LPARAM)ListViewCompareItems);
+ m_sortInfo.nHeaderID = (LPARAM) (dwCmdID - 0x30);
+ m_sortInfo.bIsAscending = TRUE;
+ m_sortInfo.nLastHeaderID = m_sortInfo.nHeaderID;
+ m_ListView.SortItems(ListViewCompareItems, &m_sortInfo);
+ break;
+
+ case FCIDM_SHVIEW_REFRESH:
+ Refresh();
break;
+ case FCIDM_SHVIEW_DELETE:
+ case FCIDM_SHVIEW_CUT:
+ case FCIDM_SHVIEW_COPY:
+ case FCIDM_SHVIEW_RENAME:
+ return OnExplorerCommand(dwCmdID, TRUE);
+
+ case FCIDM_SHVIEW_INSERT:
+ case FCIDM_SHVIEW_UNDO:
+ case FCIDM_SHVIEW_INSERTLINK:
+ case FCIDM_SHVIEW_NEWFOLDER:
+ return OnExplorerCommand(dwCmdID, FALSE);
default:
TRACE("-- COMMAND 0x%04x unhandled\n", dwCmdID);
}
case NM_DBLCLK:
TRACE("-- NM_DBLCLK %p\n", this);
- if (OnDefaultCommand() != S_OK) OpenSelectedItems();
+ OpenSelectedItems();
break;
case NM_RETURN:
TRACE("-- NM_RETURN %p\n", this);
- if (OnDefaultCommand() != S_OK) OpenSelectedItems();
+ OpenSelectedItems();
break;
case HDN_ENDTRACKW:
TRACE("-- HDN_ENDTRACKW %p\n", this);
- /*nColumn1 = ListView_GetColumnWidth(hWndList, 0);
- nColumn2 = ListView_GetColumnWidth(hWndList, 1);*/
+ /*nColumn1 = m_ListView.GetColumnWidth(0);
+ nColumn2 = m_ListView.GetColumnWidth(1);*/
break;
case LVN_DELETEITEM:
break;
case LVN_COLUMNCLICK:
- ListViewSortInfo.nHeaderID = lpnmlv->iSubItem;
- if (ListViewSortInfo.nLastHeaderID == ListViewSortInfo.nHeaderID)
- {
- ListViewSortInfo.bIsAscending = !ListViewSortInfo.bIsAscending;
- }
+ m_sortInfo.nHeaderID = lpnmlv->iSubItem;
+ if (m_sortInfo.nLastHeaderID == m_sortInfo.nHeaderID)
+ m_sortInfo.bIsAscending = !m_sortInfo.bIsAscending;
else
- {
- ListViewSortInfo.bIsAscending = TRUE;
- }
- ListViewSortInfo.nLastHeaderID = ListViewSortInfo.nHeaderID;
+ m_sortInfo.bIsAscending = TRUE;
+ m_sortInfo.nLastHeaderID = m_sortInfo.nHeaderID;
- SendMessageW(lpnmlv->hdr.hwndFrom, LVM_SORTITEMS, (WPARAM) &ListViewSortInfo, (LPARAM)ListViewCompareItems);
+ m_ListView.SortItems(ListViewCompareItems, &m_sortInfo);
break;
case LVN_GETDISPINFOA:
if (lpdi->item.mask & LVIF_TEXT) /* text requested */
{
- if (pSF2Parent)
+ if (m_pSF2Parent)
{
SHELLDETAILS sd;
- if (FAILED(pSF2Parent->GetDetailsOf(pidl, lpdi->item.iSubItem, &sd)))
+ if (FAILED(m_pSF2Parent->GetDetailsOf(pidl, lpdi->item.iSubItem, &sd)))
{
FIXME("failed to get details\n");
break;
}
if(lpdi->item.mask & LVIF_IMAGE) /* image requested */
{
- lpdi->item.iImage = SHMapPIDLToSystemImageListIndex(pSFParent, pidl, 0);
+ lpdi->item.iImage = SHMapPIDLToSystemImageListIndex(m_pSFParent, pidl, 0);
}
lpdi->item.mask |= LVIF_DI_SETITEM;
break;
if (GetSelections())
{
- IDataObject * pda;
+ CComPtr<IDataObject> pda;
DWORD dwAttributes = SFGAO_CANLINK;
DWORD dwEffect = DROPEFFECT_COPY | DROPEFFECT_MOVE;
- if (SUCCEEDED(pSFParent->GetUIObjectOf(m_hWnd, cidl, (LPCITEMIDLIST*)apidl, IID_IDataObject, 0, (LPVOID *)&pda)))
+ if (SUCCEEDED(m_pSFParent->GetUIObjectOf(m_hWnd, m_cidl, (LPCITEMIDLIST*)m_apidl, IID_NULL_PPV_ARG(IDataObject, &pda))))
{
- IDropSource * pds = (IDropSource *)this; /* own DropSource interface */
+ CComPtr<IDropSource> pds = static_cast<IDropSource *>(this); /* own DropSource interface */
- if (SUCCEEDED(pSFParent->GetAttributesOf(cidl, (LPCITEMIDLIST*)apidl, &dwAttributes)))
+ if (SUCCEEDED(m_pSFParent->GetAttributesOf(m_cidl, (LPCITEMIDLIST*)m_apidl, &dwAttributes)))
{
if (dwAttributes & SFGAO_CANLINK)
{
dwEffect |= DROPEFFECT_LINK;
}
}
+
+ CComPtr<IAsyncOperation> piaso;
+ if (SUCCEEDED(pda->QueryInterface(IID_PPV_ARG(IAsyncOperation, &piaso))))
+ {
+ piaso->SetAsyncMode(TRUE);
+ }
if (pds)
- {
- DWORD dwEffect2;
+ { DWORD dwEffect2;
DoDragDrop(pda, pds, dwEffect, &dwEffect2);
}
- pda->Release();
}
}
break;
TRACE("-- LVN_BEGINLABELEDITW %p\n", this);
- pSFParent->GetAttributesOf(1, (LPCITEMIDLIST*)&pidl, &dwAttr);
+ m_pSFParent->GetAttributesOf(1, (LPCITEMIDLIST*)&pidl, &dwAttr);
if (SFGAO_CANRENAME & dwAttr)
{
+ m_isEditing = TRUE;
return FALSE;
}
return TRUE;
case LVN_ENDLABELEDITW:
{
TRACE("-- LVN_ENDLABELEDITW %p\n", this);
+
+ m_isEditing = FALSE;
+
if (lpdi->item.pszText)
{
HRESULT hr;
LVITEMW lvItem;
- lvItem.iItem = lpdi->item.iItem;
- lvItem.iSubItem = 0;
- lvItem.mask = LVIF_PARAM;
- SendMessageW(hWndList, LVM_GETITEMW, 0, (LPARAM) &lvItem);
-
pidl = (LPITEMIDLIST)lpdi->item.lParam;
- hr = pSFParent->SetNameOf(0, pidl, lpdi->item.pszText, SHGDN_INFOLDER, &pidl);
+ hr = m_pSFParent->SetNameOf(0, pidl, lpdi->item.pszText, SHGDN_INFOLDER, &pidl);
if (SUCCEEDED(hr) && pidl)
{
lvItem.mask = LVIF_PARAM|LVIF_IMAGE;
+ lvItem.iItem = lpdi->item.iItem;
lvItem.lParam = (LPARAM)pidl;
- lvItem.iImage = SHMapPIDLToSystemImageListIndex(pSFParent, pidl, 0);
- SendMessageW(hWndList, LVM_SETITEMW, 0, (LPARAM) &lvItem);
- SendMessageW(hWndList, LVM_UPDATE, lpdi->item.iItem, 0);
-
+ lvItem.iImage = SHMapPIDLToSystemImageListIndex(m_pSFParent, pidl, 0);
+ m_ListView.SetItem(&lvItem);
+ m_ListView.Update(lpdi->item.iItem);
return TRUE;
}
}
return FALSE;
}
- case LVN_KEYDOWN:
- {
- /* MSG msg;
- msg.hwnd = m_hWnd;
- msg.message = WM_KEYDOWN;
- msg.wParam = plvKeyDown->wVKey;
- msg.lParam = 0;
- msg.time = 0;
- msg.pt = 0;*/
-
- LPNMLVKEYDOWN plvKeyDown = (LPNMLVKEYDOWN) lpnmh;
- SHORT ctrl = GetKeyState(VK_CONTROL) & 0x8000;
-
- /* initiate a rename of the selected file or directory */
- if (plvKeyDown->wVKey == VK_F2)
- {
- /* see how many files are selected */
- int i = ListView_GetSelectedCount(hWndList);
-
- /* get selected item */
- if (i == 1)
- {
- /* get selected item */
- i = ListView_GetNextItem(hWndList, -1, LVNI_SELECTED);
-
- SendMessageW(hWndList, LVM_ENSUREVISIBLE, i, 0);
- SendMessageW(hWndList, LVM_EDITLABELW, i, 0);
- }
- }
-#if 0
- TranslateAccelerator(m_hWnd, hAccel, &msg)
-#endif
- else if(plvKeyDown->wVKey == VK_DELETE)
- {
- UINT i;
- int item_index;
- LVITEMA item;
- LPITEMIDLIST* pItems;
- ISFHelper *psfhlp;
+ default:
+ TRACE("-- %p WM_COMMAND %x unhandled\n", this, lpnmh->code);
+ break;
+ }
- pSFParent->QueryInterface(IID_ISFHelper,
- (LPVOID*)&psfhlp);
+ return 0;
+}
- if (psfhlp == NULL)
- break;
+/**********************************************************
+* ShellView_OnChange()
+*/
+LRESULT CDefView::OnChangeNotify(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled)
+{
+ LPITEMIDLIST *Pidls;
- if (!(i = ListView_GetSelectedCount(hWndList)))
- break;
+ Pidls = (LPITEMIDLIST *)wParam;
- /* allocate memory for the pidl array */
- pItems = (LPITEMIDLIST *)HeapAlloc(GetProcessHeap(), 0,
- sizeof(LPITEMIDLIST) * i);
-
- /* retrieve all selected items */
- i = 0;
- item_index = -1;
- while (ListView_GetSelectedCount(hWndList) > i)
- {
- /* get selected item */
- item_index = ListView_GetNextItem(hWndList,
- item_index, LVNI_SELECTED);
- item.iItem = item_index;
- item.mask = LVIF_PARAM;
- SendMessageA(hWndList, LVM_GETITEMA, 0, (LPARAM) &item);
-
- /* get item pidl */
- pItems[i] = (LPITEMIDLIST)item.lParam;
-
- i++;
- }
-
- /* perform the item deletion */
- psfhlp->DeleteItems(i, (LPCITEMIDLIST*)pItems);
-
- /* free pidl array memory */
- HeapFree(GetProcessHeap(), 0, pItems);
- }
- /* Initiate a refresh */
- else if (plvKeyDown->wVKey == VK_F5)
- {
- Refresh();
- }
- else if (plvKeyDown->wVKey == VK_BACK)
- {
- LPSHELLBROWSER lpSb;
- if ((lpSb = (LPSHELLBROWSER)SendMessageW(hWndParent, CWM_GETISHELLBROWSER, 0, 0)))
- {
- lpSb->BrowseObject(NULL, SBSP_PARENT);
- }
- }
- else if (plvKeyDown->wVKey == 'C' && ctrl)
- {
- if (GetSelections())
- {
- CComPtr<IDataObject> pda;
-
- if (SUCCEEDED(pSFParent->GetUIObjectOf(m_hWnd, cidl, (LPCITEMIDLIST*)apidl, IID_IDataObject, 0, (LPVOID *)&pda)))
- {
- HRESULT hr = OleSetClipboard(pda);
- if (FAILED(hr))
- {
- WARN("OleSetClipboard failed");
- }
- }
- }
- break;
- }
- else if(plvKeyDown->wVKey == 'V' && ctrl)
- {
- CComPtr<IDataObject> pda;
- STGMEDIUM medium;
- FORMATETC formatetc;
- LPITEMIDLIST * apidl;
- LPITEMIDLIST pidl;
- CComPtr<IShellFolder> psfFrom;
- CComPtr<IShellFolder> psfDesktop;
- CComPtr<IShellFolder> psfTarget;
- LPIDA lpcida;
- CComPtr<ISFHelper> psfhlpdst;
- CComPtr<ISFHelper> psfhlpsrc;
- HRESULT hr;
-
- hr = OleGetClipboard(&pda);
- if (hr != S_OK)
- {
- ERR("Failed to get clipboard with %lx\n", hr);
- return E_FAIL;
- }
-
- InitFormatEtc(formatetc, RegisterClipboardFormatW(CFSTR_SHELLIDLIST), TYMED_HGLOBAL);
- hr = pda->GetData(&formatetc, &medium);
-
- if (FAILED(hr))
- {
- ERR("Failed to get clipboard data with %lx\n", hr);
- return E_FAIL;
- }
-
- /* lock the handle */
- lpcida = (LPIDA)GlobalLock(medium.hGlobal);
- if (!lpcida)
- {
- ERR("failed to lock pidl\n");
- ReleaseStgMedium(&medium);
- return E_FAIL;
- }
-
- /* convert the data into pidl */
- apidl = _ILCopyCidaToaPidl(&pidl, lpcida);
-
- if (!apidl)
- {
- ERR("failed to copy pidl\n");
- return E_FAIL;
- }
-
- if (FAILED(SHGetDesktopFolder(&psfDesktop)))
- {
- ERR("failed to get desktop folder\n");
- SHFree(pidl);
- _ILFreeaPidl(apidl, lpcida->cidl);
- ReleaseStgMedium(&medium);
- return E_FAIL;
- }
-
- if (_ILIsDesktop(pidl))
- {
- /* use desktop shellfolder */
- psfFrom = psfDesktop;
- }
- else if (FAILED(psfDesktop->BindToObject(pidl, NULL, IID_IShellFolder, (LPVOID*)&psfFrom)))
- {
- ERR("no IShellFolder\n");
-
- SHFree(pidl);
- _ILFreeaPidl(apidl, lpcida->cidl);
- ReleaseStgMedium(&medium);
-
- return E_FAIL;
- }
-
- psfTarget = pSFParent;
-
-
- /* get source and destination shellfolder */
- if (FAILED(psfTarget->QueryInterface(IID_ISFHelper, (LPVOID*)&psfhlpdst)))
- {
- ERR("no IID_ISFHelper for destination\n");
-
- SHFree(pidl);
- _ILFreeaPidl(apidl, lpcida->cidl);
- ReleaseStgMedium(&medium);
-
- return E_FAIL;
- }
-
- if (FAILED(psfFrom->QueryInterface(IID_ISFHelper, (LPVOID*)&psfhlpsrc)))
- {
- ERR("no IID_ISFHelper for source\n");
-
- SHFree(pidl);
- _ILFreeaPidl(apidl, lpcida->cidl);
- ReleaseStgMedium(&medium);
- return E_FAIL;
- }
-
- /* FIXXME
- * do we want to perform a copy or move ???
- */
- hr = psfhlpdst->CopyItems(psfFrom, lpcida->cidl, (LPCITEMIDLIST*)apidl);
-
- SHFree(pidl);
- _ILFreeaPidl(apidl, lpcida->cidl);
- ReleaseStgMedium(&medium);
-
- TRACE("paste end hr %x\n", hr);
- break;
- }
- 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()
-*/
-LRESULT CDefView::OnChangeNotify(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled)
-{
- LPITEMIDLIST *Pidls;
-
- Pidls = (LPITEMIDLIST *)wParam;
-
- TRACE("(%p)(%p,%p,0x%08x)\n", this, Pidls[0], Pidls[1], lParam);
+ TRACE("(%p)(%p,%p,0x%08x)\n", this, Pidls[0], Pidls[1], lParam);
switch (lParam)
{
break;
case SHCNE_UPDATEITEM:
+ LV_RenameItem(Pidls[0], Pidls[0]);
break;
- }
+ case SHCNE_UPDATEDIR:
+ Refresh();
+ break;
+ }
return TRUE;
}
*/
LRESULT CDefView::OnCustomItem(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled)
{
- if (!pCM.p)
+ if (!m_pCM.p)
{
/* no menu */
ERR("no menu!!!\n");
return FALSE;
}
- if (pCM.p->HandleMenuMsg(uMsg, (WPARAM)m_hWnd, lParam) == S_OK)
+ CComPtr<IContextMenu2> pCM2;
+ HRESULT hres = m_pCM.p->QueryInterface(IID_PPV_ARG(IContextMenu2, &pCM2));
+ if(FAILED(hres))
+ return FALSE;
+
+ if (pCM2.p->HandleMenuMsg(uMsg, (WPARAM)m_hWnd, lParam) == S_OK)
return TRUE;
else
return FALSE;
return S_OK;
}
+/**********************************************************
+* CDefView::OnInitMenuPopup
+*/
+LRESULT CDefView::OnInitMenuPopup(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled)
+{
+ MENUITEMINFOW mii = { 0 };
+ HMENU hSubmenu = (HMENU) wParam;
+
+ DbgPrint("OnInitMenuPopup lParam=%d\n", lParam);
+
+ mii.cbSize = sizeof(mii);
+ mii.fMask = MIIM_ID | MIIM_SUBMENU;
+
+ if (!GetMenuItemInfoW(this->m_hMenu, lParam, TRUE, &mii))
+ {
+ DbgPrint("OnInitMenuPopup GetMenuItemInfoW failed!\n");
+ return FALSE;
+ }
+
+ UINT menuItemId = mii.wID;
+
+ if (mii.hSubMenu != hSubmenu)
+ {
+ DbgPrint("OnInitMenuPopup submenu does not match!!!!\n");
+ return FALSE;
+ }
+
+ DbgPrint("OnInitMenuPopup id=%d\n", menuItemId);
+
+ switch (menuItemId)
+ {
+ case FCIDM_MENU_FILE:
+ PrepareShowFileMenu(hSubmenu);
+ break;
+ case FCIDM_MENU_EDIT:
+ //PrepareShowEditMenu(hSubmenu);
+ break;
+ case FCIDM_MENU_VIEW:
+ PrepareShowViewMenu(hSubmenu);
+ break;
+ }
+
+ return FALSE;
+}
+
/**********************************************************
*
*
*/
HRESULT WINAPI CDefView::TranslateAccelerator(LPMSG lpmsg)
{
-#if 0
- 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 (m_isEditing)
+ return S_FALSE;
- if (lpmsg->message >= WM_KEYFIRST && lpmsg->message >= WM_KEYLAST)
+ if (lpmsg->message >= WM_KEYFIRST && lpmsg->message <= WM_KEYLAST)
{
+ if (::TranslateAcceleratorW(m_hWnd, m_hAccel, lpmsg) != 0)
+ return S_OK;
+
TRACE("-- key=0x04%lx\n", lpmsg->wParam) ;
}
- return S_FALSE; /* not handled */
+ return m_pShellBrowser->TranslateAcceleratorSB(lpmsg, 0);
}
HRESULT WINAPI CDefView::EnableModeless(BOOL fEnable)
TRACE("(%p)->(state=%x) stub\n", this, uState);
/*don't do anything if the state isn't really changing*/
- if (this->uState == uState)
+ if (m_uState == uState)
{
return S_OK;
}
/*
GetFolderPath is not a method of IShellFolder
- IShellFolder_GetFolderPath( pSFParent, szName, sizeof(szName) );
+ IShellFolder_GetFolderPath( m_pSFParent, szName, sizeof(szName) );
*/
/* set the number of parts */
- pShellBrowser->SendControlMsg(FCW_STATUS, SB_SETPARTS, 1, (LPARAM)nPartArray, &lResult);
+ m_pShellBrowser->SendControlMsg(FCW_STATUS, SB_SETPARTS, 1, (LPARAM)nPartArray, &lResult);
/* set the text for the parts */
/*
- pShellBrowser->SendControlMsg(FCW_STATUS, SB_SETTEXTA, 0, (LPARAM)szName, &lResult);
+ m_pShellBrowser->SendControlMsg(FCW_STATUS, SB_SETTEXTA, 0, (LPARAM)szName, &lResult);
*/
}
{
TRACE("(%p)\n", this);
- SendMessageW(hWndList, LVM_DELETEALLITEMS, 0, 0);
+ m_ListView.DeleteAllItems();
FillList();
return S_OK;
HRESULT WINAPI CDefView::CreateViewWindow(IShellView *lpPrevView, LPCFOLDERSETTINGS lpfs, IShellBrowser *psb, RECT *prcView, HWND *phWnd)
{
+ OLEMENUGROUPWIDTHS omw = { { 0, 0, 0, 0, 0, 0 } };
+
*phWnd = 0;
TRACE("(%p)->(shlview=%p set=%p shlbrs=%p rec=%p hwnd=%p) incomplete\n", this, lpPrevView, lpfs, psb, prcView, phWnd);
return E_UNEXPECTED;
/*set up the member variables*/
- pShellBrowser = psb;
- FolderSettings = *lpfs;
+ m_pShellBrowser = psb;
+ m_FolderSettings = *lpfs;
/*get our parent window*/
- pShellBrowser->GetWindow(&hWndParent);
+ m_pShellBrowser->GetWindow(&m_hWndParent);
/* try to get the ICommDlgBrowserInterface, adds a reference !!! */
- pCommDlgBrowser = NULL;
- if (SUCCEEDED(pShellBrowser->QueryInterface(IID_ICommDlgBrowser, (LPVOID *)&pCommDlgBrowser)))
+ m_pCommDlgBrowser = NULL;
+ if (SUCCEEDED(m_pShellBrowser->QueryInterface(IID_PPV_ARG(ICommDlgBrowser, &m_pCommDlgBrowser))))
{
TRACE("-- CommDlgBrowser\n");
}
- Create(hWndParent, prcView, NULL, WS_CHILD | WS_TABSTOP, 0, 0U);
+ Create(m_hWndParent, prcView, NULL, WS_CHILD | WS_TABSTOP, 0, 0U);
if (m_hWnd == NULL)
return E_FAIL;
SetWindowPos(HWND_TOP, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE | SWP_SHOWWINDOW);
UpdateWindow();
+ if (!m_hMenu)
+ {
+ m_hMenu = CreateMenu();
+ m_pShellBrowser->InsertMenusSB(m_hMenu, &omw);
+ TRACE("-- after fnInsertMenusSB\n");
+ }
+
+ _MergeToolbar();
+
return S_OK;
}
/*Make absolutely sure all our UI is cleaned up.*/
UIActivate(SVUIA_DEACTIVATE);
- if (hMenu)
+ if (m_hAccel)
{
- DestroyMenu(hMenu);
+ // "Accelerator tables loaded from resources are freed automatically when the application terminates." -- MSDN
+ m_hAccel = NULL;
+ }
+
+ if (m_hView)
+ {
+ DestroyMenu(m_hView);
+ m_hView = NULL;
+ }
+
+ if (m_hMenu)
+ {
+ DestroyMenu(m_hMenu);
+ m_hView = NULL;
+ }
+
+ if (m_ListView)
+ {
+ m_ListView.DestroyWindow();
+ }
+
+ if (m_hWnd)
+ {
+ DestroyWindow();
}
- DestroyWindow();
- pShellBrowser.Release();
- pCommDlgBrowser.Release();
+ m_pShellBrowser.Release();
+ m_pCommDlgBrowser.Release();
return S_OK;
}
HRESULT WINAPI CDefView::GetCurrentInfo(LPFOLDERSETTINGS lpfs)
{
TRACE("(%p)->(%p) vmode=%x flags=%x\n", this, lpfs,
- FolderSettings.ViewMode, FolderSettings.fFlags);
+ m_FolderSettings.ViewMode, m_FolderSettings.fFlags);
if (!lpfs)
return E_INVALIDARG;
- *lpfs = FolderSettings;
- return NOERROR;
+ *lpfs = m_FolderSettings;
+ return S_OK;
}
HRESULT WINAPI CDefView::AddPropertySheetPages(DWORD dwReserved, LPFNADDPROPSHEETPAGE lpfn, LPARAM lparam)
TRACE("(%p)->(pidl=%p, 0x%08x) stub\n", this, pidl, uFlags);
i = LV_FindItemByPidl(pidl);
+ if (i == -1)
+ return S_OK;
- if (i != -1)
- {
- LVITEMW lvItem;
-
- if(uFlags & SVSI_ENSUREVISIBLE)
- SendMessageW(hWndList, LVM_ENSUREVISIBLE, i, 0);
+ if(uFlags & SVSI_ENSUREVISIBLE)
+ m_ListView.EnsureVisible(i, FALSE);
- lvItem.mask = LVIF_STATE;
- lvItem.stateMask = LVIS_SELECTED | LVIS_FOCUSED;
- lvItem.iItem = 0;
- lvItem.iSubItem = 0;
+ LVITEMW lvItem = {0};
+ lvItem.mask = LVIF_STATE;
+ lvItem.stateMask = LVIS_SELECTED | LVIS_FOCUSED;
- while (SendMessageW(hWndList, LVM_GETITEMW, 0, (LPARAM) &lvItem))
+ while (m_ListView.GetItem(&lvItem))
+ {
+ if (lvItem.iItem == i)
{
- if (lvItem.iItem == i)
- {
- if (uFlags & SVSI_SELECT)
- lvItem.state |= LVIS_SELECTED;
- else
- lvItem.state &= ~LVIS_SELECTED;
-
- if (uFlags & SVSI_FOCUSED)
- lvItem.state &= ~LVIS_FOCUSED;
- }
+ if (uFlags & SVSI_SELECT)
+ lvItem.state |= LVIS_SELECTED;
else
- {
- if (uFlags & SVSI_DESELECTOTHERS)
- lvItem.state &= ~LVIS_SELECTED;
- }
+ lvItem.state &= ~LVIS_SELECTED;
- SendMessageW(hWndList, LVM_SETITEMW, 0, (LPARAM) &lvItem);
- lvItem.iItem++;
+ if (uFlags & SVSI_FOCUSED)
+ lvItem.state &= ~LVIS_FOCUSED;
+ }
+ else
+ {
+ if (uFlags & SVSI_DESELECTOTHERS)
+ lvItem.state &= ~LVIS_SELECTED;
}
-
- if(uFlags & SVSI_EDIT)
- SendMessageW(hWndList, LVM_EDITLABELW, i, 0);
+ m_ListView.SetItem(&lvItem);
+ lvItem.iItem++;
}
+ if(uFlags & SVSI_EDIT)
+ m_ListView.EditLabel(i);
+
return S_OK;
}
case SVGIO_BACKGROUND:
if (IsEqualIID(riid, IID_IContextMenu))
{
- //*ppvOut = ISvBgCm_Constructor(pSFParent, FALSE);
- CDefFolderMenu_Create2(NULL, NULL, cidl, (LPCITEMIDLIST*)apidl, pSFParent, NULL, 0, NULL, (IContextMenu**)ppvOut);
+ //*ppvOut = ISvBgCm_Constructor(m_pSFParent, FALSE);
+ CDefFolderMenu_Create2(NULL, NULL, 0, NULL, m_pSFParent, NULL, 0, NULL, (IContextMenu**)ppvOut);
if (!ppvOut)
hr = E_OUTOFMEMORY;
else
case SVGIO_SELECTION:
GetSelections();
- hr = pSFParent->GetUIObjectOf(m_hWnd, cidl, (LPCITEMIDLIST*)apidl, riid, 0, ppvOut);
+ hr = m_pSFParent->GetUIObjectOf(m_hWnd, m_cidl, (LPCITEMIDLIST*)m_apidl, riid, 0, ppvOut);
break;
}
if (!pViewMode)
return E_INVALIDARG;
- *pViewMode = this->FolderSettings.ViewMode;
+ *pViewMode = m_FolderSettings.ViewMode;
return S_OK;
}
DWORD dwStyle;
TRACE("(%p)->(%u), stub\n", this, ViewMode);
- if ((ViewMode < FVM_FIRST || ViewMode > FVM_LAST) /* && (ViewMode != FVM_AUTO) */ )
+ /* It's not redundant to check FVM_AUTO because it's a (UINT)-1 */
+ if ((ViewMode < FVM_FIRST || ViewMode > FVM_LAST) && (ViewMode != (UINT)FVM_AUTO))
return E_INVALIDARG;
/* Windows before Vista uses LVM_SETVIEW and possibly
/* This will not necessarily be the actual mode set above.
This mimics the behavior of Windows XP. */
- this->FolderSettings.ViewMode = ViewMode;
+ m_FolderSettings.ViewMode = ViewMode;
return S_OK;
}
HRESULT STDMETHODCALLTYPE CDefView::GetFolder(REFIID riid, void **ppv)
{
- if (pSFParent == NULL)
+ if (m_pSFParent == NULL)
return E_FAIL;
- return pSFParent->QueryInterface(riid, ppv);
+ return m_pSFParent->QueryInterface(riid, ppv);
}
HRESULT STDMETHODCALLTYPE CDefView::Item(int iItemIndex, LPITEMIDLIST *ppidl)
{
- LVITEMW item;
-
- TRACE("(%p)->(%d %p)\n", this, iItemIndex, ppidl);
-
- item.mask = LVIF_PARAM;
- item.iItem = iItemIndex;
-
- if (SendMessageW(this->hWndList, LVM_GETITEMW, 0, (LPARAM)&item))
+ PITEMID_CHILD pidl = reinterpret_cast<PITEMID_CHILD>(m_ListView.GetItemData(iItemIndex));
+ if (pidl)
{
- *ppidl = ILClone((PITEMID_CHILD)item.lParam);
+ *ppidl = ILClone(pidl);
return S_OK;
}
*ppidl = 0;
-
return E_INVALIDARG;
}
if (uFlags != SVGIO_ALLVIEW)
FIXME("some flags unsupported, %x\n", uFlags & ~SVGIO_ALLVIEW);
- *pcItems = SendMessageW(this->hWndList, LVM_GETITEMCOUNT, 0, 0);
+ *pcItems = m_ListView.GetItemCount();
return S_OK;
}
{
TRACE("(%p)->(%p)\n", this, piItem);
- *piItem = SendMessageW(this->hWndList, LVM_GETSELECTIONMARK, 0, 0);
+ *piItem = m_ListView.GetSelectionMark();
return S_OK;
}
{
TRACE("(%p)->(%p)\n", this, piItem);
- *piItem = SendMessageW(this->hWndList, LVM_GETNEXTITEM, -1, LVNI_FOCUSED);
+ *piItem = m_ListView.GetNextItem(-1, LVNI_FOCUSED);
return S_OK;
}
{
TRACE("(%p)->(%p)\n", this, ppt);
- if (NULL == this->hWndList) return S_FALSE;
+ if (!m_ListView)
+ return S_FALSE;
if (ppt)
{
- const DWORD ret = SendMessageW(this->hWndList, LVM_GETITEMSPACING, 0, 0);
+ SIZE spacing;
+ m_ListView.GetItemSpacing(spacing);
- ppt->x = LOWORD(ret);
- ppt->y = HIWORD(ret);
+ ppt->x = spacing.cx;
+ ppt->y = spacing.cy;
}
return S_OK;
lvItem.stateMask = LVIS_SELECTED;
if (dwFlags & SVSI_ENSUREVISIBLE)
- SendMessageW(this->hWndList, LVM_ENSUREVISIBLE, iItem, 0);
+ m_ListView.EnsureVisible(iItem, 0);
/* all items */
if (dwFlags & SVSI_DESELECTOTHERS)
- SendMessageW(this->hWndList, LVM_SETITEMSTATE, -1, (LPARAM)&lvItem);
+ m_ListView.SetItemState(-1, 0, LVIS_SELECTED);
/* this item */
if (dwFlags & SVSI_SELECT)
if (dwFlags & SVSI_FOCUSED)
lvItem.stateMask |= LVIS_FOCUSED;
- SendMessageW(this->hWndList, LVM_SETITEMSTATE, iItem, (LPARAM)&lvItem);
+ m_ListView.SetItemState(iItem, lvItem.state, lvItem.stateMask);
if (dwFlags & SVSI_EDIT)
- SendMessageW(this->hWndList, LVM_EDITLABELW, iItem, 0);
+ m_ListView.EditLabel(iItem);
+
+ return S_OK;
+}
+HRESULT STDMETHODCALLTYPE CDefView::SelectAndPositionItems(UINT cidl, PCUITEMID_CHILD_ARRAY apidl, POINT *apt, DWORD dwFlags)
+{
+ return E_NOTIMPL;
+}
+
+/**********************************************************
+ * IShellFolderView implementation
+ */
+HRESULT STDMETHODCALLTYPE CDefView::Rearrange(LPARAM sort)
+{
+ FIXME("(%p)->(%ld) stub\n", this, sort);
+ return E_NOTIMPL;
+}
+
+HRESULT STDMETHODCALLTYPE CDefView::GetArrangeParam(LPARAM *sort)
+{
+ FIXME("(%p)->(%p) stub\n", this, sort);
+ return E_NOTIMPL;
+}
+
+HRESULT STDMETHODCALLTYPE CDefView::ArrangeGrid()
+{
+ FIXME("(%p) stub\n", this);
+ return E_NOTIMPL;
+}
+
+HRESULT STDMETHODCALLTYPE CDefView::AutoArrange()
+{
+ FIXME("(%p) stub\n", this);
+ return E_NOTIMPL;
+}
+
+HRESULT STDMETHODCALLTYPE CDefView::AddObject(PITEMID_CHILD pidl, UINT *item)
+{
+ FIXME("(%p)->(%p %p) stub\n", this, pidl, item);
+ return E_NOTIMPL;
+}
+
+HRESULT STDMETHODCALLTYPE CDefView::GetObject(PITEMID_CHILD *pidl, UINT item)
+{
+ TRACE("(%p)->(%p %d)\n", this, pidl, item);
+ return Item(item, pidl);
+}
+
+HRESULT STDMETHODCALLTYPE CDefView::RemoveObject(PITEMID_CHILD pidl, UINT *item)
+{
+
+ TRACE("(%p)->(%p %p)\n", this, pidl, item);
+
+ if (pidl)
+ {
+ *item = LV_FindItemByPidl(ILFindLastID(pidl));
+ m_ListView.DeleteItem(*item);
+ }
+ else
+ {
+ *item = 0;
+ m_ListView.DeleteAllItems();
+ }
+
+ return S_OK;
+}
+
+HRESULT STDMETHODCALLTYPE CDefView::GetObjectCount(UINT *count)
+{
+ TRACE("(%p)->(%p)\n", this, count);
+ return ItemCount(SVGIO_ALLVIEW, reinterpret_cast<INT*>(count));
+}
+
+HRESULT STDMETHODCALLTYPE CDefView::SetObjectCount(UINT count, UINT flags)
+{
+ FIXME("(%p)->(%d %x) stub\n", this, count, flags);
+ return E_NOTIMPL;
+}
+
+HRESULT STDMETHODCALLTYPE CDefView::UpdateObject(PITEMID_CHILD pidl_old, PITEMID_CHILD pidl_new, UINT *item)
+{
+ FIXME("(%p)->(%p %p %p) stub\n", this, pidl_old, pidl_new, item);
+ return E_NOTIMPL;
+}
+
+HRESULT STDMETHODCALLTYPE CDefView::RefreshObject(PITEMID_CHILD pidl, UINT *item)
+{
+ FIXME("(%p)->(%p %p) stub\n", this, pidl, item);
+ return E_NOTIMPL;
+}
+
+HRESULT STDMETHODCALLTYPE CDefView::SetRedraw(BOOL redraw)
+{
+ TRACE("(%p)->(%d)\n", this, redraw);
+ m_ListView.SetRedraw(redraw);
return S_OK;
}
-HRESULT STDMETHODCALLTYPE CDefView::SelectAndPositionItems(UINT cidl, LPCITEMIDLIST *apidl, POINT *apt, DWORD dwFlags)
+HRESULT STDMETHODCALLTYPE CDefView::GetSelectedCount(UINT *count)
+{
+ FIXME("(%p)->(%p) stub\n", this, count);
+ return E_NOTIMPL;
+}
+
+HRESULT STDMETHODCALLTYPE CDefView::GetSelectedObjects(PCUITEMID_CHILD **pidl, UINT *items)
+{
+ TRACE("(%p)->(%p %p)\n", this, pidl, items);
+
+ *items = GetSelections();
+
+ if (*items)
+ {
+ *pidl = static_cast<PCUITEMID_CHILD *>(LocalAlloc(0, *items * sizeof(LPITEMIDLIST)));
+ if (!*pidl)
+ {
+ return E_OUTOFMEMORY;
+ }
+
+ /* it's documented that caller shouldn't PIDLs, only array itself */
+ memcpy(static_cast<PCUITEMID_CHILD *>(*pidl), m_apidl, *items * sizeof(LPITEMIDLIST));
+ }
+
+ return S_OK;
+}
+
+HRESULT STDMETHODCALLTYPE CDefView::IsDropOnSource(IDropTarget *drop_target)
+{
+ FIXME("(%p)->(%p) stub\n", this, drop_target);
+ return E_NOTIMPL;
+}
+
+HRESULT STDMETHODCALLTYPE CDefView::GetDragPoint(POINT *pt)
+{
+ FIXME("(%p)->(%p) stub\n", this, pt);
+ return E_NOTIMPL;
+}
+
+HRESULT STDMETHODCALLTYPE CDefView::GetDropPoint(POINT *pt)
{
+ FIXME("(%p)->(%p) stub\n", this, pt);
return E_NOTIMPL;
}
+HRESULT STDMETHODCALLTYPE CDefView::MoveIcons(IDataObject *obj)
+{
+ TRACE("(%p)->(%p)\n", this, obj);
+ return E_NOTIMPL;
+}
+
+HRESULT STDMETHODCALLTYPE CDefView::SetItemPos(PCUITEMID_CHILD pidl, POINT *pt)
+{
+ FIXME("(%p)->(%p %p) stub\n", this, pidl, pt);
+ return E_NOTIMPL;
+}
+
+HRESULT STDMETHODCALLTYPE CDefView::IsBkDropTarget(IDropTarget *drop_target)
+{
+ FIXME("(%p)->(%p) stub\n", this, drop_target);
+ return E_NOTIMPL;
+}
+
+HRESULT STDMETHODCALLTYPE CDefView::SetClipboard(BOOL move)
+{
+ FIXME("(%p)->(%d) stub\n", this, move);
+ return E_NOTIMPL;
+}
+
+HRESULT STDMETHODCALLTYPE CDefView::SetPoints(IDataObject *obj)
+{
+ FIXME("(%p)->(%p) stub\n", this, obj);
+ return E_NOTIMPL;
+}
+
+HRESULT STDMETHODCALLTYPE CDefView::GetItemSpacing(ITEMSPACING *spacing)
+{
+ FIXME("(%p)->(%p) stub\n", this, spacing);
+ return E_NOTIMPL;
+}
+
+HRESULT STDMETHODCALLTYPE CDefView::SetCallback(IShellFolderViewCB *new_cb, IShellFolderViewCB **old_cb)
+{
+ FIXME("(%p)->(%p %p) stub\n", this, new_cb, old_cb);
+ return E_NOTIMPL;
+}
+
+HRESULT STDMETHODCALLTYPE CDefView::Select(UINT flags)
+{
+ FIXME("(%p)->(%d) stub\n", this, flags);
+ return E_NOTIMPL;
+}
+
+HRESULT STDMETHODCALLTYPE CDefView::QuerySupport(UINT *support)
+{
+ TRACE("(%p)->(%p)\n", this, support);
+ return S_OK;
+}
+
+HRESULT STDMETHODCALLTYPE CDefView::SetAutomationObject(IDispatch *disp)
+{
+ FIXME("(%p)->(%p) stub\n", this, disp);
+ return E_NOTIMPL;
+}
+
/**********************************************************
* ISVOleCmdTarget_QueryStatus (IOleCommandTarget)
*/
if (!pguidCmdGroup)
return OLECMDERR_E_UNKNOWNGROUP;
+ if (IsEqualCLSID(*pguidCmdGroup, m_Category))
+ {
+ if (nCmdID == FCIDM_SHVIEW_AUTOARRANGE)
+ {
+ if (V_VT(pvaIn) != VT_INT_PTR)
+ return OLECMDERR_E_NOTSUPPORTED;
+
+
+ TPMPARAMS params;
+ params.cbSize = sizeof(params);
+ params.rcExclude = *(RECT*) V_INTREF(pvaIn);
+
+ HMENU hView = m_hView;
+#if 0
+ hView = CreatePopupMenu();
+ AppendMenuW(hView, MF_STRING, FCIDM_SHVIEW_BIGICON, L"Big!");
+ AppendMenuW(hView, MF_STRING, FCIDM_SHVIEW_SMALLICON, L"Small!");
+ AppendMenuW(hView, MF_STRING, FCIDM_SHVIEW_LISTVIEW, L"List!");
+ AppendMenuW(hView, MF_STRING, FCIDM_SHVIEW_REPORTVIEW, L"Report!");
+#endif
+
+ if (hView)
+ {
+ PrepareShowViewMenu(hView);
+
+ TrackPopupMenuEx(hView, TPM_LEFTALIGN | TPM_TOPALIGN, params.rcExclude.left, params.rcExclude.bottom, m_hWndParent, ¶ms);
+ }
+
+ // pvaOut is VT_I4 with value 0x403 (cmd id of the new mode maybe?)
+ V_VT(pvaOut) = VT_I4;
+ V_I4(pvaOut) = 0x403;
+ }
+ }
+
if (IsEqualIID(*pguidCmdGroup, CGID_Explorer) &&
(nCmdID == 0x29) &&
(nCmdexecopt == 4) && pvaOut)
HRESULT CDefView::drag_notify_subitem(DWORD grfKeyState, POINTL pt, DWORD *pdwEffect)
{
LVHITTESTINFO htinfo;
- LVITEMW lvItem;
LONG lResult;
HRESULT hr;
RECT clientRect;
htinfo.pt.x = pt.x;
htinfo.pt.y = pt.y;
htinfo.flags = LVHT_ONITEM;
- ::ScreenToClient(hWndList, &htinfo.pt);
- lResult = SendMessageW(hWndList, LVM_HITTEST, 0, (LPARAM)&htinfo);
+ ::ScreenToClient(m_ListView, &htinfo.pt);
+ lResult = m_ListView.HitTest(&htinfo);
/* Send WM_*SCROLL messages every 250 ms during drag-scrolling */
- ::GetClientRect(hWndList, &clientRect);
- if (htinfo.pt.x == ptLastMousePos.x && htinfo.pt.y == ptLastMousePos.y &&
+ ::GetClientRect(m_ListView, &clientRect);
+ if (htinfo.pt.x == m_ptLastMousePos.x && htinfo.pt.y == m_ptLastMousePos.y &&
(htinfo.pt.x < SCROLLAREAWIDTH || htinfo.pt.x > clientRect.right - SCROLLAREAWIDTH ||
htinfo.pt.y < SCROLLAREAWIDTH || htinfo.pt.y > clientRect.bottom - SCROLLAREAWIDTH ))
{
- cScrollDelay = (cScrollDelay + 1) % 5; /* DragOver is called every 50 ms */
- if (cScrollDelay == 0)
+ m_cScrollDelay = (m_cScrollDelay + 1) % 5; /* DragOver is called every 50 ms */
+ if (m_cScrollDelay == 0)
{
/* Mouse did hover another 250 ms over the scroll-area */
if (htinfo.pt.x < SCROLLAREAWIDTH)
- SendMessageW(hWndList, WM_HSCROLL, SB_LINEUP, 0);
+ m_ListView.SendMessageW(WM_HSCROLL, SB_LINEUP, 0);
if (htinfo.pt.x > clientRect.right - SCROLLAREAWIDTH)
- SendMessageW(hWndList, WM_HSCROLL, SB_LINEDOWN, 0);
+ m_ListView.SendMessageW(WM_HSCROLL, SB_LINEDOWN, 0);
if (htinfo.pt.y < SCROLLAREAWIDTH)
- SendMessageW(hWndList, WM_VSCROLL, SB_LINEUP, 0);
+ m_ListView.SendMessageW(WM_VSCROLL, SB_LINEUP, 0);
if (htinfo.pt.y > clientRect.bottom - SCROLLAREAWIDTH)
- SendMessageW(hWndList, WM_VSCROLL, SB_LINEDOWN, 0);
+ m_ListView.SendMessageW(WM_VSCROLL, SB_LINEDOWN, 0);
}
}
else
{
- cScrollDelay = 0; /* Reset, if the cursor is not over the listview's scroll-area */
+ m_cScrollDelay = 0; /* Reset, if the cursor is not over the listview's scroll-area */
}
- ptLastMousePos = htinfo.pt;
+ m_ptLastMousePos = htinfo.pt;
/* If we are still over the previous sub-item, notify it via DragOver and return. */
- if (pCurDropTarget && lResult == iDragOverItem)
- return pCurDropTarget->DragOver(grfKeyState, pt, pdwEffect);
+ if (m_pCurDropTarget && lResult == m_iDragOverItem)
+ return m_pCurDropTarget->DragOver(grfKeyState, pt, pdwEffect);
/* We've left the previous sub-item, notify it via DragLeave and Release it. */
- if (pCurDropTarget)
+ if (m_pCurDropTarget)
{
- pCurDropTarget->DragLeave();
- pCurDropTarget.Release();
+ m_pCurDropTarget->DragLeave();
+ m_pCurDropTarget.Release();
}
- iDragOverItem = lResult;
+ m_iDragOverItem = lResult;
if (lResult == -1)
{
/* We are not above one of the listview's subitems. Bind to the parent folder's
* DropTarget interface. */
- hr = pSFParent->QueryInterface(IID_IDropTarget,
- (LPVOID*)&pCurDropTarget);
+ hr = m_pSFParent->QueryInterface(IID_PPV_ARG(IDropTarget,&m_pCurDropTarget));
}
else
{
/* Query the relative PIDL of the shellfolder object represented by the currently
* dragged over listview-item ... */
- lvItem.mask = LVIF_PARAM;
- lvItem.iItem = lResult;
- lvItem.iSubItem = 0;
- SendMessageW(hWndList, LVM_GETITEMW, 0, (LPARAM) &lvItem);
+ LPCITEMIDLIST pidl = reinterpret_cast<LPCITEMIDLIST>(m_ListView.GetItemData(lResult));
- /* ... and bind pCurDropTarget to the IDropTarget interface of an UIObject of this object */
- hr = pSFParent->GetUIObjectOf(hWndList, 1,
- (LPCITEMIDLIST*)&lvItem.lParam, IID_IDropTarget, NULL, (LPVOID*)&pCurDropTarget);
+ /* ... and bind m_pCurDropTarget to the IDropTarget interface of an UIObject of this object */
+ hr = m_pSFParent->GetUIObjectOf(m_ListView, 1, &pidl, IID_NULL_PPV_ARG(IDropTarget, &m_pCurDropTarget));
}
- /* If anything failed, pCurDropTarget should be NULL now, which ought to be a save state. */
+ /* If anything failed, m_pCurDropTarget should be NULL now, which ought to be a save state. */
if (FAILED(hr))
return hr;
/* Notify the item just entered via DragEnter. */
- return pCurDropTarget->DragEnter(pCurDataObject, grfKeyState, pt, pdwEffect);
+ 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 */
- pCurDataObject = pDataObject;
+ m_pCurDataObject = pDataObject;
pDataObject->AddRef();
return drag_notify_subitem(grfKeyState, pt, pdwEffect);
HRESULT WINAPI CDefView::DragLeave()
{
- if (pCurDropTarget)
+ if (m_pCurDropTarget)
{
- pCurDropTarget->DragLeave();
- pCurDropTarget.Release();
+ m_pCurDropTarget->DragLeave();
+ m_pCurDropTarget.Release();
}
- if (pCurDataObject != NULL)
+ if (m_pCurDataObject != NULL)
{
- pCurDataObject.Release();
+ m_pCurDataObject.Release();
}
- iDragOverItem = 0;
+ m_iDragOverItem = 0;
return S_OK;
}
HRESULT WINAPI CDefView::Drop(IDataObject* pDataObject, DWORD grfKeyState, POINTL pt, DWORD *pdwEffect)
{
- if (pCurDropTarget)
+ if (m_pCurDropTarget)
{
- pCurDropTarget->Drop(pDataObject, grfKeyState, pt, pdwEffect);
- pCurDropTarget.Release();
+ m_pCurDropTarget->Drop(pDataObject, grfKeyState, pt, pdwEffect);
+ m_pCurDropTarget.Release();
}
- pCurDataObject.Release();
- iDragOverItem = 0;
-
+ m_pCurDataObject.Release();
+ m_iDragOverItem = 0;
return S_OK;
}
else if (!(grfKeyState & MK_LBUTTON) && !(grfKeyState & MK_RBUTTON))
return DRAGDROP_S_DROP;
else
- return NOERROR;
+ return S_OK;
}
HRESULT WINAPI CDefView::GiveFeedback(DWORD dwEffect)
FIXME("partial stub: %p %08x %08x %p\n", this, aspects, advf, pAdvSink);
/* FIXME: we set the AdviseSink, but never use it to send any advice */
- this->pAdvSink = pAdvSink;
- dwAspects = aspects;
- dwAdvf = advf;
+ m_pAdvSink = pAdvSink;
+ m_dwAspects = aspects;
+ m_dwAdvf = advf;
return S_OK;
}
if (ppAdvSink)
{
- *ppAdvSink = pAdvSink;
- pAdvSink.p->AddRef();
+ *ppAdvSink = m_pAdvSink;
+ m_pAdvSink.p->AddRef();
}
if (pAspects)
- *pAspects = dwAspects;
+ *pAspects = m_dwAspects;
if (pAdvf)
- *pAdvf = dwAdvf;
+ *pAdvf = m_dwAdvf;
return S_OK;
}
HRESULT STDMETHODCALLTYPE CDefView::QueryService(REFGUID guidService, REFIID riid, void **ppvObject)
{
if (IsEqualIID(guidService, SID_IShellBrowser))
- return pShellBrowser->QueryInterface(riid, ppvObject);
+ return m_pShellBrowser->QueryInterface(riid, ppvObject);
else if(IsEqualIID(guidService, SID_IFolderView))
return QueryInterface(riid, ppvObject);
return E_NOINTERFACE;
}
-/**********************************************************
- * IShellView_Constructor
- */
-HRESULT WINAPI IShellView_Constructor(IShellFolder *pFolder, IShellView **newView)
+HRESULT CDefView::_MergeToolbar()
{
- CComObject<CDefView> *theView;
- CComPtr<IShellView> result;
- HRESULT hResult;
+ CComPtr<IExplorerToolbar> ptb; // [sp+8h] [bp-4h]@1
- if (newView == NULL)
- return E_POINTER;
+ HRESULT hr = S_OK;
- *newView = NULL;
- ATLTRY (theView = new CComObject<CDefView>);
+ hr = IUnknown_QueryService(m_pShellBrowser, IID_IExplorerToolbar, IID_PPV_ARG(IExplorerToolbar, &ptb));
+ if (FAILED(hr))
+ return hr;
- if (theView == NULL)
- return E_OUTOFMEMORY;
+ m_Category = CGID_DefViewFrame;
- hResult = theView->QueryInterface (IID_IShellView, (void **)&result);
- if (FAILED (hResult))
- {
- delete theView;
- return hResult;
- }
+ hr = ptb->SetCommandTarget(static_cast<IOleCommandTarget*>(this), &m_Category, 0);
+ if (FAILED(hr))
+ return hr;
- hResult = theView->Initialize (pFolder);
- if (FAILED (hResult))
- return hResult;
- *newView = result.Detach ();
+ if (hr == S_FALSE)
+ return S_OK;
+
+#if 0
+ hr = ptb->AddButtons(&m_Category, buttonsCount, buttons);
+ if (FAILED(hr))
+ return hr;
+#endif
return S_OK;
}
+/**********************************************************
+ * IShellView_Constructor
+ */
+HRESULT WINAPI IShellView_Constructor(IShellFolder *pFolder, IShellView **newView)
+{
+ return ShellObjectCreatorInit<CDefView>(pFolder, IID_IShellView, newView);
+}