FileBrowserV2.st
author Claus Gittinger <cg@exept.de>
Sat, 12 Oct 2002 02:48:29 +0200
changeset 3980 3f8311a42ca7
parent 3973 32e6266d196f
child 3982 fc30449d705d
permissions -rw-r--r--
menus reorganized

"
 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 pathEntryField'
	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 files|
    instance := self new.
    files := aDirectoryPath isCollection ifTrue:[aDirectoryPath] ifFalse:[(Array with:aDirectoryPath)].
    instance currentFileNameHolder value:files.
    ^ 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 currentLauncher|

    FileBrowserV2 isNil ifTrue:[^ self].

    action := [FileBrowserV2 open].

    icon := NewLauncher startNewFileBrowserIcon. "/ 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.

    currentLauncher := NewLauncher current.
    currentLauncher notNil ifTrue:[
        currentLauncher fileBrowserItemVisible value:false
    ].

    "
     self installInLauncher
     self removeFromLauncher
    "
!

removeFromLauncher
    "/
    "/ remove myself from the launcher menu
    "/

    |currentLauncher|

    NewLauncher isNil ifTrue:[^ self].
    NewLauncher removeUserTool:#fileBrowserV2.
    currentLauncher := NewLauncher current.
    currentLauncher notNil ifTrue:[
        currentLauncher fileBrowserItemVisible value:false
    ].

    "
     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'

#showFileDetails
'Show File Details'

#hideFileDetails
'Hide File Details'

#toggleDetails
'Show/Hide File Details'

).

    ^ spec.
!

helpSpec
    "This resource specification was automatically generated
     by the UIHelpTool of ST/X."

    "Do not manually edit this!! If it is corrupted,
     the UIHelpTool may not be able to read the specification."

    "
     UIHelpTool openOnClass:FileBrowserV2    
    "

    <resource: #help>

    ^super helpSpec addPairsFrom:#(


)
! !

!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:'image specs'!

viewDetailsIcon
    "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 viewDetailsIcon inspect
     ImageEditor openOnClass:self andSelector:#viewDetailsIcon
     Icon flushCachedIcons
    "

    <resource: #image>

    ^Icon
        constantNamed:#'FileBrowserV2 class viewDetailsIcon'
        ifAbsentPut:[(Depth1Image new) width: 16; height: 16; photometric:(#palette); bitsPerSample:(#(1 )); samplesPerPixel:(1); bits:(ByteArray fromPackedString:'@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@b') ; colorMapFromArray:#[0 0 0 255 255 255]; mask:((Depth1Image new) width: 16; height: 16; photometric:(#blackIs0); bitsPerSample:(#(1 )); samplesPerPixel:(1); bits:(ByteArray fromPackedString:'@@@@@@@@]+X@@@@@]+X@@@@@]+X@@@@@]+X@@@@@@@@b') ; yourself); yourself]
!

viewNoDetailsIcon
    "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 viewNoDetailsIcon inspect
     ImageEditor openOnClass:self andSelector:#viewNoDetailsIcon
     Icon flushCachedIcons
    "

    <resource: #image>

    ^Icon
        constantNamed:#'FileBrowserV2 class viewNoDetailsIcon'
        ifAbsentPut:[(Depth1Image new) width: 16; height: 16; photometric:(#palette); bitsPerSample:(#(1 )); samplesPerPixel:(1); bits:(ByteArray fromPackedString:'@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@b') ; colorMapFromArray:#[0 0 0 255 255 255]; mask:((Depth1Image new) width: 16; height: 16; photometric:(#blackIs0); bitsPerSample:(#(1 )); samplesPerPixel:(1); bits:(ByteArray fromPackedString:'@@@@@@@@A<@@@@@@A<@@@@@@A<@@@@@@A<@@@@@@@@@b') ; yourself); yourself]
! !

!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)
          #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
                          #tabable: false
                        )
                       )
                     
                    )
                    #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: 'Show'
                  #translateLabel: true
                  #submenu: 
                 #(#Menu
                    #(
                     #(#MenuItem
                        #label: 'Hidden Files'
                        #translateLabel: true
                        #indication: #showHiddenFiles
                      )
                     #(#MenuItem
                        #label: '-'
                      )
                     #(#MenuItem
                        #label: 'Directory Tree'
                        #translateLabel: true
                        #indication: #showDirectoryTreeHolder
                      )
                     #(#MenuItem
                        #label: 'Directory Description'
                        #translateLabel: true
                        #indication: #viewDirectoryDescription
                      )
                     #(#MenuItem
                        #label: 'Regular Files in TreeView (Left)'
                        #translateLabel: true
                        #indication: #viewFilesInDirectoryTree
                      )
                     #(#MenuItem
                        #label: 'Directories in ContentsView (Right)'
                        #translateLabel: true
                        #indication: #viewDirectoriesInDirectoryContentsBrowser
                      )
                     #(#MenuItem
                        #label: 'File Applications'
                        #translateLabel: true
                        #enabled: #enableViewNoteBookApplication
                        #indication: #viewNoteBookApplicationHolder
                      )
                     #(#MenuItem
                        #label: '-'
                      )
                     #(#MenuItem
                        #label: 'Open Multiple Applications'
                        #translateLabel: true
                        #indication: #openMultipleApplicationsForType
                      )
                     )
                    nil
                    nil
                  )
                )
               #(#MenuItem
                  #label: 'Sort'
                  #translateLabel: true
                  #submenuChannel: #sortMenu
                )
               #(#MenuItem
                  #label: 'Details'
                  #translateLabel: true
                  #submenuChannel: #viewInContentsBrowserMenu
                )
               #(#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 #leftArrow20x20Icon)
            #submenuChannel: #menuDirHistoryBack
          )
         #(#MenuItem
            #label: ''
          )
         #(#MenuItem
            #label: 'Forward'
            #translateLabel: true
            #isButton: true
            #value: #doForward
            #activeHelpKey: #directoryForward
            #enabled: #enableForward
            #labelImage: #(#ResourceRetriever #AbstractFileBrowser #rightArrow20x20Icon)
            #submenuChannel: #menuDirHistoryForward
          )
         #(#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)
          )
         #(#MenuItem
            #label: 'viewDetails'
            #isButton: true
            #startGroup: #right
            "/ #value: #toggleFileDetailsFor:
            #activeHelpKey: #toggleDetails
            #labelImage: #(#ResourceRetriever nil #viewDetailsIcon)
            #submenuChannel: #viewDetailsMenuSpec
            #indication: #viewDetails
          )
         )
        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.
