Ejemplo n.º 1
0
        ///
        /// <summary>
        /// Display all visible events and remove all invisible for current visible time window
        /// In quick mode we only reposition events which are already displayed.</summary>
        ///
        public long DisplayEventsImpl(
            bool refreshVisibleOnly = false,
            bool animate            = false
            )
        {
            DateTime             begin;
            DateTime             end;
            double               distance;
            double               left;
            TimelineDisplayEvent pos;
            double               viewSize = 0;
            bool isNew = false;
            IEnumerable <TimelineEvent>        events;
            Dictionary <TimelineEvent, object> newVisibleEvents;
            object visual;
            long   start;
            double oldViewSize;
            int    i = 0;

            CompleteEventAnimation();

            if (animate)
            {
                m_eventStoryboard = new Storyboard();
            }

            start       = DateTime.Now.Millisecond;
            oldViewSize = m_viewSize;

            if (m_timeline.IsValidIndex(m_startIndex))
            {
                begin = m_timeline.GetFloorTime(m_timeline[m_startIndex]);
            }
            else
            {
                begin = DateTime.MinValue;
            }

            if (m_timeline.IsValidIndex(m_startIndex + m_columnCount + EXTRA_COLUMNS))
            {
                end = m_timeline.GetCeilingTime(m_timeline[m_startIndex + m_columnCount + EXTRA_COLUMNS]);
            }
            else
            {
                end = DateTime.MaxValue;
            }

            begin = DateTime.MinValue + m_maxDescriptionWidth > begin ? DateTime.MinValue : begin - m_maxDescriptionWidth;

            if (AllEvents != null)
            {
                //
                // remove events which are not visible any more
                //
                m_visibleEvents.Keys.NotInRange(begin, end).ForEach
                (
                    (te) => RemoveEvent(m_visibleEvents[te])
                );

                if (!refreshVisibleOnly)
                {
                    events = m_events.QuickSearch(begin, end, true);
                }
                else
                {
                    events = m_visibleEvents.Keys.InRange(begin, end);
                }

                newVisibleEvents = new Dictionary <TimelineEvent, object>();

                foreach (TimelineEvent e in events)
                {
                    if (++i > MAX_EVENTS)
                    {
                        break;
                    }
                    pos = m_dispEvents[e];

                    distance = TimeSpanToPixels(CurrentDateTime - e.StartDate);
                    left     = PixelWidth / 2 - distance;

                    Debug.Assert(e.InRange(begin, end));

                    if (pos.EventPixelWidth != pos.ActualEventPixelWidth)
                    {
                        if (left + pos.ActualEventPixelWidth < PixelWidth)
                        {
                            left = left + pos.ActualEventPixelWidth - PixelWidth * 2;
                        }
                        else if (left < -PixelWidth && left + pos.ActualEventPixelWidth > PixelWidth)
                        {
                            left = Math.Max(-PixelWidth, left);
                        }
                    }

                    if (!m_visibleEvents.ContainsKey(e))
                    {
                        visual = CreateEvent(e, m_dispEvents[e]);
                        isNew  = true;
                    }
                    else
                    {
                        visual = m_visibleEvents[e];
                        isNew  = false;
                    }

                    newVisibleEvents.Add(e, visual);
                    viewSize = Math.Max(viewSize, MoveEvent(visual,
                                                            m_dispEvents[e].TopWithoutOffset,
                                                            left,
                                                            pos.EventPixelWidth,
                                                            isNew,
                                                            animate));
                }

                m_visibleEvents = newVisibleEvents;
            }

            m_viewSize = viewSize;
            if (m_parent.IsMainBand)
            {
                if (oldViewSize != viewSize)
                {
                    m_parent.OnScrollPositionChanged();
                }
                m_parent.TimelineTray.FireScrollViewChanged(viewSize);
            }

            if (m_eventStoryboard != null)
            {
                m_eventStoryboard.Begin();
            }

            return(DateTime.Now.Millisecond - start);
        }
Ejemplo n.º 2
0
        ///
        /// <summary>
        /// Display all visible events and remove all invisible for current visible time window</summary>
        ///
        public void DisplayEvents(
            bool dateChanged = false
            )
        {
            DateTime             begin;
            DateTime             end;
            double               distance;
            double               x;
            TimelineDisplayEvent pos;
            double               viewSize = 0;

            if (m_timeline.IsValidIndex(m_minIndex))
            {
                begin = m_timeline.GetFloorTime(m_timeline[m_minIndex]);
            }
            else
            {
                begin = DateTime.MinValue;
            }

            if (m_timeline.IsValidIndex(m_maxIndex))
            {
                end = m_timeline.GetCeilingTime(m_timeline[m_maxIndex]);
            }
            else
            {
                end = DateTime.MaxValue;
            }

            if (m_events != null)
            {
                foreach (TimelineEvent e in m_events)
                {
                    pos = m_dispEvents[e];

                    distance = TimeSpanToPixels(CurrentDateTime - e.StartDate);
                    x        = PixelWidth / 2 - distance;

                    if (!((e.StartDate < begin && e.EndDate < begin) ||
                          (e.StartDate > end && e.EndDate > end)) ||
                        (x + pos.DescriptionWidth >= 0 && x <= m_canvas.ActualWidth))
                    {
                        if (pos.EventPixelWidth != pos.ActualEventPixelWidth)
                        {
                            if (x + pos.ActualEventPixelWidth < PixelWidth)
                            {
                                x = x + pos.ActualEventPixelWidth - PixelWidth * 2;
                            }
                            else if (x < -PixelWidth && x + pos.ActualEventPixelWidth > PixelWidth)
                            {
                                x = Math.Max(-PixelWidth, x);
                            }
                        }

                        if (!m_visibleEvents.ContainsKey(e))
                        {
                            m_visibleEvents.Add(e, CreateEvent(e, m_dispEvents[e]));
                        }

                        viewSize = Math.Max(viewSize,
                                            MoveEvent(m_visibleEvents[e],
                                                      m_dispEvents[e].TopWithoutOffset,
                                                      x,
                                                      pos.EventPixelWidth));
                    }
                    else
                    {
                        if (m_visibleEvents.ContainsKey(e))
                        {
                            RemoveEvent(m_visibleEvents[e]);
                            m_visibleEvents.Remove(e);
                        }
                    }
                }
            }
            if (m_parent.IsMainBand)
            {
                m_parent.TimelineTray.FireScrollViewChanged(viewSize);
            }
        }