void CQueueViewFailed::OnRemoveAll(wxCommandEvent& event) { #ifndef __WXMSW__ // GetNextItem is O(n) if nothing is selected, GetSelectedItemCount() is O(1) if (GetSelectedItemCount()) #endif { // First, clear all selections int item; while ((item = GetNextItem(-1, wxLIST_NEXT_ALL, wxLIST_STATE_SELECTED)) != -1) SetItemState(item, 0, wxLIST_STATE_SELECTED); } CEditHandler* pEditHandler = CEditHandler::Get(); if (pEditHandler) pEditHandler->RemoveAll(CEditHandler::upload_and_remove_failed); for (std::vector<CServerItem*>::iterator iter = m_serverList.begin(); iter != m_serverList.end(); iter++) delete *iter; m_serverList.clear(); m_itemCount = 0; SaveSetItemCount(0); m_fileCount = 0; m_folderScanCount = 0; DisplayNumberQueuedFiles(); RefreshListOnly(); if (!m_itemCount && m_pQueue->GetQueueView()->GetItemCount()) m_pQueue->SetSelection(0); }
void CLocalListView::FinishComparison() { SetItemCount(m_indexMapping.size()); ComparisonRestoreSelections(); RefreshListOnly(); CComparableListing* pOther = GetOther(); if (!pOther) return; pOther->ScrollTopItem(GetTopItem()); }
void CQueueViewFailed::OnRequeueAll(wxCommandEvent&) { bool ret = true; while (!m_serverList.empty()) ret &= RequeueServerItem(m_serverList.front()); m_fileCountChanged = true; CQueueView* pQueueView = m_pQueue->GetQueueView(); pQueueView->CommitChanges(); if (pQueueView->IsActive()) pQueueView->AdvanceQueue(false); DisplayNumberQueuedFiles(); SaveSetItemCount(m_itemCount); RefreshListOnly(); if (!m_itemCount && m_pQueue->GetQueueView()->GetItemCount()) m_pQueue->SetSelection(0); if (!ret) wxMessageBoxEx(_("Not all items could be requeued for transfer.")); }
void CQueueViewFailed::OnRemoveSelected(wxCommandEvent& event) { #ifndef __WXMSW__ // GetNextItem is O(n) if nothing is selected, GetSelectedItemCount() is O(1) if (!GetSelectedItemCount()) return; #endif std::list<CQueueItem*> selectedItems; long item = -1; while (true) { item = GetNextItem(item, wxLIST_NEXT_ALL, wxLIST_STATE_SELECTED); if (item == -1) break; selectedItems.push_front(GetQueueItem(item)); SetItemState(item, 0, wxLIST_STATE_SELECTED); } CEditHandler* pEditHandler = CEditHandler::Get(); while (!selectedItems.empty()) { CQueueItem* pItem = selectedItems.front(); selectedItems.pop_front(); CQueueItem* pTopLevelItem = pItem->GetTopLevelItem(); if (pItem->GetType() == QueueItemType_Server) { CServerItem* pServerItem = (CServerItem*)pItem; if (pEditHandler && pEditHandler->GetFileCount(CEditHandler::remote, CEditHandler::upload_and_remove_failed, &pServerItem->GetServer())) pEditHandler->RemoveAll(CEditHandler::upload_and_remove_failed, &pServerItem->GetServer()); } else if (pItem->GetType() == QueueItemType_File) { CFileItem* pFileItem = (CFileItem*)pItem; if (pFileItem->m_edit == CEditHandler::remote && pEditHandler) { wxFileName fn(pFileItem->GetLocalFile()); if (pFileItem->m_edit == CEditHandler::local) { enum CEditHandler::fileState state = pEditHandler->GetFileState(pFileItem->GetLocalFile()); if (state == CEditHandler::upload_and_remove_failed) pEditHandler->Remove(pFileItem->GetLocalFile()); } else { CServerItem* pServerItem = (CServerItem*)pFileItem->GetTopLevelItem(); enum CEditHandler::fileState state = pEditHandler->GetFileState(pFileItem->GetRemoteFile(), pFileItem->GetRemotePath(), pServerItem->GetServer()); if (state == CEditHandler::upload_and_remove_failed) pEditHandler->Remove(pFileItem->GetRemoteFile(), pFileItem->GetRemotePath(), pServerItem->GetServer()); } } } if (!pTopLevelItem->GetChild(1)) { // Parent will get deleted // If next selected item is parent, remove it from list if (!selectedItems.empty() && selectedItems.front() == pTopLevelItem) selectedItems.pop_front(); } RemoveItem(pItem, true, false, false); } DisplayNumberQueuedFiles(); SaveSetItemCount(m_itemCount); RefreshListOnly(); if (!m_itemCount && m_pQueue->GetQueueView()->GetItemCount()) m_pQueue->SetSelection(0); }
void CQueueViewFailed::OnRequeueSelected(wxCommandEvent& event) { #ifndef __WXMSW__ // GetNextItem is O(n) if nothing is selected, GetSelectedItemCount() is O(1) if (!GetSelectedItemCount()) return; #endif bool failedToRequeueAll = false; std::list<CQueueItem*> selectedItems; long item = -1; long skipTo = -1; while (true) { item = GetNextItem(item, wxLIST_NEXT_ALL, wxLIST_STATE_SELECTED); if (item == -1) break; SetItemState(item, 0, wxLIST_STATE_SELECTED); if (item < skipTo) continue; CQueueItem* pItem = GetQueueItem(item); if (pItem->GetType() == QueueItemType_Server) skipTo = item + pItem->GetChildrenCount(true) + 1; selectedItems.push_back(GetQueueItem(item)); } if (selectedItems.empty()) return; CQueueView* pQueueView = m_pQueue->GetQueueView(); while (!selectedItems.empty()) { CQueueItem* pItem = selectedItems.front(); selectedItems.pop_front(); if (pItem->GetType() == QueueItemType_Server) { CServerItem* pOldServerItem = (CServerItem*)pItem; CServerItem* pServerItem = pQueueView->CreateServerItem(pOldServerItem->GetServer()); unsigned int childrenCount = pOldServerItem->GetChildrenCount(false); for (unsigned int i = 0; i < childrenCount; i++) { CFileItem* pFileItem = (CFileItem*)pItem->GetChild(i, false); pFileItem->m_errorCount = 0; pFileItem->m_statusMessage.Clear(); if (!pFileItem->Download() && !wxFileName::FileExists(pFileItem->GetLocalFile())) { failedToRequeueAll = true; RemoveItem(pItem, true, false, false); continue; } if (pFileItem->m_edit == CEditHandler::remote) { CEditHandler* pEditHandler = CEditHandler::Get(); if (!pEditHandler) { failedToRequeueAll = true; delete pFileItem; continue; } enum CEditHandler::fileState state = pEditHandler->GetFileState(pFileItem->GetRemoteFile(), pFileItem->GetRemotePath(), pServerItem->GetServer()); if (state == CEditHandler::unknown) { wxASSERT(pFileItem->Download()); wxString file = pFileItem->GetRemoteFile(); if (!pEditHandler->AddFile(CEditHandler::remote, file, pFileItem->GetRemotePath(), pServerItem->GetServer())) { failedToRequeueAll = true; delete pFileItem; continue; } pFileItem->SetLocalFile(file); } else if (state == CEditHandler::upload_and_remove_failed) { wxASSERT(!pFileItem->Download()); if (!pEditHandler->UploadFile(pFileItem->GetRemoteFile(), pFileItem->GetRemotePath(), pServerItem->GetServer(), true)) failedToRequeueAll = true; delete pFileItem; continue; } else { failedToRequeueAll = true; delete pFileItem; continue; } } pFileItem->SetParent(pServerItem); pQueueView->InsertItem(pServerItem, pFileItem); } m_fileCount -= childrenCount; m_itemCount -= childrenCount + 1; pOldServerItem->DetachChildren(); delete pOldServerItem; std::vector<CServerItem*>::iterator iter; for (iter = m_serverList.begin(); iter != m_serverList.end(); iter++) { if (*iter == pOldServerItem) break; } if (iter != m_serverList.end()) m_serverList.erase(iter); if (!pServerItem->GetChildrenCount(false)) { pQueueView->CommitChanges(); pQueueView->RemoveItem(pServerItem, true, true, true); } } else { CFileItem* pFileItem = (CFileItem*)pItem; pFileItem->m_errorCount = 0; pFileItem->m_statusMessage.Clear(); if (!pFileItem->Download() && !wxFileName::FileExists(pFileItem->GetLocalFile())) { failedToRequeueAll = true; RemoveItem(pItem, true, false, false); continue; } CServerItem* pOldServerItem = (CServerItem*)pItem->GetTopLevelItem(); CServerItem* pServerItem = pQueueView->CreateServerItem(pOldServerItem->GetServer()); RemoveItem(pItem, false, false, false); if (pFileItem->m_edit == CEditHandler::remote) { CEditHandler* pEditHandler = CEditHandler::Get(); if (!pEditHandler) { if (!pServerItem->GetChildrenCount(false)) { pQueueView->CommitChanges(); pQueueView->RemoveItem(pServerItem, true, true, true); } failedToRequeueAll = true; delete pItem; continue; } enum CEditHandler::fileState state = pEditHandler->GetFileState(pFileItem->GetRemoteFile(), pFileItem->GetRemotePath(), pServerItem->GetServer()); if (state == CEditHandler::unknown) { wxASSERT(pFileItem->Download()); wxString file = pFileItem->GetRemoteFile(); if (!pEditHandler->AddFile(CEditHandler::remote, file, pFileItem->GetRemotePath(), pServerItem->GetServer())) { if (!pServerItem->GetChildrenCount(false)) { pQueueView->CommitChanges(); pQueueView->RemoveItem(pServerItem, true, true, true); } failedToRequeueAll = true; delete pItem; continue; } pFileItem->SetLocalFile(file); } else if (state == CEditHandler::upload_and_remove_failed) { wxASSERT(!pFileItem->Download()); if (!pEditHandler->UploadFile(pFileItem->GetRemoteFile(), pFileItem->GetRemotePath(), pServerItem->GetServer(), true)) failedToRequeueAll = true; if (!pServerItem->GetChildrenCount(false)) { pQueueView->CommitChanges(); pQueueView->RemoveItem(pServerItem, true, true, true); } delete pItem; continue; } else { if (!pServerItem->GetChildrenCount(false)) { pQueueView->CommitChanges(); pQueueView->RemoveItem(pServerItem, true, true, true); } failedToRequeueAll = true; delete pItem; continue; } } pItem->SetParent(pServerItem); pQueueView->InsertItem(pServerItem, pItem); } } m_fileCountChanged = true; pQueueView->CommitChanges(); if (pQueueView->IsActive()) pQueueView->AdvanceQueue(false); DisplayNumberQueuedFiles(); SaveSetItemCount(m_itemCount); RefreshListOnly(); if (!m_itemCount && m_pQueue->GetQueueView()->GetItemCount()) m_pQueue->SetSelection(0); if (failedToRequeueAll) wxMessageBox(_("Not all items could be requeued for viewing/editing.")); }
bool CLocalListView::DisplayDir(wxString dirname) { CancelLabelEdit(); wxString focused; std::list<wxString> selectedNames; bool ensureVisible = false; if (m_dir != dirname) { ResetSearchPrefix(); if (IsComparing()) ExitComparisonMode(); ClearSelection(); focused = m_pState->GetPreviouslyVisitedLocalSubdir(); ensureVisible = !focused.IsEmpty(); if (focused.IsEmpty()) focused = _T(".."); if (GetItemCount()) EnsureVisible(0); m_dir = dirname; } else { // Remember which items were selected selectedNames = RememberSelectedItems(focused); } if (m_pFilelistStatusBar) m_pFilelistStatusBar->UnselectAll(); const int oldItemCount = m_indexMapping.size(); m_fileData.clear(); m_indexMapping.clear(); m_hasParent = CLocalPath(dirname).HasLogicalParent(); if (m_hasParent) { CLocalFileData data; data.flags = normal; data.dir = true; data.icon = -2; data.name = _T(".."); #ifdef __WXMSW__ data.label = _T(".."); #endif data.size = -1; 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 CFilterManager filter; CLocalFileSystem local_filesystem; if (!local_filesystem.BeginFindFiles(dirname, false)) { SetItemCount(1); return false; } wxLongLong totalSize; int unknown_sizes = 0; int totalFileCount = 0; int totalDirCount = 0; int hidden = 0; int num = m_fileData.size(); CLocalFileData data; data.flags = normal; data.icon = -2; bool wasLink; while (local_filesystem.GetNextFile(data.name, wasLink, data.dir, &data.size, &data.lastModified, &data.attributes)) { if (data.name.IsEmpty()) { wxGetApp().DisplayEncodingWarning(); continue; } #ifdef __WXMSW__ data.label = data.name; #endif m_fileData.push_back(data); if (!filter.FilenameFiltered(data.name, dirname, data.dir, data.size, true, data.attributes, data.lastModified)) { if (data.dir) totalDirCount++; else { if (data.size != -1) totalSize += data.size; else unknown_sizes++; totalFileCount++; } m_indexMapping.push_back(num); } else hidden++; num++; } if (m_pFilelistStatusBar) m_pFilelistStatusBar->SetDirectoryContents(totalFileCount, totalDirCount, totalSize, unknown_sizes, hidden); } if (m_dropTarget != -1) { CLocalFileData* 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(-1, -1, false); if (IsComparing()) { m_originalIndexMapping.clear(); RefreshComparison(); } ReselectItems(selectedNames, focused, ensureVisible); RefreshListOnly(); return true; }
void CLocalListView::RefreshFile(const wxString& file) { CLocalFileData data; bool wasLink; enum CLocalFileSystem::local_fileType type = CLocalFileSystem::GetFileInfo(m_dir + file, wasLink, &data.size, &data.lastModified, &data.attributes); if (type == CLocalFileSystem::unknown) return; data.flags = normal; data.icon = -2; data.name = file; #ifdef __WXMSW__ data.label = file; #endif data.dir = type == CLocalFileSystem::dir; CFilterManager filter; if (filter.FilenameFiltered(data.name, m_dir, data.dir, data.size, true, data.attributes, data.lastModified)) return; CancelLabelEdit(); // Look if file data already exists unsigned int i = 0; for (std::vector<CLocalFileData>::iterator iter = m_fileData.begin(); iter != m_fileData.end(); ++iter, ++i) { const CLocalFileData& oldData = *iter; if (oldData.name != file) continue; // Update file list status bar if (m_pFilelistStatusBar) { #ifndef __WXMSW__ // GetNextItem is O(n) if nothing is selected, GetSelectedItemCount() is O(1) if (GetSelectedItemCount()) #endif { int item = -1; for (;;) { item = GetNextItem(item, wxLIST_NEXT_ALL, wxLIST_STATE_SELECTED); if (item == -1) break; if (m_indexMapping[item] != i) continue; if (oldData.dir) m_pFilelistStatusBar->UnselectDirectory(); else m_pFilelistStatusBar->UnselectFile(oldData.size); if (data.dir) m_pFilelistStatusBar->SelectDirectory(); else m_pFilelistStatusBar->SelectFile(data.size); break; } } if (oldData.dir) m_pFilelistStatusBar->RemoveDirectory(); else m_pFilelistStatusBar->RemoveFile(oldData.size); if (data.dir) m_pFilelistStatusBar->AddDirectory(); else m_pFilelistStatusBar->AddFile(data.size); } // Update the data data.fileType = oldData.fileType; *iter = data; if (IsComparing()) { // Sort order doesn't change RefreshComparison(); } else { if (m_sortColumn) SortList(); RefreshListOnly(false); } return; } if (data.dir) m_pFilelistStatusBar->AddDirectory(); else m_pFilelistStatusBar->AddFile(data.size); wxString focused; std::list<wxString> selectedNames; if (IsComparing()) { wxASSERT(!m_originalIndexMapping.empty()); selectedNames = RememberSelectedItems(focused); m_indexMapping.clear(); m_originalIndexMapping.swap(m_indexMapping); } // Insert new entry int index = m_fileData.size(); m_fileData.push_back(data); // Find correct position in index mapping std::vector<unsigned int>::iterator start = m_indexMapping.begin(); if (m_hasParent) ++start; CFileListCtrl<CLocalFileData>::CSortComparisonObject compare = GetSortComparisonObject(); std::vector<unsigned int>::iterator insertPos = std::lower_bound(start, m_indexMapping.end(), index, compare); compare.Destroy(); const int item = insertPos - m_indexMapping.begin(); m_indexMapping.insert(insertPos, index); if (!IsComparing()) { SetItemCount(m_indexMapping.size()); // Move selections int prevState = 0; for (unsigned int i = item; i < m_indexMapping.size(); i++) { int state = GetItemState(i, wxLIST_STATE_SELECTED | wxLIST_STATE_FOCUSED); if (state != prevState) { SetItemState(i, prevState, wxLIST_STATE_FOCUSED); SetSelection(i, (prevState & wxLIST_STATE_SELECTED) != 0); prevState = state; } } RefreshListOnly(); } else { RefreshComparison(); if (m_pFilelistStatusBar) m_pFilelistStatusBar->UnselectAll(); ReselectItems(selectedNames, focused); } }
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(); }
bool CQueueViewBase::RemoveItem(CQueueItem* pItem, bool destroy, bool updateItemCount /*=true*/, bool updateSelections /*=true*/) { if (pItem->GetType() == QueueItemType_File || pItem->GetType() == QueueItemType_Folder) { wxASSERT(m_fileCount > 0); m_fileCount--; m_fileCountChanged = true; } else if (pItem->GetType() == QueueItemType_FolderScan) { wxASSERT(m_folderScanCount > 0); m_folderScanCount--; m_folderScanCountChanged = true; } int index = 0; if (updateSelections) index = GetItemIndex(pItem); CQueueItem* topLevelItem = pItem->GetTopLevelItem(); int count = topLevelItem->GetChildrenCount(true); topLevelItem->RemoveChild(pItem, destroy); bool didRemoveParent; int oldCount = m_itemCount; if (!topLevelItem->GetChild(0)) { std::vector<CServerItem*>::iterator iter; for (iter = m_serverList.begin(); iter != m_serverList.end(); iter++) { if (*iter == topLevelItem) break; } if (iter != m_serverList.end()) m_serverList.erase(iter); UpdateSelections_ItemRangeRemoved(GetItemIndex(topLevelItem), count + 1); delete topLevelItem; m_itemCount -= count + 1; if (updateItemCount) SaveSetItemCount(m_itemCount); didRemoveParent = true; } else { count -= topLevelItem->GetChildrenCount(true); if (updateSelections) UpdateSelections_ItemRangeRemoved(index, count); m_itemCount -= count; if (updateItemCount) SaveSetItemCount(m_itemCount); didRemoveParent = false; } if (updateItemCount) { if (m_fileCountChanged || m_folderScanCountChanged) DisplayNumberQueuedFiles(); if (oldCount > m_itemCount) { bool eraseBackground = GetTopItem() + GetCountPerPage() + 1 >= m_itemCount; RefreshListOnly(eraseBackground); if (eraseBackground) Update(); } } return didRemoveParent; }
void CQueueViewFailed::OnRequeueSelected(wxCommandEvent&) { #ifndef __WXMSW__ // GetNextItem is O(n) if nothing is selected, GetSelectedItemCount() is O(1) if (!GetSelectedItemCount()) return; #endif bool failedToRequeueAll = false; std::list<CQueueItem*> selectedItems; long item = -1; long skipTo = -1; for (;;) { item = GetNextItem(item, wxLIST_NEXT_ALL, wxLIST_STATE_SELECTED); if (item == -1) break; SetItemState(item, 0, wxLIST_STATE_SELECTED); if (item < skipTo) continue; CQueueItem* pItem = GetQueueItem(item); if (pItem->GetType() == QueueItemType::Server) skipTo = item + pItem->GetChildrenCount(true) + 1; selectedItems.push_back(GetQueueItem(item)); } if (selectedItems.empty()) return; CQueueView* pQueueView = m_pQueue->GetQueueView(); while (!selectedItems.empty()) { CQueueItem* pItem = selectedItems.front(); selectedItems.pop_front(); if (pItem->GetType() == QueueItemType::Server) { CServerItem* pServerItem = (CServerItem*)pItem; failedToRequeueAll |= !RequeueServerItem(pServerItem); } else { CFileItem* pFileItem = (CFileItem*)pItem; CServerItem* pOldServerItem = (CServerItem*)pItem->GetTopLevelItem(); CServerItem* pServerItem = pQueueView->CreateServerItem(pOldServerItem->GetServer()); RemoveItem(pItem, false, false, false); failedToRequeueAll |= !RequeueFileItem(pFileItem, pServerItem); if (!pServerItem->GetChildrenCount(false)) { pQueueView->CommitChanges(); pQueueView->RemoveItem(pServerItem, true, true, true); } } } m_fileCountChanged = true; pQueueView->CommitChanges(); if (pQueueView->IsActive()) pQueueView->AdvanceQueue(false); DisplayNumberQueuedFiles(); SaveSetItemCount(m_itemCount); RefreshListOnly(); if (!m_itemCount && m_pQueue->GetQueueView()->GetItemCount()) m_pQueue->SetSelection(0); if (failedToRequeueAll) wxMessageBoxEx(_("Not all items could be requeued for transfer.")); }