Home | History | Annotate | Download | only in number
      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 }