CharacterSetView.st
author Claus Gittinger <cg@exept.de>
Thu, 12 Feb 2004 15:42:29 +0100
changeset 2623 5bed6818a793
parent 2622 c24fdc09ab2b
child 2624 379b6e9e6a2f
permissions -rw-r--r--
*** empty log message ***

"{ Package: 'stx:goodies' }"

View subclass:#CharacterSetView
	instanceVariableNames:'codePageHolder selectedCodePointHolder'
	classVariableNames:''
	poolDictionaries:''
	category:'Collections-Text-Encodings'
!


!CharacterSetView class methodsFor:'startup'!

open
    self openOn:View defaultFont

    "
     self open
    "
!

openOn:aFont
    |top panel v bNext bPrev bFirst bLast rangeLabel codePointLabel
     first last next prev enable update updateCodePoint|

    top := StandardSystemView new.
    top label:(aFont printString).

    v := self origin:0.0@0.0 corner:1.0@1.0 in:top.
    v topInset:25.
    v font:aFont.

    panel := HorizontalPanelView in:top.
    panel origin:(0.0 @ 0.0) corner:(1.0 @ 0.0).
    panel bottomInset:-25.
    panel horizontalLayout:#left.

    "/ actions
    updateCodePoint := [
            |selectedCodePoint|

            selectedCodePoint := v selectedCodePoint.
            selectedCodePoint isNil ifTrue:[
                codePointLabel label:'Click on glyph to see its codePoint.'
            ] ifFalse:[
                codePointLabel label:('Selected: u%1'
                        bindWith:((selectedCodePoint printStringRadix:16) leftPaddedTo:4 with:$0)).
            ].
            codePointLabel repairDamage.
    ].

    update := [
            |uOffs selectedCodePoint|

            uOffs := v codePage * 16r0100.
            rangeLabel label:('u%1 ... u%2' 
                        bindWith:((uOffs printStringRadix:16) leftPaddedTo:4 with:$0)
                        with:(((uOffs + 16rFF) printStringRadix:16) leftPaddedTo:4 with:$0)).
            rangeLabel repairDamage.
        ].

    enable := [
            v codePage > 0 ifTrue:[ 
                bPrev enable. 
                bFirst enable. 
            ] ifFalse:[
                bPrev disable. 
                bFirst disable. 
            ].
            v codePage < 16rFF ifTrue:[ 
                bNext enable. 
                bLast enable. 
            ] ifFalse:[
                bNext disable. 
                bLast disable. 
            ].
        ].

    next := [
            v codePage:(v codePage + 1). 
            enable value.
            update value.
        ].

    prev := [
            v codePage:(v codePage - 1). 
            enable value.
            update value.
        ].

    first := [
            v codePage:0. 
            enable value.
            update value.
        ].

    last := [
            v codePage:16rFF. 
            enable value.
            update value.
        ].


    bFirst := Button label:(ToolbarIconLibrary start16x16Icon) in:panel.
    bFirst action:first.

    bPrev := Button label:(ToolbarIconLibrary back16x16Icon) in:panel.
    bPrev controller beTriggerOnDown.
    bPrev action:prev.
    bPrev disable.
    bPrev autoRepeat:true.

    bNext := Button label:(ToolbarIconLibrary forward16x16Icon) in:panel.
    bNext controller beTriggerOnDown.
    bNext action:next.
    bNext autoRepeat:true.

    bLast := Button label:(ToolbarIconLibrary finish16x16Icon) in:panel.
    bLast action:last.

    rangeLabel := Label label:'RangeStart .. RangeStop' in:panel.
    codePointLabel := Label label:'Click on glyph to see its codePoint.' in:panel.
    update value.

    v selectedCodePointHolder onChangeEvaluate:updateCodePoint.

    top open.
    ^ v

    "
     self openOn:(View defaultFont).
    "
! !

!CharacterSetView methodsFor:'accessing'!

codePage
    ^ codePageHolder value
!

codePage:pageNr
    codePageHolder value:pageNr.
!

codePageHolder
    ^ codePageHolder
!

selectedCodePoint
    ^ selectedCodePointHolder value
!

selectedCodePointHolder
    ^ selectedCodePointHolder
! !

!CharacterSetView methodsFor:'drawing'!

redraw
    |wCol hRow|

    wCol := width / 16.
    hRow := height / 16.

    0 to:16 do:[:col |
        |x|

        x := (col * wCol) rounded asInteger.
        self displayLineFromX:x y:0 toX:x y:height-1.
    ].

    0 to:15 do:[:row |
        |y|

        y := (row * hRow) rounded asInteger.
        self displayLineFromX:0 y:y toX:width y:y.
    ].


    0 to:15 do:[:row |
        |y0 y rowBase|

        rowBase := row * 16r10.
        y := y0 := row * hRow.
        y := y + (hRow / 2).
        y := y rounded asInteger.
        0 to:15 do:[:col |
            |x0 x codePoint s|

            codePoint := rowBase + col.
            s := (Character value:(self codePage * 16r100) + codePoint) asString.

            x := x0 := (col * wCol) rounded asInteger.
            x := x + (wCol / 2).
            x := x - ((font widthOf:s) / 2).
            x := x rounded asInteger.

            codePoint == self selectedCodePoint ifTrue:[
                self paint:(Color white) on:(Color red).
                self clearRectangle:((x0@y0 extent:wCol@hRow) insetBy:1).
                self displayString:s x:x y:y.
                self paint:(Color black).
            ] ifFalse:[
                self displayString:s x:x y:y.
            ].
        ].
    ].

    "
     (self extent:300@600) open
    "
!

sizeChanged:how
    self clear.
    self redraw.
! !

!CharacterSetView methodsFor:'event handling'!

buttonPress:button x:x y:y
    |wCol hRow row col code|

    wCol := width / 16.
    hRow := height / 16.

    row := y // hRow.
    col := x // wCol.

    code := (self codePage*16r0100) + (row * 16) + col.
    selectedCodePointHolder value:code.
!

codePageChanged
    realized ifTrue:[
        self clear.
        self redraw.
    ].
!

selectedCodePointChanged
    realized ifTrue:[
        self clear.
        self redraw.
    ].
! !

!CharacterSetView methodsFor:'initialization'!

initialize
    super initialize.
    codePageHolder := 0 asValue.
    codePageHolder onChangeSend:#codePageChanged to:self.

    selectedCodePointHolder := ValueHolder new.
    selectedCodePointHolder onChangeSend:#selectedCodePointChanged to:self.
! !

!CharacterSetView class methodsFor:'documentation'!

version
    ^ '$Header: /cvs/stx/stx/libwidg2/CharacterSetView.st,v 1.3 2004-02-12 14:42:29 cg Exp $'
! !