| /* |
| ******************************************************************************* |
| * Copyright (C) 1998-2004, International Business Machines Corporation and * |
| * others. All Rights Reserved. * |
| ******************************************************************************* |
| * |
| * Created on Dec 3, 2003 |
| * |
| ******************************************************************************* |
| */ |
| package com.ibm.icu.dev.tool.layout; |
| |
| import com.ibm.icu.lang.UCharacter; |
| import com.ibm.icu.lang.UProperty; |
| import com.ibm.icu.text.Normalizer; |
| import com.ibm.icu.text.UnicodeSet; |
| |
| public class ArabicCharacterData |
| { |
| public class Record |
| { |
| public int getCodePoint() |
| { |
| return codePoint; |
| } |
| |
| public int getGeneralCategory() |
| { |
| return generalCategory; |
| } |
| |
| public int getDecompositionType() |
| { |
| return decompositionType; |
| } |
| |
| public String getDecomposition() |
| { |
| return decomposition; |
| } |
| |
| private Record(int character) |
| { |
| codePoint = character; |
| generalCategory = UCharacter.getType(character); |
| decompositionType = UCharacter.getIntPropertyValue(character, UProperty.DECOMPOSITION_TYPE); |
| |
| switch (decompositionType) { |
| case UCharacter.DecompositionType.FINAL: |
| case UCharacter.DecompositionType.INITIAL: |
| case UCharacter.DecompositionType.ISOLATED: |
| case UCharacter.DecompositionType.MEDIAL: |
| decomposition = Normalizer.compose(UCharacter.toString(character), true); |
| break; |
| |
| case UCharacter.DecompositionType.CANONICAL: |
| decomposition = Normalizer.decompose(UCharacter.toString(character), true); |
| break; |
| |
| default: |
| decomposition = null; |
| } |
| } |
| |
| private int codePoint; |
| private int generalCategory; |
| private int decompositionType; |
| private String decomposition; |
| } |
| |
| private ArabicCharacterData(int charCount) |
| { |
| records = new Record[charCount]; |
| } |
| |
| private void add(int character) |
| { |
| records[recordIndex++] = new Record(character); |
| } |
| |
| public Record getRecord(int index) |
| { |
| if (index < 0 || index >= records.length) { |
| return null; |
| } |
| |
| return records[index]; |
| } |
| |
| public int countRecords() |
| { |
| return records.length; |
| } |
| |
| // TODO: do we need to change this to use UnicodeSetIterator? |
| // That will mean not knowing the number of characters until |
| // after the iteration is done, so we'd have to use a vector |
| // to hold the Records at first and copy it to an array |
| // when we're done... |
| public static ArabicCharacterData factory(UnicodeSet characterSet) |
| { |
| int charCount = characterSet.size(); |
| ArabicCharacterData data = new ArabicCharacterData(charCount); |
| |
| for (int i = 0; i < charCount; i += 1) { |
| data.add(characterSet.charAt(i)); |
| } |
| |
| return data; |
| } |
| |
| private Record[] records; |
| private int recordIndex = 0; |
| } |