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.util;
189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/**
209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Helps control and display a month view of a calendar that has a current
219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * selected day.
229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <ul>
239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *   <li>Keeps track of current month, day, year</li>
249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *   <li>Keeps track of current cursor position (row, column)</li>
259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *   <li>Provides methods to help display the calendar</li>
269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *   <li>Provides methods to move the cursor up / down / left / right.</li>
279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </ul>
289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * This should be used by anyone who presents a month view to users and wishes
309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * to behave consistently with other widgets and apps; if we ever change our
319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * mind about when to flip the month, we can change it here only.
329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @hide
349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic class DayOfMonthCursor extends MonthDisplayHelper {
369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private int mRow;
389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private int mColumn;
399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param year The initial year.
429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param month The initial month.
439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param dayOfMonth The initial dayOfMonth.
449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param weekStartDay What dayOfMonth of the week the week should start,
459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *   in terms of {@link java.util.Calendar} constants such as
469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *   {@link java.util.Calendar#SUNDAY}.
479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public DayOfMonthCursor(int year, int month, int dayOfMonth, int weekStartDay) {
499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        super(year, month, weekStartDay);
509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mRow = getRowOf(dayOfMonth);
519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mColumn = getColumnOf(dayOfMonth);
529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int getSelectedRow() {
569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mRow;
579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int getSelectedColumn() {
609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mColumn;
619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setSelectedRowColumn(int row, int col) {
649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mRow = row;
659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mColumn = col;
669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int getSelectedDayOfMonth() {
699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return getDayAt(mRow, mColumn);
709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return 0 if the selection is in the current month, otherwise -1 or +1
749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * depending on whether the selection is in the first or last row.
759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int getSelectedMonthOffset() {
779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (isWithinCurrentMonth(mRow, mColumn)) {
789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return 0;
799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mRow == 0) {
819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return -1;
829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return 1;
849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setSelectedDayOfMonth(int dayOfMonth) {
879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mRow = getRowOf(dayOfMonth);
889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mColumn = getColumnOf(dayOfMonth);
899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean isSelected(int row, int column) {
929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return (mRow == row) && (mColumn == column);
939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Move up one box, potentially flipping to the previous month.
979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return Whether the month was flipped to the previous month
989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *   due to the move.
999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean up() {
1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (isWithinCurrentMonth(mRow - 1, mColumn)) {
1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // within current month, just move up
1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mRow--;
1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return false;
1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // flip back to previous month, same column, first position within month
1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        previousMonth();
1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mRow = 5;
1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        while(!isWithinCurrentMonth(mRow, mColumn)) {
1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mRow--;
1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return true;
1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Move down one box, potentially flipping to the next month.
1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return Whether the month was flipped to the next month
1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *   due to the move.
1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean down() {
1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (isWithinCurrentMonth(mRow + 1, mColumn)) {
1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // within current month, just move down
1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mRow++;
1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return false;
1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // flip to next month, same column, first position within month
1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        nextMonth();
1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mRow = 0;
1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        while (!isWithinCurrentMonth(mRow, mColumn)) {
1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mRow++;
1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return true;
1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Move left one box, potentially flipping to the previous month.
1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return Whether the month was flipped to the previous month
1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *   due to the move.
1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean left() {
1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mColumn == 0) {
1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mRow--;
1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mColumn = 6;
1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else {
1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mColumn--;
1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (isWithinCurrentMonth(mRow, mColumn)) {
1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return false;
1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // need to flip to last day of previous month
1539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        previousMonth();
1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int lastDay = getNumberOfDaysInMonth();
1559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mRow = getRowOf(lastDay);
1569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mColumn = getColumnOf(lastDay);
1579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return true;
1589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Move right one box, potentially flipping to the next month.
1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return Whether the month was flipped to the next month
1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *   due to the move.
1649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean right() {
1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mColumn == 6) {
1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mRow++;
1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mColumn = 0;
1699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else {
1709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mColumn++;
1719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (isWithinCurrentMonth(mRow, mColumn)) {
1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return false;
1759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // need to flip to first day of next month
1789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        nextMonth();
1799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mRow = 0;
1809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mColumn = 0;
1819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        while (!isWithinCurrentMonth(mRow, mColumn)) {
1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mColumn++;
1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return true;
1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
188