コード例 #1
0
ファイル: RenderToHtml.cs プロジェクト: eksotama/rdl-engine
        protected int RecurseRender(Rdl.Render.GenericRender rpt, StringBuilder body, Element elmt, int level, bool forPrint)
        {
            StringBuilder bodyPart  = new StringBuilder();
            bool          hasAction = false;

            string style = string.Empty;

            //BoxStyle bs = rpt.StyleList[elmt.StyleIndex];

            //if (elmt.ReportElement is Rdl.Engine.Report)
            //{
            //    rpt = (Rdl.Engine.Report)elmt.ReportElement;
            //}
            if (elmt is Container)
            {
                Container c = elmt as Container;
                if (!c.IsVisible)
                {
                    return(0);
                }
            }
            if ((elmt is TextElement || elmt is FixedContainer || elmt is ImageElement || elmt is ChartElement))
            {
                style += "width: " + ElementWidth(rpt, elmt) + "pt;"
                         + "height: " + ElementHeight(rpt, elmt) + "pt;";
            }
            if (elmt is TextElement)
            {
                style += "overflow: hidden;";
            }
            if (elmt._imageIndex >= 0 && !(elmt is ImageElement))
            {
                style += "background-image: url(" + GetImageUrl(elmt.Name, "StaticImage", elmt._imageIndex.ToString()) + ");";
                style += "background-repeat: " + rpt.ImageList[elmt._imageIndex].ImageRepeat.ToString() + ";";
            }
            if (elmt.Parent != null && elmt.Parent is Rdl.Render.FixedContainer)
            {
                decimal top  = elmt.Top;
                decimal left = elmt.Left;
                style +=
                    "top: " + top + "pt;" +
                    "left: " + left + "pt;";
                // 12/26/2007 This line caused problems with tables.
                //if (!elmt.MatchParentHeight)
                style += "position: absolute;";
            }
            if (elmt is TextElement && ((TextStyle)elmt.Style).TextAlign == Rdl.Engine.Style.TextAlignEnum.General)
            {
                TextElement te = elmt as TextElement;
                decimal     val;

                if (te.Text.Length > 0 &&
                    decimal.TryParse(te.Text,
                                     System.Globalization.NumberStyles.AllowCurrencySymbol |
                                     System.Globalization.NumberStyles.Number,
                                     System.Globalization.CultureInfo.CurrentCulture,
                                     out val))
                {
                    style += "text-align: right;";
                }
                else
                {
                    style += "text-align: left;";
                }
            }

            if (elmt is FlowContainer && ((FlowContainer)elmt).FlowDirection == FlowContainer.FlowDirectionEnum.LeftToRight)
            {
                int elements = 0;
                bodyPart.AppendLine(Spaces(level) + "<table cellpadding=\"0\" cellspacing=\"0\" " +
                                    "id=\"" + elmt.Name + "\" " +
                                    ((elmt.StyleIndex >= 0) ? "class=\"Report_style" + elmt.StyleIndex + "\" " : string.Empty) +
                                    "style=\"" + style + "\"" +
                                    ">" +
                                    "<tr>");

                foreach (Element child in ((Container)elmt).Children)
                {
                    bodyPart.AppendLine(Spaces(level + 1) + "<td>");
                    elements += RecurseRender(rpt, bodyPart, child, level + 2, forPrint);
                    bodyPart.AppendLine(Spaces(level + 1) + "</td>");
                }

                bodyPart.AppendLine(Spaces(level) + "</tr></table>");
                if (elements > 0)
                {
                    body.Append(bodyPart.ToString());
                }
                return(elements);
            }

            if (elmt is Container || elmt is TextElement || elmt is ImageElement || elmt is ChartElement)
            {
                string divTag =
                    "<div " +
                    "id=\"" + elmt.Name + "\" " +
                    ((elmt.StyleIndex >= 0) ? "class=\"Report_style" + elmt.StyleIndex.ToString() + "\" " : string.Empty) +
                    "style=\"" + style + "\"";
                if (elmt is TextElement && ((TextElement)elmt).IsToggle)
                {
                    divTag += " stateToggle=\"" + ((TextElement)elmt).ToggleState.ToString() + "\"";
                }
                divTag += ">";
                bodyPart.AppendLine(Spaces(level) + divTag);
            }

            if (elmt is TextElement)
            {
                TextElement te = elmt as TextElement;

                if (te.IsToggle && !forPrint)
                {
                    bodyPart.AppendLine(Spaces(level + 1) +
                                        "<a href=\"javascript:{}\" onclick=\"javascript:ToggleState('" + te.Name + "');\">");
                    bodyPart.AppendLine(Spaces(level + 1) +
                                        "<img id=\"" + te.Name + "_img\" src=" + ((te.ToggleState == TextElement.ToggleStateEnum.open) ? _minusGif : _plusGif) + " border=\"0\" style=\"float: left;\" />");
                    bodyPart.AppendLine(Spaces(level + 1) + "</a>");
                }
            }

            if (elmt is ActionElement)
            {
                ActionElement ae = (ActionElement)elmt;
                if (ae.DrillThroughReportName != null)
                {
                    bodyPart.AppendLine(Spaces(level + 1) +
                                        "<a href=\"javascript:{}\" onclick=\"javascript:Action('" + ae.Name + "');\">");
                    hasAction = true;
                }
                else if (ae.Hyperlink != null)
                {
                    bodyPart.AppendLine(Spaces(level + 1) +
                                        "<a href=\"" + ae.Hyperlink + "\" >");
                    hasAction = true;
                }
                else if (ae.BookmarkLink != null)
                {
                    bodyPart.AppendLine(Spaces(level + 1) +
                                        "<a href=\"#" + ae.BookmarkLink + "\" >");
                    hasAction = true;
                }
            }

            if (elmt is TextElement)
            {
                TextElement te = elmt as TextElement;

                // Save the report item value for filling in to ReportItem references later
                if (te.ReportElement is Rdl.Engine.ReportItem)
                {
                    elementValues[((Rdl.Engine.ReportItem)te.ReportElement).Name] =
                        te.Text;
                }

                string text = te.Text.Replace("\n", "<br />");
                bodyPart.AppendLine(Spaces(level) + text);
            }

            if (elmt is ImageElement)
            {
                ImageElement ie = elmt as ImageElement;

                bodyPart.AppendLine(Spaces(level) +
                                    "<img id=\"img_" + elmt.Name + "\" alt=\"\" border=\"0\" src=\"\">");
                _script.AppendLine(Spaces(level) +
                                   "document.getElementById('img_" + elmt.Name + "').src = " +
                                   GetImageUrl(elmt.Name, "SizedImage", elmt._imageIndex.ToString()) + ";"
                                   );
            }

            if (elmt is ChartElement)
            {
                _charts.Add(elmt.Name, (ChartElement)elmt);
                bodyPart.AppendLine(Spaces(level) +
                                    "<img id=\"img_" + elmt.Name + "\" alt=\"\" border=\"0\" src=\"\">");
                _script.AppendLine(Spaces(level) +
                                   "document.getElementById('img_" + elmt.Name + "').src = " +
                                   GetImageUrl(elmt.Name, "Chart", elmt.Name) + ";"
                                   );
            }

            if (elmt is Container)
            {
                if (elmt.Height == 0)
                {
                    return(0);
                }
                int elements = 0;
                foreach (Element child in ((Container)elmt).Children)
                {
                    elements += RecurseRender(rpt, bodyPart, child, level + 1, forPrint);
                }
            }

            if (hasAction)
            {
                bodyPart.Append("</a>");
            }

            if (elmt is Container || elmt is TextElement || elmt is ImageElement || elmt is ChartElement)
            {
                bodyPart.AppendLine(Spaces(level) +
                                    "</div>");
            }

            body.Append(bodyPart.ToString());
            return(1);
        }
