FontPanel.st
author Claus Gittinger <cg@exept.de>
Fri, 20 Feb 2004 11:45:27 +0100
changeset 2895 df3a2c63e5f5
parent 2890 2a5804121c67
child 2896 7cb365b7d75c
permissions -rw-r--r--
*** empty log message ***

"
 COPYRIGHT (c) 1991 by Claus Gittinger
	      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:libwidg' }"

DialogBox subclass:#FontPanel
	instanceVariableNames:'previewField listOfEncodings familyList faceList sizeList
		revertButton currentFamily currentFace currentStyle
		currentFaceAndStyle currentSize currentEncoding selectedFont
		nameLabel encodingFilter encodingLabel filter encoding'
	classVariableNames:''
	poolDictionaries:''
	category:'Views-DialogBoxes'
!

!FontPanel class methodsFor:'documentation'!

copyright
"
 COPYRIGHT (c) 1991 by Claus Gittinger
	      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.
"


!

documentation
"
    this class implements a font chooser.

    Notice: 
        this is a very old dialog; 
        it was written before the UI-framework was available and is completely
        setup manually (initialize method).
        Therefore, it desperately asks to be rewritten using the UIPainter...

    [author:]
        Claus Gittinger

    [see also:]
        Font FontDescription
        View Dialog
"
!

examples
"
    very simple:
                                                                        [exBegin]
        |font|
        
        font := FontPanel fontFromUser.
        Transcript showCR:font
                                                                        [exEnd]


    with initial font:
                                                                        [exBegin]
        |font|

        font := FontPanel 
                    fontFromUserInitial:(Font 
                                            family:'courier'
                                            size:12).
        Transcript showCR:font
                                                                        [exEnd]


    with initial font & title:
                                                                        [exBegin]
        |font|

        font := FontPanel 
                    fontFromUserInitial:(Font 
                                            family:'courier'
                                            size:12)
                                  title:'select a fooBar font'.
        Transcript showCR:font
                                                                        [exEnd]


    full setup; setting a filter to only present iso fonts
    and callBack action:
                                                                        [exBegin]

        |panel|

        panel := FontPanel new.
        panel label:'hi there - which iso font ?'.
        panel filter:[:fd | fd encoding notNil
                            and:[fd encoding startsWith:'iso']].
        panel action:[:family :face :style :size | 
                        Transcript showCR:'family:' , family.
                        Transcript showCR:'face:' , face.
                        Transcript showCR:'style:' , style.
                        Transcript showCR:'size:' , size printString.
                     ].
        panel open
                                                                        [exEnd]
"
! !

!FontPanel class methodsFor:'defaults'!

defaultExtent
    "return the default extent of my instances.
     The value returned here is usually ignored, and
     the value from preferredExtent taken instead."

    ^ (Screen current pixelPerMillimeter * (150 @ 100)) rounded

    "Modified: 22.4.1996 / 23:36:19 / cg"
!

