Files
QuestPDF/Source/QuestPDF/Fluent/ElementExtensions.cs
T

203 lines
6.7 KiB
C#

using System;
using QuestPDF.Drawing.Exceptions;
using QuestPDF.Elements;
using QuestPDF.Helpers;
using QuestPDF.Infrastructure;
namespace QuestPDF.Fluent
{
public static class ElementExtensions
{
internal static Container Create(Action<IContainer> factory)
{
var container = new Container();
factory(container);
return container;
}
internal static T Element<T>(this IContainer element, T child) where T : IElement
{
if (element?.Child != null && element.Child is Empty == false)
{
var message = "You should not assign multiple child elements to a single-child container. " +
"This may happen when a container variable is used outside of its scope/closure OR the container is used in multiple fluent API chains OR the container is used incorrectly in a loop. " +
"This exception is thrown to help you detect that some part of the code is overriding fragments of the document layout with a new content - essentially destroying existing content.";
throw new DocumentComposeException(message);
}
if (element != child as Element)
element.Child = child as Element;
return child;
}
public static void Element<TParent>(this TParent parent, Action<IContainer> handler) where TParent : IContainer
{
handler(parent.Container());
}
public static IContainer Element<TParent>(this TParent parent, Func<IContainer, IContainer> handler) where TParent : IContainer
{
return handler(parent.Container()).Container();
}
public static IContainer AspectRatio(this IContainer element, float ratio, AspectRatioOption option = AspectRatioOption.FitWidth)
{
return element.Element(new AspectRatio
{
Ratio = ratio,
Option = option
});
}
public static IContainer Background(this IContainer element, string color)
{
ColorValidator.Validate(color);
return element.Element(new Background
{
Color = color
});
}
public static void Placeholder(this IContainer element, string? text = null)
{
element.Component(new Placeholder
{
Text = text ?? string.Empty
});
}
public static IContainer ShowOnce(this IContainer element)
{
return element.Element(new ShowOnce());
}
public static IContainer SkipOnce(this IContainer element)
{
return element.Element(new SkipOnce());
}
public static IContainer ShowEntire(this IContainer element)
{
return element.Element(new ShowEntire());
}
public static IContainer EnsureSpace(this IContainer element, float minHeight = Elements.EnsureSpace.DefaultMinHeight)
{
return element.Element(new EnsureSpace
{
MinHeight = minHeight
});
}
public static void PageBreak(this IContainer element)
{
element.Element(new PageBreak());
}
public static IContainer Container(this IContainer element)
{
return element.Element(new Container());
}
[Obsolete("This element has been renamed since version 2022.3. Please use the Hyperlink method.")]
public static IContainer ExternalLink(this IContainer element, string url)
{
return element.Hyperlink(url);
}
public static IContainer Hyperlink(this IContainer element, string url)
{
return element.Element(new Hyperlink
{
Url = url
});
}
[Obsolete("This element has been renamed since version 2022.3. Please use the Section method.")]
public static IContainer Location(this IContainer element, string locationName)
{
return element.Section(locationName);
}
public static IContainer Section(this IContainer element, string sectionName)
{
return element.Element(new Section
{
LocationName = sectionName
});
}
[Obsolete("This element has been renamed since version 2022.3. Please use the SectionLink method.")]
public static IContainer InternalLink(this IContainer element, string locationName)
{
return element.SectionLink(locationName);
}
public static IContainer SectionLink(this IContainer element, string sectionName)
{
return element.Element(new SectionLink
{
SectionName = sectionName
});
}
public static IContainer ShowIf(this IContainer element, bool condition)
{
return condition ? element : new Container();
}
public static void Canvas(this IContainer element, DrawOnCanvas handler)
{
element.Element(new Canvas
{
Handler = handler
});
}
[Obsolete("This element has been renamed since version 2022.1. Please use the MinimalBox method.")]
public static IContainer Box(this IContainer element)
{
return element.Element(new MinimalBox());
}
public static IContainer MinimalBox(this IContainer element)
{
return element.Element(new MinimalBox());
}
public static IContainer Unconstrained(this IContainer element)
{
return element.Element(new Unconstrained());
}
public static IContainer DefaultTextStyle(this IContainer element, TextStyle textStyle)
{
return element.Element(new DefaultTextStyle
{
TextStyle = textStyle
});
}
public static IContainer DefaultTextStyle(this IContainer element, Func<TextStyle, TextStyle> handler)
{
return element.Element(new DefaultTextStyle
{
TextStyle = handler(TextStyle.Default)
});
}
public static IContainer StopPaging(this IContainer element)
{
return element.Element(new StopPaging());
}
public static IContainer ScaleToFit(this IContainer element)
{
return element.Element(new ScaleToFit());
}
}
}