FileDialog.st
changeset 19012 3a570cb5ead1
parent 18749 78d06a49dc41
child 19062 859bcce6d48c
--- a/FileDialog.st	Wed Aug 21 17:24:13 2019 +0200
+++ b/FileDialog.st	Wed Aug 21 17:24:29 2019 +0200
@@ -23,7 +23,8 @@
 		appendButtonVisibleHolder appendWasPressed
 		buttonPanelVisibleHolder appendLabelHolder browseVisibleHolder
 		selectedDeviceDrive listOfDeviceDrives rootDirectoryHolder
-		initialRoot verticalPanelView okLabelEnabled'
+		initialRoot verticalPanelView okLabelEnabled
+		searchInfoBoxVisibleHolder searchedDirectoryInfoHolder'
 	classVariableNames:'LastExtent LastFindPattern'
 	poolDictionaries:''
 	category:'Interface-Tools-File'
@@ -794,24 +795,20 @@
     ^ 
     #(FullSpec
        name: windowSpec
-       uuid: '7a45b8ee-e9f6-11e8-8cdd-b8f6b1108e05'
+       uuid: 'b13cef1a-c417-11e9-a4e5-10ddb1cc5928'
        window: 
       (WindowSpec
          label: 'FileDialog'
          name: 'FileDialog'
          uuid: '686277b6-e9f6-11e8-8cdd-b8f6b1108e05'
-         min: (Point 10 10)
-         bounds: (Rectangle 0 0 460 482)
-         menu: mainMenu
+         min: (Point 10 10) bounds: (Rectangle 0 0 460 482) menu: mainMenu
          performer: treeBrowser
-       )
-       component: 
+      ) component: 
       (SpecCollection
          collection: (
           (VerticalPanelViewSpec
              name: 'FilePanel'
-             layout: (LayoutFrame 0 0 0 0 0 1 -40 1)
-             uuid: '6862e00c-e9f6-11e8-8cdd-b8f6b1108e05'
+             layout: (LayoutFrame 0 0 0 0 0 1 -40 1) uuid: '6862e00c-e9f6-11e8-8cdd-b8f6b1108e05'
              horizontalLayout: fit
              verticalLayout: bottomFit
              horizontalSpace: 0
@@ -828,16 +825,14 @@
                      collection: (
                       (MenuPanelSpec
                          name: 'ToolBar1'
-                         layout: (LayoutFrame 0 0.0 0 0.0 0 1.0 40 0)
-                         uuid: '6862e46c-e9f6-11e8-8cdd-b8f6b1108e05'
+                         layout: (LayoutFrame 0 0.0 0 0.0 0 1.0 40 0) uuid: '6862e46c-e9f6-11e8-8cdd-b8f6b1108e05'
                          tabable: true
                          menu: toolBarMenu
                          textDefault: true
-                       )
+                      )
                       (VariableHorizontalPanelSpec
                          name: 'DeviceAndFilterPanel'
-                         layout: (LayoutFrame 0 0 40 0 0 1 70 0)
-                         uuid: '6862e674-e9f6-11e8-8cdd-b8f6b1108e05'
+                         layout: (LayoutFrame 0 0 40 0 0 1 70 0) uuid: '6862e674-e9f6-11e8-8cdd-b8f6b1108e05'
                          level: 1
                          showHandle: true
                          component: 
@@ -851,18 +846,16 @@
                                  collection: (
                                   (ComboListSpec
                                      name: 'ComboList1'
-                                     layout: (LayoutFrame 1 0 1 0.0 -1 1 -1 1)
-                                     uuid: '6862e9e4-e9f6-11e8-8cdd-b8f6b1108e05'
+                                     layout: (LayoutFrame 1 0 1 0.0 -1 1 -1 1) uuid: '6862e9e4-e9f6-11e8-8cdd-b8f6b1108e05'
                                      visibilityChannel: driveSelectorVisible
                                      model: selectedDeviceDrive
                                      comboList: listOfDeviceDrives
                                      useIndex: false
                                      hidePullDownMenuButton: false
-                                   )
                                   )
-                                
-                               )
-                             )
+                                )
+                              )
+                            )
                             (ViewSpec
                                name: 'Box2'
                                uuid: '6862ec82-e9f6-11e8-8cdd-b8f6b1108e05'
@@ -872,15 +865,13 @@
                                   (LabelSpec
                                      label: 'Filter:'
                                      name: 'FilterLabel'
-                                     layout: (LayoutFrame 1 0 2 0 59 0 -2 1)
-                                     uuid: '6862ed9a-e9f6-11e8-8cdd-b8f6b1108e05'
+                                     layout: (LayoutFrame 1 0 2 0 59 0 -2 1) uuid: '6862ed9a-e9f6-11e8-8cdd-b8f6b1108e05'
                                      translateLabel: true
                                      adjust: right
-                                   )
+                                  )
                                   (InputFieldSpec
                                      name: 'FilterEntryField'
-                                     layout: (LayoutFrame 60 0 -27 1 -2 1 -2 1)
-                                     uuid: '6862ef8e-e9f6-11e8-8cdd-b8f6b1108e05'
+                                     layout: (LayoutFrame 60 0 -27 1 -2 1 -2 1) uuid: '6862ef8e-e9f6-11e8-8cdd-b8f6b1108e05'
                                      model: filterHolder
                                      immediateAccept: true
                                      acceptOnReturn: true
@@ -888,79 +879,89 @@
                                      acceptOnLostFocus: true
                                      acceptOnPointerLeave: false
                                      postBuildCallback: postBuildFilterField:
-                                   )
                                   )
