[squeak-dev] The Trunk: 45Deprecated-fbs.8.mcz

Frank Shearar frank.shearar at gmail.com
Sat Jul 13 22:40:06 UTC 2013


On 13 Jul 2013, at 14:45, Levente Uzonyi <leves at elte.hu> wrote:

> On Wed, 10 Jul 2013, commits at source.squeak.org wrote:
> 
>> Frank Shearar uploaded a new version of 45Deprecated to project The Trunk:
>> http://source.squeak.org/trunk/45Deprecated-fbs.8.mcz
>> 
>> ==================== Summary ====================
>> 
>> Name: 45Deprecated-fbs.8
>> Author: fbs
>> Time: 10 July 2013, 12:41:27.673 pm
>> UUID: 553a8cb9-0a14-494d-bfff-f46d843e380c
>> Ancestors:
>> 
>> Deprecate FileList2. It looks like cruft. It has one user vocal enough to say he used it (Stephane Rollandin), and he says it's fine to remove it.
> 
> Hm. It has 26 users in my image. And I think it's the mainly used file chooser. :)

Yeah, hence my reversion by deleting the broken commit that removed it. I still don't like it, but I'd be happy if someone respecified its UI in ToolBuilder.

frank

> Levente
> 
>> 
>> ==================== Snapshot ====================
>> 
>> SystemOrganization addCategory: #'45Deprecated'!
>> 
>> FileList subclass: #FileList2
>>    instanceVariableNames: 'showDirsInFileList currentDirectorySelected fileSelectionBlock dirSelectionBlock optionalButtonSpecs modalView directoryChangeBlock ok'
>>    classVariableNames: ''
>>    poolDictionaries: ''
>>    category: '45Deprecated'!
>> FileList2 class
>>    instanceVariableNames: 'lastSelDir'!
>> 
>> !FileList2 commentStamp: 'BJP 11/19/2003 21:13' prior: 0!
>> Some variations on FileList that
>> - use a hierarchical pane to show folder structure
>> - use different pane combinations, button layouts and prefiltering for specific uses
>> 
>> FileList2 morphicView openInWorld                "an alternative to the standard FileList"
>> FileList2 morphicViewNoFile openInWorld            "useful for selecting, but not viewing"
>> FileList2 morphicViewProjectLoader openInWorld    "useful for finding and loading projects"
>> FileList2 modalFolderSelector                        "allows the user to select a folder"
>> 
>> 
>> 
>> !
>> FileList2 class
>>    instanceVariableNames: 'lastSelDir'!
>> 
>> ----- Method: FileList2 class>>addFullPanesTo:from: (in category 'utility') -----
>> addFullPanesTo: window from: aCollection
>> 
>> 
>> 
>>    aCollection do: [ :each | | frame |
>>        frame := LayoutFrame
>>            fractions: each second
>>            offsets: each third.
>>        window addMorph: each first fullFrame: frame.
>>    ]!
>> 
>> ----- Method: FileList2 class>>blueButtonText:textColor:color:inWindow: (in category 'blue ui') -----
>> blueButtonText: aString textColor: textColor color: aColor inWindow: window
>>    | result |
>>    result := window
>>                fancyText: aString translated
>>                font: Preferences standardEToysFont
>>                color: textColor.
>>    result setProperty: #buttonText toValue: aString;
>>         hResizing: #rigid;
>>         extent: 100 @ 20;
>>         layoutInset: 4;
>>         borderWidth: ColorTheme current dialogButtonBorderWidth;
>>         useRoundedCorners.
>>    aColor isNil
>>        ifFalse: [""result color: aColor. result borderColor: aColor muchDarker].
>>    ^ result!
>> 
>> ----- Method: FileList2 class>>blueButtonText:textColor:color:inWindow:balloonText:selector:recipient: (in category 'blue ui') -----
>> blueButtonText: aString textColor: textColor color: aColor inWindow: window balloonText: balloonText selector: sel recipient: recip
>>    | result |
>>    result := window
>>                fancyText: aString translated
>> font: Preferences standardEToysFont
>>                color: textColor.
>>    result setProperty: #buttonText toValue: aString;
>>         hResizing: #rigid;
>>         extent: 100 @ 20;
>>         layoutInset: 4;
>>         borderWidth: ColorTheme current dialogButtonBorderWidth;
>>         useRoundedCorners;
>>         setBalloonText: balloonText.
>>    result
>>        on: #mouseUp
>>        send: sel
>>        to: recip.
>>    aColor isNil
>>        ifFalse: [""
>>            result color: aColor.
>>            result borderColor: aColor muchDarker].
>>    ^ result!
>> 
>> ----- Method: FileList2 class>>blueButtonText:textColor:inWindow: (in category 'blue ui') -----
>> blueButtonText: aString textColor: textColor inWindow: window
>>    ^ self
>>        blueButtonText: aString
>>        textColor: textColor
>>        color: nil
>>        inWindow: window!
>> 
>> ----- Method: FileList2 class>>blueButtonText:textColor:inWindow:balloonText:selector:recipient: (in category 'blue ui') -----
>> blueButtonText: aString textColor: textColor inWindow: window balloonText: balloonText selector: sel recipient: recip
>>    ^ self
>>        blueButtonText: aString
>>        textColor: textColor
>>        color: nil
>>        inWindow: window
>>        balloonText: balloonText
>>        selector: sel
>>        recipient: recip !
>> 
>> ----- Method: FileList2 class>>enableTypeButtons:info:forDir: (in category 'blue ui') -----
>> enableTypeButtons: typeButtons info: fileTypeInfo forDir: aDirectory
>> 
>>    | foundSuffixes firstEnabled |
>> 
>>    firstEnabled := nil.
>>    foundSuffixes := (aDirectory ifNil: [ #()] ifNotNil: [ aDirectory fileNames]) collect: [ :each | (each findTokens: '.') last asLowercase].
>>    foundSuffixes := foundSuffixes asSet.
>>    fileTypeInfo with: typeButtons do: [ :info :button | | enableIt fileSuffixes |
>>        fileSuffixes := info second.
>>        enableIt := fileSuffixes anySatisfy: [ :patt | foundSuffixes includes: patt].
>>        button
>>            setProperty: #enabled
>>            toValue: enableIt.
>>        enableIt ifTrue: [firstEnabled ifNil: [firstEnabled := button]].
>>    ].
>>    firstEnabled ifNotNil: [^firstEnabled mouseUp: nil].
>>    typeButtons do: [ :each | each color: Color gray].
>> 
>> !
>> 
>> ----- Method: FileList2 class>>endingSpecs (in category 'blue ui') -----
>> endingSpecs
>>    "Answer a collection of specs to build the selective 'find anything' tool called by the Navigator. This version uses the services registry to do so."
>>    "FileList2 morphicViewGeneralLoaderInWorld: World"
>>    | categories specs rejects |
>>    rejects := #(addFileToNewZip: compressFile: openInZipViewer: extractAllFrom: openOn:).
>>    categories := #(
>>        ('Art' ('bmp' 'gif' 'jpg' 'jpeg' 'form' 'png' 'pcx' 'xbm' 'xpm' 'ppm' 'pbm'))
>>        ('Morphs' ('morph' 'morphs' 'sp'))
>>        ('Projects' ('extseg' 'project' 'pr'))
>>        ('MIDI' ('mid' 'midi'))
>>        ('Music' ('mp3'))
>>        ('Movies' ('movie' 'mpg' 'mpeg' 'qt' 'mov'))
>>        ('Flash' ('swf'))
>>    ).
>> 
>>        "('Books' ('bo'))"
>>        "('Code' ('st' 'cs'))"
>>        "('TrueType' ('ttf'))"
>>        "('3ds' ('3ds'))"
>>        "('Tape' ('tape'))"
>>        "('Wonderland' ('wrl'))"
>>        "('HTML' ('htm' 'html'))"
>> 
>>    categories first at: 2 put: ImageReadWriter allTypicalFileExtensions.
>>    specs := OrderedCollection new.
>>    categories do: [ :cat | | catSpecs catServices okExtensions services |
>>        services := Dictionary new.
>>        catSpecs := Array new: 3.
>>        catServices := OrderedCollection new.
>>        okExtensions := Set new.
>> 
>>        cat second do: [ :ext | (FileList itemsForFile: 'fred.',ext) do: [ :i |
>>            (rejects includes: i selector) ifFalse: [
>>                okExtensions add: ext.
>>                services at: i label put: i ]]].
>>        services do: [ :svc | catServices add: svc ].
>>        services isEmpty ifFalse: [
>>            catSpecs at: 1 put: cat first;
>>                at: 2 put: okExtensions;
>>                at: 3 put: catServices.
>>            specs add: catSpecs ]
>>    ].
>>    ^specs
>> !
>> 
>> ----- Method: FileList2 class>>hideSqueakletDirectoryBlock (in category 'as yet unclassified') -----
>> hideSqueakletDirectoryBlock
>>    ^[:dirName| (dirName sameAs: 'Squeaklets') not]!
>> 
>> ----- Method: FileList2 class>>lastSelDir (in category 'accessing') -----
>> lastSelDir
>>    "Return the last selected directory or the default directory if no directory was selected so far."
>> 
>>    ^lastSelDir ifNil: [ lastSelDir := FileDirectory default ]!
>> 
>> ----- Method: FileList2 class>>lastSelDir: (in category 'accessing') -----
>> lastSelDir: aFileDirectory
>>    "Store the last selected directory. This will be selected as default in newly opened file or folder selectors"
>> 
>>    ^lastSelDir := aFileDirectory!
>> 
>> ----- Method: FileList2 class>>modalFileSelector (in category 'modal dialogs') -----
>> modalFileSelector
>> 
>>    | window |
>> 
>>    window := self morphicViewFileSelector.
>>    window openCenteredInWorld.
>>    self modalLoopOn: window.
>>    ^(window valueOfProperty: #fileListModel) getSelectedFile!
>> 
>> ----- Method: FileList2 class>>modalFileSelectorForSuffixes: (in category 'modal dialogs') -----
>> modalFileSelectorForSuffixes: aList
>> 
>>    | window aFileList |
>> 
>>    window := self morphicViewFileSelectorForSuffixes: aList.
>>    aFileList := window valueOfProperty: #fileListModel.
>>    window openCenteredInWorld.
>>    self modalLoopOn: window.
>>    ^aFileList getSelectedFile!
>> 
>> ----- Method: FileList2 class>>modalFileSelectorForSuffixes:directory: (in category 'modal dialogs') -----
>> modalFileSelectorForSuffixes: aList directory: aDirectory
>> 
>>    | window aFileList |
>> 
>>    window := self morphicViewFileSelectorForSuffixes: aList directory: aDirectory.
>>    aFileList := window valueOfProperty: #fileListModel.
>>    window openCenteredInWorld.
>>    self modalLoopOn: window.
>>    ^aFileList getSelectedFile!
>> 
>> ----- Method: FileList2 class>>modalFolderSelector (in category 'modal dialogs') -----
>> modalFolderSelector
>> 
>>    ^self modalFolderSelector: self lastSelDir
>>    !
>> 
>> ----- Method: FileList2 class>>modalFolderSelector: (in category 'modal dialogs') -----
>> modalFolderSelector: aDir
>> 
>>    | window fileModel |
>>    window := self morphicViewFolderSelector: aDir.
>>    fileModel := window model.
>>    window openInWorld: self currentWorld extent: 300 at 400.
>>    self modalLoopOn: window.
>>    ^fileModel getSelectedDirectory withoutListWrapper!
>> 
>> ----- Method: FileList2 class>>modalFolderSelectorForProject: (in category 'modal dialogs') -----
>> modalFolderSelectorForProject: aProject
>> "
>> FileList2 modalFolderSelectorForProject: Project current
>> "
>>    | window fileModel w |
>> 
>>    window := FileList2 morphicViewProjectSaverFor: aProject.
>>    fileModel := window valueOfProperty: #FileList.
>>    w := self currentWorld.
>>    window position: w topLeft + (w extent - window extent // 2).
>>    w addMorphInLayer: window.
>>    w startSteppingSubmorphsOf: window.
>>    self modalLoopOn: window.
>>    ^fileModel getSelectedDirectory withoutListWrapper!
>> 
>> ----- Method: FileList2 class>>modalFolderSelectorForProjectLoad (in category 'modal dialogs') -----
>> modalFolderSelectorForProjectLoad
>> 
>>    | window fileModel w |
>> 
>>    window := self morphicViewProjectLoader2InWorld: self currentWorld reallyLoad: false.
>>    fileModel := window valueOfProperty: #FileList.
>>    w := self currentWorld.
>>    window position: w topLeft + (w extent - window extent // 2).
>>    window openInWorld: w.
>>    self modalLoopOn: window.
>>    ^fileModel getSelectedDirectory withoutListWrapper!
>> 
>> ----- Method: FileList2 class>>modalLoopOn: (in category 'utility') -----
>> modalLoopOn: aMorph
>>    [aMorph world notNil] whileTrue: [
>>        aMorph outermostWorldMorph doOneCycle.
>>    ].!
>> 
>> ----- Method: FileList2 class>>morphicViewFileSelector (in category 'morphic ui') -----
>> morphicViewFileSelector
>> 
>>    ^self morphicViewFileSelectorForSuffixes: nil
>> !
>> 
>> ----- Method: FileList2 class>>morphicViewFileSelectorForSuffixes: (in category 'morphic ui') -----
>> morphicViewFileSelectorForSuffixes: aList
>>    "Answer a morphic file-selector tool for the given suffix list."
>> 
>>    ^self morphicViewFileSelectorForSuffixes: aList directory: self lastSelDir!
>> 
>> ----- Method: FileList2 class>>morphicViewFileSelectorForSuffixes:directory: (in category 'morphic ui') -----
>> morphicViewFileSelectorForSuffixes: aList directory: dir
>>    "Answer a morphic file-selector tool for the given suffix list and the given directory."
>> 
>>    | aFileList window fixedSize midLine gap |
>>    aFileList := self new directory: dir.
>>    aFileList optionalButtonSpecs: aFileList okayAndCancelServices.
>>    aList ifNotNil:
>>        [aFileList fileSelectionBlock: [:entry :myPattern |
>>            entry isDirectory
>>                ifTrue:
>>                    [false]
>>                ifFalse:
>>                    [aList includes: (FileDirectory extensionFor: entry name asLowercase)]]].
>>    window := BorderedMorph new
>>        layoutPolicy: ProportionalLayout new;
>>        color: Color lightBlue;
>>        borderColor: Color blue;
>>        borderWidth: 4;
>>        layoutInset: 4;
>>        extent: 600 at 400;
>>        useRoundedCorners.
>>    window setProperty: #fileListModel toValue: aFileList.
>>    aFileList modalView: window.
>>    midLine := 0.4.
>>    fixedSize := 25.
>>    gap := 5.
>>    self addFullPanesTo: window from: {
>>        {self textRow: 'Please select a file'. 0 @ 0 corner: 1 @ 0. 0 at 0 corner: 0 at fixedSize}.
>>        {aFileList optionalButtonRow. 0 @ 0 corner: 1 @ 0. 0 at fixedSize corner: 0@(fixedSize * 2)}.
>>        {aFileList morphicDirectoryTreePane. 0 at 0 corner: midLine at 1.
>>                    gap @(fixedSize * 2) corner: gap negated at 0}.
>>        {aFileList morphicFileListPane. midLine @ 0 corner: 1 at 1.
>>                    gap@(fixedSize * 2) corner: gap negated at 0}.
>>    }.
>> 
>>    aFileList postOpen.
>> 
>>    ^ window !
>> 
>> ----- Method: FileList2 class>>morphicViewFolderSelector (in category 'morphic ui') -----
>> morphicViewFolderSelector
>> 
>>    ^self morphicViewFolderSelector: FileDirectory default!
>> 
>> ----- Method: FileList2 class>>morphicViewFolderSelector: (in category 'morphic ui') -----
>> morphicViewFolderSelector: aDir
>>    "Answer a tool that allows the user to select a folder"
>> 
>>    | aFileList window fixedSize |
>>    aFileList := self new directory: aDir.
>>    aFileList optionalButtonSpecs: aFileList servicesForFolderSelector.
>>    window := (SystemWindow labelled: aDir pathName) model: aFileList.
>>    aFileList modalView: window.
>> 
>>    fixedSize := 25.
>>    self addFullPanesTo: window from: {
>>        {self textRow: 'Please select a folder'. 0 @ 0 corner: 1 @ 0.
>>                0 at 0 corner: 0 at fixedSize}.
>>        {aFileList optionalButtonRow. 0 @ 0 corner: 1 @ 0.
>>                0 at fixedSize corner: 0@(fixedSize * 2)}.
>>        {aFileList morphicDirectoryTreePane. 0 at 0 corner: 1 at 1.
>>                0@(fixedSize * 2) corner: 0 at 0}.
>>    }.
>>    aFileList postOpen.
>>    ^ window !
>> 
>> ----- Method: FileList2 class>>morphicViewGeneralLoaderInWorld: (in category 'blue ui') -----
>> morphicViewGeneralLoaderInWorld: aWorld
>> "
>> FileList2 morphicViewGeneralLoaderInWorld: self currentWorld
>> "
>>    | window aFileList buttons treePane textColor1 fileListPane pane2a pane2b fileTypeInfo fileTypeButtons fileTypeRow actionRow |
>> 
>>    fileTypeInfo := self endingSpecs.
>>    window := AlignmentMorphBob1 newColumn.
>>    window hResizing: #shrinkWrap; vResizing: #shrinkWrap.
>>    textColor1 := Color r: 0.742 g: 0.839 b: 1.0.
>>    aFileList := self new directory: FileDirectory default.
>>    aFileList
>>        fileSelectionBlock: self projectOnlySelectionBlock;
>>        modalView: window.
>>    window
>>        setProperty: #FileList toValue: aFileList;
>>        wrapCentering: #center; cellPositioning: #topCenter;
>>        borderWidth: ColorTheme current dialogBorderWidth;
>>        borderColor: ColorTheme current dialogBorderColor;
>>        useRoundedCorners.
>> 
>>    fileTypeButtons := fileTypeInfo collect: [ :each |
>>        (self blueButtonText: each first textColor: Color gray inWindow: window)
>>            setProperty: #enabled toValue: true;
>>            hResizing: #shrinkWrap;
>>            useSquareCorners
>>    ].
>>    buttons := {{'OK'. ColorTheme current okColor}. {'Cancel'. ColorTheme current cancelColor}} collect: [ :each |
>>        self blueButtonText: each first textColor: textColor1 color: each second inWindow: window
>>    ].
>> 
>>    treePane := aFileList morphicDirectoryTreePane
>>        extent: 250 at 300;
>>        retractable: false;
>>        borderWidth: 0.
>>    fileListPane := aFileList morphicFileListPane
>>        extent: 350 at 300;
>>        retractable: false;
>>        borderWidth: 0.
>>    window addARow: {window fancyText: 'Find...' translated font: Preferences standardEToysTitleFont color: textColor1}.
>>    fileTypeRow := window addARowCentered: fileTypeButtons cellInset: 2.
>>    actionRow := window addARowCentered: {
>>        buttons first.
>>        (Morph new extent: 30 at 5) color: Color transparent.
>>        buttons second
>>    } cellInset: 2.
>>    window
>>        addARow: {
>>                (window inAColumn: {(pane2a := window inARow: {window inAColumn: {treePane}})
>>                    useRoundedCorners;
>>                    layoutInset: 0;
>>                    borderWidth: ColorTheme current dialogPaneBorderWidth;
>>                    borderColor: ColorTheme current dialogPaneBorderColor
>>                }) layoutInset: 10.
>>                (window inAColumn: {(pane2b := window inARow: {window inAColumn: {fileListPane}})
>>                    useRoundedCorners;
>>                    layoutInset: 0;
>>                    borderWidth: ColorTheme current dialogPaneBorderWidth;
>>                    borderColor: ColorTheme current dialogPaneBorderColor
>>                }) layoutInset: 10.
>>        }.
>>    window fullBounds.
>>    window fillWithRamp: ColorTheme current dialogRampOrColor oriented: 0.65.
>>    pane2a fillWithRamp: ColorTheme current dialogPaneRampOrColor oriented: (0.7 @ 0.35).
>>    pane2b fillWithRamp: ColorTheme current dialogPaneRampOrColor oriented: (0.7 @ 0.35).
>> "
>>    buttons do: [ :each |
>>        each fillWithRamp: ColorTheme current dialogButtonsRampOrColor oriented: (0.75 @ 0).
>>    ].
>> "
>>    fileTypeButtons do: [ :each |
>>        each
>>            on: #mouseUp
>>            send: #value:value:
>>            to: [ :evt :morph |
>>                self update: actionRow in: window fileTypeRow: fileTypeRow morphUp: morph.
>>            ]
>>    ].
>>    buttons first on: #mouseUp send: #okHit to: aFileList.
>>    buttons second on: #mouseUp send: #cancelHit to: aFileList.
>>    aFileList postOpen.
>>    window position: aWorld topLeft + (aWorld extent - window extent // 2).
>>    aFileList directoryChangeBlock: [ :newDir |
>>        self update: actionRow in: window fileTypeRow: fileTypeRow morphUp: nil.
>>        self enableTypeButtons: fileTypeButtons info: fileTypeInfo forDir: newDir.
>>    ].
>>    aFileList directory: aFileList directory.
>>    window adoptPaneColor: (Color r: 0.548 g: 0.677 b: 1.0).
>>    window becomeModal.
>>    ^ window openInWorld: aWorld.!
>> 
>> ----- Method: FileList2 class>>morphicViewImageViewer (in category 'morphic ui') -----
>> morphicViewImageViewer
>> 
>>    | dir aFileList window midLine fixedSize |
>> 
>>    dir := FileDirectory default.
>>    aFileList := self new directory: dir.
>>    aFileList optionalButtonSpecs: aFileList specsForImageViewer.
>>    aFileList fileSelectionBlock: [ :entry :myPattern |
>>        entry isDirectory ifTrue: [
>>            false
>>        ] ifFalse: [
>>            #('bmp' 'gif' 'jpg' 'form' 'png') includes:
>>                     (FileDirectory extensionFor: entry name asLowercase)
>>        ]
>>    ].
>>    window := (SystemWindow labelled: dir pathName) model: aFileList.
>> 
>>    fixedSize := 25.
>>    midLine := 0.4.
>>    self addFullPanesTo: window from: {
>>        {aFileList optionalButtonRow. 0 @ 0 corner: 1 @ 0.
>>                0 at 0 corner: 0 at fixedSize}.
>>        {aFileList morphicDirectoryTreePane. 0 at 0 corner: midLine at 1.
>>                0 at fixedSize corner: 0 at 0}.
>>        {aFileList morphicFileListPane. midLine @ 0 corner: 1 at 1.
>>                0 at fixedSize corner: 0 at 0}.
>>    }.
>>    aFileList postOpen.
>>    ^ window !
>> 
>> ----- Method: FileList2 class>>morphicViewNoFile (in category 'morphic ui') -----
>> morphicViewNoFile
>> 
>>    | dir aFileList window midLine fixedSize |
>> 
>>    dir := FileDirectory default.
>>    aFileList := self new directory: dir.
>>    window := (SystemWindow labelled: dir pathName) model: aFileList.
>> 
>>    fixedSize := 25.
>>    midLine := 0.4.
>>    self addFullPanesTo: window from: {
>>        {aFileList morphicPatternPane. 0 at 0 corner: 0.3 at 0. 0 at 0 corner: 0 at fixedSize}.
>>        {aFileList optionalButtonRow. 0.3 @ 0 corner: 1 at 0. 0 at 0 corner: 0 at fixedSize}.
>>        {aFileList morphicDirectoryTreePane. 0 at 0 corner: midLine at 1. 0 at fixedSize corner: 0 at 0}.
>>        {aFileList morphicFileListPane. midLine @ 0 corner: 1 at 1. 0 at fixedSize corner: 0 at 0}.
>>    }.
>>    aFileList postOpen.
>>    ^ window !
>> 
>> ----- Method: FileList2 class>>morphicViewProjectLoader (in category 'morphic ui') -----
>> morphicViewProjectLoader
>> 
>>    | dir aFileList window midLine fixedSize |
>> 
>>    dir := FileDirectory default.
>>    aFileList := self new directory: dir.
>>    aFileList optionalButtonSpecs: aFileList servicesForProjectLoader.
>>    aFileList fileSelectionBlock: self projectOnlySelectionBlock.
>>    window := (SystemWindow labelled: dir pathName) model: aFileList.
>> 
>>    fixedSize := 25.
>>    midLine := 0.4.
>>    self addFullPanesTo: window from: {
>>        {aFileList optionalButtonRow. 0 @ 0 corner: 1 @ 0. 0 at 0 corner: 0 at fixedSize}.
>>        {aFileList morphicDirectoryTreePane. 0 at 0 corner: midLine at 1. 0 at fixedSize corner: 0 at 0}.
>>        {aFileList morphicFileListPane. midLine @ 0 corner: 1 at 1. 0 at fixedSize corner: 0 at 0}.
>>    }.
>>    aFileList postOpen.
>>    ^ window !
>> 
>> ----- Method: FileList2 class>>morphicViewProjectLoader2InWorld: (in category 'blue ui') -----
>> morphicViewProjectLoader2InWorld: aWorld
>> 
>>    ^self morphicViewProjectLoader2InWorld: aWorld reallyLoad: true!
>> 
>> ----- Method: FileList2 class>>morphicViewProjectLoader2InWorld:reallyLoad: (in category 'blue ui') -----
>> morphicViewProjectLoader2InWorld: aWorld reallyLoad: aBoolean
>> 
>>    ^self
>>        morphicViewProjectLoader2InWorld: aWorld
>>        reallyLoad: aBoolean
>>        dirFilterType: #initialDirectoryList
>> !
>> 
>> ----- Method: FileList2 class>>morphicViewProjectLoader2InWorld:reallyLoad:dirFilterType: (in category 'blue ui') -----
>> morphicViewProjectLoader2InWorld: aWorld reallyLoad: aBoolean dirFilterType: aSymbol
>> 
>>    | window aFileList buttons treePane textColor1 fileListPane pane2a pane2b treeExtent filesExtent |
>> 
>>    window := AlignmentMorphBob1 newColumn.
>>    window hResizing: #shrinkWrap; vResizing: #shrinkWrap.
>>    textColor1 := Color r: 0.742 g: 0.839 b: 1.0.
>>    aFileList := self new directory: FileDirectory default.
>>    aFileList
>>        optionalButtonSpecs: aFileList servicesForProjectLoader;
>>        fileSelectionBlock: (
>>            aSymbol == #limitedSuperSwikiDirectoryList ifTrue: [
>>                MessageSend receiver: self selector: #projectOnlySelectionMethod:
>>            ] ifFalse: [
>>                self projectOnlySelectionBlock
>>            ]
>>        );
>>        "dirSelectionBlock: self hideSqueakletDirectoryBlock;"
>>        modalView: window.
>>    window
>>        setProperty: #FileList toValue: aFileList;
>>        wrapCentering: #center; cellPositioning: #topCenter;
>>        borderWidth: ColorTheme current dialogBorderWidth;
>>        borderColor: ColorTheme current dialogBorderColor;
>>        useRoundedCorners.
>>    buttons := {{'OK'. ColorTheme current okColor}. {'Cancel'. ColorTheme current cancelColor}} collect: [ :each |
>>        self blueButtonText: each first textColor: textColor1 color: each second inWindow: window
>>    ].
>> 
>>    aWorld width < 800 ifTrue: [
>>        treeExtent := 150 at 300.
>>        filesExtent := 350 at 300.
>>    ] ifFalse: [
>>        treeExtent := 250 at 300.
>>        filesExtent := 350 at 300.
>>    ].
>>    (treePane := aFileList morphicDirectoryTreePaneFiltered: aSymbol)
>>        extent: treeExtent;
>>        retractable: false;
>>        borderWidth: 0.
>>    fileListPane := aFileList morphicFileListPane
>>        extent: filesExtent;
>>        retractable: false;
>>        borderWidth: 0.
>>    window
>>        addARow: {
>>            window fancyText: 'Load A Project' translated font: Preferences standardEToysTitleFont color: textColor1
>>        };
>>        addARowCentered: {
>>            buttons first.
>>            (Morph new extent: 30 at 5) color: Color transparent.
>>            buttons second
>>        };
>>        addARow: {
>>            window fancyText: 'Please select a project' translated  font: Preferences standardEToysFont color: textColor1
>>        };
>>        addARow: {
>>                (window inAColumn: {(pane2a := window inARow: {window inAColumn: {treePane}})
>>                    useRoundedCorners;
>>                    layoutInset: 0;
>>                    borderWidth: ColorTheme current dialogPaneBorderWidth;
>>                    borderColor: ColorTheme current dialogPaneBorderColor
>>                }) layoutInset: 10.
>>                (window inAColumn: {(pane2b := window inARow: {window inAColumn: {fileListPane}})
>>                    useRoundedCorners;
>>                    layoutInset: 0;
>>                    borderWidth: ColorTheme current dialogPaneBorderWidth;
>>                    borderColor: ColorTheme current dialogPaneBorderColor
>>                }) layoutInset: 10.
>>        }.
>>    window fullBounds.
>>    window fillWithRamp: ColorTheme current dialogRampOrColor oriented: 0.65.
>>    pane2a fillWithRamp: ColorTheme current dialogPaneRampOrColor oriented: (0.7 @ 0.35).
>>    pane2b fillWithRamp: ColorTheme current dialogPaneRampOrColor oriented: (0.7 @ 0.35).
>> "
>>    buttons do: [ :each |
>>        each fillWithRamp: ColorTheme current dialogButtonsRampOrColor oriented: (0.75 @ 0).
>>    ].
>> "
>>    buttons first
>>        on: #mouseUp
>>        send: (aBoolean ifTrue: [#okHitForProjectLoader] ifFalse: [#okHit])
>>        to: aFileList.
>>    buttons second on: #mouseUp send: #cancelHit to: aFileList.
>>    aFileList postOpen.
>>    window position: aWorld topLeft + (aWorld extent - window extent // 2).
>>    window adoptPaneColor: (Color r: 0.548 g: 0.677 b: 1.0).
>>    window becomeModal.
>>    ^ window openInWorld: aWorld.!
>> 
>> ----- Method: FileList2 class>>morphicViewProjectSaverFor: (in category 'blue ui') -----
>> morphicViewProjectSaverFor: aProject
>> "
>> (FileList2 morphicViewProjectSaverFor: Project current) openInWorld
>> "
>>    | window aFileList buttons treePane pane2 textColor1 option treeExtent buttonData buttonRow |
>> 
>>    textColor1 := Color r: 0.742 g: 0.839 b: 1.0.
>>    aFileList := self new directory: ServerDirectory projectDefaultDirectory.
>>    aFileList dirSelectionBlock: self hideSqueakletDirectoryBlock.
>>    window := AlignmentMorphBob1 newColumn.
>>    window hResizing: #shrinkWrap; vResizing: #shrinkWrap.
>>    aFileList modalView: window.
>>    window
>>        setProperty: #FileList toValue: aFileList;
>>        wrapCentering: #center; cellPositioning: #topCenter;
>>        borderWidth: ColorTheme current dialogBorderWidth;
>>        borderColor: ColorTheme current dialogBorderColor;
>>        useRoundedCorners.
>> 
>>    buttonData := Preferences enableLocalSave
>>                ifTrue: [{
>>                            {'Save'. #okHit. 'Save in the place specified below, and in the Squeaklets folder on your local disk'. ColorTheme current okColor}.
>>                            {'Save on local disk only'. #saveLocalOnlyHit. 'saves in the Squeaklets folder'. ColorTheme current okColor}.
>>                            {'Cancel'. #cancelHit. 'return without saving'. ColorTheme current cancelColor}
>>                        }]
>>                ifFalse: [{
>>                            {'Save'. #okHit. 'Save in the place specified below, and in the Squeaklets folder on your local disk'. ColorTheme current okColor}.
>>                            {'Cancel'. #cancelHit. 'return without saving'. ColorTheme current cancelColor}
>>                        }].
>>    buttons := buttonData collect: [ :each |
>>        (self blueButtonText: each first textColor: textColor1 color: each fourth inWindow: window)
>>            setBalloonText: each third translated;
>>            hResizing: #shrinkWrap;
>>            on: #mouseUp send: each second to: aFileList
>>    ].
>> 
>>    option := aProject world
>>        valueOfProperty: #SuperSwikiPublishOptions
>>        ifAbsent: [#initialDirectoryList].
>>    aProject world removeProperty: #SuperSwikiPublishOptions.
>> 
>>    treeExtent := World height < 500
>>                        ifTrue: [ 350 at 150 ]
>>                        ifFalse: [ 350 at 300 ].
>> 
>>    (treePane := aFileList morphicDirectoryTreePaneFiltered: option)
>>        extent: treeExtent;
>>        retractable: false;
>>        borderWidth: 0.
>>    window
>>        addARowCentered: {
>>            window fancyText: 'Publish This Project' translated font: Preferences standardEToysTitleFont color: textColor1
>>        }.
>>    buttonRow := OrderedCollection new.
>>    buttons do: [:button | buttonRow add: button] separatedBy: [buttonRow add: ((Morph new extent: 30 at 5) color: Color transparent)].
>> 
>> "    addARowCentered: {
>>            buttons first.
>>            (Morph new extent: 30 at 5) color: Color transparent.
>>            buttons second.
>>            (Morph new extent: 30 at 5) color: Color transparent.
>>            buttons third
>>        };"
>>    window
>>        addARowCentered: buttonRow;
>>        addARowCentered: { (window inAColumn: {(ProjectViewMorph on: aProject) lock}) layoutInset: 4};
>>        addARowCentered: {
>>            window fancyText: 'Please select a folder' translated font: Preferences standardEToysFont color: textColor1
>>        };
>>        addARow: {
>>            (
>>                window inAColumn: {
>>                    (pane2 := window inARow: {window inAColumn: {treePane}})
>>                        useRoundedCorners;
>>                        layoutInset: 0;
>>                        borderWidth: ColorTheme current dialogPaneBorderWidth;
>>                        borderColor: ColorTheme current dialogPaneBorderColor
>>                }
>>            ) layoutInset: 10
>>        }.
>>    window fullBounds.
>>    window fillWithRamp: ColorTheme current dialogRampOrColor oriented: 0.65.
>>    pane2 fillWithRamp: ColorTheme current dialogPaneRampOrColor oriented: (0.7 @ 0.35).
>> "
>>    buttons do: [ :each |
>>        each fillWithRamp: ColorTheme current dialogButtonsRampOrColor oriented: (0.75 @ 0).
>>    ].
>> "
>>    window setProperty: #morphicLayerNumber toValue: 11.
>>    aFileList postOpen.
>>    window adoptPaneColor: (Color r: 0.548 g: 0.677 b: 1.0).
>>    ^ window !
>> 
>> ----- Method: FileList2 class>>openMorphicViewInWorld (in category 'instance creation') -----
>> openMorphicViewInWorld
>>    "FileList2 openMorphicViewInWorld"
>>    ^self morphicView openInWorld!
>> 
>> ----- Method: FileList2 class>>projectOnlySelectionBlock (in category 'as yet unclassified') -----
>> projectOnlySelectionBlock
>> 
>>    ^[ :entry :myPattern |
>>        entry isDirectory ifTrue: [
>>            false
>>        ] ifFalse: [
>>            #('*.pr' '*.pr.gz' '*.project') anySatisfy: [ :each | each match: entry name]
>>        ]
>>    ]!
>> 
>> ----- Method: FileList2 class>>projectOnlySelectionMethod: (in category 'as yet unclassified') -----
>> projectOnlySelectionMethod: incomingEntries
>> 
>>    | versionsAccepted |
>> 
>>    "this shows only the latest version of each project"
>>    versionsAccepted := Dictionary new.
>>    incomingEntries do: [ :entry | | basicInfoTuple basicVersion basicName |
>>        entry isDirectory ifFalse: [
>>            (#('*.pr' '*.pr.gz' '*.project') anySatisfy: [ :each | each match: entry name]) ifTrue: [
>>                basicInfoTuple := Project parseProjectFileName: entry name.
>>                basicName := basicInfoTuple first.
>>                basicVersion := basicInfoTuple second.
>>                ((versionsAccepted includesKey: basicName) and:
>>                        [(versionsAccepted at: basicName) first > basicVersion]) ifFalse: [
>>                    versionsAccepted at: basicName put: {basicVersion. entry}
>>                ].
>>            ]
>>        ]
>>    ].
>>    ^versionsAccepted asArray collect: [ :each | each second]!
>> 
>> ----- Method: FileList2 class>>prototypicalToolWindow (in category 'instance creation') -----
>> prototypicalToolWindow
>>    "Answer an example of myself seen in a tool window, for the benefit of parts-launching tools"
>> 
>>    ^ self morphicView applyModelExtent!
>> 
>> ----- Method: FileList2 class>>selectionBlockForSuffixes: (in category 'as yet unclassified') -----
>> selectionBlockForSuffixes: anArray
>> 
>>    ^[ :entry :myPattern |
>>        entry isDirectory ifTrue: [
>>            false
>>        ] ifFalse: [
>>            anArray anySatisfy: [ :each | each match: entry name]
>>        ]
>>    ]!
>> 
>> ----- Method: FileList2 class>>textRow: (in category 'utility') -----
>> textRow: aString
>> 
>>    ^AlignmentMorph newRow
>>        wrapCentering: #center; cellPositioning: #leftCenter;
>>        color: Color transparent;
>>        layoutInset: 0;
>>        addMorph: (
>>            AlignmentMorph newColumn
>>            wrapCentering: #center; cellPositioning: #topCenter;
>>            color: Color transparent;
>>            vResizing: #shrinkWrap;
>>            layoutInset: 0;
>>            addMorph: (
>>                AlignmentMorph newRow
>>                wrapCentering: #center; cellPositioning: #leftCenter;
>>                color: Color transparent;
>>                hResizing: #shrinkWrap;
>>                vResizing: #shrinkWrap;
>>                layoutInset: 0;
>>                addMorph: ((StringMorph contents: aString) color: Color blue; lock)
>>            )
>>        )!
>> 
>> ----- Method: FileList2 class>>update:in:fileTypeRow:morphUp: (in category 'morphic ui') -----
>> update: actionRow in: window fileTypeRow: fileTypeRow morphUp: morph
>> 
>>    | fileTypeInfo info2 buttons textColor1 fileSuffixes fileActions aFileList fileTypeString |
>> 
>>    (morph notNil and:[(morph valueOfProperty: #enabled) not]) ifTrue: [^self].
>>    fileTypeRow submorphsDo: [ :sub |
>>        sub color: (
>>            sub == morph
>>                ifTrue: [Color white]
>>                ifFalse: [(sub valueOfProperty: #enabled)
>>                            ifTrue: [Color transparent] ifFalse: [Color gray]]
>>        ).
>>    ].
>>    fileTypeString := morph isNil ifTrue:['xxxx'] ifFalse:[morph valueOfProperty: #buttonText].
>> 
>>    aFileList := window valueOfProperty: #FileList.
>>    textColor1 := Color r: 0.742 g: 0.839 b: 1.0.
>>    actionRow removeAllMorphs.
>>    fileTypeInfo := self endingSpecs.
>>    info2 := fileTypeInfo detect: [ :each | each first = fileTypeString] ifNone: [ nil ].
>>    info2 isNil
>>        ifTrue:[
>>            buttons := OrderedCollection new
>>        ]
>>        ifFalse:[
>>            fileSuffixes := info2 second.
>>            fileActions := info2 third.
>>            buttons := fileActions collect: [ :each | aFileList blueButtonForService: each textColor: textColor1 inWindow: window ].
>>            buttons do: [ :each |
>>                each fillWithRamp: ColorTheme current okColor oriented: (0.75 @ 0).
>>            ].
>>        ].
>>    buttons addLast: (self
>>                                blueButtonText: 'Cancel'
>>                                textColor: textColor1
>>                                color: ColorTheme current cancelColor
>>                                inWindow: window
>>                                balloonText: 'Cancel this search' selector: #cancelHit recipient: aFileList).
>>    buttons do: [ :each | actionRow addMorphBack: each].
>>    window fullBounds.
>>    fileSuffixes isNil ifFalse:[
>>        aFileList fileSelectionBlock: (
>>            self selectionBlockForSuffixes: (fileSuffixes collect: [ :each | '*.',each])
>>        ).
>>    ].
>>    aFileList updateFileList.!
>> 
>> ----- Method: FileList2>>addNewDirectory (in category 'own services') -----
>> addNewDirectory
>>    super addNewDirectory.
>>    self updateDirectory.!
>> 
>> ----- Method: FileList2>>blueButtonForService:textColor:inWindow: (in category 'user interface') -----
>> blueButtonForService: aService textColor: textColor inWindow: window
>>    | block result |
>>    block := [self fullName isNil
>>                ifTrue: [self inform: 'Please select a file' translated]
>>                ifFalse: [aService performServiceFor: self]].
>>    result := window
>>                fancyText: aService buttonLabel capitalized translated
>>                font: Preferences standardEToysFont
>>                color: textColor.
>>    result setProperty: #buttonText toValue: aService buttonLabel capitalized;
>>         hResizing: #rigid;
>>         extent: 100 @ 20;
>>         layoutInset: 4;
>>         borderWidth: ColorTheme current dialogButtonBorderWidth;
>>         useRoundedCorners;
>>         setBalloonText: aService label.
>>    result
>>        on: #mouseUp
>>        send: #value
>>        to: block.
>>    ^ result!
>> 
>> ----- Method: FileList2>>cancelHit (in category 'private') -----
>> cancelHit
>> 
>>    modalView delete.
>>    directory := fileName := currentDirectorySelected := nil.!
>> 
>> ----- Method: FileList2>>changeDirectoryTo: (in category 'volume list and pattern') -----
>> changeDirectoryTo: aFileDirectory
>>    "Change directory as requested."
>> 
>>    self directory: aFileDirectory.
>>    self updateDirectory!
>> 
>> ----- Method: FileList2>>currentDirectorySelected (in category 'private') -----
>> currentDirectorySelected
>>    ^ currentDirectorySelected
>> !
>> 
>> ----- Method: FileList2>>deleteDirectory (in category 'own services') -----
>> deleteDirectory
>>    super deleteDirectory.
>>    self updateDirectory.!
>> 
>> ----- Method: FileList2>>dirSelectionBlock: (in category 'initialization') -----
>> dirSelectionBlock: aBlock
>>    dirSelectionBlock := aBlock!
>> 
>> ----- Method: FileList2>>directory (in category 'volume list and pattern') -----
>> directory
>> 
>>    ^directory!
>> 
>> ----- Method: FileList2>>directory: (in category 'initialization') -----
>> directory: dir
>>    "Set the path of the volume to be displayed."
>> 
>>    self okToChange ifFalse: [^ self].
>> 
>>    self modelSleep.
>>    directory := dir.
>>    self modelWakeUp.
>> 
>>    sortMode == nil ifTrue: [sortMode := #date].
>>    volList := Array with: '[]'.
>>    directory ifNotNil: [
>>        volList := volList, directory pathParts.  "Nesting suggestion from RvL"
>>    ].
>>    volList := volList withIndexCollect: [:each :i | ( String new: i-1 withAll: $ ), each].
>>    self changed: #relabel.
>>    self changed: #volumeList.
>>    self pattern: pattern.
>>    directoryChangeBlock ifNotNil: [directoryChangeBlock value: directory].!
>> 
>> ----- Method: FileList2>>directoryChangeBlock: (in category 'initialization') -----
>> directoryChangeBlock: aBlockOrNil
>> 
>>    directoryChangeBlock := aBlockOrNil.!
>> 
>> ----- Method: FileList2>>directoryNamesFor: (in category 'private') -----
>> directoryNamesFor: item
>>    "item may be file directory or server directory"
>>    | entries |
>>    entries := item directoryNames.
>>    dirSelectionBlock ifNotNil:[entries := entries select: dirSelectionBlock].
>>    ^entries!
>> 
>> ----- Method: FileList2>>dropDestinationDirectory:event: (in category 'drag''n''drop') -----
>> dropDestinationDirectory: dest event: evt
>>    "Answer a FileDirectory representing the drop destination in the directory hierarchy morph dest"
>> self isThisEverCalled.
>>    ^ (dest itemFromPoint: evt position) withoutListWrapper!
>> 
>> ----- Method: FileList2>>fileSelectionBlock: (in category 'initialization') -----
>> fileSelectionBlock: aBlock
>> 
>>    fileSelectionBlock := aBlock!
>> 
>> ----- Method: FileList2>>getSelectedDirectory (in category 'private') -----
>> getSelectedDirectory
>>    ok == true ifFalse: [^ nil].
>>    ^ currentDirectorySelected
>> !
>> 
>> ----- Method: FileList2>>getSelectedFile (in category 'private') -----
>> getSelectedFile
>>    "Answer a filestream on the selected file.  If it cannot be opened for read/write, try read-only before giving up; answer nil if unsuccessful"
>> 
>>    ok == true ifFalse: [^ nil].
>>    directory ifNil: [^ nil].
>>    fileName ifNil: [^ nil].
>>    ^ (directory oldFileNamed: fileName) ifNil:
>>        [directory readOnlyFileNamed: fileName]!
>> 
>> ----- Method: FileList2>>importImage (in category 'own services') -----
>> importImage
>>    "Import the given image file and store the resulting Form in the default Imports"
>> 
>>    | fname image |
>>    fname := fileName sansPeriodSuffix.
>>    image := Form fromFileNamed: self fullName.
>>    Imports default importImage: image named: fname.
>> !
>> 
>> ----- Method: FileList2>>initialDirectoryList (in category 'initialization') -----
>> initialDirectoryList
>> 
>>    | dirList |
>>    dirList := (FileDirectory on: '') directoryNames collect: [ :each |
>>        FileDirectoryWrapper with: (FileDirectory on: each) name: each model: self].
>>    dirList isEmpty ifTrue:[
>>        dirList := Array with: (FileDirectoryWrapper
>>            with: FileDirectory default
>>            name: FileDirectory default localName
>>            model: self)].
>>    dirList := dirList,(
>>        ServerDirectory serverNames collect: [ :n | | nameToShow dir |
>>            dir := ServerDirectory serverNamed: n.
>>            nameToShow := n.
>>            (dir directoryWrapperClass with: dir name: nameToShow model: self)
>>                balloonText: dir realUrl
>>        ]
>>    ).
>>    ^dirList!
>> 
>> ----- Method: FileList2>>initialize (in category 'initialize-release') -----
>> initialize
>> 
>>    super initialize.
>>    showDirsInFileList := false.
>>    fileSelectionBlock := [ :entry :myPattern |
>>        entry isDirectory ifTrue: [
>>            showDirsInFileList
>>        ] ifFalse: [
>>            myPattern = '*' or: [myPattern match: entry name]
>>        ]
>>    ].
>>    dirSelectionBlock := [ :dirName | true].!
>> 
>> ----- Method: FileList2>>isDirectoryList: (in category 'drag''n''drop') -----
>> isDirectoryList: aMorph
>>    ^aMorph isKindOf: SimpleHierarchicalListMorph!
>> 
>> ----- Method: FileList2>>labelString (in category 'initialization') -----
>> labelString
>>    ^ (directory ifNil: [^'[]']) pathName contractTo: 50!
>> 
>> ----- Method: FileList2>>limitedSuperSwikiDirectoryList (in category 'initialization') -----
>> limitedSuperSwikiDirectoryList
>> 
>>    | dirList localDirName localDir |
>> 
>>    dirList := OrderedCollection new.
>>    ServerDirectory serverNames do: [ :n | | dir nameToShow |
>>        dir := ServerDirectory serverNamed: n.
>>        dir isProjectSwiki ifTrue: [
>>            nameToShow := n.
>>            dirList add: ((dir directoryWrapperClass with: dir name: nameToShow model: self)
>>                balloonText: dir realUrl)
>>        ].
>>    ].
>>    ServerDirectory localProjectDirectories do: [ :each |
>>        dirList add: (FileDirectoryWrapper with: each name: each localName model: self)
>>    ].
>>    "Make sure the following are always shown, but not twice"
>>    localDirName := SecurityManager default untrustedUserDirectory.
>>    localDir := FileDirectory on: localDirName.
>>    ((ServerDirectory localProjectDirectories collect: [:each | each pathName]) includes: localDirName)
>>            ifFalse: [dirList add: (FileDirectoryWrapper with: localDir name: localDir localName model: self)].
>>    FileDirectory default pathName = localDirName
>>            ifFalse: [dirList add: (FileDirectoryWrapper with: FileDirectory default name: FileDirectory default localName model: self)].
>>    (dirList anySatisfy: [:each | each withoutListWrapper acceptsUploads])
>>        ifFalse: [dirList add: (FileDirectoryWrapper with: FileDirectory default name: FileDirectory default localName model: self)].
>>    ^dirList!
>> 
>> ----- Method: FileList2>>limitedSuperSwikiPublishDirectoryList (in category 'initialization') -----
>> limitedSuperSwikiPublishDirectoryList
>> 
>>    | dirList localDirName localDir |
>> 
>>    dirList := self publishingServers.
>>    ServerDirectory localProjectDirectories do: [ :each |
>>        dirList add: (FileDirectoryWrapper with: each name: each localName model: self)].
>> 
>>    "Make sure the following are always shown, but not twice"
>>    localDirName := SecurityManager default untrustedUserDirectory.
>>    localDir := FileDirectory on: localDirName.
>>    ((ServerDirectory localProjectDirectories collect: [:each | each pathName]) includes: localDirName)
>>            ifFalse: [dirList add: (FileDirectoryWrapper with: localDir name: localDir localName model: self)].
>>    FileDirectory default pathName = localDirName
>>            ifFalse: [dirList add: (FileDirectoryWrapper with: FileDirectory default name: FileDirectory default localName model: self)].
>>    ^dirList!
>> 
>> ----- Method: FileList2>>listForPattern: (in category 'volume list and pattern') -----
>> listForPattern: pat
>>    "Make the list be those file names which match the pattern."
>> 
>>    | sizePad newList entries |
>>    directory ifNil: [^#()].
>>    entries := (Preferences eToyLoginEnabled
>>        and: [Utilities authorNamePerSe notNil])
>>        ifTrue: [directory matchingEntries: {'submittedBy: ' , Utilities authorName.} ]
>>        ifFalse: [directory entries].
>>    (fileSelectionBlock isKindOf: MessageSend) ifTrue: [
>>        fileSelectionBlock arguments: {entries}.
>>        newList := fileSelectionBlock value.
>>        fileSelectionBlock arguments: #().
>>    ] ifFalse: [
>>        newList := entries select: [:entry | fileSelectionBlock value: entry value: pat].
>>    ].
>>    newList := newList asArray sort: self sortBlock.
>>    sizePad := (newList inject: 0 into: [:mx :entry | mx max: entry fileSize])
>>                    asStringWithCommas size - 1.
>>    ^newList collect: [ :e | self fileNameFormattedFrom: e sizePad: sizePad ]!
>> 
>> ----- Method: FileList2>>listForPatterns: (in category 'volume list and pattern') -----
>> listForPatterns: anArray
>>    "Make the list be those file names which match the patterns."
>> 
>>    | sizePad newList |
>>    directory ifNil: [^#()].
>>    (fileSelectionBlock isKindOf: MessageSend) ifTrue: [
>>        fileSelectionBlock arguments: {directory entries}.
>>        newList := fileSelectionBlock value.
>>        fileSelectionBlock arguments: #().
>>    ] ifFalse: [
>>        newList := Set new.
>>        anArray do: [ :pat |
>>            newList addAll: (directory entries select: [:entry | fileSelectionBlock value: entry value: pat]) ].
>>    ].
>>    newList := newList asArray sort: self sortBlock.
>>    sizePad := (newList inject: 0 into: [:mx :entry | mx max: entry fileSize])
>>                    asStringWithCommas size.
>>    ^newList collect: [ :e | self fileNameFormattedFrom: e sizePad: sizePad ]!
>> 
>> ----- Method: FileList2>>modalView: (in category 'private') -----
>> modalView: aSystemWindowOrSuch
>> 
>>    modalView := aSystemWindowOrSuch!
>> 
>> ----- Method: FileList2>>morphicDirectoryTreePane (in category 'user interface') -----
>> morphicDirectoryTreePane
>> 
>>    ^self morphicDirectoryTreePaneFiltered: #initialDirectoryList
>> !
>> 
>> ----- Method: FileList2>>morphicDirectoryTreePaneFiltered: (in category 'user interface') -----
>> morphicDirectoryTreePaneFiltered: aSymbol
>>    ^(SimpleHierarchicalListMorph
>>        on: self
>>        list: aSymbol
>>        selected: #currentDirectorySelected
>>        changeSelected: #setSelectedDirectoryTo:
>>        menu: #volumeMenu:
>>        keystroke: nil)
>>            autoDeselect: false;
>>            enableDrag: false;
>>            enableDrop: true;
>>            yourself
>> 
>> !
>> 
>> ----- Method: FileList2>>morphicFileContentsPane (in category 'user interface') -----
>> morphicFileContentsPane
>> 
>>    ^PluggableTextMorph
>>        on: self
>>        text: #contents
>>        accept: #put:
>>        readSelection: #contentsSelection
>>        menu: #fileContentsMenu:shifted:
>> !
>> 
>> ----- Method: FileList2>>morphicFileListPane (in category 'user interface') -----
>> morphicFileListPane
>> 
>>    ^(PluggableListMorph
>>        on: self
>>        list: #fileList
>>        selected: #fileListIndex
>>        changeSelected: #fileListIndex:
>>        menu: #fileListMenu:)
>>            enableDrag: true;
>>            enableDrop: false;
>>            yourself
>> 
>> !
>> 
>> ----- Method: FileList2>>morphicPatternPane (in category 'user interface') -----
>> morphicPatternPane
>>  | pane |
>>   pane := PluggableTextMorph
>>        on: self
>>        text: #pattern
>>        accept: #pattern:.
>>   pane acceptOnCR: true.
>>  ^pane
>> 
>> !
>> 
>> ----- Method: FileList2>>okHit (in category 'private') -----
>> okHit
>> 
>>    ok := true.
>>    currentDirectorySelected
>>        ifNil: [ Beeper beep ]
>>        ifNotNil: [
>>            self class lastSelDir: directory.
>>            modalView delete ]!
>> 
>> ----- Method: FileList2>>okHitForProjectLoader (in category 'private') -----
>> okHitForProjectLoader
>> 
>>    | areaOfProgress |
>>    fileName ifNil: [^ self].
>>    ok := true.
>>    areaOfProgress := modalView firstSubmorph.
>>    [
>>        areaOfProgress setProperty: #deleteOnProgressCompletion toValue: modalView.
>>        self openProjectFromFile.
>>        modalView delete.    "probably won't get here"
>>    ]
>>        on: ProgressTargetRequestNotification
>>        do: [ :ex | ex resume: areaOfProgress].
>> 
>> 
>> !
>> 
>> ----- Method: FileList2>>okayAndCancelServices (in category 'own services') -----
>> okayAndCancelServices
>>    "Answer ok and cancel services"
>> 
>>    ^ {self serviceOkay. self serviceCancel}!
>> 
>> ----- Method: FileList2>>openImageInWindow (in category 'own services') -----
>> openImageInWindow
>>    "Handle five file formats: GIF, JPG, PNG, Form stoteOn: (run coded), and BMP.
>>    Fail if file format is not recognized."
>> 
>>    | image myStream |
>>    myStream := (directory readOnlyFileNamed: fileName) binary.
>>    [image := Form fromBinaryStream: myStream.
>>    Project current openImage: image name: fileName saveResource: false]
>>        ensure: [myStream close]
>> !
>> 
>> ----- Method: FileList2>>openProjectFromFile (in category 'own services') -----
>> openProjectFromFile
>>    "Reconstitute a Morph from the selected file, presumed to be represent
>>    a Morph saved via the SmartRefStream mechanism, and open it in an
>>    appropriate Morphic world."
>> 
>>    Project canWeLoadAProjectNow ifFalse: [^ self].
>>    ProjectViewMorph
>>        openFromDirectory: directory
>>        andFileName: fileName
>> !
>> 
>> ----- Method: FileList2>>optionalButtonRow (in category 'initialization') -----
>> optionalButtonRow
>>    "Answer the button row associated with a file list"
>> 
>>    | aRow |
>>    aRow := AlignmentMorph newRow beSticky.
>>    aRow color: Color transparent.
>>    aRow clipSubmorphs: true.
>>    aRow layoutInset: 5 at 1; cellInset: 6.
>>    self universalButtonServices do:  "just the three sort-by items"
>>            [:service |
>>                aRow addMorphBack: (service buttonToTriggerIn: self).
>>                (service selector  == #sortBySize)
>>                    ifTrue:
>>                        [aRow addTransparentSpacerOfSize: (4 at 0)]].
>>    aRow setNameTo: 'buttons'.
>>    aRow setProperty: #buttonRow toValue: true.  "Used for dynamic retrieval later on"
>>    ^ aRow!
>> 
>> ----- Method: FileList2>>optionalButtonSpecs (in category 'initialization') -----
>> optionalButtonSpecs
>> 
>>    ^optionalButtonSpecs ifNil: [super optionalButtonSpecs]!
>> 
>> ----- Method: FileList2>>optionalButtonSpecs: (in category 'initialization') -----
>> optionalButtonSpecs: anArray
>> 
>>    optionalButtonSpecs := anArray!
>> 
>> ----- Method: FileList2>>postOpen (in category 'private') -----
>> postOpen
>> 
>>    directory ifNotNil: [
>>        self changed: #(openPath) , directory pathParts.
>>    ].
>> !
>> 
>> ----- Method: FileList2>>publishingServers (in category 'initialization') -----
>> publishingServers
>> 
>>    | dirList |
>> 
>>    dirList := OrderedCollection new.
>>    ServerDirectory serverNames do: [ :n | | dir nameToShow |
>>        dir := ServerDirectory serverNamed: n.
>>        (dir isProjectSwiki and: [dir acceptsUploads])
>>             ifTrue: [
>>                nameToShow := n.
>>                dirList add: ((dir directoryWrapperClass with: dir name: nameToShow model: self)
>>                    balloonText: dir realUrl)]].
>>    ^dirList!
>> 
>> ----- Method: FileList2>>removeLinefeeds (in category 'own services') -----
>> removeLinefeeds
>>    "Remove any line feeds by converting to CRs instead.  This is a temporary implementation for 3.6 only... should be removed during 3.7alpha."
>>    | fileContents |
>>    fileContents := ((FileStream readOnlyFileNamed: self fullName) wantsLineEndConversion: true) contentsOfEntireFile.
>>    (FileStream newFileNamed: self fullName)
>>        nextPutAll: fileContents;
>>        close.!
>> 
>> ----- Method: FileList2>>saveLocalOnlyHit (in category 'private') -----
>> saveLocalOnlyHit
>>    ok := true.
>>    modalView delete.
>>    directory := fileName := nil.
>>    currentDirectorySelected := #localOnly.!
>> 
>> ----- Method: FileList2>>serviceCancel (in category 'own services') -----
>> serviceCancel
>>    "Answer a service for hitting the cancel button"
>> 
>>    ^ (SimpleServiceEntry new
>>        provider: self label: 'cancel' selector: #cancelHit
>>        description: 'hit here to cancel ')
>>        buttonLabel: 'cancel'!
>> 
>> ----- Method: FileList2>>serviceOkay (in category 'own services') -----
>> serviceOkay
>>    "Answer a service for hitting the okay button"
>> 
>>    ^ (SimpleServiceEntry new
>>        provider: self label: 'okay' selector: #okHit
>>        description: 'hit here to accept the current selection')
>>        buttonLabel: 'ok'!
>> 
>> ----- Method: FileList2>>serviceOpenProjectFromFile (in category 'own services') -----
>> serviceOpenProjectFromFile
>>    "Answer a service for opening a .pr project file"
>> 
>>    ^ SimpleServiceEntry
>>        provider: self
>>        label: 'load as project'
>>        selector: #openProjectFromFile
>>        description: 'open project from file'
>>        buttonLabel: 'load'!
>> 
>> ----- Method: FileList2>>servicesForFolderSelector (in category 'own services') -----
>> servicesForFolderSelector
>>    "Answer the ok and cancel servies for the folder selector"
>> 
>>    ^ self okayAndCancelServices!
>> 
>> ----- Method: FileList2>>servicesForProjectLoader (in category 'own services') -----
>> servicesForProjectLoader
>>    "Answer the services to show in the button pane for the project loader"
>> 
>>    ^ {self serviceSortByName. self serviceSortByDate. self serviceSortBySize. self serviceOpenProjectFromFile}!
>> 
>> ----- Method: FileList2>>setSelectedDirectoryTo: (in category 'private') -----
>> setSelectedDirectoryTo: aFileDirectoryWrapper
>>    currentDirectorySelected := aFileDirectoryWrapper.
>>    self directory: aFileDirectoryWrapper withoutListWrapper.
>>    brevityState := #FileList.
>>    "self addPath: path."
>>    self changed: #fileList.
>>    self changed: #contents.
>>    self changed: #currentDirectorySelected.!
>> 
>> ----- Method: FileList2>>specsForImageViewer (in category 'as yet unclassified') -----
>> specsForImageViewer
>> 
>>     ^{self serviceSortByName. self serviceSortByDate. self serviceSortBySize }!
>> 
>> ----- Method: FileList2>>universalButtonServices (in category 'initialization') -----
>> universalButtonServices
>>    "Answer the services to be reflected in the receiver's buttons"
>> 
>>    ^ self optionalButtonSpecs!
>> 
>> ----- Method: FileList2>>updateDirectory (in category 'initialization') -----
>> updateDirectory
>>    "directory has been changed externally, by calling directory:.
>>    Now change the view to reflect the change."
>>    self changed: #currentDirectorySelected.
>>    self postOpen.!
>> 
>> 
>> 
> 


More information about the Squeak-dev mailing list