#region MigraDoc - Creating Documents on the Fly
//
// Authors:
// Klaus Potzesny
//
// 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.Shapes;
using PdfSharp.Drawing;
using MigraDoc.DocumentObjectModel;
namespace MigraDoc.Rendering
{
///
/// Vertical measurements of a paragraph line.
///
public struct VerticalLineInfo
{
public VerticalLineInfo(XUnit height, XUnit descent, XUnit inherentlineSpace)
{
Height = height;
Descent = descent;
InherentlineSpace = inherentlineSpace;
}
public XUnit Height;
public XUnit Descent;
public XUnit InherentlineSpace;
}
///
/// Line info object used by the paragraph format info.
///
public struct LineInfo
{
public ParagraphIterator StartIter;
public ParagraphIterator EndIter;
public XUnit WordsWidth;
public XUnit LineWidth;
public int BlankCount;
public VerticalLineInfo Vertical;
public List TabOffsets;
public bool ReMeasureLine;
public DocumentObject LastTab;
}
///
/// Formatting information for a paragraph.
///
public sealed class ParagraphFormatInfo : FormatInfo
{
public ParagraphFormatInfo()
{ }
public LineInfo GetLineInfo(int lineIdx)
{
return _lineInfos[lineIdx];
}
public LineInfo GetLastLineInfo()
{
return _lineInfos[LineCount - 1];
}
public LineInfo GetFirstLineInfo()
{
return _lineInfos[0];
}
public void AddLineInfo(LineInfo lineInfo)
{
_lineInfos.Add(lineInfo);
}
public int LineCount
{
get { return _lineInfos.Count; }
}
///
///
///
///
///
public void Append(FormatInfo mergeInfo)
{
ParagraphFormatInfo formatInfo = (ParagraphFormatInfo)mergeInfo;
_lineInfos.AddRange(formatInfo._lineInfos);
}
///
/// Indicates whether the paragraph is ending.
///
/// True if the paragraph is ending.
public override bool IsEnding
{
get { return _isEnding; }
}
public bool _isEnding;
///
/// Indicates whether the paragraph is starting.
///
/// True if the paragraph is starting.
public override bool IsStarting
{
get { return _isStarting; }
}
public bool _isStarting;
public override bool IsComplete
{
get { return _isStarting && _isEnding; }
}
public override bool IsEmpty
{
get { return _lineInfos.Count == 0; }
}
public override bool StartingIsComplete
{
get
{
if (_widowControl)
return (IsComplete || (_isStarting && _lineInfos.Count >= 2));
return _isStarting;
}
}
public bool _widowControl;
public override bool EndingIsComplete
{
get
{
if (_widowControl)
return (IsComplete || (_isEnding && _lineInfos.Count >= 2));
return _isEnding;
}
}
public void RemoveEnding()
{
if (!IsEmpty)
{
if (_widowControl && _isEnding && LineCount >= 2)
_lineInfos.RemoveAt(LineCount - 2);
if (LineCount > 0)
_lineInfos.RemoveAt(LineCount - 1);
_isEnding = false;
}
}
public string ListSymbol;
public XFont ListFont;
public Dictionary ImageRenderInfos;
readonly List _lineInfos = new List();
}
}