eXept Software AG Logo

Smalltalk/X Webserver

Documentation of class 'ComboListView':

Home

Documentation
www.exept.de
Everywhere
for:
[back]

Class: ComboListView


Inheritance:

   Object
   |
   +--GraphicsMedium
      |
      +--DisplaySurface
         |
         +--SimpleView
            |
            +--View
               |
               +--ComboView
                  |
                  +--ComboListView

Package:
stx:libwidg2
Category:
Views-Interactors
Version:
rev: 1.66 date: 2019/07/30 14:41:02
user: sr
file: ComboListView.st directory: libwidg2
module: stx stc-classLibrary: libwidg2
Author:
Claus Gittinger

Description:


A ComboListView combines a label with a drop down list of default inputs;
choosing any from the pulled list sets the string in the label.
The string is not editable: as oposed to a ComboBoxView, which allows free text input,
this only allows choosing from the given list.

This has a similar function as a PopUpList or SelectionInListView, but looks different.

The preferred model is a SelectionInList, but a simple valueHolder may also be used.
If some other model is to be used, the changeMessage and aspectMessage
should be defined as appropriate (or an aspectAdaptor should be used).
If a listHolder is set, that one is assumed to provide the list of
items in the popped menu;
otherwise, if listMessage is nonNil, the model is assumed to also provide the
list as displayed in the pulled menu.


Related information:

    ComboView
    PopUpList
    SelectionInListView
    ComboBoxView
    ExtendedComboBox
    PullDownMenu
    Label
    EntryField

Class protocol:

defaults
o  defaultAspectMessage
(comment from inherited method)
subclasses which by default do NOT want to be informed about changed
models should redefine this to return nil

o  defaultChangeMessage
(comment from inherited method)
subclasses which by default do NOT want to inform the model
should redefine this to return nil

o  defaultFont


Instance protocol:

accessing
o  selectCondition: something

accessing-behavior
o  useIndex
specify, if the selected components value or its index in the
list should be sent to the model. The default is its value.

o  useIndex: aBoolean
specify, if the selected component's value or its index in the
list should be sent to the model. The default is its value.

o  values: aCollection
specify, which values are to be stuffed into the model or
passed via the actionBlock.

accessing-components
o  label
return the label component

accessing-contents
o  contents
get the current value - either in the field's model
or directly

o  contents: something
set the current value - either in the fields model or directly

o  selection: something
set the contents of my field; questionable

event handling
o  buttonPress: button x: x y: y view: aView

o  enableStateChanged

o  handlesButtonPress: button inView: aView

o  keyPress: key x: x y: y
select by first letter

focus handling
o  showFocus: explicit
the button got the keyboard focus
(either explicit, via tabbing; or implicit, by pointer movement)
- change any display attributes as req'd.

o  showNoFocus: explicit
the button lost the keyboard focus
(either explicit, via tabbing; or implicit, by pointer movement)
- change any display attributes as req'd.

o  subviewsInFocusOrder
none of my subviews should get he focus

o  wantsFocusWithButtonPress
we want the focus, in order to do selection via mouse wheel

initialization
o  initialize
(comment from inherited method)
what a hack...

o  initializeField
delegate mouseWheel events to myself

menu interaction
o  select: anIndex
sent from the popped menu, when an item was selected

private
o  getValueFromModel
kludge - try #value if aspect is the default and

queries
o  specClass
XXX no longer needed (inherited default works here)


Examples:


non-MVC use; set the list explicitly:
   |top comboList|

   top := StandardSystemView new.
   top extent:(300 @ 200).

   comboList := ComboListView in:top.
   comboList origin:(0.0 @ 0.0) corner:(1.0 @ 0.0).
   comboList bottomInset:(comboList preferredExtent y negated).

   comboList list:#('hello' 'world' 'this' 'is' 'st/x').
   top open.
a really, really long list (notice scrollup/down buttons at the top/bottom);
   |top comboList|

   top := StandardSystemView new.
   top extent:(300 @ 200).

   comboList := ComboListView in:top.
   comboList origin:(0.0 @ 0.0) corner:(1.0 @ 0.0).
   comboList bottomInset:(comboList preferredExtent y negated).

   comboList list:((1 to:100) collect:[:n | n printString]).
   top open.
with callBack:
   |top comboList|

   top := StandardSystemView new.
   top extent:(300 @ 200).

   comboList := ComboListView in:top.
   comboList origin:(0.0 @ 0.0) corner:(1.0 @ 0.0).
   comboList bottomInset:(comboList preferredExtent y negated).

   comboList list:#('hello' 'world' 'this' 'is' 'st/x').
   comboList action:[:selected | Transcript showCR:selected].
   top open.
