Home | History | Annotate | Download | only in layout
      1 /*
      2  *******************************************************************************
      3  * Copyright (C) 1998-2004, International Business Machines Corporation and    *
      4  * others. All Rights Reserved.                                                *
      5  *******************************************************************************
      6  *
      7  * Created on Dec 3, 2003
      8  *
      9  *******************************************************************************
     10  */
     11 package com.ibm.icu.dev.tool.layout;
     12 
     13 import com.ibm.icu.lang.UCharacter;
     14 import com.ibm.icu.lang.UProperty;
     15 import com.ibm.icu.text.Normalizer;
     16 import com.ibm.icu.text.UnicodeSet;
     17 
     18 public class ArabicCharacterData
     19 {
     20     public class Record
     21     {
     22         public int getCodePoint()
     23         {
     24             return codePoint;
     25         }
     26 
     27         public int getGeneralCategory()
     28         {
     29             return generalCategory;
     30         }
     31 
     32         public int getDecompositionType()
     33         {
     34             return decompositionType;
     35         }
     36 
     37         public String getDecomposition()
     38         {
     39             return decomposition;
     40         }
     41 
     42         private Record(int character)
     43         {
     44             codePoint         = character;
     45             generalCategory   = UCharacter.getType(character);
     46             decompositionType = UCharacter.getIntPropertyValue(character, UProperty.DECOMPOSITION_TYPE);
     47 
     48             switch (decompositionType) {
     49             case UCharacter.DecompositionType.FINAL:
     50             case UCharacter.DecompositionType.INITIAL:
     51             case UCharacter.DecompositionType.ISOLATED:
     52             case UCharacter.DecompositionType.MEDIAL:
     53                 decomposition = Normalizer.compose(UCharacter.toString(character), true);
     54                 break;
     55 
     56             case UCharacter.DecompositionType.CANONICAL:
     57                 decomposition = Normalizer.decompose(UCharacter.toString(character), true);
     58                 break;
     59 
     60             default:
     61                 decomposition = null;
     62             }
     63         }
     64 
     65         private int codePoint;
     66         private int generalCategory;
     67         private int decompositionType;
     68         private String decomposition;
     69     }
     70 
     71     private ArabicCharacterData(int charCount)
     72     {
     73         records = new Record[charCount];
     74     }
     75 
     76     private void add(int character)
     77     {
     78         records[recordIndex++] = new Record(character);
     79     }
     80 
     81     public Record getRecord(int index)
     82     {
     83         if (index < 0 || index >= records.length) {
     84             return null;
     85         }
     86 
     87         return records[index];
     88     }
     89 
     90     public int countRecords()
     91     {
     92         return records.length;
     93     }
     94 
     95     // TODO: do we need to change this to use UnicodeSetIterator?
     96     // That will mean not knowing the number of characters until
     97     // after the iteration is done, so we'd have to use a vector
     98     // to hold the Records at first and copy it to an array
     99     // when we're done...
    100     public static ArabicCharacterData factory(UnicodeSet characterSet)
    101     {
    102         int charCount = characterSet.size();
    103         ArabicCharacterData data = new ArabicCharacterData(charCount);
    104 
    105         for (int i = 0; i < charCount; i += 1) {
    106             data.add(characterSet.charAt(i));
    107         }
    108 
    109         return data;
    110     }
    111 
    112     private Record[] records;
    113     private int recordIndex = 0;
    114 }
    115