Beispiel #1
0
        public async void Initialize(SemesterItemsViewGroup itemsSource, DateTime currentDate)
        {
            _itemsSource = itemsSource;

            // Unwire events from old one
            var prevAdapter = _viewPager.Adapter as DayPagerAdapter;

            if (prevAdapter != null)
            {
                prevAdapter.ItemClick         -= Adapter_ItemClick;
                prevAdapter.HolidayItemClick  -= Adapter_HolidayItemClick;
                prevAdapter.ScheduleItemClick -= Adapter_ScheduleItemClick;
                prevAdapter.ScheduleClick     -= Adapter_ScheduleClick;
            }

            var account = await AccountsManager.GetOrLoad(itemsSource.LocalAccountId);

            var adapter = new DayPagerAdapter(account, itemsSource, currentDate);

            adapter.ItemClick         += Adapter_ItemClick;
            adapter.HolidayItemClick  += Adapter_HolidayItemClick;
            adapter.ScheduleItemClick += Adapter_ScheduleItemClick;
            adapter.ScheduleClick     += Adapter_ScheduleClick;
            _viewPager.Adapter         = adapter;
            _viewPager.SetCurrentItem(1000, false);
        }
 public MyDataProvider(SemesterItemsViewGroup semesterItems, MyCalendarView calendarView)
 {
     _calendarView  = calendarView;
     _semesterItems = semesterItems;
     _holidays      = semesterItems.Items.Sublist(i => i is ViewItemHoliday);
     _holidays.CollectionChanged += new WeakEventHandler <NotifyCollectionChangedEventArgs>(_holidays_CollectionChanged).Handler;
 }
