public static void DrawFocusedMessage(
            LJD.Graphics g,
            ViewMetrics viewMetrics,
            IViewEvents eventsHandler,
            DrawScope scope,
            Size sz)
        {
            var pos = eventsHandler.OnDrawFocusedMessage(scope);

            if (pos == null)
            {
                return;
            }
            if (pos.Value < 0 || pos.Value > 1)
            {
                return;
            }
            var x = (int)(pos.Value * (double)sz.Width);

            g.DrawLine(viewMetrics.FocusedMessagePen, x, 0, x, sz.Height);
            var img   = viewMetrics.FocusedMessageLineTop;
            var imgsz = img.GetSize(height: 4f);

            g.DrawImage(img, new RectangleF
                            (x - imgsz.Width / 2, 1, imgsz.Width, imgsz.Height));
        }
 public static void DrawEvents(
     LJD.Graphics g,
     ViewMetrics viewMetrics,
     IViewEvents eventsHandler)
 {
     foreach (var evt in Metrics.GetEventMetrics(g, eventsHandler, viewMetrics))
     {
         if (evt.VertLinePoints != null)
         {
             g.PushState();
             g.EnableAntialiasing(true);
             g.DrawLines(viewMetrics.UserEventPen, evt.VertLinePoints);
             g.PopState();
         }
         else
         {
             g.DrawLine(viewMetrics.UserEventPen, evt.VertLineA, evt.VertLineB);
         }
         if (evt.Icon != null)
         {
             g.DrawImage(evt.Icon, evt.IconRect);
         }
         g.FillRectangle(viewMetrics.EventRectBrush, evt.CaptionRect);
         g.DrawRectangle(viewMetrics.EventRectPen, evt.CaptionRect);
         g.DrawString(evt.Event.Caption, viewMetrics.EventCaptionFont,
                      viewMetrics.EventCaptionBrush, evt.CaptionDrawingOrigin,
                      viewMetrics.EventCaptionStringFormat);
     }
 }
        public static void DrawActivities(LJD.Graphics g, ViewMetrics viewMetrics, IViewEvents eventsHandler)
        {
            PushGraphicsStateForDrawingActivites(g, viewMetrics, HitTestResult.AreaCode.ActivitiesPanel);

            foreach (var a in Metrics.GetActivitiesMetrics(viewMetrics, eventsHandler))
            {
                g.FillRectangle(GetActivityBrush(viewMetrics, a.Activity.Type), a.ActivityBarRect);

                foreach (var ph in a.Phases)
                {
                    var phaseMargin = a.ActivityBarRect.Height / 3;
                    g.FillRectangle(ph.Brush, ph.X1, a.ActivityBarRect.Top + phaseMargin,
                                    Math.Max(ph.X2 - ph.X1, 2), a.ActivityBarRect.Height - phaseMargin - 2);
                }

                foreach (var ms in a.Milestones)
                {
                    g.DrawLine(viewMetrics.MilestonePen, ms.X, a.ActivityBarRect.Top, ms.X, a.ActivityBarRect.Bottom);
                }

                g.DrawRectangle(viewMetrics.ActivityBarBoundsPen, a.ActivityBarRect);

                if (a.PairedActivityConnectorBounds != null)
                {
                    var r = a.PairedActivityConnectorBounds.Value;
                    g.DrawLine(viewMetrics.ActivitiesConnectorPen, r.Left, r.Top, r.Left, r.Bottom);
                    g.DrawLine(viewMetrics.ActivitiesConnectorPen, r.Right, r.Top, r.Right, r.Bottom);
                }
            }

            g.PopState();
        }
        ViewMetrics MakeViewMetrics()
        {
            var viewMetrics = new ViewMetrics(res.Value);

            viewMetrics.RulersPanelHeight           = (int)searchTextBoxPlaceholder.Frame.Bottom;
            viewMetrics.ActivitiesViewWidth         = (int)activitiesView.Bounds.Width;
            viewMetrics.ActivitiesViewHeight        = (int)activitiesView.Bounds.Height;
            viewMetrics.ActivitesCaptionsViewWidth  = (int)captionsView.Bounds.Width;
            viewMetrics.ActivitesCaptionsViewHeight = (int)captionsView.Bounds.Height;
            viewMetrics.NavigationPanelWidth        = (int)navigatorView.Bounds.Width;
            viewMetrics.NavigationPanelHeight       = (int)navigatorView.Bounds.Height;

            viewMetrics.LineHeight = (int)(NSFont.SystemFontSize * 1.5f);

            viewMetrics.ActionLebelHeight = 17;
            viewMetrics.MeasurerTop       = 25;

            viewMetrics.ActivityBarRectPaddingY   = 5;
            viewMetrics.TriggerLinkWidth          = 8;
            viewMetrics.DistanceBetweenRulerMarks = 70;
            viewMetrics.VisibleRangeResizerWidth  = 8;

            viewMetrics.VScrollBarValue = (int)(vertScroller.DoubleValue * GetVertScrollerValueRange(viewMetrics));

            viewMetrics.SequenceDiagramAreaWidth = captionsMarginMetrics.SequenceDiagramAreaWidth;
            viewMetrics.FoldingAreaWidth         = captionsMarginMetrics.FoldingAreaWidth;

            return(viewMetrics);
        }
