diff --git a/vncviewer/FTDialog.cxx b/vncviewer/FTDialog.cxx
index ece35ae..dacce7b 100644
--- a/vncviewer/FTDialog.cxx
+++ b/vncviewer/FTDialog.cxx
@@ -159,20 +159,46 @@
     {
       switch (LOWORD(wParam))
       {
+      case IDC_FTLOCALPATH:
+        switch (HIWORD (wParam))
+        {
+        case CBN_SETFOCUS:
+          _this->refreshState();
+          return FALSE;
+        }
+        break;
+        case IDC_FTREMOTEPATH:
+          switch (HIWORD (wParam))
+          {
+          case CBN_SETFOCUS:
+            _this->refreshState();
+            return FALSE;
+          }
+          break;
       case IDC_FTCLOSE:
         _this->closeFTDialog();
         return FALSE;
       case IDC_FTLOCALUP:
+        _this->refreshState();
         _this->onLocalOneUpFolder();
         return FALSE;
       case IDC_FTREMOTEUP:
+        _this->refreshState();
         _this->onRemoteOneUpFolder();
         return FALSE;
       case IDC_FTLOCALRELOAD:
+        _this->refreshState();
         _this->onLocalReload();
         return FALSE;
       case IDC_FTREMOTERELOAD:
-        _this->onRemoteReload();
+       _this->refreshState();
+       _this->onRemoteReload();
+        return FALSE;
+      case IDC_FTUPLOAD:
+        _this->onUpload();
+        return FALSE;
+      case IDC_FTDOWNLOAD:
+        _this->onDownload();
         return FALSE;
       }
     }
@@ -184,23 +210,36 @@
     case IDC_FTLOCALLIST:
       switch (((LPNMHDR) lParam)->code)
       {
+      case NM_CLICK:
+      case NM_SETFOCUS:
+      case LVN_ITEMCHANGED:
+        _this->refreshState();
+        return FALSE;
       case LVN_GETDISPINFO:
         _this->m_pLocalLV->onGetDispInfo((NMLVDISPINFO *) lParam);
         return FALSE;
       case LVN_ITEMACTIVATE:
         _this->onLocalItemActivate((LPNMITEMACTIVATE) lParam);
         return FALSE;
+      case NM_RCLICK:
+        return FALSE;
       }
       break;
     case IDC_FTREMOTELIST:
       switch (((LPNMHDR) lParam)->code)
       {
+      case NM_CLICK:
+      case NM_SETFOCUS:
+      case LVN_ITEMCHANGED:
+        _this->refreshState();
       case LVN_GETDISPINFO:
         _this->m_pRemoteLV->onGetDispInfo((NMLVDISPINFO *) lParam);
         return FALSE;
       case LVN_ITEMACTIVATE:
         _this->onRemoteItemActivate((LPNMITEMACTIVATE) lParam);
         return FALSE;
+      case NM_RCLICK:
+        return FALSE;
       }
       break;
     }
@@ -316,6 +355,18 @@
   return strlen(pPath);
 }
 
+void 
+FTDialog::onUpload()
+{
+
+}
+
+void 
+FTDialog::onDownload()
+{
+
+}
+
 void
 FTDialog::setIcon(int dest, int idIcon)
 {
@@ -323,3 +374,80 @@
   SendMessage(GetDlgItem(m_hwndFTDialog, dest), BM_SETIMAGE, (WPARAM) IMAGE_ICON, (LPARAM) hIcon);
   DestroyIcon((HICON) hIcon);
 }
+
+void
+FTDialog::refreshState()
+{
+  if (!m_bDlgShown) return;
+  
+  int locPathLen = strlen(m_szLocalPath);
+  int remPathLen = strlen(m_szRemotePath);
+  
+  if (GetFocus() == m_pLocalLV->getWndHandle()) {
+    if (strlen(m_szLocalPath) != 0) {
+      int nCount = ListView_GetSelectedCount(m_pLocalLV->getWndHandle());
+      if (nCount <= 0) {
+        setButtonsState(0, 0, -1);
+      } else {
+        if (remPathLen == 0) {
+          setButtonsState(0, 0, -1);
+        } else {
+          setButtonsState(1, 0, -1);
+        }
+      }
+    } else {
+      setButtonsState(0, 0, -1);
+    }
+  } else {
+    if (GetFocus() == m_pRemoteLV->getWndHandle()) {
+      if (strlen(m_szRemotePath) != 0) {
+        int nCount = ListView_GetSelectedCount(m_pRemoteLV->getWndHandle());
+        if (nCount <= 0) {
+          setButtonsState(0, 0, -1);
+        } else {
+          if (locPathLen == 0) {
+            setButtonsState(0, 0, -1);
+          } else {
+            setButtonsState(0, 1, -1);
+          }
+        }
+      } else {
+        setButtonsState(0, 0, -1);
+      }
+    } else {
+      setButtonsState(0, 0, -1);
+    }
+  }
+/*
+  if (m_pFileTransfer->isTransferEnable()) {
+    setAllButtonsState(-1, -1, -1, -1, 1);
+  } else {
+    setAllButtonsState(-1, -1, -1, -1, 0);
+  }
+*/
+}
+
+void
+FTDialog::setButtonsState(int uploadBtnState, int downloadBtnState, int cancelBtnState)
+{
+  switch (uploadBtnState)
+  {
+  case 0: EnableWindow(GetDlgItem(m_hwndFTDialog, IDC_FTUPLOAD), FALSE); break;
+  case 1: EnableWindow(GetDlgItem(m_hwndFTDialog, IDC_FTUPLOAD), TRUE); break;
+  default: break;
+  }
+
+  switch (downloadBtnState)
+  {
+  case 0: EnableWindow(GetDlgItem(m_hwndFTDialog, IDC_FTDOWNLOAD), FALSE); break;
+  case 1: EnableWindow(GetDlgItem(m_hwndFTDialog, IDC_FTDOWNLOAD), TRUE); break;
+  default: break;
+  }
+
+  switch (cancelBtnState)
+  {
+  case 0: EnableWindow(GetDlgItem(m_hwndFTDialog, IDC_FTCANCEL), FALSE); break;
+  case 1: EnableWindow(GetDlgItem(m_hwndFTDialog, IDC_FTCANCEL), TRUE); break;
+  default: break;
+  }
+}
\ No newline at end of file
diff --git a/vncviewer/FTDialog.h b/vncviewer/FTDialog.h
index 961b1a8..88ff9e9 100644
--- a/vncviewer/FTDialog.h
+++ b/vncviewer/FTDialog.h
@@ -69,12 +69,18 @@
       void onLocalReload();
       void onRemoteReload();
 
+      void onUpload();
+      void onDownload();
+
       void setIcon(int dest, int idIcon);
       bool initFTDialog();
       
       void onLocalOneUpFolder();
       void onRemoteOneUpFolder();
       int makeOneUpFolder(char *pPath);
+
+      void refreshState();
+      void setButtonsState(int uploadBtnState, int downloadBtnState, int cancelBtnState);
       
       bool m_bDlgShown;
 
