using FastReport.Utils;
using FastReport.Web.Services;
using System;
using System.Collections.Generic;
using System.Net;
using System.Text;
using System.Web;
namespace FastReport.Web
{
partial class WebReport
{
string template_outline()
{
if (!Outline)
return "";
if ((Report.PreparedPages?.OutlineXml?.Count ?? 0) == 0)
return "";
var outline = new StringBuilder();
BuildOutline(outline, Report.PreparedPages.OutlineXml, true);
return $@"
";
}
void BuildOutline(StringBuilder sb, XmlItem xml, bool top)
{
for (int i = 0; i < xml.Count; i++)
{
var opened = top && xml.Count == 1;
var styleShow = opened ? @"style=""display:none""" : @"style=""display:block""";
var styleHide = opened ? @"style=""display:block""" : @"style=""display:none""";
var node = xml[i];
var hasChildren = node.Count > 0;
var (text, page, offset) = ReadOutlineNode(node);
var nodeId = Convert.ToBase64String(Encoding.UTF8.GetBytes($"{ID}{page}{offset}{sb.Length}{GetCurrentTabName()}"));
sb.Append($@"");
string caret;
if (hasChildren)
{
caret = $@"
![]()
";
caret += $@"
![]()
";
}
else
{
caret = $@"
";
}
sb.Append($@"
");
if (hasChildren)
{
sb.Append($@"
"); // line break
sb.Append($@"
");
BuildOutline(sb, node, false);
sb.Append("
");
}
sb.Append("
");
}
}
(string text, int page, float offset) ReadOutlineNode(XmlItem node)
{
string text = node.GetProp("Text");
int page = 0;
float offset = 0f;
string s = node.GetProp("Page");
if (!s.IsNullOrWhiteSpace())
{
page = int.Parse(s);
s = node.GetProp("Offset");
if (!s.IsNullOrWhiteSpace())
offset = (float)Converter.FromString(typeof(float), s) /* * PDF_DIVIDER*/;
}
return (text, page, offset);
}
}
}