-                                
-                               )
-                             )
+                                )
+                              )
                             )
-                          
-                         )
-                         handles: (Any 0.29999999999999999 1.0)
-                       )
+                          )
+                        ) handles: (Any 0.29999999999999999 1.0)
+                      )
                       (SubCanvasSpec
                          name: 'DirectoryTreeBrowser'
-                         layout: (LayoutFrame 0 0.0 70 0 0 1.0 -34 1)
-                         uuid: '6862f1d2-e9f6-11e8-8cdd-b8f6b1108e05'
+                         layout: (LayoutFrame 0 0.0 70 0 0 1.0 -34 1) uuid: '6862f1d2-e9f6-11e8-8cdd-b8f6b1108e05'
                          tabable: true
                          hasHorizontalScrollBar: false
                          hasVerticalScrollBar: false
                          majorKey: DirectoryTreeBrowser
                          subAspectHolders: 
-                        (Array
-                           
+                        (Array 
                           (SubChannelInfoSpec
                              subAspect: filterModel
                              aspect: filterHolder
-                           ) 
+                          ) 
                           (SubChannelInfoSpec
                              subAspect: rootHolder
                              aspect: rootDirectoryHolder
-                           )
-                           
+                          ) 
                           (SubChannelInfoSpec
                              subAspect: showHiddenFiles
                              aspect: showHiddenFiles
-                           )
-                         )
-                         createNewApplication: true
+                          )
+                        ) createNewApplication: true
                          createNewBuilder: true
                          postBuildCallback: postBuildTreeBrowser:
-                       )
+                      )
                       (LabelSpec
                          label: 'Filename:'
                          name: 'FilenameLabel'
-                         layout: (LayoutFrame 3 0 -28 1 110 0 -1 1)
-                         uuid: '6862f5b0-e9f6-11e8-8cdd-b8f6b1108e05'
+                         layout: (LayoutFrame 3 0 -28 1 110 0 -1 1) uuid: '6862f5b0-e9f6-11e8-8cdd-b8f6b1108e05'
                          translateLabel: true
                          labelChannel: filenameLabelHolder
                          adjust: left
-                       )
+                      )
                       (FilenameInputFieldSpec
                          name: 'FilenameEntryField'
-                         layout: (LayoutFrame 110 0 -28 1 -2 1 -1 1)
-                         uuid: '6862f6be-e9f6-11e8-8cdd-b8f6b1108e05'
+                         layout: (LayoutFrame 110 0 -28 1 -2 1 -1 1) uuid: '6862f6be-e9f6-11e8-8cdd-b8f6b1108e05'
                          tabable: true
                          model: filenameHolder
                          immediateAccept: false
                          acceptOnPointerLeave: true
                          hasKeyboardFocusInitially: true
                          postBuildCallback: postBuildFileNameField:
-                       )
                       )
