package net.bible.android.view.util.buttongrid; import android.util.Log; import net.bible.android.view.util.buttongrid.ButtonGrid.ButtonInfo; import net.bible.service.common.CommonUtils; import org.apache.commons.lang3.StringUtils; import java.util.List; /** Calculate the number of columns and rows to be used to layout a grid of bible books, numbers, or whatever * * @author Martin Denham [mjdenham at gmail dot com] * @see gnu.lgpl.License for license details.<br> * The copyright to this program is held by it's author. */ public class LayoutDesigner { private static int MIN_COLS = 5; private static int MIN_COLS_LAND = 8; static class RowColLayout { int rows; int cols; /** column order if portrait mode to provide longer 'runs' */ boolean columnOrder; } private static final String TAG = "LayoutDesigner"; private static RowColLayout BIBLE_BOOK_LAYOUT = new RowColLayout(); private static RowColLayout BIBLE_BOOK_LAYOUT_LAND = new RowColLayout(); static { BIBLE_BOOK_LAYOUT.rows = 11; BIBLE_BOOK_LAYOUT.cols = 6; BIBLE_BOOK_LAYOUT_LAND.rows = 6; BIBLE_BOOK_LAYOUT_LAND.cols = 11; } RowColLayout calculateLayout(List<ButtonInfo> buttonInfoList) { RowColLayout rowColLayout = new RowColLayout(); int numButtons = buttonInfoList.size(); // is it the list of bible books if (buttonInfoList.size()==66 && !StringUtils.isNumeric(buttonInfoList.get(0).name)) { // bible books if (isPortrait()) { rowColLayout = BIBLE_BOOK_LAYOUT; } else { rowColLayout = BIBLE_BOOK_LAYOUT_LAND; } } else { // a list of chapters or verses if (numButtons<=50) { if (isPortrait()) { rowColLayout.rows = 10; } else { rowColLayout.rows = 5; } } else if (numButtons<=100){ rowColLayout.rows = 10; } else { if (isPortrait()) { rowColLayout.rows = 15; } else { rowColLayout.rows = 10; } } rowColLayout.cols = (int)Math.ceil(((float)numButtons)/rowColLayout.rows); // if there are too few buttons/rows you just see a couple of large buttons on the screen so ensure there are enough rows to look nice int minCols = isPortrait() ? MIN_COLS : MIN_COLS_LAND; rowColLayout.cols = Math.max(minCols, rowColLayout.cols); } rowColLayout.columnOrder = isPortrait(); Log.d(TAG, "Rows:"+rowColLayout.rows+" Cols:"+rowColLayout.cols); return rowColLayout; } private boolean isPortrait() { return CommonUtils.isPortrait(); } }