Ejemplo n.º 1
0
        /// <summary>
        /// Met à jour la position de la timeline.
        /// </summary>
        private void UpdateTimelinePosition()
        {
            if (DesignMode.IsInDesignMode)
            {
                return;
            }

            var timeService = IoC.Resolve <IServiceBus>().Get <ITimeTicksFormatService>();

            var position = base.GetPosition(this.CurrentTimelinePosition);

            if (position < 0)
            {
                position = 0;
            }

            if (_timelineThumb != null && _timelineLine != null)
            {
                var nextLeft = position - _timelineThumb.ActualWidth / 2.0;
                if (Canvas.GetLeft(_timelineThumb) != nextLeft)
                {
                    Canvas.SetLeft(_timelineThumb, nextLeft);
                    Canvas.SetLeft(_timelineLine, position);

                    if (_timelineTime != null)
                    {
                        _timelineTime.Content = timeService.TicksToString(GanttDates.ToTicks(this.CurrentTimelinePosition));

                        ShowTimelinePopup();
                    }
                }
            }
        }
Ejemplo n.º 2
0
 /// <summary>
 /// Initialise une nouvelle instance de la classe <see cref="ActionGanttItem"/>.
 /// </summary>
 /// <param name="action">L'action.</param>
 /// <param name="level">Le niveau d'indentation.</param>
 public ActionGanttItem(KAction action, int level)
 {
     Action      = action;
     Indentation = level;
     Start       = GanttDates.ToDateTime(action.BuildStart);
     Finish      = GanttDates.ToDateTime(action.BuildFinish);
     UpdateContent();
 }
Ejemplo n.º 3
0
 /// <summary>
 /// Appelé lorsque la valeur de le propriété <see cref="BuildActionFinish"/> a changé.
 /// </summary>
 /// <param name="action">The action.</param>
 protected override void OnBuildActionFinishChanged(KAction action)
 {
     foreach (var item in this.ItemsOfTypeAction.Where(i => i.Action == action))
     {
         _updatingitem = item;
         item.Finish   = GanttDates.ToDateTime(action.BuildFinish);
         _updatingitem = null;
     }
 }
Ejemplo n.º 4
0
 /// <summary>
 /// Obtient la fin process d'une action.
 /// </summary>
 /// <param name="action">L'action.</param>
 /// <returns>La fin</returns>
 protected override long GetBuildFinish(KAction action)
 {
     if (_useGanttItemsTimingsOnly)
     {
         var first = this.ItemsOfTypeAction.First(i => i.Action == action);
         return(GanttDates.ToTicks(first.Finish));
     }
     else
     {
         return(action.BuildFinish);
     }
 }
Ejemplo n.º 5
0
 private void SetBuildFinish(KAction action, long value)
 {
     if (_useGanttItemsTimingsOnly)
     {
         foreach (var item in this.ItemsOfTypeAction.Where(i => i.Action == action))
         {
             item.Finish = GanttDates.ToDateTime(value);
         }
     }
     else
     {
         action.BuildFinish = value;
     }
 }
Ejemplo n.º 6
0
        /// <summary>
        /// Calcule les intervales en fonction du zoom, de la timeline affichée et de la largeur du chart.
        /// </summary>
        /// <param name="zoom">Le zoom appliqué.</param>
        public void CalculateInitialIntervals(double zoom)
        {
            var timeService = IoC.Resolve <IServiceBus>().Get <ITimeTicksFormatService>();

            var start         = this.GanttChartView.TimelinePageStart;
            var finish        = GanttDates.ToDateTime((this.GanttChartView.TimelinePageFinish - start).Ticks / 5);
            var overallFinish = this.GanttChartView.TimelinePageFinish;

            this.Intervals.Clear();

            var total = finish - start;

            var maxIntervalsCount = this.ChartWidth / 70;

            var timeSpanMinIncrement = TimeSpan.FromHours(total.TotalHours / maxIntervalsCount);

            long realIncrementTicks;

            if (timeSpanMinIncrement.TotalSeconds < 1)
            {
                realIncrementTicks = timeSpanMinIncrement.Ticks;
            }
            else if (timeSpanMinIncrement.TotalMinutes < 1)
            {
                realIncrementTicks = TimeSpan.FromSeconds(Math.Ceiling(timeSpanMinIncrement.TotalSeconds)).Ticks;
            }
            else if (timeSpanMinIncrement.TotalHours < 1)
            {
                realIncrementTicks = TimeSpan.FromMinutes(Math.Ceiling(timeSpanMinIncrement.TotalMinutes)).Ticks;
            }
            else
            {
                realIncrementTicks = TimeSpan.FromHours(Math.Ceiling(timeSpanMinIncrement.TotalHours)).Ticks;
            }

            var currentDate = start;

            while (currentDate < overallFinish)
            {
                var nextDate = currentDate.AddTicks(Convert.ToInt64(realIncrementTicks / zoom));
                var interval = new CustomScaleInterval(currentDate, nextDate);
                var timeSpan = currentDate - start;

                interval.HeaderContent = timeService.TicksToString(timeSpan.Ticks);
                this.Intervals.Add(interval);
                currentDate = nextDate;
            }
        }