Exemple #5
0
        ViewMetrics GetUpToDateViewMetrics()
        {
            var viewMetrics = new ViewMetrics(res);
            var vm          = viewMetrics;

            vm.ActivitiesViewWidth         = activitiesViewPanel.Width;
            vm.ActivitiesViewHeight        = activitiesViewPanel.Height;
            vm.ActivitesCaptionsViewWidth  = activitesCaptionsPanel.Width;
            vm.ActivitesCaptionsViewHeight = activitesCaptionsPanel.Height;
            vm.NavigationPanelWidth        = navigationPanel.Width;
            vm.NavigationPanelHeight       = navigationPanel.Height;
            vm.VScrollBarValue             = activitiesScrollBar.Value;

            vm.LineHeight = UIUtils.Dpi.Scale(20, 120);
            vm.DPIScale   = UIUtils.Dpi.Scale(1f);
            vm.ActivityBarRectPaddingY   = UIUtils.Dpi.Scale(5, 120);
            vm.TriggerLinkWidth          = UIUtils.Dpi.ScaleUp(5, 120);
            vm.DistanceBetweenRulerMarks = UIUtils.Dpi.ScaleUp(50, 120);;
            vm.MeasurerTop = 25;
            vm.VisibleRangeResizerWidth = 8;
            vm.RulersPanelHeight        = UIUtils.Dpi.Scale(53, 120);
            vm.ActionLebelHeight        = UIUtils.Dpi.Scale(20, 120);

            vm.SequenceDiagramAreaWidth = captionsMarginMetrics.SequenceDiagramAreaWidth;
            vm.FoldingAreaWidth         = captionsMarginMetrics.FoldingAreaWidth;

            return(viewMetrics);
        }
        public void DrawCaptionsView(
            LJD.Graphics g,
            ViewMetrics viewMetrics,
            IViewModel eventsHandler,
            Action <string, Rectangle, int, int, bool> drawCaptionWithHighlightedRegion
            )
        {
            PushGraphicsStateForDrawingActivites(g, viewMetrics, HitTestResult.AreaCode.CaptionsPanel);

            int  availableHeight = viewMetrics.ActivitiesViewHeight;
            bool darkMode        = eventsHandler.ColorTheme == Presenters.ColorThemeMode.Dark;

            foreach (var a in eventsHandler.OnDrawActivities())
            {
                int y = viewMetrics.GetActivityY(a.Index);
                if (y < 0)
                {
                    continue;
                }
                if (y > availableHeight)
                {
                    break;
                }

                var h = viewMetrics.LineHeight - 1;
                var sequenceDiagramTextRect = new Rectangle(0, y, viewMetrics.SequenceDiagramAreaWidth, h);
                var foldingAreaRect         = new Rectangle(
                    sequenceDiagramTextRect.Right + 1 /* box padding */, y + (h - viewMetrics.FoldingAreaWidth) / 2, viewMetrics.FoldingAreaWidth, viewMetrics.FoldingAreaWidth);
                var textRect = new Rectangle(
                    foldingAreaRect.Right + 3 /* text padding */, y, viewMetrics.ActivitesCaptionsViewWidth - foldingAreaRect.Right, h);
                var lineRect = new Rectangle(0, y, viewMetrics.ActivitesCaptionsViewWidth, h);
                if (a.IsSelected)
                {
                    g.FillRectangle(res.SelectedActivityBackgroundBrush, lineRect);
                }
                else if (!darkMode && a.Color.HasValue)
                {
                    using (var bgBrush = MakeBrush(a.Color.Value))
                        g.FillRectangle(bgBrush, lineRect);
                }
                if (!string.IsNullOrEmpty(a.SequenceDiagramText))
                {
                    g.DrawString(a.SequenceDiagramText, res.ActivitesCaptionsFont, res.ActivitesCaptionsBrush, sequenceDiagramTextRect);
                }
                if (a.IsFolded.HasValue)
                {
                    g.DrawRectangle(res.FoldingSignPen, foldingAreaRect);
                    int pad = 2;
                    g.DrawLine(res.FoldingSignPen, foldingAreaRect.Left + pad, foldingAreaRect.MidY(), foldingAreaRect.Right - pad, foldingAreaRect.MidY());
                    if (a.IsFolded == true)
                    {
                        g.DrawLine(res.FoldingSignPen, foldingAreaRect.MidX(), foldingAreaRect.Top + pad, foldingAreaRect.MidX(), foldingAreaRect.Bottom - pad);
                    }
                }
                drawCaptionWithHighlightedRegion(a.Caption, textRect, a.CaptionSelectionBegin, a.CaptionSelectionLength, a.IsError);
            }

            g.PopState();
        }
