$PBExportHeader$u_panel_remote.sru forward global type u_panel_remote from u_panel end type type lv_files from u_listview within u_panel_remote end type end forward global type u_panel_remote from u_panel lv_files lv_files end type global u_panel_remote u_panel_remote type variables Datastore ids_sorter end variables forward prototypes public subroutine of_populate_listview () public subroutine of_menufunction (string as_command) public subroutine of_deletefiles () public subroutine of_downloadfiles (boolean ab_prompt) public subroutine of_deletedirectories () public function boolean of_connect (integer ai_profile) public subroutine of_disconnect () public subroutine of_renamefile () end prototypes public subroutine of_populate_listview ();// initialize panel when connected s_ftpdirlist lstr_dirlist[] ListViewItem llvi_item Long ll_large, ll_small, ll_unknown, ll_folder, ll_parent Long ll_index, ll_sorttype, ll_filesize, ll_row, ll_max Integer li_idx, li_max, li_item String ls_filename, ls_filetype String ls_extn, ls_prevextn, ls_current DateTime ldt_modified SetPointer(HourGlass!) // destroy and create new image list lv_files.of_DestroyImageLists() lv_files.of_CreateSmallImageList() // add shell icons ll_unknown = lv_files.of_ImportSmallIcon("shell32.dll", 1) // Unknown ll_folder = lv_files.of_ImportSmallIcon("shell32.dll", 4) // Folder ll_parent = lv_files.of_ImportSmallIcon("shell32.dll", 146) // Parent Folder // get the current directory gn_ftp.of_Ftp_GetCurrentDirectory(ls_current) gw_frame.wf_addmsg("Get directory list for " + ls_current + "...") // get file list li_max = gn_ftp.of_Ftp_Directory(lstr_dirlist) // load files & directories into datawindow for sorting ids_sorter.Reset() For li_idx = 1 To li_max If lstr_dirlist[li_idx].b_subdir Then ll_sorttype = 0 ll_filesize = 0 Else ll_sorttype = 1 ll_filesize = lstr_dirlist[li_idx].db_filesize If ll_filesize > 0 Then ll_filesize = (ll_filesize + 1024) / 1024 End If End If ls_filename = lstr_dirlist[li_idx].s_filename ls_filetype = lv_files.of_GetFileDescription(ls_filename) ldt_modified = lstr_dirlist[li_idx].dt_lastwritetime ll_row = ids_sorter.InsertRow(0) ids_sorter.SetItem(ll_row, "sorttype", ll_sorttype) ids_sorter.SetItem(ll_row, "filename", ls_filename) ids_sorter.SetItem(ll_row, "filesize", ll_filesize) ids_sorter.SetItem(ll_row, "filetype", ls_filetype) ids_sorter.SetItem(ll_row, "modified", ldt_modified) Next ids_sorter.Sort() lv_files.SetRedraw(False) lv_files.DeleteItems() // add parent folder item llvi_item.Data = ls_current llvi_item.Label = "Parent Folder" llvi_item.PictureIndex = ll_parent li_item = lv_files.AddItem(llvi_item) // fill in additional columns lv_files.SetItem(li_item, 3, "File Folder") // copy datawindow to listview ll_max = ids_sorter.RowCount() For ll_row = 1 To ll_max ll_sorttype = ids_sorter.GetItemNumber(ll_row, "sorttype") If ll_sorttype = 0 Then // directory ls_filename = ids_sorter.GetItemString(ll_row, "filename") ldt_modified = ids_sorter.GetItemDateTime(ll_row, "modified") // add directory item llvi_item.Data = ls_current llvi_item.Label = ls_filename llvi_item.PictureIndex = ll_folder li_item = lv_files.AddItem(llvi_item) // fill in additional columns lv_files.SetItem(li_item, 2, String(ldt_modified, "[shortdate] h:mm AM/PM")) lv_files.SetItem(li_item, 3, "File Folder") lv_files.SetItem(li_item, 4, "") Else // file ls_filename = ids_sorter.GetItemString(ll_row, "filename") ldt_modified = ids_sorter.GetItemDateTime(ll_row, "modified") ll_filesize = ids_sorter.GetItemNumber(ll_row, "filesize") ls_filetype = ids_sorter.GetItemString(ll_row, "filetype") ls_extn = Mid(ls_filename, Pos(ls_filename, ".")) // load associated icon ls_extn = Mid(ls_filename, Pos(ls_filename, ".")) If ls_extn <> ls_prevextn Then ls_prevextn = ls_extn // add associated icon If lv_files.of_ImportAssociatedIcon(ls_filename, & ll_large, ll_small) Then ll_index = ll_small Else ll_index = ll_unknown End If End If // add file item llvi_item.Data = ls_current llvi_item.Label = ls_filename llvi_item.PictureIndex = ll_index li_item = lv_files.AddItem(llvi_item) // fill in additional columns lv_files.SetItem(li_item, 2, String(ldt_modified, "[shortdate] h:mm AM/PM")) lv_files.SetItem(li_item, 3, ls_filetype) lv_files.SetItem(li_item, 4, String(ll_filesize, "#,##0") + " KB") End If Next lv_files.SetRedraw(True) gw_frame.wf_addmsg("Number of files: " + String(ll_max)) SetPointer(Arrow!) end subroutine public subroutine of_menufunction (string as_command);// menu commands SetPointer(HourGlass!) choose case as_command case "m_downloadfiles" of_downloadfiles(False) case "m_refresh" of_Populate_Listview() case "m_deletefiles" of_deletefiles() case "m_renamefile" of_renamefile() case "m_changedirectory" Open(w_changedir) If Message.StringParm = "cb_ok" Then of_Populate_Listview() End If case "m_home" gw_frame.wf_addmsg("Change current directory: \") If Not gn_ftp.of_ftp_SetCurrentDirectory("\") Then gw_frame.wf_addmsg(gn_ftp.LastErrorMsg) MessageBox("SetCurrentDirectory Error " + String(gn_ftp.LastErrorNbr), & gn_ftp.LastErrorMsg, StopSign!) Return End If of_Populate_Listview() case "m_createdirectory" Open(w_createdir) If Message.StringParm = "cb_ok" Then of_Populate_Listview() End If case "m_deletedirectories" of_deletedirectories() case "m_sendcommand" Open(w_command) end choose end subroutine public subroutine of_deletefiles ();// delete selected files ListViewItem llvi_item Integer li_idx, li_max, li_rc String ls_remotefile li_rc = MessageBox("Delete Files", & "Are you sure you want to delete the selected files?", & Question!, YesNo!) If li_rc = 2 Then Return // get selected files li_max = lv_files.TotalItems() For li_idx = 1 To li_max lv_files.GetItem(li_idx, llvi_item) If llvi_item.Selected Then choose case llvi_item.PictureIndex case 2, 3 llvi_item.Selected = False lv_files.SetItem(li_idx, llvi_item) case else ls_remotefile = llvi_item.Label gw_frame.wf_addmsg("Deleting " + ls_remotefile + "...") If Not gn_ftp.of_Ftp_DeleteFile(ls_remotefile) Then gw_frame.wf_addmsg(gn_ftp.LastErrorMsg) MessageBox("Delete Error " + String(gn_ftp.LastErrorNbr), & gn_ftp.LastErrorMsg, StopSign!) Return End If gw_frame.wf_addmsg("Delete complete") end choose End If Next of_Populate_Listview() end subroutine public subroutine of_downloadfiles (boolean ab_prompt);// download selected files m_main lm_menu ListViewItem llvi_item Integer li_idx, li_max, li_rc String ls_localdir, ls_localfile, ls_remotefile // get local reference to the menu lm_menu = gw_frame.MenuID li_rc = MessageBox("Download Files", & "Are you sure you want to download the selected files?", & Question!, YesNo!) If li_rc = 2 Then Return If ab_prompt Then li_rc = GetFolder("Choose Download Location", ls_localdir) If li_rc = 0 Then Return Else ls_localdir = gw_frame.uo_local.is_path End If lm_menu.mf_StopAction(True) gw_frame.ib_StopAction = False // get selected files li_max = lv_files.TotalItems() For li_idx = 1 To li_max If gw_frame.ib_StopAction Then Exit End If lv_files.GetItem(li_idx, llvi_item) If llvi_item.Selected Then choose case llvi_item.PictureIndex case 2, 3 llvi_item.Selected = False lv_files.SetItem(li_idx, llvi_item) case else ls_remotefile = llvi_item.Label ls_localfile = ls_localdir + "\" + llvi_item.Label gw_frame.wf_addmsg("Downloading " + ls_remotefile + "...") If Not gn_ftp.of_Ftp_ReadFile(ls_remotefile, & ls_localfile, Handle(gw_frame), 1024) Then gw_frame.wf_addmsg(gn_ftp.LastErrorMsg) MessageBox("ReadFile Error " + String(gn_ftp.LastErrorNbr), & gn_ftp.LastErrorMsg, StopSign!) Return End If llvi_item.Selected = False lv_files.SetItem(li_idx, llvi_item) gw_frame.wf_addmsg("Download complete") end choose End If Next lm_menu.mf_StopAction(False) gw_frame.uo_local.of_Populate_Listview(gw_frame.uo_local.il_handle) end subroutine public subroutine of_deletedirectories ();// delete selected directories ListViewItem llvi_item Integer li_idx, li_max, li_rc String ls_remotedir li_rc = MessageBox("Delete Directories", & "Are you sure you want to delete the selected directories?", & Question!, YesNo!) If li_rc = 2 Then Return // get selected directories li_max = lv_files.TotalItems() For li_idx = 1 To li_max lv_files.GetItem(li_idx, llvi_item) If llvi_item.Selected Then choose case llvi_item.PictureIndex case 2 ls_remotedir = llvi_item.Label gw_frame.wf_addmsg("Deleting " + ls_remotedir + "...") If Not gn_ftp.of_Ftp_RemoveDirectory(ls_remotedir) Then gw_frame.wf_addmsg(gn_ftp.LastErrorMsg) MessageBox("Delete Error " + String(gn_ftp.LastErrorNbr), & gn_ftp.LastErrorMsg, StopSign!) Return End If gw_frame.wf_addmsg("Delete complete") case else llvi_item.Selected = False lv_files.SetItem(li_idx, llvi_item) end choose End If Next of_Populate_Listview() end subroutine public function boolean of_connect (integer ai_profile);// connect to the ftp server m_main lm_menu String ls_subkey, ls_server, ls_userid, ls_password, ls_initialdir, ls_errmsg Boolean lb_result, lb_passive, lb_anonymous UInt lui_port SetPointer(HourGlass!) lm_menu = gw_frame.MenuID ls_subkey = "Profiles\" + String(ai_profile) ls_server = gn_app.of_GetReg(ls_subkey, "Server", "") ls_userid = gn_app.of_GetReg(ls_subkey, "Userid", "") ls_password = gn_app.of_GetReg(ls_subkey, "Password", "") ls_initialdir = gn_app.of_GetReg(ls_subkey, "InitialDir", "") lui_port = Integer(gn_app.of_GetReg(ls_subkey, "Port", "21")) If gn_app.of_GetReg(ls_subkey, "Anonymous", "false") = "true" Then lb_anonymous = True Else lb_anonymous = False End If If gn_app.of_GetReg(ls_subkey, "Passive", "false") = "true" Then lb_passive = True Else lb_passive = False End If // disconnect from current session gw_frame.wf_addmsg("Disconnecting existing session") SetPointer(HourGlass!) gn_ftp.of_SessionClose() // connect to remote server gw_frame.wf_addmsg("Connecting to " + ls_server) SetPointer(HourGlass!) If lb_anonymous Then lb_result = gn_ftp.of_Ftp_InternetConnect(ls_server, & lui_port, lb_passive) Else lb_result = gn_ftp.of_Ftp_InternetConnect(ls_server, & ls_userid, ls_password, & lui_port, lb_passive) End If If lb_result = False Then ls_errmsg = "Connect Error " + String(gn_ftp.LastErrorNbr) gw_frame.wf_addmsg(ls_errmsg + ": " + gn_ftp.LastErrorMsg) MessageBox(ls_errmsg, gn_ftp.LastErrorMsg, StopSign!) Return False End If gw_frame.wf_addmsg("Session connected") SetPointer(HourGlass!) // set the initial directory If Len(ls_initialdir) > 0 Then gw_frame.wf_addmsg("Change current directory: " + ls_initialdir) If Not gn_ftp.of_ftp_SetCurrentDirectory(ls_initialdir) Then gw_frame.wf_addmsg(gn_ftp.LastErrorMsg) MessageBox("SetCurrentDirectory Error " + String(gn_ftp.LastErrorNbr), & gn_ftp.LastErrorMsg, StopSign!) Return False End If End If // enable ftp actions lm_menu.mf_Status(True) Return True end function public subroutine of_disconnect ();// disconnect from the ftp server m_main lm_menu SetPointer(HourGlass!) lm_menu = gw_frame.MenuID // disconnect from current session gw_frame.wf_addmsg("Disconnecting existing session") gn_ftp.of_SessionClose() gw_frame.wf_addmsg("Session disconnected") // disable ftp actions lm_menu.mf_Status(False) // delete items from listview lv_files.DeleteItems() end subroutine public subroutine of_renamefile ();ListViewItem llvi_item Integer li_idx String ls_remotefile li_idx = lv_files.SelectedIndex() If li_idx = 0 Then Return lv_files.GetItem(li_idx, llvi_item) ls_remotefile = llvi_item.Label If ls_remotefile = "" Then Return OpenWithParm(w_renamefile, ls_remotefile) of_Populate_Listview() end subroutine on u_panel_remote.create int iCurrent call super::create this.lv_files=create lv_files iCurrent=UpperBound(this.Control) this.Control[iCurrent+1]=this.lv_files end on on u_panel_remote.destroy call super::destroy destroy(this.lv_files) end on event resize;call super::resize;lv_files.Width = this.Width lv_files.Height = this.Height end event event constructor;call super::constructor;// create sorter datastore ids_sorter = Create Datastore ids_sorter.DataObject = "d_filesorter" end event type lv_files from u_listview within u_panel_remote integer width = 1870 integer height = 1220 integer taborder = 10 integer textsize = -8 string facename = "Tahoma" boolean extendedselect = true boolean hideselection = false boolean fullrowselect = true listviewview view = listviewreport! long smallpicturemaskcolor = 12632256 end type event constructor;call super::constructor;// add columns to report view this.AddColumn("Name", Left!, 1250) this.AddColumn("Date Modified", Left!, 550) this.AddColumn("Type", Left!, 750) this.AddColumn("Size", Right!, 350) end event event destructor;call super::destructor;this.of_DestroyImageLists() end event event doubleclicked;call super::doubleclicked;n_runandwait ln_rwait n_filesys ln_fsys ListViewItem llvi_item String ls_current, ls_folder, ls_filename, ls_tempfile this.GetItem(index, llvi_item) ls_current = String(llvi_item.Data) ls_folder = llvi_item.Label choose case llvi_item.PictureIndex case 2 // double clicked on a folder gw_frame.wf_addmsg("Change current directory: " + ls_folder) If Not gn_ftp.of_ftp_SetCurrentDirectory(ls_folder) Then gw_frame.wf_addmsg(gn_ftp.LastErrorMsg) MessageBox("SetCurrentDirectory Error " + String(gn_ftp.LastErrorNbr), & gn_ftp.LastErrorMsg, StopSign!) Return End If of_Populate_Listview() case 3 // double clicked on Parent Folder If ls_current = "/" Then // already at root directory Else ls_folder = Left(ls_current, LastPos(ls_current, "/") - 1) If ls_folder = "" Then ls_folder = "/" End If gw_frame.wf_addmsg("Change current directory: " + ls_folder) If Not gn_ftp.of_ftp_SetCurrentDirectory(ls_folder) Then gw_frame.wf_addmsg(gn_ftp.LastErrorMsg) MessageBox("SetCurrentDirectory Error " + String(gn_ftp.LastErrorNbr), & gn_ftp.LastErrorMsg, StopSign!) Return End If of_Populate_Listview() End If case else // double clicked on a file SetPointer(HourGlass!) ls_filename = llvi_item.Label ls_tempfile = ln_fsys.of_GetTempPath() + ls_filename If gn_ftp.of_Ftp_GetFile(ls_filename, ls_tempfile, False) Then SetPointer(Arrow!) ln_rwait.of_ShellRun(ls_tempfile, "Open", Normal!) FileDelete(ls_tempfile) Else gw_frame.wf_addmsg(gn_ftp.LastErrorMsg) MessageBox("GetFile Error " + String(gn_ftp.LastErrorNbr), & gn_ftp.LastErrorMsg, StopSign!) Return End If end choose end event event rightclicked;call super::rightclicked;m_main lm_popup Integer li_xpos, li_ypos lm_popup = CREATE m_main li_xpos = Parent.X + Parent.PointerX() li_ypos = Parent.Y + Parent.PointerY() lm_popup.m_remote.PopMenu(li_xpos, li_ypos) DESTROY lm_popup end event
File: u_panel_remote.sru
Size: 15784
Date: Fri, 17 May 2019 04:58:44 +0200
Size: 15784
Date: Fri, 17 May 2019 04:58:44 +0200
- u_panel u_panel_remote(sru)
- of_connect (integer ai_profile) returns boolean
- of_deletedirectories ()
- of_deletefiles ()
- of_disconnect ()
- of_downloadfiles (boolean ab_prompt)
- of_menufunction (string as_command)
- of_populate_listview ()
- of_renamefile ()
- u_listview lv_files