MIMETypeIconLibrary.st
author Claus Gittinger <cg@exept.de>
Sun, 23 Nov 2014 16:52:58 +0100
changeset 3401 4850b4d8d0fd
parent 3399 5f9df070dfed
child 3402 6c17e9383174
permissions -rw-r--r--
class: MIMETypeIconLibrary added: #javaArchive changed: #initializeIcons

"
 COPYRIGHT (c) 2004 by eXept Software AG
              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:libview2' }"

Object subclass:#MIMETypeIconLibrary
	instanceVariableNames:''
	classVariableNames:'Icons MatchedIcons'
	poolDictionaries:''
	category:'Interface-Smalltalk'
!

!MIMETypeIconLibrary class methodsFor:'documentation'!

copyright
"
 COPYRIGHT (c) 2004 by eXept Software AG
              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.
"
! !

!MIMETypeIconLibrary class methodsFor:'initialization'!

flushIcons
    "remove any cached icons. Call this eg. after a style change"

    Icons := nil

    "
     self flushIcons
    "
!

initialize
    "/ now done lazily, when the first icon is asked for
    "/ self initializeIcons
!

initializeIcons
    |icons matchedIcons defaults resources addMapping fileNameToImageMap|

    icons := Dictionary new.
    matchedIcons := OrderedCollection new.
    fileNameToImageMap := Dictionary new.

    defaults := #(
        "/ internal-type to icon mappings.
        directory             directory         
        directoryOpen         directoryOpen       
        directoryLocked       directoryLocked     
        directoryLink         directoryLink     
        directoryNetwork      directoryNetwork 
        file                  file           
        fileLink              fileLink             
        fileLocked            fileLocked       

        executableFile        executableFile             
        deviceFile            deviceFile           
        binaryFile            binaryFile          
        specialFile           specialFile       

        addOnLocked           addOnLocked            
        addOnLinked           addOnLinked            

        directoryGray         directoryGray       
        directoryOpenGray     directoryOpenGray

        "/ these are soon obsolete
        imageFile             imageFile              
        textFile              text             

        "/ mime-type to icon mappings.
        'image/*'                                       imageFile

        "/ misc text ...

        'text/html'                                     textHtml
"/        'text/plain'                                    text
        'text/*'                                        text

        'application/postscript'                        applicationPostscript
        'application/pdf'                               applicationPdf
        'application/rtf'                               applicationRtf     

        "/ video formats ...

"/        'video/x-sgi-movie'                             video
"/        'video/x-msvideo'                               video
"/        'video/quicktime'                               video
"/        'video/x-mpeg2'                                 video
"/        'video/mpeg'                                    video
        'video/*'                                       video
"/        'application/vnd.rn-realmedia'                  video

        "/ audio formats ...