-                    
-                   )
-                   extent: (Point 460 442)
-                 )
+                      (ViewSpec
+                         name: 'SearchInfoBox'
+                         layout: (LayoutFrame 0 0 -30 1 0 1 0 1) uuid: 'efe63378-c414-11e9-a4e5-10ddb1cc5928'
+                         visibilityChannel: searchInfoBoxVisibleHolder
+                         component: 
+                        (SpecCollection
+                           collection: (
+                            (LabelSpec
+                               label: 'Searching:'
+                               name: 'Label1'
+                               layout: (LayoutFrame 3 0 -28 1 110 0 -1 1) uuid: '6862f5b0-e9f6-11e8-8cdd-b8f6b1108e05'
+                               translateLabel: true
+                               adjust: left
+                            )
+                            (LabelSpec
+                               name: 'Label2'
+                               layout: (LayoutFrame 110 0 -28 1 0 1 -1 1) uuid: '6862f5b0-e9f6-11e8-8cdd-b8f6b1108e05'
+                               translateLabel: false
+                               labelChannel: searchedDirectoryInfoHolder
+                               adjust: left
+                            )
+                          )
+                        )
+                      )
+                    )
+                  ) extent: (Point 460 442)
                 )
-              
-             )
-             postBuildCallback: postBuildVerticalPanelView:
-           )
+              )
+            ) postBuildCallback: postBuildVerticalPanelView:
+          )
           (HorizontalPanelViewSpec
              name: 'ButtonPanel'
-             layout: (LayoutFrame 0 0.0 -34 1 -16 1 0 1)
-             uuid: '6862f89e-e9f6-11e8-8cdd-b8f6b1108e05'
+             layout: (LayoutFrame 0 0.0 -34 1 -16 1 0 1) uuid: '6862f89e-e9f6-11e8-8cdd-b8f6b1108e05'
              visibilityChannel: buttonPanelVisibleHolder
              horizontalLayout: fitSpace
              verticalLayout: center
@@ -979,7 +980,7 @@
                    tabable: true
                    model: doCancel
                    extent: (Point 143 30)
-                 )
+                )
                 (ActionButtonSpec
                    label: 'Append'
                    name: 'appendButton'
@@ -990,7 +991,7 @@
                    tabable: true
                    model: appendPressed
                    extent: (Point 144 30)
-                 )
+                )
                 (ActionButtonSpec
                    label: 'OK'
                    name: 'okButton'
@@ -1002,16 +1003,13 @@
                    enableChannel: okLabelEnabled
                    isDefault: true
                    extent: (Point 144 30)
-                 )
                 )
-              
-             )
-             keepSpaceForOSXResizeHandleH: true
-           )
+              )
+            ) keepSpaceForOSXResizeHandleH: true
           )
-        
-       )
-     )
+        )
+      )
+    )
 ! !
 
 !FileDialog class methodsFor:'menu specs'!
@@ -1032,116 +1030,115 @@
     <resource: #menu>
 
     ^ 
