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