"/        'audio/x-pn-realaudio'                          audio
"/        'audio/x-mpeg'                                  audio
"/        'audio/x-mp3'                                   audio
"/        'audio/x-wav'                                   audio
"/        'audio/x-aiff'                                  audio
"/        'audio/basic'                                   audio
"/        'audio/x-shockwave-flash'                       audio
        'audio/*'                                       audio

        "/ misc stuff
        'application/winword'                           text
        'application/x-waltop-digital-notepad'          digitalNotepad

        "/ binary formats
        'application/binary'                            binaryFile
        'application/library'                           binaryFile
        'application/shared-library'                    binaryFile

        "/ progr. languages
        'application/x-smalltalk-source'                smalltalkSource
        'application/x-smalltalk-source-sif'            text
        'application/x-c-source'                        cSource
        'application/x-c-header'                        headerFile
        'application/x-cpp-source'                      cPlusPlusSource
        'application/x-javascript'                      text
        'application/x-java-source'                     javaSource

        'application/x-sh'                              text
        'application/x-csh'                             text
        'application/x-tcl'                             text
        'application/x-perl'                            text
        'application/x-make'                            text
        'application/x-batch-script'                    text
        'application/x-asn1-source'                     text

        "/ compressors / archivers
        'application/java-archive'                      javaArchive
        'application/x-tar'                             fileArchive
        'application/x-gtar'                            fileArchive
        'application/x-tar-compressed'                  compressedArchive
        'application/x-zip-compressed'                  compressedArchive
        'application/x-gzip-compressed'                 compressedArchive
        'application/x-cpio'                            fileArchive
        'application/x-shar'                            fileArchive

        'application/x-expecco-testsuite'               expeccoSuite
        'application/x-expecco-logfile'                 expeccoLogfile

        '*'                                             text
     ).

    addMapping := [:key :baseNameOrName |
        |fileName image|

        baseNameOrName notNil ifTrue:[
            baseNameOrName isSymbol ifTrue:[
                image := self perform:baseNameOrName.
            ] ifFalse:[
                image := fileNameToImageMap at:baseNameOrName ifAbsent:nil.
                image isNil ifTrue:[
                    image := Smalltalk imageFromFileNamed:baseNameOrName forClass:self.
                    image isNil ifTrue:[
                        fileName := 'bitmaps/xpmBitmaps/document_images/' , baseNameOrName.
                        image := Smalltalk imageFromFileNamed:fileName forClass:self.
                    ].
                ].
                fileNameToImageMap at:baseNameOrName put:image.
            ].
            image notNil ifTrue:[
                key includesMatchCharacters ifTrue:[
                    matchedIcons add:(key -> image).
                ] ifFalse:[    
                    icons at:key put:image.
                ].
            ].
        ]
    ].

    resources := self classResources.

    "all mappings from the resource file"
    resources keysAndValuesDo:addMapping.

    "missing mappings from above defaults"
    defaults pairWiseDo:[:key :baseName |
        (resources includesKey:key) ifFalse:[
            addMapping value:key value:baseName
        ].
    ].

    Icons := icons.
    MatchedIcons := matchedIcons.

    "
     self initializeIcons
    "
! !

!MIMETypeIconLibrary class methodsFor:'accessing'!

addOnIconsFor:aFilename to:anIcon
    "given a fileName, return an appropriate icon, especially an overlaid icon if linked or locked"

    |addOnIcon addIcns isDirectory isReadable|

    aFilename isNil ifTrue:[^ anIcon ].
    anIcon isNil ifTrue:[^ anIcon ].

    addIcns := OrderedCollection new.
    aFilename isSymbolicLink ifTrue:[
        addOnIcon := self iconForKeyMatching:#addOnLinked.
        addOnIcon notNil ifTrue:[ addIcns add:addOnIcon ].
    ].
    isDirectory := aFilename isDirectory.
    isReadable := aFilename isReadable.
    ((isReadable not and:[isDirectory not]) or:[(isDirectory) and:[(isReadable not) or:[aFilename isExecutable not]]]) ifTrue:[
        addOnIcon := self iconForKeyMatching:#addOnLocked.
        addOnIcon notNil ifTrue:[ addIcns add:addOnIcon ].
    ].
    addIcns notEmpty ifTrue:[
        addIcns addFirst:anIcon.
        ^ MultiImage images:addIcns.
    ].
    ^ anIcon
!

fileTypeIconKeyFor:aFilename
    "return an icon-key for a fileName.
     This does not look at the file's suffix or into the file's contents,
     for more detailed key i.e. it only returns keys for the common broad categories"

    |info|

    info := aFilename linkInfo.
    info isNil ifTrue:[
        ^ nil.
    ].
    info isSymbolicLink ifTrue:[
        ^ #symbolicLink.
    ].
    info isDirectory ifTrue:[
        ^ #directory.
    ].
    info isSpecialFile ifTrue:[
        ^ #specialFile.
    ].
    aFilename isExecutableProgram ifTrue:[
        ^ #executableFile
    ].
    ^ #file.

    "
     self fileTypeIconKeyFor:'/foo/bar' asFilename 
     self fileTypeIconKeyFor:'/tmp' asFilename 
     self fileTypeIconKeyFor:'/dev/null' asFilename 
     self fileTypeIconKeyFor:'Makefile' asFilename 
     self fileTypeIconKeyFor:'/usr/bin/make' asFilename 
    "