-     #(Menu
-        (
-         (MenuItem
-            label: 'Directory'
-            submenu: 
-           (Menu
-              (
-               (MenuItem
-                  label: 'Up'
-                  itemValue: doGoDirectoryUp
-                )
-               (MenuItem
-                  label: '-'
-                )
-               (MenuItem
-                  activeHelpKey: directoryBack
-                  enabled: enableBack
-                  label: 'Back'
-                  itemValue: doBack
-                )
-               (MenuItem
-                  activeHelpKey: directoryBack
-                  enabled: enableForward
-                  label: 'Forward'
-                  itemValue: doForward
-                )
-               (MenuItem
-                  label: '-'
-                )
-               (MenuItem
-                  enabled: enableHome
-                  label: 'Home Directory'
-                  itemValue: doGotoHomeDirectory
-                )
-               (MenuItem
-                  enabled: enableGotoDesktopDirectory
-                  label: 'Desktop Directory'
-                  itemValue: doGotoDesktopDirectory
-                )
-               (MenuItem
-                  enabled: enableGotoDocuments
-                  label: 'Documents Directory'
-                  itemValue: doGotoDocumentsDirectory
-                )
-               (MenuItem
-                  enabled: enableGotoDownloads
-                  label: 'Downloads Directory'
-                  itemValue: doGotoDownloadsDirectory
-                )
-               (MenuItem
-                  label: 'Bookmarks'
-                  submenuChannel: bookmarksMenu
-                )
-               (MenuItem
-                  label: 'Visited Directories'
-                  submenuChannel: visitedDirectoriesMenu
-                )
-               )
-              nil
-              nil
-            )
-          )
-         (MenuItem
-            label: 'View'
-            submenu: 
-           (Menu
-              (
-               (MenuItem
-                  label: 'Sort'
-                  submenuChannel: sortMenu
-                )
-               (MenuItem
-                  label: 'Show'
-                  submenuChannel: showMenuSpecForDialog
-                )
-               (MenuItem
-                  label: '-'
-                )
-               (MenuItem
-                  label: 'Update'
-                  itemValue: updateCurrentDirectory
-                )
-               )
-              nil
-              nil
-            )
-          )
-         (MenuItem
-            label: 'Find'
-            submenu: 
-           (Menu
-              (
-               (MenuItem
-                  label: 'File...'
-                  itemValue: doFindAndSelectFile
-                )
-               (MenuItem
-                  label: 'Next...'
-                  itemValue: doFindAndSelectNextFile
-                  shortcutKey: FindNext
-                )
-               )
-              nil
-              nil
-            )
-          )
+     #(Menu 
+       (MenuItem
+          label: 'Directory'
+          submenu: 
+         (Menu 
+           (MenuItem
+              label: 'Up'
+              itemValue: doGoDirectoryUp
+           ) 
+           (MenuItem
+              label: '-'
+           ) 
+           (MenuItem
+              activeHelpKey: directoryBack
+              enabled: enableBack
+              label: 'Back'
+              itemValue: doBack
+           ) 
+           (MenuItem
+              activeHelpKey: directoryBack
+              enabled: enableForward
+              label: 'Forward'
+              itemValue: doForward
+           ) 
+           (MenuItem
+              label: '-'
+           ) 
+           (MenuItem
+              enabled: enableHome
+              label: 'Home Directory'
+              itemValue: doGotoHomeDirectory
+              labelImage: (ResourceRetriever ToolbarIconLibrary homeIcon16x16 'Home Directory')
+           ) 
+           (MenuItem
+              enabled: enableGotoDesktopDirectory
+              label: 'Desktop Directory'
+              itemValue: doGotoDesktopDirectory
+              labelImage: (ResourceRetriever ToolbarIconLibrary desktop16x16Icon 'Desktop Directory')
+           ) 
+           (MenuItem
+              enabled: enableGotoDocuments
+              label: 'Documents Directory'
+              itemValue: doGotoDocumentsDirectory
+           ) 
+           (MenuItem
+              enabled: enableGotoDownloads
+              label: 'Downloads Directory'
+              itemValue: doGotoDownloadsDirectory
+           ) 
+           (MenuItem
+              label: 'Bookmarks'
+              submenuChannel: bookmarksMenu
+              labelImage: (ResourceRetriever ToolbarIconLibrary bookmarks14x14 'Bookmarks')
+           ) 
+           (MenuItem
+              label: 'Visited Directories'
+              submenuChannel: visitedDirectoriesMenu
+           )
          )
-        nil
-        nil
-      )
+       ) 
+       (MenuItem
+          label: 'View'
+          submenu: 
+         (Menu 
+           (MenuItem
+              label: 'Sort'
+              submenuChannel: sortMenu
+           ) 
+           (MenuItem
+              label: 'Show'
+              submenuChannel: showMenuSpecForDialog
+           ) 
+           (MenuItem
+              label: '-'
+           ) 
+           (MenuItem
+              label: 'Update'
+              itemValue: updateCurrentDirectory
+           )
+         )
+       ) 
+       (MenuItem
+          label: 'Tools'
+          submenu: 
+         (Menu 
+           (MenuItem
+              label: 'Terminal'
+              itemValue: openTerminal
+              labelImage: (ResourceRetriever ToolbarIconLibrary terminal16x16Icon 'Terminal')
+           )
+         )
+       ) 
+       (MenuItem
+          label: 'Find'
+          submenu: 
+         (Menu 
+           (MenuItem
+              label: 'File...'
+              itemValue: doFindAndSelectFile
+              labelImage: (ResourceRetriever ToolbarIconLibrary search16x16Icon 'File...')
+           ) 
+           (MenuItem
+              label: 'Next...'
+              itemValue: doFindAndSelectNextFile
+              shortcutKey: FindNext
+           )
+         )
+       )
+     )
 !
 
 toolBarMenu
