public CComObjectRootEx<CComMultiThreadModelNoCS>,
public IShellView,
public IFolderView,
+ public IShellFolderView,
public IOleCommandTarget,
public IDropTarget,
public IDropSource,
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 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)
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)
{
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);
LRESULT CDefView::OnDestroy(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled)
{
+ if (m_hMenu)
+ DestroyMenu(m_hMenu);
RevokeDragDrop(m_hWnd);
SHChangeNotifyDeregister(m_hNotify);
bHandled = FALSE;
* #### 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);
- 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);
+
+ DbgPrint("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);
}
}
if (m_uState != SVUIA_DEACTIVATE)
{
- if (m_hMenu)
- {
- m_pShellBrowser->SetMenuSB(0, 0, 0);
- m_pShellBrowser->RemoveMenusSB(m_hMenu);
- DestroyMenu(m_hMenu);
- m_hMenu = 0;
- }
+ // TODO: cleanup menu after deactivation
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 */
return;
}
- OnDeactivate();
-
- /*only do This if we are active */
- if(uState != SVUIA_DEACTIVATE)
+ if (uState == SVUIA_DEACTIVATE)
+ {
+ OnDeactivate();
+ }
+ else
{
- /*merge the menus */
- m_hMenu = CreateMenu();
-
if(m_hMenu)
{
- m_pShellBrowser->InsertMenusSB(m_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(m_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(m_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);
- /*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));
+ 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 (GetMenuItemInfoA(m_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;
+
+ _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;
}
+ }
- TRACE("-- before fnSetMenuSB\n");
- m_pShellBrowser->SetMenuSB(m_hMenu, 0, m_hWnd);
+ if (SVUIA_ACTIVATE_FOCUS == uState)
+ {
+ ::SetFocus(m_hWndList);
}
}
+
m_uState = uState;
TRACE("--\n");
}
DWORD dwAttributes = SFGAO_CANLINK;
DWORD dwEffect = DROPEFFECT_COPY | DROPEFFECT_MOVE;
- if (SUCCEEDED(m_pSFParent->GetUIObjectOf(m_hWnd, m_cidl, (LPCITEMIDLIST*)m_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 */
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;
return FALSE;
}
- case LVN_KEYDOWN:
- {
- LPNMLVKEYDOWN plvKeyDown = (LPNMLVKEYDOWN) lpnmh;
-
- /* initiate a rename of the selected file or directory */
- if (plvKeyDown->wVKey == VK_BACK)
- {
- LPSHELLBROWSER lpSb;
- if ((lpSb = (LPSHELLBROWSER)SendMessageW(m_hWndParent, CWM_GETISHELLBROWSER, 0, 0)))
- {
- lpSb->BrowseObject(NULL, SBSP_PARENT);
- }
- }
-
- else
- FIXME("LVN_KEYDOWN key=0x%08x\n", plvKeyDown->wVKey);
- }
- break;
-
default:
TRACE("-- %p WM_COMMAND %x unhandled\n", this, lpnmh->code);
break;
break;
case SHCNE_UPDATEITEM:
+ LV_RenameItem(Pidls[0], Pidls[0]);
break;
- }
+ case SHCNE_UPDATEDIR:
+ Refresh();
+ break;
+ }
return TRUE;
}
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 (m_isEditing)
+ return S_FALSE;
+
if (lpmsg->message >= WM_KEYFIRST && lpmsg->message <= WM_KEYLAST)
{
if (::TranslateAcceleratorW(m_hWnd, m_hAccel, lpmsg) != 0)
return S_OK;
- /* FIXME: should call TranslateAcceleratorSB */
-
TRACE("-- key=0x04%lx\n", lpmsg->wParam) ;
}
- return S_FALSE; /* not handled */
+ return m_pShellBrowser->TranslateAcceleratorSB(lpmsg, 0);
}
HRESULT WINAPI CDefView::EnableModeless(BOOL fEnable)
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);
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");
+ }
+
return S_OK;
}
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;
+}
+
+/**********************************************************
+ * 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));
+ SendMessageW(m_hWndList, LVM_DELETEITEM, *item, 0);
+ }
+ else
+ {
+ *item = 0;
+ SendMessageW(m_hWndList, LVM_DELETEALLITEMS, 0, 0);
+ }
+
+ 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);
+ SendMessageW(m_hWndList, WM_SETREDRAW, redraw, 0);
+ return S_OK;
+}
+
+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)
*/
SendMessageW(m_hWndList, LVM_GETITEMW, 0, (LPARAM) &lvItem);
/* ... and bind m_pCurDropTarget to the IDropTarget interface of an UIObject of this object */
- hr = m_pSFParent->GetUIObjectOf(m_hWndList, 1,
- (LPCITEMIDLIST*)&lvItem.lParam, IID_IDropTarget, NULL, (LPVOID*)&m_pCurDropTarget);
+ hr = m_pSFParent->GetUIObjectOf(m_hWndList, 1, (LPCITEMIDLIST*)&lvItem.lParam, IID_NULL_PPV_ARG(IDropTarget, &m_pCurDropTarget));
}
/* If anything failed, m_pCurDropTarget should be NULL now, which ought to be a save state. */
{
m_pCurDropTarget->Drop(pDataObject, grfKeyState, pt, pdwEffect);
m_pCurDropTarget.Release();
-
- this->Refresh();
}
- m_pCurDataObject.Release(); m_iDragOverItem = 0;
-
+ m_pCurDataObject.Release();
+ m_iDragOverItem = 0;
return S_OK;
}