!

iconForFile:aFilename
    "given a fileName, return an appropriate icon"

    |icn|

    icn := self iconForKeyMatching:(self iconKeyForFile:aFilename).
    ^ self addOnIconsFor:aFilename to:icn.
!

iconForKey:mimeTypeOrKey
    ^ self icons at:mimeTypeOrKey ifAbsent:nil.
!

iconForKeyMatching:mimeTypeOrKey
    |icn assoc|

    icn := self iconForKey:mimeTypeOrKey.
    icn notNil ifTrue:[^icn].
    assoc := self iconForMatchKey:mimeTypeOrKey.
    assoc notNil ifTrue:[^ assoc value].
    ^ nil.
!

iconForLinkedDirectory
    "answer the icon used for linked directories"

    ^ self directoryLink.

"/    |dirIcon linkIcon|
"/
"/    dirIcon  := self iconForKeyMatching:#directory.
"/    linkIcon := self iconForKeyMatching:#addOnLinked.
"/
"/    linkIcon notNil ifTrue:[
"/        ^ MultiImage images:(Array with:dirIcon with:linkIcon).
"/    ].
"/    ^ dirIcon

    "
      self iconForLinkedDirectory
    "
!

iconForMatchKey:matchKey
    ^ self matchedIcons detect:[:assoc | assoc key match:matchKey] ifNone:nil.
!

iconKeyForFile:aFilenameArg
    "given a fileName, return an appropriate icon"

    |aFilename fileType mimeType suffix|

    aFilename := aFilenameArg.

    aFilenameArg isFilename ifTrue:[
        fileType := self fileTypeIconKeyFor:aFilename.
    ] ifFalse:[
        fileType := #file
    ].

    (fileType ~~ #directory) ifTrue:[
        suffix := aFilename suffix.
        (suffix = 'bak' or:[suffix = 'sav']) ifTrue:[
            aFilename := aFilename withoutSuffix.
        ].
        mimeType := MIMETypes mimeTypeForFilename:aFilename.
    ].

    ^ mimeType ? fileType.
!

iconKeyForRemoteDirectory:aFilenameArg
    "given a fileName, return an appropriate icon"

    ^ #directoryNetwork
!

icons
    Icons isNil ifTrue:[
        self initializeIcons
    ].
    ^ Icons
!

matchedIcons
    MatchedIcons isNil ifTrue:[
        self initializeIcons
    ].
    ^ MatchedIcons
! !

!MIMETypeIconLibrary class methodsFor:'image specs'!

addOnLinked
    <resource: #programImage>

    ^ ToolbarIconLibrary fileTypeAddOnLinked
!

addOnLocked
    <resource: #programImage>

    ^ ToolbarIconLibrary fileTypeAddOnLocked
!

applicationBinary
    <resource: #programImage>

    ^ ToolbarIconLibrary fileTypeApplicationBinaryIcon
!

applicationJavaArchive
    <resource: #programImage>

    ^ ToolbarIconLibrary fileTypeApplicationJavaArchiveIcon
!

applicationLibrary
    <resource: #programImage>

    ^ ToolbarIconLibrary fileTypeApplicationLibraryIcon
!

applicationPdf
    <resource: #programImage>

    ^ ToolbarIconLibrary fileTypeApplicationPdfIcon
!

applicationPostscript
    <resource: #programImage>

    ^ ToolbarIconLibrary fileTypeApplicationPostscriptIcon
!

applicationRtf
    <resource: #programImage>

    ^ ToolbarIconLibrary fileTypeApplicationRtfIcon
!

applicationSharedLibrary
    <resource: #programImage>

    ^ ToolbarIconLibrary fileTypeApplicationSharedLibraryIcon
!

audio
    <resource: #programImage>

    ^ ToolbarIconLibrary fileTypeAudioIcon
!

binaryFile
    <resource: #programImage>

    ^ ToolbarIconLibrary fileTypeBinaryFileIcon
