TextDirectionHeuristics.java revision e7beae3f4c9c170c7c6c42cf9b572f0ee1ec9c81
14b60c30838fbd635964f1e79c057de5048dcc66fFabrice Di Meglio/* 24b60c30838fbd635964f1e79c057de5048dcc66fFabrice Di Meglio * Copyright (C) 2011 The Android Open Source Project 34b60c30838fbd635964f1e79c057de5048dcc66fFabrice Di Meglio * 44b60c30838fbd635964f1e79c057de5048dcc66fFabrice Di Meglio * Licensed under the Apache License, Version 2.0 (the "License"); 54b60c30838fbd635964f1e79c057de5048dcc66fFabrice Di Meglio * you may not use this file except in compliance with the License. 64b60c30838fbd635964f1e79c057de5048dcc66fFabrice Di Meglio * You may obtain a copy of the License at 74b60c30838fbd635964f1e79c057de5048dcc66fFabrice Di Meglio * 84b60c30838fbd635964f1e79c057de5048dcc66fFabrice Di Meglio * http://www.apache.org/licenses/LICENSE-2.0 94b60c30838fbd635964f1e79c057de5048dcc66fFabrice Di Meglio * 104b60c30838fbd635964f1e79c057de5048dcc66fFabrice Di Meglio * Unless required by applicable law or agreed to in writing, software 114b60c30838fbd635964f1e79c057de5048dcc66fFabrice Di Meglio * distributed under the License is distributed on an "AS IS" BASIS, 124b60c30838fbd635964f1e79c057de5048dcc66fFabrice Di Meglio * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 134b60c30838fbd635964f1e79c057de5048dcc66fFabrice Di Meglio * See the License for the specific language governing permissions and 144b60c30838fbd635964f1e79c057de5048dcc66fFabrice Di Meglio * limitations under the License. 154b60c30838fbd635964f1e79c057de5048dcc66fFabrice Di Meglio */ 16cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt 17cb379120456d8065d742021fc5c66748fc8a11a8Doug Feltpackage android.text; 18cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt 19cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt 207810b5f8cffb3c2c98fd0df579f4da5a9ac6cc73Fabrice Di Meglioimport android.util.LocaleUtil; 217810b5f8cffb3c2c98fd0df579f4da5a9ac6cc73Fabrice Di Meglio 22cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt/** 23cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt * Some objects that implement TextDirectionHeuristic. 24cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt */ 25cb379120456d8065d742021fc5c66748fc8a11a8Doug Feltpublic class TextDirectionHeuristics { 26cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt 27cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt /** Always decides that the direction is left to right. */ 28cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt public static final TextDirectionHeuristic LTR = 29cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt new TextDirectionHeuristicInternal(null /* no algorithm */, false); 30cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt 31cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt /** Always decides that the direction is right to left. */ 32cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt public static final TextDirectionHeuristic RTL = 33cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt new TextDirectionHeuristicInternal(null /* no algorithm */, true); 34cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt 35cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt /** 36cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt * Determines the direction based on the first strong directional character, 37cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt * including bidi format chars, falling back to left to right if it 38cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt * finds none. This is the default behavior of the Unicode Bidirectional 39cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt * Algorithm. 40cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt */ 41cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt public static final TextDirectionHeuristic FIRSTSTRONG_LTR = 42cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt new TextDirectionHeuristicInternal(FirstStrong.INSTANCE, false); 43cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt 44cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt /** 45cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt * Determines the direction based on the first strong directional character, 46cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt * including bidi format chars, falling back to right to left if it 47cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt * finds none. This is similar to the default behavior of the Unicode 48cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt * Bidirectional Algorithm, just with different fallback behavior. 49cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt */ 50cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt public static final TextDirectionHeuristic FIRSTSTRONG_RTL = 51cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt new TextDirectionHeuristicInternal(FirstStrong.INSTANCE, true); 52cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt 53cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt /** 544b60c30838fbd635964f1e79c057de5048dcc66fFabrice Di Meglio * If the text contains any strong right to left non-format character, determines 554b60c30838fbd635964f1e79c057de5048dcc66fFabrice Di Meglio * that the direction is right to left, falling back to left to right if it 564b60c30838fbd635964f1e79c057de5048dcc66fFabrice Di Meglio * finds none. 574b60c30838fbd635964f1e79c057de5048dcc66fFabrice Di Meglio */ 584b60c30838fbd635964f1e79c057de5048dcc66fFabrice Di Meglio public static final TextDirectionHeuristic ANYRTL_LTR = 594b60c30838fbd635964f1e79c057de5048dcc66fFabrice Di Meglio new TextDirectionHeuristicInternal(AnyStrong.INSTANCE_RTL, false); 604b60c30838fbd635964f1e79c057de5048dcc66fFabrice Di Meglio 614b60c30838fbd635964f1e79c057de5048dcc66fFabrice Di Meglio /** 627810b5f8cffb3c2c98fd0df579f4da5a9ac6cc73Fabrice Di Meglio * Force the paragraph direction to the Locale direction. Falls back to left to right. 637810b5f8cffb3c2c98fd0df579f4da5a9ac6cc73Fabrice Di Meglio */ 647810b5f8cffb3c2c98fd0df579f4da5a9ac6cc73Fabrice Di Meglio public static final TextDirectionHeuristic LOCALE = TextDirectionHeuristicLocale.INSTANCE; 657810b5f8cffb3c2c98fd0df579f4da5a9ac6cc73Fabrice Di Meglio 66cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt private static enum TriState { 67cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt TRUE, FALSE, UNKNOWN; 68cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt } 69cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt 70cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt /** 71cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt * Computes the text direction based on an algorithm. Subclasses implement 72cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt * {@link #defaultIsRtl} to handle cases where the algorithm cannot determine the 73cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt * direction from the text alone. 74cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt */ 75e7beae3f4c9c170c7c6c42cf9b572f0ee1ec9c81Fabrice Di Meglio private static abstract class TextDirectionHeuristicImpl implements TextDirectionHeuristic { 76cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt private final TextDirectionAlgorithm mAlgorithm; 77cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt 78cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt public TextDirectionHeuristicImpl(TextDirectionAlgorithm algorithm) { 79cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt mAlgorithm = algorithm; 80cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt } 81cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt 82cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt /** 83cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt * Return true if the default text direction is rtl. 84cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt */ 85cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt abstract protected boolean defaultIsRtl(); 86cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt 87cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt @Override 88cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt public boolean isRtl(char[] chars, int start, int count) { 89cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt if (chars == null || start < 0 || count < 0 || chars.length - count < start) { 90cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt throw new IllegalArgumentException(); 91cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt } 92cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt if (mAlgorithm == null) { 93cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt return defaultIsRtl(); 94cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt } 95cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt return doCheck(chars, start, count); 96cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt } 97cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt 98cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt private boolean doCheck(char[] chars, int start, int count) { 99cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt switch(mAlgorithm.checkRtl(chars, start, count)) { 100cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt case TRUE: 101cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt return true; 102cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt case FALSE: 103cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt return false; 104cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt default: 105cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt return defaultIsRtl(); 106cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt } 107cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt } 108cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt } 109cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt 110cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt private static class TextDirectionHeuristicInternal extends TextDirectionHeuristicImpl { 111cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt private final boolean mDefaultIsRtl; 112cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt 113cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt private TextDirectionHeuristicInternal(TextDirectionAlgorithm algorithm, 114cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt boolean defaultIsRtl) { 115cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt super(algorithm); 116cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt mDefaultIsRtl = defaultIsRtl; 117cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt } 118cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt 119cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt @Override 120cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt protected boolean defaultIsRtl() { 121cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt return mDefaultIsRtl; 122cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt } 123cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt } 124cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt 125cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt private static TriState isRtlText(int directionality) { 126cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt switch (directionality) { 127cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt case Character.DIRECTIONALITY_LEFT_TO_RIGHT: 128cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt return TriState.FALSE; 129cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt case Character.DIRECTIONALITY_RIGHT_TO_LEFT: 130cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt case Character.DIRECTIONALITY_RIGHT_TO_LEFT_ARABIC: 131cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt return TriState.TRUE; 132cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt default: 133cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt return TriState.UNKNOWN; 134cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt } 135cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt } 136cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt 137cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt private static TriState isRtlTextOrFormat(int directionality) { 138cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt switch (directionality) { 139cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt case Character.DIRECTIONALITY_LEFT_TO_RIGHT: 140cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt case Character.DIRECTIONALITY_LEFT_TO_RIGHT_EMBEDDING: 141cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt case Character.DIRECTIONALITY_LEFT_TO_RIGHT_OVERRIDE: 142cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt return TriState.FALSE; 143cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt case Character.DIRECTIONALITY_RIGHT_TO_LEFT: 144cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt case Character.DIRECTIONALITY_RIGHT_TO_LEFT_ARABIC: 145cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt case Character.DIRECTIONALITY_RIGHT_TO_LEFT_EMBEDDING: 146cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt case Character.DIRECTIONALITY_RIGHT_TO_LEFT_OVERRIDE: 147cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt return TriState.TRUE; 148cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt default: 149cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt return TriState.UNKNOWN; 150cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt } 151cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt } 152cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt 153cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt /** 154cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt * Interface for an algorithm to guess the direction of a paragraph of text. 155cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt * 156cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt */ 157e7beae3f4c9c170c7c6c42cf9b572f0ee1ec9c81Fabrice Di Meglio private static interface TextDirectionAlgorithm { 158cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt /** 159cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt * Returns whether the range of text is RTL according to the algorithm. 160cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt * 161cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt */ 162cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt TriState checkRtl(char[] text, int start, int count); 163cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt } 164cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt 165cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt /** 166cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt * Algorithm that uses the first strong directional character to determine 167cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt * the paragraph direction. This is the standard Unicode Bidirectional 168cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt * algorithm. 169cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt * 170cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt */ 171e7beae3f4c9c170c7c6c42cf9b572f0ee1ec9c81Fabrice Di Meglio private static class FirstStrong implements TextDirectionAlgorithm { 172cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt @Override 173cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt public TriState checkRtl(char[] text, int start, int count) { 174cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt TriState result = TriState.UNKNOWN; 175cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt for (int i = start, e = start + count; i < e && result == TriState.UNKNOWN; ++i) { 176cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt result = isRtlTextOrFormat(Character.getDirectionality(text[i])); 177cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt } 178cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt return result; 179cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt } 180cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt 181cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt private FirstStrong() { 182cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt } 183cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt 184cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt public static final FirstStrong INSTANCE = new FirstStrong(); 185cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt } 186cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt 187cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt /** 188cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt * Algorithm that uses the presence of any strong directional non-format 189cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt * character (e.g. excludes LRE, LRO, RLE, RLO) to determine the 190cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt * direction of text. 191cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt * 192cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt */ 193e7beae3f4c9c170c7c6c42cf9b572f0ee1ec9c81Fabrice Di Meglio private static class AnyStrong implements TextDirectionAlgorithm { 194cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt private final boolean mLookForRtl; 195cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt 196cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt @Override 197cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt public TriState checkRtl(char[] text, int start, int count) { 198cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt boolean haveUnlookedFor = false; 199cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt for (int i = start, e = start + count; i < e; ++i) { 200cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt switch (isRtlText(Character.getDirectionality(text[i]))) { 201cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt case TRUE: 202cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt if (mLookForRtl) { 203cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt return TriState.TRUE; 204cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt } 205cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt haveUnlookedFor = true; 206cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt break; 207cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt case FALSE: 208cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt if (!mLookForRtl) { 209cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt return TriState.FALSE; 210cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt } 211cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt haveUnlookedFor = true; 212cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt break; 213cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt default: 214cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt break; 215cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt } 216cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt } 217cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt if (haveUnlookedFor) { 218cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt return mLookForRtl ? TriState.FALSE : TriState.TRUE; 219cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt } 220cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt return TriState.UNKNOWN; 221cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt } 222cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt 223cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt private AnyStrong(boolean lookForRtl) { 224cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt this.mLookForRtl = lookForRtl; 225cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt } 226cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt 227cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt public static final AnyStrong INSTANCE_RTL = new AnyStrong(true); 228cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt public static final AnyStrong INSTANCE_LTR = new AnyStrong(false); 229cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt } 230cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt 231cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt /** 2327810b5f8cffb3c2c98fd0df579f4da5a9ac6cc73Fabrice Di Meglio * Algorithm that uses the Locale direction to force the direction of a paragraph. 2337810b5f8cffb3c2c98fd0df579f4da5a9ac6cc73Fabrice Di Meglio */ 234e7beae3f4c9c170c7c6c42cf9b572f0ee1ec9c81Fabrice Di Meglio private static class TextDirectionHeuristicLocale extends TextDirectionHeuristicImpl { 2357810b5f8cffb3c2c98fd0df579f4da5a9ac6cc73Fabrice Di Meglio 2367810b5f8cffb3c2c98fd0df579f4da5a9ac6cc73Fabrice Di Meglio public TextDirectionHeuristicLocale() { 2377810b5f8cffb3c2c98fd0df579f4da5a9ac6cc73Fabrice Di Meglio super(null); 2387810b5f8cffb3c2c98fd0df579f4da5a9ac6cc73Fabrice Di Meglio } 2397810b5f8cffb3c2c98fd0df579f4da5a9ac6cc73Fabrice Di Meglio 2407810b5f8cffb3c2c98fd0df579f4da5a9ac6cc73Fabrice Di Meglio @Override 2417810b5f8cffb3c2c98fd0df579f4da5a9ac6cc73Fabrice Di Meglio protected boolean defaultIsRtl() { 2427810b5f8cffb3c2c98fd0df579f4da5a9ac6cc73Fabrice Di Meglio final int dir = LocaleUtil.getLayoutDirectionFromLocale(java.util.Locale.getDefault()); 2437810b5f8cffb3c2c98fd0df579f4da5a9ac6cc73Fabrice Di Meglio return (dir == LocaleUtil.TEXT_LAYOUT_DIRECTION_RTL_DO_NOT_USE); 2447810b5f8cffb3c2c98fd0df579f4da5a9ac6cc73Fabrice Di Meglio } 2457810b5f8cffb3c2c98fd0df579f4da5a9ac6cc73Fabrice Di Meglio 2467810b5f8cffb3c2c98fd0df579f4da5a9ac6cc73Fabrice Di Meglio public static final TextDirectionHeuristicLocale INSTANCE = 2477810b5f8cffb3c2c98fd0df579f4da5a9ac6cc73Fabrice Di Meglio new TextDirectionHeuristicLocale(); 2487810b5f8cffb3c2c98fd0df579f4da5a9ac6cc73Fabrice Di Meglio } 249cb379120456d8065d742021fc5c66748fc8a11a8Doug Felt} 250