예제 #1
0
        protected bool ShouldDisplayAsZero(TimelineItem child)
        {
            DateTime?childStartDate = GetStartDate(child);
            DateTime?childEndDate   = GetEndDate(child);

            bool displayAsZero;

            if (!(childStartDate.HasValue && childEndDate.HasValue))
            {
                displayAsZero = false;
            }
            else if (childStartDate.HasValue && childEndDate.HasValue)
            {
                TimeSpan duration = childEndDate.Value - childStartDate.Value;
                displayAsZero = (duration.Ticks <
                                 TickTimeSpan.Ticks * MinimumDisplayMultiplier);
            }
            else
            {
                // Only start or end time exist, display as zero.
                displayAsZero = true;
            }

            return(displayAsZero);
        }
예제 #2
0
        public void BringItemIntoView(object item)
        {
            TimelineItem container = ContainerFromItem(item);

            if (container != null)
            {
                Nullable <long> start = TimelineCompactPanel.GetStartTick(container);
                if (start.HasValue)
                {
                    GoToTick(start.Value);
                }
            }
        }
        public void BringIntoView(
            TimelineControlBringIntoViewMode mode, object dataItem)
        {
            TimelineItem container = ContainerFromItem(dataItem);

            if (container != null)
            {
                Nullable <DateTime> start = TimelineCompactPanel.GetStartDate(container);
                Nullable <DateTime> end   = TimelineCompactPanel.GetEndDate(container);

                if (IsSetZoomToFit(mode) && start.HasValue && end.HasValue)
                {
                    TimeSpan duration        = end.Value - start.Value;
                    double   pixelPerTick    = (ActualWidth / 2) / duration.Ticks;
                    TimeSpan newTickTimeSpan = TimeSpan.FromTicks((long)(1D / pixelPerTick));

                    if (newTickTimeSpan.TotalMinutes < 1)
                    {
                        newTickTimeSpan = TimeSpan.FromMinutes(1);
                    }

                    if (newTickTimeSpan < TickTimeSpan)
                    {
                        TickTimeSpan = newTickTimeSpan;
                    }
                    else
                    {
                        if (ActualWidth / 2 < duration.Ticks * Timeline.GetPixelsPerTick(this))
                        {
                            TickTimeSpan = newTickTimeSpan;
                        }
                    }

                    WpfUtility.WaitForPriority(DispatcherPriority.Background);
                }

                if (IsSetCurrentTime(mode))
                {
                    if (start.HasValue)
                    {
                        CurrentTime = start.Value;
                    }
                    else if (end.HasValue)
                    {
                        CurrentTime = end.Value;
                    }
                }
            }
        }
예제 #4
0
        protected TimelineItem FindChildByDaya(object dep)
        {
            foreach (UIElement element in Children)
            {
                TimelineItem priorItem = element as TimelineItem;
                if (priorItem != null)
                {
                    if (object.Equals(priorItem.DataContext, dep))
                    {
                        return(priorItem);
                    }
                }
            }

            return(null);
        }
예제 #5
0
        private Rect CalcChildRectForDisplayAsZero(TimelineItem child, int childRowIndex)
        {
            DateTime?childStartDate = GetStartDate(child);
            DateTime?childEndDate   = GetEndDate(child);
            DateTime centerDate;

            if (MinimumDate == null || MaximumDate == null)
            {
                return(Rect.Empty);
            }

            if (!(childStartDate.HasValue && childEndDate.HasValue))
            {
                // Patch?
                centerDate = MinimumDate.Value;
            }
            else if (childStartDate.HasValue && childEndDate.HasValue)
            {
                TimeSpan duration = childEndDate.Value - childStartDate.Value;
                centerDate = childStartDate.Value.Add(
                    TimeSpan.FromTicks(duration.Ticks / 2));
            }
            else if (childStartDate.HasValue)
            {
                centerDate = childStartDate.Value;
            }
            else if (childEndDate.HasValue)
            {
                centerDate = childEndDate.Value;
            }
            else
            {
                throw new Exception("Invalid state of TimelineItem values");
            }

            double offset         = (centerDate - MinimumDate.Value).Ticks * PixelsPerTick;
            double width          = 20;
            double childTopOffset = childRowIndex * RowHeight +
                                    childRowIndex * RowVerticalMargin;

            return(new Rect(offset, childTopOffset, width, RowHeight));
        }
예제 #6
0
        protected Rect CalcChildRect(TimelineItem child, int childRowIndex)
        {
            if (/*child.Visibility == Visibility.Collapsed || */ child.IsCollapsed)
            {
                return(Rect.Empty);
            }

            Rect desiredSize;

            if (child.IsDisplayAsZero)
            {
                desiredSize = CalcChildRectForDisplayAsZero(child, childRowIndex);
            }
            else
            {
                desiredSize = CalcChildRectByDuration(child, childRowIndex);
            }

            return(desiredSize);
        }
예제 #7
0
        private Rect CalcChildRectForDisplayAsZero(TimelineItem child, int childRowIndex)
        {
            long?childStartTick = GetStartTick(child);
            long?childEndTick   = GetEndTick(child);
            long centerTick;

            if (MinimumTick == null || MaximumTick == null)
            {
                return(Rect.Empty);
            }

            if (!(childStartTick.HasValue && childEndTick.HasValue))
            {
                // Patch?
                centerTick = MinimumTick.Value;
            }
            else if (childStartTick.HasValue && childEndTick.HasValue)
            {
                long duration = childEndTick.Value - childStartTick.Value;
                centerTick = childStartTick.Value + (duration / 2);
            }
            else if (childStartTick.HasValue)
            {
                centerTick = childStartTick.Value;
            }
            else if (childEndTick.HasValue)
            {
                centerTick = childEndTick.Value;
            }
            else
            {
                throw new Exception("Invalid state of TimelineItem values");
            }

            double offset         = (centerTick - MinimumTick.Value) * PixelsPerTick;
            double width          = 20;
            double childTopOffset = childRowIndex * RowHeight + childRowIndex * RowVerticalMargin;

            return(new Rect(offset, childTopOffset, width, RowHeight));
        }
