void UpdateCaretPropertiesCore(bool forceInvalidateVisual) { if (layer.HexView.IsClosed) { return; } StopTimer(); var line = hexCaret.ContainingHexViewLine; oldSelectionState = new SelectionState(layer.HexView.Selection); bool oldDrawCaretShape = drawCaretShape; drawCaretShape = line.VisibilityState != VSTF.VisibilityState.Unattached; bool drawOverwriteMode = OverwriteMode; var valuesCaretRect = GetCaretRect(line, drawOverwriteMode, HexColumnType.Values, line.BufferLine.ValueCells.GetCell(hexCaret.CurrentPosition.ValuePosition.BufferPosition), hexCaret.CurrentPosition.ValuePosition.CellPosition); var asciiCaretRect = GetCaretRect(line, drawOverwriteMode, HexColumnType.Ascii, line.BufferLine.AsciiCells.GetCell(hexCaret.CurrentPosition.AsciiPosition.BufferPosition), hexCaret.CurrentPosition.AsciiPosition.CellPosition); if (drawCaretShape) { if (!imeStarted && layer.HexView.VisualElement.IsKeyboardFocused && layer.HexView.VisualElement.IsVisible) { StartTimer(); } } else { layer.Opacity = 0; } var invalidateVisual = valuesCaretGeometry.SetProperties(valuesCaretRect, drawCaretShape, drawOverwriteMode); invalidateVisual |= asciiCaretGeometry.SetProperties(asciiCaretRect, drawCaretShape, drawOverwriteMode); invalidateVisual |= forceInvalidateVisual || oldDrawCaretShape != drawCaretShape; if (invalidateVisual) { InvalidateVisual(); } }
void UpdateCaretPropertiesCore(bool forceInvalidateVisual) { if (layer.TextView.IsClosed) { return; } StopTimer(); var line = textCaret.ContainingTextViewLine; oldSelectionState = new SelectionState(layer.TextView.Selection); bool oldDrawCaretShape = drawCaretShape; drawCaretShape = line.VisibilityState != VisibilityState.Unattached; bool drawOverwriteMode = OverwriteMode && textCaret.CurrentPosition.Position < line.End && layer.TextView.Selection.IsEmpty; var vpos = textCaret.CurrentPosition; if (drawOverwriteMode) { var textBounds = line.GetExtendedCharacterBounds(vpos); left = textBounds.Left; width = textBounds.Width; } else { if (vpos.Position != line.Start && !vpos.IsInVirtualSpace) { left = line.GetExtendedCharacterBounds(vpos.Position - 1).Trailing; } else { left = line.GetExtendedCharacterBounds(vpos).Leading; } width = SystemParameters.CaretWidth; } height = line.TextHeight; if (drawCaretShape) { if (!imeStarted && layer.TextView.VisualElement.IsKeyboardFocused && layer.TextView.VisualElement.IsVisible) { StartTimer(); } top = line.TextTop; Canvas.SetLeft(this, left); Canvas.SetTop(this, top); } else { layer.Opacity = 0; top = double.NaN; } var invalidateVisual = caretGeometry.SetProperties(width, height, drawOverwriteMode); invalidateVisual |= forceInvalidateVisual || oldDrawCaretShape != drawCaretShape; if (invalidateVisual) { InvalidateVisual(); } }