CLSID m_Category;
HMENU m_hView;
+ BOOL m_Destroyed;
private:
HRESULT _MergeToolbar();
HRESULT IncludeObject(PCUITEMID_CHILD pidl);
HRESULT OnDefaultCommand();
HRESULT OnStateChange(UINT uFlags);
+ void UpdateStatusbar();
void CheckToolbar();
void SetStyle(DWORD dwAdd, DWORD dwRemove);
BOOL CreateList();
BOOLEAN LV_AddItem(PCUITEMID_CHILD pidl);
BOOLEAN LV_DeleteItem(PCUITEMID_CHILD pidl);
BOOLEAN LV_RenameItem(PCUITEMID_CHILD pidlOld, PCUITEMID_CHILD pidlNew);
+ BOOLEAN LV_ProdItem(PCUITEMID_CHILD pidl);
static INT CALLBACK fill_list(LPVOID ptr, LPVOID arg);
HRESULT FillList();
HMENU BuildFileMenu();
LRESULT OnEraseBackground(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled);
LRESULT OnSysColorChange(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled);
LRESULT OnGetShellBrowser(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled);
+ LRESULT OnNCCreate(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled);
+ LRESULT OnNCDestroy(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled);
LRESULT OnCreate(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled);
LRESULT OnContextMenu(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled);
LRESULT OnSize(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled);
MESSAGE_HANDLER(WM_SIZE, OnSize)
MESSAGE_HANDLER(WM_SETFOCUS, OnSetFocus)
MESSAGE_HANDLER(WM_KILLFOCUS, OnKillFocus)
+ MESSAGE_HANDLER(WM_NCCREATE, OnNCCreate)
+ MESSAGE_HANDLER(WM_NCDESTROY, OnNCDestroy)
MESSAGE_HANDLER(WM_CREATE, OnCreate)
MESSAGE_HANDLER(WM_ACTIVATE, OnActivate)
MESSAGE_HANDLER(WM_NOTIFY, OnNotify)
END_MSG_MAP()
BEGIN_COM_MAP(CDefView)
- COM_INTERFACE_ENTRY_IID(IID_IOleWindow, IOleWindow)
+ // Windows returns E_NOINTERFACE for IOleWindow
+ // COM_INTERFACE_ENTRY_IID(IID_IOleWindow, IOleWindow)
COM_INTERFACE_ENTRY_IID(IID_IShellView, IShellView)
COM_INTERFACE_ENTRY_IID(IID_IFolderView, IFolderView)
COM_INTERFACE_ENTRY_IID(IID_IShellFolderView, IShellFolderView)
m_iDragOverItem(0),
m_cScrollDelay(0),
m_isEditing(FALSE),
- m_hView(NULL)
+ m_hView(NULL),
+ m_Destroyed(FALSE)
{
ZeroMemory(&m_FolderSettings, sizeof(m_FolderSettings));
ZeroMemory(&m_sortInfo, sizeof(m_sortInfo));
}
}
+void CDefView::UpdateStatusbar()
+{
+ WCHAR szFormat[MAX_PATH] = {0};
+ WCHAR szObjects[MAX_PATH] = {0};
+ UINT cSelectedItems;
+
+ cSelectedItems = m_ListView.GetSelectedCount();
+ if (cSelectedItems)
+ {
+ LoadStringW(shell32_hInstance, IDS_OBJECTS_SELECTED, szFormat, _countof(szFormat));
+ StringCchPrintfW(szObjects, MAX_PATH, szFormat, cSelectedItems);
+ }
+ else
+ {
+ LoadStringW(shell32_hInstance, IDS_OBJECTS, szFormat, _countof(szFormat));
+ StringCchPrintfW(szObjects, MAX_PATH, szFormat, m_ListView.GetItemCount());
+ }
+ m_pShellBrowser->SetStatusTextSB(szObjects);
+}
+
/**********************************************************
*
* ##### helperfunctions for initializing the view #####
return FALSE;
}
+/**********************************************************
+* LV_ProdItem()
+*/
+BOOLEAN CDefView::LV_ProdItem(PCUITEMID_CHILD pidl)
+{
+ int nItem;
+ LVITEMW lvItem;
+
+ TRACE("(%p)(pidl=%p)\n", this, pidl);
+
+ nItem = LV_FindItemByPidl(pidl);
+
+ if ( -1 != nItem )
+ {
+ lvItem.mask = LVIF_IMAGE;
+ lvItem.iItem = nItem;
+ lvItem.iImage = SHMapPIDLToSystemImageListIndex(m_pSFParent, pidl, 0);
+ m_ListView.SetItem(&lvItem);
+ m_ListView.Update(nItem);
+ return TRUE;
+ }
+
+ return FALSE;
+}
+
/**********************************************************
* ShellView_FillList()
*
LRESULT CDefView::OnDestroy(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled)
{
- if (m_hMenu)
- DestroyMenu(m_hMenu);
- RevokeDragDrop(m_hWnd);
- SHChangeNotifyDeregister(m_hNotify);
- SHFree(m_pidlParent);
+ if (!m_Destroyed)
+ {
+ m_Destroyed = TRUE;
+ if (m_hMenu)
+ {
+ DestroyMenu(m_hMenu);
+ m_hMenu = NULL;
+ }
+ RevokeDragDrop(m_hWnd);
+ SHChangeNotifyDeregister(m_hNotify);
+ m_hNotify = NULL;
+ SHFree(m_pidlParent);
+ m_pidlParent = NULL;
+ }
bHandled = FALSE;
return 0;
}
return reinterpret_cast<LRESULT>(m_pShellBrowser.p);
}
+LRESULT CDefView::OnNCCreate(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled)
+{
+ this->AddRef();
+ bHandled = FALSE;
+ return 0;
+}
+
+LRESULT CDefView::OnNCDestroy(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled)
+{
+ this->Release();
+ bHandled = FALSE;
+ return 0;
+}
+
/**********************************************************
* ShellView_OnCreate()
*/
m_hAccel = LoadAcceleratorsW(shell32_hInstance, MAKEINTRESOURCEW(IDA_SHELLVIEW));
+ UpdateStatusbar();
+
return S_OK;
}
if (FAILED(hResult))
goto cleanup;
- hResult = IUnknown_SetSite(m_pCM, (IShellView *)this);
- //if (FAILED( hResult))
- // goto cleanup;
-
hResult = m_pCM->QueryContextMenu(hMenu, 0, 0x20, 0x7fff, CMF_DEFAULTONLY);
if (FAILED(hResult))
goto cleanup;
DestroyMenu(hMenu);
if (m_pCM)
- {
- IUnknown_SetSite(m_pCM, NULL);
m_pCM.Release();
- }
return hResult;
}
if (FAILED( hResult))
goto cleanup;
- hResult = IUnknown_SetSite(m_pCM, (IShellView *)this);
- //if (FAILED( hResult))
- // goto cleanup;
-
hResult = m_pCM->QueryContextMenu(hMenu, 0, FCIDM_SHVIEWFIRST, FCIDM_SHVIEWLAST, CMF_NORMAL);
if (FAILED( hResult))
goto cleanup;
cleanup:
if (m_pCM)
- {
- IUnknown_SetSite(m_pCM, NULL);
m_pCM.Release();
- }
if (hMenu)
DestroyMenu(hMenu);
if (FAILED( hResult))
goto cleanup;
- hResult = IUnknown_SetSite(m_pCM, (IShellView *)this);
- //if (FAILED( hResult))
- // goto cleanup;
-
hResult = m_pCM->QueryContextMenu(hMenu, 0, FCIDM_SHVIEWFIRST, FCIDM_SHVIEWLAST, CMF_NORMAL);
if (FAILED( hResult))
goto cleanup;
cleanup:
if (m_pCM)
- {
- IUnknown_SetSite(m_pCM, NULL);
m_pCM.Release();
- }
if (hMenu)
DestroyMenu(hMenu);
case LVN_ITEMCHANGED:
TRACE("-- LVN_ITEMCHANGED %p\n", this);
OnStateChange(CDBOSC_SELCHANGE); /* the browser will get the IDataObject now */
+ UpdateStatusbar();
break;
case LVN_BEGINDRAG:
case SHCNE_MKDIR:
case SHCNE_CREATE:
if (bParent0)
- LV_AddItem(ILFindLastID(Pidls[0]));
+ {
+ if (LV_FindItemByPidl(ILFindLastID(Pidls[0])) == -1)
+ {
+ LV_AddItem(ILFindLastID(Pidls[0]));
+ }
+ else
+ {
+ LV_ProdItem(ILFindLastID(Pidls[0]));
+ }
+ }
break;
case SHCNE_RMDIR:
else if (bParent0)
LV_DeleteItem(ILFindLastID(Pidls[0]));
else if (bParent1)
- LV_AddItem(ILFindLastID(Pidls[0]));
+ LV_AddItem(ILFindLastID(Pidls[1]));
break;
case SHCNE_UPDATEITEM:
TRACE("-- left=%i top=%i right=%i bottom=%i\n", prcView->left, prcView->top, prcView->right, prcView->bottom);
/* Validate the Shell Browser */
- if (psb == NULL)
+ if (psb == NULL || m_hWnd)
return E_UNEXPECTED;
/*set up the member variables*/
if (m_hMenu)
{
DestroyMenu(m_hMenu);
- m_hView = NULL;
+ m_hMenu = NULL;
}
if (m_ListView)
{
/* We are not above one of the listview's subitems. Bind to the parent folder's
* DropTarget interface. */
- hr = m_pSFParent->QueryInterface(IID_PPV_ARG(IDropTarget,&m_pCurDropTarget));
+ hr = m_pSFParent->CreateViewObject(NULL, IID_PPV_ARG(IDropTarget,&m_pCurDropTarget));
}
else
{
{
return ShellObjectCreatorInit<CDefView>(pFolder, IID_IShellView, newView);
}
+
+HRESULT WINAPI CDefView_Constructor(IShellFolder *pFolder, REFIID riid, LPVOID * ppvOut)
+{
+ return ShellObjectCreatorInit<CDefView>(pFolder, riid, ppvOut);
+}