!

cPlusPlusSource
    <resource: #programImage>

    ^ ToolbarIconLibrary fileTypeCPlusPlusSourceIcon
!

cSource
    <resource: #programImage>

    ^ ToolbarIconLibrary fileTypeCSourceIcon
!

compressedArchive
    <resource: #programImage>

    ^ ToolbarIconLibrary fileTypeCompressedArchiveIcon
!

deviceFile
    <resource: #programImage>

    ^ ToolbarIconLibrary fileTypeDeviceFileIcon
!

digitalNotepad
    <resource: #programImage>

    ^ ToolbarIconLibrary fileTypeDigitalNotepadIcon
!

directory
    <resource: #programImage>

    ^ ToolbarIconLibrary fileTypeDirectoryIcon
!

directoryGray
    <resource: #programImage>

    ^ ToolbarIconLibrary fileTypeDirectoryGrayIcon
!

directoryLink
    <resource: #programImage>

    ^ ToolbarIconLibrary fileTypeDirectoryLinkIcon
!

directoryLocked
    <resource: #programImage>

    ^ ToolbarIconLibrary fileTypeDirectoryLockedIcon
!

directoryNetwork
    <resource: #programImage>

    ^ ToolbarIconLibrary fileTypeDirectoryNetworkIcon
!

directoryOpen
    <resource: #programImage>

    ^ ToolbarIconLibrary fileTypeDirectoryOpenIcon
!

directoryOpenGray
    <resource: #programImage>

    ^ ToolbarIconLibrary fileTypeDirectoryOpenGrayIcon
!

executableFile
    <resource: #programImage>

    ^ ToolbarIconLibrary fileTypeExecutableFileIcon
!

expeccoLogfile
    <resource: #programImage>

    ^ ToolbarIconLibrary fileTypeExpeccoLogfileIcon
!

expeccoSuite
    <resource: #programImage>

    ^ ToolbarIconLibrary fileTypeExpeccoSuiteIcon
!

file
    <resource: #programImage>

    ^ ToolbarIconLibrary fileTypeFileIcon
!

fileArchive
    <resource: #programImage>

    ^ ToolbarIconLibrary fileTypeFileArchiveIcon
!

fileLink
    <resource: #programImage>

    ^ ToolbarIconLibrary fileTypeFileLinkIcon
!

fileLocked
    <resource: #programImage>

    ^ ToolbarIconLibrary fileTypeFileLockedIcon
!

headerFile
    <resource: #programImage>

    ^ ToolbarIconLibrary fileTypeHeaderFileIcon
!

imageFile
    <resource: #programImage>

    ^ ToolbarIconLibrary fileTypeImageFileIcon
!

javaArchive
    <resource: #programImage>

    ^ ToolbarIconLibrary fileTypeApplicationJavaArchiveIcon
!

javaSource
    <resource: #programImage>

    ^ ToolbarIconLibrary fileTypeJavaSourceIcon
!

smalltalkSource
    <resource: #programImage>

    ^ ToolbarIconLibrary fileTypeSmalltalkSourceIcon
!

specialFile
    <resource: #programImage>

    ^ ToolbarIconLibrary fileTypeSpecialFileIcon
!

text
    <resource: #programImage>

    ^ ToolbarIconLibrary fileTypeTextIcon
!

textHtml
    <resource: #programImage>

    ^ ToolbarIconLibrary fileTypeTextHtmlIcon
!

video
    <resource: #programImage>

    ^ ToolbarIconLibrary fileTypeVideoIcon
! !

!MIMETypeIconLibrary class methodsFor:'documentation'!

version
    ^ '$Header: /cvs/stx/stx/libview2/MIMETypeIconLibrary.st,v 1.24 2014-11-23 15:52:58 cg Exp $'
!

version_CVS
    ^ '$Header: /cvs/stx/stx/libview2/MIMETypeIconLibrary.st,v 1.24 2014-11-23 15:52:58 cg Exp $'
! !


MIMETypeIconLibrary initialize!