Exemple #7
0
 public static IEnumerable <TLRulerMark> GetRulerMarks(
     ViewMetrics viewMetrics,
     IViewEvents eventsHandler,
     DrawScope scope
     )
 {
     return(eventsHandler.OnDrawRulers(scope, viewMetrics.ActivitiesViewWidth, viewMetrics.DistnanceBetweenRulerMarks));
 }
Exemple #8
0
 static int GetActivityByPoint(Point pt, ViewMetrics vm)
 {
     if (pt.Y < vm.RulersPanelHeight)
     {
         return(-1);
     }
     return((pt.Y + vm.VScrollBarValue - vm.RulersPanelHeight) / vm.LineHeight);
 }
        public static void DrawMeasurer(
            LJD.Graphics g,
            ViewMetrics viewMetrics,
            IViewEvents eventsHandler)
        {
            var drawInfo = eventsHandler.OnDrawMeasurer();

            if (!drawInfo.MeasurerVisible)
            {
                return;
            }
            double viewWidth  = viewMetrics.ActivitiesViewWidth;
            int    viewHeight = viewMetrics.ActivitiesViewHeight;
            var    x1         = Metrics.SafeGetScreenX(drawInfo.X1, viewWidth);
            var    x2         = Metrics.SafeGetScreenX(drawInfo.X2, viewWidth);

            g.DrawLine(viewMetrics.MeasurerPen, x1, viewMetrics.MeasurerTop, x1, viewHeight);
            g.DrawLine(viewMetrics.MeasurerPen, x2, viewMetrics.MeasurerTop, x2, viewHeight);
            g.DrawLine(viewMetrics.MeasurerPen, x1, viewMetrics.MeasurerTop, x2, viewMetrics.MeasurerTop);
            var        textSz = g.MeasureString(drawInfo.Text, viewMetrics.MeasurerTextFont);
            RectangleF textRect;
            int        textHPadding = 2;

            if (textSz.Width < (x2 - x1 - 5))
            {
                textRect = new RectangleF(
                    (x2 + x1 - textSz.Width - textHPadding) / 2,
                    viewMetrics.MeasurerTop - textSz.Height / 2,
                    textSz.Width + textHPadding,
                    textSz.Height
                    );
            }
            else
            {
                textRect = new RectangleF(
                    x2 + 5,
                    viewMetrics.MeasurerTop - textSz.Height / 2,
                    textSz.Width + textHPadding,
                    textSz.Height
                    );
                if (textRect.Right > viewMetrics.ActivitiesViewWidth)
                {
                    textRect.X = x1 - 5 - textRect.Width;
                }
            }
            g.FillRectangle(viewMetrics.MeasurerTextBoxBrush, textRect);
            g.DrawRectangle(viewMetrics.MeasurerTextBoxPen, new RectangleF(textRect.X, textRect.Y, textRect.Width, textRect.Height));
            g.DrawString(drawInfo.Text,
                         viewMetrics.MeasurerTextFont, viewMetrics.MeasurerTextBrush,
                         new PointF((textRect.X + textRect.Right) / 2, (textRect.Y + textRect.Bottom) / 2),
                         viewMetrics.MeasurerTextFormat);
        }
 public static void DrawBookmarks(
     LJD.Graphics g,
     ViewMetrics viewMetrics,
     IViewEvents eventsHandler)
 {
     foreach (var evt in Metrics.GetBookmarksMetrics(g, viewMetrics, eventsHandler))
     {
         g.DrawLine(viewMetrics.BookmarkPen, evt.VertLineA, evt.VertLineB);
         if (evt.Icon != null)
         {
             g.DrawImage(evt.Icon, evt.IconRect);
         }
     }
 }