コード例 #2
0
        private void RecurseRender(Element elmt, decimal top, decimal left, bool renderAll)
        {
            top  += elmt.Top;
            left += elmt.Left;

            if (!renderAll)
            {
                if (elmt is Container && !((Container)elmt).IsVisible)
                {
                    return;
                }
            }

            if (elmt is TextElement)
            {
                TextElement te = elmt as TextElement;
                TextStyle   ts = null;
                if (te.Style is TextStyle)
                {
                    ts = (TextStyle)te.Style;
                }

                Int32 row = _rows.FindIndex(delegate(decimal d) { return(d == top); });
                Int32 col;
                if (ts != null && ts.TextAlign == Rdl.Engine.Style.TextAlignEnum.Right)
                {
                    col = _cols.FindIndex(delegate(decimal d) { return(d == left + elmt.Width); }) - 1;
                }
                else
                {
                    col = _cols.FindIndex(delegate(decimal d) { return(d == left); });
                }

                WritableCell cell;
                double       dValue;
                if (double.TryParse(te.Text, out dValue))
                {
                    cell = new Number(col, row, dValue);
                }
                else
                {
                    cell = new Label(col, row, te.Text);
                }
                cell.setCellFormat(formats[te.StyleIndex]);
                _ws.addCell(cell);
            }

            if (elmt is ImageElement)
            {
                ImageElement ie = elmt as ImageElement;

                Int32 row = _rows.FindIndex(delegate(decimal d) { return(d == top); });
                Int32 col;
                if (ie != null)
                {
                    col = _cols.FindIndex(delegate(decimal d) { return(d == left); });
                }

                Rdl.Render.ImageData id  = _report.ImageList[ie._imageIndex];
                WritableImage        img = new WritableImage(0, 0, (double)ie.Width, (double)ie.Height,
                                                             id.GetImageData());
                _ws.addImage(img);
            }

            if (elmt is Container)
            {
                foreach (Element child in ((Container)elmt).Children)
                {
                    RecurseRender(child, top, left, renderAll);
                }
            }
        }
