[squeak-dev] The Trunk: ToolBuilder-Morphic-cmm.53.mcz

Levente Uzonyi leves at elte.hu
Tue Mar 16 00:33:39 UTC 2010


On Mon, 15 Mar 2010, Chris Muller wrote:

> Yeah, I apparently broke the trunk badly.. checking..

Seems to be okay now, and we don't even need a new mcm.


Levente

>
> On Mon, Mar 15, 2010 at 7:06 PM, Levente Uzonyi <leves at elte.hu> wrote:
>> Something is broken. I get an emergency evaluator after updating to 9713 and
>> trying to open the TestRunner.
>>
>>
>> Levente
>>
>> On Mon, 15 Mar 2010, commits at source.squeak.org wrote:
>>
>>> Chris Muller uploaded a new version of ToolBuilder-Morphic to project The
>>> Trunk:
>>> http://source.squeak.org/trunk/ToolBuilder-Morphic-cmm.53.mcz
>>>
>>> ==================== Summary ====================
>>>
>>> Name: ToolBuilder-Morphic-cmm.53
>>> Author: cmm
>>> Time: 15 March 2010, 6:59:31.15 pm
>>> UUID: 8558cdec-3e86-460b-a52a-66237e0d22e6
>>> Ancestors: ToolBuilder-Morphic-MAD.52
>>>
>>> Integrated new ListChooser from Michael Davies.
>>>
>>> =============== Diff against ToolBuilder-Morphic-cmm.51 ===============
>>>
>>> Item was added:
>>> + ----- Method: ListChooser classSide>>chooseIndexFrom:title: (in category
>>> 'instance creation') -----
>>> + chooseIndexFrom: aList title: aString
>>> +       ^ self
>>> +               chooseIndexFrom: aList
>>> +               title: (aString isEmptyOrNil ifTrue: [ self defaultTitle ]
>>> ifFalse: [ aString ])
>>> +               addAllowed: false!
>>>
>>> Item was added:
>>> + ----- Method: ListChooser classSide>>testItem (in category 'examples')
>>> -----
>>> + testItem
>>> +       ^ self
>>> +               chooseItemFrom: (Smalltalk classNames , Smalltalk
>>> traitNames) asOrderedCollection
>>> +               title: 'Pick a class'!
>>>
>>> Item was added:
>>> + ----- Method: ListChooser>>moveWindowNear: (in category 'drawing') -----
>>> + moveWindowNear: aPoint
>>> +       | trialRect delta |
>>> +       trialRect := Rectangle center: aPoint extent: window fullBounds
>>> extent.
>>> +       delta := trialRect amountToTranslateWithin: World bounds.
>>> +       window position: trialRect origin + delta.!
>>>
>>> Item was added:
>>> + ----- Method: ListChooser classSide>>defaultTitle (in category 'instance
>>> creation') -----
>>> + defaultTitle
>>> +       ^ 'Please choose:'!
>>>
>>> Item was added:
>>> + ----- Method: ListChooser classSide>>testSet (in category 'examples')
>>> -----
>>> + testSet
>>> +       ^ self
>>> +               chooseItemFrom: #(a list of values as a Set) asSet
>>> +               title: 'Pick from Set'!
>>>
>>> Item was added:
>>> + ----- Method: ListChooser>>chooseIndexFrom:title: (in category
>>> 'initialize-release') -----
>>> + chooseIndexFrom: labelList title: aString
>>> +       | choice |
>>> +       choice := self chooseItemFrom: labelList title: aString
>>> addAllowed: false.
>>> +       ^ fullList indexOf: choice ifAbsent: 0!
>>>
>>> Item was added:
>>> + ----- Method: ListChooser>>buildListMorphWith: (in category 'building')
>>> -----
>>> + buildListMorphWith: builder
>>> +       | listSpec |
>>> +       listSpec := builder pluggableListSpec new.
>>> +       listSpec
>>> +               model: self;
>>> +               list: #list;
>>> +               getIndex: #selectedIndex;
>>> +               setIndex: #selectedIndex:;
>>> +               doubleClick: #accept;
>>> +               "handleBasicKeys: false;"
>>> +               keystrokePreview: #keyStrokeFromList:;
>>> +               "doubleClickSelector: #accept;"
>>> +               autoDeselect: false.
>>> +       ^ listSpec!
>>>
>>> Item was added:
>>> + ----- Method: ListChooser classSide>>chooseItemFrom: (in category
>>> 'instance creation') -----
>>> + chooseItemFrom: aList
>>> +       ^ self
>>> +               chooseItemFrom: aList
>>> +               title: self defaultTitle!
>>>
>>> Item was added:
>>> + ----- Method: ListChooser classSide>>testLongTitle (in category
>>> 'examples') -----
>>> + testLongTitle
>>> +       ^ self
>>> +               chooseItemFrom: #(this is a list of values that aren/t the
>>> point here)
>>> +               title: 'Pick from some values from this list'!
>>>
>>> Item was added:
>>> + ----- Method: ListChooser>>buildWindowWith:specs: (in category
>>> 'building') -----
>>> + buildWindowWith: builder specs: specs
>>> +       | windowSpec |
>>> +       windowSpec := self buildWindowWith: builder.
>>> +       specs do: [ :assoc |
>>> +               | rect action widgetSpec |
>>> +               rect := assoc key.
>>> +               action := assoc value.
>>> +               widgetSpec := action value.
>>> +               widgetSpec ifNotNil:[
>>> +                       widgetSpec frame: rect.
>>> +                       windowSpec children add: widgetSpec ] ].
>>> +       ^ windowSpec!
>>>
>>> Item was added:
>>> + ----- Method: ListChooser>>cancel (in category 'event handling') -----
>>> + cancel
>>> +       "Cancel the dialog and move on"
>>> +       index := 0.
>>> +       builder ifNotNil: [ builder close: window ]!
>>>
>>> Item was added:
>>> + ----- Method: ListChooser>>buildSearchMorphWith: (in category
>>> 'building') -----
>>> + buildSearchMorphWith: builder
>>> +       | fieldSpec |
>>> +       fieldSpec := builder pluggableInputFieldSpec new.
>>> +       fieldSpec
>>> +               model: self;
>>> +               getText: #searchText;
>>> +               setText: #acceptText:;
>>> +               menu: nil.
>>> +               "hideScrollBarsIndefinitely;"
>>> +               "acceptOnCR: true;"
>>> +               "setBalloonText: 'Type a string to filter down the listed
>>> items'."
>>> +               "onKeyStrokeSend: #keyStroke: to: self."
>>> +       ^ fieldSpec!
>>>
>>> Item was added:
>>> + ----- Method: ListChooser>>buildWindowWith: (in category 'building')
>>> -----
>>> + buildWindowWith: builder
>>> +       | windowSpec |
>>> +       windowSpec := builder pluggableWindowSpec new.
>>> +       windowSpec model: self.
>>> +       windowSpec label: #title.
>>> +       windowSpec children: OrderedCollection new.
>>> +       ^windowSpec!
>>>
>>> Item was added:
>>> + ----- Method: ListChooser classSide>>chooseIndexFrom:title:addAllowed:
>>> (in category 'instance creation') -----
>>> + chooseIndexFrom: aList title: aString addAllowed: aBoolean
>>> +       ^ self new
>>> +               chooseIndexFrom: aList
>>> +               title: (aString isEmptyOrNil ifTrue: [ self defaultTitle ]
>>> ifFalse: [ aString ])
>>> +               addAllowed: aBoolean!
>>>
>>> Item was added:
>>> + ----- Method: ListChooser>>searchText: (in category 'accessing') -----
>>> + searchText: aString
>>> +       searchText := aString!
>>>
>>> Item was added:
>>> + ----- Method: ListChooser>>title: (in category 'accessing') -----
>>> + title: aString
>>> +       title := aString.!
>>>
>>> Item was added:
>>> + ----- Method: ListChooser>>chooseIndexFrom:title:addAllowed: (in
>>> category 'initialize-release') -----
>>> + chooseIndexFrom: labelList title: aString addAllowed: aBoolean
>>> +       | choice |
>>> +       choice := self chooseItemFrom: labelList title: aString
>>> addAllowed: false.
>>> +       addAllowed := aBoolean.
>>> +       ^ fullList indexOf: choice ifAbsent: 0!
>>>
>>> Item was added:
>>> + ----- Method: ListChooser>>realIndex (in category 'accessing') -----
>>> + realIndex
>>> +       ^ realIndex ifNil: [ 0 ]!
>>>
>>> Item was added:
>>> + ----- Method: ListChooser>>list (in category 'accessing') -----
>>> + list
>>> +       ^ selectedItems!
>>>
>>> Item was changed:
>>>  ----- Method: MorphicToolBuilder>>buildPluggableList: (in category
>>> 'pluggable widgets') -----
>>>  buildPluggableList: aSpec
>>>        | widget listClass getIndex setIndex |
>>>        aSpec getSelected ifNil:[
>>>                listClass := self listClass.
>>>                getIndex := aSpec getIndex.
>>>                setIndex := aSpec setIndex.
>>>        ] ifNotNil:[
>>>                listClass := self listByItemClass.
>>>                getIndex := aSpec getSelected.
>>>                setIndex := aSpec setSelected.
>>>        ].
>>>        widget := listClass on: aSpec model
>>>                                list: aSpec list
>>>                                selected: getIndex
>>>                                changeSelected: setIndex
>>>                                menu: aSpec menu
>>>                                keystroke: aSpec keyPress.
>>>        self register: widget id: aSpec name.
>>>        widget getListElementSelector: aSpec listItem.
>>>        widget getListSizeSelector: aSpec listSize.
>>>        widget doubleClickSelector: aSpec doubleClick.
>>>        widget dragItemSelector: aSpec dragItem.
>>>        widget dropItemSelector: aSpec dropItem.
>>>        widget wantsDropSelector: aSpec dropAccept.
>>>        widget autoDeselect: aSpec autoDeselect.
>>> +       widget keystrokePreviewSelector: aSpec keystrokePreview.
>>>        self buildHelpFor: widget spec: aSpec.
>>>        self setFrame: aSpec frame in: widget.
>>>        parent ifNotNil:[self add: widget to: parent].
>>>        panes ifNotNil:[
>>>                aSpec list ifNotNil:[panes add: aSpec list].
>>>        ].
>>>        ^widget!
>>>
>>> Item was added:
>>> + ----- Method: ListChooser>>accept (in category 'event handling') -----
>>> + accept
>>> +       "if the user submits with no valid entry, make them start over"
>>> +       self canAccept ifFalse: [
>>> +               searchMorph selectAll.
>>> +               ^ self ].
>>> +
>>> +       "find the selected item in the original list, and return it"
>>> +       result := selectedItems at: index.
>>> +
>>> +       builder ifNotNil: [ :bldr |
>>> +               builder := nil.
>>> +               bldr close: window ]!
>>>
>>> Item was added:
>>> + ----- Method: ListChooser classSide>>chooseItemFrom:title:addAllowed:
>>> (in category 'instance creation') -----
>>> + chooseItemFrom: aList title: aString addAllowed: aBoolean
>>> +       ^ self new
>>> +               chooseItemFrom: aList
>>> +               title: (aString isEmptyOrNil ifTrue: [ self defaultTitle ]
>>> ifFalse: [ aString ])
>>> +               addAllowed: aBoolean!
>>>
>>> Item was added:
>>> + ----- Method: ListChooser>>chooseItemFrom:title:addAllowed: (in category
>>> 'initialize-release') -----
>>> + chooseItemFrom: labelList title: aString addAllowed: aBoolean
>>> +       fullList := labelList asOrderedCollection. "coerce everything into
>>> an OC"
>>> +       builder := ToolBuilder default.
>>> +       self list: fullList.
>>> +       self title: aString.
>>> +       addAllowed := aBoolean.
>>> +       window := ToolBuilder default open: self.
>>> +       window center: Sensor cursorPoint.
>>> +       window setConstrainedPosition: (Sensor cursorPoint - (window
>>> fullBounds extent // 2)) hangOut: false.
>>> +       builder runModal: window.
>>> +       ^ result!
>>>
>>> Item was added:
>>> + ----- Method: ListChooser>>canAdd (in category 'testing') -----
>>> + canAdd
>>> +       ^ addAllowed and: [ self canAccept not ]!
>>>
>>> Item was changed:
>>>  ----- Method: MorphicUIManager>>chooseFrom:lines:title: (in category 'ui
>>> requests') -----
>>> + chooseFrom: aList lines: linesArray title: aString
>>> - chooseFrom: aList lines: linesArray title: aString
>>>        "Choose an item from the given list. Answer the index of the
>>> selected item."
>>> +       ^ aList size > 30
>>> +               ifTrue:
>>> +                       [ "Don't put more than 30 items in a menu.  Use
>>> ListChooser insted"
>>> +                       ListChooser
>>> +                               chooseFrom: aList
>>> +                               title: aString ]
>>> +               ifFalse:
>>> +                       [ MenuMorph
>>> +                               chooseFrom: aList
>>> +                               lines: linesArray
>>> +                               title: aString ]!
>>> -       aList size > 30 ifTrue:[
>>> -               "No point in displaying more than 30 items as list. Use
>>> ChooserTool insted"
>>> -               ^ChooserTool chooseFrom: aList title: aString.
>>> -       ] ifFalse:[
>>> -               ^MenuMorph chooseFrom: aList lines: linesArray title:
>>> aString
>>> -       ].!
>>>
>>> Item was added:
>>> + ----- Method: ListChooser>>cancelColor (in category 'drawing') -----
>>> + cancelColor
>>> +       ^ ColorTheme current cancelColor!
>>>
>>> Item was added:
>>> + ----- Method: ListChooser>>title (in category 'accessing') -----
>>> + title
>>> +       ^ title ifNil: [ title := 'Please choose' ]!
>>>
>>> Item was added:
>>> + ----- Method: ListChooser>>searchText (in category 'accessing') -----
>>> + searchText
>>> +       ^ searchText ifNil: [ searchText := '' ]!
>>>
>>> Item was added:
>>> + ----- Method: ListChooser>>selectedIndex: (in category 'accessing')
>>> -----
>>> + selectedIndex: anInt
>>> +       index := (anInt min: selectedItems size).
>>> +       self changed: #selectedIndex.
>>> +       self changed: #canAccept.!
>>>
>>> Item was added:
>>> + ----- Method: ListChooser>>buildWith: (in category 'building') -----
>>> + buildWith: aBuilder
>>> +       | windowSpec |
>>> +       builder := aBuilder.
>>> +       windowSpec := self buildWindowWith: builder specs: {
>>> +               (0 at 0 corner: 1 at 0.05) -> [self buildSearchMorphWith:
>>> builder].
>>> +               (0 at 0.05 corner: 1 at 0.9) -> [self buildListMorphWith:
>>> builder].
>>> +               (0 at 0.9 corner: 1 at 1) -> [self buildButtonBarWith: builder].
>>> +       }.
>>> +       windowSpec closeAction: #closed.
>>> +       windowSpec extent: self initialExtent.
>>> +       window := builder build: windowSpec.
>>> +
>>> +
>>> +       searchMorph := window submorphs detect:
>>> +               [ :each | each isKindOf: PluggableTextMorph ].
>>> +       searchMorph
>>> +               hideScrollBarsIndefinitely;
>>> +               acceptOnCR: true;
>>> +               setBalloonText: 'Type a string to filter down the listed
>>> items';
>>> +               onKeyStrokeSend: #keyStroke: to: self;
>>> +               hasUnacceptedEdits: true "force acceptOnCR to work even
>>> with no text entered".
>>> +       listMorph := window submorphs detect:
>>> +               [ :each | each isKindOf: PluggableListMorph ].
>>> +       ^ window!
>>>
>>> Item was added:
>>> + Object subclass: #ListChooser
>>> +       instanceVariableNames: 'window fullList selectedItems searchText
>>> searchMorph title listMorph index realIndex buttonBar builder addAllowed
>>> result'
>>> +       classVariableNames: ''
>>> +       poolDictionaries: ''
>>> +       category: 'ToolBuilder-Morphic'!
>>> +
>>> + !ListChooser commentStamp: 'MAD 3/14/2010 16:20' prior: 0!
>>> + I am a simple dialog to allow the user to pick from a list of strings or
>>> symbols.
>>> + I support keyboard and mouse navigation, and interactive filtering of
>>> the displayed items.
>>> +
>>> + You can specify whether you want the index, or the value of the selected
>>> item. If you're interested in the value, you can also allow users to Add a
>>> new value not in the list.
>>> +
>>> + cmd-s or <enter> or double-click answers the currently selected item's
>>> value/index;
>>> + cmd-l or <escape> or closing the window answers nil/zero.
>>> +
>>> + Now using ToolBuilder, so needs Morphic-MAD.381.
>>> +
>>> + Released under the MIT Licence.!
>>>
>>> Item was added:
>>> + ----- Method: ListChooser classSide>>testItemAdd (in category
>>> 'examples') -----
>>> + testItemAdd
>>> +       ^ self
>>> +               chooseItemFrom: (Smalltalk classNames , Smalltalk
>>> traitNames) asOrderedCollection
>>> +               title: 'Pick or Add:'
>>> +               addAllowed: true!
>>>
>>> Item was added:
>>> + ----- Method: ListChooser>>keyStrokeFromList: (in category 'event
>>> handling') -----
>>> + keyStrokeFromList: event
>>> +       "we don't want the list to be picking up events"
>>> +       window world primaryHand keyboardFocus: searchMorph.
>>> +       searchMorph keyStroke: event.
>>> +       "let the list know we've dealt with it"
>>> +       ^ true!
>>>
>>> Item was changed:
>>>  ----- Method: MorphicUIManager>>chooseFrom:values:lines:title: (in
>>> category 'ui requests') -----
>>> + chooseFrom: labelList values: valueList lines: linesArray title: aString
>>> - chooseFrom: labelList values: valueList lines: linesArray title: aString
>>>        "Choose an item from the given list. Answer the selected item."
>>>        | index |
>>> +       ^ labelList size > 30
>>> +               ifTrue:
>>> +                       [ "No point in displaying more than 30 items in a
>>> menu.  Use ListChooser insted"
>>> +                       index := ListChooser
>>> +                               chooseFrom: labelList
>>> +                               title: aString.
>>> +                       index = 0 ifFalse: [ valueList at: index ] ]
>>> +               ifFalse:
>>> +                       [ MenuMorph
>>> +                               chooseFrom: labelList
>>> +                               values: valueList
>>> +                               lines: linesArray
>>> +                               title: aString ]!
>>> -       labelList size > 30 ifTrue:[
>>> -               "No point in displaying more than 30 items as list. Use
>>> ChooserTool insted"
>>> -               index := ChooserTool chooseFrom: labelList title: aString.
>>> -               ^ index = 0 ifFalse:[valueList at: index].
>>> -       ] ifFalse:[
>>> -               ^MenuMorph chooseFrom: labelList values: valueList lines:
>>> linesArray title: aString
>>> -       ].!
>>>
>>> Item was added:
>>> + ----- Method: ListChooser>>keyStroke: (in category 'event handling')
>>> -----
>>> + keyStroke: event
>>> +       | newText key |
>>> +       "handle updates to the search box interactively"
>>> +       key := event keyString.
>>> +       (key = '<up>') ifTrue: [
>>> +               self move: -1.
>>> +               ^ self ].
>>> +       (key = '<down>') ifTrue: [
>>> +               self move: 1.
>>> +               ^ self ].
>>> +
>>> +       (key = '<Cmd-s>') ifTrue: [ self accept. ^ self ].
>>> +       (key = '<cr>') ifTrue: [ self accept. ^ self ].
>>> +
>>> +       (key = '<escape>') ifTrue: [ self cancel. ^ self ].
>>> +       (key = '<Cmd-l>') ifTrue: [ self cancel. ^ self ].
>>> +
>>> +       (key = '<Cmd-a>') ifTrue: [ self add. ^ self ].
>>> +
>>> +       "pull out what's been typed, and update the list as required"
>>> +       newText := searchMorph textMorph asText asString.
>>> +       (newText = searchText) ifFalse: [
>>> +               searchText := newText.
>>> +               self updateFilter ].
>>> + !
>>>
>>> Item was added:
>>> + ----- Method: ListChooser>>buildButtonBarWith: (in category 'building')
>>> -----
>>> + buildButtonBarWith: builder
>>> +       | panel button |
>>> +       panel := builder pluggablePanelSpec new
>>> +               model: self;
>>> +               layout: #proportional;
>>> +               children: OrderedCollection new.
>>> +       button := builder pluggableButtonSpec new.
>>> +       button
>>> +               model: self;
>>> +               label: 'Accept (s)';
>>> +               action: #accept;
>>> +               enabled: #canAccept;
>>> +               color: #acceptColor;
>>> +               frame: (0.0 @ 0.0 corner: 0.34 at 1).
>>> +       panel children add: button.
>>> +
>>> +       button := builder pluggableButtonSpec new.
>>> +       button
>>> +               model: self;
>>> +               label: 'Add (a)';
>>> +               action: #add;
>>> +               enabled: #canAdd;
>>> +               frame: (0.36 @ 0.0 corner: 0.63 at 1).
>>> +       panel children add: button.
>>> +
>>> +       button := builder pluggableButtonSpec new.
>>> +       button
>>> +               model: self;
>>> +               label: 'Cancel (l)';
>>> +               action: #cancel;
>>> +               color: #cancelColor;
>>> +               frame: (0.65 @ 0.0 corner: 1 at 1).
>>> +       panel children add: button.
>>> +
>>> +       ^ panel!
>>>
>>> Item was added:
>>> + ----- Method: ListChooser classSide>>chooseItemFrom:title: (in category
>>> 'instance creation') -----
>>> + chooseItemFrom: aList title: aString
>>> +       ^ self
>>> +               chooseItemFrom: aList
>>> +               title: aString
>>> +               addAllowed: false!
>>>
>>> Item was added:
>>> + ----- Method: ListChooser>>selectedIndex (in category 'accessing') -----
>>> + selectedIndex
>>> +       ^ index ifNil: [ index := 1 ]!
>>>
>>> Item was added:
>>> + ----- Method: ListChooser>>acceptText: (in category 'event handling')
>>> -----
>>> + acceptText: someText
>>> +       "the text morph wants to tell us about its contents but I don't
>>> care, I'm only interested in the list"
>>> +       self accept!
>>>
>>> Item was added:
>>> + ----- Method: ListChooser>>updateFilter (in category 'event handling')
>>> -----
>>> + updateFilter
>>> +       selectedItems :=
>>> +               searchText isEmptyOrNil
>>> +                       ifTrue: [ fullList ]
>>> +                       ifFalse: [ fullList select: [ :each | each
>>> includesSubstring: searchText caseSensitive: false  ] ].
>>> +       self changed: #list.
>>> +       self selectedIndex: 1.
>>> +       self changed: #selectedIndex.!
>>>
>>> Item was added:
>>> + ----- Method: ListChooser>>canAccept (in category 'testing') -----
>>> + canAccept
>>> +       ^ self selectedIndex > 0!
>>>
>>> Item was added:
>>> + ----- Method: ListChooser classSide>>testIndex (in category 'examples')
>>> -----
>>> + testIndex
>>> +       ^ self
>>> +               chooseIndexFrom: (Smalltalk classNames , Smalltalk
>>> traitNames) asOrderedCollection
>>> +               title: 'Pick a class'!
>>>
>>> Item was added:
>>> + ----- Method: ListChooser classSide>>chooseFrom: (in category
>>> 'ChooserTool compatibility') -----
>>> + chooseFrom: aList
>>> +       ^ self
>>> +               chooseFrom: aList
>>> +               title: self defaultTitle!
>>>
>>> Item was added:
>>> + ----- Method: ListChooser>>handlesKeyboard: (in category 'event
>>> handling') -----
>>> + handlesKeyboard: evt
>>> +       ^ true!
>>>
>>> Item was added:
>>> + ----- Method: ListChooser>>list:title: (in category 'accessing') -----
>>> + list: aList title: aString
>>> +       self list: aList.
>>> +       self title: aString!
>>>
>>> Item was added:
>>> + ----- Method: ListChooser>>list: (in category 'accessing') -----
>>> + list: items
>>> +       fullList := items.
>>> +       selectedItems := items.
>>> +       self changed: #itemList.!
>>>
>>> Item was added:
>>> + ----- Method: ListChooser classSide>>testDictionary (in category
>>> 'examples') -----
>>> + testDictionary
>>> +       ^ self
>>> +               chooseItemFrom: (Dictionary newFrom: {#a->1. 2->#b.})
>>> +               title: 'Pick from Dictionary' "gives values, not keys"!
>>>
>>> Item was added:
>>> + ----- Method: ListChooser>>initialExtent (in category 'building') -----
>>> + initialExtent
>>> +       | listFont titleFont buttonFont listWidth titleWidth buttonWidth |
>>> +       listFont := Preferences standardListFont.
>>> +       titleFont := Preferences windowTitleFont.
>>> +       buttonFont := Preferences standardButtonFont.
>>> +       listWidth := 20 * (listFont widthOf: $m).
>>> +       titleWidth := titleFont widthOfString: self title, '__________'.
>>> "add some space for titlebar icons"
>>> +       buttonWidth := buttonFont widthOfString: '_Accept_(s)___Add
>>> (a)___Cancel_(l)_'.
>>> +       ^ (listWidth max: (titleWidth max: buttonWidth))@(30 * (listFont
>>> height))!
>>>
>>> Item was added:
>>> + ----- Method: ListChooser classSide>>chooseFrom:title: (in category
>>> 'ChooserTool compatibility') -----
>>> + chooseFrom: aList title: aString
>>> +       ^ self
>>> +               chooseIndexFrom: aList
>>> +               title: aString
>>> +               addAllowed: false!
>>>
>>> Item was added:
>>> + ----- Method: ListChooser>>closed (in category 'event handling') -----
>>> + closed
>>> +       "Cancel the dialog and move on"
>>> +       builder ifNotNil: [ index := 0 ]!
>>>
>>> Item was added:
>>> + ----- Method: ListChooser>>move: (in category 'event handling') -----
>>> + move: offset
>>> +       | newindex |
>>> +       "The up arrow key moves the cursor, and it seems impossible to
>>> restore.
>>> +       So, for consistency, on either arrow, select everything, so a new
>>> letter-press starts over. yuk."
>>> +       searchMorph selectAll.
>>> +
>>> +       newindex := self selectedIndex + offset.
>>> +       newindex > selectedItems size ifTrue: [ ^ nil ].
>>> +       newindex < 1 ifTrue: [ ^ nil ].
>>> +       self selectedIndex: newindex.
>>> + !
>>>
>>> Item was added:
>>> + ----- Method: ListChooser classSide>>chooseIndexFrom: (in category
>>> 'instance creation') -----
>>> + chooseIndexFrom: aList
>>> +       ^ self
>>> +               chooseIndexFrom: aList
>>> +               title: self defaultTitle!
>>>
>>> Item was added:
>>> + ----- Method: ListChooser>>add (in category 'event handling') -----
>>> + add
>>> +       "if the user submits with no valid entry, make them start over"
>>> +       self canAdd ifFalse: [
>>> +               searchMorph selectAll.
>>> +               ^ self ].
>>> +
>>> +       "find the string to return"
>>> +       result := searchMorph getText.
>>> +
>>> +       builder ifNotNil: [ :bldr |
>>> +               builder := nil.
>>> +               bldr close: window ]!
>>>
>>> Item was added:
>>> + ----- Method: ListChooser>>acceptColor (in category 'drawing') -----
>>> + acceptColor
>>> +       ^ self canAccept
>>> +               ifTrue: [ ColorTheme current okColor ]
>>> +               ifFalse: [ Color lightGray "ColorTheme current
>>> disabledColor <- you don't have this!!" ]!
>>>
>>> Item was removed:
>>> - Model subclass: #ChooserTool
>>> -       instanceVariableNames: 'label items index builder window'
>>> -       classVariableNames: ''
>>> -       poolDictionaries: ''
>>> -       category: 'ToolBuilder-Morphic'!
>>> -
>>> - !ChooserTool commentStamp: 'ar 12/9/2009 23:46' prior: 0!
>>> - A simple chooser tool for Morphic. Useful when menus just get too long.!
>>>
>>> Item was removed:
>>> - ----- Method: ChooserTool>>canAccept (in category 'accessing') -----
>>> - canAccept
>>> -       ^self itemListIndex > 0!
>>>
>>> Item was removed:
>>> - ----- Method: ChooserTool>>closed (in category 'actions') -----
>>> - closed
>>> -       "Cancel the dialog and move on"
>>> -       builder ifNotNil:[index := 0].!
>>>
>>> Item was removed:
>>> - ----- Method: ChooserTool class>>chooseFrom:title: (in category 'tools')
>>> -----
>>> - chooseFrom: labelList title: aString
>>> -       ^self new chooseFrom: labelList title: aString!
>>>
>>> Item was removed:
>>> - ----- Method: ChooserTool>>label (in category 'accessing') -----
>>> - label
>>> -       ^label!
>>>
>>> Item was removed:
>>> - ----- Method: ChooserTool>>chooseFrom:title: (in category 'initialize')
>>> -----
>>> - chooseFrom: labelList title: aString
>>> -       builder := ToolBuilder default.
>>> -       self itemList: labelList.
>>> -       self label: aString.
>>> -       window := ToolBuilder default open: self.
>>> -       window center: Sensor cursorPoint.
>>> -       window setConstrainedPosition: (Sensor cursorPoint - (window
>>> fullBounds extent // 2)) hangOut: false.
>>> -       builder runModal: window.
>>> -       ^self itemListIndex!
>>>
>>> Item was removed:
>>> - ----- Method: ChooserTool>>cancel (in category 'actions') -----
>>> - cancel
>>> -       "Cancel the dialog and move on"
>>> -       index := 0.
>>> -       builder ifNotNil:[builder close: window].!
>>>
>>> Item was removed:
>>> - ----- Method: ChooserTool>>buildWindowWith:specs: (in category
>>> 'toolbuilder') -----
>>> - buildWindowWith: builder specs: specs
>>> -       | windowSpec |
>>> -       windowSpec := self buildWindowWith: builder.
>>> -       specs do:[:assoc|
>>> -               | rect action widgetSpec |
>>> -               rect := assoc key.
>>> -               action := assoc value.
>>> -               widgetSpec := action value.
>>> -               widgetSpec ifNotNil:[
>>> -                       widgetSpec frame: rect.
>>> -                       windowSpec children add: widgetSpec]].
>>> -       ^windowSpec!
>>>
>>> Item was removed:
>>> - ----- Method: ChooserTool>>itemList (in category 'accessing') -----
>>> - itemList
>>> -       ^items!
>>>
>>> Item was removed:
>>> - ----- Method: ChooserTool>>buildWindowWith: (in category 'toolbuilder')
>>> -----
>>> - buildWindowWith: builder
>>> -       | windowSpec |
>>> -       windowSpec := builder pluggableWindowSpec new.
>>> -       windowSpec model: self.
>>> -       windowSpec label: #labelString.
>>> -       windowSpec children: OrderedCollection new.
>>> -       ^windowSpec!
>>>
>>> Item was removed:
>>> - ----- Method: ChooserTool>>itemListIndex (in category 'accessing') -----
>>> - itemListIndex
>>> -       ^index ifNil:[0]!
>>>
>>> Item was removed:
>>> - ----- Method: ChooserTool>>accept (in category 'actions') -----
>>> - accept
>>> -       "Accept current selection and move on"
>>> -       builder ifNotNil:[:bldr|
>>> -               builder := nil.
>>> -               bldr close: window].!
>>>
>>> Item was removed:
>>> - ----- Method: ChooserTool>>buildButtonsWith: (in category 'toolbuilder')
>>> -----
>>> - buildButtonsWith: aBuilder
>>> -       | panel button |
>>> -       panel := aBuilder pluggablePanelSpec new
>>> -               model: self;
>>> -               layout: #proportional;
>>> -               children: OrderedCollection new.
>>> -       button := aBuilder pluggableButtonSpec new.
>>> -       button
>>> -                               model: self;
>>> -                               label: 'Accept';
>>> -                               action: #accept;
>>> -                               enabled: #canAccept;
>>> -                               frame: (0.0 @ 0.0 corner: 0.48 at 1).
>>> -       panel children add: button.
>>> -
>>> -       button := aBuilder pluggableButtonSpec new.
>>> -       button
>>> -                               model: self;
>>> -                               label: 'Cancel';
>>> -                               action: #cancel;
>>> -                               frame: (0.52 @ 0.0 corner: 1 at 1).
>>> -       panel children add: button.
>>> -       ^panel!
>>>
>>> Item was removed:
>>> - ----- Method: ChooserTool>>itemList: (in category 'accessing') -----
>>> - itemList: aCollection
>>> -       items := aCollection.
>>> -       self changed: #items.!
>>>
>>> Item was removed:
>>> - ----- Method: ChooserTool>>itemListIndex: (in category 'accessing')
>>> -----
>>> - itemListIndex: newIndex
>>> -       index := newIndex.
>>> -       self changed: #itemListIndex.
>>> -       self changed: #canAccept.!
>>>
>>> Item was removed:
>>> - ----- Method: ChooserTool>>label: (in category 'accessing') -----
>>> - label: aString
>>> -       label := aString.!
>>>
>>> Item was removed:
>>> - ----- Method: ChooserTool>>buildWith: (in category 'toolbuilder') -----
>>> - buildWith: aBuilder
>>> -       | windowSpec |
>>> -       builder := aBuilder.
>>> -       windowSpec := self buildWindowWith: builder specs: {
>>> -               (0 at 0 corner: 1 at 0.9) -> [self buildChooserListWith:
>>> builder].
>>> -               (0 at 0.9 corner: 1 at 1) -> [self buildButtonsWith: builder].
>>> -       }.
>>> -       windowSpec closeAction: #closed.
>>> -       windowSpec extent: 250 at 350.
>>> -       ^builder build: windowSpec!
>>>
>>> Item was removed:
>>> - ----- Method: ChooserTool>>labelString (in category 'accessing') -----
>>> - labelString
>>> -       ^label!
>>>
>>> Item was removed:
>>> - ----- Method: ChooserTool>>buildChooserListWith: (in category
>>> 'toolbuilder') -----
>>> - buildChooserListWith: builder
>>> -       | listSpec |
>>> -       listSpec := builder pluggableListSpec new.
>>> -       listSpec
>>> -               model: self;
>>> -               list: #itemList;
>>> -               getIndex: #itemListIndex;
>>> -               setIndex: #itemListIndex:;
>>> -               doubleClick: #accept;
>>> -               autoDeselect: false.
>>> -       ^listSpec
>>> - !
>>>
>>> Item was removed:
>>> - ----- Method: ChooserTool class>>open (in category 'opening') -----
>>> - open
>>> -       ^ToolBuilder open: self!
>>>
>>>
>>>
>>
>>
>
>


More information about the Squeak-dev mailing list