Beispiel #3
0
            public DayPagerAdapter(SemesterItemsViewGroup itemsSource, DateTime currentDate)
            {
                currentDate = currentDate.Date;

                ItemsSource = itemsSource;
                CenterDate  = currentDate;
                FirstDate   = currentDate.AddDays(-1000);
            }
        private DayScheduleItemsArranger(AccountDataItem account, SemesterItemsViewGroup semesterItems, ScheduleViewItemsGroup scheduleGroup, DateTime date, double heightOfHour, double spacingWhenNoAdditionalItems, double spacingWithAdditionalItems, double widthOfCollapsed, bool includeTasksAndEventsAndHolidays)
        {
            if (semesterItems.Semester == null)
            {
                throw new NullReferenceException("Semester was null");
            }

            _semesterItems = semesterItems;
            semesterItems.OnItemsChanged    += new WeakEventHandler <EventArgs>(SemesterGroup_OnItemsChanged).Handler;
            scheduleGroup.OnChangesOccurred += new WeakEventHandler <DataChangedEvent>(ScheduleViewItemsGroup_OnChangesOccurred).Handler;

            Date = date;
            _spacingWhenNoAdditionalItems = spacingWhenNoAdditionalItems;
            _spacingWithAdditionalItems   = spacingWithAdditionalItems;
            _widthOfCollapsed             = widthOfCollapsed;
            Account         = account;
            _schoolTimeZone = account.SchoolTimeZone;
            HeightOfHour    = heightOfHour;
            MinDuration     = TimeSpan.FromHours(widthOfCollapsed / HeightOfHour);

            IsDifferentSemester = !semesterItems.Semester.IsDateDuringThisSemester(date);

            SchedulesOnDay schedules = null;

            if (!IsDifferentSemester)
            {
                schedules = SchedulesOnDay.Get(account, semesterItems.Classes, date, account.GetWeekOnDifferentDate(date), trackChanges: true);
                schedules.CollectionChanged += new WeakEventHandler <NotifyCollectionChangedEventArgs>(Schedules_CollectionChanged).Handler;
            }

            _schedules = schedules;

            if (includeTasksAndEventsAndHolidays)
            {
                // For schedules, if tasks have a specific due time, we don't adjust the dates regardless of time zones causing them to switch to a different day, since they're displayed on the visual schedule. Therefore we set useEffectiveDatesEvenWhenItemsHaveTimes to false.
                _events = TasksOrEventsOnDay.Get(account, semesterItems.Items, date, today: null, activeOnly: false, useEffectiveDateEvenWhenItemsHaveTimes: false);
                _events.CollectionChanged += new WeakEventHandler <NotifyCollectionChangedEventArgs>(Events_CollectionChanged).Handler;
            }
            else
            {
                _events = new MyObservableList <BaseViewItemMegaItem>();
            }

            if (includeTasksAndEventsAndHolidays)
            {
                _holidays = HolidaysOnDay.Create(semesterItems.Items, date);
                _holidays.CollectionChanged += new WeakEventHandler <NotifyCollectionChangedEventArgs>(_holidays_CollectionChanged).Handler;
            }
            else
            {
                _holidays = new MyObservableList <ViewItemHoliday>();
            }

            Initialize(schedules, _events, _holidays);
        }
        public ScheduleViewModel(BaseViewModel parent, Params modelParams = null) : base(parent)
        {
            SemesterItemsViewGroup semesterGroup = SemesterItemsViewGroup.Load(MainScreenViewModel.CurrentLocalAccountId, MainScreenViewModel.CurrentSemester, trackChanges: true);

            if (semesterGroup == null)
            {
                throw new NullReferenceException("semesterGroup was null");
            }
            if (semesterGroup.Semester == null)
            {
                throw new NullReferenceException("semesterGroup.Semester was null");
            }

            if (modelParams == null)
            {
                modelParams = new Params();
            }
            _modelParams = modelParams;

            _arrangerItemsChangedHandler = new WeakEventHandler <EventArgs>(Arranger_OnItemsChanged);

            SemesterViewItemsGroup = semesterGroup;

            var acct = MainScreenViewModel.CurrentAccount;

            Account        = acct ?? throw new NullReferenceException("MainScreenViewModel.CurrentAccount was null");
            FirstDayOfWeek = acct.WeekChangesOn;

            DateTime today = DateTime.Today;

            if (semesterGroup.Semester.IsDateDuringThisSemester(today))
            {
                StartDate = DateTools.Last(FirstDayOfWeek);
            }
            else if (!PowerPlannerSending.DateValues.IsUnassigned(semesterGroup.Semester.Start) && today < semesterGroup.Semester.Start)
            {
                // Semester hasn't started yet, jump to first week of semester
                StartDate = DateTools.Last(FirstDayOfWeek, semesterGroup.Semester.Start);
            }
            else
            {
                // Semester already ended, jump to last week of semester
                StartDate = DateTools.Last(FirstDayOfWeek, semesterGroup.Semester.End);
            }

            if (!HasSchedules() || modelParams.IsEditing)
            {
                EnterEditMode();
            }

            AccountDataStore.AddDataChangedEventHandler(this);

            UpdateHasTwoWeekSchedule();
        }
