package io.github.memfis19.cadar.settings; import android.support.annotation.LayoutRes; import android.util.SparseArray; import java.util.Calendar; import java.util.List; import io.github.memfis19.cadar.R; import io.github.memfis19.cadar.data.entity.Event; import io.github.memfis19.cadar.internal.configuration.BaseCalendarConfiguration; import io.github.memfis19.cadar.internal.configuration.BaseCalendarConfigurationBuilder; import io.github.memfis19.cadar.internal.process.EventsProcessor; import io.github.memfis19.cadar.internal.ui.month.adapter.decorator.WeekDayDecorator; import io.github.memfis19.cadar.internal.ui.month.adapter.decorator.factory.MonthDayDecoratorFactory; /** * Created by memfis on 7/14/16. */ public final class MonthCalendarConfiguration extends BaseCalendarConfiguration { @CadarSettings.DayOfWeeks private int firstDayOfWeek = Calendar.MONDAY; private boolean displayDaysOutOfMonth = true; private MonthDayDecoratorFactory monthDayDecoratorFactory; private WeekDayDecorator weekDayDecorator; private EventsProcessor<Calendar, SparseArray<List<Event>>> eventsProcessor; @LayoutRes private int monthLayoutId = R.layout.month_calendar_event_layout, weekTitleLayoutId = R.layout.month_calendar_day_of_week_layout; private MonthCalendarConfiguration() { super(); } public static class Builder extends BaseCalendarConfigurationBuilder<MonthCalendarConfiguration> { private MonthCalendarConfiguration monthCalendarConfiguration; public Builder() { super(); monthCalendarConfiguration = new MonthCalendarConfiguration(); } public Builder setFirstDayOfWeek(@CadarSettings.DayOfWeeks int firstDayOfWeek) { monthCalendarConfiguration.firstDayOfWeek = firstDayOfWeek; return this; } public Builder setMonthDayLayout(@LayoutRes int monthLayoutId, MonthDayDecoratorFactory monthDayDecoratorFactory) { monthCalendarConfiguration.monthLayoutId = monthLayoutId; monthCalendarConfiguration.monthDayDecoratorFactory = monthDayDecoratorFactory; return this; } public Builder setEventsProcessor(EventsProcessor<Calendar, SparseArray<List<Event>>> eventsProcessor) { monthCalendarConfiguration.eventsProcessor = eventsProcessor; return this; } public Builder setDayWeekTitleLayout(@LayoutRes int weekTitleLayoutId, WeekDayDecorator weekDayDecorator) { monthCalendarConfiguration.weekTitleLayoutId = weekTitleLayoutId; monthCalendarConfiguration.weekDayDecorator = weekDayDecorator; return this; } public Builder setDisplayDaysOutOfMonth(boolean displayDaysOutOfMonth) { monthCalendarConfiguration.displayDaysOutOfMonth = displayDaysOutOfMonth; return this; } @Override public MonthCalendarConfiguration build() throws NullPointerException, IllegalStateException, IllegalArgumentException { if (initialDay == null) throw new NullPointerException("Passed initial day can't be null."); monthCalendarConfiguration.initialDay = initialDay; if (eventProcessingEnabled && eventCalculator == null) throw new IllegalStateException("Configuration set to process events. But event processor not passed or null."); monthCalendarConfiguration.eventProcessingEnabled = eventProcessingEnabled; monthCalendarConfiguration.eventCalculator = eventCalculator; if (eventProcessingEnabled && eventFactory == null) throw new NullPointerException("Event factory is null. Please setup it."); monthCalendarConfiguration.eventFactory = eventFactory; monthCalendarConfiguration.eventCalculator.setEventFactory(monthCalendarConfiguration.eventFactory); if (weekDayTitleTranslationEnabled) { if (mondayTitle == 0 || tuesdayTitle == 0 || wednesdayTitle == 0 || thursdayTitle == 0 || fridayTitle == 0 || saturdayTitle == 0 || sundayTitle == 0) { throw new IllegalArgumentException("Configuration set to override default week day titles, but not all titles are passed."); } } monthCalendarConfiguration.weekDayTitleTranslationEnabled = weekDayTitleTranslationEnabled; if (monthCalendarConfiguration.weekDayTitleTranslationEnabled) { monthCalendarConfiguration.mondayTitle = mondayTitle; monthCalendarConfiguration.tuesdayTitle = tuesdayTitle; monthCalendarConfiguration.wednesdayTitle = wednesdayTitle; monthCalendarConfiguration.thursdayTitle = thursdayTitle; monthCalendarConfiguration.fridayTitle = fridayTitle; monthCalendarConfiguration.saturdayTitle = saturdayTitle; monthCalendarConfiguration.sundayTitle = sundayTitle; } if (periodType != Calendar.MONTH && periodType != Calendar.YEAR) throw new IllegalArgumentException("Period type should be Calendar.MONTH or Calendar.YEAR only."); if (periodValue < 1) throw new IllegalArgumentException("Period value should be more then 1."); if (periodType == Calendar.MONTH && periodValue < 3) throw new IllegalStateException("In case with Calendar.MONTH period type, minimum value should be GE 3."); monthCalendarConfiguration.periodType = periodType; monthCalendarConfiguration.periodValue = periodValue; return monthCalendarConfiguration; } } public int getFirstDayOfWeek() { return firstDayOfWeek; } public int getMonthLayoutId() { return monthLayoutId; } public MonthDayDecoratorFactory getMonthDayDecoratorFactory() { return monthDayDecoratorFactory; } public int getWeekTitleLayoutId() { return weekTitleLayoutId; } public WeekDayDecorator getWeekDayDecorator() { return weekDayDecorator; } public boolean isDisplayDaysOutOfMonth() { return displayDaysOutOfMonth; } public EventsProcessor<Calendar, SparseArray<List<Event>>> getEventsProcessor() { return eventsProcessor; } }