This commit is contained in:
2021-05-25 17:00:45 +05:00
parent e2fcfed44c
commit ec2dac13d8
1172 changed files with 5636 additions and 5839 deletions

View File

@@ -0,0 +1,93 @@
#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 System.Collections.Generic;
using MigraDoc.DocumentObjectModel.Tables;
namespace MigraDoc.DocumentObjectModel.Visitors
{
/// <summary>
/// Comparer for the cell positions within a table.
/// It compares the cell positions from top to bottom and left to right.
/// </summary>
public class CellComparer : IComparer<Cell>
{
// AG_HACK
//public int Compare(object lhs, object rhs)
//{
// if (!(lhs is Cell))
// throw new ArgumentException(DomSR.CompareJustCells, "lhs");
// if (!(rhs is Cell))
// throw new ArgumentException(DomSR.CompareJustCells, "rhs");
// Cell cellLhs = lhs as Cell;
// Cell cellRhs = rhs as Cell;
// int rowCmpr = cellLhs.Row.Index - cellRhs.Row.Index;
// if (rowCmpr != 0)
// return rowCmpr;
// return cellLhs.Column.Index - cellRhs.Column.Index;
//}
//int IComparer<object>.Compare(object lhs, object rhs)
//{
// if (!(lhs is Cell))
// throw new ArgumentException(DomSR.CompareJustCells, "lhs");
// if (!(rhs is Cell))
// throw new ArgumentException(DomSR.CompareJustCells, "rhs");
// Cell cellLhs = lhs as Cell;
// Cell cellRhs = rhs as Cell;
// int rowCmpr = cellLhs.Row.Index - cellRhs.Row.Index;
// if (rowCmpr != 0)
// return rowCmpr;
// return cellLhs.Column.Index - cellRhs.Column.Index;
//}
/// <summary>
/// Compares the specified cells.
/// </summary>
/// <returns></returns>
public int Compare(Cell cellLhs, Cell cellRhs)
{
int rowCmpr = cellLhs.Row.Index - cellRhs.Row.Index;
if (rowCmpr != 0)
return rowCmpr;
return cellLhs.Column.Index - cellRhs.Column.Index;
}
}
}

View File

@@ -0,0 +1,91 @@
#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.Shapes;
using MigraDoc.DocumentObjectModel.Shapes.Charts;
using MigraDoc.DocumentObjectModel.Tables;
namespace MigraDoc.DocumentObjectModel.Visitors
{
/// <summary>
/// Represents the base visitor for the DocumentObject.
/// </summary>
public abstract class DocumentObjectVisitor
{
/// <summary>
/// Visits the specified document object.
/// </summary>
public abstract void Visit(DocumentObject documentObject);
// Chart
public virtual void VisitChart(Chart chart) { }
public virtual void VisitTextArea(TextArea textArea) { }
public virtual void VisitLegend(Legend legend) { }
// Document
public virtual void VisitDocument(Document document) { }
public virtual void VisitDocumentElements(DocumentElements elements) { }
public virtual void VisitDocumentObjectCollection(DocumentObjectCollection elements) { }
// Fields
// Format
public virtual void VisitFont(Font font) { }
public virtual void VisitParagraphFormat(ParagraphFormat paragraphFormat) { }
public virtual void VisitShading(Shading shading) { }
public virtual void VisitStyle(Style style) { }
public virtual void VisitStyles(Styles styles) { }
// Paragraph
public virtual void VisitFootnote(Footnote footnote) { }
public virtual void VisitHyperlink(Hyperlink hyperlink) { }
public virtual void VisitFormattedText(FormattedText formattedText) { }
public virtual void VisitParagraph(Paragraph paragraph) { }
// Section
public virtual void VisitHeaderFooter(HeaderFooter headerFooter) { }
public virtual void VisitHeadersFooters(HeadersFooters headersFooters) { }
public virtual void VisitSection(Section section) { }
public virtual void VisitSections(Sections sections) { }
// Shape
public virtual void VisitImage(Image image) { }
public virtual void VisitTextFrame(TextFrame textFrame) { }
// Table
public virtual void VisitCell(Cell cell) { }
public virtual void VisitColumns(Columns columns) { }
public virtual void VisitRow(Row row) { }
public virtual void VisitRows(Rows rows) { }
public virtual void VisitTable(Table table) { }
}
}