!

toggleFileDetailsFor:anItem
    |viewDetails|

    viewDetails := self viewDetails value not.
    self viewDetails value:viewDetails.

    viewDetails ifTrue:[
        anItem activeHelpKey:#hideFileDetails.
        anItem label:(self class viewNoDetailsIcon).
    ] ifFalse:[
        anItem activeHelpKey:#showFileDetails.
        anItem label:(self class viewDetailsIcon).
    ].
! !

!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.
        ] ifFalse:[
            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:'event handling'!

processEvent:anEvent
    "filter keyboard events.
     Return true, if I have eaten the event"

    |focusView key rawKey fileName|

    anEvent isKeyPressEvent ifTrue:[
        focusView := anEvent targetView.
        key := anEvent key.
        rawKey := anEvent rawKey.

        (focusView isSameOrComponentOf:self window) ifTrue:[

            ((focusView == pathEntryField) not) ifTrue:[ ^ false].

            (key == #Return) ifTrue:[
                fileName := pathEntryField list first asFilename.
                (fileName exists and:[fileName isDirectory not]) ifTrue:[
                    self openApplByFileItem:(DirectoryContentsBrowser itemClass with:fileName)
                ].
            ].
        ]
    ].
    ^ false
! !

!FileBrowserV2 methodsFor:'startup & release'!

closeRequest

    (self application:#FileApplicationNoteBook do:#closeRequest) not ifTrue:[
        ^ self
    ].
    ^ super closeRequest.
!

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
    "

    pathEntryField := aWidget.
    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.
    self windowGroup addPreEventHook:self.
    ^ super postOpenWith:aBuilder
!

release

    self saveRuntimeAspectValues.
    ^ super release
! !

!FileBrowserV2 class methodsFor:'documentation'!

version
    ^ '$Header: /cvs/stx/stx/libtool/FileBrowserV2.st,v 1.15 2002-10-12 00:48:20 cg Exp $'
! !

FileBrowserV2 initialize!