/* Copyright (C) 2005 TightVNC Team. All Rights Reserved. * * Developed by Dennis Syrovatsky * * This is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This software is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this software; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, * USA. * * * */ // -=- FTBrpwseDlg.cxx #include using namespace rfb; using namespace rfb::win32; FTBrowseDlg::FTBrowseDlg(FTDialog *pFTDlg) { m_pFTDlg = pFTDlg; m_hwndDlg = NULL; m_hwndTree = NULL; m_hParentItem = NULL; } FTBrowseDlg::~FTBrowseDlg() { destroy(); } bool FTBrowseDlg::create() { m_hwndDlg = CreateDialogParam(GetModuleHandle(0), MAKEINTRESOURCE(IDD_FTBROWSE), m_pFTDlg->getWndHandle(), (DLGPROC) FTBrowseDlgProc, (LONG) this); if (m_hwndDlg == NULL) return false; m_hwndTree = GetDlgItem(m_hwndDlg, IDC_FTBROWSETREE); ShowWindow(m_hwndDlg, SW_SHOW); UpdateWindow(m_hwndDlg); return true; } void FTBrowseDlg::destroy() { EndDialog(m_hwndDlg, 0); } void FTBrowseDlg::addItems(FileInfo *pFI) { TVITEM tvi; TVINSERTSTRUCT tvins; if (pFI->getNumEntries() <= 0) return; for (unsigned int i = 0; i < pFI->getNumEntries(); i++) { tvi.mask = TVIF_TEXT; tvi.pszText = pFI->getNameAt(i);; tvins.hParent = m_hParentItem; tvins.item = tvi; 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; } void FTBrowseDlg::deleteChildItems() { while (TreeView_GetChild(m_hwndTree, m_hParentItem) != NULL) { TreeView_DeleteItem(m_hwndTree, TreeView_GetChild(m_hwndTree, m_hParentItem)); } } BOOL CALLBACK FTBrowseDlg::FTBrowseDlgProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { FTBrowseDlg *_this = (FTBrowseDlg *) GetWindowLong(hwnd, GWL_USERDATA); switch (uMsg) { case WM_INITDIALOG: { SetWindowLong(hwnd, GWL_USERDATA, lParam); return FALSE; } break; case WM_COMMAND: { switch (LOWORD(wParam)) { case IDOK: _this->m_pFTDlg->onEndBrowseDlg(true); return FALSE; case IDCANCEL: _this->m_pFTDlg->onEndBrowseDlg(false); return FALSE; } } break; case WM_NOTIFY: switch (LOWORD(wParam)) { case IDC_FTBROWSETREE: switch (((LPNMHDR) lParam)->code) { case TVN_SELCHANGED: SetDlgItemText(hwnd, IDC_FTBROWSEPATH, _this->getTVPath(((NMTREEVIEW *) lParam)->itemNew.hItem)); return FALSE; // case TVN_ITEMEXPANDING: case TVN_ITEMEXPANDED: { NMTREEVIEW *nmCode = (NMTREEVIEW *) lParam; if (nmCode->action == 2) { _this->m_hParentItem = nmCode->itemNew.hItem; _this->deleteChildItems(); _this->m_pFTDlg->getBrowseItems(_this->getTVPath(_this->m_hParentItem)); } } return FALSE; } break; case WM_CLOSE: _this->m_pFTDlg->onEndBrowseDlg(false); return FALSE; } } return 0; }