with separating lines:
   |top comboList|

   top := StandardSystemView label:'fruit chooser'.
   top extent:(300 @ 200).

   comboList := ComboListView in:top.
   comboList origin:(0.0 @ 0.0) corner:(1.0 @ 0.0).
   comboList bottomInset:(comboList preferredExtent y negated).

   comboList label:'fruit'.
   comboList list:#('apples' 'bananas' 'grape' 'lemon' '-' 'margaritas').
   comboList action:[:selected | Transcript showCR:selected].
   top open
with values different from the label strings:
   |top comboList|

   top := StandardSystemView label:'fruit chooser'.
   top extent:(300 @ 200).

   comboList := ComboListView in:top.
   comboList origin:(0.0 @ 0.0) corner:(1.0 @ 0.0).
   comboList bottomInset:(comboList preferredExtent y negated).

   comboList label:'dummy'.
   comboList list:#('apples' 'bananas' 'grape' 'lemon' '-' 'margaritas').
   comboList selection:'apples'.
   comboList values:#(10 20 30 40 nil 50).
   comboList action:[:what | Transcript show:'you selected: '; showCR:what].
   top open
sometimes, you may like the index instead of the value: (notice, that the separating line counts, so you have to take care ...)
   |top comboList|

   top := StandardSystemView label:'fruit chooser'.
   top extent:(300 @ 200).

   comboList := ComboListView in:top.
   comboList origin:(0.0 @ 0.0) corner:(1.0 @ 0.0).
   comboList bottomInset:(comboList preferredExtent y negated).

   comboList label:'dummy'.
   comboList list:#('apples' 'bananas' 'grape' 'lemon' '-' 'margaritas').
   comboList selection:'apples'.
   comboList action:[:what | Transcript show:'you selected: '; showCR:what].
   comboList useIndex:true.
   top open
since the list is actually represented by a menuView, which itself is inheriting from listView, which itself can display things different from strings, arbitrary lists can be constructed: (see ListEntry, LabelAndIcon and Text classes)
   |top comboList l|

   top := StandardSystemView label:'fruit chooser'.
   top extent:(300 @ 200).

   comboList := ComboListView in:top.
   comboList origin:(0.0 @ 0.0) corner:(1.0 @ 0.0).
   comboList bottomInset:(comboList preferredExtent y negated).

   l := OrderedCollection new.
   l add:(Text string:'apples' color:Color red).
   l add:(Text string:'bananas' color:Color red).
   l add:(Text string:'grape' color:Color red).
   l add:(Text string:'lemon' color:Color red).
   l add:'='.
   l add:(Text string:'margaritas' color:Color green darkened darkened).
   l add:(Text string:'pina colada' color:Color green darkened darkened).
   l add:'='.
   l add:(Text string:'smalltalk' color:Color blue).
   l add:(Text string:'c++' color:Color blue).
   l add:(Text string:'eiffel' color:Color blue).
   l add:(Text string:'java' color:Color blue).
   comboList list:l.
   comboList values:#(apples bananas grape lemon 
              nil 
              'mhmh - so good' 'makes headache'
              nil
              'great' 'another headache' 'not bad' 'neat').
   comboList selection:'apples'.
   comboList action:[:what | Transcript show:'you selected: '; showCR:what].
   top open
with values different from the label strings:
   |top comboList|

   top := StandardSystemView label:'language chooser'.
   top extent:(300 @ 200).

   comboList := ComboListView in:top.
   comboList origin:(0.0 @ 0.0) corner:(1.0 @ 0.0).

   comboList list:( #(
              'usa'
              'uk'
              'france'
              'germany'       
              'italy'
             ) collect:[:country |
                          LabelAndIcon 
                              icon:(Image fromFile:'bitmaps/xpmBitmaps/countries/' , country , '.xpm')
                              string:country
                       ]
          ).
   comboList values:#(us england france germany italy).

   comboList action:[:what | Transcript show:'you selected: '; showCR:what].
   comboList bottomInset:(comboList preferredExtent y negated).
   top open
with a model (see in the inspector, how the index-holders value changes) the defaults are setup to allow a SelectionInList directly as model:
   |p model|

   model := SelectionInList with:#('apples' 'bananas' 'grape' 'lemon' 'margaritas').

   p := ComboListView label:'healthy fruit'.
   p model:model.
   p openAt:(Screen current center).
   model inspect
