package com.miris.ui.view;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Rect;
import android.support.v4.view.GestureDetectorCompat;
import android.util.AttributeSet;
import android.view.GestureDetector;
import android.view.MotionEvent;
import android.view.View;
import android.widget.OverScroller;
import com.miris.ui.comp.CalendarDayEvent;
import com.miris.ui.comp.CompactCalendarController;
import java.util.Date;
import java.util.List;
import java.util.Locale;
public class CompactCalendarView extends View {
private CompactCalendarController compactCalendarController;
private GestureDetectorCompat gestureDetector;
private CompactCalendarViewListener listener;
private boolean shouldScroll = true;
public interface CompactCalendarViewListener {
public void onDayClick(Date dateClicked);
public void onMonthScroll(Date firstDayOfNewMonth);
}
private final GestureDetector.SimpleOnGestureListener gestureListener = new GestureDetector.SimpleOnGestureListener() {
@Override
public void onLongPress(MotionEvent e) {
}
@Override
public boolean onSingleTapConfirmed(MotionEvent e) {
Date onDateClicked = compactCalendarController.onSingleTapConfirmed(e);
invalidate();
if(listener != null && onDateClicked != null){
listener.onDayClick(onDateClicked);
}
return super.onSingleTapConfirmed(e);
}
@Override
public boolean onDown(MotionEvent e) {
return compactCalendarController.onDown(e);
}
@Override
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
compactCalendarController.onFling(e1, e2, velocityX, velocityY);
return true;
}
@Override
public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {
if(shouldScroll) {
compactCalendarController.onScroll(e1, e2, distanceX, distanceY);
invalidate();
}
return true;
}
};
public CompactCalendarView(Context context) {
this(context, null);
}
public CompactCalendarView(Context context, AttributeSet attrs) {
this(context, attrs, 0);
}
public CompactCalendarView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
compactCalendarController = new CompactCalendarController(new Paint(), new OverScroller(getContext()),
new Rect(), attrs, getContext(), Color.argb(255, 233, 84, 81), Color.argb(255, 64, 64, 64), Color.argb(255, 219, 219, 219));
gestureDetector = new GestureDetectorCompat(getContext(), gestureListener);
}
public void setLocale(Locale locale){
compactCalendarController.setLocale(locale);
invalidate();
}
public void setUseThreeLetterAbbreviation(boolean useThreeLetterAbbreviation){
compactCalendarController.setUseWeekDayAbbreviation(useThreeLetterAbbreviation);
invalidate();
}
public void drawSmallIndicatorForEvents(boolean shouldDrawDaysHeader){
compactCalendarController.showSmallIndicator(shouldDrawDaysHeader);
}
public void setDayColumnNames(String[] dayColumnNames){
compactCalendarController.setDayColumnNames(dayColumnNames);
}
public int getHeightPerDay(){
return compactCalendarController.getHeightPerDay();
}
public void setListener(CompactCalendarViewListener listener){
this.listener = listener;
}
public Date getFirstDayOfCurrentMonth(){
return compactCalendarController.getFirstDayOfCurrentMonth();
}
public void setCurrentDate(Date dateTimeMonth){
compactCalendarController.setCurrentDate(dateTimeMonth);
invalidate();
}
public int getWeekNumberForCurrentMonth(){
return compactCalendarController.getWeekNumberForCurrentMonth();
}
public void setShouldDrawDaysHeader(boolean shouldDrawDaysHeader){
compactCalendarController.setShouldDrawDaysHeader(shouldDrawDaysHeader);
}
@Deprecated
public void addEvent(CalendarDayEvent event){
addEvent(event, false);
}
public void addEvent(CalendarDayEvent event, boolean shouldInvalidate){
compactCalendarController.addEvent(event);
if(shouldInvalidate){
invalidate();
}
}
public void addEvents(List<CalendarDayEvent> events){
compactCalendarController.addEvents(events);
invalidate();
}
@Deprecated
public void removeEvent(CalendarDayEvent event){
removeEvent(event, false);
}
public void removeEvent(CalendarDayEvent event, boolean shouldInvalidate){
compactCalendarController.removeEvent(event);
if(shouldInvalidate){
invalidate();
}
}
public void removeEvents(List<CalendarDayEvent> events){
compactCalendarController.removeEvents(events);
invalidate();
}
public void showNextMonth(){
compactCalendarController.showNextMonth();
invalidate();
if(listener != null){
listener.onMonthScroll(compactCalendarController.getFirstDayOfCurrentMonth());
}
}
public void showPreviousMonth(){
compactCalendarController.showPreviousMonth();
invalidate();
if(listener != null){
listener.onMonthScroll(compactCalendarController.getFirstDayOfCurrentMonth());
}
}
@Override
protected void onMeasure(int parentWidth, int parentHeight) {
super.onMeasure(parentWidth, parentHeight);
int width = MeasureSpec.getSize(parentWidth);
int height = MeasureSpec.getSize(parentHeight);
if(width > 0 && height > 0) {
compactCalendarController.onMeasure(width, height, getPaddingRight(), getPaddingLeft());
}
setMeasuredDimension(width, height);
}
@Override
protected void onDraw(Canvas canvas) {
compactCalendarController.onDraw(canvas);
}
@Override
public void computeScroll() {
super.computeScroll();
if(compactCalendarController.computeScroll()){
invalidate();
}
}
public void shouldScrollMonth(boolean shouldDisableScroll){
this.shouldScroll = shouldDisableScroll;
}
public boolean onTouchEvent(MotionEvent event) {
if(compactCalendarController.onTouch(event) && shouldScroll){
invalidate();
if(listener != null){
listener.onMonthScroll(compactCalendarController.getFirstDayOfCurrentMonth());
}
return true;
}
return gestureDetector.onTouchEvent(event);
}
}