Beispiel #6
0
        private DayScheduleItemsArranger(AccountDataItem account, SemesterItemsViewGroup semesterItems, ScheduleViewItemsGroup scheduleGroup, DateTime date, double heightOfHour, double spacingWhenNoAdditionalItems, double spacingWithAdditionalItems, double widthOfCollapsed, bool includeHomeworkAndHolidays)
        {
            if (semesterItems.Semester == null)
            {
                throw new NullReferenceException("Semester was null");
            }

            _semesterItems = semesterItems;
            semesterItems.OnItemsChanged    += new WeakEventHandler <EventArgs>(SemesterGroup_OnItemsChanged).Handler;
            scheduleGroup.OnChangesOccurred += new WeakEventHandler <DataChangedEvent>(ScheduleViewItemsGroup_OnChangesOccurred).Handler;

            Date = date;
            _spacingWhenNoAdditionalItems = spacingWhenNoAdditionalItems;
            _spacingWithAdditionalItems   = spacingWithAdditionalItems;
            _widthOfCollapsed             = widthOfCollapsed;
            Account         = account;
            _schoolTimeZone = account.SchoolTimeZone;
            HeightOfHour    = heightOfHour;
            MinDuration     = TimeSpan.FromHours(widthOfCollapsed / HeightOfHour);

            IsDifferentSemester = !semesterItems.Semester.IsDateDuringThisSemester(date);

            SchedulesOnDay schedules = null;

            if (!IsDifferentSemester)
            {
                schedules = SchedulesOnDay.Get(semesterItems.Classes, date, account.GetWeekOnDifferentDate(date), trackChanges: true);
                schedules.CollectionChanged += new WeakEventHandler <NotifyCollectionChangedEventArgs>(Schedules_CollectionChanged).Handler;
            }

            _schedules = schedules;

            if (includeHomeworkAndHolidays)
            {
                _events = HomeworksOnDay.Get(semesterItems.Items, date);
                _events.CollectionChanged += new WeakEventHandler <NotifyCollectionChangedEventArgs>(Events_CollectionChanged).Handler;
            }
            else
            {
                _events = new MyObservableList <BaseViewItemHomeworkExamGrade>();
            }

            if (includeHomeworkAndHolidays)
            {
                _holidays = HolidaysOnDay.Create(semesterItems.Items, date);
                _holidays.CollectionChanged += new WeakEventHandler <NotifyCollectionChangedEventArgs>(_holidays_CollectionChanged).Handler;
            }
            else
            {
                _holidays = new MyObservableList <ViewItemHoliday>();
            }

            Initialize(schedules, _events, _holidays);
        }
Beispiel #7
0
 public UIPagedDayView(SemesterItemsViewGroup semesterItems, MainScreenViewModel mainScreenViewModel)
 {
     // Have to set these here, since when we initialize the views in CreateViews, that gets called
     // from the base class' constructor, which occurs before we could possibly cache these parameters
     foreach (var singleDayView in GetViews())
     {
         singleDayView.SemesterItems       = semesterItems;
         singleDayView.MainScreenViewModel = mainScreenViewModel;
         singleDayView.OnRequestViewClass += new WeakEventHandler <ViewItemClass>(SingleDayView_OnRequestViewClass).Handler;
     }
 }
Beispiel #8
0
        /// <summary>
        /// You CAN call this multiple times, it'll successfully clear previous
        /// </summary>
        /// <param name="classes"></param>
        /// <param name="date"></param>
        public async void Initialize(SemesterItemsViewGroup viewModel, DateTime date)
        {
            ViewModel = viewModel;
            Date      = date;

            try
            {
                _request++;
                var currRequest = _request;
                await viewModel.LoadingTask;
                if (currRequest != _request)
                {
                    // Another initialize happened while loading, so stop here on this old request
                    // (No concern about int overflow since it wraps by default)
                    return;
                }

                if (_arrangedItemsOnItemsChangedHandler == null)
                {
                    _arrangedItemsOnItemsChangedHandler = new WeakEventHandler <EventArgs>(_arrangedItems_OnItemsChanged).Handler;
                }
                else if (_arrangedItems != null)
                {
                    _arrangedItems.OnItemsChanged -= _arrangedItemsOnItemsChangedHandler;
                }

                _arrangedItems = DayScheduleItemsArranger.Create(PowerPlannerApp.Current.GetCurrentAccount(), ViewModel, PowerPlannerApp.Current.GetMainScreenViewModel().ScheduleViewItemsGroup, Date, TIME_INDICATOR_SIZE + GAP_SIZE, MyCollapsedEventItem.SPACING_WITH_NO_ADDITIONAL, MyCollapsedEventItem.SPACING_WITH_ADDITIONAL, MyCollapsedEventItem.WIDTH_OF_COLLAPSED_ITEM, includeTasksAndEventsAndHolidays: true);
                _arrangedItems.OnItemsChanged += _arrangedItemsOnItemsChangedHandler;

                render();

                if (_holidaysOnDay != null && _holidaysChangedHandler != null)
                {
                    _holidaysOnDay.CollectionChanged -= _holidaysChangedHandler;
                }
                if (_holidaysChangedHandler == null)
                {
                    _holidaysChangedHandler = new WeakEventHandler <NotifyCollectionChangedEventArgs>(HolidaysOnDay_CollectionChanged).Handler;
                }
                _holidaysOnDay = HolidaysOnDay.Create(viewModel.Items, date);
                _holidaysOnDay.CollectionChanged += _holidaysChangedHandler;
                _holidaysItemsWrapper.ItemsSource = _holidaysOnDay;
                UpdateHolidayOpacity();
            }

            // We want to allow ObjectDisposed to bubble up, so recyclers can know to dispose the view
            catch (ObjectDisposedException) { throw; }

            catch (Exception ex)
            {
                TelemetryExtension.Current?.TrackException(ex);
            }
        }
