package cn.scau.scautreasure.ui;
import android.os.Bundle;
import android.support.v4.app.FragmentTransaction;
import android.view.View;
import android.widget.LinearLayout;
import android.widget.TextView;
import antistatic.spinnerwheel.WheelHorizontalView;
import antistatic.spinnerwheel.adapters.ArrayWheelAdapter;
import cn.scau.scautreasure.R;
import cn.scau.scautreasure.helper.CalendarHelper;
import cn.scau.scautreasure.util.DateUtil;
import com.roomorama.caldroid.CaldroidFragment;
import com.roomorama.caldroid.CaldroidListener;
import com.roomorama.caldroid.WeekdayArrayAdapter;
import org.androidannotations.annotations.*;
import org.androidannotations.annotations.res.StringArrayRes;
import java.util.Date;
import java.util.HashMap;
import java.util.Iterator;
/**
* User: special
* Date: 13-8-27
* Time: 下午4:57
* Mail: specialcyci@gmail.com
*/
@EActivity ( R.layout.calendar )
public class Calendar extends CommonActivity {
@ViewById
WheelHorizontalView wheel;
@ViewById
TextView tv_event;
@ViewById
LinearLayout layout_calendar;
@StringArrayRes
String[] months;
@Bean
DateUtil dateUtil;
@Bean
CalendarHelper calendarHelper;
private CaldroidFragment caldroidFragment;
private int currentMonth;
private int currentYear;
private boolean scrolling = true;
private HashMap<Date,CalendarHelper.Event> events;
@Override
void initActionBar(){
// 由于隐藏了标题栏,所以要覆盖初始化actionbar的函数
// 否则空指针
getSupportActionBar().hide();
}
@AfterInject
void init(){
setUpCurrentYearMonth();
}
private void setUpCurrentYearMonth(){
java.util.Calendar cal = java.util.Calendar.getInstance();
currentMonth = cal.get(cal.MONTH);
currentYear = cal.get(cal.YEAR);
}
@AfterViews
void initCanlendar(){
setUpWheels();
setUpCalendar();
loadData();
}
@Click(R.id.back)
void back(){
finish();
}
private void setUpWheels(){
ArrayWheelAdapter<String> adapter_direction = new ArrayWheelAdapter<String>(getSherlockActivity(), months);
adapter_direction.setItemTextResource(R.id.text);
adapter_direction.setItemResource(R.layout.calendar_wheel_text);
wheel.setViewAdapter(adapter_direction);
wheel.setCurrentItem(currentMonth);
wheel.setEnabled(false);
}
private void setUpCalendar(){
caldroidFragment = new CaldroidFragment();
setCalendarCurrentYearMonth();
setCalendarFontAndListener();
showCalendarInFragment();
}
private void setCalendarCurrentYearMonth(){
Bundle args = new Bundle();
args.putInt(CaldroidFragment.YEAR, currentYear);
args.putInt(CaldroidFragment.MONTH, currentMonth + 1);
args.putBoolean(CaldroidFragment.SHOW_NAVIGATION_ARROWS,false);
caldroidFragment.setArguments(args);
}
private void setCalendarFontAndListener(){
caldroidFragment.setCaldroidListener(listener);
WeekdayArrayAdapter.textColor = getResources().getColor(R.color.calendar_weekday_textcolor);
}
private void showCalendarInFragment(){
FragmentTransaction fragmentTransaction = getSherlockActivity().getSupportFragmentManager().beginTransaction();
fragmentTransaction.replace(R.id.layout_calendar, caldroidFragment);
fragmentTransaction.commit();
}
@UiThread
void showEvents(){
Iterator<Date> keySets = events.keySet().iterator();
while (keySets.hasNext()){
Date date = keySets.next();
setCalendarDaySkinsByEventDate(date);
}
caldroidFragment.refreshView();
}
private void setCalendarDaySkinsByEventDate(Date date){
CalendarHelper.Event event = events.get(date);
caldroidFragment.setBackgroundResourceForDate(event.event_color,date);
caldroidFragment.setTextColorForDate(android.R.color.white,date);
}
@Background
void loadData(Object... params){
events = calendarHelper.getEventList();
showEvents();
}
private CaldroidListener listener = new CaldroidListener() {
@Override
public void onSelectDate(Date date, View view) {
// if user click the day, check if this day was a event day;
if(hasThisEvenDate(date)){
showEventNameInTitle(date);
}else{
showNullThiEventInTitle();
}
}
@Override
public void onChangeMonth(int month, int year) {
int wheelPosition = month - 1;
// if user want turn the month out of this semester
caldroidFragment.setCaldroidListener(null);
if(lowerThanSemesterStartMonth(year, month)){
moveBackToSemesterStartMonth();
wheelPosition = month;
}else if(higherThanSemesterEndMonth(year, month)){
moveBackToSemesterEndMonth();
wheelPosition = month - 2;
}
caldroidFragment.setCaldroidListener(this);
wheel.setCurrentItem(wheelPosition,true);
}
};
private boolean hasThisEvenDate(Date date){
return events.containsKey(date);
}
private void showEventNameInTitle(Date date){
CalendarHelper.Event event = events.get(date);
tv_event.setText(event.event_name);
}
private void showNullThiEventInTitle(){
tv_event.setText(R.string.tips_calendar_null);
}
private boolean lowerThanSemesterStartMonth(int year, int month){
return month < calendarHelper.MINMONTH && year == calendarHelper.MINYEAR;
}
private boolean higherThanSemesterEndMonth(int year, int month){
return month > calendarHelper.MAXMONTH && year == calendarHelper.MAXYEAR;
}
private void moveBackToSemesterStartMonth(){
Date date = dateUtil.parseDate(calendarHelper.MINYEAR + "-" + calendarHelper.MINMONTH + "-01");
caldroidFragment.moveToDate(date);
}
private void moveBackToSemesterEndMonth(){
Date date = dateUtil.parseDate(calendarHelper.MAXYEAR + "-" + calendarHelper.MAXMONTH + "-01");
caldroidFragment.moveToDate(date);
}
}