void CShellBrowser::OnFileActionAdded(const TCHAR *szFileName) { IShellFolder *pShellFolder = NULL; LPITEMIDLIST pidlFull = NULL; LPITEMIDLIST pidlRelative = NULL; Added_t Added; TCHAR FullFileName[MAX_PATH]; TCHAR szDisplayName[MAX_PATH]; STRRET str; BOOL bFileAdded = FALSE; HRESULT hr; StringCchCopy(FullFileName,SIZEOF_ARRAY(FullFileName),m_CurDir); PathAppend(FullFileName,szFileName); hr = GetIdlFromParsingName(FullFileName,&pidlFull); /* It is possible that by the time a file is registered here, it will have already been renamed. In this the following check will fail. If the file is not added, store its filename. */ if(SUCCEEDED(hr)) { hr = SHBindToParent(pidlFull, IID_PPV_ARGS(&pShellFolder), (LPCITEMIDLIST *)&pidlRelative); if(SUCCEEDED(hr)) { /* If this is a virtual folder, only use SHGDN_INFOLDER. If this is a real folder, combine SHGDN_INFOLDER with SHGDN_FORPARSING. This is so that items in real folders can still be shown with extensions, even if the global, Explorer option is disabled. */ if(m_bVirtualFolder) hr = pShellFolder->GetDisplayNameOf(pidlRelative,SHGDN_INFOLDER,&str); else hr = pShellFolder->GetDisplayNameOf(pidlRelative,SHGDN_INFOLDER|SHGDN_FORPARSING,&str); if(SUCCEEDED(hr)) { StrRetToBuf(&str,pidlRelative,szDisplayName,SIZEOF_ARRAY(szDisplayName)); std::list<DroppedFile_t>::iterator itr; BOOL bDropped = FALSE; if(!m_DroppedFileNameList.empty()) { for(itr = m_DroppedFileNameList.begin();itr != m_DroppedFileNameList.end();itr++) { if(lstrcmp(szDisplayName,itr->szFileName) == 0) { bDropped = TRUE; break; } } } /* Only insert the item in its sorted position if it wasn't dropped in. */ if(m_bInsertSorted && !bDropped) { int iItemId; int iSorted; iItemId = SetItemInformation(m_pidlDirectory,pidlRelative,szDisplayName); iSorted = DetermineItemSortedPosition(iItemId); AddItemInternal(iSorted,iItemId,TRUE); } else { /* Just add the item to the end of the list. */ AddItemInternal(m_pidlDirectory,pidlRelative,szDisplayName,-1,FALSE); } InsertAwaitingItems(m_bShowInGroups); bFileAdded = TRUE; } pShellFolder->Release(); } CoTaskMemFree(pidlFull); } if(!bFileAdded) { /* The file does not exist. However, it is possible that is was simply renamed shortly after been created. Record the filename temporarily (so that it can later be added). */ StringCchCopy(Added.szFileName,SIZEOF_ARRAY(Added.szFileName),szFileName); m_FilesAdded.push_back(Added); } }
HRESULT CShellBrowser::BrowseFolder(LPCITEMIDLIST pidlDirectory,UINT wFlags) { SetCursor(LoadCursor(NULL,IDC_WAIT)); LPITEMIDLIST pidl = ILClone(pidlDirectory); if(m_bFolderVisited) { SaveColumnWidths(); } /* The path may not be absolute, in which case it will need to be completed. */ BOOL StoreHistory = TRUE; HRESULT hr = ParsePath(&pidl,wFlags,&StoreHistory); if(hr != S_OK) { SetCursor(LoadCursor(NULL,IDC_ARROW)); return E_FAIL; } EmptyIconFinderQueue(); EmptyThumbnailsQueue(); EmptyColumnQueue(); EmptyFolderQueue(); /* TODO: Wait for any background threads to finish processing. */ EnterCriticalSection(&m_csDirectoryAltered); m_FilesAdded.clear(); m_FileSelectionList.clear(); LeaveCriticalSection(&m_csDirectoryAltered); TCHAR szParsingPath[MAX_PATH]; GetDisplayName(pidl,szParsingPath,SIZEOF_ARRAY(szParsingPath),SHGDN_FORPARSING); /* TODO: Method callback. */ SendMessage(m_hOwner,WM_USER_STARTEDBROWSING,m_ID,reinterpret_cast<WPARAM>(szParsingPath)); StringCchCopy(m_CurDir,SIZEOF_ARRAY(m_CurDir),szParsingPath); if(StoreHistory) { m_pPathManager->StoreIdl(pidl); } if(m_bFolderVisited) { ResetFolderMemoryAllocations(); } m_nTotalItems = 0; BrowseVirtualFolder(pidl); CoTaskMemFree(pidl); /* Stop the list view from redrawing itself each time is inserted. Redrawing will be allowed once all items have being inserted. (reduces lag when a large number of items are going to be inserted). */ SendMessage(m_hListView,WM_SETREDRAW,FALSE,NULL); ListView_DeleteAllItems(m_hListView); /* Window updates needs these to be set. */ m_NumFilesSelected = 0; m_NumFoldersSelected = 0; m_ulTotalDirSize.QuadPart = 0; m_ulFileSelectionSize.QuadPart = 0; SetActiveColumnSet(); SetCurrentViewModeInternal(m_ViewMode); InsertAwaitingItems(FALSE); VerifySortMode(); SortFolder(m_SortMode); ListView_EnsureVisible(m_hListView,0,FALSE); /* Allow the listview to redraw itself once again. */ SendMessage(m_hListView,WM_SETREDRAW,TRUE,NULL); m_bFolderVisited = TRUE; SetCursor(LoadCursor(NULL,IDC_ARROW)); m_iUniqueFolderIndex++; return S_OK; }