void CLocalTreeView::OnMenuRename(wxCommandEvent& event) { if (!m_contextMenuItem.IsOk()) return; #ifdef __WXMSW__ if (m_contextMenuItem == m_desktop || m_contextMenuItem == m_documents) { wxBell(); return; } #endif wxString path = GetDirFromItem(m_contextMenuItem); #ifdef __WXMSW__ if (path.Len() == 3 && path.Mid(1) == _T(":\\")) { wxBell(); return; } #endif if (!m_pState->LocalDirHasParent(path) || !m_pState->LocalDirIsWriteable(path)) { wxBell(); return; } EditLabel(m_contextMenuItem); }
void CLocalTreeView::OnBeginDrag(wxTreeEvent& event) { wxTreeItemId item = event.GetItem(); if (!item) return; #ifdef __WXMSW__ if (item == m_drives || item == m_desktop || item == m_documents) return; #endif wxString dir = GetDirFromItem(item); if (dir == _T("/")) return; if (dir.Last() == '\\') dir.RemoveLast(); #ifdef __WXMSW__ if (dir.Last() == ':') return; #endif wxFileDataObject obj; obj.AddFile(dir); wxDropSource source(this); source.SetData(obj); int res = source.DoDragDrop(wxDrag_AllowMove); if (res == wxDragCopy || res == wxDragMove) m_pState->RefreshLocal(); }
void CLocalTreeView::OnSelectionChanged(wxTreeEvent& event) { if (m_setSelection) { event.Skip(); return; } wxTreeItemId item = event.GetItem(); if (!item) return; wxString dir = GetDirFromItem(item); wxString error; if (!m_pState->SetLocalDir(dir, &error)) { if (error != _T("")) wxMessageBox(error, _("Failed to change directory"), wxICON_INFORMATION); else wxBell(); m_setSelection = true; SelectItem(event.GetOldItem()); m_setSelection = false; } }
void CLocalTreeView::OnBeginLabelEdit(wxTreeEvent& event) { wxTreeItemId item = event.GetItem(); #ifdef __WXMSW__ if (item == m_desktop || item == m_documents) { wxBell(); event.Veto(); return; } #endif wxString path = GetDirFromItem(item); #ifdef __WXMSW__ if (path.Len() == 3 && path.Mid(1) == _T(":\\")) { wxBell(); event.Veto(); return; } #endif if (!m_pState->LocalDirHasParent(path) || !m_pState->LocalDirIsWriteable(path)) { wxBell(); event.Veto(); return; } }
wxString DisplayDropHighlight(wxPoint point) { wxTreeItemId hit = GetHit(point); if (!hit) { ClearDropHighlight(); return _T(""); } wxString dir = GetDirFromItem(hit); if (dir == _T("")) { ClearDropHighlight(); return _T(""); } const wxTreeItemId dropHighlight = m_pLocalTreeView->m_dropHighlight; if (dropHighlight != wxTreeItemId()) m_pLocalTreeView->SetItemDropHighlight(dropHighlight, false); m_pLocalTreeView->SetItemDropHighlight(hit, true); m_pLocalTreeView->m_dropHighlight = hit; return dir; }
void CLocalTreeView::OnMenuUpload(wxCommandEvent& event) { if (!m_contextMenuItem.IsOk()) return; wxString path = GetDirFromItem(m_contextMenuItem); if (!CLocalPath(path).HasParent()) return; if (!m_pState->IsRemoteConnected()) return; const CServer server = *m_pState->GetServer(); CServerPath remotePath = m_pState->GetRemotePath(); if (remotePath.IsEmpty()) return; if (!remotePath.ChangePath(GetItemText(m_contextMenuItem))) return; if (path.Last() == wxFileName::GetPathSeparator()) path.RemoveLast(); m_pQueueView->QueueFolder(event.GetId() == XRCID("ID_ADDTOQUEUE"), false, path, remotePath, server); }
void CLocalTreeView::OnContextMenu(wxTreeEvent& event) { m_contextMenuItem = event.GetItem(); if (!m_contextMenuItem.IsOk()) return; wxMenu* pMenu = wxXmlResource::Get()->LoadMenu(_T("ID_MENU_LOCALTREE")); if (!pMenu) return; const wxString& path = GetDirFromItem(m_contextMenuItem); bool hasParent = m_pState->LocalDirHasParent(path); const bool writeable = m_pState->LocalDirIsWriteable(path); #ifdef __WXMSW__ if (path.Len() == 3 && path.Mid(1) == _T(":\\")) hasParent = false; #endif const bool remoteConnected = m_pState->IsRemoteConnected() && !m_pState->GetRemotePath().IsEmpty(); pMenu->Enable(XRCID("ID_UPLOAD"), hasParent && remoteConnected); pMenu->Enable(XRCID("ID_ADDTOQUEUE"), hasParent && remoteConnected); pMenu->Enable(XRCID("ID_MKDIR"), writeable); pMenu->Enable(XRCID("ID_DELETE"), writeable && hasParent); pMenu->Enable(XRCID("ID_RENAME"), writeable && hasParent); PopupMenu(pMenu); delete pMenu; }
void CLocalTreeView::OnItemExpanding(wxTreeEvent& event) { wxTreeItemId item = event.GetItem(); wxTreeItemIdValue value; wxTreeItemId child = GetFirstChild(item, value); if (child && GetItemText(child) == _T("")) DisplayDir(item, GetDirFromItem(item)); }
void CLocalTreeView::OnSelectionChanging(wxTreeEvent& event) { // On-demand open icon for selected items wxTreeItemId item = event.GetItem(); if (GetItemImage(item, wxTreeItemIcon_Selected) == -1) { int icon = GetIconIndex(opened_dir, GetDirFromItem(item)); SetItemImage(item, icon, wxTreeItemIcon_Selected); SetItemImage(item, icon, wxTreeItemIcon_SelectedExpanded); } }
virtual bool OnDrop(wxCoord x, wxCoord y) { ClearDropHighlight(); wxTreeItemId hit = GetHit(wxPoint(x, y)); if (!hit) return false; const wxString dir = GetDirFromItem(hit); if (dir == _T("") || !CLocalPath(dir).IsWriteable()) return false; return true; }
void CLocalTreeView::OnBeginDrag(wxTreeEvent& event) { wxTreeItemId item = event.GetItem(); if (!item) return; #ifdef __WXMSW__ if (item == m_drives || item == m_desktop || item == m_documents) return; #endif wxString dir = GetDirFromItem(item); if (dir == _T("/")) return; #ifdef __WXMSW__ if (dir.Last() == '\\') dir.RemoveLast(); #endif if (dir.Last() == '/') dir.RemoveLast(); #ifdef __WXMSW__ if (dir.Last() == ':') return; #endif CDragDropManager* pDragDropManager = CDragDropManager::Init(); pDragDropManager->pDragSource = this; wxFileDataObject obj; obj.AddFile(dir); wxDropSource source(this); source.SetData(obj); int res = source.DoDragDrop(wxDrag_AllowMove); bool handled_internally = pDragDropManager->pDropTarget != 0; pDragDropManager->Release(); if (!handled_internally && (res == wxDragCopy || res == wxDragMove)) { // We only need to refresh local side if the operation got handled // externally, the internal handlers do this for us already m_pState->RefreshLocal(); } }
void CLocalTreeView::OnMenuMkdir(wxCommandEvent& event) { if (!m_contextMenuItem.IsOk()) return; wxString path = GetDirFromItem(m_contextMenuItem); if (path.Last() != wxFileName::GetPathSeparator()) path += wxFileName::GetPathSeparator(); if (!CLocalPath(path).IsWriteable()) { wxBell(); return; } CInputDialog dlg; if (!dlg.Create(this, _("Create directory"), _("Please enter the name of the directory which should be created:"))) return; wxString newName = _("New directory"); dlg.SetValue(path + newName); dlg.SelectText(path.Len(), path.Len() + newName.Len()); if (dlg.ShowModal() != wxID_OK) return; wxFileName fn(dlg.GetValue(), _T("")); if (!fn.Normalize(wxPATH_NORM_ALL, path)) { wxBell(); return; } bool res; { wxLogNull log; res = fn.Mkdir(fn.GetPath(), 0777, wxPATH_MKDIR_FULL); } if (!res) wxBell(); Refresh(); m_pState->RefreshLocal(); }
virtual bool OnDrop(wxCoord x, wxCoord y) { if (!CScrollableDropTarget<wxTreeCtrlEx>::OnDrop(x, y)) { return false; } ClearDropHighlight(); wxTreeItemId hit = GetHit(wxPoint(x, y)); if (!hit) return false; const wxString dir = GetDirFromItem(hit); if (dir.empty() || !CLocalPath(dir).IsWriteable()) return false; return true; }
virtual wxDragResult OnData(wxCoord x, wxCoord y, wxDragResult def) { if (def == wxDragError || def == wxDragNone || def == wxDragCancel) return def; wxTreeItemId hit = GetHit(wxPoint(x, y)); if (!hit) return wxDragNone; wxString dir = GetDirFromItem(hit); if (dir == _T("") || !CState::LocalDirIsWriteable(dir)) return wxDragNone; if (!GetData()) return wxDragError; if (m_pDataObject->GetReceivedFormat() == m_pFileDataObject->GetFormat()) m_pLocalTreeView->m_pState->HandleDroppedFiles(m_pFileDataObject, dir, def == wxDragCopy); else { if (m_pRemoteDataObject->GetProcessId() != (int)wxGetProcessId()) { wxMessageBox(_("Drag&drop between different instances of FileZilla has not been implemented yet.")); return wxDragNone; } if (!m_pLocalTreeView->m_pState->GetServer() || m_pRemoteDataObject->GetServer() != *m_pLocalTreeView->m_pState->GetServer()) { wxMessageBox(_("Drag&drop between different servers has not been implemented yet.")); return wxDragNone; } if (!m_pLocalTreeView->m_pState->DownloadDroppedFiles(m_pRemoteDataObject, dir)) return wxDragNone; } return def; }
void CLocalTreeView::OnBeginLabelEdit(wxTreeEvent& event) { wxTreeItemId item = event.GetItem(); #ifdef __WXMSW__ if (item == m_desktop || item == m_documents) { wxBell(); event.Veto(); return; } #endif CLocalPath path(GetDirFromItem(item)); if (!path.HasParent() || !path.IsWriteable()) { wxBell(); event.Veto(); return; } }
void CLocalTreeView::OnMenuRename(wxCommandEvent& event) { if (!m_contextMenuItem.IsOk()) return; #ifdef __WXMSW__ if (m_contextMenuItem == m_desktop || m_contextMenuItem == m_documents) { wxBell(); return; } #endif CLocalPath path(GetDirFromItem(m_contextMenuItem)); if (!path.HasParent() || !path.IsWriteable()) { wxBell(); return; } EditLabel(m_contextMenuItem); }
void CLocalTreeView::OnMenuDelete(wxCommandEvent& event) { if (!m_contextMenuItem.IsOk()) return; wxString path = GetDirFromItem(m_contextMenuItem); CLocalPath local_path(path); if (!local_path.HasParent() || !local_path.IsWriteable()) return; if (!CLocalFileSystem::RecursiveDelete(path, this)) wxGetApp().DisplayEncodingWarning(); wxTreeItemId item = GetSelection(); while (item && item != m_contextMenuItem) item = GetItemParent(item); if (!item) { if (GetItemParent(m_contextMenuItem) == GetSelection()) m_pState->RefreshLocal(); else Refresh(); return; } if (path.Last() == wxFileName::GetPathSeparator()) path.RemoveLast(); int pos = path.Find(wxFileName::GetPathSeparator(), true); if (pos < 1) path = _T("/"); else path = path.Left(pos); m_pState->SetLocalDir(path); Refresh(); }
void CLocalTreeView::OnMenuDelete(wxCommandEvent& event) { if (!m_contextMenuItem.IsOk()) return; wxString path = GetDirFromItem(m_contextMenuItem); if (!m_pState->LocalDirHasParent(path) || !m_pState->LocalDirIsWriteable(path)) return; #ifdef __WXMSW__ if (path.Len() == 3 && path.Mid(1) == _T(":\\")) return; #endif // Under Windows use SHFileOperation to delete files and directories. // Under other systems, we have to recurse into subdirectories manually // to delete all contents. #ifdef __WXMSW__ // SHFileOperation accepts a list of null-terminated strings. Go through all // items to get the required buffer length if (path.Last() == wxFileName::GetPathSeparator()) path.RemoveLast(); int len = path.Len() + 2; // Allocate memory wxChar* pBuffer = new wxChar[len]; _tcscpy(pBuffer, path); pBuffer[len - 1] = 0; // Now we can delete the files in the buffer SHFILEOPSTRUCT op; memset(&op, 0, sizeof(op)); op.hwnd = (HWND)GetHandle(); op.wFunc = FO_DELETE; op.pFrom = pBuffer; // Move to trash if shift is not pressed, else delete op.fFlags = wxGetKeyState(WXK_SHIFT) ? 0 : FOF_ALLOWUNDO; SHFileOperation(&op); delete [] pBuffer; #else if (wxMessageBox(_("Really delete all selected files and/or directories?"), _("Confirmation needed"), wxICON_QUESTION | wxYES_NO, this) != wxYES) return; // Remember the directories to delete and the directories to visit std::list<wxString> dirsToDelete; std::list<wxString> dirsToVisit; if (path.Last() != wxFileName::GetPathSeparator()) path += wxFileName::GetPathSeparator(); dirsToVisit.push_back(path); dirsToDelete.push_front(path); // Process any subdirs which still have to be visited while (!dirsToVisit.empty()) { wxString filename = dirsToVisit.front(); dirsToVisit.pop_front(); wxDir dir; if (!dir.Open(filename)) continue; wxString file; for (bool found = dir.GetFirst(&file); found; found = dir.GetNext(&file)) { if (file == _T("")) { wxGetApp().DisplayEncodingWarning(); continue; } if (wxFileName::DirExists(filename + file)) { wxString subDir = filename + file + wxFileName::GetPathSeparator(); dirsToVisit.push_back(subDir); dirsToDelete.push_front(subDir); } else wxRemoveFile(filename + file); } } // Delete the now empty directories for (std::list<wxString>::const_iterator iter = dirsToDelete.begin(); iter != dirsToDelete.end(); iter++) wxRmdir(*iter); #endif wxTreeItemId item = GetSelection(); while (item && item != m_contextMenuItem) item = GetItemParent(item); if (!item) { if (GetItemParent(m_contextMenuItem) == GetSelection()) m_pState->RefreshLocal(); else Refresh(); return; } if (path.Last() == wxFileName::GetPathSeparator()) path.RemoveLast(); int pos = path.Find(wxFileName::GetPathSeparator(), true); if (pos < 1) path = _T("/"); else path = path.Left(pos); m_pState->SetLocalDir(path); Refresh(); }
void CLocalTreeView::OnEndLabelEdit(wxTreeEvent& event) { if (event.IsEditCancelled()) { event.Veto(); return; } wxTreeItemId item = event.GetItem(); #ifdef __WXMSW__ if (item == m_desktop || item == m_documents) { wxBell(); event.Veto(); return; } #endif wxString path = GetDirFromItem(item); #ifdef __WXMSW__ if (path.Len() == 3 && path.Mid(1) == _T(":\\")) { wxBell(); event.Veto(); return; } #endif if (!m_pState->LocalDirHasParent(path) || !m_pState->LocalDirIsWriteable(path)) { wxBell(); event.Veto(); return; } if (path.Last() == wxFileName::GetPathSeparator()) path.RemoveLast(); int pos = path.Find(wxFileName::GetPathSeparator(), true); wxASSERT(pos != -1); wxString parent = path.Left(pos + 1); const wxString& oldName = GetItemText(item); const wxString& newName = event.GetLabel(); wxASSERT(parent + oldName == path); if (oldName == newName) return; if (!Rename(this, parent, oldName, newName)) { event.Veto(); return; } wxTreeItemId currentSel = GetSelection(); if (currentSel == wxTreeItemId()) { Refresh(); return; } if (item == currentSel) { m_pState->SetLocalDir(parent + newName); return; } wxString sub; wxTreeItemId tmp = currentSel; while (tmp != GetRootItem() && tmp != item) { sub = wxFileName::GetPathSeparator() + GetItemText(tmp) + sub; tmp = GetItemParent(tmp); } if (tmp == GetRootItem()) { // Rename unrelated to current selection return; } // Current selection below renamed item m_pState->SetLocalDir(parent + newName + sub); }
void CLocalTreeView::OnEndLabelEdit(wxTreeEvent& event) { if (event.IsEditCancelled()) { event.Veto(); return; } wxTreeItemId item = event.GetItem(); #ifdef __WXMSW__ if (item == m_desktop || item == m_documents) { wxBell(); event.Veto(); return; } #endif wxString path = GetDirFromItem(item); CLocalPath local_path(path); if (!local_path.HasParent() || !local_path.IsWriteable()) { wxBell(); event.Veto(); return; } if (path.Last() == wxFileName::GetPathSeparator()) path.RemoveLast(); int pos = path.Find(wxFileName::GetPathSeparator(), true); wxASSERT(pos != -1); wxString parent = path.Left(pos + 1); const wxString& oldName = GetItemText(item); const wxString& newName = event.GetLabel(); if (newName == _T("")) { wxBell(); event.Veto(); return; } wxASSERT(parent + oldName == path); if (oldName == newName) return; if (!Rename(this, parent, oldName, newName)) { event.Veto(); return; } // We may call SetLocalDir, item might be deleted by it, so // if we don't rename item now and veto the event, wxWidgets // might access deleted item. event.Veto(); SetItemText(item, newName); wxTreeItemId currentSel = GetSelection(); if (currentSel == wxTreeItemId()) { Refresh(); return; } if (item == currentSel) { m_pState->SetLocalDir(parent + newName); return; } wxString sub; wxTreeItemId tmp = currentSel; while (tmp != GetRootItem() && tmp != item) { sub = wxFileName::GetPathSeparator() + GetItemText(tmp) + sub; tmp = GetItemParent(tmp); } if (tmp == GetRootItem()) { // Rename unrelated to current selection return; } // Current selection below renamed item m_pState->SetLocalDir(parent + newName + sub); }