898 lines
33 KiB
C#
898 lines
33 KiB
C#
|
#region MigraDoc - Creating Documents on the Fly
|
||
|
//
|
||
|
// Authors:
|
||
|
// Stefan Lange
|
||
|
// Klaus Potzesny
|
||
|
// David Stephensen
|
||
|
//
|
||
|
// Copyright (c) 2001-2017 empira Software GmbH, Cologne Area (Germany)
|
||
|
//
|
||
|
// http://www.pdfsharp.com
|
||
|
// http://www.migradoc.com
|
||
|
// http://sourceforge.net/projects/pdfsharp
|
||
|
//
|
||
|
// Permission is hereby granted, free of charge, to any person obtaining a
|
||
|
// copy of this software and associated documentation files (the "Software"),
|
||
|
// to deal in the Software without restriction, including without limitation
|
||
|
// the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
||
|
// and/or sell copies of the Software, and to permit persons to whom the
|
||
|
// Software is furnished to do so, subject to the following conditions:
|
||
|
//
|
||
|
// The above copyright notice and this permission notice shall be included
|
||
|
// in all copies or substantial portions of the Software.
|
||
|
//
|
||
|
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||
|
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||
|
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
||
|
// THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||
|
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||
|
// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
||
|
// DEALINGS IN THE SOFTWARE.
|
||
|
#endregion
|
||
|
|
||
|
using MigraDoc.DocumentObjectModel.Tables;
|
||
|
using MigraDoc.DocumentObjectModel.Shapes;
|
||
|
using MigraDoc.DocumentObjectModel.Shapes.Charts;
|
||
|
|
||
|
namespace MigraDoc.DocumentObjectModel.Visitors
|
||
|
{
|
||
|
/// <summary>
|
||
|
/// Summary description for VisitorBase.
|
||
|
/// </summary>
|
||
|
public abstract class VisitorBase : DocumentObjectVisitor
|
||
|
{
|
||
|
public override void Visit(DocumentObject documentObject)
|
||
|
{
|
||
|
IVisitable visitable = documentObject as IVisitable;
|
||
|
if (visitable != null)
|
||
|
visitable.AcceptVisitor(this, true);
|
||
|
}
|
||
|
|
||
|
protected void FlattenParagraphFormat(ParagraphFormat format, ParagraphFormat refFormat)
|
||
|
{
|
||
|
if (format._alignment.IsNull)
|
||
|
format._alignment = refFormat._alignment;
|
||
|
|
||
|
if (format._firstLineIndent.IsNull)
|
||
|
format._firstLineIndent = refFormat._firstLineIndent;
|
||
|
|
||
|
if (format._leftIndent.IsNull)
|
||
|
format._leftIndent = refFormat._leftIndent;
|
||
|
|
||
|
if (format._rightIndent.IsNull)
|
||
|
format._rightIndent = refFormat._rightIndent;
|
||
|
|
||
|
if (format._spaceBefore.IsNull)
|
||
|
format._spaceBefore = refFormat._spaceBefore;
|
||
|
|
||
|
if (format._spaceAfter.IsNull)
|
||
|
format._spaceAfter = refFormat._spaceAfter;
|
||
|
|
||
|
if (format._lineSpacingRule.IsNull)
|
||
|
format._lineSpacingRule = refFormat._lineSpacingRule;
|
||
|
if (format._lineSpacing.IsNull)
|
||
|
format._lineSpacing = refFormat._lineSpacing;
|
||
|
|
||
|
if (format._widowControl.IsNull)
|
||
|
format._widowControl = refFormat._widowControl;
|
||
|
|
||
|
if (format._keepTogether.IsNull)
|
||
|
format._keepTogether = refFormat._keepTogether;
|
||
|
|
||
|
if (format._keepWithNext.IsNull)
|
||
|
format._keepWithNext = refFormat._keepWithNext;
|
||
|
|
||
|
if (format._pageBreakBefore.IsNull)
|
||
|
format._pageBreakBefore = refFormat._pageBreakBefore;
|
||
|
|
||
|
if (format._outlineLevel.IsNull)
|
||
|
format._outlineLevel = refFormat._outlineLevel;
|
||
|
|
||
|
if (format._font == null)
|
||
|
{
|
||
|
if (refFormat._font != null)
|
||
|
{
|
||
|
//The font is cloned here to avoid parent problems
|
||
|
format._font = refFormat._font.Clone();
|
||
|
format._font._parent = format;
|
||
|
}
|
||
|
}
|
||
|
else if (refFormat._font != null)
|
||
|
FlattenFont(format._font, refFormat._font);
|
||
|
|
||
|
if (format._shading == null)
|
||
|
{
|
||
|
if (refFormat._shading != null)
|
||
|
{
|
||
|
format._shading = refFormat._shading.Clone();
|
||
|
format._shading._parent = format;
|
||
|
}
|
||
|
//format.shading = refFormat.shading;
|
||
|
}
|
||
|
else if (refFormat._shading != null)
|
||
|
FlattenShading(format._shading, refFormat._shading);
|
||
|
|
||
|
if (format._borders == null)
|
||
|
format._borders = refFormat._borders;
|
||
|
else if (refFormat._borders != null)
|
||
|
FlattenBorders(format._borders, refFormat._borders);
|
||
|
|
||
|
//if (format.tabStops == null)
|
||
|
// format.tabStops = refFormat.tabStops;
|
||
|
if (refFormat._tabStops != null)
|
||
|
FlattenTabStops(format.TabStops, refFormat._tabStops);
|
||
|
|
||
|
if (refFormat._listInfo != null)
|
||
|
FlattenListInfo(format.ListInfo, refFormat._listInfo);
|
||
|
}
|
||
|
|
||
|
protected void FlattenListInfo(ListInfo listInfo, ListInfo refListInfo)
|
||
|
{
|
||
|
if (listInfo._continuePreviousList.IsNull)
|
||
|
listInfo._continuePreviousList = refListInfo._continuePreviousList;
|
||
|
if (listInfo._listType.IsNull)
|
||
|
listInfo._listType = refListInfo._listType;
|
||
|
if (listInfo._numberPosition.IsNull)
|
||
|
listInfo._numberPosition = refListInfo._numberPosition;
|
||
|
}
|
||
|
|
||
|
protected void FlattenFont(Font font, Font refFont)
|
||
|
{
|
||
|
if (font._name.IsNull)
|
||
|
font._name = refFont._name;
|
||
|
if (font._size.IsNull)
|
||
|
font._size = refFont._size;
|
||
|
if (font._color.IsNull)
|
||
|
font._color = refFont._color;
|
||
|
if (font._underline.IsNull)
|
||
|
font._underline = refFont._underline;
|
||
|
if (font._bold.IsNull)
|
||
|
font._bold = refFont._bold;
|
||
|
if (font._italic.IsNull)
|
||
|
font._italic = refFont._italic;
|
||
|
if (font._superscript.IsNull)
|
||
|
font._superscript = refFont._superscript;
|
||
|
if (font._subscript.IsNull)
|
||
|
font._subscript = refFont._subscript;
|
||
|
}
|
||
|
|
||
|
protected void FlattenShading(Shading shading, Shading refShading)
|
||
|
{
|
||
|
//fClear?
|
||
|
if (shading._visible.IsNull)
|
||
|
shading._visible = refShading._visible;
|
||
|
if (shading._color.IsNull)
|
||
|
shading._color = refShading._color;
|
||
|
}
|
||
|
|
||
|
protected Border FlattenedBorderFromBorders(Border border, Borders parentBorders)
|
||
|
{
|
||
|
if (border == null)
|
||
|
border = new Border(parentBorders);
|
||
|
|
||
|
if (border._visible.IsNull)
|
||
|
border._visible = parentBorders._visible;
|
||
|
|
||
|
if (border._style.IsNull)
|
||
|
border._style = parentBorders._style;
|
||
|
|
||
|
if (border._width.IsNull)
|
||
|
border._width = parentBorders._width;
|
||
|
|
||
|
if (border._color.IsNull)
|
||
|
border._color = parentBorders._color;
|
||
|
|
||
|
return border;
|
||
|
}
|
||
|
|
||
|
protected void FlattenBorders(Borders borders, Borders refBorders)
|
||
|
{
|
||
|
if (borders._visible.IsNull)
|
||
|
borders._visible = refBorders._visible;
|
||
|
if (borders._width.IsNull)
|
||
|
borders._width = refBorders._width;
|
||
|
if (borders._style.IsNull)
|
||
|
borders._style = refBorders._style;
|
||
|
if (borders._color.IsNull)
|
||
|
borders._color = refBorders._color;
|
||
|
|
||
|
if (borders._distanceFromBottom.IsNull)
|
||
|
borders._distanceFromBottom = refBorders._distanceFromBottom;
|
||
|
if (borders._distanceFromRight.IsNull)
|
||
|
borders._distanceFromRight = refBorders._distanceFromRight;
|
||
|
if (borders._distanceFromLeft.IsNull)
|
||
|
borders._distanceFromLeft = refBorders._distanceFromLeft;
|
||
|
if (borders._distanceFromTop.IsNull)
|
||
|
borders._distanceFromTop = refBorders._distanceFromTop;
|
||
|
|
||
|
if (refBorders._left != null)
|
||
|
{
|
||
|
FlattenBorder(borders.Left, refBorders._left);
|
||
|
FlattenedBorderFromBorders(borders._left, borders);
|
||
|
}
|
||
|
if (refBorders._right != null)
|
||
|
{
|
||
|
FlattenBorder(borders.Right, refBorders._right);
|
||
|
FlattenedBorderFromBorders(borders._right, borders);
|
||
|
}
|
||
|
if (refBorders._top != null)
|
||
|
{
|
||
|
FlattenBorder(borders.Top, refBorders._top);
|
||
|
FlattenedBorderFromBorders(borders._top, borders);
|
||
|
}
|
||
|
if (refBorders._bottom != null)
|
||
|
{
|
||
|
FlattenBorder(borders.Bottom, refBorders._bottom);
|
||
|
FlattenedBorderFromBorders(borders._bottom, borders);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
protected void FlattenBorder(Border border, Border refBorder)
|
||
|
{
|
||
|
if (border._visible.IsNull)
|
||
|
border._visible = refBorder._visible;
|
||
|
if (border._width.IsNull)
|
||
|
border._width = refBorder._width;
|
||
|
if (border._style.IsNull)
|
||
|
border._style = refBorder._style;
|
||
|
if (border._color.IsNull)
|
||
|
border._color = refBorder._color;
|
||
|
}
|
||
|
|
||
|
protected void FlattenTabStops(TabStops tabStops, TabStops refTabStops)
|
||
|
{
|
||
|
if (!tabStops._fClearAll)
|
||
|
{
|
||
|
foreach (TabStop refTabStop in refTabStops)
|
||
|
{
|
||
|
if (tabStops.GetTabStopAt(refTabStop.Position) == null && refTabStop.AddTab)
|
||
|
tabStops.AddTabStop(refTabStop.Position, refTabStop.Alignment, refTabStop.Leader);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
for (int i = 0; i < tabStops.Count; i++)
|
||
|
{
|
||
|
TabStop tabStop = tabStops[i];
|
||
|
if (!tabStop.AddTab)
|
||
|
tabStops.RemoveObjectAt(i);
|
||
|
}
|
||
|
// The TabStopCollection is complete now.
|
||
|
// Prevent inheritence of tab stops.
|
||
|
tabStops._fClearAll = true;
|
||
|
}
|
||
|
|
||
|
protected void FlattenPageSetup(PageSetup pageSetup, PageSetup refPageSetup)
|
||
|
{
|
||
|
if (pageSetup._pageWidth.IsNull && pageSetup._pageHeight.IsNull)
|
||
|
{
|
||
|
if (pageSetup._pageFormat.IsNull)
|
||
|
{
|
||
|
pageSetup._pageWidth = refPageSetup._pageWidth;
|
||
|
pageSetup._pageHeight = refPageSetup._pageHeight;
|
||
|
pageSetup._pageFormat = refPageSetup._pageFormat;
|
||
|
}
|
||
|
else
|
||
|
PageSetup.GetPageSize(pageSetup.PageFormat, out pageSetup._pageWidth, out pageSetup._pageHeight);
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
Unit dummyUnit;
|
||
|
if (pageSetup._pageWidth.IsNull)
|
||
|
{
|
||
|
if (pageSetup._pageFormat.IsNull)
|
||
|
pageSetup._pageHeight = refPageSetup._pageHeight;
|
||
|
else
|
||
|
PageSetup.GetPageSize(pageSetup.PageFormat, out dummyUnit, out pageSetup._pageHeight);
|
||
|
}
|
||
|
else if (pageSetup._pageHeight.IsNull)
|
||
|
{
|
||
|
if (pageSetup._pageFormat.IsNull)
|
||
|
pageSetup._pageWidth = refPageSetup._pageWidth;
|
||
|
else
|
||
|
PageSetup.GetPageSize(pageSetup.PageFormat, out pageSetup._pageWidth, out dummyUnit);
|
||
|
}
|
||
|
}
|
||
|
// if (pageSetup.pageWidth.IsNull)
|
||
|
// pageSetup.pageWidth = refPageSetup.pageWidth;
|
||
|
// if (pageSetup.pageHeight.IsNull)
|
||
|
// pageSetup.pageHeight = refPageSetup.pageHeight;
|
||
|
// if (pageSetup.pageFormat.IsNull)
|
||
|
// pageSetup.pageFormat = refPageSetup.pageFormat;
|
||
|
if (pageSetup._sectionStart.IsNull)
|
||
|
pageSetup._sectionStart = refPageSetup._sectionStart;
|
||
|
if (pageSetup._orientation.IsNull)
|
||
|
pageSetup._orientation = refPageSetup._orientation;
|
||
|
if (pageSetup._topMargin.IsNull)
|
||
|
pageSetup._topMargin = refPageSetup._topMargin;
|
||
|
if (pageSetup._bottomMargin.IsNull)
|
||
|
pageSetup._bottomMargin = refPageSetup._bottomMargin;
|
||
|
if (pageSetup._leftMargin.IsNull)
|
||
|
pageSetup._leftMargin = refPageSetup._leftMargin;
|
||
|
if (pageSetup._rightMargin.IsNull)
|
||
|
pageSetup._rightMargin = refPageSetup._rightMargin;
|
||
|
if (pageSetup._headerDistance.IsNull)
|
||
|
pageSetup._headerDistance = refPageSetup._headerDistance;
|
||
|
if (pageSetup._footerDistance.IsNull)
|
||
|
pageSetup._footerDistance = refPageSetup._footerDistance;
|
||
|
if (pageSetup._oddAndEvenPagesHeaderFooter.IsNull)
|
||
|
pageSetup._oddAndEvenPagesHeaderFooter = refPageSetup._oddAndEvenPagesHeaderFooter;
|
||
|
if (pageSetup._differentFirstPageHeaderFooter.IsNull)
|
||
|
pageSetup._differentFirstPageHeaderFooter = refPageSetup._differentFirstPageHeaderFooter;
|
||
|
if (pageSetup._mirrorMargins.IsNull)
|
||
|
pageSetup._mirrorMargins = refPageSetup._mirrorMargins;
|
||
|
if (pageSetup._horizontalPageBreak.IsNull)
|
||
|
pageSetup._horizontalPageBreak = refPageSetup._horizontalPageBreak;
|
||
|
}
|
||
|
|
||
|
protected void FlattenHeaderFooter(HeaderFooter headerFooter, bool isHeader)
|
||
|
{ }
|
||
|
|
||
|
protected void FlattenFillFormat(FillFormat fillFormat)
|
||
|
{ }
|
||
|
|
||
|
protected void FlattenLineFormat(LineFormat lineFormat, LineFormat refLineFormat)
|
||
|
{
|
||
|
if (refLineFormat != null)
|
||
|
{
|
||
|
if (lineFormat._width.IsNull)
|
||
|
lineFormat._width = refLineFormat._width;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
protected void FlattenAxis(Axis axis)
|
||
|
{
|
||
|
if (axis == null)
|
||
|
return;
|
||
|
|
||
|
LineFormat refLineFormat = new LineFormat();
|
||
|
refLineFormat._width = 0.15;
|
||
|
if (axis._hasMajorGridlines.Value && axis._majorGridlines != null)
|
||
|
FlattenLineFormat(axis._majorGridlines._lineFormat, refLineFormat);
|
||
|
if (axis._hasMinorGridlines.Value && axis._minorGridlines != null)
|
||
|
FlattenLineFormat(axis._minorGridlines._lineFormat, refLineFormat);
|
||
|
|
||
|
refLineFormat._width = 0.4;
|
||
|
if (axis._lineFormat != null)
|
||
|
FlattenLineFormat(axis._lineFormat, refLineFormat);
|
||
|
|
||
|
// axis.majorTick;
|
||
|
// axis.majorTickMark;
|
||
|
// axis.minorTick;
|
||
|
// axis.minorTickMark;
|
||
|
|
||
|
// axis.maximumScale;
|
||
|
// axis.minimumScale;
|
||
|
|
||
|
// axis.tickLabels;
|
||
|
// axis.title;
|
||
|
}
|
||
|
|
||
|
protected void FlattenPlotArea(PlotArea plotArea)
|
||
|
{ }
|
||
|
|
||
|
protected void FlattenDataLabel(DataLabel dataLabel)
|
||
|
{ }
|
||
|
|
||
|
|
||
|
#region Chart
|
||
|
public override void VisitChart(Chart chart)
|
||
|
{
|
||
|
Document document = chart.Document;
|
||
|
if (chart._style.IsNull)
|
||
|
chart._style.Value = Style.DefaultParagraphName;
|
||
|
Style style = document.Styles[chart._style.Value];
|
||
|
if (chart._format == null)
|
||
|
{
|
||
|
chart._format = style._paragraphFormat.Clone();
|
||
|
chart._format._parent = chart;
|
||
|
}
|
||
|
else
|
||
|
FlattenParagraphFormat(chart._format, style._paragraphFormat);
|
||
|
|
||
|
|
||
|
FlattenLineFormat(chart._lineFormat, null);
|
||
|
FlattenFillFormat(chart._fillFormat);
|
||
|
|
||
|
FlattenAxis(chart._xAxis);
|
||
|
FlattenAxis(chart._yAxis);
|
||
|
FlattenAxis(chart._zAxis);
|
||
|
|
||
|
FlattenPlotArea(chart._plotArea);
|
||
|
|
||
|
// if (this .hasDataLabel.Value)
|
||
|
FlattenDataLabel(chart._dataLabel);
|
||
|
|
||
|
}
|
||
|
#endregion
|
||
|
|
||
|
#region Document
|
||
|
public override void VisitDocument(Document document)
|
||
|
{
|
||
|
}
|
||
|
|
||
|
public override void VisitDocumentElements(DocumentElements elements)
|
||
|
{
|
||
|
}
|
||
|
#endregion
|
||
|
|
||
|
#region Format
|
||
|
public override void VisitStyle(Style style)
|
||
|
{
|
||
|
Style baseStyle = style.GetBaseStyle();
|
||
|
if (baseStyle != null && baseStyle._paragraphFormat != null)
|
||
|
{
|
||
|
if (style._paragraphFormat == null)
|
||
|
style._paragraphFormat = baseStyle._paragraphFormat;
|
||
|
else
|
||
|
FlattenParagraphFormat(style._paragraphFormat, baseStyle._paragraphFormat);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
public override void VisitStyles(Styles styles)
|
||
|
{
|
||
|
}
|
||
|
#endregion
|
||
|
|
||
|
#region Paragraph
|
||
|
public override void VisitFootnote(Footnote footnote)
|
||
|
{
|
||
|
Document document = footnote.Document;
|
||
|
|
||
|
ParagraphFormat format = null;
|
||
|
|
||
|
Style style = document._styles[footnote._style.Value];
|
||
|
if (style != null)
|
||
|
format = ParagraphFormatFromStyle(style);
|
||
|
else
|
||
|
{
|
||
|
footnote.Style = StyleNames.Footnote;
|
||
|
format = document._styles[StyleNames.Footnote]._paragraphFormat;
|
||
|
}
|
||
|
|
||
|
if (footnote._format == null)
|
||
|
{
|
||
|
footnote._format = format.Clone();
|
||
|
footnote._format._parent = footnote;
|
||
|
}
|
||
|
else
|
||
|
FlattenParagraphFormat(footnote._format, format);
|
||
|
|
||
|
}
|
||
|
|
||
|
public override void VisitParagraph(Paragraph paragraph)
|
||
|
{
|
||
|
Document document = paragraph.Document;
|
||
|
|
||
|
ParagraphFormat format;
|
||
|
|
||
|
DocumentObject currentElementHolder = GetDocumentElementHolder(paragraph);
|
||
|
Style style = document._styles[paragraph._style.Value];
|
||
|
if (style != null)
|
||
|
format = ParagraphFormatFromStyle(style);
|
||
|
|
||
|
else if (currentElementHolder is Cell)
|
||
|
{
|
||
|
paragraph._style = ((Cell)currentElementHolder)._style;
|
||
|
format = ((Cell)currentElementHolder)._format;
|
||
|
}
|
||
|
else if (currentElementHolder is HeaderFooter)
|
||
|
{
|
||
|
HeaderFooter currHeaderFooter = ((HeaderFooter)currentElementHolder);
|
||
|
if (currHeaderFooter.IsHeader)
|
||
|
{
|
||
|
paragraph.Style = StyleNames.Header;
|
||
|
format = document._styles[StyleNames.Header]._paragraphFormat;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
paragraph.Style = StyleNames.Footer;
|
||
|
format = document._styles[StyleNames.Footer]._paragraphFormat;
|
||
|
}
|
||
|
|
||
|
if (currHeaderFooter._format != null)
|
||
|
FlattenParagraphFormat(paragraph.Format, currHeaderFooter._format);
|
||
|
}
|
||
|
else if (currentElementHolder is Footnote)
|
||
|
{
|
||
|
paragraph.Style = StyleNames.Footnote;
|
||
|
format = document._styles[StyleNames.Footnote]._paragraphFormat;
|
||
|
}
|
||
|
else if (currentElementHolder is TextArea)
|
||
|
{
|
||
|
paragraph._style = ((TextArea)currentElementHolder)._style;
|
||
|
format = ((TextArea)currentElementHolder)._format;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
if (paragraph._style.Value != "")
|
||
|
paragraph.Style = StyleNames.InvalidStyleName;
|
||
|
else
|
||
|
paragraph.Style = StyleNames.Normal;
|
||
|
format = document._styles[paragraph.Style]._paragraphFormat;
|
||
|
}
|
||
|
|
||
|
if (paragraph._format == null)
|
||
|
{
|
||
|
paragraph._format = format.Clone();
|
||
|
paragraph._format._parent = paragraph;
|
||
|
}
|
||
|
else
|
||
|
FlattenParagraphFormat(paragraph._format, format);
|
||
|
}
|
||
|
#endregion
|
||
|
|
||
|
#region Section
|
||
|
public override void VisitHeaderFooter(HeaderFooter headerFooter)
|
||
|
{
|
||
|
Document document = headerFooter.Document;
|
||
|
string styleString;
|
||
|
if (headerFooter.IsHeader)
|
||
|
styleString = StyleNames.Header;
|
||
|
else
|
||
|
styleString = StyleNames.Footer;
|
||
|
|
||
|
ParagraphFormat format;
|
||
|
Style style = document._styles[headerFooter._style.Value];
|
||
|
if (style != null)
|
||
|
format = ParagraphFormatFromStyle(style);
|
||
|
else
|
||
|
{
|
||
|
format = document._styles[styleString]._paragraphFormat;
|
||
|
headerFooter.Style = styleString;
|
||
|
}
|
||
|
|
||
|
if (headerFooter._format == null)
|
||
|
{
|
||
|
headerFooter._format = format.Clone();
|
||
|
headerFooter._format._parent = headerFooter;
|
||
|
}
|
||
|
else
|
||
|
FlattenParagraphFormat(headerFooter._format, format);
|
||
|
}
|
||
|
|
||
|
public override void VisitHeadersFooters(HeadersFooters headersFooters)
|
||
|
{
|
||
|
}
|
||
|
|
||
|
public override void VisitSection(Section section)
|
||
|
{
|
||
|
Section prevSec = section.PreviousSection();
|
||
|
PageSetup prevPageSetup = PageSetup.DefaultPageSetup;
|
||
|
if (prevSec != null)
|
||
|
{
|
||
|
prevPageSetup = prevSec._pageSetup;
|
||
|
|
||
|
if (!section.Headers.HasHeaderFooter(HeaderFooterIndex.Primary))
|
||
|
section.Headers._primary = prevSec.Headers._primary;
|
||
|
if (!section.Headers.HasHeaderFooter(HeaderFooterIndex.EvenPage))
|
||
|
section.Headers._evenPage = prevSec.Headers._evenPage;
|
||
|
if (!section.Headers.HasHeaderFooter(HeaderFooterIndex.FirstPage))
|
||
|
section.Headers._firstPage = prevSec.Headers._firstPage;
|
||
|
|
||
|
if (!section.Footers.HasHeaderFooter(HeaderFooterIndex.Primary))
|
||
|
section.Footers._primary = prevSec.Footers._primary;
|
||
|
if (!section.Footers.HasHeaderFooter(HeaderFooterIndex.EvenPage))
|
||
|
section.Footers._evenPage = prevSec.Footers._evenPage;
|
||
|
if (!section.Footers.HasHeaderFooter(HeaderFooterIndex.FirstPage))
|
||
|
section.Footers._firstPage = prevSec.Footers._firstPage;
|
||
|
}
|
||
|
|
||
|
if (section._pageSetup == null)
|
||
|
section._pageSetup = prevPageSetup;
|
||
|
else
|
||
|
FlattenPageSetup(section._pageSetup, prevPageSetup);
|
||
|
}
|
||
|
|
||
|
public override void VisitSections(Sections sections)
|
||
|
{
|
||
|
}
|
||
|
#endregion
|
||
|
|
||
|
#region Shape
|
||
|
public override void VisitTextFrame(TextFrame textFrame)
|
||
|
{
|
||
|
if (textFrame._height.IsNull)
|
||
|
textFrame._height = Unit.FromInch(1);
|
||
|
if (textFrame._width.IsNull)
|
||
|
textFrame._width = Unit.FromInch(1);
|
||
|
}
|
||
|
#endregion
|
||
|
|
||
|
#region Table
|
||
|
public override void VisitCell(Cell cell)
|
||
|
{
|
||
|
// format, shading and borders are already processed.
|
||
|
}
|
||
|
|
||
|
public override void VisitColumns(Columns columns)
|
||
|
{
|
||
|
foreach (Column col in columns)
|
||
|
{
|
||
|
if (col._width.IsNull)
|
||
|
col._width = columns._width;
|
||
|
|
||
|
if (col._width.IsNull)
|
||
|
col._width = "2.5cm";
|
||
|
}
|
||
|
}
|
||
|
|
||
|
public override void VisitRow(Row row)
|
||
|
{
|
||
|
foreach (Cell cell in row.Cells)
|
||
|
{
|
||
|
if (cell._verticalAlignment.IsNull)
|
||
|
cell._verticalAlignment = row._verticalAlignment;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
public override void VisitRows(Rows rows)
|
||
|
{
|
||
|
foreach (Row row in rows)
|
||
|
{
|
||
|
if (row._height.IsNull)
|
||
|
row._height = rows._height;
|
||
|
if (row._heightRule.IsNull)
|
||
|
row._heightRule = rows._heightRule;
|
||
|
if (row._verticalAlignment.IsNull)
|
||
|
row._verticalAlignment = rows._verticalAlignment;
|
||
|
}
|
||
|
}
|
||
|
/// <summary>
|
||
|
/// Returns a paragraph format object initialized by the given style.
|
||
|
/// It differs from style.ParagraphFormat if style is a character style.
|
||
|
/// </summary>
|
||
|
ParagraphFormat ParagraphFormatFromStyle(Style style)
|
||
|
{
|
||
|
if (style.Type == StyleType.Character)
|
||
|
{
|
||
|
Document doc = style.Document;
|
||
|
ParagraphFormat format = style._paragraphFormat.Clone();
|
||
|
FlattenParagraphFormat(format, doc.Styles.Normal.ParagraphFormat);
|
||
|
return format;
|
||
|
}
|
||
|
else
|
||
|
return style._paragraphFormat;
|
||
|
}
|
||
|
|
||
|
public override void VisitTable(Table table)
|
||
|
{
|
||
|
Document document = table.Document;
|
||
|
|
||
|
if (table._leftPadding.IsNull)
|
||
|
table._leftPadding = Unit.FromMillimeter(1.2);
|
||
|
if (table._rightPadding.IsNull)
|
||
|
table._rightPadding = Unit.FromMillimeter(1.2);
|
||
|
|
||
|
ParagraphFormat format;
|
||
|
Style style = document._styles[table._style.Value];
|
||
|
if (style != null)
|
||
|
format = ParagraphFormatFromStyle(style);
|
||
|
else
|
||
|
{
|
||
|
table.Style = "Normal";
|
||
|
format = document._styles.Normal._paragraphFormat;
|
||
|
}
|
||
|
|
||
|
if (table._format == null)
|
||
|
{
|
||
|
table._format = format.Clone();
|
||
|
table._format._parent = table;
|
||
|
}
|
||
|
else
|
||
|
FlattenParagraphFormat(table._format, format);
|
||
|
|
||
|
int rows = table.Rows.Count;
|
||
|
int clms = table.Columns.Count;
|
||
|
|
||
|
for (int idxclm = 0; idxclm < clms; idxclm++)
|
||
|
{
|
||
|
Column column = table.Columns[idxclm];
|
||
|
ParagraphFormat colFormat;
|
||
|
style = document._styles[column._style.Value];
|
||
|
if (style != null)
|
||
|
colFormat = ParagraphFormatFromStyle(style);
|
||
|
else
|
||
|
{
|
||
|
column._style = table._style;
|
||
|
colFormat = table.Format;
|
||
|
}
|
||
|
|
||
|
if (column._format == null)
|
||
|
{
|
||
|
column._format = colFormat.Clone();
|
||
|
column._format._parent = column;
|
||
|
if (column._format._shading == null && table._format._shading != null)
|
||
|
column._format._shading = table._format._shading;
|
||
|
}
|
||
|
else
|
||
|
FlattenParagraphFormat(column._format, colFormat);
|
||
|
|
||
|
if (column._leftPadding.IsNull)
|
||
|
column._leftPadding = table._leftPadding;
|
||
|
if (column._rightPadding.IsNull)
|
||
|
column._rightPadding = table._rightPadding;
|
||
|
|
||
|
if (column._shading == null)
|
||
|
column._shading = table._shading;
|
||
|
|
||
|
else if (table._shading != null)
|
||
|
FlattenShading(column._shading, table._shading);
|
||
|
|
||
|
if (column._borders == null)
|
||
|
column._borders = table._borders;
|
||
|
else if (table._borders != null)
|
||
|
FlattenBorders(column._borders, table._borders);
|
||
|
}
|
||
|
|
||
|
for (int idxrow = 0; idxrow < rows; idxrow++)
|
||
|
{
|
||
|
Row row = table.Rows[idxrow];
|
||
|
|
||
|
ParagraphFormat rowFormat;
|
||
|
style = document._styles[row._style.Value];
|
||
|
if (style != null)
|
||
|
{
|
||
|
rowFormat = ParagraphFormatFromStyle(style);
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
row._style = table._style;
|
||
|
rowFormat = table.Format;
|
||
|
}
|
||
|
|
||
|
for (int idxclm = 0; idxclm < clms; idxclm++)
|
||
|
{
|
||
|
Column column = table.Columns[idxclm];
|
||
|
Cell cell = row[idxclm];
|
||
|
|
||
|
ParagraphFormat cellFormat;
|
||
|
Style cellStyle = document._styles[cell._style.Value];
|
||
|
if (cellStyle != null)
|
||
|
{
|
||
|
cellFormat = ParagraphFormatFromStyle(cellStyle);
|
||
|
|
||
|
if (cell._format == null)
|
||
|
cell._format = cellFormat;
|
||
|
else
|
||
|
FlattenParagraphFormat(cell._format, cellFormat);
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
if (row._format != null)
|
||
|
FlattenParagraphFormat(cell.Format, row._format);
|
||
|
|
||
|
if (style != null)
|
||
|
{
|
||
|
cell._style = row._style;
|
||
|
FlattenParagraphFormat(cell.Format, rowFormat);
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
cell._style = column._style;
|
||
|
FlattenParagraphFormat(cell.Format, column._format);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
if (cell._format._shading == null && table._format._shading != null)
|
||
|
cell._format._shading = table._format._shading;
|
||
|
|
||
|
if (cell._shading == null)
|
||
|
cell._shading = row._shading;
|
||
|
else if (row._shading != null)
|
||
|
FlattenShading(cell._shading, row._shading);
|
||
|
if (cell._shading == null)
|
||
|
cell._shading = column._shading;
|
||
|
else if (column._shading != null)
|
||
|
FlattenShading(cell._shading, column._shading);
|
||
|
if (cell._borders == null)
|
||
|
CloneHelper(ref cell._borders, row._borders);
|
||
|
else if (row._borders != null)
|
||
|
FlattenBorders(cell._borders, row._borders);
|
||
|
if (cell._borders == null)
|
||
|
cell._borders = column._borders;
|
||
|
else if (column._borders != null)
|
||
|
FlattenBorders(cell._borders, column._borders);
|
||
|
}
|
||
|
|
||
|
if (row._format == null)
|
||
|
{
|
||
|
row._format = rowFormat.Clone();
|
||
|
row._format._parent = row;
|
||
|
if (row._format._shading == null && table._format._shading != null)
|
||
|
row._format._shading = table._format._shading;
|
||
|
}
|
||
|
else
|
||
|
FlattenParagraphFormat(row._format, rowFormat);
|
||
|
|
||
|
if (row._topPadding.IsNull)
|
||
|
row._topPadding = table._topPadding;
|
||
|
if (row._bottomPadding.IsNull)
|
||
|
row._bottomPadding = table._bottomPadding;
|
||
|
|
||
|
if (row._shading == null)
|
||
|
row._shading = table._shading;
|
||
|
else if (table._shading != null)
|
||
|
FlattenShading(row._shading, table._shading);
|
||
|
|
||
|
if (row._borders == null)
|
||
|
row._borders = table._borders;
|
||
|
else if (table._borders != null)
|
||
|
FlattenBorders(row._borders, table._borders);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
private void CloneHelper(ref Borders borders, Borders source)
|
||
|
{
|
||
|
if (source != null)
|
||
|
{
|
||
|
borders = source.Clone();
|
||
|
borders._parent = source._parent;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
#endregion
|
||
|
|
||
|
public override void VisitLegend(Legend legend)
|
||
|
{
|
||
|
ParagraphFormat parentFormat;
|
||
|
if (!legend._style.IsNull)
|
||
|
{
|
||
|
Style style = legend.Document.Styles[legend.Style];
|
||
|
if (style == null)
|
||
|
style = legend.Document.Styles[StyleNames.InvalidStyleName];
|
||
|
|
||
|
parentFormat = style._paragraphFormat;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
TextArea textArea = (TextArea)GetDocumentElementHolder(legend);
|
||
|
legend._style = textArea._style;
|
||
|
parentFormat = textArea._format;
|
||
|
}
|
||
|
if (legend._format == null)
|
||
|
legend.Format = parentFormat.Clone();
|
||
|
else
|
||
|
FlattenParagraphFormat(legend._format, parentFormat);
|
||
|
}
|
||
|
|
||
|
public override void VisitTextArea(TextArea textArea)
|
||
|
{
|
||
|
if (textArea == null || textArea._elements == null)
|
||
|
return;
|
||
|
|
||
|
Document document = textArea.Document;
|
||
|
|
||
|
ParagraphFormat parentFormat;
|
||
|
|
||
|
if (!textArea._style.IsNull)
|
||
|
{
|
||
|
Style style = textArea.Document.Styles[textArea.Style];
|
||
|
if (style == null)
|
||
|
style = textArea.Document.Styles[StyleNames.InvalidStyleName];
|
||
|
|
||
|
parentFormat = style._paragraphFormat;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
Chart chart = (Chart)textArea._parent;
|
||
|
parentFormat = chart._format;
|
||
|
textArea._style = chart._style;
|
||
|
}
|
||
|
|
||
|
if (textArea._format == null)
|
||
|
textArea.Format = parentFormat.Clone();
|
||
|
else
|
||
|
FlattenParagraphFormat(textArea._format, parentFormat);
|
||
|
|
||
|
FlattenFillFormat(textArea._fillFormat);
|
||
|
FlattenLineFormat(textArea._lineFormat, null);
|
||
|
}
|
||
|
|
||
|
private DocumentObject GetDocumentElementHolder(DocumentObject docObj)
|
||
|
{
|
||
|
DocumentElements docEls = (DocumentElements)docObj._parent;
|
||
|
return docEls._parent;
|
||
|
}
|
||
|
}
|
||
|
}
|