public float RunTextCalcHeight(Report rpt, Graphics g, Row row, PageTextHtml pth) { // normally only called when CanGrow is true Size s = Size.Empty; if (IsHidden(rpt, row)) { return(0); } object o = _Value.Evaluate(rpt, row); TypeCode tc = _Value.GetTypeCode(); int width = this.WidthCalc(rpt, g); if (this.Style != null) { width -= (Style.EvalPaddingLeftPx(rpt, row) + Style.EvalPaddingRightPx(rpt, row)); if (this.IsHtml(rpt, row)) { if (pth == null) { pth = new PageTextHtml(o == null? "": o.ToString()); SetPagePositionAndStyle(rpt, pth, row); } pth.Build(g); s.Height = RSize.PixelsFromPoints(pth.TotalHeight); } else { s = Style.MeasureString(rpt, g, o, tc, row, width); } } else // call the class static method { s = Style.MeasureStringDefaults(rpt, g, o, tc, row, width); } TextboxRuntime tbr = TextboxRuntime.GetTextboxRuntime(rpt, this); tbr.RunHeight = RSize.PointsFromPixels(g, s.Height); if (Style != null) { tbr.RunHeight += (Style.EvalPaddingBottom(rpt, row) + Style.EvalPaddingTop(rpt, row)); } return(tbr.RunHeight); }
// render all the objects in a page in PDF private void ProcessPage(Pages pgs, IEnumerable items) { foreach (PageItem pi in items) { if (pi.SI.BackgroundImage != null) { // put out any background image PageImage bgImg = pi.SI.BackgroundImage; // elements.AddImage(images, i.Name, content.objectNum, i.SI, i.ImgFormat, // pi.X, pi.Y, pi.W, pi.H, i.ImageData,i.SamplesW, i.SamplesH, null); //Duc Phan modified 10 Dec, 2007 to support on background image float imW = RSize.PointsFromPixels(pgs.G, bgImg.SamplesW); float imH = RSize.PointsFromPixels(pgs.G, bgImg.SamplesH); int repeatX = 0; int repeatY = 0; float itemW = pi.W - (pi.SI.PaddingLeft + pi.SI.PaddingRight); float itemH = pi.H - (pi.SI.PaddingTop + pi.SI.PaddingBottom); switch (bgImg.Repeat) { case ImageRepeat.Repeat: repeatX = (int)Math.Floor(itemW / imW); repeatY = (int)Math.Floor(itemH / imH); break; case ImageRepeat.RepeatX: repeatX = (int)Math.Floor(itemW / imW); repeatY = 1; break; case ImageRepeat.RepeatY: repeatY = (int)Math.Floor(itemH / imH); repeatX = 1; break; case ImageRepeat.NoRepeat: default: repeatX = repeatY = 1; break; } //make sure the image is drawn at least 1 times repeatX = Math.Max(repeatX, 1); repeatY = Math.Max(repeatY, 1); float currX = pi.X + pi.SI.PaddingLeft; float currY = pi.Y + pi.SI.PaddingTop; float startX = currX; float startY = currY; for (int i = 0; i < repeatX; i++) { for (int j = 0; j < repeatY; j++) { currX = startX + i * imW; currY = startY + j * imH; elements.AddImage(images, bgImg.Name, content.objectNum, bgImg.SI, bgImg.ImgFormat, currX, currY, imW, imH, RectangleF.Empty, bgImg.ImageData, bgImg.SamplesW, bgImg.SamplesH, null, pi.Tooltip); } } } if (pi is PageTextHtml) { PageTextHtml pth = pi as PageTextHtml; pth.Build(pgs.G); ProcessPage(pgs, pth); continue; } if (pi is PageText) { PageText pt = pi as PageText; float[] textwidth; string[] sa = MeasureString(pt, pgs.G, out textwidth); elements.AddText(pt.X, pt.Y, pt.H, pt.W, sa, pt.SI, fonts, textwidth, pt.CanGrow, pt.HyperLink, pt.NoClip, pt.Tooltip); if (pt.Bookmark != null) { outline.Bookmarks.Add(new PdfOutlineEntry(anchor, page.objectNum, pt.Bookmark, pt.X, elements.PageSize.yHeight - pt.Y)); } continue; } if (pi is PageLine) { PageLine pl = pi as PageLine; elements.AddLine(pl.X, pl.Y, pl.X2, pl.Y2, pl.SI); continue; } if (pi is PageEllipse) { PageEllipse pe = pi as PageEllipse; elements.AddEllipse(pe.X, pe.Y, pe.H, pe.W, pe.SI, pe.HyperLink); continue; } if (pi is PageImage) { //PageImage i = pi as PageImage; //float x = i.X + i.SI.PaddingLeft; //float y = i.Y + i.SI.PaddingTop; //float w = i.W - i.SI.PaddingLeft - i.SI.PaddingRight; //float h = i.H - i.SI.PaddingTop - i.SI.PaddingBottom; //elements.AddImage(images, i.Name, content.objectNum, i.SI, i.ImgFormat, // x, y, w, h, i.ImageData,i.SamplesW, i.SamplesH, i.HyperLink); //continue; PageImage i = pi as PageImage; //Duc Phan added 20 Dec, 2007 to support sized image RectangleF r2 = new RectangleF(i.X + i.SI.PaddingLeft, i.Y + i.SI.PaddingTop, i.W - i.SI.PaddingLeft - i.SI.PaddingRight, i.H - i.SI.PaddingTop - i.SI.PaddingBottom); RectangleF adjustedRect; // work rectangle RectangleF clipRect = RectangleF.Empty; switch (i.Sizing) { case ImageSizingEnum.AutoSize: adjustedRect = new RectangleF(r2.Left, r2.Top, r2.Width, r2.Height); break; case ImageSizingEnum.Clip: adjustedRect = new RectangleF(r2.Left, r2.Top, RSize.PointsFromPixels(pgs.G, i.SamplesW), RSize.PointsFromPixels(pgs.G, i.SamplesH)); clipRect = new RectangleF(r2.Left, r2.Top, r2.Width, r2.Height); break; case ImageSizingEnum.FitProportional: float height; float width; float ratioIm = (float)i.SamplesH / i.SamplesW; float ratioR = r2.Height / r2.Width; height = r2.Height; width = r2.Width; if (ratioIm > ratioR) { // this means the rectangle width must be corrected width = height * (1 / ratioIm); } else if (ratioIm < ratioR) { // this means the rectangle height must be corrected height = width * ratioIm; } adjustedRect = new RectangleF(r2.X, r2.Y, width, height); break; case ImageSizingEnum.Fit: default: adjustedRect = r2; break; } if (i.ImgFormat == System.Drawing.Imaging.ImageFormat.Wmf || i.ImgFormat == System.Drawing.Imaging.ImageFormat.Emf) { //We dont want to add it - its already been broken down into page items; } else { elements.AddImage(images, i.Name, content.objectNum, i.SI, i.ImgFormat, adjustedRect.X, adjustedRect.Y, adjustedRect.Width, adjustedRect.Height, clipRect, i.ImageData, i.SamplesW, i.SamplesH, i.HyperLink, i.Tooltip); } continue; } if (pi is PageRectangle) { PageRectangle pr = pi as PageRectangle; elements.AddRectangle(pr.X, pr.Y, pr.H, pr.W, pi.SI, pi.HyperLink, patterns, pi.Tooltip); continue; } if (pi is PagePie) { // TODO PagePie pp = pi as PagePie; // elements.AddPie(pr.X, pr.Y, pr.H, pr.W, pi.SI, pi.HyperLink, patterns, pi.Tooltip); continue; } if (pi is PagePolygon) { PagePolygon ppo = pi as PagePolygon; elements.AddPolygon(ppo.Points, pi.SI, pi.HyperLink, patterns); continue; } if (pi is PageCurve) { PageCurve pc = pi as PageCurve; elements.AddCurve(pc.Points, pi.SI); continue; } } }
// render all the objects in a page in PDF private void ProcessPage(Pages pgs, IEnumerable items) { foreach (PageItem pi in items) { if (pi.SI.BackgroundImage != null) { } if (pi is PageTextHtml) { PageTextHtml pth = pi as PageTextHtml; continue; } if (pi is PageText) { PageText pt = pi as PageText; tw.LastPage.IsInBody = IsInBody; tw.LastPage.IsInPageFooter = IsInPageFooter; tw.LastPage.IsInPageHeader = IsInPageHeader; tw.LastPage.InsertContent(pt.Text, pt.X, pt.Y, pt.W, pt.H, pt.SI, pt.CanGrow); continue; } if (pi is PageLine) { PageLine pl = pi as PageLine; tw.LastPage.IsInBody = IsInBody; tw.LastPage.IsInPageFooter = IsInPageFooter; tw.LastPage.IsInPageHeader = IsInPageHeader; tw.LastPage.InsertLine(pl.X, pl.Y, pl.X2, pl.Y2, pl.SI); continue; } if (pi is PageEllipse) { PageEllipse pe = pi as PageEllipse; // elements.AddEllipse(pe.X, pe.Y, pe.H, pe.W, pe.SI, pe.HyperLink); continue; } if (pi is PageImage) { continue; } if (pi is PageRectangle) { PageRectangle pr = pi as PageRectangle; continue; } if (pi is PagePie) { // TODO PagePie pp = pi as PagePie; // elements.AddPie(pr.X, pr.Y, pr.H, pr.W, pi.SI, pi.HyperLink, patterns, pi.Tooltip); continue; } if (pi is PagePolygon) { PagePolygon ppo = pi as PagePolygon; continue; } if (pi is PageCurve) { PageCurve pc = pi as PageCurve; continue; } } }
private void SelectTextHtml(PageTextHtml ph, StringBuilder sb) { bool bFirst = true; float lastY = float.MaxValue; foreach (PageItem pi in ph) { if (bFirst) // we ignore the contents of the first item { bFirst = false; continue; } PageText pt = pi as PageText; if (pt == null) continue; if (pt.Y > lastY) // we've gone to a new line; put a blank in between the text sb.Append(' '); // this isn't always ideal: if user was just selecting html text // then they might want to retain the new lines; but when selecting // html page items and other page items new lines affect the table building sb.Append(pt.Text); // append on this text lastY = pt.Y; } return; }
private void ProcessHtml(PageTextHtml pth, Graphics g, RectangleF clipRect, bool bHitList) { pth.Build(g); // Builds the subobjects that make up the html this.ProcessPage(g, pth, clipRect, bHitList); }
override public void RunPage(Pages pgs, Row row) { Report r = pgs.Report; TextboxRuntime tbr = TextboxRuntime.GetTextboxRuntime(r, this); tbr.RunCount++; // Increment the run count bool bHidden = IsHidden(r, row); SetPagePositionBegin(pgs); string t; if (bHidden) { t = ""; } else { t = RunText(r, row); // get the text } bool bDup = RunTextIsDuplicate(tbr, t, pgs.CurrentPage); if (bDup) { if (!(this.IsTableOrMatrixCell(r))) // don't put out anything if not in Table or Matrix { bHidden = true; } t = ""; // still need to put out the cell } PageText pt; PageTextHtml pth = null; if (IsHtml(r, row)) { pt = pth = new PageTextHtml(t); } else { pt = new PageText(t); } SetPagePositionAndStyle(r, pt, row); if (this.CanGrow && tbr.RunHeight == 0) // when textbox is in a DataRegion this will already be called { this.RunTextCalcHeight(r, pgs.G, row, pt is PageTextHtml? pt as PageTextHtml: null); } pt.H = Math.Max(pt.H, tbr.RunHeight); // reset height if (pt.SI.BackgroundImage != null) { pt.SI.BackgroundImage.H = pt.H; // and in the background image } pt.CanGrow = this.CanGrow; // check TextAlign: if General then correct based on data type if (pt.SI.TextAlign == TextAlignEnum.General) { if (DataType.IsNumeric(this.Value.GetTypeCode())) { pt.SI.TextAlign = TextAlignEnum.Right; } } // Hidden objects don't affect the current page? if (!bHidden) { // Force page break if it doesn't fit on a page if (this.IsInBody && // Only force page when object directly in body pgs.CurrentPage.YOffset + pt.Y + pt.H >= pgs.BottomOfPage && // running off end of page !pgs.CurrentPage.IsEmpty()) // if page is already empty don't force new { // force page break if it doesn't fit on the page pgs.NextOrNew(); pgs.CurrentPage.YOffset = OwnerReport.TopOfPage; if (this.YParents != null) { pt.Y = 0; } } Page p = pgs.CurrentPage; RecordPageReference(r, p, row); // save information for late page header/footer references p.AddObject(pt); if (!bDup) { tbr.PreviousText = t; // previous text displayed tbr.PreviousPage = p; // page previous text was shown on } } SetPagePositionEnd(pgs, pt.Y + pt.H); if (pth != null) { pth.Reset(); } if (this.CanGrow && !Value.IsConstant()) { tbr.RunHeight = 0; // need to recalculate } }
private void ProcessHtml(PageTextHtml pth, System.Drawing.Graphics g) { pth.Build(g); // Builds the subobjects that make up the html this.ProcessPage(g, pth); }
public float RunTextCalcHeight(Report rpt, Graphics g, Row row, PageTextHtml pth) { // normally only called when CanGrow is true Size s = Size.Empty; if (IsHidden(rpt, row)) return 0; object o = _Value.Evaluate(rpt, row); TypeCode tc = _Value.GetTypeCode(); int width = this.WidthCalc(rpt, g); if (this.Style != null) { width -= (Style.EvalPaddingLeftPx(rpt, row) + Style.EvalPaddingRightPx(rpt, row)); if (this.IsHtml(rpt, row)) { if (pth == null) { pth = new PageTextHtml(o==null? "": o.ToString()); SetPagePositionAndStyle(rpt, pth, row); } pth.Build(g); s.Height = RSize.PixelsFromPoints(pth.TotalHeight); } else s = Style.MeasureString(rpt, g, o, tc, row, width); } else // call the class static method s = Style.MeasureStringDefaults(rpt, g, o, tc, row, width); TextboxRuntime tbr = TextboxRuntime.GetTextboxRuntime(rpt, this); tbr.RunHeight = RSize.PointsFromPixels(g, s.Height); if (Style != null) tbr.RunHeight += (Style.EvalPaddingBottom(rpt, row) + Style.EvalPaddingTop(rpt, row)); return tbr.RunHeight; }
override public void RunPage(Pages pgs, Row row) { Report r = pgs.Report; TextboxRuntime tbr = TextboxRuntime.GetTextboxRuntime(r, this); tbr.RunCount++; // Increment the run count bool bHidden = IsHidden(r, row); SetPagePositionBegin(pgs); string t; if (bHidden) t = ""; else t = RunText(r, row); // get the text bool bDup = RunTextIsDuplicate(tbr, t, pgs.CurrentPage); if (bDup) { if (!(this.IsTableOrMatrixCell(r))) // don't put out anything if not in Table or Matrix bHidden = true; t = ""; // still need to put out the cell } PageText pt; PageTextHtml pth=null; if (IsHtml(r, row)) pt = pth = new PageTextHtml(t); else pt = new PageText(t); SetPagePositionAndStyle(r, pt, row); if (this.CanGrow && tbr.RunHeight == 0) // when textbox is in a DataRegion this will already be called { this.RunTextCalcHeight(r, pgs.G, row, pt is PageTextHtml? pt as PageTextHtml: null); } pt.H = Math.Max(pt.H, tbr.RunHeight); // reset height if (pt.SI.BackgroundImage != null) pt.SI.BackgroundImage.H = pt.H; // and in the background image pt.CanGrow = this.CanGrow; // check TextAlign: if General then correct based on data type if (pt.SI.TextAlign == TextAlignEnum.General) { if (DataType.IsNumeric(this.Value.GetTypeCode() )) pt.SI.TextAlign = TextAlignEnum.Right; } // Hidden objects don't affect the current page? if (!bHidden) { // Force page break if it doesn't fit on a page if (this.IsInBody && // Only force page when object directly in body pgs.CurrentPage.YOffset + pt.Y + pt.H >= pgs.BottomOfPage && // running off end of page !pgs.CurrentPage.IsEmpty()) // if page is already empty don't force new { // force page break if it doesn't fit on the page pgs.NextOrNew(); pgs.CurrentPage.YOffset = OwnerReport.TopOfPage; if (this.YParents != null) pt.Y = 0; } Page p = pgs.CurrentPage; RecordPageReference(r, p, row); // save information for late page header/footer references p.AddObject(pt); if (!bDup) { tbr.PreviousText = t; // previous text displayed tbr.PreviousPage = p; // page previous text was shown on } } SetPagePositionEnd(pgs, pt.Y+pt.H); if (pth != null) pth.Reset(); if (this.CanGrow && !Value.IsConstant()) { tbr.RunHeight = 0; // need to recalculate } }