/// <summary> /// Returns a TextSegment that spans the line on which position is located. /// </summary> /// <param name="position"> /// Any oriented text position on the line. /// </param> /// <returns> /// TextSegment that spans the line on which position is located. /// </returns> /// <exception cref="System.InvalidOperationException"> /// Throws InvalidOperationException if IsValid is false. /// If IsValid returns false, Validate method must be called before /// calling this method. /// </exception> internal override TextSegment GetLineRange(ITextPointer position) { #if DEBUG DocumentsTrace.FixedTextOM.TextView.Trace(string.Format("GetLineRange {0}, {1}", (FixedTextPointer)position, position.LogicalDirection)); #endif FixedTextPointer ftp = Container.VerifyPosition(position); FixedPosition fixedp; if (!_GetFixedPosition(ftp, out fixedp)) { return(new TextSegment(position, position, true)); } int count = 0; FixedNode[] fixedNodes = Container.FixedTextBuilder.GetNextLine(fixedp.Node, true, ref count); if (fixedNodes == null) { // This will happen in the case of images fixedNodes = new FixedNode[] { fixedp.Node }; } FixedNode lastNode = fixedNodes[fixedNodes.Length - 1]; DependencyObject element = FixedPage.GetElement(lastNode); int lastIndex = 1; if (element is Glyphs) { lastIndex = ((Glyphs)element).UnicodeString.Length; } ITextPointer begin = _CreateTextPointer(new FixedPosition(fixedNodes[0], 0), LogicalDirection.Forward); ITextPointer end = _CreateTextPointer(new FixedPosition(lastNode, lastIndex), LogicalDirection.Backward); if (begin.CompareTo(end) > 0) { ITextPointer temp = begin; begin = end; end = temp; } return(new TextSegment(begin, end, true)); }
internal void RenderFlowNode(DrawingContext dc) { FormattedText ft; FixedNode fixedNode; FixedSOMElement[] somElements; String ouptputString; FixedElement fixedElement; Random random = new Random(); CultureInfo EnglishCulture = System.Windows.Markup.TypeConverterHelper.InvariantEnglishUS; FixedPage fp = _fixedTextBuilder.FixedTextContainer.FixedDocument.GetFixedPage(PageIndex); // //Iterate through flow node to draw Transparent Rect and draw its index // Point prevTextPoint = new Point(0, 0); DpiScale dpi = fp.GetDpi(); for (int i = FlowStart.Fp; i <= FlowEnd.Fp; i++) { FlowNode fn = _fixedTextBuilder.FixedFlowMap[i]; switch (fn.Type) { case FlowNodeType.Boundary: case FlowNodeType.Virtual: // this two cases won't happen. Debug.Assert(false); break; case FlowNodeType.Start: case FlowNodeType.End: { fixedElement = fn.Cookie as FixedElement; String typeString = fixedElement.Type.ToString(); int indexofDot = typeString.LastIndexOf('.'); ouptputString = String.Format("{0}-{1}", fn.ToString(), typeString.Substring(indexofDot + 1)); ft = new FormattedText(ouptputString, EnglishCulture, FlowDirection.LeftToRight, new Typeface("Courier New"), 8, Brushes.DarkGreen, dpi.PixelsPerDip); // Ideally, for FlowNodeType.Start, this should find next FlowNode with physical location, // and draw it around the physical location. prevTextPoint = CreateFromLastTextPoint(prevTextPoint); dc.DrawText(ft, prevTextPoint); break; } case FlowNodeType.Noop: ft = new FormattedText(fn.ToString(), EnglishCulture, FlowDirection.LeftToRight, new Typeface("Courier New"), 8, Brushes.DarkGreen, dpi.PixelsPerDip); prevTextPoint = CreateFromLastTextPoint(prevTextPoint); dc.DrawText(ft, prevTextPoint); break; case FlowNodeType.Run: // // Paint the region. The rect is the union of child glyphs. // Glyphs glyphs; Rect flowRunBox = Rect.Empty; Rect glyphBox; somElements = _fixedTextBuilder.FixedFlowMap.FlowNodes[fn.Fp].FixedSOMElements; foreach (FixedSOMElement currentSomeElement in somElements) { FixedNode currentFixedNode = currentSomeElement.FixedNode; int startIndex = currentSomeElement.StartIndex; int endIndex = currentSomeElement.EndIndex; // same as (_IsBoundaryFixedNode(currentFixedNode)) if (currentFixedNode.Page == FixedFlowMap.FixedOrderStartPage || currentFixedNode.Page == FixedFlowMap.FixedOrderEndPage || currentFixedNode[1] == FixedFlowMap.FixedOrderStartVisual || currentFixedNode[1] == FixedFlowMap.FixedOrderEndVisual) { continue; } glyphs = fp.GetGlyphsElement(currentFixedNode); Debug.Assert(glyphs != null); glyphBox = FixedTextView._GetGlyphRunDesignRect(glyphs, startIndex, endIndex); if (!glyphBox.IsEmpty) { GeneralTransform g = glyphs.TransformToAncestor(fp); glyphBox = g.TransformBounds(glyphBox); } flowRunBox.Union(glyphBox); } if (flowRunBox.IsEmpty) { Debug.Assert(false); } prevTextPoint.X = flowRunBox.Right; prevTextPoint.Y = flowRunBox.Bottom - random.Next(15); // Draw something the upper left corner of region. ft = new FormattedText(fn.ToString() + "-" + Convert.ToString((int)(fn.Cookie)) + "-" + Convert.ToString(somElements.Length), EnglishCulture, FlowDirection.LeftToRight, new Typeface("Courier New"), 8, Brushes.DarkBlue, dpi.PixelsPerDip); dc.DrawText(ft, prevTextPoint); Pen pen = new Pen(Brushes.Blue, 2); flowRunBox.Inflate(random.Next(3), random.Next(3)); DrawRectOutline(dc, pen, flowRunBox); break; case FlowNodeType.Object: // // Find the mapping fixed node // somElements = _fixedTextBuilder.FixedFlowMap.FlowNodes[fn.Fp].FixedSOMElements; foreach (FixedSOMElement currentSomeElement in somElements) { fixedNode = currentSomeElement.FixedNode; DependencyObject dependencyObject = fp.GetElement(fixedNode); Image image = dependencyObject as Image; Path path = dependencyObject as Path; if (image != null || path != null) { Rect imageRect, boundingRect = Rect.Empty; // // Get Image bounding box. // GeneralTransform transform = ((Visual)dependencyObject).TransformToAncestor(fp); // You can't use GetContentBounds inside OnRender if (image != null) { boundingRect = new Rect(0, 0, image.Width, image.Height); } else { boundingRect = path.Data.Bounds; } if (!boundingRect.IsEmpty) { imageRect = transform.TransformBounds(boundingRect); // Image might overlap, inflate the box. imageRect.Inflate(3, 3); dc.DrawRectangle(Brushes.CadetBlue, null, imageRect); prevTextPoint.X = imageRect.Right; prevTextPoint.Y = imageRect.Top; } } else { // // If the object is the Image type(that is not likey). // Use the last Point to infer a comment area! // Debug.Assert(false); } fixedElement = fn.Cookie as FixedElement; ft = new FormattedText(fn.ToString(), EnglishCulture, FlowDirection.LeftToRight, new Typeface("Courier New"), 8, Brushes.DarkGreen, dpi.PixelsPerDip); dc.DrawText(ft, prevTextPoint); } break; default: Debug.Assert(false); break; } } }
// Token: 0x06002EA1 RID: 11937 RVA: 0x000D2BCC File Offset: 0x000D0DCC internal void GetMultiHighlights(FixedTextPointer start, FixedTextPointer end, Dictionary <FixedPage, ArrayList> highlights, FixedHighlightType t, Brush foregroundBrush, Brush backgroundBrush) { if (start.CompareTo(end) > 0) { FixedTextPointer fixedTextPointer = start; start = end; end = fixedTextPointer; } int num = 0; int num2 = 0; FixedSOMElement[] array; if (this._GetFixedNodesForFlowRange(start, end, out array, out num, out num2)) { for (int i = 0; i < array.Length; i++) { FixedSOMElement fixedSOMElement = array[i]; FixedNode fixedNode = fixedSOMElement.FixedNode; FixedPage fixedPage = this.FixedDocument.SyncGetPageWithCheck(fixedNode.Page); if (fixedPage != null) { DependencyObject element = fixedPage.GetElement(fixedNode); if (element != null) { int num3 = 0; UIElement element2; int num4; if (element is Image || element is Path) { element2 = (UIElement)element; num4 = 1; } else { Glyphs glyphs = element as Glyphs; if (glyphs == null) { goto IL_144; } element2 = (UIElement)element; num3 = fixedSOMElement.StartIndex; num4 = fixedSOMElement.EndIndex; } if (i == 0) { num3 = num; } if (i == array.Length - 1) { num4 = num2; } ArrayList arrayList; if (highlights.ContainsKey(fixedPage)) { arrayList = highlights[fixedPage]; } else { arrayList = new ArrayList(); highlights.Add(fixedPage, arrayList); } FixedSOMTextRun fixedSOMTextRun = fixedSOMElement as FixedSOMTextRun; if (fixedSOMTextRun != null && fixedSOMTextRun.IsReversed) { int num5 = num3; num3 = fixedSOMElement.EndIndex - num4; num4 = fixedSOMElement.EndIndex - num5; } FixedHighlight value = new FixedHighlight(element2, num3, num4, t, foregroundBrush, backgroundBrush); arrayList.Add(value); } } IL_144 :; } } }
internal void RenderFixedNode(DrawingContext dc) { // //Iterate through fix node to draw red dotted line // CultureInfo EnglishCulture = System.Windows.Markup.TypeConverterHelper.InvariantEnglishUS; int lineCount = _lineResults.Length; if (lineCount == 0) { return; } FixedNode fixedStartPage = _lineResults[0].Start; FixedNode fixedEndPage = _lineResults[lineCount - 1].End; FixedNode[] fixedNodes = _fixedTextBuilder.FixedFlowMap.FixedOrderGetRangeNodes(fixedStartPage, fixedEndPage); FixedPage fp = _fixedTextBuilder.FixedTextContainer.FixedDocument.GetFixedPage(PageIndex); FormattedText ft; Point prevTextPoint = new Point(0, 0); DpiScale dpi = fp.GetDpi(); foreach (FixedNode currentFixedNode in fixedNodes) { if (currentFixedNode.Page == FixedFlowMap.FixedOrderStartPage) { prevTextPoint.X = prevTextPoint.Y = 0; ft = new FormattedText("FixedOrderStartPage", EnglishCulture, FlowDirection.LeftToRight, new Typeface("Courier New"), 8, Brushes.DarkViolet, dpi.PixelsPerDip); dc.DrawText(ft, prevTextPoint); continue; } if (currentFixedNode.Page == FixedFlowMap.FixedOrderEndPage) { prevTextPoint.X = fp.Width - 100; prevTextPoint.Y = fp.Height - 10; ft = new FormattedText("FixedOrderEndPage", EnglishCulture, FlowDirection.LeftToRight, new Typeface("Courier New"), 8, Brushes.DarkViolet, dpi.PixelsPerDip); dc.DrawText(ft, prevTextPoint); continue; } if (currentFixedNode[1] == FixedFlowMap.FixedOrderStartVisual || currentFixedNode[1] == FixedFlowMap.FixedOrderEndVisual) { prevTextPoint.X = 2; prevTextPoint.Y = prevTextPoint.Y + 10; String outputString = currentFixedNode[1] == FixedFlowMap.FixedOrderStartVisual ? "FixedOrderStartVisual" : "FixedOrderEndVisual"; ft = new FormattedText(outputString, EnglishCulture, FlowDirection.LeftToRight, new Typeface("Courier New"), 8, Brushes.DarkViolet, dpi.PixelsPerDip); dc.DrawText(ft, prevTextPoint); continue; } DependencyObject dependencyObject = fp.GetElement(currentFixedNode); Image image = dependencyObject as Image; if (image != null) { GeneralTransform transform = image.TransformToAncestor(fp); // You can't use GetContentBounds inside OnRender Rect boundingRect = new Rect(0, 0, image.Width, image.Height); Rect imageRect = transform.TransformBounds(boundingRect); if (!imageRect.IsEmpty) { // Image might overlap, inflate the box. imageRect.Inflate(1, 1); Pen pen = new Pen(Brushes.DarkMagenta, 1.5); DrawRectOutline(dc, pen, imageRect); prevTextPoint.X = imageRect.Right; prevTextPoint.Y = imageRect.Bottom - 10; } else { prevTextPoint.X = 2; prevTextPoint.Y = prevTextPoint.Y + 10; } ft = new FormattedText(currentFixedNode.ToString(), EnglishCulture, FlowDirection.LeftToRight, new Typeface("Courier New"), 8, Brushes.DarkViolet, dpi.PixelsPerDip); dc.DrawText(ft, prevTextPoint); continue; } Path path = dependencyObject as Path; if (path != null) { GeneralTransform transform = path.TransformToAncestor(fp); // You can't use GetContentBounds inside OnRender Rect boundingRect = path.Data.Bounds; Rect imageRect = transform.TransformBounds(boundingRect); if (!imageRect.IsEmpty) { // Image might overlap, inflate the box. imageRect.Inflate(1, 1); Pen pen = new Pen(Brushes.DarkMagenta, 1.5); DrawRectOutline(dc, pen, imageRect); prevTextPoint.X = imageRect.Right; prevTextPoint.Y = imageRect.Bottom - 10; } else { prevTextPoint.X = 2; prevTextPoint.Y = prevTextPoint.Y + 10; } ft = new FormattedText(currentFixedNode.ToString(), EnglishCulture, FlowDirection.LeftToRight, new Typeface("Courier New"), 8, Brushes.DarkViolet, dpi.PixelsPerDip); dc.DrawText(ft, prevTextPoint); continue; } Glyphs glyphs = dependencyObject as Glyphs; if (glyphs != null) { GlyphRun run = glyphs.ToGlyphRun(); if (run != null) { Rect glyphBox = run.ComputeAlignmentBox(); glyphBox.Offset(glyphs.OriginX, glyphs.OriginY); GeneralTransform transform = glyphs.TransformToAncestor(fp); // // Draw it using the dotted red line // Pen pen = new Pen(Brushes.Red, 0.5); Transform t = transform.AffineTransform; if (t != null) { dc.PushTransform(t); } else { dc.PushTransform(Transform.Identity); } DrawRectOutline(dc, pen, glyphBox); prevTextPoint.X = glyphBox.Right; prevTextPoint.Y = glyphBox.Bottom; transform.TryTransform(prevTextPoint, out prevTextPoint); dc.Pop(); // transform } else { prevTextPoint.X = 2; prevTextPoint.Y = prevTextPoint.Y + 10; } ft = new FormattedText(currentFixedNode.ToString(), EnglishCulture, FlowDirection.LeftToRight, new Typeface("Courier New"), 8, Brushes.DarkViolet, dpi.PixelsPerDip); dc.DrawText(ft, prevTextPoint); continue; } // // For anything else, there is this code to draw ... // prevTextPoint.X = 2; prevTextPoint.Y = prevTextPoint.Y + 10; ft = new FormattedText(currentFixedNode.ToString(), EnglishCulture, FlowDirection.LeftToRight, new Typeface("Courier New"), 8, Brushes.DarkViolet, dpi.PixelsPerDip); dc.DrawText(ft, prevTextPoint); } }
// Get the highlights, in Glyphs granularity, that covers this range internal void GetMultiHighlights(FixedTextPointer start, FixedTextPointer end, Dictionary <FixedPage, ArrayList> highlights, FixedHighlightType t, Brush foregroundBrush, Brush backgroundBrush) { Debug.Assert(highlights != null); if (start.CompareTo(end) > 0) { // make sure start <= end FixedTextPointer temp = start; start = end; end = temp; } FixedSOMElement[] elements; //Start and end indices in selection for first and last FixedSOMElements respectively int startIndex = 0; int endIndex = 0; if (_GetFixedNodesForFlowRange(start, end, out elements, out startIndex, out endIndex)) { for (int i = 0; i < elements.Length; i++) { FixedSOMElement elem = elements[i]; FixedNode fn = elem.FixedNode; // Get the FixedPage if possible FixedPage page = this.FixedDocument.SyncGetPageWithCheck(fn.Page); if (page == null) { continue; } DependencyObject o = page.GetElement(fn); if (o == null) { continue; } int beginOffset = 0; int endOffset; UIElement e; if (o is Image || o is Path) { e = (UIElement)o; endOffset = 1; } else { Glyphs g = o as Glyphs; if (g == null) { continue; } e = (UIElement)o; beginOffset = elem.StartIndex; endOffset = elem.EndIndex; } if (i == 0) { beginOffset = startIndex; } if (i == elements.Length - 1) { endOffset = endIndex; } ArrayList lfs; if (highlights.ContainsKey(page)) { lfs = highlights[page]; } else { lfs = new ArrayList(); highlights.Add(page, lfs); } FixedSOMTextRun textRun = elem as FixedSOMTextRun; if (textRun != null && textRun.IsReversed) { int oldBeginOffset = beginOffset; beginOffset = elem.EndIndex - endOffset; endOffset = elem.EndIndex - oldBeginOffset; } FixedHighlight fh = new FixedHighlight(e, beginOffset, endOffset, t, foregroundBrush, backgroundBrush); lfs.Add(fh); } } }