bool CRemoteTreeView::HasSubdirs(const CDirectoryListing& listing, const CFilterManager& filter) { if (!listing.has_dirs()) return false; if (!filter.HasActiveFilters()) return true; const wxString path = listing.path.GetPath(); for (unsigned int i = 0; i < listing.GetCount(); i++) { if (!listing[i].is_dir()) continue; if (filter.FilenameFiltered(listing[i].name, path, true, -1, false, 0, listing[i].time)) continue; return true; } return false; }
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 CRemoteTreeView::ApplyFilters(bool resort) { std::list<struct _parents> parents; const wxTreeItemId root = GetRootItem(); wxTreeItemIdValue cookie; for (wxTreeItemId child = GetFirstChild(root, cookie); child; child = GetNextSibling(child)) { CServerPath path = GetPathFromItem(child); if (path.empty()) continue; struct _parents dir; dir.item = child; dir.path = path; parents.push_back(dir); } CFilterManager filter; while (!parents.empty()) { struct _parents parent = parents.back(); parents.pop_back(); if (resort) { SortChildren(parent.item); } CDirectoryListing listing; if (m_pState->m_pEngine->CacheLookup(parent.path, listing) == FZ_REPLY_OK) RefreshItem(parent.item, listing, false); else if (filter.HasActiveFilters()) { for (wxTreeItemId child = GetFirstChild(parent.item, cookie); child; child = GetNextSibling(child)) { CServerPath path = GetPathFromItem(child); if (path.empty()) continue; if (filter.FilenameFiltered(GetItemText(child), path.GetPath(), true, -1, false, 0, CDateTime())) { wxTreeItemId sel = GetSelection(); while (sel && sel != child) sel = GetItemParent(sel); if (!sel) { Delete(child); continue; } } struct _parents dir; dir.item = child; dir.path = path; parents.push_back(dir); } // The stuff below has already been done above in this one case continue; } for (wxTreeItemId child = GetFirstChild(parent.item, cookie); child; child = GetNextSibling(child)) { CServerPath path = GetPathFromItem(child); if (path.empty()) continue; struct _parents dir; dir.item = child; dir.path = path; parents.push_back(dir); } } }