TableLayoutBindingAdapter.java revision 10960eb5f73fd587c2f8d18cfc61873c04017512
1/*
2 * Copyright (C) 2015 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 *      http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16package android.databinding.adapters;
17
18import android.databinding.BindingAdapter;
19import android.util.SparseBooleanArray;
20import android.widget.TableLayout;
21
22import java.util.regex.Pattern;
23
24public class TableLayoutBindingAdapter {
25
26    private static Pattern sColumnPattern = Pattern.compile("\\s*,\\s*");
27
28    private static final int MAX_COLUMNS = 20;
29
30    @BindingAdapter({"android:collapseColumns"})
31    public static void setCollapseColumns(TableLayout view, CharSequence columnsStr) {
32        SparseBooleanArray columns = parseColumns(columnsStr);
33        for (int i = 0; i < MAX_COLUMNS; i++) {
34            boolean isCollapsed = columns.get(i, false);
35            if (isCollapsed != view.isColumnCollapsed(i)) {
36                view.setColumnCollapsed(i, isCollapsed);
37            }
38        }
39    }
40
41    @BindingAdapter({"android:shrinkColumns"})
42    public static void setShrinkColumns(TableLayout view, CharSequence columnsStr) {
43        if (columnsStr != null && columnsStr.length() > 0 && columnsStr.charAt(0) == '*') {
44            view.setShrinkAllColumns(true);
45        } else {
46            view.setShrinkAllColumns(false);
47            SparseBooleanArray columns = parseColumns(columnsStr);
48            int columnCount = columns.size();
49            for (int i = 0; i < columnCount; i++) {
50                int column = columns.keyAt(i);
51                boolean shrinkable = columns.valueAt(i);
52                if (shrinkable) {
53                    view.setColumnShrinkable(column, shrinkable);
54                }
55            }
56        }
57    }
58
59    @BindingAdapter({"android:stretchColumns"})
60    public static void setStretchColumns(TableLayout view, CharSequence columnsStr) {
61        if (columnsStr != null && columnsStr.length() > 0 && columnsStr.charAt(0) == '*') {
62            view.setStretchAllColumns(true);
63        } else {
64            view.setStretchAllColumns(false);
65            SparseBooleanArray columns = parseColumns(columnsStr);
66            int columnCount = columns.size();
67            for (int i = 0; i < columnCount; i++) {
68                int column = columns.keyAt(i);
69                boolean stretchable = columns.valueAt(i);
70                if (stretchable) {
71                    view.setColumnStretchable(column, stretchable);
72                }
73            }
74        }
75    }
76
77    private static SparseBooleanArray parseColumns(CharSequence sequence) {
78        SparseBooleanArray columns = new SparseBooleanArray();
79        if (sequence == null) {
80            return columns;
81        }
82        String[] columnDefs = sColumnPattern.split(sequence);
83
84        for (String columnIdentifier : columnDefs) {
85            try {
86                int columnIndex = Integer.parseInt(columnIdentifier);
87                // only valid, i.e. positive, columns indexes are handled
88                if (columnIndex >= 0) {
89                    // putting true in this sparse array indicates that the
90                    // column index was defined in the XML file
91                    columns.put(columnIndex, true);
92                }
93            } catch (NumberFormatException e) {
94                // we just ignore columns that don't exist
95            }
96        }
97
98        return columns;
99    }
100}
101