1 /* 2 * Copyright (C) 2014 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 18 package android.widget; 19 20 /** 21 * RtlSpacingHelper manages the relationship between left/right and start/end for views 22 * that need to maintain both absolute and relative settings for a form of spacing similar 23 * to view padding. 24 */ 25 class RtlSpacingHelper { 26 public static final int UNDEFINED = Integer.MIN_VALUE; 27 28 private int mLeft = 0; 29 private int mRight = 0; 30 private int mStart = UNDEFINED; 31 private int mEnd = UNDEFINED; 32 private int mExplicitLeft = 0; 33 private int mExplicitRight = 0; 34 35 private boolean mIsRtl = false; 36 private boolean mIsRelative = false; 37 getLeft()38 public int getLeft() { 39 return mLeft; 40 } 41 getRight()42 public int getRight() { 43 return mRight; 44 } 45 getStart()46 public int getStart() { 47 return mIsRtl ? mRight : mLeft; 48 } 49 getEnd()50 public int getEnd() { 51 return mIsRtl ? mLeft : mRight; 52 } 53 setRelative(int start, int end)54 public void setRelative(int start, int end) { 55 mStart = start; 56 mEnd = end; 57 mIsRelative = true; 58 if (mIsRtl) { 59 if (end != UNDEFINED) mLeft = end; 60 if (start != UNDEFINED) mRight = start; 61 } else { 62 if (start != UNDEFINED) mLeft = start; 63 if (end != UNDEFINED) mRight = end; 64 } 65 } 66 setAbsolute(int left, int right)67 public void setAbsolute(int left, int right) { 68 mIsRelative = false; 69 if (left != UNDEFINED) mLeft = mExplicitLeft = left; 70 if (right != UNDEFINED) mRight = mExplicitRight = right; 71 } 72 setDirection(boolean isRtl)73 public void setDirection(boolean isRtl) { 74 if (isRtl == mIsRtl) { 75 return; 76 } 77 mIsRtl = isRtl; 78 if (mIsRelative) { 79 if (isRtl) { 80 mLeft = mEnd != UNDEFINED ? mEnd : mExplicitLeft; 81 mRight = mStart != UNDEFINED ? mStart : mExplicitRight; 82 } else { 83 mLeft = mStart != UNDEFINED ? mStart : mExplicitLeft; 84 mRight = mEnd != UNDEFINED ? mEnd : mExplicitRight; 85 } 86 } else { 87 mLeft = mExplicitLeft; 88 mRight = mExplicitRight; 89 } 90 } 91 } 92