Exemple #11
0
        static int?GetActivityByPoint(Point pt, ViewMetrics vm, int activitiesCount)
        {
            if (pt.Y < vm.RulersPanelHeight)
            {
                return(null);
            }
            int idx = (pt.Y + vm.VScrollBarValue - vm.RulersPanelHeight) / vm.LineHeight;

            if (idx >= activitiesCount)
            {
                return(null);
            }
            return(idx);
        }
        static LJD.Brush GetActivityBrush(ViewMetrics viewMetrics, ActivityType t)
        {
            switch (t)
            {
            case ActivityType.Lifespan: return(viewMetrics.LifetimeBrush);

            case ActivityType.Procedure: return(viewMetrics.ProcedureBrush);

            case ActivityType.IncomingNetworking: return(viewMetrics.NetworkMessageBrush);

            case ActivityType.OutgoingNetworking: return(viewMetrics.NetworkMessageBrush);

            default: return(viewMetrics.UnknownActivityBrush);
            }
        }
        public static void DrawActivtiesView(
            LJD.Graphics g,
            ViewMetrics viewMetrics,
            IViewEvents eventsHandler)
        {
            var viewSz = new Size(viewMetrics.ActivitiesViewWidth, viewMetrics.ActivitiesViewHeight);

            Drawing.DrawActivitiesBackground(g, viewMetrics, eventsHandler);
            Drawing.DrawRulerLines(g, viewMetrics, eventsHandler, DrawScope.VisibleRange, viewSz);
            Drawing.DrawActivitiesTopBound(g, viewMetrics);
            Drawing.DrawEvents(g, viewMetrics, eventsHandler);
            Drawing.DrawBookmarks(g, viewMetrics, eventsHandler);
            Drawing.DrawFocusedMessage(g, viewMetrics, eventsHandler, DrawScope.VisibleRange, viewSz);
            Drawing.DrawActivities(g, viewMetrics, eventsHandler);
            Drawing.DrawMeasurer(g, viewMetrics, eventsHandler);
        }
        public static void DrawCaptionsView(
            LJD.Graphics g,
            ViewMetrics viewMetrics,
            IViewEvents eventsHandler,
            int sequenceDiagramAreaWidth,
            Action <string, Rectangle, int, int, bool> drawCaptionWithHighlightedRegion
            )
        {
            PushGraphicsStateForDrawingActivites(g, viewMetrics, HitTestResult.AreaCode.CaptionsPanel);

            int availableHeight = viewMetrics.ActivitiesViewHeight;

            foreach (var a in eventsHandler.OnDrawActivities())
            {
                int y = Metrics.GetActivityY(viewMetrics, a.Index);
                if (y < 0)
                {
                    continue;
                }
                if (y > availableHeight)
                {
                    break;
                }

                var h = viewMetrics.LineHeight - 1;
                var sequenceDiagramTextRect = new Rectangle(0, y, sequenceDiagramAreaWidth, h);
                var textRect = new Rectangle(
                    sequenceDiagramTextRect.Right + 3 /* text padding */, y, viewMetrics.ActivitesCaptionsViewWidth - sequenceDiagramTextRect.Right, h);
                var lineRect = new Rectangle(0, y, viewMetrics.ActivitesCaptionsViewWidth, h);
                if (a.IsSelected)
                {
                    g.FillRectangle(viewMetrics.SelectedLineBrush, lineRect);
                }
                else if (a.Color.HasValue)
                {
                    using (var bgBrush = MakeBrush(a.Color.Value))
                        g.FillRectangle(bgBrush, lineRect);
                }
                if (!string.IsNullOrEmpty(a.SequenceDiagramText))
                {
                    g.DrawString(a.SequenceDiagramText, viewMetrics.ActivitesCaptionsFont, viewMetrics.ActivitesCaptionsBrush, sequenceDiagramTextRect);
                }
                drawCaptionWithHighlightedRegion(a.Caption, textRect, a.CaptionSelectionBegin, a.CaptionSelectionLength, a.IsError);
            }

            g.PopState();
        }
        public static void DrawRulerLines(
            LJD.Graphics g,
            ViewMetrics viewMetrics,
            IViewEvents eventHandler,
            DrawScope scope,
            Size viewSize
            )
        {
            double availableWidth = viewSize.Width;

            foreach (var m in Metrics.GetRulerMarks(viewMetrics, eventHandler, scope))
            {
                int x = (int)(m.X * availableWidth);
                g.DrawString(m.Label, viewMetrics.RulerMarkFont, viewMetrics.RulerMarkBrush, new Point(x, 2));
                g.DrawLine(viewMetrics.RulerLinePen, x, 0, x, viewSize.Height);
            }
        }
        public static void DrawNavigationPanel(
            LJD.Graphics g,
            ViewMetrics viewMetrics,
            IViewEvents eventsHandler)
        {
            var panelClientRect = new Rectangle(0, 0, viewMetrics.NavigationPanelWidth, viewMetrics.NavigationPanelHeight);

            g.FillRectangle(viewMetrics.NavigationPanel_InvisibleBackground, panelClientRect);

            var m = Metrics.GetNavigationPanelMetrics(viewMetrics, eventsHandler);

            g.FillRectangle(viewMetrics.NavigationPanel_VisibleBackground, m.VisibleRangeBox);

            DrawRulerLines(g, viewMetrics, eventsHandler, DrawScope.AvailableRange, panelClientRect.Size);

            double width = (double)viewMetrics.NavigationPanelWidth;

            foreach (var evt in eventsHandler.OnDrawEvents(DrawScope.AvailableRange))
            {
                int x = (int)(evt.X * width);
                g.DrawLine(viewMetrics.UserEventPen, x, 0, x, viewMetrics.NavigationPanelHeight);
            }

            foreach (var evt in eventsHandler.OnDrawBookmarks(DrawScope.AvailableRange))
            {
                int x = (int)(evt.X * width);
                g.DrawLine(viewMetrics.BookmarkPen, x, 0, x, viewMetrics.NavigationPanelHeight);
            }

            var focusedMessagePos = eventsHandler.OnDrawFocusedMessage(DrawScope.AvailableRange);

            if (focusedMessagePos.HasValue && focusedMessagePos.Value >= 0 && focusedMessagePos.Value <= 1)
            {
                int x = (int)(focusedMessagePos.Value * width);
                g.DrawLine(viewMetrics.FocusedMessagePen, x, 0, x, viewMetrics.NavigationPanelHeight);
            }

            ResizerDrawing.DrawResizer(g, m.Resizer1, viewMetrics.SystemControlBrush);
            ResizerDrawing.DrawResizer(g, m.Resizer2, viewMetrics.SystemControlBrush);

            Rectangle visibleRangeBox = m.VisibleRangeBox;

            visibleRangeBox.Width = Math.Max(visibleRangeBox.Width, 1);
            g.DrawRectangle(viewMetrics.VisibleRangePen, visibleRangeBox);
        }