コード例 #3
0
ファイル: Toggles.cs プロジェクト: eksotama/rdl-engine
 public Toggle(TextElement te)
 {
     Element = te;
 }
コード例 #4
0
ファイル: Toggles.cs プロジェクト: eksotama/rdl-engine
 public Toggle(TextElement te, Rdl.Engine.Enums.ToggleDirectionEnum direction)
 {
     Element   = te;
     Direction = direction;
 }
コード例 #5
0
        protected void RecurseRender(Element elmt, Pdf.ContentStream contents, decimal top, decimal left)
        {
            top  += elmt.Top;
            left += elmt.Left;

            if (elmt is Container || elmt is TextElement)
            {
                // If the background is not transparent then fill it in.
                if (elmt.Style != null && elmt.Style.BackgroundColor != null && elmt.Style.BackgroundColor != "transparent")
                {
                    contents.AddFillRect(left, _pageRender.PageHeight - (top + elmt.Height), left + elmt.Width, _pageRender.PageHeight - top,
                                         Rdl.Engine.Style.W32Color(elmt.Style.BackgroundColor));
                }

                // If there is a border then build the border.
                if (elmt.Style != null && elmt.Style.BorderWidth.Left.points > 0 && elmt.Style.BorderStyle.Left != Rdl.Engine.BorderStyle.BorderStyleEnum.None)
                {
                    contents.AddLine(left, _pageRender.PageHeight - (top + elmt.Height), left, _pageRender.PageHeight - top,
                                     elmt.Style.BorderWidth.Left.points,
                                     Rdl.Engine.Style.W32Color(elmt.Style.BorderColor.Left),
                                     PdfLineStyle(elmt.Style.BorderStyle.Left));
                }
                if (elmt.Style != null && elmt.Style.BorderWidth.Right.points > 0 && elmt.Style.BorderStyle.Right != Rdl.Engine.BorderStyle.BorderStyleEnum.None)
                {
                    contents.AddLine(left + elmt.Width, _pageRender.PageHeight - (top + elmt.Height), left + elmt.Width, _pageRender.PageHeight - top,
                                     elmt.Style.BorderWidth.Right.points,
                                     Rdl.Engine.Style.W32Color(elmt.Style.BorderColor.Right),
                                     PdfLineStyle(elmt.Style.BorderStyle.Right));
                }
                if (elmt.Style != null && elmt.Style.BorderWidth.Top.points > 0 && elmt.Style.BorderStyle.Top != Rdl.Engine.BorderStyle.BorderStyleEnum.None)
                {
                    contents.AddLine(left, _pageRender.PageHeight - top, left + elmt.Width, _pageRender.PageHeight - top,
                                     elmt.Style.BorderWidth.Top.points,
                                     Rdl.Engine.Style.W32Color(elmt.Style.BorderColor.Top),
                                     PdfLineStyle(elmt.Style.BorderStyle.Top));
                }
                if (elmt.Style != null && elmt.Style.BorderWidth.Bottom.points > 0 && elmt.Style.BorderStyle.Bottom != Rdl.Engine.BorderStyle.BorderStyleEnum.None)
                {
                    contents.AddLine(left, _pageRender.PageHeight - (top + elmt.Height), left + elmt.Width, _pageRender.PageHeight - (top + elmt.Height),
                                     elmt.Style.BorderWidth.Bottom.points,
                                     Rdl.Engine.Style.W32Color(elmt.Style.BorderColor.Bottom),
                                     PdfLineStyle(elmt.Style.BorderStyle.Bottom));
                }
            }

            if (elmt is TextElement)
            {
                TextElement te = elmt as TextElement;
                TextStyle   ts = te.Style as TextStyle;

                if (te.Text.Length > 0)
                {
                    decimal[]        widths;
                    CharacterRange[] charRanges = BuildCharacterRanges(
                        te.Text,
                        _winFontList[elmt.StyleIndex],
                        new Rectangle(0, 0, (int)te.Width, (int)te.Height),
                        out widths);

                    for (int i = 0; i < charRanges.Length; i++)
                    {
                        decimal l = 0, r = 0;
                        switch (ts.TextAlign)
                        {
                        case Rdl.Engine.Style.TextAlignEnum.Left:
                        case Rdl.Engine.Style.TextAlignEnum.General:
                            l = left;
                            r = l + widths[i];
                            break;

                        case Rdl.Engine.Style.TextAlignEnum.Center:
                            l = left + ((elmt.Width - widths[i]) / 2);
                            r = l + widths[i];
                            break;

                        case Rdl.Engine.Style.TextAlignEnum.Right:
                            r = left + elmt.Width;
                            l = r - widths[i];
                            break;
                        }

                        contents.AddText(l,
                                         _pageRender.PageHeight - top - (ts.LineHeight.points * (i + 1)),
                                         r,
                                         _pageRender.PageHeight - top - (ts.LineHeight.points * i),
                                         te.Text.Substring(charRanges[i].First, charRanges[i].Length),
                                         Rdl.Engine.Style.W32Color(te.Style.Color), _pdfFontList[elmt.StyleIndex],
                                         (int)ts.FontSize.points, (int)ts.LineHeight.points,
                                         null,
                                         Rdl.Pdf.ContentStream.WritingModeEnum.lr_tb,
                                         PdfFontDecofation(ts.TextDecoration));
                    }
                }
            }

            if (elmt is Container)
            {
                foreach (Element child in ((Container)elmt).Children)
                {
                    RecurseRender(child, contents, top, left);
                }
            }
        }