1 /* GENERATED SOURCE. DO NOT MODIFY. */ 2 // 2017 and later: Unicode, Inc. and others. 3 // License & terms of use: http://www.unicode.org/copyright.html#License 4 package android.icu.impl.number; 5 6 /** 7 * @hide Only a subset of ICU is exposed in Android 8 */ 9 public class Padder { 10 public static final String FALLBACK_PADDING_STRING = "\u0020"; // i.e. a space 11 12 public enum PadPosition { 13 BEFORE_PREFIX, 14 AFTER_PREFIX, 15 BEFORE_SUFFIX, 16 AFTER_SUFFIX; 17 18 public static PadPosition fromOld(int old) { 19 switch (old) { 20 case android.icu.text.DecimalFormat.PAD_BEFORE_PREFIX: 21 return PadPosition.BEFORE_PREFIX; 22 case android.icu.text.DecimalFormat.PAD_AFTER_PREFIX: 23 return PadPosition.AFTER_PREFIX; 24 case android.icu.text.DecimalFormat.PAD_BEFORE_SUFFIX: 25 return PadPosition.BEFORE_SUFFIX; 26 case android.icu.text.DecimalFormat.PAD_AFTER_SUFFIX: 27 return PadPosition.AFTER_SUFFIX; 28 default: 29 throw new IllegalArgumentException("Don't know how to map " + old); 30 } 31 } 32 33 public int toOld() { 34 switch (this) { 35 case BEFORE_PREFIX: 36 return android.icu.text.DecimalFormat.PAD_BEFORE_PREFIX; 37 case AFTER_PREFIX: 38 return android.icu.text.DecimalFormat.PAD_AFTER_PREFIX; 39 case BEFORE_SUFFIX: 40 return android.icu.text.DecimalFormat.PAD_BEFORE_SUFFIX; 41 case AFTER_SUFFIX: 42 return android.icu.text.DecimalFormat.PAD_AFTER_SUFFIX; 43 default: 44 return -1; // silence compiler errors 45 } 46 } 47 } 48 49 /* like package-private */ public static final Padder NONE = new Padder(null, -1, null); 50 51 String paddingString; 52 int targetWidth; 53 PadPosition position; 54 55 public Padder(String paddingString, int targetWidth, PadPosition position) { 56 // TODO: Add a few default instances 57 this.paddingString = (paddingString == null) ? FALLBACK_PADDING_STRING : paddingString; 58 this.targetWidth = targetWidth; 59 this.position = (position == null) ? PadPosition.BEFORE_PREFIX : position; 60 } 61 62 public static Padder none() { 63 return NONE; 64 } 65 66 public static Padder codePoints(int cp, int targetWidth, PadPosition position) { 67 // TODO: Validate the code point 68 if (targetWidth >= 0) { 69 String paddingString = String.valueOf(Character.toChars(cp)); 70 return new Padder(paddingString, targetWidth, position); 71 } else { 72 throw new IllegalArgumentException("Padding width must not be negative"); 73 } 74 } 75 76 public boolean isValid() { 77 return targetWidth > 0; 78 } 79 80 public int padAndApply(Modifier mod1, Modifier mod2, NumberStringBuilder string, int leftIndex, int rightIndex) { 81 int modLength = mod1.getCodePointCount() + mod2.getCodePointCount(); 82 int requiredPadding = targetWidth - modLength - string.codePointCount(); 83 assert leftIndex == 0 && rightIndex == string.length(); // fix the previous line to remove this assertion 84 85 int length = 0; 86 if (requiredPadding <= 0) { 87 // Padding is not required. 88 length += mod1.apply(string, leftIndex, rightIndex); 89 length += mod2.apply(string, leftIndex, rightIndex + length); 90 return length; 91 } 92 93 if (position == PadPosition.AFTER_PREFIX) { 94 length += addPaddingHelper(paddingString, requiredPadding, string, leftIndex); 95 } else if (position == PadPosition.BEFORE_SUFFIX) { 96 length += addPaddingHelper(paddingString, requiredPadding, string, rightIndex + length); 97 } 98 length += mod1.apply(string, leftIndex, rightIndex + length); 99 length += mod2.apply(string, leftIndex, rightIndex + length); 100 if (position == PadPosition.BEFORE_PREFIX) { 101 length += addPaddingHelper(paddingString, requiredPadding, string, leftIndex); 102 } else if (position == PadPosition.AFTER_SUFFIX) { 103 length += addPaddingHelper(paddingString, requiredPadding, string, rightIndex + length); 104 } 105 106 return length; 107 } 108 109 private static int addPaddingHelper(String paddingString, int requiredPadding, NumberStringBuilder string, 110 int index) { 111 for (int i = 0; i < requiredPadding; i++) { 112 // TODO: If appending to the end, this will cause actual insertion operations. Improve. 113 string.insert(index, paddingString, null); 114 } 115 return paddingString.length() * requiredPadding; 116 } 117 }