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