Beispiel #9
0
        private void Initialize(Guid localAccountId, ViewItemSemester semester)
        {
            var acct = MainScreenViewModel.CurrentAccount;

            if (acct == null)
            {
                throw new NullReferenceException("MainScreenViewModel.CurrentAccount was null");
            }
            _showPastCompleteItemsOnFullCalendar = acct.ShowPastCompleteItemsOnFullCalendar;
            FirstDayOfWeek = acct.WeekChangesOn;

            SemesterItemsViewGroup = SemesterItemsViewGroup.Load(localAccountId, semester);
        }
Beispiel #10
0
        public async void Initialize(SemesterItemsViewGroup semesterItems, DateTime date)
        {
            SemesterItems = semesterItems;
            Date          = date;

            try
            {
                _request++;
                var currRequest = _request;
                await semesterItems.LoadingTask;
                if (currRequest != _request)
                {
                    // Another initialize happened while loading, so stop here on this old request
                    // (No concern about int overflow since it wraps by default)
                    return;
                }

                if (_currHolidays != null && _currHolidaysChangedHandler != null)
                {
                    _currHolidays.CollectionChanged -= _currHolidaysChangedHandler;
                    _currHolidays = null;
                }

                _currHolidays = HolidaysOnDay.Create(semesterItems.Items, Date);
                _currHolidaysChangedHandler      = new WeakEventHandler <NotifyCollectionChangedEventArgs>(_currHolidays_CollectionChanged).Handler;
                _currHolidays.CollectionChanged += _currHolidaysChangedHandler;

                _holidaysItemsSourceAdapter.ItemsSource = _currHolidays;
                UpdateHolidaysBehavior();

                if (_arrangedItemsOnItemsChangedHandler == null)
                {
                    _arrangedItemsOnItemsChangedHandler = new WeakEventHandler <EventArgs>(_arrangedItems_OnItemsChanged).Handler;
                }
                else if (_arrangedItems != null)
                {
                    _arrangedItems.OnItemsChanged -= _arrangedItemsOnItemsChangedHandler;
                }

                _arrangedItems = DayScheduleItemsArranger.Create(PowerPlannerApp.Current.GetCurrentAccount(), semesterItems, PowerPlannerApp.Current.GetMainScreenViewModel().ScheduleViewItemsGroup, Date, HEIGHT_OF_HOUR, UIScheduleViewEventItemCollapsed.SPACING_WITH_NO_ADDITIONAL, UIScheduleViewEventItemCollapsed.SPACING_WITH_ADDITIONAL, UIScheduleViewEventItemCollapsed.WIDTH_OF_COLLAPSED_ITEM, includeTasksAndEventsAndHolidays: true);
                _arrangedItems.OnItemsChanged += _arrangedItemsOnItemsChangedHandler;

                render();
            }
            catch (Exception ex)
            {
                // There might have been a data error loading the main data, don't want to crash because of that
                TelemetryExtension.Current?.TrackException(ex);
            }
        }
