From 1a3a5532a6c6924258040d24bd47fc4132c17a0f Mon Sep 17 00:00:00 2001 From: Dennis Syrovatsky Date: Thu, 15 Dec 2005 14:20:03 +0000 Subject: [PATCH] Added browse folders possibility on both sides (local and remote). Code improvements. git-svn-id: svn://svn.code.sf.net/p/tigervnc/code/trunk@457 3789f03b-4d11-0410-bbf8-ca57d06f2519 --- vncviewer/FTBrowseDlg.cxx | 78 ++++++++++++++++++++++++++++++++++++--- vncviewer/FTBrowseDlg.h | 8 ++++ vncviewer/FTDialog.cxx | 42 +++++++++++++++++++++ vncviewer/FTDialog.h | 3 ++ 4 files changed, 125 insertions(+), 6 deletions(-) diff --git a/vncviewer/FTBrowseDlg.cxx b/vncviewer/FTBrowseDlg.cxx index 81cd882e..7c88ff6a 100644 --- a/vncviewer/FTBrowseDlg.cxx +++ b/vncviewer/FTBrowseDlg.cxx @@ -30,6 +30,8 @@ FTBrowseDlg::FTBrowseDlg(FTDialog *pFTDlg) { m_pFTDlg = pFTDlg; m_hwndDlg = NULL; + m_hwndTree = NULL; + m_hParentItem = NULL; } FTBrowseDlg::~FTBrowseDlg() @@ -46,6 +48,8 @@ FTBrowseDlg::create() if (m_hwndDlg == NULL) return false; + m_hwndTree = GetDlgItem(m_hwndDlg, IDC_FTBROWSETREE); + ShowWindow(m_hwndDlg, SW_SHOW); UpdateWindow(m_hwndDlg); @@ -64,17 +68,70 @@ FTBrowseDlg::addItems(FileInfo *pFI) TVITEM tvi; TVINSERTSTRUCT tvins; + while (TreeView_GetChild(m_hwndTree, m_hParentItem) != NULL) { + TreeView_DeleteItem(m_hwndTree, TreeView_GetChild(m_hwndTree, m_hParentItem)); + } + for (unsigned int i = 0; i < pFI->getNumEntries(); i++) { tvi.mask = TVIF_TEXT; tvi.pszText = pFI->getNameAt(i);; - tvins.hParent = NULL; + tvins.hParent = m_hParentItem; tvins.item = tvi; - tvins.hParent = TreeView_InsertItem(GetDlgItem(m_hwndDlg, IDC_FTBROWSETREE), &tvins); - TreeView_InsertItem(GetDlgItem(m_hwndDlg, IDC_FTBROWSETREE), &tvins); + tvins.hParent = TreeView_InsertItem(m_hwndTree, &tvins); + TreeView_InsertItem(m_hwndTree, &tvins); } } +char * +FTBrowseDlg::getTVPath(HTREEITEM hTItem) +{ + char path[FT_FILENAME_SIZE]; + char szText[FT_FILENAME_SIZE]; + + TVITEM tvi; + path[0] = '\0'; + + do { + tvi.mask = TVIF_TEXT | TVIF_HANDLE; + tvi.hItem = hTItem; + tvi.pszText = szText; + tvi.cchTextMax = FT_FILENAME_SIZE; + TreeView_GetItem(m_hwndTree, &tvi); + sprintf(path, "%s\\%s", path, tvi.pszText); + hTItem = TreeView_GetParent(m_hwndTree, hTItem); + } while(hTItem != NULL); + + return pathInvert(path); +} + +char * +FTBrowseDlg::pathInvert(char *pPath) +{ + int len = strlen(pPath); + m_szPath[0] = '\0'; + char *pos = NULL; + + while ((pos = strrchr(pPath, '\\')) != NULL) { + if (strlen(m_szPath) == 0) { + strcpy(m_szPath, (pos + 1)); + } else { + sprintf(m_szPath, "%s\\%s", m_szPath, (pos + 1)); + } + *pos = '\0'; + } + + m_szPath[len] = '\0'; + return m_szPath; +} + +char * +FTBrowseDlg::getPath() +{ + GetDlgItemText(m_hwndDlg, IDC_FTBROWSEPATH, m_szPath, FT_FILENAME_SIZE); + return m_szPath; +} + BOOL CALLBACK FTBrowseDlg::FTBrowseDlgProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { @@ -92,8 +149,10 @@ FTBrowseDlg::FTBrowseDlgProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) switch (LOWORD(wParam)) { case IDOK: + _this->m_pFTDlg->onEndBrowseDlg(true); return FALSE; case IDCANCEL: + _this->m_pFTDlg->onEndBrowseDlg(false); return FALSE; } } @@ -105,16 +164,23 @@ FTBrowseDlg::FTBrowseDlgProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) switch (((LPNMHDR) lParam)->code) { case TVN_SELCHANGED: + SetDlgItemText(hwnd, IDC_FTBROWSEPATH, _this->getTVPath(((NMTREEVIEW *) lParam)->itemNew.hItem)); return FALSE; case TVN_ITEMEXPANDING: + { + NMTREEVIEW *nmCode = (NMTREEVIEW *) lParam; + if (nmCode->action == 2) { + _this->m_hParentItem = nmCode->itemNew.hItem; + _this->m_pFTDlg->getBrowseItems(_this->getTVPath(_this->m_hParentItem)); + } + } return FALSE; } - break; - } break; case WM_CLOSE: - case WM_DESTROY: + _this->m_pFTDlg->onEndBrowseDlg(false); return FALSE; } + } return 0; } diff --git a/vncviewer/FTBrowseDlg.h b/vncviewer/FTBrowseDlg.h index 0ebf5693..1a5e6636 100644 --- a/vncviewer/FTBrowseDlg.h +++ b/vncviewer/FTBrowseDlg.h @@ -47,10 +47,18 @@ namespace rfb { void destroy(); void addItems(FileInfo *pFI); + char *getPath(); private: HWND m_hwndDlg; + HWND m_hwndTree; FTDialog *m_pFTDlg; + HTREEITEM m_hParentItem; + + char m_szPath[FT_FILENAME_SIZE]; + + char *pathInvert(char *pPath); + char *getTVPath(HTREEITEM hTItem); }; } } diff --git a/vncviewer/FTDialog.cxx b/vncviewer/FTDialog.cxx index b7ec9ba9..5998a0f2 100644 --- a/vncviewer/FTDialog.cxx +++ b/vncviewer/FTDialog.cxx @@ -36,6 +36,7 @@ FTDialog::FTDialog(HINSTANCE hInst, FileTransfer *pFT) m_hInstance = hInst; m_bDlgShown = false; + m_bLocalBrowsing = true; m_bCloseDlgAfterCancel = false; m_pLocalLV = NULL; @@ -361,10 +362,36 @@ FTDialog::onRemoteItemActivate(LPNMITEMACTIVATE lpnmia) showRemoteLVItems(); } +void +FTDialog::onEndBrowseDlg(bool bResult) +{ + if (m_pBrowseDlg == NULL) return; + + if (bResult) { + if (m_bLocalBrowsing) { + strcpy(m_szLocalPathTmp, m_pBrowseDlg->getPath()); + showLocalLVItems(); + } else { + strcpy(m_szRemotePathTmp, m_pBrowseDlg->getPath()); + showRemoteLVItems(); + } + } + + delete m_pBrowseDlg; + m_pBrowseDlg = NULL; +} + void FTDialog::onLocalBrowse() { + if (m_pBrowseDlg != NULL) return; + + m_bLocalBrowsing = true; + + m_pBrowseDlg = new FTBrowseDlg(this); + m_pBrowseDlg->create(); + getBrowseItems(""); } void @@ -372,6 +399,8 @@ FTDialog::onRemoteBrowse() { if (m_pBrowseDlg != NULL) return; + m_bLocalBrowsing = false; + m_pBrowseDlg = new FTBrowseDlg(this); m_pBrowseDlg->create(); @@ -880,6 +909,19 @@ FTDialog::setStatusText(LPCSTR format,...) } } +void +FTDialog::getBrowseItems(char *pPath) +{ + if (m_bLocalBrowsing) { + FileInfo fi; + FolderManager fm; + fm.getDirInfo(pPath, &fi, 1); + if (m_pBrowseDlg != NULL) m_pBrowseDlg->addItems(&fi); + } else { + m_pFileTransfer->requestFileList(pPath, FT_FLR_DEST_BROWSE, true); + } +} + void FTDialog::addBrowseItems(FileInfo *pFI) { diff --git a/vncviewer/FTDialog.h b/vncviewer/FTDialog.h index d505e5f1..36cb669f 100644 --- a/vncviewer/FTDialog.h +++ b/vncviewer/FTDialog.h @@ -60,6 +60,8 @@ namespace rfb { void addRemoteLVItems(FileInfo *pFI); void reqFolderUnavailable(); + void onEndBrowseDlg(bool bResult); + void getBrowseItems(char *pPath); void addBrowseItems(FileInfo *pFI); void setStatusText(LPCSTR format,...); @@ -132,6 +134,7 @@ namespace rfb { void setButtonsState(); bool m_bDlgShown; + bool m_bLocalBrowsing; bool m_bCloseDlgAfterCancel; UINT m_msgCheckDeleteQueue; -- 2.39.5