B4J Question Force FileChooser to one directory and it's sub-folders

Discussion in 'B4J Questions' started by hanyelmehy, Jul 4, 2019.

  1. hanyelmehy

    hanyelmehy Active Member Licensed User

    How to Force FileChooser to one directory and it's sub-folders
     
  2. Daestrum

    Daestrum Well-Known Member Licensed User

    Just set the FileChooser InitialDirectory to the one you want

    Code:
    Dim fc As FileChooser
    ...
    fc.Initialize
    fc.InitialDirectory = 
    "C:/temp"
    ...
     
    Peter Simpson likes this.
  3. hanyelmehy

    hanyelmehy Active Member Licensed User

    i already use InitialDirectory , i need to Force FileChooser to use only this directory
    when using InitialDirectory client can select other Directory
     
  4. Erel

    Erel Administrator Staff Member Licensed User

    It is not possible. You can reject the file if it is not in the expected folder.

    Or show your own dialog with B4XDialog and the list template. Should be simple.
     
    Harris likes this.
  5. Daestrum

    Daestrum Well-Known Member Licensed User

    I did find this an interesting question.
    Here's an example that shows how to get the information you want (didn't use dialogs just a plain listview) uses javaobject.
    (Apologies in advance for the horrendous coding - perfect example of how my brain works - but hey it's fun to work out what does what)
    Code:
    Sub Process_Globals
     
    Private fx As JFX
     
    Private MainForm As Form
     
    Dim lv As ListView
     
    Dim fsv As JavaObject
     
    Dim swingUtils As JavaObject
     
    Dim directory As String = ""
    End Sub
    Sub AppStart (Form1 As Form, Args() As String)
     MainForm = Form1
     MainForm.Show
     fsv.InitializeStatic(
    "javax.swing.filechooser.FileSystemView")
     swingUtils.InitializeStatic(
    "javafx.embed.swing.SwingFXUtils")
     directory = 
    "c:/temp/"
     lv.Initialize(
    "lv")
     
    For Each f As Object In File.ListFiles(directory)
      
    Dim rFile As JavaObject = new("java.io.File",Array(directory & f))
      
    If Not(rFile.RunMethod("isDirectory",Null)) Then
       
    Dim icon As Image = swingUtils.RunMethod("toFXImage",Array(fsv.RunMethodJO("getFileSystemView",Null).RunMethodjo("getSystemIcon",Array(rFile)).RunMethod("getImage",Null),Null))
       
    Dim p As Pane
       p.Initialize(
    "")
       
    Dim img As ImageView
       img.Initialize(
    "")
       
    Dim lab,lab1 As Label
       lab.Initialize(
    "")
       lab1.Initialize(
    "")
       img.SetImage(icon)
       lab.text = f
       lab.TooltipText=fsv.RunMethodJO(
    "getFileSystemView",Null).RunMethod("getSystemDisplayName",Array(rFile))&CRLF& _
           fileSize(rFile.RunMethod(
    "length",Null))
       lab1.Text =
    "["& fsv.RunMethodJO("getFileSystemView",Null).RunMethod("getSystemTypeDescription",Array(rFile))&"]"
       p.AddNode(img,
    0,0,20,20)
       p.AddNode(lab,
    25,0,200,20)
       p.AddNode(lab1,
    230,0,200,20)
       lv.Items.Add(p)
      
    End If
     
    Next
     MainForm.RootPane.AddNode(lv,
    10,10,500,500)
    End Sub
    Sub lv_SelectedIndexChanged(Index As Int)
     
    Log("You chose : " & asLabel(asPane(lv.Items.Get(Index)).GetNode(1)).Text)
    End Sub
    Sub new(className As String,args() As Object) As JavaObject
     
    Dim j As JavaObject
     
    Return j.InitializeNewInstance(className,args)
    End Sub
    Sub asLabel(l As Object) As Label
     
    Return l
    End Sub
    Sub asPane(p As Object) As Pane
     
    Return p
    End Sub
    Sub fileSize(s As Long) As String
     
    Dim t As Double
     
    Dim gb As Long = 1024*1024*1024
     
    Dim mb As Long = 1024*1024
     
    Dim kb As Long = 1024
     
    Select True
      
    Case s>gb
       t = s/gb
       
    Return NumberFormat(t,1,0)& "GB"
      
    Case s>mb
       t = s/mb
       
    Return NumberFormat(t,1,0)& " MB"
      
    Case s>kb
       t = s/kb
       
    Return NumberFormat(t,1,0)& " KB"
      
    Case Else
       
    Return s&" Bytes"
     
    End Select
    End Sub
    'Return true to allow the default exceptions handler to handle the uncaught exception.
    Sub Application_Error (Error As Exception, StackTrace As StringAs Boolean
     
    Return True
    End Sub
     

    Attached Files:

    XbNnX_507 and DonManfred like this.
  6. Daestrum

    Daestrum Well-Known Member Licensed User

    I realized the version above doesn't allow you to navigate sub folders in the selected directory. This version does ( plus I cleaned up the code (a bit))
    Code:
    Sub Process_Globals
     
    Private fx As JFX
     
    Private MainForm As Form
     
    Dim lv As ListView
     
    Dim fsv As JavaObject
     
    Dim swingUtils As JavaObject
     
    Dim directory As String = ""
     
    Dim depth As List
    End Sub
    Sub AppStart (Form1 As Form, Args() As String)
     MainForm = Form1
     MainForm.Show
     depth.Initialize
     fsv.InitializeStatic(
    "javax.swing.filechooser.FileSystemView")
     swingUtils.InitializeStatic(
    "javafx.embed.swing.SwingFXUtils")
     directory = 
    "c:/temp"
     lv.Initialize(
    "lv")
     MainForm.RootPane.AddNode(lv,
    10,10,500,500)
     
    If Not(directory.EndsWith("/")) Then directory=directory&"/"
     depth.Add(directory)
     buildFileList(directory)
    End Sub
    Sub buildFileList(root As String)
     lv.Items.Clear
     lv.Items.Add(buildPane(new(
    "java.io.File",Array(root)),True))
     
    For Each f As Object In File.ListFiles(root)
      lv.Items.Add(buildPane(new(
    "java.io.File",Array(root & f)),False))
     
    Next
    End Sub
    Sub lv_SelectedIndexChanged(Index As Int)
     
    If Index = -1 Then Return
     
    If Index = 0 And depth.Size > 1 Then
      directory=depth.Get(depth.Size - 
    2)
      depth.RemoveAt(depth.Size-
    1)
      buildFileList(directory)
      
    Return
     
    End If
     
    If File.IsDirectory(directory,asLabel(asPane(lv.Items.Get(Index)).GetNode(1)).Text) Then
      directory = directory & asLabel(asPane(lv.Items.Get(Index)).GetNode(
    1)).Text&"/"
      depth.Add(directory)
      buildFileList(directory)
      
    Return
     
    End If
     
     
    Log("You chose : " & asLabel(asPane(lv.Items.Get(Index)).GetNode(1)).Text)
    End Sub
    Sub getIcon(s As JavaObjectAs Image
     
    Return swingUtils.RunMethod("toFXImage",Array(fsv.RunMethodJO("getFileSystemView",Null).RunMethodjo("getSystemIcon",Array(s)).RunMethod("getImage",Null),Null))
    End Sub
    Sub buildPane(fi As JavaObject,r As Boolean) As Pane
     
    Dim p As Pane
     p.Initialize(
    "")
     
    Dim iv As ImageView
     iv.Initialize(
    "")
     
    Dim lab,lab1,lab2 As Label
     lab.Initialize(
    "")
     lab1.Initialize(
    "")
     lab2.Initialize(
    "")
     iv.SetImage(getIcon(fi))
     lab.text = fsv.RunMethodJO(
    "getFileSystemView",Null).RunMethod("getSystemDisplayName",Array(fi))
     lab.TooltipText = lab.text & 
    CRLF & _
           fileSize(fi.RunMethod(
    "length",Null))
     lab1.Text =
    "["& fsv.RunMethodJO("getFileSystemView",Null).RunMethod("getSystemTypeDescription",Array(fi))&"]"
     
    Dim offset As Int = 20
     
    If r Then offset = 0
     p.AddNode(iv,offset+
    0,0,20,20)
     p.AddNode(lab,offset+
    25,0,200,20)
     p.AddNode(lab1,
    250,0,200,20)
     
    Return p
    End Sub
    Sub new(className As String,args() As Object) As JavaObject
     
    Dim j As JavaObject
     
    Return j.InitializeNewInstance(className,args)
    End Sub
    Sub asLabel(l As Object) As Label
     
    Return l
    End Sub
    Sub asPane(p As Object) As Pane
     
    Return p
    End Sub
    Sub fileSize(s As Long) As String
     
    Dim t As Double
     
    Dim gb As Long = 1024*1024*1024
     
    Dim mb As Long = 1024*1024
     
    Dim kb As Long = 1024
     
    Select True
      
    Case s>gb
       t = s/gb
       
    Return NumberFormat(t,1,0)& "GB"
      
    Case s>mb
       t = s/mb
       
    Return NumberFormat(t,1,0)& " MB"
      
    Case s>kb
       t = s/kb
       
    Return NumberFormat(t,1,0)& " KB"
      
    Case Else
       
    Return s&" Bytes" 
     
    End Select
    End Sub
    'Return true to allow the default exceptions handler to handle the uncaught exception.
    Sub Application_Error (Error As Exception, StackTrace As StringAs Boolean
     
    Return True
    End Sub
     
    hanyelmehy, inakigarm and Harris like this.
  7. Harris

    Harris Well-Known Member Licensed User

    Write your own FileChooser (many examples here) and control it as u wish...

    Standard helpers lack in so many ways yet they inspire all of us to expand on the basic concept.
    When u get to your perfect solution , share your code. We can all benefit.

    Thanks so much.
     
Loading...
  1. This site uses cookies to help personalise content, tailor your experience and to keep you logged in if you register.
    By continuing to use this site, you are consenting to our use of cookies.
    Dismiss Notice