defaultJIS0201SampleString
    "return the sample jis preview text"

    ^ ('The quick brown fox
jumps over the lazy dog

ABCDEFGHIJKLMNOPQRSTUVWXYZ
abcdefghijklmnopqrstuvwxyz
1234567890
!!@#$%^&*(){}[]:"~;,./<>?

')
!

defaultJISSampleString
    "return the sample jis preview text"

    ^ CharacterEncoder 
        encodeString:(
'The quick brown fox
jumps over the lazy dog

ABCDEFGHIJKLMNOPQRSTUVWXYZ
abcdefghijklmnopqrstuvwxyz
1234567890
!!@#$%^&*(){}[]:"~;,./<>?

' ,
(UnicodeString fromString:(#(16r65E5 16r672C 16r8A9E) collect:[:c | Character value:c]))
        )
        from:'unicode'
        into:'jisx0208.1983-0'
!

defaultLatin1SampleString
    "return the sample latin1 preview text"

    |t|

    Smalltalk language == #de ifTrue:[
        t := 'Franz jagt im komplett verwahrlosten Taxi
quer durch Bayern'.
    ] ifFalse:[
        t := 'The quick brown fox
jumps over the lazy dog'.
    ].
    t := t , '

ABCDEFGHIJKLMNOPQRSTUVWXYZ
abcdefghijklmnopqrstuvwxyz
1234567890
!!@#$%^&*(){}[]:"~;,./<>?
' , 
(Character value:16rE4) asString ,    "/ umlaut a
(Character value:16rF6) asString ,    "/ umlaut o
(Character value:16rFC) asString ,    "/ umlaut u
(Character value:16rC4) asString ,    "/ umlaut A
(Character value:16rD6) asString ,    "/ umlaut O
(Character value:16rDC) asString ,    "/ umlaut U
(Character value:16rDF) asString ,    "/ sz
(Character value:233) asString ,      "/ e-degu
(Character value:232) asString ,      "/ e-grave
(Character value:234) asString ,      "/ e-circonflex
(Character value:197) asString ,      "/ A
(Character value:169) asString ,      "/ copyright
(Character value:164) asString.       "/ euro
    ^ t

    "Modified: 29.4.1996 / 09:46:19 / cg"
!

defaultUnicodeSampleString
    "return the sample unicode preview text"

    |t|

    Smalltalk language == #de ifTrue:[
        t := 'Franz jagt im komplett verwahrlosten Taxi
quer durch Bayern'.
    ] ifFalse:[
        t := 'The quick brown fox
jumps over the lazy dog'.
    ].
    t := t , '

ABCDEFGHIJKLMNOPQRSTUVWXYZ
abcdefghijklmnopqrstuvwxyz
1234567890
!!@#$%^&*(){}[]:"~;,./<>?
diaresis: ' , 
(Character value:16rE4) asString ,    "/ umlaut a
(Character value:16rF6) asString ,    "/ umlaut o
(Character value:16rFC) asString ,    "/ umlaut u
(Character value:16rC4) asString ,    "/ umlaut A
(Character value:16rD6) asString ,    "/ umlaut O
(Character value:16rDC) asString ,    "/ umlaut U
(Character value:16rDF) asString ,    "/ sz
'
accent: ' ,
(Character value:233) asString ,      "/ e-degu
(Character value:232) asString ,      "/ e-grave
(Character value:234) asString ,      "/ e-circonflex
(Character value:197) asString ,      "/ A
(Character value:169) asString ,       "/ copyright
'
cyrillic: ' ,
(UnicodeString fromString:(#(16r420 16r443 16r441 16r441 16r43A 16r43E) collect:[:c | Character value:c])) ,
'
greek: ' ,
(UnicodeString fromString:(#(16r395 16r3BB 16r3BB 16r3B7 16r3BD 16r3B9 16r3BA 16r3AC) collect:[:c | Character value:c])) ,
'
japanese: ' ,
(UnicodeString fromString:(#(16r65E5 16r672C 16r8A9E) collect:[:c | Character value:c])) ,
'
'.
    ^ t

    "Modified: 29.4.1996 / 09:46:19 / cg"
! !

!FontPanel class methodsFor:'menu specs'!

previewMenu
    "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:FontPanel andSelector:#previewMenu
     (Menu new fromLiteralArrayEncoding:(FontPanel previewMenu)) startUp
    "

    <resource: #menu>

    ^ 
     #(Menu
        (
         (MenuItem
            label: 'Copy'
            itemValue: previewCopySelection
            translateLabel: true
          )
         (MenuItem
            label: '-'
          )
         (MenuItem
            label: 'Show Character Set'
            itemValue: previewShowCharacterSet
            translateLabel: true
          )
         (MenuItem
            label: 'Show Character Set (Using xfd)'
            itemValue: previewShowCharacterSetUsingXFD
            translateLabel: true
            isVisible: false
          )
         )
        nil
        nil
      )
! !

!FontPanel class methodsFor:'startup'!

fontFromUser
    "open a fontPanel and return the selected font, or nil
     if abort is pressed"

    ^ self fontFromUserInitial:nil

    "
     FontPanel fontFromUser
    "

    "Modified: 27.2.1996 / 00:51:59 / cg"
!

fontFromUserInitial:aFont
    "open a fontPanel showing aFont initially,
     and return the selected font, or nil if abort is pressed"

    ^ self fontFromUserInitial:aFont title:nil

    "
     FontPanel fontFromUserInitial:(Font family:'courier' size:12)
    "

    "Created: 27.2.1996 / 00:51:44 / cg"
    "Modified: 29.4.1996 / 09:45:52 / cg"
!

fontFromUserInitial:aFont title:someTitle
    "open a fontPanel with title and return the selected font, 
     or nil if abort is pressed"

    ^ self fontFromUserInitial:aFont title:someTitle filter:nil

    "
     FontPanel fontFromUserInitial:(Font family:'courier' size:12) title:'select some font'
    "

    "Created: 27.2.1996 / 00:59:46 / cg"
    "Modified: 29.4.1996 / 09:45:34 / cg"
!

fontFromUserInitial:initialFont title:someTitle filter:aFilterBlock
    "open a fontPanel with title and font-filter
     and return the selected font, or nil if abort is pressed"

    ^ self fontFromUserInitial:initialFont title:someTitle filter:aFilterBlock encoding:nil

    "
     FontPanel fontFromUserInitial:(Font family:'courier' size:12) title:'select some font'
    "

    "Created: 27.2.1996 / 00:59:46 / cg"
    "Modified: 10.4.1997 / 09:53:03 / cg"
!

fontFromUserInitial:initialFont title:someTitle filter:aFilterBlock encoding:encoding
    "open a fontPanel with title and font-filter
     and return the selected font, or nil if abort is pressed"

    |fontPanel selectedFont|

    fontPanel := FontPanel new.
    fontPanel filter:aFilterBlock.
    someTitle notNil ifTrue:[
        fontPanel label:someTitle
    ].
    fontPanel action:[:aFontDescription | selectedFont := aFontDescription].
    initialFont notNil ifTrue:[
        fontPanel initialFont:initialFont.
    ].
    encoding notNil ifTrue:[
        fontPanel encoding:encoding.
    ].

    fontPanel showAtPointer.
    fontPanel destroy.
    ^ selectedFont

    "
     FontPanel fontFromUserInitial:(Font family:'courier' size:12) title:'select some font'
    "

    "Created: 27.2.1996 / 00:59:46 / cg"
    "Modified: 10.4.1997 / 09:53:03 / cg"
! !

!FontPanel methodsFor:'accessing'!

action:aFourArgBlock
    "set the action to be evaluated on ok.
     The block will be evaluated with family, face, style, size and encoding."

    okAction := aFourArgBlock

    "Modified: 10.4.1997 / 09:49:58 / cg"
!

encoding:aPattern
    "set the encoding goal"

    encoding := aPattern.
    encodingFilter contents:encoding.

    self encodingFilterSelected:encoding.
    shown ifTrue:[
        self updateFamilyList
    ].

    "Created: 29.2.1996 / 04:05:31 / cg"
    "Modified: 29.4.1996 / 09:40:18 / cg"
!

filter:aOneArgBlock
    "set a filter; if non-nil, only fonts for which the filterBlock
     returns true will be offered"

    filter := aOneArgBlock.
    familyList list:nil.
    shown ifTrue:[
        self updateFamilyList
    ].

    "Created: 27.2.1996 / 01:40:08 / cg"
    "Modified: 29.4.1996 / 09:40:49 / cg"
!

initialFont:aFont
    "set the font to be selected initially"

    |encoding|

    selectedFont := aFont.
    encoding := aFont encoding.    
"/ self halt.
    encodingFilter contents:encoding.
    self encodingFilterSelected:encoding.
    self showSelectedFont.
    self showPreview

    "Modified: 23.2.1996 / 00:51:32 / cg"
! !

!FontPanel methodsFor:'initialization'!

initialize
    |familyLabel faceLabel sizeLabel panel fontBrowserView v1 v2 v3
     mm fH eH l box showFontNameLabel|

    super initialize.

    showFontNameLabel := device platformName ~= 'WIN32'.

    mm := ViewSpacing.

    self addAbortAndOkButtons.

    panel := View origin:0.0@0.0 corner:1.0@1.0 in:self.
    panel bottomInset:(buttonPanel preferredExtent y 
                        + (mm*3) 
                        + (showFontNameLabel ifTrue:24 ifFalse:0) ).

    label := resources string:'Font dialog'.

    box := HorizontalPanelView in:panel.
    box horizontalLayout:#leftFit.
    box origin:0.0@1.0 corner:0.6@1.0.

    l := Label label:(resources string:'Encoding:') in:box.
    l borderWidth:0.
    l adjust:#left.

    encodingFilter := ComboBoxView in:box.
    encodingFilter level:-1.
    encodingFilter contents:'*'.
    encodingFilter list:(self listOfEncodingsInFilterCombo).
    encodingFilter action:[:pattern | self encodingFilterSelected:pattern].
    encodingFilter immediateAccept:true.
    encodingFilter font:l font.
    encodingFilter editor font:l font.

    eH := encodingFilter preferredExtent y.
    box topInset:(eH negated-1); horizontalInset:mm.

"/    encodingFilter acceptOnReturn:true.
"/    encodingFilter acceptOnTab:true.
"/    encodingFilter acceptOnLeave:true.
"/    encodingFilter acceptOnLostFocus:true.
"/    encodingFilter acceptOnPointerLeave:true.

    encodingLabel := Label label:' ' in:panel.
    "/ eH := encodingLabel preferredExtent y.
    encodingLabel origin:0.6@1.0 corner:1.0@1.0.
    encodingLabel topInset:(eH negated); horizontalInset:mm.
    encodingLabel level:0; adjust:#left.
    encodingLabel adjust:#right.

    showFontNameLabel ifTrue:[
        nameLabel := Label label:'' in:self.
        nameLabel origin:0.0@1.0 corner:1.0@1.0.
        nameLabel bottomInset:(buttonPanel preferredExtent y + (mm*2)).
        nameLabel topInset:(buttonPanel preferredExtent y + (mm*2) + 24) negated; horizontalInset:mm.
        nameLabel level:0; adjust:#left.
        nameLabel font:(FontDescription family:'helvetica' face:'medium' style:'roman' size:9).
    ].

    previewField := HVScrollableView for:TextView in:panel.
    previewField origin:0.0@0.0 corner:1.0@0.4.
    previewField autoHideScrollBars:true.
    previewField := previewField scrolledView.
    previewField inset:mm.

    self is3D ifTrue:[
        previewField level:-1.
    ] ifFalse:[
        previewField borderWidth:1.
    ].

    fontBrowserView := View origin:0.0@0.4 corner:1.0@1.0 in:panel.
    fontBrowserView bottomInset:(eH + mm).

    v1 := View origin:0.0@0.0 corner:0.4@1.0 in:fontBrowserView.

    familyLabel := Label label:(resources string:'Family') in:v1.
    familyLabel borderWidth:0.
    familyLabel origin:(0.0 @ 0.0) extent:(1.0 @ nil).
    fH := familyLabel preferredExtent y.

    familyList := ScrollableView for:SelectionInListView in:v1.
    familyList origin:(0.0 @ 0.0) corner:(1.0 @ 1.0).
    familyList inset:mm.
    familyList topInset:fH.

    familyList := familyList scrolledView.
    self makeTabable:familyList.

    v2 := View origin:0.4@0.0 corner:0.8@1.0
                   in:fontBrowserView.

    faceLabel := Label label:(resources string:'Typeface') in:v2.
    faceLabel borderWidth:0.
    faceLabel origin:(0.0 @ 0.0) extent:(1.0 @ nil).

    faceList := ScrollableView for:SelectionInListView in:v2.
    faceList origin:(0.0 @ 0.0) corner:(1.0 @ 1.0).
    faceList inset:mm.
    faceList topInset:fH.
    faceList := faceList scrolledView.
    self makeTabable:faceList.

    v3 := View origin:0.8@0.0 corner:1.0@1.0 in:fontBrowserView.

    sizeLabel := Label label:(resources string:'Size') in:v3.
    sizeLabel borderWidth:0.
    sizeLabel origin:(0.0 @ 0.0)extent:(1.0 @ nil).

    sizeList := ScrollableView for:SelectionInListView in:v3.
    sizeList origin:(0.0 @ 0.0) corner:(1.0 @ 1.0).
    sizeList inset:mm.
    sizeList topInset:fH.
    sizeList := sizeList scrolledView.
    self makeTabable:sizeList.

    familyList action:[:lineNr | self familySelected:(familyList selectionValue)].
    faceList action:[:lineNr | self faceSelected:(faceList selectionValue)].
    sizeList action:[:lineNr | self sizeSelected:(sizeList selectionValue)].

    previewField menuHolder:self previewMenu.

    "
     FontPanel new showAtPointer
    "

    "Modified: 31.5.1996 / 22:01:45 / cg"
!

listOfEncodingsInFilterCombo
    |availableEncodings listPresentedToUser|

    listOfEncodings := OrderedCollection new.
    device platformName = 'WIN32' ifTrue:[
        listOfEncodings
            addAll:
                #(
                    '*'
                    'ANSI'
                    nil
                ).
    ] ifFalse:[
        listOfEncodings
            addAll:
                #(
                    '*'
                    'iso8859*'
                    'iso10646-1'
                    'jis*'
                    nil
                ).
    ].

    availableEncodings := Set new.
    device listOfAvailableFonts do:[:f | availableEncodings add:(f encoding ? '?')].
    availableEncodings := availableEncodings asSortedCollection.
    listOfEncodings addAll:availableEncodings.

    listPresentedToUser := listOfEncodings collect:[:enc |
                            |encoder userFriendlyName|

                            enc notNil ifTrue:[
                                encoder := CharacterEncoder encoderFor:enc ifAbsent:nil.
                                encoder notNil ifTrue:[
                                    userFriendlyName := encoder userFriendlyNameOfEncoding.
                                ].
                            ].
                            (userFriendlyName notNil and:[userFriendlyName ~= enc]) ifTrue:[
                                enc , ' (' , userFriendlyName , ')'
                            ] ifFalse:[
                                enc
                            ]
                          ].
    ^ listPresentedToUser.
!

postRealize
    "kludge for sco - xlsfont fails sometimes - try again here"

    self updateFamilyList.
    super postRealize

    "Modified: 27.2.1996 / 01:40:47 / cg"
    "Created: 24.7.1997 / 18:12:42 / cg"
!

previewMenu
    <resource: #programMenu >

    |menu|

    menu :=  Menu new fromLiteralArrayEncoding:self class previewMenu.
    menu findGuiResourcesIn:self.
    menu receiver:self.

    OperatingSystem isUNIXlike ifTrue:[
        (menu menuItemWithValue:#previewShowCharacterSetUsingXFD) isVisible: true
    ].
    ^ menu
! !

!FontPanel methodsFor:'private'!

clearPreview
    "clear the preview subview"

    shown ifTrue:[
        previewField contents:nil.
        encodingLabel label:''.
    ].

    "Created: 17.4.1996 / 15:19:16 / cg"
    "Modified: 11.8.1997 / 03:01:42 / cg"
!

extractFaceAndStyleFrom:aString
    "given a string, extract currentFace and currentStyle"

    |index|

    index := aString indexOf:$-.
    (index ~~ 0) ifTrue:[
        currentFaceAndStyle := aString.
        currentFace := aString copyTo:(index - 1).
        currentStyle := aString copyFrom:(index + 1)
    ]

    "Modified: 29.4.1996 / 09:41:47 / cg"
!

showPreview
    "show the preview text"

    |font deviceFont enc s allFonts fonts fontName|

    self clearPreview.

    "
     show a wait cursor: for some fonts (kanji etc) the
     X-server needs quite some time to load the font
    "
    self withWaitCursorDo:[
        allFonts := device 
                    fontsInFamily:(currentFamily ? '*')
                    face:(currentFace ? '*')
                    style:(currentStyle ? '*')
                    filtering:filter.

        fonts := allFonts select:[:f | f size = currentSize].
        fonts notEmpty ifTrue:[
            font := fonts anElement.
        ] ifFalse:[
            "/ mhmh:
            "/   size=0 is returned for scalable fonts. 
            "/   Any size is possible.
            "/
            fonts := allFonts select:[:f | f size = 0].
            fonts notEmpty ifTrue:[
                font := Font family:currentFamily 
                          face:currentFace 
                          style:currentStyle
                          size:currentSize      
                          encoding:(fonts anElement encoding).
            ]    
        ].

        font notNil ifTrue:[
            deviceFont := font onDevice:device.
            enc := deviceFont encoding.
            enc isNil ifTrue:[enc := 'fontspecific'].

            previewField font:deviceFont.
            previewField characterEncoding:enc.

            encodingLabel label:enc.
            currentEncoding := enc.
            fontName := deviceFont fullName.

            (enc notNil and:[enc startsWith:'jis']) ifTrue:[
                (enc includesString:'0201') ifTrue:[
                    s := self class defaultJIS0201SampleString    
                ] ifFalse:[
                    s := self class defaultJISSampleString
                ]
            ] ifFalse:[
                (enc notNil and:[(enc startsWith:'unicode') or:[enc startsWith:'iso10646-']]) ifTrue:[
                    s := self class defaultUnicodeSampleString.
                ] ifFalse:[
                    s := self class defaultLatin1SampleString.
                ]
            ].
            previewField contents:s.
        ] ifFalse:[
            previewField contents:nil.
            encodingLabel label:nil.
            currentEncoding := nil.
            fontName := nil.
        ].
        nameLabel notNil ifTrue:[nameLabel label:fontName].
    ]

    "Modified: 30.6.1997 / 17:26:22 / cg"
!

showSelectedFont
    |fam face faceAndStyle style sz|

    fam := selectedFont family.
    currentEncoding := selectedFont encoding.

    self familySelected:fam showPreview:false.
    fam notNil ifTrue:[
        face := selectedFont face.
        (face notNil and:[(style := selectedFont style) notNil]) ifTrue:[
            faceAndStyle := face , '-' , style.
        ].
        self faceSelected:faceAndStyle showPreview:false.
        faceAndStyle notNil ifTrue:[
            sz := selectedFont size.
            self sizeSelected:sz showPreview:false. 
        ]
    ].

    self showPreview
!

updateFamilyList 
    "update the list of font families"

    |families|

    familyList list isNil ifTrue:[
        families := device fontFamiliesFiltering:filter.
        families notNil ifTrue:[
            families := families asOrderedCollection sort
        ].
        familyList list:families
    ].
    selectedFont notNil ifTrue:[
        self showSelectedFont
    ].

    "Modified: 27.2.1996 / 01:39:42 / cg"
    "Created: 27.2.1996 / 01:40:37 / cg"
! !

!FontPanel methodsFor:'queries'!

preferredExtent
    "return the boxes preferredExtent"

    "/ If I have an explicit preferredExtent ..

    preferredExtent notNil ifTrue:[
        ^ preferredExtent
    ].

    ^ 450@350

    "Modified: 19.7.1996 / 20:44:08 / cg"
! !

!FontPanel methodsFor:'user interaction'!

encodingFilterSelected:anEncodingPattern
    "another encoding was selected; find available fonts and update lists"

    |pattern|

    anEncodingPattern isNil ifTrue:[
        self filter:nil.
        ^ self.
    ].

    pattern := (anEncodingPattern upTo:$( ) withoutSeparators.

    pattern = '?' ifTrue:[
        pattern := ''
    ] ifFalse:[
        pattern := (pattern isEmptyOrNil ifTrue:'*' ifFalse:pattern).
    ].
    self 
        filter:
            [:f | 
                |encoding|

                encoding := f encoding ? ''. 
                pattern match:encoding
            ].
!

faceSelected:aFaceAndStyleName
    "a fonts face was selected; find available sizes and update lists"

    self faceSelected:aFaceAndStyleName showPreview:true
!

faceSelected:aFaceAndStyleName showPreview:showPreview
    "a fonts face was selected; find available sizes and update lists"

    |sizes didShow|

    aFaceAndStyleName notNil ifTrue:[    
        self extractFaceAndStyleFrom:aFaceAndStyleName.
    ].
    sizes := device 
                 sizesInFamily:(currentFamily ? '*')
                 face:(currentFace ? '*')
                 style:(currentStyle ? '*')
                 filtering:filter.

    (sizes isNil or:[sizes isEmpty]) ifTrue:[
        sizeList list:nil.
        currentSize := nil.
        showPreview ifTrue:[
            self showPreview.
        ].
        ^ self
    ].

    didShow := false.

    sizes := (sizes asOrderedCollection sort) collect:[:entry | entry printString].
    sizeList list:sizes.
    currentSize notNil ifTrue:[
        (sizes includes:(currentSize printString)) ifTrue:[
            sizeList setSelectElement:currentSize printString.
            showPreview ifTrue:[
                self showPreview.
                didShow := true.
            ]
        ]
    ].
    didShow ifFalse:[
        self clearPreview
    ].

    "Modified: 30.6.1997 / 17:25:46 / cg"
!

familySelected:aFamilyName
    "a fonts family was selected; find available faces and update lists"

    self familySelected:aFamilyName showPreview:true
!

familySelected:aFamilyName showPreview:showPreview
    "a fonts family was selected; find available faces and update lists"

    |faces styles list|

    familyList setSelectElement:aFamilyName.

    currentFamily := aFamilyName.
    faces := device facesInFamily:aFamilyName filtering:filter.
    (faces size = 0) ifTrue:[
        currentFace := currentStyle := currentFaceAndStyle := nil.
        faceList list:nil.
        self faceSelected:nil showPreview:showPreview.
        ^ self.
    ].

    list := SortedCollection new.
    faces do:[:aFace |
        styles := device stylesInFamily:aFamilyName face:aFace filtering:filter.
        styles do:[:aStyle |
            list add:(aFace , '-' , aStyle)
        ]
    ].

    faceList list:list.
    currentFaceAndStyle notNil ifTrue:[
        (list includes:currentFaceAndStyle) ifTrue:[
            faceList setSelectElement:currentFaceAndStyle.
            self faceSelected:currentFaceAndStyle showPreview:showPreview.
            ^ self
        ]
    ].

    sizeList list:nil.
    self clearPreview.

    "Modified: 26.5.1996 / 15:04:29 / cg"
!

okPressed
    "ok was pressed; hide myself and evaluate the okAction, passing
     family, face, style and size as arguments"

    self hide.
    okAction notNil ifTrue:[
        currentFamily notNil ifTrue:[
            okAction 
                value:(FontDescription
                        family:currentFamily 
                        face:currentFace 
                        style:currentStyle 
                        size:currentSize 
                        encoding:(currentEncoding ? encoding)).
        ]
    ]

    "Modified: 10.4.1997 / 09:51:31 / cg"
!

previewCopySelection
    previewField copySelection.
!

previewShowCharacterSet
    CharacterSetView openOn:(previewField font)
!

previewShowCharacterSetUsingXFD
    [
        OperatingSystem executeCommand:'xfd -fn ' , previewField font fullName.
    ] fork.
!

sizeSelected:aNumberOrString
    "a size was selected; update preview"

    self sizeSelected:aNumberOrString showPreview:true.
!

sizeSelected:aNumberOrString showPreview:showPreview
    "a size was selected; update preview"

    aNumberOrString isNumber ifTrue:[
        currentSize := aNumberOrString
    ] ifFalse:[
        currentSize := Number readFromString:aNumberOrString onError:nil
    ].
    showPreview ifTrue:[self showPreview]

    "Modified: 29.4.1996 / 09:43:23 / cg"
! !

!FontPanel class methodsFor:'documentation'!

version
    ^ '$Header: /cvs/stx/stx/libwidg/FontPanel.st,v 1.70 2004-02-20 10:45:27 cg Exp $'
! !