Exemple #17
0
        public CursorType GetNavigationPanelCursor(
            Point pt,
            IViewModel eventsHandler
            )
        {
            ViewMetrics vm = this;
            var         m  = GetNavigationPanelMetrics(eventsHandler);

            if (m.Resizer1.Contains(pt) || m.Resizer2.Contains(pt))
            {
                return(CursorType.SizeWE);
            }
            else if (m.VisibleRangeBox.Contains(pt))
            {
                return(CursorType.SizeAll);
            }
            return(CursorType.Default);
        }
 public static void DrawActivitiesBackground(
     LJD.Graphics g,
     ViewMetrics viewMetrics,
     IViewEvents eventsHandler
     )
 {
     PushGraphicsStateForDrawingActivites(g, viewMetrics, HitTestResult.AreaCode.ActivitiesPanel);
     foreach (var a in Metrics.GetActivitiesMetrics(viewMetrics, eventsHandler))
     {
         if (a.Activity.IsSelected)
         {
             g.FillRectangle(viewMetrics.SelectedLineBrush, a.ActivityLineRect);
         }
         else if (a.Activity.Color.HasValue)
         {
             using (var bgBrush = MakeBrush(a.Activity.Color.Value))
                 g.FillRectangle(bgBrush, a.ActivityLineRect);
         }
     }
     g.PopState();
 }
Exemple #19
0
        public static int GetSequenceDiagramAreaMetrics(
            LJD.Graphics g,
            ViewMetrics viewMetrics,
            IViewEvents eventsHandler
            )
        {
            float maxTextWidth = 0;

            if (eventsHandler != null)
            {
                foreach (var a in eventsHandler.OnDrawActivities())
                {
                    if (!string.IsNullOrEmpty(a.SequenceDiagramText))
                    {
                        var w = g.MeasureString(a.SequenceDiagramText, viewMetrics.ActivitesCaptionsFont).Width;
                        maxTextWidth = Math.Max(maxTextWidth, w);
                    }
                }
            }
            return(Math.Min((int)Math.Ceiling(maxTextWidth), viewMetrics.ActivitesCaptionsViewWidth / 2));
        }
Exemple #20
0
        public void DrawActivities(LJD.Graphics g, ViewMetrics viewMetrics, IViewModel eventsHandler)
        {
            PushGraphicsStateForDrawingActivites(g, viewMetrics, HitTestResult.AreaCode.ActivitiesPanel);
            var darkMode = eventsHandler.ColorTheme == Presenters.ColorThemeMode.Dark;

            foreach (var a in viewMetrics.GetActivitiesMetrics(eventsHandler))
            {
                if (a.Activity.Type == ActivityDrawType.Group)
                {
                    continue;
                }

                float round = 2;
                g.FillRoundRectangle(GetActivityBrush(a.Activity.Type), a.ActivityBarRect, round);

                foreach (var ph in a.Phases)
                {
                    var phaseMargin = a.ActivityBarRect.Height / 3;
                    g.FillRectangle(ph.Brush, ph.X1, a.ActivityBarRect.Top + phaseMargin,
                                    Math.Max(ph.X2 - ph.X1, 2), a.ActivityBarRect.Height - phaseMargin - 2);
                }

                foreach (var ms in a.Milestones)
                {
                    g.DrawLine(res.MilestonePen, ms.X, a.ActivityBarRect.Top, ms.X, a.ActivityBarRect.Bottom);
                }

                g.DrawRoundRectangle(res.ActivityBarBoundsPen, a.ActivityBarRect, round);

                if (a.PairedActivityConnectorBounds != null)
                {
                    var r = a.PairedActivityConnectorBounds.Value;
                    g.DrawLine(res.ActivitiesConnectorPen, r.Left, r.Top, r.Left, r.Bottom);
                    g.DrawLine(res.ActivitiesConnectorPen, r.Right, r.Top, r.Right, r.Bottom);
                }
            }

            g.PopState();
        }