Ejemplo n.º 7
0
        private void OnItemTimingChanged(object sender, EventArgs e)
        {
            var item = (ActionGanttItem)sender;

            if (_updatingitem == item)
            {
                return;
            }

            if (_useGanttItemsTimingsOnly)
            {
                return;
            }

            if (!SetActionBuildTiming(item.Action, GanttDates.ToTicks(item.Start), GanttDates.ToTicks(item.Finish)))
            {
                item.Start  = GanttDates.ToDateTime(item.Action.BuildStart);
                item.Finish = GanttDates.ToDateTime(item.Action.BuildFinish);
            }
        }
Ejemplo n.º 8
0
        /// <summary>
        /// Applique un auto scale sur un ou plusieurs Gantts.
        /// </summary>
        /// <param name="updateTimelineRange"><c>true</c> pour mettre également à jour les ranges de la Timeline.</param>
        /// <param name="charts">Les différents Gantts.</param>
        private void AutoScale(bool updateTimelineRange, double zoomX, double zoomY, IEnumerable <IZoomableGanttTarget> charts)
        {
            var timeService = IoC.Resolve <IServiceBus>().Get <ITimeTicksFormatService>();
            var chartsChart = new Dictionary <IZoomableGanttTarget, GanttChartView>();

            if (!charts.Any(c => c.IsReadyForAutoScale))
            {
                return;
            }

            foreach (var chart in charts)
            {
                var grid = chart as GanttChartDataGrid;
                if (grid != null && grid.GanttChartView != null)
                {
                    chartsChart[chart] = grid.GanttChartView;
                }

                else
                {
                    var v = chart as GanttChartView;
                    if (v != null)
                    {
                        chartsChart[chart] = v;
                    }
                }
            }

            IEnumerable <GanttChartItem> tasks = null;

            foreach (var chart in charts)
            {
                if (tasks == null)
                {
                    tasks = chartsChart[chart].ManagedItems;
                }
                else
                {
                    tasks = tasks.Concat(chartsChart[chart].ManagedItems);
                }
            }

            if (tasks == null || !tasks.Any())
            {
                if (updateTimelineRange)
                {
                    foreach (var zoomable in charts)
                    {
                        var chart = chartsChart[zoomable];
                        chart.TimelinePageStart  = GanttDates.StartDate;
                        chart.TimelinePageFinish = GanttDates.DefaultEndDate;
                        if (chart.ScrollContentPresenter != null)
                        {
                            chart.UpdateScaleInterval = TimeSpan.FromTicks(timeService.CurrentTimeScale);
                        }
                    }
                }
            }
            else
            {
                var start = GanttDates.StartDate;
                var end   = tasks.Max(t => t.Finish);

                if (updateTimelineRange)
                {
                    foreach (var zoomable in charts)
                    {
                        var chart = chartsChart[zoomable];
                        chart.TimelinePageStart = GanttDates.StartDate;
                        double finish = (end - start).Ticks * 5;
                        chart.TimelinePageFinish = GanttDates.ToDateTime(Convert.ToInt64(finish));

                        if (chart.ScrollContentPresenter != null)
                        {
                            chart.UpdateScaleInterval = TimeSpan.FromTicks(timeService.CurrentTimeScale);
                        }
                    }

                    var total = end - start;

                    double minWidth = double.PositiveInfinity;
                    foreach (var zoomable in charts)
                    {
                        var chart = chartsChart[zoomable];
                        if (chart.ScrollContentPresenter != null)
                        {
                            minWidth = Math.Min(minWidth, GetVisibleWidth(chart));
                        }
                    }

                    foreach (var zoomable in charts)
                    {
                        var chart = chartsChart[zoomable];
                        if (minWidth / total.TotalHours > 0.0)
                        {
                            chart.HourWidth = minWidth * zoomX / total.TotalHours;
                        }
                    }

                    foreach (var zoomable in charts)
                    {
                        var chart         = chartsChart[zoomable];
                        var zoomableScale = (ZoomableScale)chart.Scales[0];
                        zoomableScale.ChartWidth = minWidth;
                        zoomableScale.CalculateInitialIntervals(zoomX);
                    }
                }

                // Application du zoom Y
                foreach (var zoomable in charts)
                {
                    var chart = chartsChart[zoomable];

                    var grid = zoomable as KGanttChartDataGrid;
                    if (grid == null)
                    {
                        grid = ((KGanttChartView)chart).ParentKDataGrid;
                    }

                    if (zoomable.ZoomYInitialValues == null)
                    {
                        zoomable.ZoomYInitialValues = new ZoomYInitialValues
                        {
                            BarHeightRatio        = grid.BarHeight / grid.ItemHeight,
                            ItemHeight            = grid.ItemHeight,
                            FontSize              = grid.FontSize,
                            DataGridRowsPresenter = grid.FindFirstChild <System.Windows.Controls.Primitives.DataGridRowsPresenter>(),
                        };
                    }

                    // Arrondir au pixel près car autrement le LayoutRounding risque de causer des décalages entre la grille et les barres
                    grid.ItemHeight = Math.Round(zoomable.ZoomYInitialValues.ItemHeight * zoomY, 0);
                    grid.BarHeight  = zoomable.ZoomYInitialValues.BarHeightRatio * grid.ItemHeight;
                    double fontSize = zoomable.ZoomYInitialValues.FontSize * zoomY;
                    System.Windows.Documents.TextElement.SetFontSize(zoomable.ZoomYInitialValues.DataGridRowsPresenter, fontSize);
                    System.Windows.Documents.TextElement.SetFontSize(chart.ScrollContentPresenter, fontSize);
                }
            }

            SaveZoom(zoomX, zoomY);
        }
