PdfConverter/range/Advanced/TSPdfLineRange.tsf

94 lines
2.7 KiB
Plaintext

type TSPdfLineRange = class(TSPdfBasicRange)
public
function Create(pg: TSPage);
function Do();override;
function AddRange(range: TSPdfBasicRange);
function SetAllRangeProp(pg: TSPage; sx: real; sy: real; ex: real; ey: real; w: real; fh: real; dh: real);
function Align(jc: string);
function AdjustRangeOffset(page: TSPage; x_offset: real; y_offset: real);
function AlignRightBound(right_bound: real);
function Offset(x_offset: real; y_offset; real);
private
range_array_: array of TSPdfBasicRange;
end;
function TSPdfLineRange.Create(pg: TSPage);
begin
{self.}TSPage := pg;
range_array_ := array();
end;
function TSPdfLineRange.AddRange(range: TSPdfBasicRange);
begin
range_array_[length(range_array_)] := range;
end;
function TSPdfLineRange.Do();override;
begin
for _,range in range_array_ do
range.Do();
end;
function TSPdfLineRange.SetAllRangeProp(pg: TSPage; sx: real; sy: real; ex: real; ey: real; w: real; fh: real; dh: real);
begin
for _,range in range_array_ do
begin
if not ifnil(pg) then range.TSPage := pg;
if not ifnil(sx) then range.StartX := sx;
if not ifnil(sy) then range.StartY := sy;
if not ifnil(ex) then range.EndX := ex;
if not ifnil(ey) then range.EndY := ey;
if not ifnil(w) then range.Width := w;
if not ifnil(fh) then range.FixedHeight := fh;
if not ifnil(dh) then range.DynamicHeight := dh;
end
end;
function TSPdfLineRange.Align(jc: string);
begin
offset := 0;
first := range_array_[0];
last := range_array_[length(range_array_)-1];
case jc of
"center":
offset := ({self.}Width + StartX - last.EndX - last.Width) / 2;
"right":
offset := {self.}Width - last.EndX + first.EndX - last.Width;
end;
if offset <= 0 then return;
for _,range in range_array_ do
range.EndX += offset;
end;
function TSPdfLineRange.AdjustRangeOffset(page: TSPage; x_offset: real; y_offset: real);
begin
if page <> {self.}TSPage then return;
for _,range in range_array_ do
begin
if not ifnil(x_offset) then range.EndX += x_offset;
if not ifnil(y_offset) then range.EndY += y_offset;
end;
end;
function TSPdfLineRange.AlignRightBound(right_bound: real);
begin
last := range_array_[length(range_array_)-1];
diff := right_bound - (last.EndX + last.Width);
if diff > 1e-6 then
begin
avg := diff / (length(range_array_) - 1);
for i:=1 to length(range_array_)-1 do
range_array_[i].EndX += avg * i;
end
end;
function TSPdfLineRange.Offset(x_offset: real; y_offset; real);
begin
for _,range in range_array_ do
begin
range.EndX += x_offset;
range.EndY -= y_offset;
end
end;