FontMenu.st
changeset 3399 a128a7f88840
parent 3398 7e778b89de59
child 3400 1af9bac368be
--- a/FontMenu.st	Fri May 16 19:13:03 2008 +0200
+++ b/FontMenu.st	Fri May 16 19:13:30 2008 +0200
@@ -1,3 +1,27 @@
+"
+ COPYRIGHT (c) 1995 by eXept Software AG
+              All Rights Reserved
+
+ This software is furnished under a license and may be used
+ only in accordance with the terms of that license and with the
+ inclusion of the above copyright notice.   This software may not
+ be provided or otherwise made available to, or used by, any
+ other person.  No title to or ownership of the software is
+ hereby transferred.
+"
+"{ Package: 'stx:libwidg2' }"
+
+MenuPanel subclass:#FontMenu
+	instanceVariableNames:'fontAspects fontNameSymbol enabledChannel allowSymbolicFonts
+		labelsAreEmphasized'
+	classVariableNames:''
+	poolDictionaries:''
+	category:'Interface-UIPainter'
+!
+
+!FontMenu class methodsFor:'documentation'!
+
+copyright
 "
  COPYRIGHT (c) 1995 by eXept Software AG
               All Rights Reserved
@@ -9,15 +33,318 @@
  other person.  No title to or ownership of the software is
  hereby transferred.
 "
-MenuPanel subclass:#FontMenu
-	instanceVariableNames:'fontAspects fontNameSymbol enabledChannel allowSymbolicFonts
-		labelsAreEmphasized'
-	classVariableNames:''
-	poolDictionaries:''
-	category:'Interface-UIPainter'
+
+
+!
+
+documentation
+"
+    FontMenu used by UIPainter
+
+    [author:]
+        Claus Atzkern
+
+    [see also:]
+        UIPainter
+        FontMenuSpec
+"
+
+
 !
 
+examples
+"
+    simple example
+                                                                                [exBegin]                                      
+    |top menu model|
 