Ejemplo n.º 9
0
        public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
            var dateTime = System.Convert.ToDateTime(value);

            return(GanttDates.ToTicks(dateTime));
        }
Ejemplo n.º 10
0
        public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
            var ticks = System.Convert.ToInt64(value);

            return(GanttDates.ToDateTime(ticks));
        }
Ejemplo n.º 11
0
        /// <summary>
        /// Enregistre des actions déjà existantes et construit les éléments.
        /// </summary>
        /// <param name="allActions">Toutes les actions.</param>
        /// <param name="filter">Les filtre I/E/S.</param>
        public void RegisterInitialActions(IEnumerable <KAction> allActions, IESFilterValue filter)
        {
            Func <ActionsDisplayResults> displayedActions;

            bool isCriticalPathEnabled;
            bool useManagedPredSucc;
            bool useGanttItemsTimingsOnly;
            bool fixPredSuccTimings;
            bool refreshTimings;

            foreach (var action in allActions)
            {
                action.IsGroup         = WBSHelper.HasChildren(action, allActions);
                action.IsLinkToProcess = action.LinkedProcessId != null;
            }

            switch (filter)
            {
            case IESFilterValue.IES:
                useManagedPredSucc    = false;
                isCriticalPathEnabled = true;
                displayedActions      = () => new ActionsDisplayResults {
                    Actions = allActions
                };
                useGanttItemsTimingsOnly = false;
                fixPredSuccTimings       = true;
                refreshTimings           = true;
                break;

            case IESFilterValue.I:
                useManagedPredSucc    = true;
                isCriticalPathEnabled = true;
                displayedActions      = () => FilterActionsUpdatePredSuccManaged(allActions,
                                                                                 a => ActionsTimingsMoveManagement.IsActionExternal(a) || ActionsTimingsMoveManagement.IsActionDeleted(a),
                                                                                 a => ActionsTimingsMoveManagement.IsActionInternal(a));
                useGanttItemsTimingsOnly = true;
                fixPredSuccTimings       = true;
                refreshTimings           = false;
                break;

            case IESFilterValue.IE:
                useManagedPredSucc    = true;
                isCriticalPathEnabled = false;
                displayedActions      = () => FilterActionsUpdatePredSuccManaged(allActions,
                                                                                 a => ActionsTimingsMoveManagement.IsActionDeleted(a),
                                                                                 a => ActionsTimingsMoveManagement.IsActionExternal(a) || ActionsTimingsMoveManagement.IsActionInternal(a));
                useGanttItemsTimingsOnly = true;
                fixPredSuccTimings       = true;
                refreshTimings           = false;
                break;

            default:
                throw new ArgumentOutOfRangeException("filter");
            }

            _useGanttItemsTimingsOnly = useGanttItemsTimingsOnly;

            this.IsCriticalPathEnabled = isCriticalPathEnabled;

            var results = displayedActions();

            this.UseManagedPredecessorsSuccessors = useManagedPredSucc;
            if (filter == IESFilterValue.IES && useManagedPredSucc)
            {
                ActionsTimingsMoveManagement.DebugCheckAllWBS(results.Actions);
            }

            this.RegisterInitialActionsImpl(results.Actions);

            if (results.NewTimings != null)
            {
                foreach (var timing in results.NewTimings)
                {
                    SetBuildStart(timing.Action, timing.Start);
                    SetBuildFinish(timing.Action, timing.Finish);
                }
            }

            if (refreshTimings)
            {
                foreach (var item in this.ItemsOfTypeAction)
                {
                    _updatingitem = item;
                    item.Start    = GanttDates.ToDateTime(item.Action.BuildStart);
                    item.Finish   = GanttDates.ToDateTime(item.Action.BuildFinish);
                    _updatingitem = null;
                }
            }

            if (fixPredSuccTimings)
            {
                this.FixPredecessorsSuccessorsTimings();
                this.UpdateResourcesLoad();
            }
        }