Exemple #21
0
        public void DrawActivitiesBackground(
            LJD.Graphics g,
            ViewMetrics viewMetrics,
            IViewModel eventsHandler
            )
        {
            PushGraphicsStateForDrawingActivites(g, viewMetrics, HitTestResult.AreaCode.ActivitiesPanel);
            var darkMode = eventsHandler.ColorTheme == Presenters.ColorThemeMode.Dark;

            foreach (var a in viewMetrics.GetActivitiesMetrics(eventsHandler))
            {
                if (a.Activity.IsSelected)
                {
                    g.FillRectangle(res.SelectedActivityBackgroundBrush, a.ActivityLineRect);
                }
                else if (!darkMode && a.Activity.Color.HasValue)
                {
                    using (var bgBrush = MakeBrush(a.Activity.Color.Value))
                        g.FillRectangle(bgBrush, a.ActivityLineRect);
                }
            }
            g.PopState();
        }
Exemple #22
0
 public static CursorType GetCursor(
     Point pt,
     ViewMetrics vm,
     IViewEvents eventsHandler,
     Func <LJD.Graphics> graphicsFactory
     )
 {
     foreach (var a in Metrics.GetActivitiesMetrics(vm, eventsHandler))
     {
         bool overLink = false;
         overLink = overLink || (a.BeginTriggerLinkRect.HasValue && a.BeginTriggerLinkRect.Value.Contains(pt));
         overLink = overLink || (a.EndTriggerLinkRect.HasValue && a.EndTriggerLinkRect.Value.Contains(pt));
         overLink = overLink || a.Milestones.Any(ms => ms.Bounds.HasValue && ms.Bounds.Value.Contains(pt));
         if (overLink)
         {
             return(CursorType.Hand);
         }
     }
     using (var g = graphicsFactory())
     {
         foreach (var bmk in Metrics.GetBookmarksMetrics(g, vm, eventsHandler))
         {
             if (bmk.IsOverLink(pt))
             {
                 return(CursorType.Hand);
             }
         }
         foreach (var evt in Metrics.GetEventMetrics(g, eventsHandler, vm))
         {
             if (evt.IsOverLink(pt))
             {
                 return(CursorType.Hand);
             }
         }
     }
     return(CursorType.Default);
 }
Exemple #23
0
        public static NavigationPanelMetrics GetNavigationPanelMetrics(
            ViewMetrics viewMetrics,
            IViewEvents eventsHandler)
        {
            NavigationPanelDrawInfo drawInfo = eventsHandler.OnDrawNavigationPanel();
            double width = (double)viewMetrics.NavigationPanelWidth;
            int    x1    = (int)(width * drawInfo.VisibleRangeX1);
            int    x2    = (int)(width * drawInfo.VisibleRangeX2);

            var visibleRangeBox = new Rectangle(x1, 1, x2 - x1, viewMetrics.NavigationPanelHeight - 4);
            var resizerWidth    = Math.Min(viewMetrics.VisibleRangeResizerWidth, Math.Abs(x2 - x1));

            var resizer1 = new Rectangle(visibleRangeBox.Left + 1, visibleRangeBox.Top + 1,
                                         resizerWidth, visibleRangeBox.Height - 1);
            var resizer2 = new Rectangle(visibleRangeBox.Right - resizerWidth,
                                         visibleRangeBox.Top + 1, resizerWidth, visibleRangeBox.Height - 1);

            return(new NavigationPanelMetrics()
            {
                VisibleRangeBox = visibleRangeBox,
                Resizer1 = resizer1,
                Resizer2 = resizer2
            });
        }
 static void PushGraphicsStateForDrawingActivites(LJD.Graphics g, ViewMetrics vm, HitTestResult.AreaCode area)
 {
     g.PushState();
     g.IntsersectClip(new Rectangle(0, vm.RulersPanelHeight,
                                    area == HitTestResult.AreaCode.CaptionsPanel ? vm.ActivitesCaptionsViewWidth : vm.ActivitiesViewWidth, vm.ActivitiesViewHeight));
 }