+    top := StandardSystemView new.
+    top extent:250@200.
+    menu  := FontMenu origin:0.0@0.4 extent:1.0@30 in:top.
+    model := nil asValue.
+    menu model:model.
+    top open.
+    top waitUntilVisible.
+
+    [ |new old|
+
+      old := model value.
+      [ top shown] whileTrue:[
+        new := model value.
+        new ~= old ifTrue:[
+            old := new.
+            old notNil ifTrue:[ Transcript showCR:(old userFriendlyName) ]
+                      ifFalse:[ Transcript showCR:'---------' ]
+        ].
+        Delay waitForSeconds:0.2.
+      ]
+
+    ] forkAt:8.
+                                                                                [exEnd]
+"
+! !
+
+!FontMenu class methodsFor:'menu specs'!
+
+menu
+    "This resource specification was automatically generated
+     by the MenuEditor of ST/X."
+
+    "Do not manually edit this!! If it is corrupted,
+     the MenuEditor may not be able to read the specification."
+
+    "
+     MenuEditor new openOnClass:FontMenu andSelector:#menu
+     (Menu new fromLiteralArrayEncoding:(FontMenu menu)) startUp
+    "
+
+    <resource: #menu>
+
+    ^ 
+     #(Menu
+        (
+         (MenuItem
+            label: 'enabled'
+            itemValue: updateModel
+            translateLabel: true
+            indication: enabledChannel
+            labelImage: (ResourceRetriever SystemBrowser emptyIcon)
+          )
+         (MenuItem
+            enabled: enabledChannel
+            label: 'Family'
+            nameKey: fontFamily
+            translateLabel: true
+            isButton: true
+            submenu: 
+           (Menu
+              (
+               (MenuItem
+                  label: 'helvetica'
+                  itemValue: fontFamily:
+                  translateLabel: true
+                  argument: helvetica
+                )
+               (MenuItem
+                  label: 'courier'
+                  itemValue: fontFamily:
+                  translateLabel: true
+                  argument: courier
+                )
+               (MenuItem
+                  label: 'times'
+                  itemValue: fontFamily:
+                  translateLabel: true
+                  argument: times
+                )
+               (MenuItem
+                  label: 'clean'
+                  itemValue: fontFamily:
+                  translateLabel: true
+                  argument: clean
+                )
+               (MenuItem
+                  label: 'fixed'
+                  itemValue: fontFamily:
+                  translateLabel: true
+                  argument: fixed
+                )
+               (MenuItem
+                  label: 'lucida'
+                  itemValue: fontFamily:
+                  translateLabel: true
+                  argument: lucida
+                )
+               (MenuItem
+                  label: '-'
+                )
+               (MenuItem
+                  label: 'Other...'
+                  itemValue: launchFontFamilyDialog
+                  translateLabel: true
+                )
+               )
+              nil
+              nil
+            )
+          )
+         (MenuItem
+            enabled: enabledChannel
+            label: 'Face'
+            nameKey: fontFace
+            translateLabel: true
+            isButton: true
+            submenu: 
+           (Menu
+              (
+               (MenuItem
+                  label: 'bold'
+                  itemValue: fontFace:
+                  translateLabel: true
+                  argument: bold
+                )
+               (MenuItem
+                  label: 'medium'
+                  itemValue: fontFace:
+                  translateLabel: true
+                  argument: medium
+                )
+               (MenuItem
+                  label: '-'
+                )
+               (MenuItem
+                  label: 'Other...'
+                  itemValue: launchFontFaceDialog
+                  translateLabel: true
+                )
+               )
+              nil
+              nil
+            )
+          )
+         (MenuItem
+            enabled: enabledChannel
+            label: 'Style'
+            nameKey: fontStyle
+            translateLabel: true
+            isButton: true
+            submenu: 
+           (Menu
+              (
+               (MenuItem
+                  label: 'roman'
+                  itemValue: fontStyle:
+                  translateLabel: true
+                  argument: roman
+                )
+               (MenuItem
+                  label: 'italic'
+                  itemValue: fontStyle:
+                  translateLabel: true
+                  argument: italic
+                )
+               (MenuItem
+                  label: 'oblique'
+                  itemValue: fontStyle:
+                  translateLabel: true
+                  argument: oblique
+                )
+               (MenuItem
+                  label: '-'
+                )
+               (MenuItem
+                  label: 'Other...'
+                  itemValue: launchFontStyleDialog
+                  translateLabel: true
+                )
+               )
+              nil
+              nil
+            )
+          )
+         (MenuItem
+            enabled: enabledChannel
+            label: 'Size'
+            nameKey: fontSize
+            translateLabel: true
+            isButton: true
+            submenu: 
+           (Menu
+              (
+               (MenuItem
+                  label: '6'
+                  itemValue: fontSize:
+                  translateLabel: true
+                  argument: 6
+                )
+               (MenuItem
+                  label: '8'
+                  itemValue: fontSize:
+                  translateLabel: true
+                  argument: 8
+                )
+               (MenuItem
+                  label: '10'
+                  itemValue: fontSize:
+                  translateLabel: true
+                  argument: 10
+                )
+               (MenuItem
+                  label: '12'
+                  itemValue: fontSize:
+                  translateLabel: true
+                  argument: 12
+                )
+               (MenuItem
+                  label: '14'
+                  itemValue: fontSize:
+                  translateLabel: true
+                  argument: 14
+                )
+               (MenuItem
+                  label: '16'
+                  itemValue: fontSize:
+                  translateLabel: true
+                  argument: 16
+                )
+               (MenuItem
+                  label: '18'
+                  itemValue: fontSize:
+                  translateLabel: true
+                  argument: 18
+                )
+               (MenuItem
+                  label: '-'
+                )
+               (MenuItem
+                  label: 'Other...'
+                  itemValue: launchFontSizeDialog
+                  translateLabel: true
+                )
+               )
+              nil
+              nil
+            )
+          )
+         (MenuItem
+            enabled: enabledChannel
+            label: 'Encoding'
+            nameKey: fontEncoding
+            translateLabel: true
+            isButton: true
+            submenu: 
+           (Menu
+              (
+               (MenuItem
+                  label: 'latin-1'
+                  itemValue: fontEncoding:
+                  translateLabel: true
+                  argument: #'iso8859-1'
+                )
+               (MenuItem
+                  label: 'unicode'
+                  itemValue: fontEncoding:
+                  translateLabel: true
+                  argument: #'iso10646-1'
+                )
+               (MenuItem
+                  label: '-'
+                )
+               (MenuItem
+                  label: 'Other...'
+                  itemValue: launchFontEncodingDialog
+                  translateLabel: true
+                )
+               )
+              nil
+              nil
+            )
+          )
+         )
+        nil
+        nil
+      )
+! !
 
 !FontMenu methodsFor:'accessing'!
 
@@ -29,6 +356,48 @@
     allowSymbolicFonts := aBoolean.
 !
 
