CharacterSetView.st
changeset 2803 b4207f666be5
parent 2673 bc07cae4087c
child 3121 be37b94ab83c
--- a/CharacterSetView.st	Wed Mar 30 14:33:49 2005 +0200
+++ b/CharacterSetView.st	Thu Mar 31 20:49:56 2005 +0200
@@ -1,5 +1,3 @@
-"{ Encoding: utf8 }"
-
 "
  COPYRIGHT (c) 2004 by eXept Software AG
               All Rights Reserved
@@ -15,7 +13,8 @@
 "{ Package: 'stx:libwidg2' }"
 
 View subclass:#CharacterSetView
-	instanceVariableNames:'codePageHolder selectedCodePointHolder masterViewOrNil'
+	instanceVariableNames:'codePageHolder selectedCodePointHolder masterViewOrNil
+		encoderOrNil'
 	classVariableNames:''
 	poolDictionaries:''
 	category:'Views-Special'
@@ -70,7 +69,7 @@
 !CharacterSetView class methodsFor:'startup'!
 
 open
-    self openOn:View defaultFont
+    self openOn:(View defaultFont)
 
     "
      self open
@@ -105,12 +104,35 @@
 !
 
 openOn:aFont label:viewLabel clickLabel:clickLabel asInputFor:aView
+    self
+        openOn:aFont 
+        label:viewLabel 
+        clickLabel:clickLabel 
+        asInputFor:aView 
+        encoder:nil
+
+    "
+     self openOn:(View defaultFont).
+     self openOn:(Font family:'courier' face:'medium' style:'roman' size:12 encoding:'iso10646-1').
+    "
+!
+
+openOn:aFont label:viewLabel clickLabel:clickLabel asInputFor:aView encoder:aCharacterEncoderOrNil
     |top panel v bNext bPrev bFirst bLast rangeLabel codePointLabel
      first last next prev enable update updateCodePoint w h
-     minPage maxPage insertCharacter|
+     minPage maxPage insertCharacter fontMetrics minCode maxCode|
 
-    minPage := (aFont onDevice:Screen current) getFontMetrics minCode >> 8.
-    maxPage := (aFont onDevice:Screen current) getFontMetrics maxCode >> 8.
+    aCharacterEncoderOrNil isNil ifTrue:[
+        fontMetrics := (aFont onDevice:Screen current) getFontMetrics.
+        minCode := fontMetrics minCode.
+        maxCode := fontMetrics maxCode.
+    ] ifFalse:[
+        minCode := aCharacterEncoderOrNil minCode.
+        maxCode := aCharacterEncoderOrNil maxCode.
+    ].
+
+    minPage := minCode >> 8.
+    maxPage := maxCode >> 8.
 
     top := StandardSystemView new.
     top label:viewLabel.
@@ -120,6 +142,7 @@
     v font:aFont.
     v codePageHolder value:minPage.
     v characterEncoding:(aFont encoding).
+    v encoder:aCharacterEncoderOrNil.
 
     panel := HorizontalPanelView in:top.
     panel origin:(0.0 @ 0.0) corner:(1.0 @ 0.0).
@@ -145,7 +168,8 @@
 
     updateCodePoint := [
             |selectedCodePoint selectedChar 
-             isLetter isDigit isUppercase isLowercase|
+             isLetter isDigit isUppercase isLowercase 
+             codeString decoded decodedString|
 
             selectedCodePoint := v selectedCodePoint.
             selectedCodePoint isNil ifTrue:[
@@ -161,13 +185,22 @@
                 ] ifFalse:[
                     isLetter := isDigit := isUppercase := isLowercase := false.     "/ actually: unknown
                 ].
+                aCharacterEncoderOrNil isNil ifTrue:[
+                    decodedString := ''.
+                    codeString := 'u' , ((selectedCodePoint printStringRadix:16) leftPaddedTo:4 with:$0)
+                ] ifFalse:[
+                    decoded := aCharacterEncoderOrNil decode:selectedCodePoint.
+                    decodedString := 'u' , ((decoded printStringRadix:16) leftPaddedTo:4 with:$0).
+                    codeString := ((selectedCodePoint printStringRadix:16) leftPaddedTo:4 with:$0)
+                ].
                 codePointLabel 
                     label:
-                        ('Selected: u%1 %2 %3 %4'
-                            bindWith:((selectedCodePoint printStringRadix:16) leftPaddedTo:4 with:$0)
+                        ('Selected: %1 %2 %3 %4 %5'
+                            bindWith:codeString
                             with:((selectedCodePoint printString) leftPaddedTo:5)
                             with:(isUppercase ifTrue:'Uc' ifFalse:[isLowercase ifTrue:'lc' ifFalse:''])
                             with:(isLetter ifTrue:'Letter' ifFalse:[(isDigit ifTrue:'Digit' ifFalse:'')])
+                            with:decodedString
                         ).
             ].
             codePointLabel repairDamage.
@@ -181,10 +214,15 @@
     ].
 
     update := [
-            |uOffs selectedCodePoint|
+            |uOffs selectedCodePoint lbl|
 
+            aCharacterEncoderOrNil isNil ifTrue:[
+                lbl := 'u%1 ... u%2'
+            ] ifFalse:[
+                lbl := '%1 ... %2'
+            ].
             uOffs := v codePage * 16r0100.
-            rangeLabel label:('u%1 ... u%2' 
+            rangeLabel label:(lbl 
                         bindWith:((uOffs printStringRadix:16) leftPaddedTo:4 with:$0)
                         with:(((uOffs + 16rFF) printStringRadix:16) leftPaddedTo:4 with:$0)).
             rangeLabel repairDamage.
@@ -294,6 +332,10 @@
     ^ codePageHolder
 !
 
+encoder:aCharacterEncoder
+    encoderOrNil := aCharacterEncoder
+!
+
 selectedCodePoint
     ^ selectedCodePointHolder value
 !
@@ -338,10 +380,15 @@
         y1 := y1 rounded asInteger.
 
         0 to:15 do:[:col |
-            |x0 x1 x codePoint s|
+            |x0 x1 x codePoint decodedCodePoint s|
 
             codePoint := (self codePage * 16r100) + (rowBase + col).
-            s := (Character value:codePoint) asString.
+            encoderOrNil notNil ifTrue:[
+                decodedCodePoint := encoderOrNil decode:codePoint
+            ] ifFalse:[
+                decodedCodePoint := codePoint
+            ].
+            s := (Character value:decodedCodePoint) asString.
 
             x := x0 := (col * wCol) rounded asInteger.
             x := x rounded asInteger.
@@ -484,5 +531,5 @@
 !CharacterSetView class methodsFor:'documentation'!
 
 version
-    ^ '$Header: /cvs/stx/stx/libwidg2/CharacterSetView.st,v 1.19 2004-03-05 17:52:57 cg Exp $'
+    ^ '$Header: /cvs/stx/stx/libwidg2/CharacterSetView.st,v 1.20 2005-03-31 18:49:56 cg Exp $'
 ! !