aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDennis Syrovatsky <dennis@tightvnc.com>2005-12-15 14:20:03 +0000
committerDennis Syrovatsky <dennis@tightvnc.com>2005-12-15 14:20:03 +0000
commit1a3a5532a6c6924258040d24bd47fc4132c17a0f (patch)
tree560cc32ed71fbc5d630de0bd1e662b85c02a5f6c
parentb0b7247602f2c18015f321d7c2b7642a04e03987 (diff)
downloadtigervnc-1a3a5532a6c6924258040d24bd47fc4132c17a0f.tar.gz
tigervnc-1a3a5532a6c6924258040d24bd47fc4132c17a0f.zip
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
-rw-r--r--vncviewer/FTBrowseDlg.cxx78
-rw-r--r--vncviewer/FTBrowseDlg.h8
-rw-r--r--vncviewer/FTDialog.cxx42
-rw-r--r--vncviewer/FTDialog.h3
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;
@@ -362,9 +363,35 @@ FTDialog::onRemoteItemActivate(LPNMITEMACTIVATE lpnmia)
}
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();
@@ -881,6 +910,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)
{
if (m_pBrowseDlg == NULL) return;
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;