]> source.dussan.org Git - tigervnc.git/commitdiff
Added browse folders possibility on both sides (local and remote).
authorDennis Syrovatsky <dennis@tightvnc.com>
Thu, 15 Dec 2005 14:20:03 +0000 (14:20 +0000)
committerDennis Syrovatsky <dennis@tightvnc.com>
Thu, 15 Dec 2005 14:20:03 +0000 (14:20 +0000)
Code improvements.

git-svn-id: svn://svn.code.sf.net/p/tigervnc/code/trunk@457 3789f03b-4d11-0410-bbf8-ca57d06f2519

vncviewer/FTBrowseDlg.cxx
vncviewer/FTBrowseDlg.h
vncviewer/FTDialog.cxx
vncviewer/FTDialog.h

index 81cd882ede22bb84c198c25142fac895ecb62463..7c88ff6a90327623217033bd8dfda4c013ff7783 100644 (file)
@@ -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;
 }
index 0ebf569317a8836c2458d4da3d526bd039e0a706..1a5e66362063f4e0e0b2209ce4b3f9e317cd385d 100644 (file)
@@ -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);
     };
   }
 }
index b7ec9ba9f816acb710576ac24b38658772059786..5998a0f29842ee509a99ee57b1650d4832d6ea1a 100644 (file)
@@ -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)
 {
index d505e5f10b3e0f0363dd54b34cf2cc43f158b6e6..36cb669f6884cccc7e30cadec622a90a5508f025 100644 (file)
@@ -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;