blob: 761e03b25104f76b3d228df30cba1927807310eb [file] [log] [blame]
/* 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 <vncviewer/FTBrowseDlg.h>
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;
}