+fontDescription
+    "get font description
+    "
+    enabledChannel value ifFalse:[^ nil].
+
+  ^ FontDescription 
+        family:(fontAspects at:#fontFamily)
+        face:(fontAspects at:#fontFace)
+        style:(fontAspects at:#fontStyle)
+        size:(fontAspects at:#fontSize)
+        encoding:(fontAspects at:#fontEncoding)
+!
+
+fontDescription:aFontDesc
+    "set font description
+    "
+    |saveModel|
+
+    aFontDesc isNil ifTrue:[
+        enabledChannel value:false.
+        ^ self
+    ].
+
+    self disabledRedrawDo:[
+        saveModel := model.     "/ do not inform the model
+        model     := nil.
+
+        enabledChannel value:true.
+
+        (aFontDesc isSymbol or:[aFontDesc isString]) ifTrue:[
+            fontNameSymbol := aFontDesc.
+        ] ifFalse:[
+            self fontFamily:(aFontDesc family).
+            self fontFace:(aFontDesc face).
+            self fontStyle:(aFontDesc style).
+            self fontSize:(aFontDesc size).
+            self fontEncoding:(aFontDesc encoding ? #'iso10646-1').
+        ].
+        model := saveModel.
+    ]
+!
+
 labelsAreEmphasized
     ^ labelsAreEmphasized
 !
@@ -37,7 +406,162 @@
     labelsAreEmphasized := aBoolean.
 ! !
 
+!FontMenu methodsFor:'accessing-aspects'!
 
+fontAspectAt:key put:value
+    (value isNil or:[value == (fontAspects at:key)]) ifTrue:[
+        ^ self
+    ].
+    fontAspects at:key put:value.
+    (self itemAt:key) label:value.
+
+    self updateModel.
+!
+
+fontEncoding:anEncodingSymbol
+    ^ self fontAspectAt:#fontEncoding put:anEncodingSymbol
+!
+
+fontFace:aFace
+    ^ self fontAspectAt:#fontFace put:aFace
+!
+
+fontFamily:aFamily
+    ^ self fontAspectAt:#fontFamily put:aFamily
+!
+
+fontSize:aSize
+    ^ self fontAspectAt:#fontSize put:aSize
+!
+
+fontStyle:aStyle
+    ^ self fontAspectAt:#fontStyle put:aStyle
+!
+
+launchFontEncodingDialog
+    "launch dialog to get a font encoding"
+
+    |string|
+
+    string := EnterBox request:'Encoding: '.
+
+    string size ~~ 0 ifTrue:[
+        self fontEncoding:string asSymbol
+    ].
+!
+
+launchFontFaceDialog
+    "launch dialog to get a font face"
+
+    |string|
+
+    string := EnterBox request:'Face: '.
+
+    string size ~~ 0 ifTrue:[
+        self fontFace:string
+    ].
+!
+
+launchFontFamilyDialog
+    "launch dialog to get a font family"
+
+    |string|
+
+    string := EnterBox request:'Family: '.
+
+    string size ~~ 0 ifTrue:[
+        self fontFamily:string
+    ].
+!
+
+launchFontSizeDialog
+    "launch dialog to get a font size"
+
+    |size string|
+
+    string := EnterBox request:'size: '.
+
+    string size ~~ 0 ifTrue:[
+        size := SmallInteger readFrom:string onError:nil.
 
+        (size notNil and:[size >= 1 and:[size <= 128]]) ifTrue:[
+            self fontSize:size
+        ]
+    ].
+!
 
+launchFontStyleDialog
+    "launch dialog to get a font style"
 
+    |string|
+
+    string := EnterBox request:'Style: '.
+
+    string size ~~ 0 ifTrue:[
+        self fontFace:string
+    ].
+! !
+
+!FontMenu methodsFor:'accessing-channels'!
+
+enabledChannel
+    ^ enabledChannel
+!
+
+model:aValueHolder
+    "set my model"
+
+    super model:aValueHolder.
+    model ifNotNil:[
+        self updateFromModel
+    ].
+! !
+
+!FontMenu methodsFor:'change & update'!
+
+updateFromModel
+    self fontDescription:(model value)
+!
+
+updateModel
+    model ifNotNil:[
+        model value:(self fontDescription) withoutNotifying:self
+    ].
+! !
+
+!FontMenu methodsFor:'initialization'!
+
+destroy
+    "release dependencies"
+
+    self model:nil.
+    enabledChannel removeDependent:self.
+    super destroy.
+!
+
+initialize
+    "setup menu"
+
+    super initialize.
+
+    fontAspects    := IdentityDictionary new.
+    enabledChannel := false asValue.
+    allowSymbolicFonts := false.
+    labelsAreEmphasized := false.
+
+    #( #fontFamily #fontFace #fontStyle #fontSize #fontEncoding) do:[:k|
+        fontAspects at:k put:(nil asValue)
+    ].
+    self verticalLayout:false.
+    self menu:(self class menu).
+    enabledChannel := false asValue.
+    receiver := self.
+
+    self fontDescription:(self font).
+! !
+
+!FontMenu class methodsFor:'documentation'!
+
+version
+    ^ '$Header: /cvs/stx/stx/libwidg2/FontMenu.st,v 1.20 2008-05-16 17:13:30 cg Exp $'
+! !