Exemple #25
0
        public static HitTestResult HitTest(
            Point pt,
            ViewMetrics viewMetrics,
            IViewEvents eventsHandler,
            bool isCaptionsView,
            Func <LJD.Graphics> graphicsFactory
            )
        {
            HitTestResult ret = new HitTestResult();

            double viewWidth = viewMetrics.ActivitiesViewWidth;

            ret.RelativeX     = (double)pt.X / viewWidth;
            ret.ActivityIndex = GetActivityByPoint(pt, viewMetrics);

            if (isCaptionsView)
            {
                ret.Area = HitTestResult.AreaCode.CaptionsPanel;
                return(ret);
            }

            using (var g = graphicsFactory())
            {
                foreach (var bmk in GetBookmarksMetrics(g, viewMetrics, eventsHandler))
                {
                    if (bmk.IsOverLink(pt))
                    {
                        ret.Area    = HitTestResult.AreaCode.BookmarkTrigger;
                        ret.Trigger = bmk.Bookmark.Trigger;
                        return(ret);
                    }
                }
                foreach (var evt in GetEventMetrics(g, eventsHandler, viewMetrics).Reverse())
                {
                    if (evt.IsOverLink(pt))
                    {
                        ret.Area    = HitTestResult.AreaCode.EventTrigger;
                        ret.Trigger = evt.Event.Trigger;
                        return(ret);
                    }
                }
            }

            if (pt.Y < viewMetrics.RulersPanelHeight)
            {
                ret.Area = HitTestResult.AreaCode.RulersPanel;
                return(ret);
            }

            foreach (var a in GetActivitiesMetrics(viewMetrics, eventsHandler))
            {
                foreach (var ms in a.Milestones)
                {
                    if (ms.Bounds.HasValue && ms.Bounds.Value.Contains(pt))
                    {
                        ret.Area    = HitTestResult.AreaCode.ActivityTrigger;
                        ret.Trigger = ms.Trigger;
                        return(ret);
                    }
                }
                if (a.BeginTriggerLinkRect.HasValue && a.BeginTriggerLinkRect.Value.Contains(pt))
                {
                    ret.Area    = HitTestResult.AreaCode.ActivityTrigger;
                    ret.Trigger = a.Activity.BeginTrigger;
                    return(ret);
                }
                if (a.EndTriggerLinkRect.HasValue && a.EndTriggerLinkRect.Value.Contains(pt))
                {
                    ret.Area    = HitTestResult.AreaCode.ActivityTrigger;
                    ret.Trigger = a.Activity.EndTrigger;
                    return(ret);
                }
            }

            ret.Area = HitTestResult.AreaCode.ActivitiesPanel;
            return(ret);
        }
Exemple #26
0
 public static int GetActivityY(ViewMetrics viewMetrics, int index)
 {
     return(viewMetrics.RulersPanelHeight - viewMetrics.VScrollBarValue + index * viewMetrics.LineHeight);
 }
Exemple #27
0
        public static IEnumerable <BookmarkMetrics> GetBookmarksMetrics(LJD.Graphics g, ViewMetrics viewMetrics, IViewEvents eventsHandler)
        {
            double availableWidth = viewMetrics.ActivitiesViewWidth;

            foreach (var bmk in eventsHandler.OnDrawBookmarks(DrawScope.VisibleRange))
            {
                if (bmk.X < 0 || bmk.X > 1)
                {
                    continue;
                }

                BookmarkMetrics m = new BookmarkMetrics()
                {
                    Bookmark = bmk
                };

                int x          = SafeGetScreenX(bmk.X, availableWidth);
                int bmkLineTop = viewMetrics.RulersPanelHeight - 7;
                m.VertLineA = new Point(x, bmkLineTop);
                m.VertLineB = new Point(x, viewMetrics.ActivitiesViewHeight);

                m.Icon = viewMetrics.BookmarkIcon;
                var sz = m.Icon.GetSize(height: 5.1f).Scale(viewMetrics.DPIScale);
                m.IconRect = new RectangleF(
                    x - sz.Width / 2, bmkLineTop - sz.Height, sz.Width, sz.Height);

                yield return(m);
            }
        }
Exemple #28
0
        public static IEnumerable <EventMetrics> GetEventMetrics(LJD.Graphics g, IViewEvents eventsHandler, ViewMetrics viewMetrics)
        {
            double availableWidth         = viewMetrics.ActivitiesViewWidth;
            int    lastEventRight         = int.MinValue;
            int    overlappingEventsCount = 0;

            foreach (var evt in eventsHandler.OnDrawEvents(DrawScope.VisibleRange))
            {
                if (evt.X < 0 || evt.X > 1)
                {
                    continue;
                }

                EventMetrics m = new EventMetrics()
                {
                    Event = evt
                };

                int eventLineTop = viewMetrics.RulersPanelHeight - 2;
                var szF          = g.MeasureString(evt.Caption, viewMetrics.ActionCaptionFont);
                var sz           = new Size((int)szF.Width, (int)szF.Height);
                int x            = SafeGetScreenX(evt.X, availableWidth);
                var bounds       = new Rectangle(x - sz.Width / 2, eventLineTop - sz.Height, sz.Width, sz.Height);
                bounds.Inflate(2, 0);
                if (bounds.Left < lastEventRight)
                {
                    ++overlappingEventsCount;
                    bounds.Offset(lastEventRight - bounds.Left + 2, 0);
                    var mid = (bounds.Left + bounds.Right) / 2;
                    var y2  = eventLineTop + 5 * overlappingEventsCount;
                    m.VertLinePoints = new Point[]
                    {
                        new Point(mid, eventLineTop),
                        new Point(mid, y2),
                        new Point(x, y2),
                        new Point(x, viewMetrics.ActivitiesViewHeight)
                    };
                }
                else
                {
                    overlappingEventsCount = 0;
                    m.VertLineA            = new Point(x, eventLineTop);
                    m.VertLineB            = new Point(x, viewMetrics.ActivitiesViewHeight);
                }
                m.CaptionRect          = bounds;
                m.CaptionDrawingOrigin = new Point((bounds.Left + bounds.Right) / 2, eventLineTop);

                if (evt.Type == EventType.UserAction)
                {
                    m.Icon = viewMetrics.UserIcon;
                }
                else if (evt.Type == EventType.APICall)
                {
                    m.Icon = viewMetrics.APIIcon;
                }
                if (m.Icon != null)
                {
                    var imgsz = m.Icon.GetSize(height: 14f).Scale(viewMetrics.DPIScale);
                    m.IconRect = new RectangleF(
                        m.CaptionDrawingOrigin.X - imgsz.Width / 2,
                        viewMetrics.RulersPanelHeight - imgsz.Height - viewMetrics.ActionLebelHeight,
                        imgsz.Width, imgsz.Height
                        );
                }

                lastEventRight = bounds.Right;

                yield return(m);
            }
        }
