--- 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 $'
+! !