• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 }