FontMenu.st
changeset 412 a8ad581658ec
child 421 1e994c167558
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/FontMenu.st	Wed Jun 04 13:37:29 1997 +0200
@@ -0,0 +1,325 @@
+MenuPanel subclass:#FontMenu
+	instanceVariableNames:'model enabledChannel fontFamily fontFace fontStyle fontSize'
+	classVariableNames:''
+	poolDictionaries:''
+	category:'Interface-UIPainter'
+!
+
+!FontMenu class methodsFor:'documentation'!
+
+documentation
+"
+    FontMenu used by UIPainter
+
+    [see also:]
+        UIPainter
+        FontMenuSpec
+"
+
+
+!
+
+examples
+"
+    simple example
+                                                                                [exBegin]                                      
+    |top|
+
+    top := StandardSystemView new.
+    top extent:250@30.
+    self origin:0.0@0.0 corner:1.0@1.0 in:top.
+    top open.
+                                                                                [exEnd]
+"
+! !
+
+!FontMenu class methodsFor:'menu spec'!
+
+menu
+
+ ^ #(#Menu #(
+        (#MenuItem
+            #'label:' ''
+            #'indication:' false
+        )
+        (#MenuItem
+            #'label:' 'family'
+            #'value:' #fontFamily:
+            #'submenu:'
+               #(#Menu #( #(#MenuItem #'label:' 'helvetica' value:#helvetica )
+                          #(#MenuItem #'label:' 'courier'   value:#courier )
+                          #(#MenuItem #'label:' 'times'     value:#times )
+                          #(#MenuItem #'label:' 'clean'     value:#clean )
+                          #(#MenuItem #'label:' 'fixed'     value:#fixed )
+                          #(#MenuItem #'label:' 'lucida'     value:#lucida )
+                        )
+                        nil
+                        nil
+                )
+        )
+        (#MenuItem
+            #'label:' 'face'
+            #'value:' #fontFace:
+            #'submenu:'
+               #(#Menu #( #(#MenuItem #label: 'bold'   value:#bold )     
+                          #(#MenuItem #label: 'medium' value:#medium )
+                        )
+                        nil
+                        nil
+                )
+        )
+        (#MenuItem
+            #'label:' 'style'
+            #'value:' #fontStyle:
+            #'submenu:'
+               #(#Menu #( #(#MenuItem #label: 'roman'   value:#roman )     
+                          #(#MenuItem #label: 'italic'  value:#italic )
+                          #(#MenuItem #label: 'oblique' value:#oblique )
+                        )
+                        nil
+                        nil
+                )
+        )
+        (#MenuItem
+            #'label:' 'size'
+            #'value:' #fontSize:
+            #'submenu:'
+               #(#Menu #( #(#MenuItem #label: '6'  value:#6  )     
+                          #(#MenuItem #label: '8'  value:#8  )
+                          #(#MenuItem #label: '10' value:#10 )
+                          #(#MenuItem #label: '12' value:#12 )
+                          #(#MenuItem #label: '14' value:#14 )
+                          #(#MenuItem #label: '16' value:#16 )
+                          #(#MenuItem #label: '18' value:#18 )
+                          #(#MenuItem #label: 'other ...' value:#size)
+                        )
+                        nil
+                        nil
+                )
+        )
+    )
+    #( 1 )
+    nil
+    ) decodeAsLiteralArray
+! !
+
+!FontMenu methodsFor:'accept'!
+
+accept:anItem
+    "accept current selected item
+    "
+    |item selector arg|
+
+    selector := self selection value.
+
+    (item := super accept:anItem) isNil ifTrue:[
+        ^ self
+    ].
+
+    (arg := item value) isNil ifTrue:[
+        model notNil ifTrue:[
+            enabledChannel value ifTrue:[
+                arg := self fontDescription
+            ].
+            model value:arg
+        ].
+      ^ self
+    ].
+
+    (arg == #size and:[(arg := self readSize) isNil]) ifTrue:[
+        ^ self
+    ].
+
+    (self perform:selector with:arg) ifTrue:[
+        model notNil ifTrue:[model value:(self fontDescription)]
+    ]
+!
+
+readSize
+    "read a size; in case of cancel nil is returned otherwise a number.
+    "
+    |size string|
+
+    string := EnterBox request:'size: '.
+
+    string size ~~ 0 ifTrue:[
+        size := SmallInteger readFrom:string onError:nil.
+
+        (size notNil and:[size >= 6 and:[size <= 48]]) ifTrue:[
+            ^ size
+        ]
+    ].
+  ^ nil
+! !
+
+!FontMenu methodsFor:'accessing'!
+
+fontDescription
+    "get font description
+    "
+  ^ FontDescription family:fontFamily face:fontFace style:fontStyle size:fontSize
+!
+
+fontDescription:aFontDesc
+    "set font description
+    "
+    |desc|
+
+    aFontDesc isNil ifTrue:[
+        enabledChannel value:false.
+    ] ifFalse:[
+        self disabledRedrawDo:[
+            enabledChannel value:true.
+
+            self fontFamily:(aFontDesc family).
+            self   fontFace:(aFontDesc face).
+            self  fontStyle:(aFontDesc style).
+            self   fontSize:(aFontDesc size).
+        ]
+    ]
+!
+
+fontFace
+    "get face, a string
+    "
+    ^ fontFace
+!
+
+fontFace:aFace
+    "set face, a string; update item.
+     if the face changed true is returned otherwise nil
+    "
+    (aFace notNil and:[aFace ~= fontFace]) ifTrue:[
+        (self itemAt:#fontFace:) label:(fontFace := aFace).
+      ^ true
+    ].
+  ^ false
+!
+
+fontFamily
+    "get family, a string
+    "
+    ^ fontFamily
+!
+
+fontFamily:aFamily
+    "set family, a string; update item
+     if the family changed true is returned otherwise nil
+    "
+    (aFamily notNil and:[aFamily ~= fontFamily]) ifTrue:[
+        (self itemAt:#fontFamily:) label:(fontFamily := aFamily).
+      ^ true
+    ].
+  ^ false
+
+!
+
+fontSize
+    "get size, a number
+    "
+  ^ fontSize
+!
+
+fontSize:aSize
+    "set size, a number; update item
+     if the size changed true is returned otherwise nil
+    "
+    |label|
+
+    (aSize notNil and:[aSize ~= fontSize]) ifTrue:[
+        fontSize := aSize.
+        (self itemAt:#fontSize:) label:(aSize printString).
+      ^ true
+    ].
+  ^ false
+!
+
+fontStyle
+    "get style, a string
+    "
+  ^ fontStyle
+
+!
+
+fontStyle:aStyle
+    "set style, a string; update item
+     if the style changed true is returned otherwise nil
+    "
+    (aStyle notNil and:[aStyle ~= fontStyle]) ifTrue:[
+        (self itemAt:#fontStyle:) label:(fontStyle := aStyle).
+      ^ true
+    ].
+  ^ false
+! !
+
+!FontMenu methodsFor:'accessing channels'!
+
+model
+    "get my model
+    "
+  ^ model
+!
+
+model:aValueHolder
+    "set my model
+    "
+    model notNil ifTrue:[
+        model removeDependent:self. 
+    ].
+    model := aValueHolder.
+
+    model notNil ifTrue:[
+        model addDependent:self.
+        self fontDescription:(model value)
+    ].
+! !
+
+!FontMenu methodsFor:'change & update'!
+
+update:something with:aParameter from:changedObject
+    "one of my models changed its value
+    "
+    changedObject == model ifTrue:[
+         ^ self fontDescription:(model value)
+    ].
+    super update:something with:aParameter from:changedObject
+
+! !
+
+!FontMenu methodsFor:'initialization'!
+
+destroy
+    "release dependencies
+    "
+    self model:nil.
+    super destroy.
+
+!
+
+initialize
+    "setup menu
+    "
+    super initialize.
+    self verticalLayout:false.
+    self fitFirstPanel:false.
+    self menu:(self class menu).
+    enabledChannel := false asValue.
+
+    self fontDescription:(self font).
+
+    self do:[:anItem|
+        anItem hasIndication ifFalse:[
+            anItem enabled:enabledChannel
+        ] ifTrue:[
+            anItem indication:enabledChannel
+        ]
+    ].
+
+
+! !
+
+!FontMenu class methodsFor:'documentation'!
+
+version
+    ^ '$Header: /cvs/stx/stx/libwidg2/FontMenu.st,v 1.1 1997-06-04 11:37:29 ca Exp $'
+! !