예제 #8
0
        private Rect CalcChildRectByDuration(TimelineItem child, int childRowIndex)
        {
            if (GetStartTick(child) == null || GetEndTick(child) == null || MinimumTick == null)
            {
                return(Rect.Empty);
            }

            long childStartTick = GetStartTick(child) ?? MinimumTick.Value;
            long childEndTick   = GetEndTick(child) ?? MinimumTick.Value;

            if (childEndTick < childStartTick)
            {
                childEndTick = childStartTick;
            }
            long childDuration = childEndTick - childStartTick;

            double offset         = (childStartTick - MinimumTick.Value) * PixelsPerTick;
            double width          = childDuration * PixelsPerTick;
            double childTopOffset = childRowIndex * RowHeight + childRowIndex * RowVerticalMargin;

            return(new Rect(offset, childTopOffset, width, RowHeight));
        }
예제 #9
0
        private Rect CalcChildRectByDuration(TimelineItem child, int childRowIndex)
        {
            if (GetStartDate(child) == null || GetEndDate(child) == null || MinimumDate == null)
            {
                return(Rect.Empty);
            }

            DateTime childStartDate = GetStartDate(child) ?? MinimumDate.Value;
            DateTime childEndDate   = GetEndDate(child) ?? MinimumDate.Value;

            if (childEndDate < childStartDate)
            {
                childEndDate = childStartDate;
            }
            TimeSpan childDuration = childEndDate - childStartDate;

            double offset         = (childStartDate - MinimumDate.Value).Ticks * PixelsPerTick;
            double width          = childDuration.Ticks * PixelsPerTick;
            double childTopOffset = childRowIndex * RowHeight +
                                    childRowIndex * RowVerticalMargin;

            return(new Rect(offset, childTopOffset, width, RowHeight));
        }
        protected override void PrepareContainerForItemOverride(
            DependencyObject element, object item)
        {
            base.PrepareContainerForItemOverride(element, item);

            if (Timeline != null)
            {
                object fromItem = GetFromItem(element);
                object toItem   = GetToItem(element);

                if (fromItem != null && toItem != null)
                {
                    TimelineItem tlFromItem = Timeline.ContainerFromItem(fromItem);
                    TimelineItem tlToItem   = Timeline.ContainerFromItem(toItem);

                    if (tlFromItem != null && tlToItem != null)
                    {
                        Connection conn = (Connection)element;
                        conn.SourceItem = tlFromItem;
                        conn.SinkItem   = tlToItem;
                    }
                }
            }
        }
예제 #11
0
        private static void IsDisplayAsZeroChanged(DependencyObject o, DependencyPropertyChangedEventArgs e)
        {
            TimelineItem item = (TimelineItem)o;

            item.OnPropertyChanged("IsDisplayAsZero");
        }
예제 #12
0
        private static void IsCollapsedChanged(DependencyObject o, DependencyPropertyChangedEventArgs e)
        {
            TimelineItem item = (TimelineItem)o;

            item.OnPropertyChanged("IsCollapsed");
        }
        protected override Size MeasureOverride(Size availableSize)
        {
            rowsCount = -1;
            List <UIElement>      measuredChildren   = new List <UIElement>();
            Dictionary <int, int> logicalToActualMap = new Dictionary <int, int>();

            var q =
                from c in Children.OfType <UIElement>()
                let row = GetRowIndex(c)
                          orderby row
                          select new { Child = c, Row = row };

            int nextActualRowIndex = 0;

            foreach (var childAndRow in q)
            {
                ClearActualRowIndex(childAndRow.Child);
                childAndRow.Child.ClearValue(UIElement.VisibilityProperty);

                TimelineItem tlChild = (TimelineItem)childAndRow.Child;

                tlChild.IsDisplayAsZero = ShouldDisplayAsZero(tlChild);
                tlChild.ApplyTemplate();

                Rect calcChildSize = CalcChildRect(tlChild, nextActualRowIndex);
                childAndRow.Child.Measure(calcChildSize.Size);

                if (tlChild.IsCollapsed)
                {
                    childAndRow.Child.Visibility = Visibility.Collapsed;
                }
                else
                {
                    int actualRowIndex;
                    if (!logicalToActualMap.TryGetValue(childAndRow.Row, out actualRowIndex))
                    {
                        actualRowIndex = nextActualRowIndex++;
                        logicalToActualMap.Add(childAndRow.Row, actualRowIndex);
                    }
                    SetActualRowIndex(childAndRow.Child, actualRowIndex);

                    SetChildRow(childAndRow.Child, measuredChildren);
                    measuredChildren.Add(childAndRow.Child);

                    if (IsChildHasNoStartAndEndTime(childAndRow.Child))
                    {
                        childAndRow.Child.Visibility = Visibility.Hidden;
                    }
                }
            }

            TimeSpan totalTimeSpan = TimeSpan.Zero;

            if (MaximumDate.HasValue && MinimumDate.HasValue)
            {
                totalTimeSpan = MaximumDate.Value - MinimumDate.Value;
            }
            double totalWidth  = Math.Max(0, totalTimeSpan.Ticks * PixelsPerTick);
            double totalHeight = Math.Max(0,
                                          nextActualRowIndex * RowHeight + nextActualRowIndex * RowVerticalMargin);

            return(totalWidth <= 0 || totalHeight <= 0 ? Size.Empty : new Size(totalWidth, totalHeight));
        }