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