void CFolderView::OnFileActionRenamedNewName(TCHAR *szFileName) { if(g_bNewFileRenamed) { /* The file that was previously added was renamed before it could be added. Add the file now. */ OnFileActionAdded(szFileName); g_bNewFileRenamed = FALSE; } else { RenameItem(iRenamedItem,szFileName); } }
void CShellBrowser::DirectoryAltered(void) { BOOL bNewItemCreated; EnterCriticalSection(&m_csDirectoryAltered); bNewItemCreated = m_bNewItemCreated; SendMessage(m_hListView,WM_SETREDRAW,(WPARAM)FALSE,(LPARAM)NULL); pantheios::log(pantheios::debug,_T("ShellBrowser - Starting directory change update for \""),m_CurDir,_T("\"")); /* Potential problem: After a file is created, it may be renamed shortly afterwards. If the rename occurs before the file is added here, the addition won't be registered (since technically, the file does not exist), and the rename operation will not take place. Adding an item that does not exist will corrupt the programs state. Solution: If a file does not exist when adding it, temporarily remember its filename. On the next rename operation, if the renamed file matches the name of the added file, add the file in-place with its new name. The operation should NOT be queued, as it is possible that other actions for the file will take place before the addition, which will again result in an incorrect state. */ for each(auto af in m_AlteredList) { /* Only undertake the modification if the unique folder index on the modified item and current folder match up (i.e. ensure the directory has not changed since these files were modified). */ if(af.iFolderIndex == m_iUniqueFolderIndex) { switch(af.dwAction) { case FILE_ACTION_ADDED: pantheios::log(pantheios::debug,_T("ShellBrowser - Adding \""),af.szFileName,_T("\"")); OnFileActionAdded(af.szFileName); break; case FILE_ACTION_MODIFIED: pantheios::log(pantheios::debug,_T("ShellBrowser - Modifying \""),af.szFileName,_T("\"")); ModifyItemInternal(af.szFileName); break; case FILE_ACTION_REMOVED: pantheios::log(pantheios::debug,_T("ShellBrowser - Removing \""),af.szFileName,_T("\"")); RemoveItemInternal(af.szFileName); break; case FILE_ACTION_RENAMED_OLD_NAME: pantheios::log(pantheios::debug,_T("ShellBrowser - Old name received \""),af.szFileName,_T("\"")); OnFileActionRenamedOldName(af.szFileName); break; case FILE_ACTION_RENAMED_NEW_NAME: pantheios::log(pantheios::debug,_T("ShellBrowser - New name received \""),af.szFileName,_T("\"")); OnFileActionRenamedNewName(af.szFileName); break; } } } pantheios::log(pantheios::debug,_T("ShellBrowser - Finished directory change update for \""),m_CurDir,_T("\"")); SendMessage(m_hListView,WM_SETREDRAW,(WPARAM)TRUE,(LPARAM)NULL); /* Ensure the first dropped item is visible. */ if(m_iDropped != -1) { if(!ListView_IsItemVisible(m_hListView,m_iDropped)) ListView_EnsureVisible(m_hListView,m_iDropped,TRUE); m_iDropped = -1; } SendMessage(m_hOwner,WM_USER_DIRECTORYMODIFIED,m_ID,0); if(bNewItemCreated && !m_bNewItemCreated) SendMessage(m_hOwner,WM_USER_NEWITEMINSERTED,0,m_iIndexNewItem); m_AlteredList.clear(); BOOL bFocusSet = FALSE; int iIndex; /* Select the specified items, and place the focus on the first item. */ auto itr = m_FileSelectionList.begin(); while(itr != m_FileSelectionList.end()) { iIndex = LocateFileItemIndex(itr->c_str()); if(iIndex != -1) { NListView::ListView_SelectItem(m_hListView,iIndex,TRUE); if(!bFocusSet) { NListView::ListView_FocusItem(m_hListView,iIndex,TRUE); ListView_EnsureVisible(m_hListView,iIndex,TRUE); bFocusSet = TRUE; } itr = m_FileSelectionList.erase(itr); } else { ++itr; } } LeaveCriticalSection(&m_csDirectoryAltered); return; }