Beispiel #11
0
        public void Initialize(DateTime date, TasksOrEventsOnDay tasksOrEvents, SemesterItemsViewGroup viewGroup)
        {
            _viewItemsGroup = viewGroup;
            _date           = date;

            // Set the header text
            FindViewById <TextView>(Resource.Id.TextViewHeaderText).Text = GetHeaderText(date);

            if (_currItemsSourceCollectionChangedHandler != null && _adapter.ItemsSource is INotifyCollectionChanged)
            {
                (_adapter.ItemsSource as INotifyCollectionChanged).CollectionChanged -= _currItemsSourceCollectionChangedHandler;
            }

            _adapter.ItemsSource = tasksOrEvents;
            _currItemsSourceCollectionChangedHandler = new WeakEventHandler <NotifyCollectionChangedEventArgs>(ItemsSource_CollectionChanged).Handler;
            tasksOrEvents.CollectionChanged         += _currItemsSourceCollectionChangedHandler;

            InitializeDifferentSemesterOverlay();
            InitializeSnapshot();
        }
Beispiel #12
0
        public static DayScheduleItemsArranger Create(AccountDataItem account, SemesterItemsViewGroup semesterItems, ScheduleViewItemsGroup scheduleGroup, DateTime date, double heightOfHour, double spacingWhenNoAdditionalItems, double spacingWithAdditionalItems, double widthOfCollapsed, bool includeHomeworkAndHolidays)
        {
            if (account == null)
            {
                throw new ArgumentNullException(nameof(account));
            }

            if (semesterItems == null)
            {
                throw new ArgumentNullException(nameof(semesterItems));
            }

            if (scheduleGroup == null)
            {
                throw new ArgumentNullException(nameof(scheduleGroup));
            }

            date = date.Date;

            foreach (var cachedAnswer in _cached)
            {
                if (cachedAnswer.Date == date.Date &&
                    cachedAnswer._semesterItems == semesterItems &&
                    cachedAnswer.HeightOfHour == heightOfHour &&
                    cachedAnswer._spacingWhenNoAdditionalItems == spacingWhenNoAdditionalItems &&
                    cachedAnswer._spacingWithAdditionalItems == spacingWithAdditionalItems &&
                    cachedAnswer._widthOfCollapsed == widthOfCollapsed &&
                    object.Equals(account.SchoolTimeZone, cachedAnswer._schoolTimeZone))
                {
                    return(cachedAnswer);
                }
            }

            DayScheduleItemsArranger answer = new DayScheduleItemsArranger(account, semesterItems, scheduleGroup, date, heightOfHour, spacingWhenNoAdditionalItems, spacingWithAdditionalItems, widthOfCollapsed, includeHomeworkAndHolidays);

            _cached.Add(answer);
            return(answer);
        }
Beispiel #13
0
        public void Initialize(SemesterItemsViewGroup itemsSource, DateTime currentDate)
        {
            _itemsSource = itemsSource;

            // Unwire events from old one
            var prevAdapter = Adapter as DayPagerAdapter;

            if (prevAdapter != null)
            {
                prevAdapter.ItemClick         -= Adapter_ItemClick;
                prevAdapter.HolidayItemClick  -= Adapter_HolidayItemClick;
                prevAdapter.ScheduleItemClick -= Adapter_ScheduleItemClick;
                prevAdapter.ScheduleClick     -= Adapter_ScheduleClick;
            }

            var adapter = new DayPagerAdapter(itemsSource, currentDate);

            adapter.ItemClick         += Adapter_ItemClick;
            adapter.HolidayItemClick  += Adapter_HolidayItemClick;
            adapter.ScheduleItemClick += Adapter_ScheduleItemClick;
            adapter.ScheduleClick     += Adapter_ScheduleClick;
            this.Adapter = adapter;
            this.SetCurrentItem(1000, false);
        }
 private void Initialize(Guid localAccountId, ViewItemSemester semester)
 {
     SemesterItemsViewGroup = SemesterItemsViewGroup.Load(localAccountId, semester);
 }