public IEnumerable <GuidObject> GetContextMenuObjects(Point marginRelativePoint)
        {
            var line = GetLine(marginRelativePoint);

            if (line is null)
            {
                yield break;
            }

            var markers = glyphTextViewMarkerService.GetSortedGlyphTextMarkers(line);

            if (markers.Length > 0)
            {
                var glyphTextMarkerHandlerContext = new GlyphTextMarkerHandlerContext(wpfTextViewHost, margin, line, this);
                foreach (var marker in markers)
                {
                    foreach (var o in marker.Handler.GetContextMenuObjects(glyphTextMarkerHandlerContext, marker, marginRelativePoint))
                    {
                        yield return(o);
                    }
                }
            }

            if (glyphTextMarkerMouseProcessors.Length != 0)
            {
                var context = new GlyphTextMarkerMouseProcessorContext(wpfTextViewHost, margin, line, markers, this);
                foreach (var processor in glyphTextMarkerMouseProcessors)
                {
                    foreach (var o in processor.GetContextMenuObjects(context, marginRelativePoint))
                    {
                        yield return(o);
                    }
                }
            }
        }
        public override void PostprocessMouseMove(MouseEventArgs e)
        {
            UpdateLine(e);
            var line = GetLine(e);

            if (line is null)
            {
                return;
            }

            var markers = glyphTextViewMarkerService.GetSortedGlyphTextMarkers(line);

            IGlyphTextMarkerHandlerContext?glyphTextMarkerHandlerContext = null;

            foreach (var marker in markers)
            {
                if (marker.Handler.MouseProcessor is null)
                {
                    continue;
                }
                if (glyphTextMarkerHandlerContext is null)
                {
                    glyphTextMarkerHandlerContext = new GlyphTextMarkerHandlerContext(wpfTextViewHost, margin, line, this);
                }
                marker.Handler.MouseProcessor.OnMouseMove(glyphTextMarkerHandlerContext, marker, e);
                if (e.Handled)
                {
                    return;
                }
            }

            if (glyphTextMarkerMouseProcessors.Length != 0)
            {
                var context = new GlyphTextMarkerMouseProcessorContext(wpfTextViewHost, margin, line, markers, this);
                foreach (var processor in glyphTextMarkerMouseProcessors)
                {
                    processor.OnMouseMove(context, e);
                    if (e.Handled)
                    {
                        return;
                    }
                }
            }
        }
        public override void PostprocessMouseRightButtonUp(MouseButtonEventArgs e)
        {
            CloseToolTip();
            var line = GetLine(e);

            if (line == null)
            {
                return;
            }

            var markers = glyphTextViewMarkerService.GetSortedGlyphTextMarkers(line);

            IGlyphTextMarkerHandlerContext glyphTextMarkerHandlerContext = null;

            foreach (var marker in markers)
            {
                if (marker.Handler.MouseProcessor == null)
                {
                    continue;
                }
                if (glyphTextMarkerHandlerContext == null)
                {
                    glyphTextMarkerHandlerContext = new GlyphTextMarkerHandlerContext(wpfTextViewHost, margin, line);
                }
                marker.Handler.MouseProcessor.OnMouseRightButtonUp(glyphTextMarkerHandlerContext, marker, e);
                if (e.Handled)
                {
                    return;
                }
            }

            if (glyphTextMarkerMouseProcessors.Length != 0)
            {
                var context = new GlyphTextMarkerMouseProcessorContext(wpfTextViewHost, margin, line, markers);
                foreach (var processor in glyphTextMarkerMouseProcessors)
                {
                    processor.OnMouseRightButtonUp(context, e);
                    if (e.Handled)
                    {
                        return;
                    }
                }
            }
        }
        public override void PostprocessMouseEnter(MouseEventArgs e)
        {
            if (glyphTextMarkerMouseProcessors.Length != 0)
            {
                var line = GetLine(e);
                if (line is null)
                {
                    return;
                }

                var markers = glyphTextViewMarkerService.GetSortedGlyphTextMarkers(line);
                var context = new GlyphTextMarkerMouseProcessorContext(wpfTextViewHost, margin, line, markers, this);
                foreach (var processor in glyphTextMarkerMouseProcessors)
                {
                    processor.OnMouseEnter(context, e);
                    if (e.Handled)
                    {
                        return;
                    }
                }
            }
        }
		public override void PostprocessMouseLeave(MouseEventArgs e) {
			CloseToolTip();
			if (glyphTextMarkerMouseProcessors.Length != 0) {
				var line = GetLine(e);
				if (line == null)
					return;

				var markers = glyphTextViewMarkerService.GetSortedGlyphTextMarkers(line);
				var context = new GlyphTextMarkerMouseProcessorContext(wpfTextViewHost, margin, line, markers);
				foreach (var processor in glyphTextMarkerMouseProcessors) {
					processor.OnMouseLeave(context, e);
					if (e.Handled)
						return;
				}
			}
		}
		public override void PostprocessMouseMove(MouseEventArgs e) {
			UpdateLine(e);
			var line = GetLine(e);
			if (line == null)
				return;

			var markers = glyphTextViewMarkerService.GetSortedGlyphTextMarkers(line);

			IGlyphTextMarkerHandlerContext glyphTextMarkerHandlerContext = null;
			foreach (var marker in markers) {
				if (marker.Handler.MouseProcessor == null)
					continue;
				if (glyphTextMarkerHandlerContext == null)
					glyphTextMarkerHandlerContext = new GlyphTextMarkerHandlerContext(wpfTextViewHost, margin, line);
				marker.Handler.MouseProcessor.OnMouseMove(glyphTextMarkerHandlerContext, marker, e);
				if (e.Handled)
					return;
			}

			if (glyphTextMarkerMouseProcessors.Length != 0) {
				var context = new GlyphTextMarkerMouseProcessorContext(wpfTextViewHost, margin, line, markers);
				foreach (var processor in glyphTextMarkerMouseProcessors) {
					processor.OnMouseMove(context, e);
					if (e.Handled)
						return;
				}
			}
		}
		public IEnumerable<GuidObject> GetContextMenuObjects(Point marginRelativePoint) {
			var line = GetLine(marginRelativePoint);
			if (line == null)
				yield break;

			var markers = glyphTextViewMarkerService.GetSortedGlyphTextMarkers(line);

			if (markers.Length > 0) {
				var glyphTextMarkerHandlerContext = new GlyphTextMarkerHandlerContext(wpfTextViewHost, margin, line);
				foreach (var marker in markers) {
					foreach (var o in marker.Handler.GetContextMenuObjects(glyphTextMarkerHandlerContext, marker, marginRelativePoint))
						yield return o;
				}
			}

			if (glyphTextMarkerMouseProcessors.Length != 0) {
				var context = new GlyphTextMarkerMouseProcessorContext(wpfTextViewHost, margin, line, markers);
				foreach (var processor in glyphTextMarkerMouseProcessors) {
					foreach (var o in processor.GetContextMenuObjects(context, marginRelativePoint))
						yield return o;
				}
			}
		}