public static void DrawFocusedMessageMark(DrawContext drawContext, IPresentationDataAccess presentationDataAccess, VisibleMessagesIndexes messagesToDraw) { var dc = drawContext; Image focusedMessageMark = null; SizeF focusedMessageSz = new SizeF(); float markYPos = 0; if (presentationDataAccess.FocusedMessageDisplayMode == FocusedMessageDisplayModes.Master) { var sel = presentationDataAccess.Selection; if (sel.First.Message != null) { focusedMessageMark = dc.FocusedMessageIcon; focusedMessageSz = focusedMessageMark.GetSize(height: 14); markYPos = dc.GetTextOffset(0, sel.First.DisplayIndex).Y + (dc.LineHeight - focusedMessageSz.Height) / 2; } } else { if (presentationDataAccess.ViewLinesCount != 0) { var slaveModeFocusInfo = presentationDataAccess.FindSlaveModeFocusedMessagePosition( Math.Max(messagesToDraw.begin - 4, 0), Math.Min(messagesToDraw.end + 4, presentationDataAccess.ViewLinesCount)); if (slaveModeFocusInfo != null) { focusedMessageMark = dc.FocusedMessageIcon; focusedMessageSz = focusedMessageMark.GetSize(height: 9); float yOffset = slaveModeFocusInfo.Item1 != slaveModeFocusInfo.Item2 ? (dc.LineHeight - focusedMessageSz.Height) / 2 : -focusedMessageSz.Height / 2; markYPos = dc.GetTextOffset(0, slaveModeFocusInfo.Item1).Y + yOffset; } } } if (focusedMessageMark != null) { var canvas = drawContext.Canvas; canvas.PushState(); canvas.TranslateTransform( drawContext.CollapseBoxesAreaSize - focusedMessageSz.Width / 2 + 1, markYPos + focusedMessageSz.Height / 2); if (dc.SlaveMessagePositionAnimationStep > 0) { focusedMessageSz = focusedMessageMark.GetSize(height: 10); var factors = new float[] { .81f, 1f, 0.9f, .72f, .54f, .36f, .18f, .09f }; float factor = 1f + 1.4f * factors[dc.SlaveMessagePositionAnimationStep - 1]; canvas.ScaleTransform(factor, factor); } dc.Canvas.DrawImage( focusedMessageMark, new RectangleF( -focusedMessageSz.Width / 2, -focusedMessageSz.Height / 2, focusedMessageSz.Width, focusedMessageSz.Height )); canvas.PopState(); } }
public HighlightingManager( ISearchResultModel searchResultModel, IPresentationDataAccess presentationDataAccess, IFiltersList highlightFilters ) { this.searchResultModel = searchResultModel; this.presentationDataAccess = presentationDataAccess; this.highlightFilters = highlightFilters; }
public static void MouseMoveHelper( IPresentationDataAccess presentationDataAccess, DrawContext drawContext, Rectangle clientRectangle, IViewEvents viewEvents, Point pt, bool isLeftDrag, out CursorType newCursor ) { newCursor = CursorType.Arrow; if (presentationDataAccess != null) { foreach (var i in DrawingUtils.GetVisibleMessagesIterator(drawContext, presentationDataAccess, clientRectangle)) { DrawingUtils.Metrics mtx = DrawingUtils.GetMetrics(i, drawContext); if (pt.Y >= mtx.MessageRect.Top && pt.Y < mtx.MessageRect.Bottom) { if (isLeftDrag) { var hitTester = new HitTestingVisitor(drawContext, mtx, pt.X, i.TextLineIndex); i.Message.Visit(hitTester); MessageMouseEventFlag flags = MessageMouseEventFlag.ShiftIsHeld | MessageMouseEventFlag.CapturedMouseMove; if (pt.X < drawContext.CollapseBoxesAreaSize) { flags |= MessageMouseEventFlag.OulineBoxesArea; } viewEvents.OnMessageMouseEvent(i, hitTester.LineTextPosition, flags, pt); } if (i.Message.IsStartFrame() && mtx.OulineBox.Contains(pt)) { newCursor = CursorType.Arrow; } else if (pt.X < drawContext.CollapseBoxesAreaSize) { newCursor = CursorType.RightToLeftArrow; } else if (pt.X >= drawContext.GetTextOffset(0, 0).X) { newCursor = CursorType.IBeam; } else { newCursor = CursorType.Arrow; } } } } }
public static void MouseDownHelper( IPresentationDataAccess presentationDataAccess, DrawContext drawContext, Rectangle clientRectangle, IViewEvents viewEvents, Point pt, MessageMouseEventFlag flags, out bool captureTheMouse ) { captureTheMouse = true; if (presentationDataAccess != null) { foreach (var i in DrawingUtils.GetVisibleMessagesIterator(drawContext, presentationDataAccess, clientRectangle)) { DrawingUtils.Metrics mtx = DrawingUtils.GetMetrics(i, drawContext); // if user clicked line's outline box (collapse/expand cross) if (i.Message.IsStartFrame() && mtx.OulineBox.Contains(pt.X, pt.Y) && i.TextLineIndex == 0) //if (viewEvents.OnOulineBoxClicked(i.Message, (flags & MessageMouseEventFlag.CtrlIsHeld) != 0)) { captureTheMouse = false; break; } // if user clicked line area if (mtx.MessageRect.Contains(pt.X, pt.Y)) { var hitTester = new HitTestingVisitor(drawContext, mtx, pt.X, i.TextLineIndex); i.Message.Visit(hitTester); if ((flags & MessageMouseEventFlag.DblClick) != 0) { captureTheMouse = false; } if (pt.X < drawContext.CollapseBoxesAreaSize) { flags |= MessageMouseEventFlag.OulineBoxesArea; } viewEvents.OnMessageMouseEvent(i, hitTester.LineTextPosition, flags, pt); break; } } } }
public static void PaintControl(DrawContext drawContext, IPresentationDataAccess presentationDataAccess, SelectionInfo selection, bool controlIsFocused, Rectangle dirtyRect, out int maxRight) { var drawingVisitor = new DrawingVisitor(); drawingVisitor.ctx = drawContext; drawingVisitor.SearchResultHighlightingHandler = presentationDataAccess.CreateSearchResultHighlightingHandler(); drawingVisitor.SelectionHighlightingHandler = presentationDataAccess.CreateSelectionHighlightingHandler(); drawingVisitor.HighlightingFiltersHandler = presentationDataAccess.CreateHighlightingFiltersHandler(); maxRight = 0; var sel = selection; bool needToDrawCursor = drawContext.CursorState == true && controlIsFocused && sel.First.Message != null; var messagesToDraw = DrawingUtils.GetVisibleMessages(drawContext, presentationDataAccess, dirtyRect); var displayLinesEnum = presentationDataAccess.GetViewLines(messagesToDraw.begin, messagesToDraw.end); foreach (var il in displayLinesEnum) { drawingVisitor.DisplayIndex = il.LineIndex; drawingVisitor.TextLineIdx = il.TextLineIndex; drawingVisitor.IsBookmarked = il.IsBookmarked; DrawingUtils.Metrics m = DrawingUtils.GetMetrics(il, drawContext); drawingVisitor.m = m; if (needToDrawCursor && sel.First.DisplayIndex == il.LineIndex) { drawingVisitor.CursorPosition = sel.First; } else { drawingVisitor.CursorPosition = null; } il.Message.Visit(drawingVisitor); maxRight = Math.Max(maxRight, m.OffsetTextRect.Right); } DrawFocusedMessageMark(drawContext, presentationDataAccess, messagesToDraw); drawingVisitor.SearchResultHighlightingHandler?.Dispose(); drawingVisitor.SelectionHighlightingHandler?.Dispose(); drawingVisitor.HighlightingFiltersHandler?.Dispose(); }
public SelectionManager( IView view, IScreenBuffer screenBuffer, LJTraceSource tracer, IPresentationDataAccess presentationDataAccess, IClipboardAccess clipboard, IScreenBufferFactory screenBufferFactory, IBookmarksFactory bookmarksFactory ) { this.view = view; this.screenBuffer = screenBuffer; this.clipboard = clipboard; this.presentationDataAccess = presentationDataAccess; this.tracer = tracer; this.screenBufferFactory = screenBufferFactory; this.bookmarksFactory = bookmarksFactory; }
public SelectionManager( IView view, ISearchResultModel searchResultModel, // todo: try get rid of this dependency IScreenBuffer screenBuffer, LJTraceSource tracer, IPresentationDataAccess presentationDataAccess, IClipboardAccess clipboard, IScreenBufferFactory screenBufferFactory, IBookmarksFactory bookmarksFactory ) { this.view = view; this.searchResultModel = searchResultModel; this.screenBuffer = screenBuffer; this.clipboard = clipboard; this.presentationDataAccess = presentationDataAccess; this.tracer = tracer; this.searchResultModel = searchResultModel; this.screenBufferFactory = screenBufferFactory; this.bookmarksFactory = bookmarksFactory; this.searchResultInplaceHightlightHandler = SearchResultInplaceHightlightHandler; }
void IView.SetPresentationDataAccess(IPresentationDataAccess presentationDataAccess) { this.presentationDataAccess = presentationDataAccess; this.drawContext.Presenter = presentationDataAccess; }
void IView.SetPresenter(IViewEvents viewEvents) { this.viewEvents = viewEvents; this.presentationDataAccess = (IPresentationDataAccess)viewEvents; }
public static VisibleMessagesIndexes GetVisibleMessages(DrawContext drawContext, IPresentationDataAccess presentationDataAccess, Rectangle viewRect) { VisibleMessagesIndexes rv; viewRect.Offset(0, drawContext.ScrollPos.Y); rv.begin = viewRect.Y / drawContext.LineHeight; rv.fullyVisibleBegin = rv.begin; if ((viewRect.Y % drawContext.LineHeight) != 0) { ++rv.fullyVisibleBegin; } rv.end = viewRect.Bottom / drawContext.LineHeight; rv.fullyVisibleEnd = rv.end; --rv.fullyVisibleEnd; if ((viewRect.Bottom % drawContext.LineHeight) != 0) { ++rv.end; } int availableLines = presentationDataAccess.ViewLinesCount; rv.begin = Math.Min(availableLines, rv.begin); rv.end = Math.Min(availableLines, rv.end); rv.fullyVisibleEnd = Math.Min(availableLines, rv.fullyVisibleEnd); return(rv); }
public static IEnumerable <ViewLine> GetVisibleMessagesIterator(DrawContext drawContext, IPresentationDataAccess presentationDataAccess, Rectangle viewRect) { var vl = DrawingUtils.GetVisibleMessages(drawContext, presentationDataAccess, viewRect); return(presentationDataAccess.GetViewLines(vl.begin, vl.end)); }