void SFTPTreeView::OnFileDropped(clCommandEvent& event) { wxArrayTreeItemIds items; m_treeCtrl->GetSelections(items); wxTreeItemId parenItem; wxString defaultPath = m_textCtrlQuickJump->GetValue(); if(items.size() == 1) { // Use the selected folder as the default path MyClientData* cd = GetItemData(items.Item(0)); if(cd && cd->IsFolder()) { defaultPath = cd->GetFullPath(); parenItem = items.Item(0); } } SFTPUploadDialog dlg(EventNotifier::Get()->TopFrame()); dlg.GetTextCtrlRemoteFolder()->ChangeValue(defaultPath); if(dlg.ShowModal() != wxID_OK) return; const wxString targetFolder = dlg.GetTextCtrlRemoteFolder()->GetValue(); const wxArrayString& files = event.GetStrings(); for(size_t i = 0; i < files.size(); ++i) { wxFileName localFile(files.Item(i)); wxString remotePath; remotePath << targetFolder << "/" << localFile.GetFullName(); if(parenItem.IsOk()) { wxTreeItemId fileItem = DoAddFile(parenItem, remotePath); if(!fileItem.IsOk()) continue; } SFTPWorkerThread::Instance()->Add(new SFTPThreadRequet(m_account, remotePath, localFile.GetFullPath(), 0)); } }
void SFTPTreeView::OnContextMenu(wxTreeListEvent& event) { CHECK_ITEM_RET(event.GetItem()); MyClientData* cd = GetItemData(event.GetItem()); wxMenu menu; if(cd) { // Just incase, make sure the item is selected m_treeListCtrl->Select(event.GetItem()); if(!cd->IsFolder()) { menu.Append(ID_OPEN, _("Open")); menu.Append(ID_OPEN_WITH_DEFAULT_APP, _("Open with Default Application...")); menu.AppendSeparator(); menu.Append(ID_OPEN_CONTAINING_FOLDER, _("Download and Open Containing Folder...")); menu.AppendSeparator(); } else { menu.Append(ID_NEW, _("Create new directory...")); menu.Append(ID_NEW_FILE, _("Create new file...")); menu.AppendSeparator(); menu.Append(ID_REFRESH_FOLDER, _("Refresh")); menu.AppendSeparator(); } menu.Append(ID_DELETE, _("Delete")); #ifdef __WXMAC__ menu.Enable(ID_DELETE, false); #endif menu.Append(ID_RENAME, _("Rename")); } m_treeListCtrl->PopupMenu(&menu); }
wxTreeListItem SFTPTreeView::DoAddFile(const wxTreeListItem& parent, const wxString& path) { try { wxMemoryBuffer memBuffer; m_sftp->Write(memBuffer, path); SFTPAttribute::Ptr_t attr = m_sftp->Stat(path); // Update the UI MyClientData* newFile = new MyClientData(path); newFile->SetIsFolder(false); newFile->SetInitialized(false); wxTreeListItem child = m_treeListCtrl->AppendItem( parent, newFile->GetFullName(), m_bmpLoader.GetMimeImageId(FileExtManager::GetType(path, FileExtManager::TypeText)), wxNOT_FOUND, newFile); m_treeListCtrl->SetSortColumn(0); return child; } catch(clException& e) { ::wxMessageBox(e.What(), "SFTP", wxICON_ERROR | wxOK | wxCENTER); } return wxTreeListItem(); }
wxTreeListItem SFTPTreeView::DoAddFolder(const wxTreeListItem& parent, const wxString& path) { try { m_sftp->CreateDir(path); SFTPAttribute::Ptr_t attr = m_sftp->Stat(path); // Update the UI MyClientData* newCd = new MyClientData(path); newCd->SetIsFolder(true); newCd->SetInitialized(false); wxTreeListItem child = m_treeListCtrl->AppendItem( parent, newCd->GetFullName(), m_bmpLoader.GetMimeImageId(FileExtManager::TypeFolder), wxNOT_FOUND, newCd); if(IsTypeColumnShown()) { m_treeListCtrl->SetItemText(child, GetTypeColumnIndex(), attr->GetTypeAsString()); } if(IsSizeColumnShown()) { m_treeListCtrl->SetItemText(child, GetSizeColumnIndex(), wxString() << attr->GetSize()); } m_treeListCtrl->AppendItem(child, "<dummy>"); m_treeListCtrl->SetSortColumn(0); return child; } catch(clException& e) { ::wxMessageBox(e.What(), "SFTP", wxICON_ERROR | wxOK | wxCENTER); } return wxTreeListItem(); }
void SFTPTreeView::OnContextMenu(wxTreeListEvent& event) { CHECK_ITEM_RET(event.GetItem()); MyClientData* cd = GetItemData(event.GetItem()); CHECK_PTR_RET(cd); // Just incase, make sure the item is selected m_treeListCtrl->Select(event.GetItem()); wxMenu menu; if ( !cd->IsFolder() ) { menu.Append(ID_OPEN, _("Open")); menu.AppendSeparator(); } else { menu.Append(ID_NEW, _("Create directory")); menu.AppendSeparator(); } menu.Append(ID_DELETE, _("Delete")); #ifdef __WXMAC__ menu.Enable(ID_DELETE, false); #endif menu.Append(ID_RENAME, _("Rename")); m_treeListCtrl->PopupMenu( &menu ); }
void SFTPTreeView::OnMenuNewFile(wxCommandEvent& event) { wxTreeListItems items; m_treeListCtrl->GetSelections(items); if(items.size() != 1) return; MyClientData* cd = GetItemData(items.at(0)); CHECK_PTR_RET(cd); if(!cd->IsFolder()) { return; } wxString defaultValue; static size_t s_untitledCounter = 0; defaultValue << "Untitled" << ++s_untitledCounter; wxString new_name = ::wxGetTextFromUser(_("Enter the new file name:"), _("New File"), defaultValue); if(!new_name.IsEmpty()) { wxString fullpath = cd->GetFullPath(); fullpath << "/" << new_name; wxTreeListItem fileItem = DoAddFile(items.at(0), fullpath); if(fileItem.IsOk()) { DoOpenFile(fileItem); } } }
void SFTPTreeView::OnMenuRename(wxCommandEvent& event) { wxTreeListItems items; m_treeListCtrl->GetSelections(items); if(items.empty()) return; try { for(size_t i = 0; i < items.size(); ++i) { MyClientData* cd = GetItemData(items.at(i)); if(!cd) continue; // ?? wxString new_name = ::wxGetTextFromUser(_("Enter new name:"), _("Rename"), cd->GetFullName()); if(!new_name.IsEmpty()) { wxString old_path = cd->GetFullPath(); cd->SetFullName(new_name); m_sftp->Rename(old_path, cd->GetFullPath()); // Remove the selection m_treeListCtrl->SetItemText(items.at(i), 0, new_name); } } } catch(clException& e) { ::wxMessageBox(e.What(), "SFTP", wxICON_ERROR | wxOK | wxCENTER); } }
void SFTPTreeView::OnMenuRefreshFolder(wxCommandEvent& event) { wxTreeListItems items; m_treeListCtrl->GetSelections(items); if(items.size() != 1) return; wxTreeListItem item = items.at(0); MyClientData* cd = GetItemData(item); if(!cd || !cd->IsFolder()) { return; } // Uninitialize the folder cd->SetInitialized(false); // Delete all the children wxTreeListItem child = m_treeListCtrl->GetFirstChild(item); while(child.IsOk()) { wxTreeListItem nextChild = m_treeListCtrl->GetNextSibling(child); m_treeListCtrl->DeleteItem(child); child = nextChild; } // Re-append the dummy item m_treeListCtrl->AppendItem(item, "<dummy>"); m_treeListCtrl->Collapse(item); }
void SFTPTreeView::OnMenuDelete(wxCommandEvent& event) { wxTreeListItems items; m_treeListCtrl->GetSelections(items); if(items.empty()) return; wxString message; message << _("Are you sure you want to delete the selected items?"); if(::wxMessageBox(message, "Confirm", wxYES_NO | wxCANCEL | wxICON_QUESTION) != wxYES) { return; } try { for(size_t i = 0; i < items.size(); ++i) { MyClientData* cd = GetItemData(items.at(i)); if(cd->IsFolder()) { m_sftp->RemoveDir(cd->GetFullPath()); } else { m_sftp->UnlinkFile(cd->GetFullPath()); } // Remove the selection m_treeListCtrl->DeleteItem(items.at(i)); } } catch(clException& e) { ::wxMessageBox(e.What(), "SFTP", wxICON_ERROR | wxOK | wxCENTER); } }
void SFTPTreeView::OnSelectionChanged(wxTreeEvent& event) { MyClientDataVect_t items = GetSelectionsItemData(); if(items.size() != 1) return; MyClientData* cd = items.at(0); if(cd->IsFolder()) { m_textCtrlQuickJump->ChangeValue(cd->GetFullPath()); } }
void SFTPTreeView::OnAddBookmark(wxAuiToolBarEvent& event) { if ( event.IsDropDownClicked() ) { // Show the menu const wxArrayString &bookmarks = m_account.GetBookmarks(); wxMenu menu; for(size_t i=0; i<bookmarks.GetCount(); ++i) { menu.Append(ID_SFTP_BOOKMARK_FIRST+i, bookmarks.Item(i)); } menu.AppendSeparator(); menu.Append(ID_SFTP_BOOKMARK_SETTINGS, _("Manage bookmarks...")); wxPoint pt = event.GetItemRect().GetBottomLeft(); pt.y++; int sel = m_auibar->GetPopupMenuSelectionFromUser( menu, pt ); if ( sel >= ID_SFTP_BOOKMARK_FIRST && sel <= ID_SFTP_BOOKMARK_LAST ) { // A bookmark was selected CallAfter( &SFTPTreeView::DoBuildTree, bookmarks.Item(sel - ID_SFTP_BOOKMARK_FIRST) ); } else if ( sel == ID_SFTP_BOOKMARK_SETTINGS ) { // Bookmark settings CallAfter( &SFTPTreeView::ManageBookmarks ); } } else { try { // sanity if ( !m_sftp || !m_sftp->IsConnected() ) { return; } // Get the current selection MyClientDataVect_t selections = GetSelectionsItemData(); if ( selections.size() != 1 ) return; MyClientData* cd = selections.at(0); CHECK_PTR_RET( cd ); if ( !cd->IsFolder() ) return; m_account.AddBookmark( cd->GetFullPath() ); SFTPSettings settings; settings.Load(); settings.UpdateAccount( m_account ); settings.Save(); } catch (clException &e) { ::wxMessageBox(e.What(), "SFTP", wxICON_ERROR|wxOK|wxCENTER); } } }
void SFTPTreeView::OnContextMenu(wxTreeListEvent& event) { CHECK_ITEM_RET(event.GetItem()); MyClientData* cd = GetItemData(event.GetItem()); wxMenu menu; if(cd) { // Just incase, make sure the item is selected m_treeListCtrl->Select(event.GetItem()); if(!cd->IsFolder()) { menu.Append(ID_OPEN, _("Open")); menu.AppendSeparator(); } else { menu.Append(ID_NEW, _("Create new directory...")); menu.Append(ID_NEW_FILE, _("Create new file...")); menu.AppendSeparator(); menu.Append(ID_REFRESH_FOLDER, _("Refresh")); menu.AppendSeparator(); } menu.Append(ID_DELETE, _("Delete")); #ifdef __WXMAC__ menu.Enable(ID_DELETE, false); #endif menu.Append(ID_RENAME, _("Rename")); } #if defined(__WXMSW__) || defined(__WXOSX__) if(cd) { menu.AppendSeparator(); } // Append headers column menu items menu.Append(ID_SHOW_TYPE_COL, _("Show 'Type' column"), "", wxITEM_CHECK); menu.Append(ID_SHOW_SIZE_COL, _("Show 'Size' column"), "", wxITEM_CHECK); menu.Check(ID_SHOW_TYPE_COL, IsTypeColumnShown()); menu.Check(ID_SHOW_SIZE_COL, IsSizeColumnShown()); // Due to bug in wxWidgets, don't allow the user to remove columns once the // tree is populated menu.Enable(ID_SHOW_TYPE_COL, !IsConnected()); menu.Enable(ID_SHOW_SIZE_COL, !IsConnected()); #endif m_treeListCtrl->PopupMenu(&menu); }
void SFTPTreeView::DoBuildTree(const wxString& initialFolder) { m_treeCtrl->DeleteAllItems(); // add the root item MyClientData* cd = new MyClientData(initialFolder); cd->SetIsFolder(true); wxTreeItemId root = m_treeCtrl->AppendItem(m_treeCtrl->GetRootItem(), initialFolder, m_bmpLoader->GetMimeImageId(FileExtManager::TypeFolder), wxNOT_FOUND, cd); m_treeCtrl->AppendItem(root, "<dummy>"); DoExpandItem(root); }
bool SFTPTreeView::DoOpenFile(const wxTreeItemId& item) { MyClientData* cd = GetItemData(item); if(!cd || cd->IsFolder()) { return false; } RemoteFileInfo remoteFile; remoteFile.SetAccount(m_account); remoteFile.SetRemoteFile(cd->GetFullPath()); SFTPThreadRequet* req = new SFTPThreadRequet(remoteFile); SFTPWorkerThread::Instance()->Add(req); m_plugin->AddRemoteFile(remoteFile); return true; }
void SFTPTreeView::OnItemActivated(wxTreeEvent& event) { event.Skip(); MyClientData* cd = GetItemData(event.GetItem()); CHECK_PTR_RET(cd); if(cd->IsFolder()) { wxTreeItemId item = event.GetItem(); if(m_treeCtrl->IsExpanded(item)) { m_treeCtrl->CallAfter(&wxTreeCtrl::Collapse, item); } else { m_treeCtrl->CallAfter(&wxTreeCtrl::Expand, item); } } else { DoOpenFile(cd->GetFullPath()); } }
void SFTPTreeView::OnMenuOpenContainingFolder(wxCommandEvent& event) { wxArrayTreeItemIds items; m_treeCtrl->GetSelections(items); if(items.empty()) return; for(size_t i = 0; i < items.size(); ++i) { MyClientData* cd = GetItemData(items.Item(i)); if(!cd || cd->IsFolder()) { continue; } RemoteFileInfo remoteFile; remoteFile.SetAccount(m_account); remoteFile.SetRemoteFile(cd->GetFullPath()); SFTPThreadRequet* req = new SFTPThreadRequet(remoteFile); req->SetAction(eSFTPActions::kDownloadAndOpenContainingFolder); SFTPWorkerThread::Instance()->Add(req); } }
void SFTPTreeView::OnMenuNew(wxCommandEvent& event) { wxArrayTreeItemIds items; m_treeCtrl->GetSelections(items); if(items.size() != 1) return; MyClientData* cd = GetItemData(items.Item(0)); CHECK_PTR_RET(cd); if(!cd->IsFolder()) { return; } wxString new_name = ::wxGetTextFromUser(_("Enter the new directory name:"), _("New Directory")); if(!new_name.IsEmpty()) { wxString fullpath = cd->GetFullPath(); fullpath << "/" << new_name; DoAddFolder(items.Item(0), fullpath); } }
bool SFTPTreeView::DoExpandItem(const wxTreeItemId& item) { MyClientData* cd = GetItemData(item); CHECK_PTR_RET_FALSE(cd); // already initialized this folder before? if(cd->IsInitialized()) { return true; } // get list of files and populate the tree SFTPAttribute::List_t attributes; try { attributes = m_sftp->List(cd->GetFullPath(), clSFTP::SFTP_BROWSE_FILES | clSFTP::SFTP_BROWSE_FOLDERS); } catch(clException& e) { ::wxMessageBox(e.What(), "SFTP", wxOK | wxICON_ERROR | wxCENTER, EventNotifier::Get()->TopFrame()); return false; } // Remove the dummy item and replace it with real items wxTreeItemIdValue cookie; wxTreeItemId dummyItem = m_treeCtrl->GetFirstChild(item, cookie); m_treeCtrl->Delete(dummyItem); cd->SetInitialized(true); int nNumOfRealChildren = 0; SFTPAttribute::List_t::iterator iter = attributes.begin(); for(; iter != attributes.end(); ++iter) { SFTPAttribute::Ptr_t attr = (*iter); if(attr->GetName() == "." || attr->GetName() == "..") continue; ++nNumOfRealChildren; // determine the icon index int imgIdx = wxNOT_FOUND; if(attr->IsFolder()) { imgIdx = m_bmpLoader->GetMimeImageId(FileExtManager::TypeFolder); } else { imgIdx = m_bmpLoader->GetMimeImageId(attr->GetName()); } if(imgIdx == wxNOT_FOUND) { imgIdx = m_bmpLoader->GetMimeImageId(FileExtManager::TypeText); } wxString path; path << cd->GetFullPath() << "/" << attr->GetName(); while(path.Replace("//", "/")) {} MyClientData* childClientData = new MyClientData(path); childClientData->SetIsFolder(attr->IsFolder()); wxTreeItemId child = m_treeCtrl->AppendItem(item, attr->GetName(), imgIdx, imgIdx, childClientData); // if its type folder, add a fake child item if(attr->IsFolder()) { m_treeCtrl->AppendItem(child, "<dummy>"); } } return nNumOfRealChildren > 0; }
void SFTPTreeView::OnItemActivated(wxTreeListEvent& event) { event.Skip(); MyClientData* cd = GetItemData(event.GetItem()); CHECK_PTR_RET(cd); if(cd->IsFolder()) { m_treeListCtrl->Expand(event.GetItem()); } else { RemoteFileInfo remoteFile; remoteFile.SetAccount(m_account); remoteFile.SetRemoteFile(cd->GetFullPath()); SFTPThreadRequet* req = new SFTPThreadRequet(remoteFile); SFTPWorkerThread::Instance()->Add(req); m_plugin->AddRemoteFile(remoteFile); } }
wxTreeItemId SFTPTreeView::DoAddFolder(const wxTreeItemId& parent, const wxString& path) { try { m_sftp->CreateDir(path); SFTPAttribute::Ptr_t attr = m_sftp->Stat(path); // Update the UI MyClientData* newCd = new MyClientData(path); newCd->SetIsFolder(true); newCd->SetInitialized(false); wxTreeItemId child = m_treeCtrl->AppendItem( parent, newCd->GetFullName(), m_bmpLoader->GetMimeImageId(FileExtManager::TypeFolder), wxNOT_FOUND, newCd); m_treeCtrl->AppendItem(child, "<dummy>"); return child; } catch(clException& e) { ::wxMessageBox(e.What(), "SFTP", wxICON_ERROR | wxOK | wxCENTER); } return wxTreeItemId(); }
void SFTPTreeView::OnMenuOpenWithDefaultApplication(wxCommandEvent& event) { wxTreeListItems items; m_treeListCtrl->GetSelections(items); if(items.empty()) return; for(size_t i = 0; i < items.size(); ++i) { MyClientData* cd = GetItemData(items.at(i)); if(!cd || cd->IsFolder()) { continue; } RemoteFileInfo remoteFile; remoteFile.SetAccount(m_account); remoteFile.SetRemoteFile(cd->GetFullPath()); SFTPThreadRequet* req = new SFTPThreadRequet(remoteFile); req->SetDirection(SFTPThreadRequet::kDownloadAndOpenWithDefaultApp); SFTPWorkerThread::Instance()->Add(req); } }
int SFTPItemComparator::Compare(wxTreeListCtrl* treelist, unsigned column, wxTreeListItem first, wxTreeListItem second) { // get the item data MyClientData *cdOne = dynamic_cast<MyClientData *>(treelist->GetItemData(first)); MyClientData *cdTwo = dynamic_cast<MyClientData *>(treelist->GetItemData(second)); if ( column != 0 ) return 0; if ( !cdOne || !cdTwo ) return 0; if ( cdOne->IsFolder() && !cdTwo->IsFolder()) return -1; else if ( !cdOne->IsFolder() && cdTwo->IsFolder() ) return 1; else return cdOne->GetFullName() > cdTwo->GetFullName(); }