HWND m_hWndParent;
FOLDERSETTINGS m_FolderSettings;
HMENU m_hMenu;
+ BOOL m_menusLoaded;
UINT m_uState;
UINT m_cidl;
LPITEMIDLIST *m_apidl;
POINT m_ptLastMousePos; /* Mouse position at last DragOver call */
//
CComPtr<IContextMenu> m_pCM;
+
+ BOOL m_isEditing;
public:
CDefView();
~CDefView();
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();
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 IShellFolderView_GetAutoArrange();
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);
m_FolderSettings.fFlags = 0;
m_FolderSettings.ViewMode = 0;
m_hMenu = NULL;
+ m_menusLoaded = FALSE;
m_uState = 0;
m_cidl = 0;
m_apidl = NULL;
m_cScrollDelay = 0;
m_ptLastMousePos.x = 0;
m_ptLastMousePos.y = 0;
+ m_isEditing = FALSE;
}
CDefView::~CDefView()
if (m_FolderSettings.fFlags & FWF_DESKTOP)
dwStyle |= LVS_ALIGNLEFT;
else
- dwStyle |= LVS_ALIGNTOP;
+ dwStyle |= LVS_ALIGNTOP | LVS_SHOWSELALWAYS;
switch (m_FolderSettings.ViewMode)
{
* #### 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;
+
+ // TODO: filter or something
- TRACE("-- return (menu=%p)\n", hSubMenu);
- return hSubMenu;
+ return hmenu;
}
-/**********************************************************
-* ShellView_MergeFileMenu()
-*/
-void CDefView::MergeFileMenu(HMENU hSubMenu)
+void CDefView::PrepareShowFileMenu(HMENU hSubMenu)
{
TRACE("(%p)->(submenu=%p) stub\n", this, 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+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, 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);
- TRACE("--\n");
-}
-
-/**********************************************************
-* ShellView_MergeViewMenu()
-*/
-void CDefView::MergeViewMenu(HMENU hSubMenu)
-{
- TRACE("(%p)->(submenu=%p)\n", this, hSubMenu);
-
- if (!hSubMenu)
- return;
-
- __debugbreak();
-
- DWORD item;
- item |= SHCheckMenuItem(hSubMenu, FCIDM_SHVIEW_BIGICON, FALSE);
- item |= SHCheckMenuItem(hSubMenu, FCIDM_SHVIEW_SMALLICON, FALSE);
- item |= SHCheckMenuItem(hSubMenu, FCIDM_SHVIEW_LISTVIEW, FALSE);
- item |= SHCheckMenuItem(hSubMenu, FCIDM_SHVIEW_REPORTVIEW, FALSE);
-
- if (item == -1)
+ HMENU menubase = BuildFileMenu();
+ if (menubase)
{
- HMENU menubase = ::LoadMenuW(shell32_hInstance, L"MENU_001");
+ int count = ::GetMenuItemCount(menubase);
- _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++)
{
- MENUITEMINFOW mii = { 0 };
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.fType |= MFT_RADIOCHECK;
- ::InsertMenuItemW(hSubMenu, FCIDM_MENU_VIEW_SEP_OPTIONS, FALSE, &mii);
+ ::InsertMenuItemW(hSubMenu, IDM_MYFILEITEM, FALSE, &mii);
}
+ _InsertMenuItemW(hSubMenu, IDM_MYFILEITEM, FALSE, 0, MFT_SEPARATOR, NULL, MFS_ENABLED);
+
::DestroyMenu(menubase);
}
+ TRACE("--\n");
+}
+
+void CDefView::PrepareShowViewMenu(HMENU hSubMenu)
+{
+ TRACE("(%p)->(submenu=%p)\n", this, hSubMenu);
- DbgPrint("View mode is %d\n", m_FolderSettings.ViewMode);
+ if (!hSubMenu)
+ return;
if (m_FolderSettings.ViewMode >= FVM_FIRST && m_FolderSettings.ViewMode <= FVM_LAST)
{
- UINT iItem = FCIDM_SHVIEW_BIGICON + m_FolderSettings.ViewMode - FVM_FIRST;
- DbgPrint("Checking item %d ...\n", iItem);
- item = SHCheckMenuItem(hSubMenu, iItem, TRUE);
- DbgPrint("SHCheckMenuItem returned %d\n", item);
- if (item == -1)
- {
- DbgPrint("GetLastError returned %d\n", GetLastError());
- }
+ 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);
}
}
{
if(m_hMenu)
{
- TRACE("-- before fnSetMenuSB\n");
- m_pShellBrowser->SetMenuSB(m_hMenu, 0, m_hWnd);
+ if (!m_menusLoaded)
+ {
+ MENUITEMINFOW mii = { 0 };
+
+ /* initialize EDIT menu */
+ mii.cbSize = sizeof(mii);
+ mii.fMask = MIIM_SUBMENU;
+ if (::GetMenuItemInfoW(m_hMenu, FCIDM_MENU_EDIT, FALSE, &mii))
+ {
+ HMENU hSubMenu = mii.hSubMenu;
+
+ HMENU menubase = ::LoadMenuW(shell32_hInstance, L"MENU_003");
+
+ 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);
+
+ DbgPrint("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 */
+ mii.cbSize = sizeof(mii);
+ mii.fMask = MIIM_SUBMENU;
+ if (::GetMenuItemInfoW(m_hMenu, FCIDM_MENU_VIEW, FALSE, &mii))
+ {
+ HMENU menubase = ::LoadMenuW(shell32_hInstance, L"MENU_001");
+
+ HMENU hSubMenu = mii.hSubMenu;
+
+ _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);
+
+ DbgPrint("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;
+ }
}
if (SVUIA_ACTIVATE_FOCUS == uState)
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;
switch (menuItemId)
{
case FCIDM_MENU_FILE:
- MergeFileMenu(hSubmenu);
+ PrepareShowFileMenu(hSubmenu);
break;
case FCIDM_MENU_EDIT:
- //MergeEditMenu(hSubmenu);
+ //PrepareShowEditMenu(hSubmenu);
break;
case FCIDM_MENU_VIEW:
- MergeViewMenu(hSubmenu);
+ PrepareShowViewMenu(hSubmenu);
break;
}
*/
HRESULT WINAPI CDefView::TranslateAccelerator(LPMSG lpmsg)
{
+ if (m_isEditing)
+ return S_FALSE;
+
if (lpmsg->message >= WM_KEYFIRST && lpmsg->message <= WM_KEYLAST)
{
if (::TranslateAcceleratorW(m_hWnd, m_hAccel, lpmsg) != 0)
TRACE("-- key=0x04%lx\n", lpmsg->wParam) ;
}
- return S_FALSE; /* not handled */
+ return m_pShellBrowser->TranslateAcceleratorSB(lpmsg, 0);
}
HRESULT WINAPI CDefView::EnableModeless(BOOL fEnable)
return S_OK;
}
-HRESULT STDMETHODCALLTYPE CDefView::SelectAndPositionItems(UINT cidl, LPCITEMIDLIST *apidl, POINT *apt, DWORD dwFlags)
+HRESULT STDMETHODCALLTYPE CDefView::SelectAndPositionItems(UINT cidl, PCUITEMID_CHILD_ARRAY apidl, POINT *apt, DWORD dwFlags)
{
return E_NOTIMPL;
}
return E_NOTIMPL;
}
-HRESULT STDMETHODCALLTYPE CDefView::IShellFolderView_GetAutoArrange()
-{
- TRACE("(%p)\n", this);
- return GetAutoArrange();
-}
-
HRESULT STDMETHODCALLTYPE CDefView::AddObject(PITEMID_CHILD pidl, UINT *item)
{
FIXME("(%p)->(%p %p) stub\n", this, pidl, item);