internal static void AddWilcardtoLine(IFlxGraphics Canvas, TFontCache FontCache, real Zoom100, Font AFont, real MaxTextWidth, ref SizeF TextExtent, TXRichString LineWithWildcard) { if (LineWithWildcard == null || LineWithWildcard.AdaptFormat == null) { return; } int WildcardPos = LineWithWildcard.AdaptFormat.WildcardPos; if (WildcardPos < 0) { return; } string s1 = LineWithWildcard.s.ToString(); string WildcardChar = String.Empty + s1[WildcardPos]; if (CharUtils.IsSurrogatePair(s1, WildcardPos) && WildcardPos + 1 < s1.Length) { WildcardChar += s1[WildcardPos + 1]; } string sOrg = s1; s1 = s1.Remove(WildcardPos, WildcardChar.Length);//consider the case the string has 0 wildcards. string sOld = s1; real wc; real OldWc = LineWithWildcard.XExtent; do { real md; wc = RenderMetrics.CalcTextExtent(Canvas, FontCache, Zoom100, AFont, new TRichString(s1), out md).Width; if (wc < MaxTextWidth) { sOld = s1; OldWc = wc; s1 = s1.Insert(WildcardPos, WildcardChar); } }while (wc < MaxTextWidth); LineWithWildcard.s = new TRichString(sOld); if (sOrg.Length > sOld.Length) { LineWithWildcard.AdaptFormat.RemovedPosition(WildcardPos, sOrg.Length - sOld.Length); //a line with a wildcard can have 0 characters in the wildcard. } if (sOrg.Length < sOld.Length) { LineWithWildcard.AdaptFormat.InsertedPosition(WildcardPos, sOld.Length - sOrg.Length); } LineWithWildcard.XExtent = OldWc; if (TextExtent.Width < OldWc) { TextExtent.Width = OldWc; } }
private static void WriteJustText(ExcelFile Workbook, IFlxGraphics Canvas, TFontCache FontCache, real Zoom100, bool ReverseRightToLeftStrings, Font AFont, Color AFontColor, real y, real SubOfs, RectangleF CellRect, real Clp, TRichString OutText, real XExtent, real MaxDescent, bool Distributed, TAdaptativeFormats AdaptativeFormats) { List <TRichString> Words = new List <TRichString>(); OutText = GetVisualString(OutText, ReverseRightToLeftStrings); string s = OutText.Value; int p = 0; int p1 = 0; while ((p1 = s.IndexOf(' ', p)) >= 0) { Words.Add(OutText.Substring(p, p1 - p + 1)); p = p1 + 1; } if (p < s.Length) { Words.Add(OutText.Substring(p)); } real md; real wc = XExtent; // CalcTextExtent(AFont, OutText, out md).Width; real Spaces = 0; if (Words.Count - 1 > 0) { Spaces = (CellRect.Width - 2 - 2 * Clp - wc) / (Words.Count - 1); } real x = CellRect.Left + 1 + Clp; if (Words.Count == 1 && Distributed) //Center when it is one word { x = (CellRect.Left + CellRect.Right - 2 - 2 * Clp - wc) / 2; } for (int i = 0; i < Words.Count; i++) { TRichString wo = Words[i]; WriteText(Workbook, Canvas, FontCache, Zoom100, AFont, AFontColor, x, y, SubOfs, wo, 0, MaxDescent, AdaptativeFormats); x += RenderMetrics.CalcTextExtent(Canvas, FontCache, Zoom100, AFont, wo, out md).Width; if (Spaces > 0) { x += Spaces; } } }
internal static void CalcTextBox(IFlxGraphics Canvas, TFontCache FontCache, real Zoom100, RectangleF CellRect, real Clp, bool MultiLine, real Alpha, bool Vertical, TRichString OutText, Font AFont, TAdaptativeFormats AdaptativeFormats, out SizeF TextExtent, out TXRichStringList TextLines, out TFloatList MaxDescent) { TextExtent = new SizeF(0, 0); TextLines = new TXRichStringList(); MaxDescent = new TFloatList(); real MaxTextWidth; if (MultiLine || Vertical) { real Md; real TextHeight = RenderMetrics.CalcTextExtent(Canvas, FontCache, Zoom100, AFont, new TRichString("M"), out Md).Height; //not perfect since the rich string might have different fonts, but a good approx. MaxTextWidth = CalcMaxTextWidth(ref CellRect, Clp, Alpha, TextHeight); RenderMetrics.SplitText(Canvas, FontCache, Zoom100, OutText, AFont, MaxTextWidth, TextLines, out TextExtent, Vertical, MaxDescent, AdaptativeFormats); } else { TextLines.Add(new TXRichString(OutText, false, 0, 0, AdaptativeFormats)); real mdx = 0; TextExtent = RenderMetrics.CalcTextExtent(Canvas, FontCache, Zoom100, AFont, OutText, out mdx); TextLines[0].XExtent = TextExtent.Width; TextLines[0].YExtent = TextExtent.Height; MaxTextWidth = CalcMaxTextWidth(ref CellRect, Clp, Alpha, TextExtent.Height); MaxDescent.Add(mdx); } if (AdaptativeFormats != null && AdaptativeFormats.WildcardPos >= 0) { MaxTextWidth -= 2 * Clp; //Add some extra clipping so the text doesn't go through the line. if (Vertical) { } else { AddWildcard(Canvas, FontCache, Zoom100, AFont, MaxTextWidth, TextLines, ref TextExtent); } } }