|
Class: PrintConverter
Object
|
+--PrintConverter
- Package:
- stx:libview2
- Category:
- Interface-Support
- Version:
- rev:
1.23
date: 2018/05/06 11:12:45
- user: cg
- file: PrintConverter.st directory: libview2
- module: stx stc-classLibrary: libview2
- Author:
- Claus Gittinger
printConverters can be used with labels and editFields to convert
an object to/from some printed representation.
Conversion is done via two blocks, which can be set at instance
creation time - either as custom blocks or as one of the
standard conversions.
There are a number of standard setups for common conversions;
if none of them fits your needs,
create a custom converter by defining its two conversion blocks.
Notice: this class was implemented using protocol information
from alpha testers - it may not be complete or compatible to
the corresponding ST-80 class. If you encounter any incompatibilities,
please forward a note to the ST/X team.
instance creation
-
new
-
utilities
-
print: aNumber formattedBy: formatString
-
take the digits of aNumbers printString, and squash them
into formatString, where #-characters are replaced by
successive characters from the printString.
Warning: use with care - it does not check for decimal points etc.
the printString of aNumber must have enough digits for all
#-characters to be replaced.
Therefore, precheck the numbers value and use appropriate format
strings then.
For number formatting, see also: printfPrintString: implementations.
usage example(s):
PrintConverter print:'123456789' formattedBy:'US$ ###,###.##'
fails for:
PrintConverter print:'1234' formattedBy:'US$ ###,###.##'
invalid string for:
PrintConverter print:'123456789' formattedBy:'US$ ###'
|
accessing
-
type
-
return the type if it's one of the standard converters,
#number, #string etc. nil otherwise
converting
-
printStringFor: aValue
-
sent when an inputField wants a models value to be converted to a string
for display
-
readValueFrom: aString
-
sent when an inputField wants a string to be converted to a value
to be returned as its contents value
initialization
-
initFor: aTypeSymbol
-
initialize to convert to/from objects as specified by aTypeSymbol,
which may be one of #number, #string, #symbol, #date or #password ...
-
initForDate
-
initialize to convert to/from a date
- if the string is empty or invalid, convert to the current date
-
initForDateOrNil
-
initialize to convert to/from a date
- if the string is empty or invalid, convert to nil
-
initForFloat
-
initialize to convert to/from an float
- if the string is empty or invalid, convert to 0
-
initForFloatWithPrecision: nDigits
-
initialize to convert to/from an float with nDigits after the decimal point
(truncating remaining digits).
- if the string is empty or invalid, convert to 0
-
initForInteger
-
initialize to convert to/from an integer
- if the string is empty or invalid, convert to 0
-
initForIntegerOrNil
-
initialize to convert to/from an integer
- if the string is empty or invalid, convert to nil
-
initForNumber
-
initialize to convert to/from a number
- if the string is empty or invalid, convert to 0
-
initForNumberOrNil
-
initialize to convert to/from a number
- if the string is empty or invalid, convert to nil
-
initForString
-
initialize for a string - this is trivial
-
initForTime
-
initialize to convert to/from a time
- if the string is empty or invalid, convert to the current time
-
initForTimeOrNil
-
initialize to convert to/from a time
- if the string is empty or invalid, convert to nil
-
initForYesNo
-
initialize to convert a 'yes'/'no' string to/from a boolean
The string is supposed to be in the current Language
(i.e. if german, ja/nein has to be entered.
Invalid entries are converted to false.
-
toPrint: printBlock toRead: readBlock
-
initialize to convert using two custom blocks.
printBlock is supposed to get the objects value as argument,
and to return a string.
readBlock is supposed to get a string as argument, and return
the corresponding object.
stupid examples:
convert date <-> string:
|conv|
conv := (PrintConverter new)
toPrint:[:date | date printString]
toRead:[:string | Date readFromString:string].
(conv printStringFor:(Date today)) inspect.
(conv readValueFrom:(Date today printString)) inspect
|
convert number <-> string:
|conv|
conv := (PrintConverter new) initForNumber.
(conv printStringFor:12345) inspect.
(conv readValueFrom:'12345') inspect
|
convert boolean <-> string:
|conv|
conv := (PrintConverter new) initForYesNo.
(conv printStringFor:true).
(conv printStringFor:false).
(conv readValueFrom:'yes').
(conv readValueFrom:'no').
'if language is #de:'.
(conv readValueFrom:'ja').
(conv readValueFrom:'nein')
|
concrete examples:
convert in an inputField:
|dialog field|
dialog := Dialog new.
dialog addTextLabel:'a number (and only numbers):'.
dialog addVerticalSpace.
field := dialog addInputFieldOn:(0 asValue).
field converter:(PrintConverter new initForNumber).
field immediateAccept:true.
dialog addOkButton.
dialog open.
dialog accepted ifTrue:[
Transcript showCR:field editValue
]
|
convert a models value for a label:
|top v1 v2 l1 l2|
v1 := 0 asValue.
v2 := Date today asValue.
top := StandardSystemView new.
top extent:200@200.
l1 := Label origin:0.0@0.0 corner:1.0@0.5 in:top.
l1 converter:(PrintConverter new initForInteger).
l1 model:v1; labelMessage:#value; aspect:#value.
l1 level:-1; inset:10.
l2 := Label origin:0.0@0.5 corner:1.0@1.0 in:top.
l2 converter:(PrintConverter new initForDate).
l2 model:v2; labelMessage:#value; aspect:#value.
l2 level:-1; inset:10.
top open.
'now, change the values ...'.
[
1 to:50 do:[:i|
v1 value:(v1 value + 1).
v2 value:(v2 value addDays:1).
(Delay forSeconds:0.5) wait
]
] fork
|
convert a models value for a label with limited precision
float conversion:
|top v l1 l2|
v := 0.0 asValue.
top := StandardSystemView new.
top extent:200@200.
l1 := Label origin:0.0@0.0 corner:1.0@0.5 in:top.
l1 converter:(PrintConverter new initForFloat).
l1 model:v; labelMessage:#value; aspect:#value.
l1 level:-1; inset:10.
l2 := Label origin:0.0@0.5 corner:1.0@1.0 in:top.
l2 converter:(PrintConverter new initForFloatWithPrecision:2).
l2 model:v; labelMessage:#value; aspect:#value.
l2 level:-1; inset:10.
top open.
'now, change the values ...'.
[
1 to:100 do:[:i|
v value:(v value + 0.005).
(Delay forSeconds:0.5) wait
]
] fork
|
a custom converter, converting a number to either 'odd'
or 'even' strings (we only need a one-way converter for labels):
|top v l1 l2|
v := 0 asValue.
top := StandardSystemView new.
top extent:200@200.
l1 := Label origin:0.0@0.0 corner:1.0@0.5 in:top.
l1 converter:(PrintConverter new initForInteger).
l1 model:v; labelMessage:#value; aspect:#value.
l1 level:-1; inset:10.
l2 := Label origin:0.0@0.5 corner:1.0@1.0 in:top.
l2 converter:(PrintConverter
new
toPrint:[:num | num even ifTrue:['even']
ifFalse:['odd']]
toRead:[:string | ]).
l2 model:v; labelMessage:#value; aspect:#value.
l2 level:-1; inset:10.
top open.
'now, change the values ...'.
[
1 to:100 do:[:i|
v value:(v value + 1).
(Delay forSeconds:0.5) wait
]
] fork
|
see more examples in the EditField examples.
|