bool CComparisonManager::CompareListings() { if (!m_pLeft || !m_pRight) return false; CFilterManager filters; if (filters.HasActiveFilters() && !filters.HasSameLocalAndRemoteFilters()) { m_pState->NotifyHandlers(STATECHANGE_COMPARISON); wxMessageBoxEx(_("Cannot compare directories, different filters for local and remote directories are enabled"), _("Directory comparison failed"), wxICON_EXCLAMATION); return false; } wxString error; if (!m_pLeft->CanStartComparison(&error)) { m_pState->NotifyHandlers(STATECHANGE_COMPARISON); wxMessageBoxEx(error, _("Directory comparison failed"), wxICON_EXCLAMATION); return false; } if (!m_pRight->CanStartComparison(&error)) { m_pState->NotifyHandlers(STATECHANGE_COMPARISON); wxMessageBoxEx(error, _("Directory comparison failed"), wxICON_EXCLAMATION); return false; } const int mode = COptions::Get()->GetOptionVal(OPTION_COMPARISONMODE); duration const threshold = duration::from_minutes( COptions::Get()->GetOptionVal(OPTION_COMPARISON_THRESHOLD) ); m_pLeft->m_pComparisonManager = this; m_pRight->m_pComparisonManager = this; m_isComparing = true; m_pState->NotifyHandlers(STATECHANGE_COMPARISON); m_pLeft->StartComparison(); m_pRight->StartComparison(); wxString localFile, remoteFile; bool localDir = false; bool remoteDir = false; wxLongLong localSize, remoteSize; CDateTime localDate, remoteDate; const int dirSortMode = COptions::Get()->GetOptionVal(OPTION_FILELIST_DIRSORT); const bool hide_identical = COptions::Get()->GetOptionVal(OPTION_COMPARE_HIDEIDENTICAL) != 0; bool gotLocal = m_pLeft->GetNextFile(localFile, localDir, localSize, localDate); bool gotRemote = m_pRight->GetNextFile(remoteFile, remoteDir, remoteSize, remoteDate); while (gotLocal && gotRemote) { int cmp = CompareFiles(dirSortMode, localFile, remoteFile, localDir, remoteDir); if (!cmp) { if (!mode) { const CComparableListing::t_fileEntryFlags flag = (localDir || localSize == remoteSize) ? CComparableListing::normal : CComparableListing::different; if (!hide_identical || flag != CComparableListing::normal || localFile == _T("..")) { m_pLeft->CompareAddFile(flag); m_pRight->CompareAddFile(flag); } } else { if (!localDate.IsValid() || !remoteDate.IsValid()) { if (!hide_identical || localDate.IsValid() || remoteDate.IsValid() || localFile == _T("..")) { const CComparableListing::t_fileEntryFlags flag = CComparableListing::normal; m_pLeft->CompareAddFile(flag); m_pRight->CompareAddFile(flag); } } else { CComparableListing::t_fileEntryFlags localFlag, remoteFlag; int dateCmp = localDate.Compare(remoteDate); if (dateCmp < 0) { localDate += threshold; } else if (dateCmp > 0 ) { remoteDate += threshold; } int adjustedDateCmp = localDate.Compare(remoteDate); if (dateCmp && dateCmp == -adjustedDateCmp) { dateCmp = 0; } localFlag = CComparableListing::normal; remoteFlag = CComparableListing::normal; if (dateCmp < 0 ) { remoteFlag = CComparableListing::newer; } else if (dateCmp > 0) { localFlag = CComparableListing::newer; } if (!hide_identical || localFlag != CComparableListing::normal || remoteFlag != CComparableListing::normal || localFile == _T("..")) { m_pLeft->CompareAddFile(localFlag); m_pRight->CompareAddFile(remoteFlag); } } } gotLocal = m_pLeft->GetNextFile(localFile, localDir, localSize, localDate); gotRemote = m_pRight->GetNextFile(remoteFile, remoteDir, remoteSize, remoteDate); continue; } if (cmp < 0) { m_pLeft->CompareAddFile(CComparableListing::lonely); m_pRight->CompareAddFile(CComparableListing::fill); gotLocal = m_pLeft->GetNextFile(localFile, localDir, localSize, localDate); } else { m_pLeft->CompareAddFile(CComparableListing::fill); m_pRight->CompareAddFile(CComparableListing::lonely); gotRemote = m_pRight->GetNextFile(remoteFile, remoteDir, remoteSize, remoteDate); } } while (gotLocal) { m_pLeft->CompareAddFile(CComparableListing::lonely); m_pRight->CompareAddFile(CComparableListing::fill); gotLocal = m_pLeft->GetNextFile(localFile, localDir, localSize, localDate); } while (gotRemote) { m_pLeft->CompareAddFile(CComparableListing::fill); m_pRight->CompareAddFile(CComparableListing::lonely); gotRemote = m_pRight->GetNextFile(remoteFile, remoteDir, remoteSize, remoteDate); } m_pRight->FinishComparison(); m_pLeft->FinishComparison(); return true; }
void CLocalListView::ApplyCurrentFilter() { CFilterManager filter; if (!filter.HasSameLocalAndRemoteFilters() && IsComparing()) ExitComparisonMode(); unsigned int min = m_hasParent ? 1 : 0; if (m_fileData.size() <= min) return; wxString focused; const std::list<wxString>& selectedNames = RememberSelectedItems(focused); if (m_pFilelistStatusBar) m_pFilelistStatusBar->UnselectAll(); wxLongLong totalSize; int unknown_sizes = 0; int totalFileCount = 0; int totalDirCount = 0; int hidden = 0; m_indexMapping.clear(); if (m_hasParent) m_indexMapping.push_back(0); for (unsigned int i = min; i < m_fileData.size(); i++) { const CLocalFileData& data = m_fileData[i]; if (data.flags == fill) continue; if (filter.FilenameFiltered(data.name, m_dir, data.dir, data.size, true, data.attributes, data.lastModified)) { hidden++; continue; } if (data.dir) totalDirCount++; else { if (data.size != -1) totalSize += data.size; else unknown_sizes++; totalFileCount++; } m_indexMapping.push_back(i); } SetItemCount(m_indexMapping.size()); if (m_pFilelistStatusBar) m_pFilelistStatusBar->SetDirectoryContents(totalFileCount, totalDirCount, totalSize, unknown_sizes, hidden); SortList(-1, -1, false); if (IsComparing()) { m_originalIndexMapping.clear(); RefreshComparison(); } ReselectItems(selectedNames, focused); if (!IsComparing()) RefreshListOnly(); }