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