19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/* 29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copyright (C) 2007 The Android Open Source Project 39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * you may not use this file except in compliance with the License. 69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * You may obtain a copy of the License at 79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See the License for the specific language governing permissions and 149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * limitations under the License. 159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpackage android.widget; 189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1994a6d15ede149189bba9e5f474ed853c98230e75Siva Velusamyimport android.annotation.NonNull; 209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.Context; 219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.res.TypedArray; 229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.AttributeSet; 239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.SparseIntArray; 249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.Gravity; 259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.View; 269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.ViewDebug; 27f5c6eff63d19a9f7a970a4f90619edac873c006dGilles Debunneimport android.view.ViewGroup; 2894a6d15ede149189bba9e5f474ed853c98230e75Siva Velusamyimport android.view.ViewHierarchyEncoder; 299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/** 319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>A layout that arranges its children horizontally. A TableRow should 329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * always be used as a child of a {@link android.widget.TableLayout}. If a 339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * TableRow's parent is not a TableLayout, the TableRow will behave as 349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * an horizontal {@link android.widget.LinearLayout}.</p> 359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>The children of a TableRow do not need to specify the 379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <code>layout_width</code> and <code>layout_height</code> attributes in the 389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * XML file. TableRow always enforces those values to be respectively 39980a938c1c9a6a5791a8240e5a1e6638ab28dc77Romain Guy * {@link android.widget.TableLayout.LayoutParams#MATCH_PARENT} and 409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.widget.TableLayout.LayoutParams#WRAP_CONTENT}.</p> 419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p> 439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Also see {@link TableRow.LayoutParams android.widget.TableRow.LayoutParams} 449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * for layout attributes </p> 459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic class TableRow extends LinearLayout { 479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private int mNumColumns = 0; 489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private int[] mColumnWidths; 499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private int[] mConstrainedColumnWidths; 509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private SparseIntArray mColumnToChildIndex; 519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private ChildrenTracker mChildrenTracker; 539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Creates a new TableRow for the given context.</p> 569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param context the application environment 589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public TableRow(Context context) { 609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super(context); 619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project initTableRow(); 629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Creates a new TableRow for the given context and with the 669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * specified set attributes.</p> 679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param context the application environment 699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param attrs a collection of attributes 709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public TableRow(Context context, AttributeSet attrs) { 729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super(context, attrs); 739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project initTableRow(); 749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private void initTableRow() { 779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project OnHierarchyChangeListener oldListener = mOnHierarchyChangeListener; 789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mChildrenTracker = new ChildrenTracker(); 799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (oldListener != null) { 809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mChildrenTracker.setOnHierarchyChangeListener(oldListener); 819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super.setOnHierarchyChangeListener(mChildrenTracker); 839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@inheritDoc} 879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setOnHierarchyChangeListener(OnHierarchyChangeListener listener) { 909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mChildrenTracker.setOnHierarchyChangeListener(listener); 919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Collapses or restores a given column.</p> 959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param columnIndex the index of the column 979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param collapsed true if the column must be collapsed, false otherwise 989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@hide} 999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void setColumnCollapsed(int columnIndex, boolean collapsed) { 101ad52693cf3dfe3f5e84f5a22fe4c3787f2f2cbfbAlan Viverette final View child = getVirtualChildAt(columnIndex); 1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (child != null) { 1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project child.setVisibility(collapsed ? GONE : VISIBLE); 1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@inheritDoc} 1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { 1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // enforce horizontal layout 1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project measureHorizontal(widthMeasureSpec, heightMeasureSpec); 1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@inheritDoc} 1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected void onLayout(boolean changed, int l, int t, int r, int b) { 1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // enforce horizontal layout 122ad365cc217c989c3b688ae839d6f94ee8889a84ePhilip Milne layoutHorizontal(l, t, r, b); 1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@inheritDoc} 1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public View getVirtualChildAt(int i) { 1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mColumnToChildIndex == null) { 1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mapIndexAndColumns(); 1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int deflectedIndex = mColumnToChildIndex.get(i, -1); 1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (deflectedIndex != -1) { 1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return getChildAt(deflectedIndex); 1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@inheritDoc} 1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int getVirtualChildCount() { 1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mColumnToChildIndex == null) { 1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mapIndexAndColumns(); 1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mNumColumns; 1519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private void mapIndexAndColumns() { 1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mColumnToChildIndex == null) { 1559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int virtualCount = 0; 1569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int count = getChildCount(); 1579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mColumnToChildIndex = new SparseIntArray(); 1599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final SparseIntArray columnToChild = mColumnToChildIndex; 1609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i = 0; i < count; i++) { 1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final View child = getChildAt(i); 1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final LayoutParams layoutParams = (LayoutParams) child.getLayoutParams(); 1649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (layoutParams.column >= virtualCount) { 1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project virtualCount = layoutParams.column; 1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int j = 0; j < layoutParams.span; j++) { 1709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project columnToChild.put(virtualCount++, i); 1719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mNumColumns = virtualCount; 1759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@inheritDoc} 1809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int measureNullChild(int childIndex) { 1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mConstrainedColumnWidths[childIndex]; 1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@inheritDoc} 1889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 1909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void measureChildBeforeLayout(View child, int childIndex, 1919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int widthMeasureSpec, int totalWidth, 1929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int heightMeasureSpec, int totalHeight) { 1939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mConstrainedColumnWidths != null) { 1949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final LayoutParams lp = (LayoutParams) child.getLayoutParams(); 1959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int measureMode = MeasureSpec.EXACTLY; 1979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int columnWidth = 0; 1989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int span = lp.span; 2009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int[] constrainedColumnWidths = mConstrainedColumnWidths; 2019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i = 0; i < span; i++) { 2029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project columnWidth += constrainedColumnWidths[childIndex + i]; 2039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int gravity = lp.gravity; 2069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final boolean isHorizontalGravity = Gravity.isHorizontal(gravity); 2079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (isHorizontalGravity) { 2099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project measureMode = MeasureSpec.AT_MOST; 2109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // no need to care about padding here, 2139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // ViewGroup.getChildMeasureSpec() would get rid of it anyway 2149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // because of the EXACTLY measure spec we use 2159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int childWidthMeasureSpec = MeasureSpec.makeMeasureSpec( 2169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Math.max(0, columnWidth - lp.leftMargin - lp.rightMargin), measureMode 2179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ); 2189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int childHeightMeasureSpec = getChildMeasureSpec(heightMeasureSpec, 2199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPaddingTop + mPaddingBottom + lp.topMargin + 2209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project lp .bottomMargin + totalHeight, lp.height); 2219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project child.measure(childWidthMeasureSpec, childHeightMeasureSpec); 2239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (isHorizontalGravity) { 2259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int childWidth = child.getMeasuredWidth(); 2269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project lp.mOffset[LayoutParams.LOCATION_NEXT] = columnWidth - childWidth; 2279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 228bb4b601673a4f910d3e467bc5ce39538438859ceFabrice Di Meglio final int layoutDirection = getLayoutDirection(); 229c0053223bedf33581b0830fb87be32c1f26e5372Fabrice Di Meglio final int absoluteGravity = Gravity.getAbsoluteGravity(gravity, layoutDirection); 2306a03640539405afbdefe72894759281b98aa6e6fFabrice Di Meglio switch (absoluteGravity & Gravity.HORIZONTAL_GRAVITY_MASK) { 2319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case Gravity.LEFT: 2329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // don't offset on X axis 2339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 2349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case Gravity.RIGHT: 2359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project lp.mOffset[LayoutParams.LOCATION] = lp.mOffset[LayoutParams.LOCATION_NEXT]; 2369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 2379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case Gravity.CENTER_HORIZONTAL: 2389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project lp.mOffset[LayoutParams.LOCATION] = lp.mOffset[LayoutParams.LOCATION_NEXT] / 2; 2399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 2409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 2429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project lp.mOffset[LayoutParams.LOCATION] = lp.mOffset[LayoutParams.LOCATION_NEXT] = 0; 2439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 2459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // fail silently when column widths are not available 2469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super.measureChildBeforeLayout(child, childIndex, widthMeasureSpec, 2479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project totalWidth, heightMeasureSpec, totalHeight); 2489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@inheritDoc} 2539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 2559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int getChildrenSkipCount(View child, int index) { 2569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project LayoutParams layoutParams = (LayoutParams) child.getLayoutParams(); 2579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // when the span is 1 (default), we need to skip 0 child 2599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return layoutParams.span - 1; 2609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@inheritDoc} 2649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 2669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int getLocationOffset(View child) { 2679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return ((TableRow.LayoutParams) child.getLayoutParams()).mOffset[LayoutParams.LOCATION]; 2689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@inheritDoc} 2729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 2749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int getNextLocationOffset(View child) { 2759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return ((TableRow.LayoutParams) child.getLayoutParams()).mOffset[LayoutParams.LOCATION_NEXT]; 2769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Measures the preferred width of each child, including its margins.</p> 2809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 2819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param widthMeasureSpec the width constraint imposed by our parent 2829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 2839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return an array of integers corresponding to the width of each cell, or 2849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * column, in this row 2859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@hide} 2869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 287b6824bf58a0cd34395993fa204217e8e246de6fbFilip Gruszczynski int[] getColumnsWidths(int widthMeasureSpec, int heightMeasureSpec) { 2889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int numColumns = getVirtualChildCount(); 2899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mColumnWidths == null || numColumns != mColumnWidths.length) { 2909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mColumnWidths = new int[numColumns]; 2919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int[] columnWidths = mColumnWidths; 2949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i = 0; i < numColumns; i++) { 2969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final View child = getVirtualChildAt(i); 2979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (child != null && child.getVisibility() != GONE) { 2989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final LayoutParams layoutParams = (LayoutParams) child.getLayoutParams(); 2999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (layoutParams.span == 1) { 3009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int spec; 3019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project switch (layoutParams.width) { 3029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case LayoutParams.WRAP_CONTENT: 3039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project spec = getChildMeasureSpec(widthMeasureSpec, 0, LayoutParams.WRAP_CONTENT); 3049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 305980a938c1c9a6a5791a8240e5a1e6638ab28dc77Romain Guy case LayoutParams.MATCH_PARENT: 306d5dbf4b2a09c9cf2d17fa6af3fdf75d1fb774056Adam Powell spec = MeasureSpec.makeSafeMeasureSpec( 307b6824bf58a0cd34395993fa204217e8e246de6fbFilip Gruszczynski MeasureSpec.getSize(heightMeasureSpec), 308b6824bf58a0cd34395993fa204217e8e246de6fbFilip Gruszczynski MeasureSpec.UNSPECIFIED); 3099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 3109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project default: 3119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project spec = MeasureSpec.makeMeasureSpec(layoutParams.width, MeasureSpec.EXACTLY); 3129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project child.measure(spec, spec); 3149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int width = child.getMeasuredWidth() + layoutParams.leftMargin + 3169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project layoutParams.rightMargin; 3179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project columnWidths[i] = width; 3189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 3199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project columnWidths[i] = 0; 3209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 3229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project columnWidths[i] = 0; 3239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return columnWidths; 3279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Sets the width of all of the columns in this row. At layout time, 3319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * this row sets a fixed width, as defined by <code>columnWidths</code>, 3329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * on each child (or cell, or column.)</p> 3339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 3349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param columnWidths the fixed width of each column that this row must 3359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * honor 3369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @throws IllegalArgumentException when columnWidths' length is smaller 3379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * than the number of children in this row 3389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@hide} 3399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void setColumnsWidthConstraints(int[] columnWidths) { 3419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (columnWidths == null || columnWidths.length < getVirtualChildCount()) { 3429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new IllegalArgumentException( 3439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "columnWidths should be >= getVirtualChildCount()"); 3449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mConstrainedColumnWidths = columnWidths; 3479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@inheritDoc} 3519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 3539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public LayoutParams generateLayoutParams(AttributeSet attrs) { 3549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return new TableRow.LayoutParams(getContext(), attrs); 3559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Returns a set of layout parameters with a width of 359980a938c1c9a6a5791a8240e5a1e6638ab28dc77Romain Guy * {@link android.view.ViewGroup.LayoutParams#MATCH_PARENT}, 3609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * a height of {@link android.view.ViewGroup.LayoutParams#WRAP_CONTENT} and no spanning. 3619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 3639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected LinearLayout.LayoutParams generateDefaultLayoutParams() { 3649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return new LayoutParams(); 3659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@inheritDoc} 3699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 3719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected boolean checkLayoutParams(ViewGroup.LayoutParams p) { 3729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return p instanceof TableRow.LayoutParams; 3739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@inheritDoc} 3779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 3799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected LinearLayout.LayoutParams generateLayoutParams(ViewGroup.LayoutParams p) { 3809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return new LayoutParams(p); 3819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3838a78fd4d9572dff95432fcc4ba0e87563415b728Svetoslav Ganov @Override 384a7bb6fbeab933326d58aa806d8194b7b13239d34Dianne Hackborn public CharSequence getAccessibilityClassName() { 385a7bb6fbeab933326d58aa806d8194b7b13239d34Dianne Hackborn return TableRow.class.getName(); 3868a78fd4d9572dff95432fcc4ba0e87563415b728Svetoslav Ganov } 3878a78fd4d9572dff95432fcc4ba0e87563415b728Svetoslav Ganov 3889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Set of layout parameters used in table rows.</p> 3909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 3919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see android.widget.TableLayout.LayoutParams 3929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 3939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @attr ref android.R.styleable#TableRow_Cell_layout_column 3949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @attr ref android.R.styleable#TableRow_Cell_layout_span 3959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static class LayoutParams extends LinearLayout.LayoutParams { 3979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>The column index of the cell represented by the widget.</p> 3999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 400bea95162ca25bd00b0479d93739b6283795c3986Konstantin Lopyrev @ViewDebug.ExportedProperty(category = "layout") 4019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int column; 4029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 4049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>The number of columns the widgets spans over.</p> 4059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 406bea95162ca25bd00b0479d93739b6283795c3986Konstantin Lopyrev @ViewDebug.ExportedProperty(category = "layout") 4079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int span; 4089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final int LOCATION = 0; 4109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final int LOCATION_NEXT = 1; 4119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private int[] mOffset = new int[2]; 4139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 4159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@inheritDoc} 4169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 4179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public LayoutParams(Context c, AttributeSet attrs) { 4189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super(c, attrs); 4199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project TypedArray a = 4219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project c.obtainStyledAttributes(attrs, 4229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.TableRow_Cell); 4239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project column = a.getInt(com.android.internal.R.styleable.TableRow_Cell_layout_column, -1); 4259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project span = a.getInt(com.android.internal.R.styleable.TableRow_Cell_layout_span, 1); 4269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (span <= 1) { 4279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project span = 1; 4289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project a.recycle(); 4319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 4349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Sets the child width and the child height.</p> 4359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 4369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param w the desired width 4379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param h the desired height 4389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 4399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public LayoutParams(int w, int h) { 4409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super(w, h); 4419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project column = -1; 4429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project span = 1; 4439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 4469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Sets the child width, height and weight.</p> 4479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 4489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param w the desired width 4499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param h the desired height 4509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param initWeight the desired weight 4519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 4529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public LayoutParams(int w, int h, float initWeight) { 4539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super(w, h, initWeight); 4549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project column = -1; 4559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project span = 1; 4569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 4599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Sets the child width to {@link android.view.ViewGroup.LayoutParams} 4609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * and the child height to 4619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.view.ViewGroup.LayoutParams#WRAP_CONTENT}.</p> 4629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 4639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public LayoutParams() { 464980a938c1c9a6a5791a8240e5a1e6638ab28dc77Romain Guy super(MATCH_PARENT, WRAP_CONTENT); 4659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project column = -1; 4669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project span = 1; 4679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 4709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Puts the view in the specified column.</p> 4719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 472980a938c1c9a6a5791a8240e5a1e6638ab28dc77Romain Guy * <p>Sets the child width to {@link android.view.ViewGroup.LayoutParams#MATCH_PARENT} 4739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * and the child height to 4749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.view.ViewGroup.LayoutParams#WRAP_CONTENT}.</p> 4759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 4769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param column the column index for the view 4779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 4789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public LayoutParams(int column) { 4799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this(); 4809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this.column = column; 4819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 4849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@inheritDoc} 4859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 4869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public LayoutParams(ViewGroup.LayoutParams p) { 4879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super(p); 4889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 4919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@inheritDoc} 4929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 4939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public LayoutParams(MarginLayoutParams source) { 4949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super(source); 4959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 4989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected void setBaseAttributes(TypedArray a, int widthAttr, int heightAttr) { 499579e14016c4a972e70cd2bd0c6d89bbd7e9e941cDave Burke // We don't want to force users to specify a layout_width 500579e14016c4a972e70cd2bd0c6d89bbd7e9e941cDave Burke if (a.hasValue(widthAttr)) { 501579e14016c4a972e70cd2bd0c6d89bbd7e9e941cDave Burke width = a.getLayoutDimension(widthAttr, "layout_width"); 502579e14016c4a972e70cd2bd0c6d89bbd7e9e941cDave Burke } else { 503579e14016c4a972e70cd2bd0c6d89bbd7e9e941cDave Burke width = MATCH_PARENT; 504579e14016c4a972e70cd2bd0c6d89bbd7e9e941cDave Burke } 505579e14016c4a972e70cd2bd0c6d89bbd7e9e941cDave Burke 506579e14016c4a972e70cd2bd0c6d89bbd7e9e941cDave Burke // We don't want to force users to specify a layout_height 507579e14016c4a972e70cd2bd0c6d89bbd7e9e941cDave Burke if (a.hasValue(heightAttr)) { 508579e14016c4a972e70cd2bd0c6d89bbd7e9e941cDave Burke height = a.getLayoutDimension(heightAttr, "layout_height"); 509579e14016c4a972e70cd2bd0c6d89bbd7e9e941cDave Burke } else { 510579e14016c4a972e70cd2bd0c6d89bbd7e9e941cDave Burke height = WRAP_CONTENT; 511579e14016c4a972e70cd2bd0c6d89bbd7e9e941cDave Burke } 5129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 51394a6d15ede149189bba9e5f474ed853c98230e75Siva Velusamy 51494a6d15ede149189bba9e5f474ed853c98230e75Siva Velusamy /** @hide */ 51594a6d15ede149189bba9e5f474ed853c98230e75Siva Velusamy @Override 51694a6d15ede149189bba9e5f474ed853c98230e75Siva Velusamy protected void encodeProperties(@NonNull ViewHierarchyEncoder encoder) { 51794a6d15ede149189bba9e5f474ed853c98230e75Siva Velusamy super.encodeProperties(encoder); 51894a6d15ede149189bba9e5f474ed853c98230e75Siva Velusamy encoder.addProperty("layout:column", column); 51994a6d15ede149189bba9e5f474ed853c98230e75Siva Velusamy encoder.addProperty("layout:span", span); 52094a6d15ede149189bba9e5f474ed853c98230e75Siva Velusamy } 5219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // special transparent hierarchy change listener 5249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private class ChildrenTracker implements OnHierarchyChangeListener { 5259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private OnHierarchyChangeListener listener; 5269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private void setOnHierarchyChangeListener(OnHierarchyChangeListener listener) { 5289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this.listener = listener; 5299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void onChildViewAdded(View parent, View child) { 5329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // dirties the index to column map 5339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mColumnToChildIndex = null; 5349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (this.listener != null) { 5369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this.listener.onChildViewAdded(parent, child); 5379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void onChildViewRemoved(View parent, View child) { 5419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // dirties the index to column map 5429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mColumnToChildIndex = null; 5439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (this.listener != null) { 5459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this.listener.onChildViewRemoved(parent, child); 5469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 550