Page 1 of 1

cGetFile()

Posted: Fri Aug 25, 2006 6:26 am
by Carles
Hi,

Has somebody been able to use the function cGetFile() ?

Regards.

Posted: Fri Aug 25, 2006 6:28 am
by Antonio Linares
Carles,

Its still on our todo list. We would like to fix it, or maybe we could implement one ourselves, but it could get complex.

Posted: Fri Aug 25, 2006 6:34 am
by Carles
Antonio

Nothing is complex for you :lol:

Regrads

Posted: Fri Aug 25, 2006 9:02 am
by Antonio Linares
Carles,

We are building a cGetFile() of our own. We are going to publish a first prototype asap.

Posted: Fri Aug 25, 2006 10:15 am
by Antonio Linares
Carles,

Here it is:

Code: Select all

#include "FWCE.ch"

function Main()

   MsgInfo( cGetFile( "*.*", "\" ) )
   
return nil

static function cGetFile( cMask, cPath )   

   local oDlg, oBrw, oBtn, aItems, cFileName := ""

   DEFAULT cMask := "*.*", cPath := "\" 
   
   aItems = GetItems( cMask, @cPath )

   DEFINE DIALOG oDlg TITLE "Please select a file" ;
      SIZE 220, 210
   
   @ 0.4, 0.7 LISTBOX oBrw ;
      FIELDS aItems[ oBrw:nAt, 1 ], aItems[ oBrw:nAt, 2 ], aItems[ oBrw:nAt, 3 ],;
             aItems[ oBrw:nAt, 4 ] ;
      HEADERS "Name", "T", "Size", "Date" ;
      COLSIZES  100, 15, 70, 40 ;
      SIZE 100, 82 ;
      ON DBLCLICK SelFile( oBrw, cMask, @cPath, @cFileName, oDlg )

   oBrw:SetArray( aItems )
   oBrw:aJustify = { .f., .f., .t., .f. }
   oBrw:bKeyChar = { | nKey | If( nKey == 13,;
                     ( SelFile( oBrw, cMask, @cPath, @cFileName, oDlg ), oBrw:SetFocus() ),) }
   
   @ 5,  3 BUTTON oBtn PROMPT "Ok" ACTION SelFile( oBrw, cMask, @cPath, @cFileName, oDlg )

   @ 5, 10 BUTTON "Cancel" ACTION oDlg:End()
   
   ACTIVATE DIALOG oDlg CENTERED
   
return cFileName

static function CheckItem( oBrw, cMask, cPath )

   local cItem := Eval( oBrw:bLine )[ 1 ]
   local cType := Eval( oBrw:bLine )[ 2 ]
   local aItems

   if cType == "D"
      if cItem == ".."
         cPath = SubStr( cPath, 1, RAt( "\", cPath ) - 1 )
         cPath = SubStr( cPath, 1, RAt( "\", cPath ) - 1 )
         aItems = GetItems( cMask, cPath += "\" )
      else   
         aItems = GetItems( cMask, cPath += cItem + "\" )
      endif   
      oBrw:SetArray( aItems )
      oBrw:nAt = 1
      oBrw:bLine = { || { aItems[ oBrw:nAt, 1 ], aItems[ oBrw:nAt, 2 ],;
                          aItems[ oBrw:nAt, 3 ], aItems[ oBrw:nAt, 4 ] } }
      oBrw:GoTop()
      oBrw:Refresh()
   endif   

return nil

static function GetItems( cMask, cPath )

   local aInfo := Directory( cPath + cMask, "D" )
   local aItems := {}, n
   
   if Len( cPath ) > 1
      AAdd( aItems, { "..", "D", "", "" } )
   endif   

   for n = 1 to Len( aInfo )
      if "D" $ aInfo[ n ][ 5 ]
         AAdd( aItems, { aInfo[ n ][ 1 ], "D", aInfo[ n ][ 2 ],;
               DToC( aInfo[ n ][ 3 ] ) } )
      endif   
   next    
   for n = 1 to Len( aInfo )
      if ! "D" $ aInfo[ n ][ 5 ]
         AAdd( aItems, { aInfo[ n ][ 1 ], "F", Str( aInfo[ n ][ 2 ] ),;
               DToC( aInfo[ n ][ 3 ] ) } )
      endif   
   next    

return aItems

static function SelFile( oBrw, cMask, cPath, cFileName, oDlg )

   if Eval( oBrw:bLine )[ 2 ] == "F"
      cFileName = cPath + Eval( oBrw:bLine )[ 1 ]
      oDlg:End()
   else
      CheckItem( oBrw, cMask, @cPath )
   endif
   
return nil          

Posted: Sat Aug 26, 2006 6:12 am
by Antonio Linares
Carles,

Using object oriented code, it gets better structured:

Code: Select all

// FWPPC own function cGetFile() implementation

#include "FWCE.ch"

function Main()

   MsgInfo( cGetFile( "*.*", "\" ) )
   
return nil

static function cGetFile( cMask, cPath )   

   local oGetFile := TGetFile():New( cMask, cPath )
   
return oGetFile:cFileName

CLASS TGetFile

   DATA  oDlg
   DATA  oBrw
   DATA  cMask
   DATA  cPath
   DATA  cFileName
   DATA  aItems
   
   METHOD New( cMask, cPath )
   METHOD CheckItem()
   METHOD GetItems()
   METHOD SelItem()
   
ENDCLASS   

METHOD New( cMask, cPath ) CLASS TGetFile

   DEFAULT cMask := "*.*", cPath := "\" 
   
   ::cMask = cMask
   ::cPath = cPath
   ::cFileName = ""
   
   ::GetItems()
   
   DEFINE DIALOG ::oDlg TITLE "Please select a file" ;
      SIZE 220, 210
   
   @ 0.4, 0.7 LISTBOX ::oBrw ;
      FIELDS ::aItems[ ::oBrw:nAt, 1 ], ::aItems[ ::oBrw:nAt, 2 ],;
             ::aItems[ ::oBrw:nAt, 3 ], ::aItems[ ::oBrw:nAt, 4 ] ;
      HEADERS "Name", "T", "Size", "Date" ;
      COLSIZES  100, 15, 70, 40 ;
      SIZE 100, 82 ;
      ON DBLCLICK ::SelItem()

   ::oBrw:SetArray( ::aItems )
   ::oBrw:aJustify = { .f., .f., .t., .f. }
   ::oBrw:bKeyChar = { | nKey | If( nKey == 13, ( ::SelItem(), oBrw:SetFocus() ),) }
   
   @ 5,  3 BUTTON oBtn PROMPT "Ok" ACTION ::SelItem()

   @ 5, 10 BUTTON "Cancel" ACTION ::oDlg:End()
   
   ACTIVATE DIALOG ::oDlg CENTERED
      
return Self      

METHOD CheckItem() CLASS TGetFile

   local cItem := Eval( ::oBrw:bLine )[ 1 ]
   local cType := Eval( ::oBrw:bLine )[ 2 ]

   if cType == "D"
      if cItem == ".."
         ::cPath = SubStr( ::cPath, 1, RAt( "\", ::cPath ) - 1 )
         ::cPath = SubStr( ::cPath, 1, RAt( "\", ::cPath ) )
         ::GetItems()
      else   
         ::cPath += cItem + "\"
         ::GetItems()
      endif   
      ::oBrw:SetArray( ::aItems )
      ::oBrw:nAt = 1
      ::oBrw:bLine = { || { ::aItems[ ::oBrw:nAt, 1 ], ::aItems[ ::oBrw:nAt, 2 ],;
                            ::aItems[ ::oBrw:nAt, 3 ], ::aItems[ ::oBrw:nAt, 4 ] } }
      ::oBrw:GoTop()
      ::oBrw:Refresh()
   endif   

return nil

METHOD GetItems() CLASS TGetFile

   local aInfo := Directory( ::cPath + ::cMask, "D" ), n
   
   ::aItems = {}
      
   if Len( ::cPath ) > 1
      AAdd( ::aItems, { "..", "D", "", "" } )
   endif   

   for n = 1 to Len( aInfo )
      if "D" $ aInfo[ n ][ 5 ]
         AAdd( ::aItems, { aInfo[ n ][ 1 ], "D", aInfo[ n ][ 2 ],;
               DToC( aInfo[ n ][ 3 ] ) } )
      endif   
   next    
   for n = 1 to Len( aInfo )
      if ! "D" $ aInfo[ n ][ 5 ]
         AAdd( ::aItems, { aInfo[ n ][ 1 ], "F", Str( aInfo[ n ][ 2 ] ),;
               DToC( aInfo[ n ][ 3 ] ) } )
      endif   
   next    

return nil

METHOD SelItem() CLASS TGetFile

   if Eval( ::oBrw:bLine )[ 2 ] == "F"
      ::cFileName = ::cPath + Eval( ::oBrw:bLine )[ 1 ]
      ::oDlg:End()
   else
      ::CheckItem()
   endif
   
return nil