1ad36a3c3cde7a2ec6d3a35d2529d46f03bd8d59dMichael Chan/*
2ad36a3c3cde7a2ec6d3a35d2529d46f03bd8d59dMichael Chan * Copyright (C) 2007 The Android Open Source Project
3ad36a3c3cde7a2ec6d3a35d2529d46f03bd8d59dMichael Chan *
4ad36a3c3cde7a2ec6d3a35d2529d46f03bd8d59dMichael Chan * Licensed under the Apache License, Version 2.0 (the "License");
5ad36a3c3cde7a2ec6d3a35d2529d46f03bd8d59dMichael Chan * you may not use this file except in compliance with the License.
6ad36a3c3cde7a2ec6d3a35d2529d46f03bd8d59dMichael Chan * You may obtain a copy of the License at
7ad36a3c3cde7a2ec6d3a35d2529d46f03bd8d59dMichael Chan *
8ad36a3c3cde7a2ec6d3a35d2529d46f03bd8d59dMichael Chan *      http://www.apache.org/licenses/LICENSE-2.0
9ad36a3c3cde7a2ec6d3a35d2529d46f03bd8d59dMichael Chan *
10ad36a3c3cde7a2ec6d3a35d2529d46f03bd8d59dMichael Chan * Unless required by applicable law or agreed to in writing, software
11ad36a3c3cde7a2ec6d3a35d2529d46f03bd8d59dMichael Chan * distributed under the License is distributed on an "AS IS" BASIS,
12ad36a3c3cde7a2ec6d3a35d2529d46f03bd8d59dMichael Chan * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13ad36a3c3cde7a2ec6d3a35d2529d46f03bd8d59dMichael Chan * See the License for the specific language governing permissions and
14ad36a3c3cde7a2ec6d3a35d2529d46f03bd8d59dMichael Chan * limitations under the License.
15ad36a3c3cde7a2ec6d3a35d2529d46f03bd8d59dMichael Chan */
16ad36a3c3cde7a2ec6d3a35d2529d46f03bd8d59dMichael Chan
17ad36a3c3cde7a2ec6d3a35d2529d46f03bd8d59dMichael Chanpackage com.android.calendar;
18ad36a3c3cde7a2ec6d3a35d2529d46f03bd8d59dMichael Chan
19ad36a3c3cde7a2ec6d3a35d2529d46f03bd8d59dMichael Chanimport android.util.MonthDisplayHelper;
20ad36a3c3cde7a2ec6d3a35d2529d46f03bd8d59dMichael Chan
21ad36a3c3cde7a2ec6d3a35d2529d46f03bd8d59dMichael Chan/**
22ad36a3c3cde7a2ec6d3a35d2529d46f03bd8d59dMichael Chan * Helps control and display a month view of a calendar that has a current
23ad36a3c3cde7a2ec6d3a35d2529d46f03bd8d59dMichael Chan * selected day.
24ad36a3c3cde7a2ec6d3a35d2529d46f03bd8d59dMichael Chan * <ul>
25ad36a3c3cde7a2ec6d3a35d2529d46f03bd8d59dMichael Chan *   <li>Keeps track of current month, day, year</li>
26ad36a3c3cde7a2ec6d3a35d2529d46f03bd8d59dMichael Chan *   <li>Keeps track of current cursor position (row, column)</li>
27ad36a3c3cde7a2ec6d3a35d2529d46f03bd8d59dMichael Chan *   <li>Provides methods to help display the calendar</li>
28ad36a3c3cde7a2ec6d3a35d2529d46f03bd8d59dMichael Chan *   <li>Provides methods to move the cursor up / down / left / right.</li>
29ad36a3c3cde7a2ec6d3a35d2529d46f03bd8d59dMichael Chan * </ul>
30ad36a3c3cde7a2ec6d3a35d2529d46f03bd8d59dMichael Chan *
31ad36a3c3cde7a2ec6d3a35d2529d46f03bd8d59dMichael Chan * This should be used by anyone who presents a month view to users and wishes
32ad36a3c3cde7a2ec6d3a35d2529d46f03bd8d59dMichael Chan * to behave consistently with other widgets and apps; if we ever change our
33ad36a3c3cde7a2ec6d3a35d2529d46f03bd8d59dMichael Chan * mind about when to flip the month, we can change it here only.
34ad36a3c3cde7a2ec6d3a35d2529d46f03bd8d59dMichael Chan *
35ad36a3c3cde7a2ec6d3a35d2529d46f03bd8d59dMichael Chan * @hide
36ad36a3c3cde7a2ec6d3a35d2529d46f03bd8d59dMichael Chan */
37ad36a3c3cde7a2ec6d3a35d2529d46f03bd8d59dMichael Chanpublic class DayOfMonthCursor extends MonthDisplayHelper {
38ad36a3c3cde7a2ec6d3a35d2529d46f03bd8d59dMichael Chan
39ad36a3c3cde7a2ec6d3a35d2529d46f03bd8d59dMichael Chan    private int mRow;
40ad36a3c3cde7a2ec6d3a35d2529d46f03bd8d59dMichael Chan    private int mColumn;
41ad36a3c3cde7a2ec6d3a35d2529d46f03bd8d59dMichael Chan
42ad36a3c3cde7a2ec6d3a35d2529d46f03bd8d59dMichael Chan    /**
43ad36a3c3cde7a2ec6d3a35d2529d46f03bd8d59dMichael Chan     * @param year The initial year.
44ad36a3c3cde7a2ec6d3a35d2529d46f03bd8d59dMichael Chan     * @param month The initial month.
45ad36a3c3cde7a2ec6d3a35d2529d46f03bd8d59dMichael Chan     * @param dayOfMonth The initial dayOfMonth.
46ad36a3c3cde7a2ec6d3a35d2529d46f03bd8d59dMichael Chan     * @param weekStartDay What dayOfMonth of the week the week should start,
47ad36a3c3cde7a2ec6d3a35d2529d46f03bd8d59dMichael Chan     *   in terms of {@link java.util.Calendar} constants such as
48ad36a3c3cde7a2ec6d3a35d2529d46f03bd8d59dMichael Chan     *   {@link java.util.Calendar#SUNDAY}.
49ad36a3c3cde7a2ec6d3a35d2529d46f03bd8d59dMichael Chan     */
50ad36a3c3cde7a2ec6d3a35d2529d46f03bd8d59dMichael Chan    public DayOfMonthCursor(int year, int month, int dayOfMonth, int weekStartDay) {
51ad36a3c3cde7a2ec6d3a35d2529d46f03bd8d59dMichael Chan        super(year, month, weekStartDay);
52ad36a3c3cde7a2ec6d3a35d2529d46f03bd8d59dMichael Chan        mRow = getRowOf(dayOfMonth);
53ad36a3c3cde7a2ec6d3a35d2529d46f03bd8d59dMichael Chan        mColumn = getColumnOf(dayOfMonth);
54ad36a3c3cde7a2ec6d3a35d2529d46f03bd8d59dMichael Chan    }
55ad36a3c3cde7a2ec6d3a35d2529d46f03bd8d59dMichael Chan
56ad36a3c3cde7a2ec6d3a35d2529d46f03bd8d59dMichael Chan
57ad36a3c3cde7a2ec6d3a35d2529d46f03bd8d59dMichael Chan    public int getSelectedRow() {
58ad36a3c3cde7a2ec6d3a35d2529d46f03bd8d59dMichael Chan        return mRow;
59ad36a3c3cde7a2ec6d3a35d2529d46f03bd8d59dMichael Chan    }
60ad36a3c3cde7a2ec6d3a35d2529d46f03bd8d59dMichael Chan
61ad36a3c3cde7a2ec6d3a35d2529d46f03bd8d59dMichael Chan    public int getSelectedColumn() {
62ad36a3c3cde7a2ec6d3a35d2529d46f03bd8d59dMichael Chan        return mColumn;
63ad36a3c3cde7a2ec6d3a35d2529d46f03bd8d59dMichael Chan    }
64ad36a3c3cde7a2ec6d3a35d2529d46f03bd8d59dMichael Chan
65ad36a3c3cde7a2ec6d3a35d2529d46f03bd8d59dMichael Chan    public void setSelectedRowColumn(int row, int col) {
66ad36a3c3cde7a2ec6d3a35d2529d46f03bd8d59dMichael Chan        mRow = row;
67ad36a3c3cde7a2ec6d3a35d2529d46f03bd8d59dMichael Chan        mColumn = col;
68ad36a3c3cde7a2ec6d3a35d2529d46f03bd8d59dMichael Chan    }
69ad36a3c3cde7a2ec6d3a35d2529d46f03bd8d59dMichael Chan
70ad36a3c3cde7a2ec6d3a35d2529d46f03bd8d59dMichael Chan    public int getSelectedDayOfMonth() {
71ad36a3c3cde7a2ec6d3a35d2529d46f03bd8d59dMichael Chan        return getDayAt(mRow, mColumn);
72ad36a3c3cde7a2ec6d3a35d2529d46f03bd8d59dMichael Chan    }
73ad36a3c3cde7a2ec6d3a35d2529d46f03bd8d59dMichael Chan
74ad36a3c3cde7a2ec6d3a35d2529d46f03bd8d59dMichael Chan    /**
75ad36a3c3cde7a2ec6d3a35d2529d46f03bd8d59dMichael Chan     * @return 0 if the selection is in the current month, otherwise -1 or +1
76ad36a3c3cde7a2ec6d3a35d2529d46f03bd8d59dMichael Chan     * depending on whether the selection is in the first or last row.
77ad36a3c3cde7a2ec6d3a35d2529d46f03bd8d59dMichael Chan     */
78ad36a3c3cde7a2ec6d3a35d2529d46f03bd8d59dMichael Chan    public int getSelectedMonthOffset() {
79ad36a3c3cde7a2ec6d3a35d2529d46f03bd8d59dMichael Chan        if (isWithinCurrentMonth(mRow, mColumn)) {
80ad36a3c3cde7a2ec6d3a35d2529d46f03bd8d59dMichael Chan            return 0;
81ad36a3c3cde7a2ec6d3a35d2529d46f03bd8d59dMichael Chan        }
82ad36a3c3cde7a2ec6d3a35d2529d46f03bd8d59dMichael Chan        if (mRow == 0) {
83ad36a3c3cde7a2ec6d3a35d2529d46f03bd8d59dMichael Chan            return -1;
84ad36a3c3cde7a2ec6d3a35d2529d46f03bd8d59dMichael Chan        }
85ad36a3c3cde7a2ec6d3a35d2529d46f03bd8d59dMichael Chan        return 1;
86ad36a3c3cde7a2ec6d3a35d2529d46f03bd8d59dMichael Chan    }
87ad36a3c3cde7a2ec6d3a35d2529d46f03bd8d59dMichael Chan
88ad36a3c3cde7a2ec6d3a35d2529d46f03bd8d59dMichael Chan    public void setSelectedDayOfMonth(int dayOfMonth) {
89ad36a3c3cde7a2ec6d3a35d2529d46f03bd8d59dMichael Chan        mRow = getRowOf(dayOfMonth);
90ad36a3c3cde7a2ec6d3a35d2529d46f03bd8d59dMichael Chan        mColumn = getColumnOf(dayOfMonth);
91ad36a3c3cde7a2ec6d3a35d2529d46f03bd8d59dMichael Chan    }
92ad36a3c3cde7a2ec6d3a35d2529d46f03bd8d59dMichael Chan
93ad36a3c3cde7a2ec6d3a35d2529d46f03bd8d59dMichael Chan    public boolean isSelected(int row, int column) {
94ad36a3c3cde7a2ec6d3a35d2529d46f03bd8d59dMichael Chan        return (mRow == row) && (mColumn == column);
95ad36a3c3cde7a2ec6d3a35d2529d46f03bd8d59dMichael Chan    }
96ad36a3c3cde7a2ec6d3a35d2529d46f03bd8d59dMichael Chan
97ad36a3c3cde7a2ec6d3a35d2529d46f03bd8d59dMichael Chan    /**
98ad36a3c3cde7a2ec6d3a35d2529d46f03bd8d59dMichael Chan     * Move up one box, potentially flipping to the previous month.
99ad36a3c3cde7a2ec6d3a35d2529d46f03bd8d59dMichael Chan     * @return Whether the month was flipped to the previous month
100ad36a3c3cde7a2ec6d3a35d2529d46f03bd8d59dMichael Chan     *   due to the move.
101ad36a3c3cde7a2ec6d3a35d2529d46f03bd8d59dMichael Chan     */
102ad36a3c3cde7a2ec6d3a35d2529d46f03bd8d59dMichael Chan    public boolean up() {
103ad36a3c3cde7a2ec6d3a35d2529d46f03bd8d59dMichael Chan        if (isWithinCurrentMonth(mRow - 1, mColumn)) {
104ad36a3c3cde7a2ec6d3a35d2529d46f03bd8d59dMichael Chan            // within current month, just move up
105ad36a3c3cde7a2ec6d3a35d2529d46f03bd8d59dMichael Chan            mRow--;
106ad36a3c3cde7a2ec6d3a35d2529d46f03bd8d59dMichael Chan            return false;
107ad36a3c3cde7a2ec6d3a35d2529d46f03bd8d59dMichael Chan        }
108ad36a3c3cde7a2ec6d3a35d2529d46f03bd8d59dMichael Chan        // flip back to previous month, same column, first position within month
109ad36a3c3cde7a2ec6d3a35d2529d46f03bd8d59dMichael Chan        previousMonth();
110ad36a3c3cde7a2ec6d3a35d2529d46f03bd8d59dMichael Chan        mRow = 5;
111ad36a3c3cde7a2ec6d3a35d2529d46f03bd8d59dMichael Chan        while(!isWithinCurrentMonth(mRow, mColumn)) {
112ad36a3c3cde7a2ec6d3a35d2529d46f03bd8d59dMichael Chan            mRow--;
113ad36a3c3cde7a2ec6d3a35d2529d46f03bd8d59dMichael Chan        }
114ad36a3c3cde7a2ec6d3a35d2529d46f03bd8d59dMichael Chan        return true;
115ad36a3c3cde7a2ec6d3a35d2529d46f03bd8d59dMichael Chan    }
116ad36a3c3cde7a2ec6d3a35d2529d46f03bd8d59dMichael Chan
117ad36a3c3cde7a2ec6d3a35d2529d46f03bd8d59dMichael Chan    /**
118ad36a3c3cde7a2ec6d3a35d2529d46f03bd8d59dMichael Chan     * Move down one box, potentially flipping to the next month.
119ad36a3c3cde7a2ec6d3a35d2529d46f03bd8d59dMichael Chan     * @return Whether the month was flipped to the next month
120ad36a3c3cde7a2ec6d3a35d2529d46f03bd8d59dMichael Chan     *   due to the move.
121ad36a3c3cde7a2ec6d3a35d2529d46f03bd8d59dMichael Chan     */
122ad36a3c3cde7a2ec6d3a35d2529d46f03bd8d59dMichael Chan    public boolean down() {
123ad36a3c3cde7a2ec6d3a35d2529d46f03bd8d59dMichael Chan        if (isWithinCurrentMonth(mRow + 1, mColumn)) {
124ad36a3c3cde7a2ec6d3a35d2529d46f03bd8d59dMichael Chan            // within current month, just move down
125ad36a3c3cde7a2ec6d3a35d2529d46f03bd8d59dMichael Chan            mRow++;
126ad36a3c3cde7a2ec6d3a35d2529d46f03bd8d59dMichael Chan            return false;
127ad36a3c3cde7a2ec6d3a35d2529d46f03bd8d59dMichael Chan        }
128ad36a3c3cde7a2ec6d3a35d2529d46f03bd8d59dMichael Chan        // flip to next month, same column, first position within month
129ad36a3c3cde7a2ec6d3a35d2529d46f03bd8d59dMichael Chan        nextMonth();
130ad36a3c3cde7a2ec6d3a35d2529d46f03bd8d59dMichael Chan        mRow = 0;
131ad36a3c3cde7a2ec6d3a35d2529d46f03bd8d59dMichael Chan        while (!isWithinCurrentMonth(mRow, mColumn)) {
132ad36a3c3cde7a2ec6d3a35d2529d46f03bd8d59dMichael Chan            mRow++;
133ad36a3c3cde7a2ec6d3a35d2529d46f03bd8d59dMichael Chan        }
134ad36a3c3cde7a2ec6d3a35d2529d46f03bd8d59dMichael Chan        return true;
135ad36a3c3cde7a2ec6d3a35d2529d46f03bd8d59dMichael Chan    }
136ad36a3c3cde7a2ec6d3a35d2529d46f03bd8d59dMichael Chan
137ad36a3c3cde7a2ec6d3a35d2529d46f03bd8d59dMichael Chan    /**
138ad36a3c3cde7a2ec6d3a35d2529d46f03bd8d59dMichael Chan     * Move left one box, potentially flipping to the previous month.
139ad36a3c3cde7a2ec6d3a35d2529d46f03bd8d59dMichael Chan     * @return Whether the month was flipped to the previous month
140ad36a3c3cde7a2ec6d3a35d2529d46f03bd8d59dMichael Chan     *   due to the move.
141ad36a3c3cde7a2ec6d3a35d2529d46f03bd8d59dMichael Chan     */
142ad36a3c3cde7a2ec6d3a35d2529d46f03bd8d59dMichael Chan    public boolean left() {
143ad36a3c3cde7a2ec6d3a35d2529d46f03bd8d59dMichael Chan        if (mColumn == 0) {
144ad36a3c3cde7a2ec6d3a35d2529d46f03bd8d59dMichael Chan            mRow--;
145ad36a3c3cde7a2ec6d3a35d2529d46f03bd8d59dMichael Chan            mColumn = 6;
146ad36a3c3cde7a2ec6d3a35d2529d46f03bd8d59dMichael Chan        } else {
147ad36a3c3cde7a2ec6d3a35d2529d46f03bd8d59dMichael Chan            mColumn--;
148ad36a3c3cde7a2ec6d3a35d2529d46f03bd8d59dMichael Chan        }
149ad36a3c3cde7a2ec6d3a35d2529d46f03bd8d59dMichael Chan
150ad36a3c3cde7a2ec6d3a35d2529d46f03bd8d59dMichael Chan        if (isWithinCurrentMonth(mRow, mColumn)) {
151ad36a3c3cde7a2ec6d3a35d2529d46f03bd8d59dMichael Chan            return false;
152ad36a3c3cde7a2ec6d3a35d2529d46f03bd8d59dMichael Chan        }
153ad36a3c3cde7a2ec6d3a35d2529d46f03bd8d59dMichael Chan
154ad36a3c3cde7a2ec6d3a35d2529d46f03bd8d59dMichael Chan        // need to flip to last day of previous month
155ad36a3c3cde7a2ec6d3a35d2529d46f03bd8d59dMichael Chan        previousMonth();
156ad36a3c3cde7a2ec6d3a35d2529d46f03bd8d59dMichael Chan        int lastDay = getNumberOfDaysInMonth();
157ad36a3c3cde7a2ec6d3a35d2529d46f03bd8d59dMichael Chan        mRow = getRowOf(lastDay);
158ad36a3c3cde7a2ec6d3a35d2529d46f03bd8d59dMichael Chan        mColumn = getColumnOf(lastDay);
159ad36a3c3cde7a2ec6d3a35d2529d46f03bd8d59dMichael Chan        return true;
160ad36a3c3cde7a2ec6d3a35d2529d46f03bd8d59dMichael Chan    }
161ad36a3c3cde7a2ec6d3a35d2529d46f03bd8d59dMichael Chan
162ad36a3c3cde7a2ec6d3a35d2529d46f03bd8d59dMichael Chan    /**
163ad36a3c3cde7a2ec6d3a35d2529d46f03bd8d59dMichael Chan     * Move right one box, potentially flipping to the next month.
164ad36a3c3cde7a2ec6d3a35d2529d46f03bd8d59dMichael Chan     * @return Whether the month was flipped to the next month
165ad36a3c3cde7a2ec6d3a35d2529d46f03bd8d59dMichael Chan     *   due to the move.
166ad36a3c3cde7a2ec6d3a35d2529d46f03bd8d59dMichael Chan     */
167ad36a3c3cde7a2ec6d3a35d2529d46f03bd8d59dMichael Chan    public boolean right() {
168ad36a3c3cde7a2ec6d3a35d2529d46f03bd8d59dMichael Chan        if (mColumn == 6) {
169ad36a3c3cde7a2ec6d3a35d2529d46f03bd8d59dMichael Chan            mRow++;
170ad36a3c3cde7a2ec6d3a35d2529d46f03bd8d59dMichael Chan            mColumn = 0;
171ad36a3c3cde7a2ec6d3a35d2529d46f03bd8d59dMichael Chan        } else {
172ad36a3c3cde7a2ec6d3a35d2529d46f03bd8d59dMichael Chan            mColumn++;
173ad36a3c3cde7a2ec6d3a35d2529d46f03bd8d59dMichael Chan        }
174ad36a3c3cde7a2ec6d3a35d2529d46f03bd8d59dMichael Chan
175ad36a3c3cde7a2ec6d3a35d2529d46f03bd8d59dMichael Chan        if (isWithinCurrentMonth(mRow, mColumn)) {
176ad36a3c3cde7a2ec6d3a35d2529d46f03bd8d59dMichael Chan            return false;
177ad36a3c3cde7a2ec6d3a35d2529d46f03bd8d59dMichael Chan        }
178ad36a3c3cde7a2ec6d3a35d2529d46f03bd8d59dMichael Chan
179ad36a3c3cde7a2ec6d3a35d2529d46f03bd8d59dMichael Chan        // need to flip to first day of next month
180ad36a3c3cde7a2ec6d3a35d2529d46f03bd8d59dMichael Chan        nextMonth();
181ad36a3c3cde7a2ec6d3a35d2529d46f03bd8d59dMichael Chan        mRow = 0;
182ad36a3c3cde7a2ec6d3a35d2529d46f03bd8d59dMichael Chan        mColumn = 0;
183ad36a3c3cde7a2ec6d3a35d2529d46f03bd8d59dMichael Chan        while (!isWithinCurrentMonth(mRow, mColumn)) {
184ad36a3c3cde7a2ec6d3a35d2529d46f03bd8d59dMichael Chan            mColumn++;
185ad36a3c3cde7a2ec6d3a35d2529d46f03bd8d59dMichael Chan        }
186ad36a3c3cde7a2ec6d3a35d2529d46f03bd8d59dMichael Chan        return true;
187ad36a3c3cde7a2ec6d3a35d2529d46f03bd8d59dMichael Chan    }
188ad36a3c3cde7a2ec6d3a35d2529d46f03bd8d59dMichael Chan
189ad36a3c3cde7a2ec6d3a35d2529d46f03bd8d59dMichael Chan}
190