13561e3e665698843b1c664385a842e779198960bGeorge Mount/*
23561e3e665698843b1c664385a842e779198960bGeorge Mount * Copyright (C) 2015 The Android Open Source Project
33561e3e665698843b1c664385a842e779198960bGeorge Mount *
43561e3e665698843b1c664385a842e779198960bGeorge Mount * Licensed under the Apache License, Version 2.0 (the "License");
53561e3e665698843b1c664385a842e779198960bGeorge Mount * you may not use this file except in compliance with the License.
63561e3e665698843b1c664385a842e779198960bGeorge Mount * You may obtain a copy of the License at
73561e3e665698843b1c664385a842e779198960bGeorge Mount *
83561e3e665698843b1c664385a842e779198960bGeorge Mount *      http://www.apache.org/licenses/LICENSE-2.0
93561e3e665698843b1c664385a842e779198960bGeorge Mount *
103561e3e665698843b1c664385a842e779198960bGeorge Mount * Unless required by applicable law or agreed to in writing, software
113561e3e665698843b1c664385a842e779198960bGeorge Mount * distributed under the License is distributed on an "AS IS" BASIS,
123561e3e665698843b1c664385a842e779198960bGeorge Mount * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
133561e3e665698843b1c664385a842e779198960bGeorge Mount * See the License for the specific language governing permissions and
143561e3e665698843b1c664385a842e779198960bGeorge Mount * limitations under the License.
153561e3e665698843b1c664385a842e779198960bGeorge Mount */
16fead9ca09b117136b35bc5bf137340a754f9edddGeorge Mountpackage android.databinding.adapters;
173561e3e665698843b1c664385a842e779198960bGeorge Mount
18fead9ca09b117136b35bc5bf137340a754f9edddGeorge Mountimport android.databinding.BindingAdapter;
193561e3e665698843b1c664385a842e779198960bGeorge Mountimport android.util.SparseBooleanArray;
203561e3e665698843b1c664385a842e779198960bGeorge Mountimport android.widget.TableLayout;
213561e3e665698843b1c664385a842e779198960bGeorge Mount
223561e3e665698843b1c664385a842e779198960bGeorge Mountimport java.util.regex.Pattern;
233561e3e665698843b1c664385a842e779198960bGeorge Mount
243561e3e665698843b1c664385a842e779198960bGeorge Mountpublic class TableLayoutBindingAdapter {
253561e3e665698843b1c664385a842e779198960bGeorge Mount
263561e3e665698843b1c664385a842e779198960bGeorge Mount    private static Pattern sColumnPattern = Pattern.compile("\\s*,\\s*");
273561e3e665698843b1c664385a842e779198960bGeorge Mount
2871eb6908f2689bd17000237eb645896c36da0138George Mount    private static final int MAX_COLUMNS = 20;
2971eb6908f2689bd17000237eb645896c36da0138George Mount
3010960eb5f73fd587c2f8d18cfc61873c04017512George Mount    @BindingAdapter({"android:collapseColumns"})
313561e3e665698843b1c664385a842e779198960bGeorge Mount    public static void setCollapseColumns(TableLayout view, CharSequence columnsStr) {
323561e3e665698843b1c664385a842e779198960bGeorge Mount        SparseBooleanArray columns = parseColumns(columnsStr);
333561e3e665698843b1c664385a842e779198960bGeorge Mount        for (int i = 0; i < MAX_COLUMNS; i++) {
343561e3e665698843b1c664385a842e779198960bGeorge Mount            boolean isCollapsed = columns.get(i, false);
353561e3e665698843b1c664385a842e779198960bGeorge Mount            if (isCollapsed != view.isColumnCollapsed(i)) {
363561e3e665698843b1c664385a842e779198960bGeorge Mount                view.setColumnCollapsed(i, isCollapsed);
373561e3e665698843b1c664385a842e779198960bGeorge Mount            }
383561e3e665698843b1c664385a842e779198960bGeorge Mount        }
393561e3e665698843b1c664385a842e779198960bGeorge Mount    }
403561e3e665698843b1c664385a842e779198960bGeorge Mount
4110960eb5f73fd587c2f8d18cfc61873c04017512George Mount    @BindingAdapter({"android:shrinkColumns"})
423561e3e665698843b1c664385a842e779198960bGeorge Mount    public static void setShrinkColumns(TableLayout view, CharSequence columnsStr) {
4371eb6908f2689bd17000237eb645896c36da0138George Mount        if (columnsStr != null && columnsStr.length() > 0 && columnsStr.charAt(0) == '*') {
443561e3e665698843b1c664385a842e779198960bGeorge Mount            view.setShrinkAllColumns(true);
453561e3e665698843b1c664385a842e779198960bGeorge Mount        } else {
463561e3e665698843b1c664385a842e779198960bGeorge Mount            view.setShrinkAllColumns(false);
473561e3e665698843b1c664385a842e779198960bGeorge Mount            SparseBooleanArray columns = parseColumns(columnsStr);
4871eb6908f2689bd17000237eb645896c36da0138George Mount            int columnCount = columns.size();
4971eb6908f2689bd17000237eb645896c36da0138George Mount            for (int i = 0; i < columnCount; i++) {
5071eb6908f2689bd17000237eb645896c36da0138George Mount                int column = columns.keyAt(i);
5171eb6908f2689bd17000237eb645896c36da0138George Mount                boolean shrinkable = columns.valueAt(i);
5271eb6908f2689bd17000237eb645896c36da0138George Mount                if (shrinkable) {
5371eb6908f2689bd17000237eb645896c36da0138George Mount                    view.setColumnShrinkable(column, shrinkable);
543561e3e665698843b1c664385a842e779198960bGeorge Mount                }
553561e3e665698843b1c664385a842e779198960bGeorge Mount            }
563561e3e665698843b1c664385a842e779198960bGeorge Mount        }
573561e3e665698843b1c664385a842e779198960bGeorge Mount    }
583561e3e665698843b1c664385a842e779198960bGeorge Mount
5910960eb5f73fd587c2f8d18cfc61873c04017512George Mount    @BindingAdapter({"android:stretchColumns"})
603561e3e665698843b1c664385a842e779198960bGeorge Mount    public static void setStretchColumns(TableLayout view, CharSequence columnsStr) {
6171eb6908f2689bd17000237eb645896c36da0138George Mount        if (columnsStr != null && columnsStr.length() > 0 && columnsStr.charAt(0) == '*') {
623561e3e665698843b1c664385a842e779198960bGeorge Mount            view.setStretchAllColumns(true);
633561e3e665698843b1c664385a842e779198960bGeorge Mount        } else {
643561e3e665698843b1c664385a842e779198960bGeorge Mount            view.setStretchAllColumns(false);
653561e3e665698843b1c664385a842e779198960bGeorge Mount            SparseBooleanArray columns = parseColumns(columnsStr);
6671eb6908f2689bd17000237eb645896c36da0138George Mount            int columnCount = columns.size();
6771eb6908f2689bd17000237eb645896c36da0138George Mount            for (int i = 0; i < columnCount; i++) {
6871eb6908f2689bd17000237eb645896c36da0138George Mount                int column = columns.keyAt(i);
6971eb6908f2689bd17000237eb645896c36da0138George Mount                boolean stretchable = columns.valueAt(i);
7071eb6908f2689bd17000237eb645896c36da0138George Mount                if (stretchable) {
7171eb6908f2689bd17000237eb645896c36da0138George Mount                    view.setColumnStretchable(column, stretchable);
723561e3e665698843b1c664385a842e779198960bGeorge Mount                }
733561e3e665698843b1c664385a842e779198960bGeorge Mount            }
743561e3e665698843b1c664385a842e779198960bGeorge Mount        }
753561e3e665698843b1c664385a842e779198960bGeorge Mount    }
763561e3e665698843b1c664385a842e779198960bGeorge Mount
773561e3e665698843b1c664385a842e779198960bGeorge Mount    private static SparseBooleanArray parseColumns(CharSequence sequence) {
783561e3e665698843b1c664385a842e779198960bGeorge Mount        SparseBooleanArray columns = new SparseBooleanArray();
7971eb6908f2689bd17000237eb645896c36da0138George Mount        if (sequence == null) {
8071eb6908f2689bd17000237eb645896c36da0138George Mount            return columns;
8171eb6908f2689bd17000237eb645896c36da0138George Mount        }
823561e3e665698843b1c664385a842e779198960bGeorge Mount        String[] columnDefs = sColumnPattern.split(sequence);
833561e3e665698843b1c664385a842e779198960bGeorge Mount
843561e3e665698843b1c664385a842e779198960bGeorge Mount        for (String columnIdentifier : columnDefs) {
853561e3e665698843b1c664385a842e779198960bGeorge Mount            try {
863561e3e665698843b1c664385a842e779198960bGeorge Mount                int columnIndex = Integer.parseInt(columnIdentifier);
873561e3e665698843b1c664385a842e779198960bGeorge Mount                // only valid, i.e. positive, columns indexes are handled
883561e3e665698843b1c664385a842e779198960bGeorge Mount                if (columnIndex >= 0) {
893561e3e665698843b1c664385a842e779198960bGeorge Mount                    // putting true in this sparse array indicates that the
903561e3e665698843b1c664385a842e779198960bGeorge Mount                    // column index was defined in the XML file
913561e3e665698843b1c664385a842e779198960bGeorge Mount                    columns.put(columnIndex, true);
923561e3e665698843b1c664385a842e779198960bGeorge Mount                }
933561e3e665698843b1c664385a842e779198960bGeorge Mount            } catch (NumberFormatException e) {
943561e3e665698843b1c664385a842e779198960bGeorge Mount                // we just ignore columns that don't exist
953561e3e665698843b1c664385a842e779198960bGeorge Mount            }
963561e3e665698843b1c664385a842e779198960bGeorge Mount        }
973561e3e665698843b1c664385a842e779198960bGeorge Mount
983561e3e665698843b1c664385a842e779198960bGeorge Mount        return columns;
993561e3e665698843b1c664385a842e779198960bGeorge Mount    }
1003561e3e665698843b1c664385a842e779198960bGeorge Mount}
101