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 ohos.global.icu.impl.number; 5 6 import ohos.global.icu.impl.FormattedStringBuilder; 7 8 /** 9 * @hide exposed on OHOS 10 */ 11 public class Padder { 12 public static final String FALLBACK_PADDING_STRING = "\u0020"; // i.e. a space 13 14 /** 15 * @hide exposed on OHOS 16 */ 17 public enum PadPosition { 18 BEFORE_PREFIX, AFTER_PREFIX, BEFORE_SUFFIX, AFTER_SUFFIX; 19 fromOld(int old)20 public static PadPosition fromOld(int old) { 21 switch (old) { 22 case ohos.global.icu.text.DecimalFormat.PAD_BEFORE_PREFIX: 23 return PadPosition.BEFORE_PREFIX; 24 case ohos.global.icu.text.DecimalFormat.PAD_AFTER_PREFIX: 25 return PadPosition.AFTER_PREFIX; 26 case ohos.global.icu.text.DecimalFormat.PAD_BEFORE_SUFFIX: 27 return PadPosition.BEFORE_SUFFIX; 28 case ohos.global.icu.text.DecimalFormat.PAD_AFTER_SUFFIX: 29 return PadPosition.AFTER_SUFFIX; 30 default: 31 throw new IllegalArgumentException("Don't know how to map " + old); 32 } 33 } 34 toOld()35 public int toOld() { 36 switch (this) { 37 case BEFORE_PREFIX: 38 return ohos.global.icu.text.DecimalFormat.PAD_BEFORE_PREFIX; 39 case AFTER_PREFIX: 40 return ohos.global.icu.text.DecimalFormat.PAD_AFTER_PREFIX; 41 case BEFORE_SUFFIX: 42 return ohos.global.icu.text.DecimalFormat.PAD_BEFORE_SUFFIX; 43 case AFTER_SUFFIX: 44 return ohos.global.icu.text.DecimalFormat.PAD_AFTER_SUFFIX; 45 default: 46 return -1; // silence compiler errors 47 } 48 } 49 } 50 51 /* like package-private */ public static final Padder NONE = new Padder(null, -1, null); 52 53 String paddingString; 54 int targetWidth; 55 PadPosition position; 56 Padder(String paddingString, int targetWidth, PadPosition position)57 public Padder(String paddingString, int targetWidth, PadPosition position) { 58 // TODO: Add a few default instances 59 this.paddingString = (paddingString == null) ? FALLBACK_PADDING_STRING : paddingString; 60 this.targetWidth = targetWidth; 61 this.position = (position == null) ? PadPosition.BEFORE_PREFIX : position; 62 } 63 none()64 public static Padder none() { 65 return NONE; 66 } 67 codePoints(int cp, int targetWidth, PadPosition position)68 public static Padder codePoints(int cp, int targetWidth, PadPosition position) { 69 // TODO: Validate the code point 70 if (targetWidth >= 0) { 71 String paddingString = String.valueOf(Character.toChars(cp)); 72 return new Padder(paddingString, targetWidth, position); 73 } else { 74 throw new IllegalArgumentException("Padding width must not be negative"); 75 } 76 } 77 forProperties(DecimalFormatProperties properties)78 public static Padder forProperties(DecimalFormatProperties properties) { 79 return new Padder(properties.getPadString(), 80 properties.getFormatWidth(), 81 properties.getPadPosition()); 82 } 83 isValid()84 public boolean isValid() { 85 return targetWidth > 0; 86 } 87 padAndApply( Modifier mod1, Modifier mod2, FormattedStringBuilder string, int leftIndex, int rightIndex)88 public int padAndApply( 89 Modifier mod1, 90 Modifier mod2, 91 FormattedStringBuilder string, 92 int leftIndex, 93 int rightIndex) { 94 int modLength = mod1.getCodePointCount() + mod2.getCodePointCount(); 95 int requiredPadding = targetWidth - modLength - string.codePointCount(); 96 assert leftIndex == 0 && rightIndex == string.length(); // fix the previous line to remove this 97 // assertion 98 99 int length = 0; 100 if (requiredPadding <= 0) { 101 // Padding is not required. 102 length += mod1.apply(string, leftIndex, rightIndex); 103 length += mod2.apply(string, leftIndex, rightIndex + length); 104 return length; 105 } 106 107 if (position == PadPosition.AFTER_PREFIX) { 108 length += addPaddingHelper(paddingString, requiredPadding, string, leftIndex); 109 } else if (position == PadPosition.BEFORE_SUFFIX) { 110 length += addPaddingHelper(paddingString, requiredPadding, string, rightIndex + length); 111 } 112 length += mod1.apply(string, leftIndex, rightIndex + length); 113 length += mod2.apply(string, leftIndex, rightIndex + length); 114 if (position == PadPosition.BEFORE_PREFIX) { 115 length += addPaddingHelper(paddingString, requiredPadding, string, leftIndex); 116 } else if (position == PadPosition.AFTER_SUFFIX) { 117 length += addPaddingHelper(paddingString, requiredPadding, string, rightIndex + length); 118 } 119 120 return length; 121 } 122 addPaddingHelper( String paddingString, int requiredPadding, FormattedStringBuilder string, int index)123 private static int addPaddingHelper( 124 String paddingString, 125 int requiredPadding, 126 FormattedStringBuilder string, 127 int index) { 128 for (int i = 0; i < requiredPadding; i++) { 129 // TODO: If appending to the end, this will cause actual insertion operations. Improve. 130 string.insert(index, paddingString, null); 131 } 132 return paddingString.length() * requiredPadding; 133 } 134 }