// タブの追加 void CMainWindow::onAddTab(wxCommandEvent& event) { CChatServiceBase* contents = m_serviceHolder->getService( m_serviceHolder->getCurrentServiceId()); if (contents == NULL || contents->getCurrentChannel() == ""){ return; } CChannelStatus* channel = contents->getChannel( contents->getCurrentChannel()); vector<wxString> userNames; vector<CMemberData*> members = channel->getMembers(); vector<CMemberData*>::iterator it = members.begin(); while (it != members.end()){ userNames.push_back((*it)->m_nick); it++; } // ダイアログを表示 CFilterDialog dialog; dialog.init(this, contents->getCurrentChannel(), userNames); if (dialog.ShowModal() == wxID_OK){ IFilter* filter = dialog.getFilter(); if (filter != NULL){ contents->getConfiguration()->addFilter( contents->getCurrentChannel(), filter); updateMessageView(m_serviceHolder->getCurrentServiceId(), contents->getCurrentChannel()); } } }
bool CLocalTreeView::HasSubdir(const wxString& dirname) { wxLogNull nullLog; wxDir dir(dirname); if (!dir.IsOpened()) return false; CFilterDialog filter; wxString file; for (bool found = dir.GetFirst(&file, _T(""), wxDIR_DIRS | wxDIR_HIDDEN); found; found = dir.GetNext(&file)) { int attributes; #ifdef __WXMSW__ DWORD tmp = GetFileAttributes(dirname + wxFileName::GetPathSeparator() + file); if (tmp == INVALID_FILE_ATTRIBUTES) attributes = 0; else attributes = tmp; #else wxStructStat buf; const int result = wxLstat(dirname + file, &buf); if (!result) attributes = buf.st_mode & 0x777; else attributes = -1; #endif //__WXMSWMM if (!filter.FilenameFiltered(file, true, -1, true, attributes)) return true; } return false; }
void CRemoteTreeView::DisplayItem(wxTreeItemId parent, const CDirectoryListing& listing) { DeleteChildren(parent); const wxString path = listing.path.GetPath(); CFilterDialog filter; 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; const wxString& name = listing[i].name; CServerPath subdir = listing.path; subdir.AddSegment(name); CDirectoryListing subListing; if (m_pState->m_pEngine->CacheLookup(subdir, subListing) == FZ_REPLY_OK) { wxTreeItemId child = AppendItem(parent, name, 0, 2, 0); SetItemImages(child, false); if (HasSubdirs(subListing, filter)) AppendItem(child, _T(""), -1, -1); } else { wxTreeItemId child = AppendItem(parent, name, 1, 3, 0); SetItemImages(child, true); } } SortChildren(parent); }
void CLocalListView::ApplyCurrentFilter() { unsigned int min = m_hasParent ? 1 : 0; if (m_fileData.size() <= min) return; wxString focused; const std::list<wxString>& selectedNames = RememberSelectedItems(focused); CFilterDialog filter; m_indexMapping.clear(); m_indexMapping.push_back(0); for (unsigned int i = min; i < m_fileData.size(); i++) { const t_fileData& data = m_fileData[i]; if (!filter.FilenameFiltered(data.name, data.dir, data.size, true)) m_indexMapping.push_back(i); } SetItemCount(m_indexMapping.size()); SortList(); ReselectItems(selectedNames, focused); }
void CRecursiveOperation::ProcessDirectoryListing(const CDirectoryListing* pDirectoryListing) { if (!pDirectoryListing) { StopRecursiveOperation(); return; } if (m_operationMode == recursive_none) return; wxASSERT(!m_dirsToVisit.empty()); if (!m_pState->IsRemoteConnected() || m_dirsToVisit.empty()) { StopRecursiveOperation(); return; } CNewDir dir = m_dirsToVisit.front(); m_dirsToVisit.pop_front(); if (!pDirectoryListing->path.IsSubdirOf(m_startDir, false)) { // In some cases (chmod from tree for example) it is neccessary to list the // parent first if (pDirectoryListing->path != m_startDir || !m_allowParent) { NextOperation(); return; } } if (m_operationMode == recursive_delete && dir.doVisit && dir.subdir != _T("")) { // After recursing into directory to delete its contents, delete directory itself // Gets handled in NextOperation CNewDir dir2 = dir; dir2.doVisit = false; m_dirsToVisit.push_front(dir2); } // Check if we have already visited the directory for (std::list<CServerPath>::const_iterator iter = m_visitedDirs.begin(); iter != m_visitedDirs.end(); iter++) { if (*iter == pDirectoryListing->path) { NextOperation(); return; } } m_visitedDirs.push_back(pDirectoryListing->path); const CServer* pServer = m_pState->GetServer(); wxASSERT(pServer); if (!pDirectoryListing->GetCount()) { wxFileName fn(dir.localDir, _T("")); if (m_operationMode == recursive_download) { wxFileName::Mkdir(fn.GetPath(), 0777, wxPATH_MKDIR_FULL); m_pState->RefreshLocalFile(fn.GetFullPath()); } else if (m_operationMode == recursive_addtoqueue) m_pQueue->QueueFile(true, true, fn.GetFullPath(), _T(""), CServerPath(), *pServer, -1); } CFilterDialog filter; // Is operation restricted to a single child? bool restrict = !dir.restrict.IsEmpty(); 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(entry.name, entry.dir, entry.size, false)) continue; if (entry.dir && !entry.link) { if (dir.recurse) { CNewDir dirToVisit; wxFileName fn(dir.localDir, _T("")); fn.AppendDir(entry.name); dirToVisit.parent = pDirectoryListing->path; dirToVisit.subdir = entry.name; dirToVisit.localDir = fn.GetFullPath(); dirToVisit.doVisit = true; m_dirsToVisit.push_front(dirToVisit); } } else { switch (m_operationMode) { case recursive_addtoqueue: case recursive_download: { wxFileName fn(dir.localDir, entry.name); m_pQueue->QueueFile(m_operationMode == recursive_addtoqueue, true, fn.GetFullPath(), entry.name, pDirectoryListing->path, *pServer, entry.size); } break; case recursive_delete: m_pState->m_pCommandQueue->ProcessCommand(new CDeleteCommand(pDirectoryListing->path, entry.name)); break; default: break; } } if (m_operationMode == recursive_chmod && m_pChmodDlg) { const int applyType = m_pChmodDlg->GetApplyType(); if (!applyType || (!entry.dir && applyType == 1) || (entry.dir && applyType == 2)) { char permissions[9]; bool res = m_pChmodDlg->ConvertPermissions(entry.permissions, permissions); wxString newPerms = m_pChmodDlg->GetPermissions(res ? permissions : 0); m_pState->m_pCommandQueue->ProcessCommand(new CChmodCommand(pDirectoryListing->path, entry.name, newPerms)); } } } NextOperation(); }
bool CLocalListView::DisplayDir(wxString dirname) { wxString focused; std::list<wxString> selectedNames; if (m_dir != dirname) { // Clear selection int item = -1; while (true) { item = GetNextItem(item, wxLIST_NEXT_ALL, wxLIST_STATE_SELECTED | wxLIST_STATE_FOCUSED); if (item == -1) break; SetItemState(item, 0, wxLIST_STATE_SELECTED | wxLIST_STATE_FOCUSED); } focused = _T(".."); if (GetItemCount()) EnsureVisible(0); m_dir = dirname; } else { // Remember which items were selected selectedNames = RememberSelectedItems(focused); } const int oldItemCount = m_indexMapping.size(); m_fileData.clear(); m_indexMapping.clear(); m_hasParent = CState::LocalDirHasParent(dirname); if (m_hasParent) { t_fileData data; data.dir = true; data.icon = -2; data.name = _T(".."); data.size = -1; data.hasTime = 0; m_fileData.push_back(data); m_indexMapping.push_back(0); } #ifdef __WXMSW__ if (dirname == _T("\\")) { DisplayDrives(); } else if (dirname.Left(2) == _T("\\\\")) { int pos = dirname.Mid(2).Find('\\'); if (pos != -1 && pos + 3 != (int)dirname.Len()) goto regular_dir; // UNC path without shares DisplayShares(dirname); } else #endif { #ifdef __WXMSW__ regular_dir: #endif CFilterDialog filter; wxDir dir(dirname); if (!dir.IsOpened()) { SetItemCount(1); return false; } wxString file; bool found = dir.GetFirst(&file); int num = m_fileData.size(); while (found) { if (file == _T("")) { wxGetApp().DisplayEncodingWarning(); found = dir.GetNext(&file); continue; } t_fileData data; data.dir = wxFileName::DirExists(dirname + file); data.icon = -2; data.name = file; wxStructStat buf; int result; result = wxStat(dirname + file, &buf); if (!result) { data.hasTime = true; data.lastModified = wxDateTime(buf.st_mtime); } else data.hasTime = false; if (data.dir) data.size = -1; else data.size = result ? -1 : buf.st_size; m_fileData.push_back(data); if (!filter.FilenameFiltered(data.name, data.dir, data.size, true)) m_indexMapping.push_back(num); num++; found = dir.GetNext(&file); } } if (m_dropTarget != -1) { t_fileData* data = GetData(m_dropTarget); if (!data || !data->dir) { SetItemState(m_dropTarget, 0, wxLIST_STATE_DROPHILITED); m_dropTarget = -1; } } const int count = m_indexMapping.size(); if (oldItemCount != count) SetItemCount(count); SortList(); ReselectItems(selectedNames, focused); Refresh(); return true; }
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 CFilterDialog filter; while (!dirsToCheck.empty()) { t_dir dir = dirsToCheck.front(); dirsToCheck.pop_front(); wxDir find(dir.dir); if (!find.IsOpened()) { // 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; } wxString file; bool found = find.GetFirst(&file, _T(""), wxDIR_DIRS | wxDIR_HIDDEN); std::list<wxString> dirs; while (found) { if (file == _T("")) { wxGetApp().DisplayEncodingWarning(); found = find.GetNext(&file); continue; } wxFileName fn(dir.dir + file); const bool isDir = fn.DirExists(); wxLongLong size; wxStructStat buf; int result = wxStat(fn.GetFullPath(), &buf); if (!isDir && !result) size = buf.st_size; else size = -1; int attributes; #ifdef __WXMSW__ DWORD tmp = GetFileAttributes(fn.GetFullPath()); if (tmp == INVALID_FILE_ATTRIBUTES) attributes = 0; else attributes = tmp; #else if (!result) attributes = buf.st_mode & 0x777; else attributes = -1; #endif //__WXMSW__ if (!filter.FilenameFiltered(file, isDir, size , true, attributes)) dirs.push_back(file); found = find.GetNext(&file); } dirs.sort(sortfunc); bool inserted = false; wxTreeItemId child = GetLastChild(dir.item); std::list<wxString>::reverse_iterator iter = dirs.rbegin(); while (child && iter != dirs.rend()) { #ifdef __WXMSW__ int cmp = GetItemText(child).CmpNoCase(*iter); #else int cmp = GetItemText(child).Cmp(*iter); #endif if (!cmp) { if (!IsExpanded(child)) { wxTreeItemId subchild = GetLastChild(child); if (subchild && GetItemText(subchild) == _T("")) { if (!HasSubdir(dir.dir + *iter + separator)) Delete(subchild); } else if (!subchild) { if (HasSubdir(dir.dir + *iter + separator)) AppendItem(child, _T("")); } else { t_dir subdir; subdir.dir = dir.dir + *iter + separator; subdir.item = child; dirsToCheck.push_front(subdir); } } else { t_dir subdir; subdir.dir = dir.dir + *iter + separator; subdir.item = child; dirsToCheck.push_front(subdir); } child = GetPrevSibling(child); iter++; } else if (cmp > 0) { wxTreeItemId sel = GetSelection(); while (sel && sel != child) sel = GetItemParent(sel); wxTreeItemId prev = GetPrevSibling(child); if (!sel) Delete(child); child = prev; } else if (cmp < 0) { wxString fullname = dir.dir + *iter + separator; wxTreeItemId newItem = AppendItem(dir.item, *iter, GetIconIndex(::dir, fullname), GetIconIndex(opened_dir, fullname)); if (HasSubdir(fullname)) AppendItem(newItem, _T("")); iter++; inserted = true; } } while (child) { wxTreeItemId sel = GetSelection(); while (sel && sel != child) sel = GetItemParent(sel); wxTreeItemId prev = GetPrevSibling(child); if (!sel) Delete(child); child = prev; } while (iter != dirs.rend()) { wxString fullname = dir.dir + *iter + separator; wxTreeItemId newItem = AppendItem(dir.item, *iter, GetIconIndex(::dir, fullname), GetIconIndex(opened_dir, fullname)); if (HasSubdir(fullname)) AppendItem(newItem, _T("")); iter++; inserted = true; } if (inserted) SortChildren(dir.item); } #ifdef __WXMSW__ SetErrorMode(prevErrorMode); #endif }
void CLocalTreeView::DisplayDir(wxTreeItemId parent, const wxString& dirname, const wxString& knownSubdir /*=_T("")*/) { wxDir dir; { wxLogNull log; if (!dir.Open(dirname)) { if (knownSubdir != _T("")) { wxTreeItemId item = GetSubdir(parent, knownSubdir); if (item != wxTreeItemId()) return; const wxString fullName = dirname + knownSubdir; item = AppendItem(parent, knownSubdir, GetIconIndex(::dir, fullName), GetIconIndex(opened_dir, fullName)); if (HasSubdir(fullName)) AppendItem(item, _T("")); } else { m_setSelection = true; DeleteChildren(parent); m_setSelection = false; } return; } } wxASSERT(parent); m_setSelection = true; DeleteChildren(parent); m_setSelection = false; wxString file; CFilterDialog filter; bool matchedKnown = false; for (bool found = dir.GetFirst(&file, _T(""), wxDIR_DIRS | wxDIR_HIDDEN); found; found = dir.GetNext(&file)) { if (file == _T("")) { wxGetApp().DisplayEncodingWarning(); continue; } wxString fullName = dirname + file; #ifdef __WXMSW__ if (file.CmpNoCase(knownSubdir)) #else if (file != knownSubdir) #endif { wxFileName fn(fullName); const bool isDir = fn.DirExists(); wxLongLong size; const wxString& fullName = fn.GetFullPath(); wxStructStat buf; int result = wxStat(fullName, &buf); if (!isDir && !result) size = buf.st_size; else size = -1; int attributes; #ifdef __WXMSW__ DWORD tmp = GetFileAttributes(fullName); if (tmp == INVALID_FILE_ATTRIBUTES) attributes = 0; else attributes = tmp; #else if (!result) attributes = buf.st_mode & 0x777; else attributes = -1; #endif //__WXMSW__ if (filter.FilenameFiltered(file, isDir, size, true, attributes)) continue; } else matchedKnown = true; wxTreeItemId item = AppendItem(parent, file, GetIconIndex(::dir, fullName), GetIconIndex(opened_dir, fullName)); if (HasSubdir(fullName)) AppendItem(item, _T("")); } if (!matchedKnown && knownSubdir != _T("")) { const wxString fullName = dirname + knownSubdir; wxTreeItemId item = AppendItem(parent, knownSubdir, GetIconIndex(::dir, fullName), GetIconIndex(opened_dir, fullName)); if (HasSubdir(fullName)) AppendItem(item, _T("")); } SortChildren(parent); }