View File

@@ -0,0 +1,42 @@
#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
namespace MigraDoc.DocumentObjectModel.Visitors
{
public interface IVisitable
{
/// <summary>
/// Allows the visitor object to visit the document object and its child objects.
/// </summary>
void AcceptVisitor(DocumentObjectVisitor visitor, bool visitChildren);
}
}

View File

@@ -0,0 +1,357 @@
#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 System;
using System.Collections.Generic;
using MigraDoc.DocumentObjectModel.Tables;
using MigraDoc.DocumentObjectModel.publics;
namespace MigraDoc.DocumentObjectModel.Visitors
{
/// <summary>
/// Represents a merged list of cells of a table.
/// </summary>
public class MergedCellList : List<Cell>
{
/// <summary>
/// Enumeration of neighbor positions of cells in a table.
/// </summary>
enum NeighborPosition
{
Top,
Left,
Right,
Bottom
}
/// <summary>
/// Initializes a new instance of the MergedCellList class.
/// </summary>
public MergedCellList(Table table)
{
Init(table);
}
/// <summary>
/// Initializes this instance from a table.
/// </summary>
private void Init(Table table)
{
for (int rwIdx = 0; rwIdx < table.Rows.Count; ++rwIdx)
{
for (int clmIdx = 0; clmIdx < table.Columns.Count; ++clmIdx)
{
Cell cell = table[rwIdx, clmIdx];
if (!IsAlreadyCovered(cell))
Add(cell);
}
}
}
/// <summary>
/// Returns whether the given cell is already covered by a preceding cell in this instance.
/// </summary>
/// <remarks>
/// Help function for Init().
/// </remarks>
private bool IsAlreadyCovered(Cell cell)
{
for (int index = Count - 1; index >= 0; --index)
{
Cell currentCell = this[index];
if (currentCell.Column.Index <= cell.Column.Index && currentCell.Column.Index + currentCell.MergeRight >= cell.Column.Index)
{
if (currentCell.Row.Index <= cell.Row.Index && currentCell.Row.Index + currentCell.MergeDown >= cell.Row.Index)
return true;
if (currentCell.Row.Index + currentCell.MergeDown == cell.Row.Index - 1)
return false;
}
}
return false;
}
/// <summary>
/// Gets the cell at the specified position.
/// </summary>
public new Cell this[int index]
{
get { return base[index]; }
}
/// <summary>
/// Gets a borders object that should be used for rendering.
/// </summary>
/// <exception cref="System.ArgumentException">
/// Thrown when the cell is not in this list.
/// This situation occurs if the given cell is merged "away" by a previous one.
/// </exception>
public Borders GetEffectiveBorders(Cell cell)
{
//Borders borders = cell.GetValue("Borders", GV.ReadOnly) as Borders;
Borders borders = cell._borders;
if (borders != null)
{
//Document doc = borders.Document;
borders = borders.Clone();
borders._parent = cell;
//doc = borders.Document;
}
else
borders = new Borders(cell._parent);
int cellIdx = BinarySearch(cell, new CellComparer());
if (!(cellIdx >= 0 && cellIdx < Count))
throw new ArgumentException("cell is not a relevant cell", "cell");
if (cell._mergeRight > 0)
{
Cell rightBorderCell = cell.Table[cell.Row.Index, cell.Column.Index + cell._mergeRight];
if (rightBorderCell._borders != null && rightBorderCell._borders._right != null)
borders.Right = rightBorderCell._borders._right.Clone();
else
borders._right = null;
}
if (cell._mergeDown > 0)
{
Cell bottomBorderCell = cell.Table[cell.Row.Index + cell._mergeDown, cell.Column.Index];
if (bottomBorderCell._borders != null && bottomBorderCell._borders._bottom != null)
borders.Bottom = bottomBorderCell._borders._bottom.Clone();
else
borders._bottom = null;
}
// For BorderTypes Top, Right, Bottom and Left update the width with the neighbours touching border where required.
// In case of rounded corners this should not be done.
Cell leftNeighbor = GetNeighbor(cellIdx, NeighborPosition.Left);
if (leftNeighbor != null && leftNeighbor.RoundedCorner != RoundedCorner.TopRight && leftNeighbor.RoundedCorner != RoundedCorner.BottomRight)
{
Borders nbrBrdrs = leftNeighbor.GetValue("Borders", GV.ReadWrite) as Borders;
if (nbrBrdrs != null && GetEffectiveBorderWidth(nbrBrdrs, BorderType.Right) >= GetEffectiveBorderWidth(borders, BorderType.Left))
borders.SetValue("Left", GetBorderFromBorders(nbrBrdrs, BorderType.Right));
}
Cell rightNeighbor = GetNeighbor(cellIdx, NeighborPosition.Right);
if (rightNeighbor != null && rightNeighbor.RoundedCorner != RoundedCorner.TopLeft && rightNeighbor.RoundedCorner != RoundedCorner.BottomLeft)
{
Borders nbrBrdrs = rightNeighbor.GetValue("Borders", GV.ReadWrite) as Borders;
if (nbrBrdrs != null && GetEffectiveBorderWidth(nbrBrdrs, BorderType.Left) > GetEffectiveBorderWidth(borders, BorderType.Right))
borders.SetValue("Right", GetBorderFromBorders(nbrBrdrs, BorderType.Left));
}
Cell topNeighbor = GetNeighbor(cellIdx, NeighborPosition.Top);
if (topNeighbor != null && topNeighbor.RoundedCorner != RoundedCorner.BottomLeft && topNeighbor.RoundedCorner != RoundedCorner.BottomRight)
{
Borders nbrBrdrs = topNeighbor.GetValue("Borders", GV.ReadWrite) as Borders;
if (nbrBrdrs != null && GetEffectiveBorderWidth(nbrBrdrs, BorderType.Bottom) >= GetEffectiveBorderWidth(borders, BorderType.Top))
borders.SetValue("Top", GetBorderFromBorders(nbrBrdrs, BorderType.Bottom));
}
Cell bottomNeighbor = GetNeighbor(cellIdx, NeighborPosition.Bottom);
if (bottomNeighbor != null && bottomNeighbor.RoundedCorner != RoundedCorner.TopLeft && bottomNeighbor.RoundedCorner != RoundedCorner.TopRight)
{
Borders nbrBrdrs = bottomNeighbor.GetValue("Borders", GV.ReadWrite) as Borders;
if (nbrBrdrs != null && GetEffectiveBorderWidth(nbrBrdrs, BorderType.Top) > GetEffectiveBorderWidth(borders, BorderType.Bottom))
borders.SetValue("Bottom", GetBorderFromBorders(nbrBrdrs, BorderType.Top));
}
return borders;
}
/// <summary>
/// Gets the cell that covers the given cell by merging. Usually the cell itself if not merged.
/// </summary>
public Cell GetCoveringCell(Cell cell)
{
int cellIdx = BinarySearch(cell, new CellComparer());
if (cellIdx >= 0 && cellIdx < Count)
return this[cellIdx];
// Binary Search returns the complement of the next value, therefore, "~cellIdx - 1" is the previous cell.
cellIdx = ~cellIdx - 1;
for (int index = cellIdx; index >= 0; --index)
{
Cell currCell = this[index];
if (currCell.Column.Index <= cell.Column.Index &&
currCell.Column.Index + currCell.MergeRight >= cell.Column.Index &&
currCell.Row.Index <= cell.Row.Index &&
currCell.Row.Index + currCell.MergeDown >= cell.Row.Index)
return currCell;
}
return null;
}
/// <summary>
/// Returns the border of the given borders-object of the specified type (top, bottom, ...).
/// If that border doesn't exist, it returns a new border object that inherits all properties from the given borders object
/// </summary>
private static Border GetBorderFromBorders(Borders borders, BorderType type)
{
Border returnBorder = borders.GetBorderReadOnly(type);
if (returnBorder == null)
{
returnBorder = new Border();
returnBorder._style = borders._style;
returnBorder._width = borders._width;
returnBorder._color = borders._color;
returnBorder._visible = borders._visible;
}
return returnBorder;
}
/// <summary>
/// Returns the width of the border at the specified position.
/// </summary>
private static Unit GetEffectiveBorderWidth(Borders borders, BorderType type)
{
if (borders == null)
return 0;
Border border = borders.GetBorderReadOnly(type);
DocumentObject relevantDocObj = border;
if (relevantDocObj == null || relevantDocObj.IsNull("Width"))
relevantDocObj = borders;
// Avoid unnecessary GetValue calls.
object visible = relevantDocObj.GetValue("visible", GV.GetNull);
if (visible != null && !(bool)visible)
return 0;
object width = relevantDocObj.GetValue("width", GV.GetNull);
if (width != null)
return (Unit)width;
object color = relevantDocObj.GetValue("color", GV.GetNull);
if (color != null)
return 0.5;
object style = relevantDocObj.GetValue("style", GV.GetNull);
if (style != null)
return 0.5;
return 0;
}
/// <summary>
/// Gets the specified cell's uppermost neighbor at the specified position.
/// </summary>
private Cell GetNeighbor(int cellIdx, NeighborPosition position)
{
Cell cell = this[cellIdx];
if (cell.Column.Index == 0 && position == NeighborPosition.Left ||
cell.Row.Index == 0 && position == NeighborPosition.Top ||
cell.Row.Index + cell.MergeDown == cell.Table.Rows.Count - 1 && position == NeighborPosition.Bottom ||
cell.Column.Index + cell.MergeRight == cell.Table.Columns.Count - 1 && position == NeighborPosition.Right)
return null;
switch (position)
{
case NeighborPosition.Top:
case NeighborPosition.Left:
for (int index = cellIdx - 1; index >= 0; --index)
{
Cell currCell = this[index];
if (IsNeighbor(cell, currCell, position))
return currCell;
}
break;
case NeighborPosition.Right:
if (cellIdx + 1 < Count)
{
Cell cell2 = this[cellIdx + 1];
if (cell2.Row.Index == cell.Row.Index)
return cell2;
}
for (int index = cellIdx - 1; index >= 0; --index)
{
Cell currCell = this[index];
if (IsNeighbor(cell, currCell, position))
return currCell;
}
break;
case NeighborPosition.Bottom:
for (int index = cellIdx + 1; index < Count; ++index)
{
Cell currCell = this[index];
if (IsNeighbor(cell, currCell, position))
return currCell;
}
break;
}
return null;
}
/// <summary>
/// Returns whether cell2 is a neighbor of cell1 at the specified position.
/// </summary>
private bool IsNeighbor(Cell cell1, Cell cell2, NeighborPosition position)
{
bool isNeighbor = false;
switch (position)
{
case NeighborPosition.Bottom:
int bottomRowIdx = cell1.Row.Index + cell1.MergeDown + 1;
isNeighbor = cell2.Row.Index == bottomRowIdx &&
cell2.Column.Index <= cell1.Column.Index &&
cell2.Column.Index + cell2.MergeRight >= cell1.Column.Index;
break;
case NeighborPosition.Left:
int leftClmIdx = cell1.Column.Index - 1;
isNeighbor = cell2.Row.Index <= cell1.Row.Index &&
cell2.Row.Index + cell2.MergeDown >= cell1.Row.Index &&
cell2.Column.Index + cell2.MergeRight == leftClmIdx;
break;
case NeighborPosition.Right:
int rightClmIdx = cell1.Column.Index + cell1.MergeRight + 1;
isNeighbor = cell2.Row.Index <= cell1.Row.Index &&
cell2.Row.Index + cell2.MergeDown >= cell1.Row.Index &&
cell2.Column.Index == rightClmIdx;
break;
case NeighborPosition.Top:
int topRowIdx = cell1.Row.Index - 1;
isNeighbor = cell2.Row.Index + cell2.MergeDown == topRowIdx &&
cell2.Column.Index + cell2.MergeRight >= cell1.Column.Index &&
cell2.Column.Index <= cell1.Column.Index;
break;
}
return isNeighbor;
}
}
}

