本文整理汇总了C++中CFilterManager类的典型用法代码示例。如果您正苦于以下问题:C++ CFilterManager类的具体用法?C++ CFilterManager怎么用?C++ CFilterManager使用的例子?那么, 这里精选的类代码示例或许可以为您提供帮助。
在下文中一共展示了CFilterManager类的15个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: HasSubdir
wxString CLocalTreeView::HasSubdir(const wxString& dirname)
{
wxLogNull nullLog;
CFilterManager filter;
fz::local_filesys local_filesys;
if (!local_filesys.begin_find_files(fz::to_native(dirname), true))
return wxString();
fz::native_string file;
bool wasLink;
int attributes;
bool is_dir;
static int64_t const size(-1);
fz::datetime date;
while (local_filesys.get_next_file(file, wasLink, is_dir, 0, &date, &attributes)) {
wxASSERT(is_dir);
if (file.empty()) {
wxGetApp().DisplayEncodingWarning();
continue;
}
wxString file_wx = file;
if (filter.FilenameFiltered(file_wx, dirname, true, size, true, attributes, date))
continue;
return file_wx;
}
return wxString();
}
示例2: HasSubdir
wxString CLocalTreeView::HasSubdir(const wxString& dirname)
{
wxLogNull nullLog;
CFilterManager filter;
CLocalFileSystem local_filesystem;
if (!local_filesystem.BeginFindFiles(dirname, true))
return _T("");
wxString file;
bool wasLink;
int attributes;
bool is_dir;
const wxLongLong size(-1);
wxDateTime date;
while (local_filesystem.GetNextFile(file, wasLink, is_dir, 0, &date, &attributes))
{
wxASSERT(is_dir);
if (file == _T(""))
{
wxGetApp().DisplayEncodingWarning();
continue;
}
if (filter.FilenameFiltered(file, dirname, true, size, true, attributes, date.IsValid() ? &date : 0))
continue;
return file;
}
return _T("");
}
示例3: GetFirstChild
bool CLocalTreeView::CheckSubdirStatus(wxTreeItemId& item, const wxString& path)
{
wxTreeItemIdValue value;
wxTreeItemId child = GetFirstChild(item, value);
static const wxLongLong size(-1);
#ifdef __WXMAC__
// By default, OS X has a list of servers mounted into /net,
// listing that directory is slow.
if (GetItemParent(item) == GetRootItem() && (path == _T("/net") || path == _T("/net/")))
{
CFilterManager filter;
const int attributes = S_IRUSR | S_IXUSR | S_IRGRP | S_IXGRP | S_IROTH | S_IXOTH;
if (!filter.FilenameFiltered(_T("localhost"), path, true, size, true, attributes))
{
if (!child)
AppendItem(item, _T(""));
return true;
}
}
#endif
if (child)
{
if (GetItemText(child) != _T(""))
return false;
CTreeItemData* pData = (CTreeItemData*)GetItemData(child);
if (pData)
{
bool wasLink;
int attributes;
enum CLocalFileSystem::local_fileType type;
if (path.Last() == CLocalFileSystem::path_separator)
type = CLocalFileSystem::GetFileInfo(path + pData->m_known_subdir, wasLink, 0, 0, &attributes);
else
type = CLocalFileSystem::GetFileInfo(path + CLocalFileSystem::path_separator + pData->m_known_subdir, wasLink, 0, 0, &attributes);
if (type == CLocalFileSystem::dir)
{
CFilterManager filter;
if (!filter.FilenameFiltered(pData->m_known_subdir, path, true, size, true, attributes))
return true;
}
}
}
wxString sub = HasSubdir(path);
if (sub != _T(""))
{
wxTreeItemId subItem = AppendItem(item, _T(""));
SetItemData(subItem, new CTreeItemData(sub));
}
else if (child)
Delete(child);
return true;
}
示例4: wxBell
void CRemoteTreeView::OnMenuDownload(wxCommandEvent& event)
{
CLocalPath localDir = m_pState->GetLocalDir();
if (!localDir.IsWriteable())
{
wxBell();
return;
}
if (!m_pState->IsRemoteIdle())
return;
if (!m_contextMenuItem)
return;
const CServerPath& path = GetPathFromItem(m_contextMenuItem);
if (path.empty())
return;
const wxString& name = GetItemText(m_contextMenuItem);
localDir.AddSegment(CQueueView::ReplaceInvalidCharacters(name));
CRecursiveOperation* pRecursiveOperation = m_pState->GetRecursiveOperationHandler();
pRecursiveOperation->AddDirectoryToVisit(path, _T(""), localDir);
CServerPath currentPath;
const wxTreeItemId selected = GetSelection();
if (selected)
currentPath = GetPathFromItem(selected);
const bool addOnly = event.GetId() == XRCID("ID_ADDTOQUEUE");
CFilterManager filter;
pRecursiveOperation->StartRecursiveOperation(addOnly ? CRecursiveOperation::recursive_addtoqueue : CRecursiveOperation::recursive_download, path, filter.GetActiveFilters(false), true, currentPath);
}
示例5: HasSubdirs
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;
}
示例6: newPath
bool CState::DownloadDroppedFiles(const CRemoteDataObject* pRemoteDataObject, const CLocalPath& path, bool queueOnly /*=false*/)
{
bool hasDirs = false;
bool hasFiles = false;
const std::list<CRemoteDataObject::t_fileInfo>& files = pRemoteDataObject->GetFiles();
for (std::list<CRemoteDataObject::t_fileInfo>::const_iterator iter = files.begin(); iter != files.end(); ++iter)
{
if (iter->dir)
hasDirs = true;
else
hasFiles = true;
}
if (hasDirs)
{
if (!IsRemoteConnected() || !IsRemoteIdle())
return false;
}
if (hasFiles)
m_pMainFrame->GetQueue()->QueueFiles(queueOnly, path, *pRemoteDataObject);
if (!hasDirs)
return true;
for (std::list<CRemoteDataObject::t_fileInfo>::const_iterator iter = files.begin(); iter != files.end(); ++iter)
{
if (!iter->dir)
continue;
CLocalPath newPath(path);
newPath.AddSegment(CQueueView::ReplaceInvalidCharacters(iter->name));
m_pRecursiveOperation->AddDirectoryToVisit(pRemoteDataObject->GetServerPath(), iter->name, newPath, iter->link);
}
if (m_pComparisonManager->IsComparing())
m_pComparisonManager->ExitComparisonMode();
CFilterManager filter;
m_pRecursiveOperation->StartRecursiveOperation(queueOnly ? CRecursiveOperation::recursive_addtoqueue : CRecursiveOperation::recursive_download, pRemoteDataObject->GetServerPath(), filter.GetActiveFilters(false));
return true;
}
示例7: GetPathFromItem
void CRemoteTreeView::OnMenuDelete(wxCommandEvent&)
{
if (!m_pState->IsRemoteIdle())
return;
if (!m_contextMenuItem)
return;
const CServerPath& path = GetPathFromItem(m_contextMenuItem);
if (path.empty())
return;
if (wxMessageBoxEx(_("Really delete all selected files and/or directories from the server?"), _("Confirmation needed"), wxICON_QUESTION | wxYES_NO, this) != wxYES)
return;
const bool hasParent = path.HasParent();
CRecursiveOperation* pRecursiveOperation = m_pState->GetRecursiveOperationHandler();
CServerPath startDir;
if (hasParent)
{
const wxString& name = GetItemText(m_contextMenuItem);
startDir = path.GetParent();
pRecursiveOperation->AddDirectoryToVisit(startDir, name);
}
else
{
startDir = path;
pRecursiveOperation->AddDirectoryToVisit(startDir, _T(""));
}
CServerPath currentPath;
const wxTreeItemId selected = GetSelection();
if (selected)
currentPath = GetPathFromItem(selected);
if (!currentPath.empty() && (path == currentPath || path.IsParentOf(currentPath, false)))
currentPath = startDir;
CFilterManager filter;
pRecursiveOperation->StartRecursiveOperation(CRecursiveOperation::recursive_delete, startDir, filter.GetActiveFilters(false), !hasParent, currentPath);
}
示例8: CompareListings
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);
//.........这里部分代码省略.........
示例9: StopRecursiveOperation
void CRemoteRecursiveOperation::ProcessDirectoryListing(const CDirectoryListing* pDirectoryListing)
{
if (!pDirectoryListing) {
StopRecursiveOperation();
return;
}
if (m_operationMode == recursive_none || recursion_roots_.empty())
return;
if (pDirectoryListing->failed()) {
// Ignore this.
// It will get handled by the failed command in ListingFailed
return;
}
auto & root = recursion_roots_.front();
wxASSERT(!root.m_dirsToVisit.empty());
if (!m_state.IsRemoteConnected() || root.m_dirsToVisit.empty()) {
StopRecursiveOperation();
return;
}
recursion_root::new_dir dir = root.m_dirsToVisit.front();
root.m_dirsToVisit.pop_front();
if (!BelowRecursionRoot(pDirectoryListing->path, dir)) {
NextOperation();
return;
}
if (m_operationMode == recursive_delete && dir.doVisit && !dir.subdir.empty()) {
// After recursing into directory to delete its contents, delete directory itself
// Gets handled in NextOperation
recursion_root::new_dir dir2 = dir;
dir2.doVisit = false;
root.m_dirsToVisit.push_front(dir2);
}
if (dir.link && !dir.recurse) {
NextOperation();
return;
}
// Check if we have already visited the directory
if (!root.m_visitedDirs.insert(pDirectoryListing->path).second) {
NextOperation();
return;
}
++m_processedDirectories;
const CServer* pServer = m_state.GetServer();
wxASSERT(pServer);
if (!pDirectoryListing->GetCount()) {
if (m_operationMode == recursive_transfer) {
wxFileName::Mkdir(dir.localDir.GetPath(), 0777, wxPATH_MKDIR_FULL);
m_state.RefreshLocalFile(dir.localDir.GetPath());
}
else if (m_operationMode == recursive_addtoqueue) {
m_pQueue->QueueFile(true, true, _T(""), _T(""), dir.localDir, CServerPath(), *pServer, -1);
m_pQueue->QueueFile_Finish(false);
}
}
CFilterManager filter;
// Is operation restricted to a single child?
bool const restrict = static_cast<bool>(dir.restrict);
std::deque<wxString> filesToDelete;
const wxString path = pDirectoryListing->path.GetPath();
bool added = false;
for (int i = pDirectoryListing->GetCount() - 1; i >= 0; --i) {
const CDirentry& entry = (*pDirectoryListing)[i];
if (restrict) {
if (entry.name != *dir.restrict)
continue;
}
else if (filter.FilenameFiltered(m_filters, entry.name, path, entry.is_dir(), entry.size, 0, entry.time))
continue;
if (!entry.is_dir()) {
++m_processedFiles;
}
if (entry.is_dir() && (!entry.is_link() || m_operationMode != recursive_delete)) {
if (dir.recurse) {
recursion_root::new_dir dirToVisit;
dirToVisit.parent = pDirectoryListing->path;
dirToVisit.subdir = entry.name;
dirToVisit.localDir = dir.localDir;
dirToVisit.start_dir = dir.start_dir;
//.........这里部分代码省略.........
示例10: StopRecursiveOperation
void CRemoteRecursiveOperation::ProcessDirectoryListing(const CDirectoryListing* pDirectoryListing)
{
if (!pDirectoryListing) {
StopRecursiveOperation();
return;
}
if (m_operationMode == recursive_none || recursion_roots_.empty())
return;
if (pDirectoryListing->failed()) {
// Ignore this.
// It will get handled by the failed command in ListingFailed
return;
}
auto & root = recursion_roots_.front();
wxASSERT(!root.m_dirsToVisit.empty());
if (!m_state.IsRemoteConnected() || root.m_dirsToVisit.empty()) {
StopRecursiveOperation();
return;
}
recursion_root::new_dir dir = root.m_dirsToVisit.front();
root.m_dirsToVisit.pop_front();
if (!BelowRecursionRoot(pDirectoryListing->path, dir)) {
NextOperation();
return;
}
if (m_operationMode == recursive_delete && dir.doVisit && !dir.subdir.empty()) {
// After recursing into directory to delete its contents, delete directory itself
// Gets handled in NextOperation
recursion_root::new_dir dir2 = dir;
dir2.doVisit = false;
root.m_dirsToVisit.push_front(dir2);
}
if (dir.link && !dir.recurse) {
NextOperation();
return;
}
// Check if we have already visited the directory
if (!root.m_visitedDirs.insert(pDirectoryListing->path).second) {
NextOperation();
return;
}
++m_processedDirectories;
const CServer* pServer = m_state.GetServer();
wxASSERT(pServer);
if (!pDirectoryListing->GetCount() && m_operationMode == recursive_transfer) {
if (m_immediate) {
wxFileName::Mkdir(dir.localDir.GetPath(), 0777, wxPATH_MKDIR_FULL);
m_state.RefreshLocalFile(dir.localDir.GetPath());
}
else {
m_pQueue->QueueFile(true, true, _T(""), _T(""), dir.localDir, CServerPath(), *pServer, -1);
m_pQueue->QueueFile_Finish(false);
}
}
CFilterManager filter;
// Is operation restricted to a single child?
bool const restrict = static_cast<bool>(dir.restrict);
std::deque<std::wstring> filesToDelete;
std::wstring const remotePath = pDirectoryListing->path.GetPath();
if (m_operationMode == recursive_synchronize_download && !dir.localDir.empty()) {
// Step one in synchronization: Delete local files not on the server
fz::local_filesys fs;
if (fs.begin_find_files(fz::to_native(dir.localDir.GetPath()))) {
std::list<fz::native_string> paths_to_delete;
bool isLink{};
fz::native_string name;
bool isDir{};
int64_t size{};
fz::datetime time;
int attributes{};
while (fs.get_next_file(name, isLink, isDir, &size, &time, &attributes)) {
if (isLink) {
continue;
}
auto const wname = fz::to_wstring(name);
if (filter.FilenameFiltered(m_filters.first, wname, dir.localDir.GetPath(), isDir, size, attributes, time)) {
continue;
}
// Local item isn't filtered
int remoteIndex = pDirectoryListing->FindFile_CmpCase(fz::to_wstring(name));
//.........这里部分代码省略.........
示例11: GetSubdir
void CLocalTreeView::DisplayDir(wxTreeItemId parent, const wxString& dirname, const wxString& knownSubdir /*=_T("")*/)
{
fz::local_filesys local_filesys;
{
wxLogNull log;
if (!local_filesys.begin_find_files(fz::to_native(dirname), true)) {
if (!knownSubdir.empty()) {
wxTreeItemId item = GetSubdir(parent, knownSubdir);
if (item != wxTreeItemId())
return;
const wxString fullName = dirname + knownSubdir;
item = AppendItem(parent, knownSubdir, GetIconIndex(iconType::dir, fullName),
#ifdef __WXMSW__
-1
#else
GetIconIndex(iconType::opened_dir, fullName)
#endif
);
CheckSubdirStatus(item, fullName);
}
else
{
m_setSelection = true;
DeleteChildren(parent);
m_setSelection = false;
}
return;
}
}
wxASSERT(parent);
m_setSelection = true;
DeleteChildren(parent);
m_setSelection = false;
CFilterManager filter;
bool matchedKnown = false;
fz::native_string file;
bool wasLink;
int attributes;
bool is_dir;
static int64_t const size(-1);
fz::datetime date;
while (local_filesys.get_next_file(file, wasLink, is_dir, 0, &date, &attributes)) {
wxASSERT(is_dir);
if (file.empty()) {
wxGetApp().DisplayEncodingWarning();
continue;
}
wxString file_wx = file;
wxString fullName = dirname + file_wx;
#ifdef __WXMSW__
if (file_wx.CmpNoCase(knownSubdir))
#else
if (file_wx != knownSubdir)
#endif
{
if (filter.FilenameFiltered(file_wx, dirname, true, size, true, attributes, date))
continue;
}
else
matchedKnown = true;
wxTreeItemId item = AppendItem(parent, file_wx, GetIconIndex(iconType::dir, fullName),
#ifdef __WXMSW__
-1
#else
GetIconIndex(iconType::opened_dir, fullName)
#endif
);
CheckSubdirStatus(item, fullName);
}
if (!matchedKnown && !knownSubdir.empty()) {
const wxString fullName = dirname + knownSubdir;
wxTreeItemId item = AppendItem(parent, knownSubdir, GetIconIndex(iconType::dir, fullName),
#ifdef __WXMSW__
-1
#else
GetIconIndex(iconType::opened_dir, fullName)
#endif
);
CheckSubdirStatus(item, fullName);
}
SortChildren(parent);
}
示例12: SetErrorMode
void CLocalTreeView::Refresh()
{
wxLogNull nullLog;
const wxString separator = wxFileName::GetPathSeparator();
std::list<t_dir> dirsToCheck;
#ifdef __WXMSW__
int prevErrorMode = SetErrorMode(SEM_FAILCRITICALERRORS);
wxTreeItemIdValue tmp;
wxTreeItemId child = GetFirstChild(m_drives, tmp);
while (child)
{
if (IsExpanded(child))
{
wxString drive = GetItemText(child);
int pos = drive.Find(_T(" "));
if (pos != -1)
drive = drive.Left(pos);
t_dir dir;
dir.dir = drive + separator;
dir.item = child;
dirsToCheck.push_back(dir);
}
child = GetNextSibling(child);
}
#else
t_dir dir;
dir.dir = separator;
dir.item = GetRootItem();
dirsToCheck.push_back(dir);
#endif
CFilterManager filter;
while (!dirsToCheck.empty())
{
t_dir dir = dirsToCheck.front();
dirsToCheck.pop_front();
// Step 1: Check if directory exists
CLocalFileSystem local_filesystem;
if (!local_filesystem.BeginFindFiles(dir.dir, true))
{
// Dir does exist (listed in parent) but may not be accessible.
// Recurse into children anyhow, they might be accessible again.
wxTreeItemIdValue value;
wxTreeItemId child = GetFirstChild(dir.item, value);
while (child)
{
t_dir subdir;
subdir.dir = dir.dir + GetItemText(child) + separator;
subdir.item = child;
dirsToCheck.push_back(subdir);
child = GetNextSibling(child);
}
continue;
}
// Step 2: Enumerate subdirectories on disk and sort them
std::list<wxString> dirs;
wxString file;
const wxLongLong size(-1);
bool was_link;
bool is_dir;
int attributes;
wxDateTime date;
while (local_filesystem.GetNextFile(file, was_link, is_dir, 0, &date, &attributes))
{
if (file == _T(""))
{
wxGetApp().DisplayEncodingWarning();
continue;
}
if (filter.FilenameFiltered(file, dir.dir, true, size, true, attributes, date.IsValid() ? &date : 0))
continue;
dirs.push_back(file);
}
dirs.sort(sortfunc);
bool inserted = false;
// Step 3: Merge list of subdirectories with subtree.
wxTreeItemId child = GetLastChild(dir.item);
std::list<wxString>::reverse_iterator iter = dirs.rbegin();
while (child || iter != dirs.rend())
{
int cmp;
if (child && iter != dirs.rend())
#ifdef __WXMSW__
cmp = GetItemText(child).CmpNoCase(*iter);
#else
//.........这里部分代码省略.........
示例13: GetSubdir
void CLocalTreeView::DisplayDir(wxTreeItemId parent, const wxString& dirname, const wxString& knownSubdir /*=_T("")*/)
{
CLocalFileSystem local_filesystem;
{
wxLogNull log;
if (!local_filesystem.BeginFindFiles(dirname, true))
{
if (knownSubdir != _T(""))
{
wxTreeItemId item = GetSubdir(parent, knownSubdir);
if (item != wxTreeItemId())
return;
const wxString fullName = dirname + knownSubdir;
item = AppendItem(parent, knownSubdir, GetIconIndex(::dir, fullName),
#ifdef __WXMSW__
-1
#else
GetIconIndex(opened_dir, fullName)
#endif
);
CheckSubdirStatus(item, fullName);
}
else
{
m_setSelection = true;
DeleteChildren(parent);
m_setSelection = false;
}
return;
}
}
wxASSERT(parent);
m_setSelection = true;
DeleteChildren(parent);
m_setSelection = false;
CFilterManager filter;
bool matchedKnown = false;
wxString file;
bool wasLink;
int attributes;
bool is_dir;
const wxLongLong size(-1);
wxDateTime date;
while (local_filesystem.GetNextFile(file, wasLink, is_dir, 0, &date, &attributes))
{
wxASSERT(is_dir);
if (file == _T(""))
{
wxGetApp().DisplayEncodingWarning();
continue;
}
wxString fullName = dirname + file;
#ifdef __WXMSW__
if (file.CmpNoCase(knownSubdir))
#else
if (file != knownSubdir)
#endif
{
if (filter.FilenameFiltered(file, dirname, true, size, true, attributes, date.IsValid() ? &date : 0))
continue;
}
else
matchedKnown = true;
wxTreeItemId item = AppendItem(parent, file, GetIconIndex(::dir, fullName),
#ifdef __WXMSW__
-1
#else
GetIconIndex(opened_dir, fullName)
#endif
);
CheckSubdirStatus(item, fullName);
}
if (!matchedKnown && knownSubdir != _T(""))
{
const wxString fullName = dirname + knownSubdir;
wxTreeItemId item = AppendItem(parent, knownSubdir, GetIconIndex(::dir, fullName),
#ifdef __WXMSW__
-1
#else
GetIconIndex(opened_dir, fullName)
#endif
);
CheckSubdirStatus(item, fullName);
}
SortChildren(parent);
}
示例14: SetItemImages
void CRemoteTreeView::RefreshItem(wxTreeItemId parent, const CDirectoryListing& listing, bool will_select_parent)
{
SetItemImages(parent, false);
wxTreeItemIdValue cookie;
wxTreeItemId child = GetFirstChild(parent, cookie);
if (!child || GetItemText(child) == _T(""))
{
DisplayItem(parent, listing);
return;
}
CFilterManager filter;
const wxString path = listing.path.GetPath();
std::list<wxString> dirs;
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].has_date() ? &listing[i].time : 0))
dirs.push_back(listing[i].name);
}
dirs.sort(sortfunc);
bool inserted = false;
child = GetLastChild(parent);
std::list<wxString>::reverse_iterator iter = dirs.rbegin();
while (child && iter != dirs.rend())
{
int cmp = GetItemText(child).CmpNoCase(*iter);
if (!cmp)
cmp = GetItemText(child).Cmp(*iter);
if (!cmp)
{
CServerPath path = listing.path;
path.AddSegment(*iter);
CDirectoryListing subListing;
if (m_pState->m_pEngine->CacheLookup(path, subListing) == FZ_REPLY_OK)
{
if (!GetLastChild(child) && HasSubdirs(subListing, filter))
AppendItem(child, _T(""), -1, -1);
SetItemImages(child, false);
}
else
SetItemImages(child, true);
child = GetPrevSibling(child);
iter++;
}
else if (cmp > 0)
{
// Child no longer exists
wxTreeItemId sel = GetSelection();
while (sel && sel != child)
sel = GetItemParent(sel);
wxTreeItemId prev = GetPrevSibling(child);
if (!sel || will_select_parent)
Delete(child);
child = prev;
}
else if (cmp < 0)
{
// New directory
CServerPath path = listing.path;
path.AddSegment(*iter);
CDirectoryListing subListing;
if (m_pState->m_pEngine->CacheLookup(path, subListing) == FZ_REPLY_OK)
{
wxTreeItemId child = AppendItem(parent, *iter, 0, 2, 0);
SetItemImages(child, false);
if (HasSubdirs(subListing, filter))
AppendItem(child, _T(""), -1, -1);
}
else
{
wxTreeItemId child = AppendItem(parent, *iter, 1, 3, 0);
if (child)
SetItemImages(child, true);
}
iter++;
inserted = true;
}
}
while (child)
{
// Child no longer exists
wxTreeItemId sel = GetSelection();
while (sel && sel != child)
sel = GetItemParent(sel);
wxTreeItemId prev = GetPrevSibling(child);
if (!sel || will_select_parent)
//.........这里部分代码省略.........
示例15: SetItemImages
void CRemoteTreeView::RefreshItem(wxTreeItemId parent, const CDirectoryListing& listing, bool will_select_parent)
{
SetItemImages(parent, false);
wxTreeItemIdValue cookie;
wxTreeItemId child = GetFirstChild(parent, cookie);
if (!child || GetItemText(child).empty()) {
DisplayItem(parent, listing);
return;
}
CFilterManager filter;
wxString const path = listing.path.GetPath();
wxArrayString dirs;
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))
dirs.push_back(listing[i].name);
}
auto const& sortFunc = CFileListCtrlSortBase::GetCmpFunction(m_nameSortMode);
dirs.Sort(sortFunc);
bool inserted = false;
child = GetLastChild(parent);
wxArrayString::reverse_iterator iter = dirs.rbegin();
while (child && iter != dirs.rend()) {
int cmp = sortFunc(GetItemText(child), *iter);
if (!cmp) {
CServerPath childPath = listing.path;
childPath.AddSegment(*iter);
CDirectoryListing subListing;
if (m_pState->m_pEngine->CacheLookup(childPath, subListing) == FZ_REPLY_OK) {
if (!GetLastChild(child) && HasSubdirs(subListing, filter))
AppendItem(child, _T(""), -1, -1);
SetItemImages(child, false);
}
else
SetItemImages(child, true);
child = GetPrevSibling(child);
++iter;
}
else if (cmp > 0) {
// Child no longer exists
wxTreeItemId sel = GetSelection();
while (sel && sel != child)
sel = GetItemParent(sel);
wxTreeItemId prev = GetPrevSibling(child);
if (!sel || will_select_parent)
Delete(child);
child = prev;
}
else if (cmp < 0) {
// New directory
CServerPath childPath = listing.path;
childPath.AddSegment(*iter);
CDirectoryListing subListing;
if (m_pState->m_pEngine->CacheLookup(childPath, subListing) == FZ_REPLY_OK) {
wxTreeItemId childItem = AppendItem(parent, *iter, 0, 2, 0);
if (childItem) {
SetItemImages(childItem, false);
if (HasSubdirs(subListing, filter)) {
AppendItem(childItem, _T(""), -1, -1);
}
}
}
else {
wxTreeItemId childItem = AppendItem(parent, *iter, 1, 3, 0);
if (childItem) {
SetItemImages(childItem, true);
}
}
++iter;
inserted = true;
}
}
while (child) {
// Child no longer exists
wxTreeItemId sel = GetSelection();
while (sel && sel != child)
sel = GetItemParent(sel);
wxTreeItemId prev = GetPrevSibling(child);
if (!sel || will_select_parent)
Delete(child);
child = prev;
}
while (iter != dirs.rend()) {
CServerPath childPath = listing.path;
childPath.AddSegment(*iter);
//.........这里部分代码省略.........