model provides selection; list is explicit:
   |model top b|

   model := 'foo' asValue.

   top := StandardSystemView new.
   top extent:(300 @ 200).

   b := ComboListView in:top.
   b origin:(0.0 @ 0.0) corner:(1.0 @ 0.0).
   b bottomInset:(b preferredExtent y negated).

   b list:#('hello' 'world' 'this' 'is' 'st/x').
   b model:model.

   top openModal.
   Transcript showCR:('comboBox''s value: ' , model value).
a comboListView and a SelectionInListView on the same model:
   |p slv model|

   model := SelectionInList with:#('apples' 'bananas' 'grape' 'lemon' 'margaritas').
   model selection:'apples'.

   p := ComboListView on:model.
   p openAt:(Screen current center).

   slv := SelectionInListView on:model.
   slv openAt:(Screen current center + (100@100)).
like above, using index:
   |p slv model|

   model := SelectionInList with:#('apples' 'bananas' 'grape' 'lemon' 'margaritas').
   model selection:'apples'.

   p := ComboListView on:model.
   p openAt:(Screen current center).

   slv := SelectionInListView on:model.
   slv openAt:(Screen current center + (100@100)).
two comboListViews on the same model, different aspects:
   |top panel p model|

   model := Plug new.
   model respondTo:#eat: with:[:val | Transcript showCR:'eat: ' , val].
   model respondTo:#drink: with:[:val | Transcript showCR:'drink: ' , val].
   model respondTo:#meals with:[#(taco burrito enchilada)].
   model respondTo:#drinks with:[#(margarita water corona)].

   top := StandardSystemView label:'meal chooser'.
   top extent:(150@150).
   panel := VerticalPanelView origin:0.0@0.0 corner:1.0@1.0 in:top.
   panel horizontalLayout:#fitSpace.

   p := ComboListView label:'meals'.
   p aspect:nil; model:model; listMessage:#meals; change:#eat:.
   panel add:p.

   p := ComboListView label:'drinks'.
   p aspect:nil; model:model; listMessage:#drinks; change:#drink:.
   panel add:p.

   top open
with separate list- and indexHolders:
   |p selectionHolder listHolder|

   listHolder := #('apples' 'bananas' 'grape' 'lemon' 'margaritas') asValue.
   selectionHolder := 'apples' asValue.

   p := ComboListView label:'healthy fruit'.
   p listHolder:listHolder.
   p model:selectionHolder.
   p openAt:(Screen current center).
   selectionHolder inspect
using different values:
   |p priceHolder listHolder prices priceField|

   listHolder := #('apples' 'bananas' 'grape' 'lemon' 'margaritas') asValue.
   prices := #(10 10 5 15 50).

   priceHolder := nil asValue.

   p := ComboListView new.
   p listHolder:listHolder.
   p model:priceHolder.
   p values:prices.
   p openAt:(Screen current center).

   priceField := EditField new.
   priceField readOnly:true.
   priceField model:(TypeConverter onNumberValue:priceHolder).
   priceField openAt:(Screen current center + (10@10)).
in a dialog:
   |model1 model2 dialog b|

   model1 := 'foo' asValue.
   model2 := 'bar' asValue.

   dialog := Dialog new.
   (dialog addTextLabel:'ComboList example:') adjust:#left.
   dialog addVerticalSpace.

   (b := dialog addComboListOn:model1 tabable:true).
   b list:#('fee' 'foe' 'foo').
   dialog addVerticalSpace.

   (b := dialog addComboListOn:model2 tabable:true).
   b list:#('bar' 'baz' 'baloo').
   dialog addVerticalSpace.

   dialog addOkButton.

   dialog open.

   Transcript showCR:('1st comboBox''s value: ' , model1 value).
   Transcript showCR:('2nd comboBox''s value: ' , model2 value).
Select condition
   |top comboList|

   top := StandardSystemView new.
   top extent:(300 @ 200).

   comboList := ComboListView in:top.
   comboList origin:(0.0 @ 0.0) corner:(1.0 @ 0.0).
   comboList bottomInset:(comboList preferredExtent y negated).

   comboList list:((1 to:100) collect:[:n | n printString]).
   comboList selectCondition:[:newValue | (Number readFrom:newValue) even].
   top open.


ST/X 7.2.0.0; WebServer 1.670 at bd0aa1f87cdd.unknown:8081; Thu, 28 Mar 2024 18:23:44 GMT