FileBrowserV2.st
changeset 3892 321c1729db5b
child 3901 5f78d7ceffe5
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/FileBrowserV2.st	Wed Sep 25 10:00:32 2002 +0200
@@ -0,0 +1,1372 @@
+"
+ COPYRIGHT (c) 1991 by Claus Gittinger
+              All Rights Reserved
+
+ This software is furnished under a license and may be used
+ only in accordance with the terms of that license and with the
+ inclusion of the above copyright notice.   This software may not
+ be provided or otherwise made available to, or used by, any
+ other person.  No title to or ownership of the software is
+ hereby transferred.
+"
+
+"{ Package: 'stx:libtool' }"
+
+AbstractFileBrowser subclass:#FileBrowserV2
+	instanceVariableNames:'fileEntryFieldHolder'
+	classVariableNames:'Icons'
+	poolDictionaries:''
+	category:'Interface-Tools-File'
+!
+
+!FileBrowserV2 class methodsFor:'documentation'!
+
+copyright
+"
+ COPYRIGHT (c) 1991 by Claus Gittinger
+              All Rights Reserved
+
+ This software is furnished under a license and may be used
+ only in accordance with the terms of that license and with the
+ inclusion of the above copyright notice.   This software may not
+ be provided or otherwise made available to, or used by, any
+ other person.  No title to or ownership of the software is
+ hereby transferred.
+"
+!
+
+documentation
+"
+    FileBrowserV2 is based on Filebrowser created by Claus Gittinger
+
+    WARNING: files edited with FileBrowser will have leading spaces (multiple-8)
+             being replaced by tabs. If tabs are to be preserved at other
+             positions (for example, sendmail-config files) they will be
+             corrupt after being written.
+
+    [instance variables]:
+
+        checkDelta      <Integer>       number of seconds of check interval
+                                        (looks ever so often if shown directory
+                                         has changed). You may make this number
+                                        higher, if your network-times are
+                                        incorrect and thus, the filebrowser
+                                        checks too often.
+
+        compressTabs    <Boolean>       if true, leading spaces will be
+                                        replaced by tabs when saving text
+
+    some of the defaults (long/short list etc.) can be set by the resource file;
+    see FileBrowser>>initialize for more details..
+
+    [author:]
+        Christian Penk
+
+    [start with:]
+        FileBrowserV2 open
+"
+! !
+
+!FileBrowserV2 class methodsFor:'instance creation'!
+
+on:aDirectoryPath
+    "return a new FileBrowserV2 in a pathname"
+
+    | instance|
+    instance := self new.
+    instance currentFileNameHolder value:(Array with:aDirectoryPath).
+    ^ instance
+
+"/    | instance builder|
+"/
+"/    builder := super open.
+"/    instance := builder application.
+"/    instance currentFileNameHolder value:aDirectoryPath.
+"/    ^ instance
+
+    "
+     (FileBrowserV2 on:'/usr/local/bin') open
+     (FileBrowserV2 on:'/etc'          ) open
+     (FileBrowserV2 on:'..'            ) open
+     (FileBrowserV2 on:'.'             ) open
+    "
+!
+
+open
+    "start a new FileBrowserV2"
+
+    | instance |
+    instance := self new.
+    instance open.
+    ^ instance
+    "
+     FileBrowserV2 openOn:'/etc'           withExtent:800@600
+     FileBrowserV2 openOn:'..'             withExtent:200@300
+     FileBrowserV2 openOn:'.'              withExtent:1024@768
+    "
+!
+
+openOn:aDirectoryPath 
+    "start a new FileBrowserV2 in a pathname"
+
+    | instance|
+    instance := self on:aDirectoryPath asFilename.
+    ^ instance open.
+    "
+     FileBrowserV2 openOn:'/etc'           
+     FileBrowserV2 openOn:'..'           
+     FileBrowserV2 openOn:'.'             
+    "
+!
+
+openOn:aDirectoryPath withExtent:extent
+    "start a new FileBrowserV2 in a pathname"
+
+    | instance builder|
+    instance := self on:aDirectoryPath.
+    builder := instance open.
+    builder window extent:extent.
+    ^ instance
+    "
+     FileBrowserV2 openOn:'/etc'           withExtent:800@600
+     FileBrowserV2 openOn:'..'             withExtent:200@300
+     FileBrowserV2 openOn:'.'              withExtent:1024@768
+    "
+!
+
+openWithAspects:someAspects withExtent:extent
+    "start a new FileBrowserV2 in a pathname"
+
+    |dir clone|
+
+    dir := someAspects at:#currentFileNameHolder ifAbsent:nil.
+    clone := self openOn:(dir value) withExtent:extent.
+
+    "
+     FileBrowserV2 openOn:'/etc'           withExtent:800@600
+     FileBrowserV2 openOn:'..'             withExtent:200@300
+     FileBrowserV2 openOn:'.'              withExtent:1024@768
+    "
+! !
+
+!FileBrowserV2 class methodsFor:'class initialization'!
+
+clearHistoryIcon
+    ^ Icon deleteIcon
+!
+
+initialize
+
+    self installInLauncher.
+!
+
+initializeDefaultCommands
+    DefaultCommandPerMIME := Dictionary new.
+
+    DefaultCommandPerMIME at:'application/x-tar-compressed' put:'gunzip < %1 | tar tvf -'.
+    DefaultCommandPerMIME at:'application/pdf'              put:'acroread %1'.
+
+    "
+     self initializeDefaultCommands
+    "
+!
+
+installInLauncher
+    "add myself to the launcher menu and toolBar"
+
+    |menuItem icon action|
+
+    FileBrowserV2 isNil ifTrue:[^ self].
+
+    action := [FileBrowserV2 open].
+
+    icon := self defaultIcon magnifiedTo:28@28.
+
+    menuItem := MenuItem new 
+                    label: 'FileBrowser V2';
+                    value: action;
+                    isButton: false;
+                    labelImage: (LabelAndIcon icon:icon string:'FileBrowser V2');
+                    nameKey: #fileBrowserV2;
+                    activeHelpKey: #fileBrowserV2;
+                    submenuChannel: #menuFileHistory;
+                    showBusyCursorWhilePerforming:true.
+
+    NewLauncher addMenuItem:menuItem in:'menu.file' position:#( #before #fileBrowser) space:true.
+
+    menuItem := MenuItem new 
+                    label: 'FileBrowser V2';
+                    value: action;
+                    isButton: true;
+                    labelImage: icon;
+                    nameKey: #fileBrowserV2;
+                    activeHelpKey: #fileBrowserV2;
+                    submenuChannel: #menuFileHistory;
+                    showBusyCursorWhilePerforming:true.
+
+    NewLauncher addMenuItem:menuItem in:'toolbar' position:#( #before #fileBrowser) space:false.
+
+    "
+     self installInLauncher
+     self removeFromLauncher
+    "
+!
+
+removeFromLauncher
+    "/
+    "/ remove myself from the launcher menu
+    "/
+
+    NewLauncher isNil ifTrue:[^ self].
+    NewLauncher removeUserTool:#fileBrowserV2
+
+    "
+     self removeFromLauncher
+    "
+! !
+
+!FileBrowserV2 class methodsFor:'defaults'!
+
+entryFieldEndStringForMultipleSelection
+
+    ^ ('[*]')
+! !
+
+!FileBrowserV2 class methodsFor:'help specs'!
+
+flyByHelpSpec
+    <resource: #help>
+
+    |spec|
+
+    spec := super flyByHelpSpec addPairsFrom:#(
+
+#addTerminal
+'Shell Terminal'
+
+#searchFile
+'Search a File'
+
+#directoryUp
+'Up'
+
+#directoryBack
+'Back'
+
+#copyFile
+'CopyFile'
+
+#cutFile
+'CutFile'
+
+#fileHome
+'Home'
+
+#pasteFile
+'PasteFile'
+
+#deleteFile
+'DeleteFile'
+
+#fileIn
+'FileIn'
+
+#directoryForward
+'Forward'
+
+#directoryHistory
+'Directory'
+
+#fileHistory
+'History'
+
+#hideToolBar
+'Hide Toolbar'
+
+#hideFilenameEntryField
+'Hide Filename Field'
+
+).
+
+    ^ spec.
+! !
+
+!FileBrowserV2 class methodsFor:'icon'!
+
+defaultIcon
+    "This resource specification was automatically generated
+     by the ImageEditor of ST/X."
+
+    "Do not manually edit this!! If it is corrupted,
+     the ImageEditor may not be able to read the specification."
+
+    "
+     self defaultIcon inspect
+     ImageEditor openOnClass:self andSelector:#defaultIcon
+    "
+
+    <resource: #image>
+
+    ^Icon
+        constantNamed:#'FileBrowserV2 class defaultIcon'
+        ifAbsentPut:[(Depth4Image new) width: 28; height: 28; photometric:(#palette); bitsPerSample:(#(4 )); samplesPerPixel:(1); bits:(ByteArray fromPackedString:'
+@@@@@@@@@@@@@@@@@@@@CLA&Y&Y&Y&X@@ADP@@@L0F@@@@@@A @ADAD@@@3@XN;.;.8F@ADPDQ@@CLA ;.@@@@@@D@@@D@@L0FC.8O[6=/@QDADP@@3@X@; 
+[6=/[0DPDP@@CLA DNC6<@@F<ADP@@@L0F@A@F= [0= @@@@@@3@X@@P=/[6=/@@@@@@CLA @@A/[6=/X@@@@@@L0FC0@O[6=/[0@@@@@@3@XF<@@@@@@@@@
+@@@@CLA = @@@@@@@@@@@@@L0FA/[6=/A @@@@@@@@3@XO[6=/XF@@@@@@@@CLA @@@@@@X@@@@@@@@L0FY&Y&Y&Y @@@@@@@@C@Y&Y&Y&Y&@@@@@@@@@@@@
+@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@N@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
+@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@C @b') ; colorMapFromArray:#[0 0 0 255 255 255 255 0 0 0 255 0 0 0 255 0 255 255 255 255 0 255 0 255 127 0 0 0 127 0 0 0 127 0 127 127 127 127 0 127 0 127 127 127 127 170 170 170]; mask:((Depth1Image new) width: 28; height: 28; photometric:(#blackIs0); bitsPerSample:(#(1 )); samplesPerPixel:(1); bits:(ByteArray fromPackedString:'
+O??# C??9<@??>? O???<C????@????0O???8C???<@???>@O??<@C???@@???0@O??<@C??8@@??>@@O?? @C??8@@??>@@G?? @@??8@@@@@@@G.P=0AAD
+HP@PQBD@GDP8 AADHD@PQBA@DN^=0@@a') ; yourself); yourself]
+!
+
+hideFilenameEntryFieldIcon
+    <resource: #programImage>
+
+    ^ ToolbarIconLibrary hideToolbarIconH14
+!
+
+hideToolBarIcon
+    <resource: #programImage>
+
+    ^ ToolbarIconLibrary hideToolbarIconH26
+! !
+
+!FileBrowserV2 class methodsFor:'interface specs'!
+
+windowSpec
+    "This resource specification was automatically generated
+     by the UIPainter of ST/X."
+
+    "Do not manually edit this!! If it is corrupted,
+     the UIPainter may not be able to read the specification."
+
+    "
+     UIPainter new openOnClass:FileBrowserV2 andSelector:#windowSpec
+     FileBrowserV2 new openInterface:#windowSpec
+     FileBrowserV2 open
+    "
+
+    <resource: #canvas>
+
+    ^ 
+     #(#FullSpec
+        #name: #windowSpec
+        #window: 
+       #(#WindowSpec
+          #label: #FileBrowser
+          #name: #FileBrowser
+          #min: #(#Point 10 10)
+          #max: #(#Point 1152 864)
+          #bounds: #(#Rectangle 16 42 816 642)
+          #menu: #mainMenu
+        )
+        #component: 
+       #(#SpecCollection
+          #collection: #(
+           #(#ViewSpec
+              #name: 'ToolbarBox'
+              #layout: #(#LayoutFrame 0 0 0 0 0 1 30 0)
+              #level: 0
+              #visibilityChannel: #toolBarVisibleHolder
+              #component: 
+             #(#SpecCollection
+                #collection: #(
+                 #(#ActionButtonSpec
+                    #label: 'hideToolBarIcon'
+                    #name: 'HideToolBarButton'
+                    #layout: #(#LayoutFrame 0 0 0 0 13 0 30 0)
+                    #activeHelpKey: #hideToolBar
+                    #hasCharacterOrientedLabel: false
+                    #translateLabel: true
+                    #model: #hideToolbar
+                    #postBuildCallback: #hideToolBarButtonCreated:
+                  )
+                 #(#MenuPanelSpec
+                    #name: 'ToolBar'
+                    #layout: #(#LayoutFrame 13 0 0 0 0 1 30 0)
+                    #menu: #toolBarMainMenu
+                    #textDefault: true
+                  )
+                 )
+               
+              )
+            )
+           #(#ViewSpec
+              #name: 'FilenameEntryFieldBox'
+              #layout: #(#LayoutFrame 0 0 30 0 0 1 55 0)
+              #level: 0
+              #visibilityChannel: #filenameEntryFieldVisibleHolder
+              #component: 
+             #(#SpecCollection
+                #collection: #(
+                 #(#ActionButtonSpec
+                    #label: 'hideFilenameEntryFieldIcon'
+                    #name: 'HideFilenameEntryFieldButton'
+                    #layout: #(#LayoutFrame 0 0 0 0 13 0 0 1)
+                    #activeHelpKey: #hideFilenameEntryField
+                    #hasCharacterOrientedLabel: false
+                    #translateLabel: true
+                    #model: #hideFilenameEntryField
+                    #postBuildCallback: #hideFilenameEntryFieldButtonCreated:
+                  )
+                 #(#ViewSpec
+                    #name: 'Box1'
+                    #layout: #(#LayoutFrame 13 0.0 0 0.0 0 1.0 0 1.0)
+                    #level: 1
+                    #component: 
+                   #(#SpecCollection
+                      #collection: #(
+                       #(#VariableHorizontalPanelSpec
+                          #name: 'VariableHorizontalPanel1'
+                          #layout: #(#LayoutFrame 1 0.0 1 0.0 -1 1.0 -1 1.0)
+                          #level: 0
+                          #showHandle: true
+                          #component: 
+                         #(#SpecCollection
+                            #collection: #(
+                             #(#FilenameInputFieldSpec
+                                #name: 'FilenameEntryField'
+                                #level: 1
+                                #model: #fileEntryFieldHolder
+                                #acceptOnPointerLeave: false
+                                #postBuildCallback: #postBuildPathField:
+                              )
+                             #(#ViewSpec
+                                #name: 'FilterBox'
+                                #component: 
+                               #(#SpecCollection
+                                  #collection: #(
+                                   #(#LabelSpec
+                                      #label: 'Filter:'
+                                      #name: 'Filter'
+                                      #layout: #(#LayoutFrame 0 0 0 0 40 0 0 1)
+                                      #translateLabel: true
+                                      #adjust: #left
+                                      #postBuildCallback: #postBuildPathViewBox:
+                                    )
+                                   #(#ComboBoxSpec
+                                      #name: 'FilterSelectionBox'
+                                      #layout: #(#LayoutFrame 40 0 0 0 0 1 0 1)
+                                      #model: #filterModel
+                                      #immediateAccept: true
+                                      #acceptOnPointerLeave: false
+                                      #comboList: #filterListModel
+                                    )
+                                   )
+                                 
+                                )
+                                #postBuildCallback: #postBuildPathViewBox:
+                              )
+                             )
+                           
+                          )
+                          #handles: #(#Any 0.8 1.0)
+                          #postBuildCallback: #postBuildPathViewBox:
+                        )
+                       )
+                     
+                    )
+                    #postBuildCallback: #postBuildPathViewBox:
+                  )
+                 )
+               
+              )
+            )
+           #(#ViewSpec
+              #name: 'BrowserBox'
+              #layout: #(#LayoutFrame 0 0.0 55 0 0 1.0 -20 1)
+              #level: 0
+              #component: 
+             #(#SpecCollection
+                #collection: #(
+                 #(#'FileBrowserV2UISpecifications::PanelSpec'
+                    #name: 'VerticalPanel'
+                    #layout: #(#LayoutFrame 0 0.0 0 0.0 0 1.0 0 1.0)
+                    #level: 0
+                    #whichView: #last
+                    #orientation: #vertical
+                    #visibility: #viewNoteBookApplicationHolder
+                    #component: 
+                   #(#SpecCollection
+                      #collection: #(
+                       #(#'FileBrowserV2UISpecifications::PanelSpec'
+                          #name: 'HorizontalPanel'
+                          #level: 0
+                          #whichView: #first
+                          #orientation: #horizontal
+                          #visibility: #showDirectoryTreeHolder
+                          #component: 
+                         #(#SpecCollection
+                            #collection: #(
+                             #(#SubCanvasSpec
+                                #name: 'DirectoryTreeBrowser'
+                                #hasHorizontalScrollBar: false
+                                #hasVerticalScrollBar: false
+                                #majorKey: #DirectoryTreeBrowser
+                                #createNewApplication: true
+                                #createNewBuilder: true
+                              )
+                             #(#SubCanvasSpec
+                                #name: 'DirectoryContentsBrowser'
+                                #hasHorizontalScrollBar: false
+                                #hasVerticalScrollBar: false
+                                #majorKey: #DirectoryContentsBrowser
+                                #createNewApplication: true
+                                #createNewBuilder: true
+                              )
+                             )
+                           
+                          )
+                          #handles: #(#Any 0.229621 1.0)
+                        )
+                       #(#SubCanvasSpec
+                          #name: 'FileApplicationNoteBook'
+                          #hasHorizontalScrollBar: false
+                          #hasVerticalScrollBar: false
+                          #majorKey: #FileApplicationNoteBook
+                          #createNewApplication: true
+                          #createNewBuilder: true
+                        )
+                       )
+                     
+                    )
+                    #handles: #(#Any 0.5 1.0)
+                  )
+                 )
+               
+              )
+            )
+           #(#ViewSpec
+              #name: 'Box2'
+              #layout: #(#LayoutFrame 0 0 -20 1 0 1 0 1)
+              #level: 0
+              #component: 
+             #(#SpecCollection
+                #collection: #(
+                 #(#LabelSpec
+                    #label: 'NotifyLabel'
+                    #name: 'NotifyLabel'
+                    #layout: #(#LayoutFrame 1 0.0 1 0.0 1 1.0 1 1.0)
+                    #level: -1
+                    #translateLabel: true
+                    #labelChannel: #notifyChannel
+                    #adjust: #left
+                  )
+                 )
+               
+              )
+            )
+           )
+         
+        )
+      )
+! !
+
+!FileBrowserV2 class methodsFor:'menu specs'!
+
+browserMenu
+    "This resource specification was automatically generated
+     by the MenuEditor of ST/X."
+
+    "Do not manually edit this!! If it is corrupted,
+     the MenuEditor may not be able to read the specification."
+
+    "
+     MenuEditor new openOnClass:FileBrowserV2 andSelector:#browserMenu
+     (Menu new fromLiteralArrayEncoding:(FileBrowserV2 browserMenu)) startUp
+    "
+
+    <resource: #menu>
+
+    ^ 
+     #(#Menu
+        #(
+         #(#MenuItem
+            #label: 'Spawn'
+            #translateLabel: true
+            #value: #doSpawn
+          )
+         #(#MenuItem
+            #label: 'Save Settings'
+            #translateLabel: true
+            #value: #saveSettingsAspectValues
+          )
+         #(#MenuItem
+            #label: '-'
+          )
+         #(#MenuItem
+            #label: 'Search File'
+            #translateLabel: true
+            #value: #doOpenSearchFile
+          )
+         #(#MenuItem
+            #label: 'Terminal View'
+            #translateLabel: true
+            #value: #doAddTerminal
+          )
+         #(#MenuItem
+            #label: '-'
+          )
+         #(#MenuItem
+            #label: 'Exit'
+            #translateLabel: true
+            #value: #closeRequest
+          )
+         )
+        nil
+        nil
+      )
+!
+
+mainMenu
+    "This resource specification was automatically generated
+     by the MenuEditor of ST/X."
+
+    "Do not manually edit this!! If it is corrupted,
+     the MenuEditor may not be able to read the specification."
+
+    "
+     MenuEditor new openOnClass:FileBrowserV2 andSelector:#mainMenu
+     (Menu new fromLiteralArrayEncoding:(FileBrowserV2 mainMenu)) startUp
+    "
+
+    <resource: #menu>
+
+    ^ 
+     #(#Menu
+        #(
+         #(#MenuItem
+            #label: 'Browser'
+            #translateLabel: true
+            #submenuChannel: #browserMenu
+          )
+         #(#MenuItem
+            #label: 'Directory'
+            #translateLabel: true
+            #submenuChannel: #directoryMenu
+          )
+         #(#MenuItem
+            #label: 'File'
+            #translateLabel: true
+            #submenuChannel: #fileMenu
+          )
+         #(#MenuItem
+            #label: 'Edit'
+            #translateLabel: true
+            #submenuChannel: #editMenu
+          )
+         #(#MenuItem
+            #label: 'View'
+            #translateLabel: true
+            #submenu: 
+           #(#Menu
+              #(
+               #(#MenuItem
+                  #label: 'View File List'
+                  #translateLabel: true
+                  #submenuChannel: #viewFileBrowserMenu
+                )
+               #(#MenuItem
+                  #label: 'Sort File List'
+                  #translateLabel: true
+                  #submenuChannel: #sortMenu
+                )
+               #(#MenuItem
+                  #label: 'View Tree View'
+                  #translateLabel: true
+                  #indication: #showDirectoryTreeHolder
+                )
+               #(#MenuItem
+                  #label: 'View Directory Description'
+                  #translateLabel: true
+                  #indication: #viewDirectoryDescription
+                )
+               #(#MenuItem
+                  #label: 'View Files in Tree View'
+                  #translateLabel: true
+                  #indication: #viewFilesInDirectoryTree
+                )
+               #(#MenuItem
+                  #label: 'View Directories in Contents View'
+                  #translateLabel: true
+                  #indication: #viewDirectoriesInDirectoryContentsBrowser
+                )
+               #(#MenuItem
+                  #label: 'View Notebook Applications'
+                  #translateLabel: true
+                  #enabled: #enableViewNoteBookApplication
+                  #indication: #viewNoteBookApplicationHolder
+                )
+               #(#MenuItem
+                  #label: 'Open Multiple Applications'
+                  #translateLabel: true
+                  #indication: #openMultipleApplicationsForType
+                )
+               #(#MenuItem
+                  #label: '-'
+                )
+               #(#MenuItem
+                  #label: 'Toolbar'
+                  #translateLabel: true
+                  #hideMenuOnActivated: false
+                  #indication: #toolBarVisibleHolder
+                )
+               #(#MenuItem
+                  #label: 'Pathname '
+                  #translateLabel: true
+                  #hideMenuOnActivated: false
+                  #indication: #filenameEntryFieldVisibleHolder
+                )
+               #(#MenuItem
+                  #label: '-'
+                )
+               #(#MenuItem
+                  #label: 'Update'
+                  #translateLabel: true
+                )
+               )
+              nil
+              nil
+            )
+          )
+         #(#MenuItem
+            #label: 'Tools'
+            #translateLabel: true
+            #submenuChannel: #toolsMenuSpec
+          )
+         #(#MenuItem
+            #label: 'CVS'
+            #translateLabel: true
+            #submenu: 
+           #(#Menu
+              #(
+               #(#MenuItem
+                  #label: 'Update selected Files/Directories'
+                  #translateLabel: true
+                  #value: #cvsUpdateSelection
+                  #enabled: #hasSelection
+                )
+               #(#MenuItem
+                  #label: 'Update Directory Local'
+                  #translateLabel: true
+                  #value: #cvsUpdateAll
+                )
+               #(#MenuItem
+                  #label: 'Update Directory Recursive'
+                  #translateLabel: true
+                  #value: #cvsUpdateAllRecursive
+                )
+               #(#MenuItem
+                  #label: '-'
+                )
+               #(#MenuItem
+                  #label: 'Commit...'
+                  #translateLabel: true
+                  #value: #cvsCommit
+                )
+               #(#MenuItem
+                  #label: 'Add && Commit...'
+                  #translateLabel: true
+                  #value: #cvsAddAndCommit
+                  #enabled: #canCvsAddAndCommit
+                )
+               #(#MenuItem
+                  #label: '-'
+                )
+               #(#MenuItem
+                  #label: 'Remove File && CVS Container...'
+                  #translateLabel: true
+                  #value: #cvsRemoveFileAndCVSContainer
+                  #enabled: #canRemoveCVSContainer
+                )
+               )
+              nil
+              nil
+            )
+          )
+         #(#MenuItem
+            #label: 'Help'
+            #translateLabel: true
+            #startGroup: #right
+            #submenu: 
+           #(#Menu
+              #(
+               #(#MenuItem
+                  #label: 'FileBrowser Documentation'
+                  #translateLabel: true
+                )
+               #(#MenuItem
+                  #label: '-'
+                )
+               #(#MenuItem
+                  #label: 'About FileBrowser...'
+                  #translateLabel: true
+                )
+               )
+              nil
+              nil
+            )
+          )
+         )
+        nil
+        nil
+      )
+!
+
+toolBarMainMenu
+    "This resource specification was automatically generated
+     by the MenuEditor of ST/X."
+
+    "Do not manually edit this!! If it is corrupted,
+     the MenuEditor may not be able to read the specification."
+
+    "
+     MenuEditor new openOnClass:FileBrowserV2 andSelector:#toolBarMainMenu
+     (Menu new fromLiteralArrayEncoding:(FileBrowserV2 toolBarMainMenu)) startUp
+    "
+
+    <resource: #menu>
+
+    ^ 
+     #(#Menu
+        #(
+         #(#MenuItem
+            #label: 'DirectoryUp'
+            #translateLabel: true
+            #isButton: true
+            #value: #doGoDirectoryUp
+            #activeHelpKey: #directoryUp
+            #enabled: #enableDirectoryUp
+            #labelImage: #(#ResourceRetriever #AbstractFileBrowser #upArrow20x20Icon)
+          )
+         #(#MenuItem
+            #label: ''
+          )
+         #(#MenuItem
+            #label: 'Back'
+            #translateLabel: true
+            #isButton: true
+            #value: #doBack
+            #activeHelpKey: #directoryBack
+            #enabled: #enableBack
+            #labelImage: #(#ResourceRetriever #AbstractFileBrowser #leftArrow20x20PlusMenuIcon)
+            #submenuChannel: #menuDirHistoryBack
+          )
+         #(#MenuItem
+            #label: ''
+          )
+         #(#MenuItem
+            #label: 'Forward'
+            #translateLabel: true
+            #isButton: true
+            #value: #doForward
+            #activeHelpKey: #directoryForward
+            #enabled: #enableForward
+            #labelImage: #(#ResourceRetriever #AbstractFileBrowser #rightArrowPlusMenu20x20Icon)
+            #submenuChannel: #menuFileHistory
+          )
+         #(#MenuItem
+            #label: ''
+          )
+         #(#MenuItem
+            #label: 'Home'
+            #translateLabel: true
+            #isButton: true
+            #value: #doGotoHomeDirectory
+            #activeHelpKey: #fileHome
+            #enabled: #enableHome
+            #labelImage: #(#ResourceRetriever nil #goHomeIcon)
+          )
+         #(#MenuItem
+            #label: ''
+          )
+         #(#MenuItem
+            #label: 'File History'
+            #translateLabel: true
+            #isButton: true
+            #activeHelpKey: #fileHistory
+            #enabled: #enableFileHistory
+            #labelImage: #(#ResourceRetriever #ToolbarIconLibrary #history20x20Icon)
+            #submenuChannel: #menuFileHistory
+          )
+         #(#MenuItem
+            #label: ''
+          )
+         #(#MenuItem
+            #label: 'Copy'
+            #translateLabel: true
+            #isButton: true
+            #value: #copyInDirContentsBrowser
+            #activeHelpKey: #copyFile
+            #enabled: #hasSelection
+            #labelImage: #(#ResourceRetriever #ToolbarIconLibrary #copy20x20Icon)
+          )
+         #(#MenuItem
+            #label: 'Cut'
+            #translateLabel: true
+            #isButton: true
+            #value: #cutInDirContentsBrowser
+            #activeHelpKey: #cutFile
+            #enabled: #hasSelection
+            #labelImage: #(#ResourceRetriever #ToolbarIconLibrary #cut20x20Icon2)
+          )
+         #(#MenuItem
+            #label: 'Paste'
+            #translateLabel: true
+            #isButton: true
+            #value: #pasteFiles
+            #activeHelpKey: #pasteFile
+            #enabled: #canPaste
+            #labelImage: #(#ResourceRetriever #ToolbarIconLibrary #paste20x20Icon)
+          )
+         #(#MenuItem
+            #label: 'Delete'
+            #translateLabel: true
+            #isButton: true
+            #value: #deleteInDirContentsBrowser
+            #activeHelpKey: #deleteFile
+            #enabled: #hasSelection
+            #labelImage: #(#ResourceRetriever #ToolbarIconLibrary #erase20x20Icon)
+          )
+         #(#MenuItem
+            #label: ''
+          )
+         #(#MenuItem
+            #label: 'File In'
+            #translateLabel: true
+            #isButton: true
+            #value: #fileFileIn
+            #activeHelpKey: #fileIn
+            #enabled: #hasSelection
+            #labelImage: #(#ResourceRetriever #ToolbarIconLibrary #fileIn20x20Icon3)
+          )
+         #(#MenuItem
+            #label: ''
+          )
+         #(#MenuItem
+            #label: 'Search File'
+            #translateLabel: true
+            #isButton: true
+            #value: #doOpenSearchFile
+            #activeHelpKey: #searchFile
+            #labelImage: #(#ResourceRetriever #ToolbarIconLibrary #search20x20Icon)
+          )
+         #(#MenuItem
+            #label: 'VT100'
+            #translateLabel: true
+            #isButton: true
+            #value: #doAddTerminal
+            #activeHelpKey: #addTerminal
+            #labelImage: #(#ResourceRetriever #ToolbarIconLibrary #shell20x20WithoutTextIcon)
+          )
+         )
+        nil
+        nil
+      )
+!
+
+toolsMenuSpec
+    "This resource specification was automatically generated
+     by the MenuEditor of ST/X."
+
+    "Do not manually edit this!! If it is corrupted,
+     the MenuEditor may not be able to read the specification."
+
+    "
+     MenuEditor new openOnClass:FileBrowserV2 andSelector:#toolsMenuSpec
+     (Menu new fromLiteralArrayEncoding:(FileBrowserV2 toolsMenuSpec)) startUp
+    "
+
+    <resource: #menu>
+
+    ^ 
+     #(#Menu
+        #(
+         #(#MenuItem
+            #label: 'Execute Command...'
+            #translateLabel: true
+            #value: #doExecuteCommand
+          )
+         #(#MenuItem
+            #label: 'Shell Terminal'
+            #translateLabel: true
+            #isVisible: #canDoTerminalAndSystemIsUnix
+            #value: #openTerminal
+            #enabled: #canDoTerminal
+          )
+         #(#MenuItem
+            #label: 'DOS Terminal'
+            #translateLabel: true
+            #isVisible: #canDoTerminalAndSystemIsDOS
+            #value: #openTerminal
+            #enabled: #canDoTerminal
+          )
+         #(#MenuItem
+            #label: '-'
+          )
+         #(#MenuItem
+            #label: 'Changes Browser'
+            #translateLabel: true
+            #value: #openChangesBrowser
+            #enabled: #hasSelection
+          )
+         #(#MenuItem
+            #label: 'Snapshot Image Browser'
+            #translateLabel: true
+            #value: #openSnapshotImageBrowser
+            #enabled: #hasSnapshotSelection
+          )
+         #(#MenuItem
+            #label: 'Create Smalltalk Project'
+            #translateLabel: true
+            #value: #createProjectAndOpenProjectBrowser
+            #enabled: #canCreateNewProject
+          )
+         #(#MenuItem
+            #label: 'Install Autoloaded'
+            #translateLabel: true
+            #value: #readAbbrevFile
+            #enabled: #canReadAbbrevFile
+          )
+         #(#MenuItem
+            #label: 'Install all as Autoloaded'
+            #translateLabel: true
+            #value: #installAllAsAutoloaded
+            #enabled: #anySTFilesPresent
+          )
+         #(#MenuItem
+            #label: 'Editor'
+            #translateLabel: true
+            #value: #openEditor
+            #enabled: #hasSelection
+          )
+         #(#MenuItem
+            #label: 'HTML Reader'
+            #translateLabel: true
+            #value: #openHTMLReader
+            #enabled: #hasSelection
+          )
+         #(#MenuItem
+            #label: 'ASN1 Browser'
+            #translateLabel: true
+            #isVisible: #hasASN1
+            #value: #openASN1Browser
+            #enabled: #hasASN1AndSelection
+          )
+         #(#MenuItem
+            #label: 'C Browser'
+            #translateLabel: true
+            #isVisible: #hasCBrowser
+            #value: #openCBrowser
+            #enabled: #hasCBrowser
+          )
+         #(#MenuItem
+            #label: 'Applet Viewer'
+            #translateLabel: true
+            #isVisible: #hasJava
+            #value: #openAppletViewer
+            #enabled: #hasJavaAndSelection
+          )
+         #(#MenuItem
+            #label: 'Image Inspector'
+            #translateLabel: true
+            #value: #openImageInspector
+            #enabled: #hasSelection
+          )
+         #(#MenuItem
+            #label: 'Image Preview'
+            #translateLabel: true
+            #value: #openImagePreview
+            #enabled: #hasSelection
+          )
+         #(#MenuItem
+            #label: 'Image Editor'
+            #translateLabel: true
+            #value: #openImageEditor
+            #enabled: #hasSelection
+          )
+         #(#MenuItem
+            #label: 'MP3 Player'
+            #translateLabel: true
+            #isVisible: #hasMP3Player
+            #value: #openMP3Player
+            #enabled: #hasMP3PlayerAndSelection
+          )
+         #(#MenuItem
+            #label: 'ZipFile Tool'
+            #translateLabel: true
+            #value: #openZipTool
+            #enabled: #hasZipFileSelected
+          )
+         #(#MenuItem
+            #label: 'Slide Show'
+            #translateLabel: true
+            #isVisible: #hasSlideShow
+            #value: #openSlideShow
+            #enabled: #currentFilesAreInSameDirectory
+          )
+         #(#MenuItem
+            #label: 'File Differences...'
+            #translateLabel: true
+            #value: #openDiffView
+            #enabled: #hasSelection
+          )
+         #(#MenuItem
+            #label: 'Find Duplicate Files'
+            #translateLabel: true
+            #value: #fileFindDuplicates
+          )
+         #(#MenuItem
+            #label: 'Find All Duplicate Files (Recursive)'
+            #translateLabel: true
+            #value: #fileFindAllDuplicates
+            #enabled: #hasSelection
+          )
+         #(#MenuItem
+            #label: 'Find a File...'
+            #translateLabel: true
+            #value: #fileFindFile
+          )
+         #(#MenuItem
+            #label: 'Hex Dump'
+            #translateLabel: true
+            #value: #fileHexDump
+            #enabled: #hasSelection
+          )
+         )
+        nil
+        nil
+      )
+! !
+
+!FileBrowserV2 methodsFor:'actions'!
+
+changeFileBrowserTitleTo:aString
+
+    |string|
+
+    string := 'FileBrowser ', aString.
+    self window label:string.
+!
+
+doSpawn
+
+    self saveRuntimeAspectValues.
+    self class openWithAspects:aspects withExtent:self builder window extent.
+!
+
+hideFilenameEntryField
+    self filenameEntryFieldVisibleHolder value:false.
+!
+
+hideToolbar
+    self toolBarVisibleHolder value:false.
+! !
+
+!FileBrowserV2 methodsFor:'aspects'!
+
+fileEntryFieldHolder
+
+    fileEntryFieldHolder isNil ifTrue:[
+        fileEntryFieldHolder := ValueHolder new.
+        fileEntryFieldHolder addDependent:self.
+    ].
+    ^ fileEntryFieldHolder.
+! !
+
+!FileBrowserV2 methodsFor:'change & update'!
+
+update:something with:aParameter from:changedObject
+
+
+    changedObject == self fileEntryFieldHolder ifTrue:[
+        (fileEntryFieldHolder value asFilename exists) ifFalse:[^ self].
+        self currentFileNameHolder value:(OrderedCollection with:(fileEntryFieldHolder value asFilename)) withoutNotifying:self.
+    ].
+    changedObject == self currentFileNameHolder ifTrue:[
+        | files newDir|
+        files := self currentFileNameHolder value.
+        
+        (files isEmpty) ifTrue:[
+            self fileEntryFieldHolder value:nil withoutNotifying:self.
+            self hasSelection value:false.
+        ] ifFalse:[
+            self hasSelection value:true.
+            files size == 1 ifTrue:[
+                self fileEntryFieldHolder value:(files first) withoutNotifying:self.    
+            ] ifFalse:[
+                self fileEntryFieldHolder value:self getBestFile withoutNotifying:self.
+            ].
+        ].
+        " do not return here because the AbstractFileBrowserComponent have to do something
+          for every application "  
+"/        ^ self.
+    ].
+    (changedObject == self toolBarVisibleHolder 
+    or:[changedObject == self filenameEntryFieldVisibleHolder]) ifTrue:[
+        self updateToolVisibility.
+        ^ self.
+    ].
+
+    ^ super update:something with:aParameter from:changedObject.
+!
+
+updateToolVisibility
+    |builder toolBar filenameEntryField vPanel topOffset visible d|
+
+    builder := self builder.
+
+    topOffset := 0.
+    visible := self toolBarVisibleHolder value.
+    visible ifTrue:[
+        toolBar := builder componentAt:#ToolbarBox.
+        topOffset := topOffset + toolBar height.
+    ].
+
+    visible := self filenameEntryFieldVisibleHolder value.
+    visible ifTrue:[
+        filenameEntryField := builder componentAt:#FilenameEntryFieldBox.
+        d := filenameEntryField layout bottomOffset - filenameEntryField layout topOffset.
+        filenameEntryField layout topOffset:topOffset bottomOffset:topOffset + d.
+        topOffset := topOffset + filenameEntryField height.
+        filenameEntryField container notNil ifTrue:[
+            filenameEntryField containerChangedSize.
+        ].
+    ].
+
+    vPanel := builder componentAt:#BrowserBox.
+    vPanel layout topOffset:topOffset+1.
+    vPanel container notNil ifTrue:[
+        vPanel containerChangedSize.
+    ].
+! !
+
+!FileBrowserV2 methodsFor:'menu'!
+
+canBack
+
+    ^ self dirHistory canBack.
+!
+
+canForward
+
+    ^ self dirHistory canForward.
+!
+
+menuFileHistory
+    "initialize the file history menu
+    "
+    <resource: #programMenu >
+
+    |menu hist text removeItem removeCol|
+
+    menu := Menu new.
+    menu receiver:self.
+
+    hist := self fileHistory.
+    hist isEmpty ifTrue:[^ nil].
+    text := LabelAndIcon icon:(self class clearHistoryIcon) string:'Clear File History'.
+    removeCol := OrderedCollection new.
+    hist do:[:aFileItem|
+        aFileItem fileName exists ifTrue:[
+            menu addItem:(MenuItem label: aFileItem fileName asString value:[
+                self currentFileNameHolder value:(OrderedCollection with:(aFileItem fileName)).
+                self openApplByFileItem:aFileItem
+            ]).
+        ] ifFalse:[
+            removeCol add:aFileItem.
+        ]
+    ].
+    "/ remove all not existing history entries
+    removeCol do:[ : el |
+        hist remove:el.
+    ].
+    removeItem := MenuItem label:text value:[
+        self fileHistory removeAll.
+        self enableFileHistory value:false.
+    ].
+    menu addItem:(MenuItem label:'-').
+    menu addItem:removeItem.
+    ^ menu
+! !
+
+!FileBrowserV2 methodsFor:'startup & release'!
+
+hideFilenameEntryFieldButtonCreated:aButton
+
+    aButton passiveLevel:(MenuPanel defaultLevel). 
+    aButton activeLevel:-1.
+    aButton backgroundColor:(MenuPanel defaultBackgroundColor).
+!
+
+hideToolBarButtonCreated:aButton
+
+    aButton passiveLevel:(MenuPanel defaultLevel). 
+    aButton activeLevel:-1.
+    aButton backgroundColor:(MenuPanel defaultBackgroundColor).
+!
+
+initialize
+
+    self masterApplication:nil.
+!
+
+makeDependent
+
+    self currentFileNameHolder addDependent:self.
+    self notifyChannel addDependent:self.
+    self viewNoteBookApplicationHolder addDependent:self.
+    self filenameEntryFieldVisibleHolder addDependent:self.
+    self toolBarVisibleHolder addDependent:self.
+!
+
+postBuildPathField:aWidget
+    "
+        set the pramters that not can be changed in the window spec
+    "
+
+    |sClr lClr|
+
+    aWidget level:-1.
+
+"/    sClr := aWidget shadowColor.
+"/    lClr := aWidget lightColor.
+"/    sClr := (self builder componentAt:#ToolBar) shadowColor.
+"/    lClr := (self builder componentAt:#ToolBar) lightColor.
+
+"/    aWidget backgroundColor:(aWidget superView viewBackground).
+"/    aWidget shadowColor:sClr.
+!
+
+postBuildPathViewBox:aWidget
+
+    aWidget backgroundColor:(MenuPanel defaultBackgroundColor).
+!
+
+postBuildWith:aBuilder
+
+    super postBuildWith:aBuilder.
+    self updateToolVisibility
+!
+
+postOpenWith:aBuilder
+
+    self currentFileNameHolder changed.
+    self showDirectoryTreeHolder changed.
+    self viewNoteBookApplicationHolder changed.
+    ^ super postOpenWith:aBuilder
+!
+
+release
+
+    self saveRuntimeAspectValues.
+    ^ super release
+! !
+
+!FileBrowserV2 class methodsFor:'documentation'!
+
+version
+    ^ '$Header: /cvs/stx/stx/libtool/FileBrowserV2.st,v 1.1 2002-09-25 07:59:46 penk Exp $'
+! !
+
+FileBrowserV2 initialize!