View File

@@ -0,0 +1,243 @@
#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 System.Collections.Generic;
namespace MigraDoc.DocumentObjectModel.Visitors
{
/// <summary>
/// Flattens a document for PDF rendering.
/// </summary>
public class PdfFlattenVisitor : VisitorBase
{
/// <summary>
/// Initializes a new instance of the PdfFlattenVisitor class.
/// </summary>
public PdfFlattenVisitor()
{
//this .docObject = documentObject;
}
public override void VisitDocumentElements(DocumentElements elements)
{
#if true
// New version without sorted list
int count = elements.Count;
for (int idx = 0; idx < count; ++idx)
{
Paragraph paragraph = elements[idx] as Paragraph;
if (paragraph != null)
{
Paragraph[] paragraphs = paragraph.SplitOnParaBreak();
if (paragraphs != null)
{
foreach (Paragraph para in paragraphs)
{
elements.InsertObject(idx++, para);
++count;
}
elements.RemoveObjectAt(idx--);
--count;
}
}
}
#else
SortedList splitParaList = new SortedList();
for (int idx = 0; idx < elements.Count; ++idx)
{
Paragraph paragraph = elements[idx] as Paragraph;
if (paragraph != null)
{
Paragraph[] paragraphs = paragraph.SplitOnParaBreak();
if (paragraphs != null)
splitParaList.Add(idx, paragraphs);
}
}
int insertedObjects = 0;
for (int idx = 0; idx < splitParaList.Count; ++idx)
{
int insertPosition = (int)splitParaList.GetKey(idx);
Paragraph[] paragraphs = (Paragraph[])splitParaList.GetByIndex(idx);
foreach (Paragraph paragraph in paragraphs)
{
elements.InsertObject(insertPosition + insertedObjects, paragraph);
++insertedObjects;
}
elements.RemoveObjectAt(insertPosition + insertedObjects);
--insertedObjects;
}
#endif
}
public override void VisitDocumentObjectCollection(DocumentObjectCollection elements)
{
List<int> textIndices = new List<int>();
if (elements is ParagraphElements)
{
for (int idx = 0; idx < elements.Count; ++idx)
{
if (elements[idx] is Text)
textIndices.Add(idx);
}
}
int[] indices = (int[])textIndices.ToArray();
if (indices != null)
{
int insertedObjects = 0;
foreach (int idx in indices)
{
Text text = (Text)elements[idx + insertedObjects];
string currentString = "";
foreach (char ch in text.Content)
{
// TODO Add support for other breaking spaces (en space, em space, &c.).
switch (ch)
{
case ' ':
case '\r':
case '\n':
case '\t':
if (currentString != "")
{
elements.InsertObject(idx + insertedObjects, new Text(currentString));
++insertedObjects;
currentString = "";
}
elements.InsertObject(idx + insertedObjects, new Text(" "));
++insertedObjects;
break;
case '-': // minus.
elements.InsertObject(idx + insertedObjects, new Text(currentString + ch));
++insertedObjects;
currentString = "";
break;
// Characters that allow line breaks without indication.
case '\u200B': // zero width space.
case '\u200C': // zero width non-joiner.
if (currentString != "")
{
elements.InsertObject(idx + insertedObjects, new Text(currentString));
++insertedObjects;
currentString = "";
}
break;
case '<27>': // soft hyphen.
if (currentString != "")
{
elements.InsertObject(idx + insertedObjects, new Text(currentString));
++insertedObjects;
currentString = "";
}
elements.InsertObject(idx + insertedObjects, new Text("<22>"));
++insertedObjects;
//currentString = "";
break;
default:
currentString += ch;
break;
}
}
if (currentString != "")
{
elements.InsertObject(idx + insertedObjects, new Text(currentString));
++insertedObjects;
}
elements.RemoveObjectAt(idx + insertedObjects);
--insertedObjects;
}
}
}
public override void VisitFormattedText(FormattedText formattedText)
{
Document document = formattedText.Document;
ParagraphFormat format = null;
Style style = document._styles[formattedText._style.Value];
if (style != null)
format = style._paragraphFormat;
else if (formattedText._style.Value != "")
format = document._styles[StyleNames.InvalidStyleName]._paragraphFormat;
if (format != null)
{
if (formattedText._font == null)
formattedText.Font = format._font.Clone();
else if (format._font != null)
FlattenFont(formattedText._font, format._font);
}
Font parentFont = GetParentFont(formattedText);
if (formattedText._font == null)
formattedText.Font = parentFont.Clone();
else if (parentFont != null)
FlattenFont(formattedText._font, parentFont);
}
public override void VisitHyperlink(Hyperlink hyperlink)
{
Font styleFont = hyperlink.Document.Styles[StyleNames.Hyperlink].Font;
if (hyperlink._font == null)
hyperlink.Font = styleFont.Clone();
else
FlattenFont(hyperlink._font, styleFont);
FlattenFont(hyperlink._font, GetParentFont(hyperlink));
}
protected Font GetParentFont(DocumentObject obj)
{
DocumentObject parentElements = DocumentRelations.GetParent(obj);
DocumentObject parentObject = DocumentRelations.GetParent(parentElements);
Font parentFont;
Paragraph paragraph = parentObject as Paragraph;
if (paragraph != null)
{
ParagraphFormat format = paragraph.Format;
parentFont = format._font;
}
else // Hyperlink or FormattedText
{
parentFont = parentObject.GetValue("Font") as Font;
}
return parentFont;
}
}
}

View File

@@ -0,0 +1,69 @@
#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
namespace MigraDoc.DocumentObjectModel.Visitors
{
/// <summary>
/// Represents the visitor for flattening the DocumentObject to be used in the RtfRenderer.
/// </summary>
public class RtfFlattenVisitor : VisitorBase
{
public override void VisitFormattedText(FormattedText formattedText)
{
Document document = formattedText.Document;
ParagraphFormat format = null;
Style style = document._styles[formattedText._style.Value];
if (style != null)
format = style._paragraphFormat;
else if (formattedText._style.Value != "")
format = document._styles[StyleNames.InvalidStyleName]._paragraphFormat;
if (format != null)
{
if (formattedText._font == null)
formattedText.Font = format._font.Clone();
else if (format._font != null)
FlattenFont(formattedText._font, format._font);
}
}
public override void VisitHyperlink(Hyperlink hyperlink)
{
Font styleFont = hyperlink.Document.Styles[StyleNames.Hyperlink].Font;
if (hyperlink._font == null)
hyperlink.Font = styleFont.Clone();
else
FlattenFont(hyperlink._font, styleFont);
}
}
}

View File

@@ -0,0 +1,897 @@
#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;
}
}
}