@@ -1727,6 +1724,24 @@
     rootDirectoryHolder := aHolder.
 !
 
+searchInfoBoxVisibleHolder
+    "set during search-file operation"
+
+    searchInfoBoxVisibleHolder isNil ifTrue:[
+        searchInfoBoxVisibleHolder := false asValue.
+    ].
+    ^ searchInfoBoxVisibleHolder
+!
+
+searchedDirectoryInfoHolder
+    "updated during search-file operation"
+
+    searchedDirectoryInfoHolder isNil ifTrue:[
+        searchedDirectoryInfoHolder := nil asValue.
+    ].
+    ^ searchedDirectoryInfoHolder
+!
+
 selectedDeviceDrive
 
     selectedDeviceDrive isNil ifTrue:[
@@ -2223,19 +2238,49 @@
 !
 
 doFindAndSelectFile
-    "search the next file matching a requested pattern"
+    "search for a file matching a requested pattern"
+
+    |fileNameInEditField initialSearchPattern patternAndTopDirectoryForSearch 
+     searchPattern topDirectoryForSearch searchRoot list|
 
-    |searchPattern|
+    (fileNameInEditField := filenameField contents) notEmptyOrNil ifTrue:[
+        initialSearchPattern := fileNameInEditField asFilename baseName.
+    ] ifFalse:[
+        initialSearchPattern := LastFindPattern ? '*.txt'
+    ].
 
-    searchPattern := Dialog 
+    patternAndTopDirectoryForSearch := Dialog 
                 request:'Filename Pattern (match):'
-                initialAnswer:(LastFindPattern ? '*.txt').
-    searchPattern isEmptyOrNil ifTrue:[^ self].
+                initialAnswer:initialSearchPattern
+                and:'Search under:'
+                initialAnswer:(directory ? Filename currentDirectory) name
+                label:'Search File'.
+    patternAndTopDirectoryForSearch isEmptyOrNil ifTrue:[^ self].
+
+    searchPattern := patternAndTopDirectoryForSearch first.
+    topDirectoryForSearch := patternAndTopDirectoryForSearch second.
+
+    LastFindPattern := searchPattern.
+
+    list := HierarchicalFileList new.
+    searchRoot := HierarchicalFileList::HierarchicalFileItem fileName:topDirectoryForSearch.
+    list root:searchRoot.
 
     self withWaitCursorDo:[
-        treeBrowser findAndSelectNextFileMatching:searchPattern.
-"/        treeBrowser findAndSelectFilesMatching:searchPattern.
-        LastFindPattern := searchPattern.
+        [
+            |dirHolder|
+
+            dirHolder := self searchedDirectoryInfoHolder.
+            self searchInfoBoxVisibleHolder value:true.
+            self windowGroup processExposeEvents.
+
+            treeBrowser 
+                findAndSelectNextFileMatching:searchPattern 
+                under:searchRoot
+                searchInfoInto:[:path | dirHolder value:path. self windowGroup processExposeEvents].
+        ] ensure:[
+            self searchInfoBoxVisibleHolder value:false
+        ]
     ].
 
     "Created: / 17-07-2018 / 12:44:20 / Claus Gittinger"
@@ -2309,6 +2354,12 @@
     self doAccept
 !
 
+openTerminal
+    "forward to the treebrowser component, which already has this functionality"
+    
+    ^ treeBrowser openTerminal
+!
+
 updateCurrentDirectory
     treeBrowser updateCurrentDirectory
 ! !