Exemple #29
0
        public static IEnumerable <ActivityMetrics> GetActivitiesMetrics(ViewMetrics viewMetrics, IViewEvents eventsHandler)
        {
            double availableWidth  = viewMetrics.ActivitiesViewWidth;
            int    availableHeight = viewMetrics.ActivitiesViewHeight;

            foreach (var a in eventsHandler.OnDrawActivities())
            {
                int y = GetActivityY(viewMetrics, a.Index);
                if (y < 0 || y > availableHeight)
                {
                    continue;
                }

                var activityLineRect = new Rectangle(0, y, (int)availableWidth, viewMetrics.LineHeight);

                var x1 = SafeGetScreenX(a.X1, availableWidth);
                var x2 = SafeGetScreenX(a.X2, availableWidth);
                var activityBarRect = new Rectangle(x1, y, Math.Max(1, x2 - x1), viewMetrics.LineHeight);
                activityBarRect.Inflate(0, -viewMetrics.ActivityBarRectPaddingY);

                var ret = new ActivityMetrics()
                {
                    Activity         = a,
                    ActivityLineRect = activityLineRect,
                    ActivityBarRect  = activityBarRect
                };

                var limitedTriggerLinkWidth = Math.Min(viewMetrics.TriggerLinkWidth, ret.ActivityBarRect.Width);
                if (a.BeginTrigger != null)
                {
                    ret.BeginTriggerLinkRect = new Rectangle(activityBarRect.Location, new Size(limitedTriggerLinkWidth, activityBarRect.Height));
                }
                if (a.EndTrigger != null)
                {
                    ret.EndTriggerLinkRect = new Rectangle(activityBarRect.Right - limitedTriggerLinkWidth, activityBarRect.Top, limitedTriggerLinkWidth, activityBarRect.Height);
                }

                if (a.BeginTrigger != null && a.EndTrigger != null &&              // if both links are to be displayed
                    ret.ActivityBarRect.Width < viewMetrics.TriggerLinkWidth * 2)                        // but no room available for both
                {
                    // show only link for 'begin' trigger
                    ret.EndTriggerLinkRect = null;
                }

                bool milestonesWillFit = ret.ActivityBarRect.Width > viewMetrics.TriggerLinkWidth * a.MilestonesCount;
                ret.Milestones = a.Milestones.Select(ms =>
                {
                    var msX          = SafeGetScreenX(ms.X, availableWidth);
                    Rectangle?bounds = null;
                    if (ms.Trigger != null && milestonesWillFit)
                    {
                        var boundsX1 = Math.Max(msX - viewMetrics.TriggerLinkWidth / 2, activityBarRect.Left);
                        var boundsX2 = Math.Min(msX + viewMetrics.TriggerLinkWidth / 2, activityBarRect.Right);
                        bounds       = new Rectangle(
                            boundsX1,
                            activityBarRect.Y,
                            boundsX2 - boundsX1,
                            activityBarRect.Height
                            );
                    }
                    return(new ActivityMilestoneMetrics()
                    {
                        X = msX, Bounds = bounds, Trigger = ms.Trigger
                    });
                });

                if (a.PairedActivityIndex != null)
                {
                    int pairedY = GetActivityY(viewMetrics, a.PairedActivityIndex.Value);
                    if (y < pairedY)
                    {
                        ret.PairedActivityConnectorBounds = new Rectangle(
                            activityBarRect.X, activityBarRect.Bottom,
                            activityBarRect.Width, pairedY - activityBarRect.Bottom + viewMetrics.ActivityBarRectPaddingY
                            );
                    }
                    else
                    {
                        int y2 = pairedY + viewMetrics.LineHeight - viewMetrics.ActivityBarRectPaddingY;
                        ret.PairedActivityConnectorBounds = new Rectangle(
                            activityBarRect.X, y2,
                            activityBarRect.Width, activityBarRect.Y - y2
                            );
                    }
                }

                yield return(ret);
            }
        }
 double GetVertScrollerValueRange(ViewMetrics viewMetrics)
 {
     return(Math.Max(0, model.ActivitiesCount * viewMetrics.LineHeight - (viewMetrics.ActivitiesViewHeight - viewMetrics.RulersPanelHeight)));
 }