#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.publics;
namespace MigraDoc.DocumentObjectModel
{
///
/// Represents the page setup of a section.
///
public class PageSetup : DocumentObject
{
///
/// Initializes a new instance of the PageSetup class.
///
public PageSetup()
{ }
///
/// Initializes a new instance of the PageSetup class with the specified parent.
///
public PageSetup(DocumentObject parent) : base(parent) { }
#region Methods
///
/// Creates a deep copy of this object.
///
public new PageSetup Clone()
{
return (PageSetup)DeepCopy();
}
///
/// Gets the page's size and height for the given PageFormat.
///
public static void GetPageSize(PageFormat pageFormat, out Unit pageWidth, out Unit pageHeight)
{
//Sizes in mm:
pageWidth = 0;
pageHeight = 0;
const int A0Height = 1189;
const int A0Width = 841;
int height = 0;
int width = 0;
switch (pageFormat)
{
case PageFormat.A0:
height = A0Height;
width = A0Width;
break;
case PageFormat.A1:
height = A0Width;
width = A0Height / 2;
break;
case PageFormat.A2:
height = A0Height / 2;
width = A0Width / 2;
break;
case PageFormat.A3:
height = A0Width / 2;
width = A0Height / 4;
break;
case PageFormat.A4:
height = A0Height / 4;
width = A0Width / 4;
break;
case PageFormat.A5:
height = A0Width / 4;
width = A0Height / 8;
break;
case PageFormat.A6:
height = A0Height / 8;
width = A0Width / 8;
break;
case PageFormat.B5:
height = 257;
width = 182;
break;
case PageFormat.Letter:
pageWidth = Unit.FromPoint(612);
pageHeight = Unit.FromPoint(792);
break;
case PageFormat.Legal:
pageWidth = Unit.FromPoint(612);
pageHeight = Unit.FromPoint(1008);
break;
case PageFormat.Ledger:
pageWidth = Unit.FromPoint(1224);
pageHeight = Unit.FromPoint(792);
break;
case PageFormat.P11x17:
pageWidth = Unit.FromPoint(792);
pageHeight = Unit.FromPoint(1224);
break;
}
if (height > 0)
pageHeight = Unit.FromMillimeter(height);
if (width > 0)
pageWidth = Unit.FromMillimeter(width);
}
#endregion
#region Properties
///
/// Gets or sets a value which defines whether the section starts on next, odd or even page.
///
public BreakType SectionStart
{
get { return (BreakType)_sectionStart.Value; }
set { _sectionStart.Value = (int)value; }
}
[DV(Type = typeof(BreakType))]
public NEnum _sectionStart = NEnum.NullValue(typeof(BreakType));
///
/// Gets or sets the page orientation of the section.
///
public Orientation Orientation
{
get { return (Orientation)_orientation.Value; }
set { _orientation.Value = (int)value; }
}
[DV(Type = typeof(Orientation))]
public NEnum _orientation = NEnum.NullValue(typeof(Orientation));
private bool IsLandscape
{
get { return Orientation == Orientation.Landscape; }
}
// TODO To be compatible with Word, PageWidth should always return the actual width (e.g. 21 cm for DIN A 4 portrait and 29.7 cm for DIN A 4 landscape).
// TODO Pagemargins are also "moving": portrait-left becomes landscape-top
///
/// Gets or sets the page width. If Orientation is set to Landscape, the PageWidth specifies the height of the page.
///
public Unit PageWidth
{
get { return _pageWidth; }
set { _pageWidth = value; }
}
[DV]
public Unit _pageWidth = Unit.NullValue;
///
/// Gets the effective page width, depending on the Orientation this will either be the height or the width.
///
public Unit EffectivePageWidth
{
get { return IsLandscape ? PageHeight : PageWidth; }
}
///
/// Gets or sets the starting number for the first section page.
///
public int StartingNumber
{
get { return _startingNumber.Value; }
set { _startingNumber.Value = value; }
}
[DV]
public NInt _startingNumber = NInt.NullValue;
///
/// Gets or sets the page height. If Orientation is set to Landscape, the PageHeight specifies the width of the page.
///
public Unit PageHeight
{
get { return _pageHeight; }
set { _pageHeight = value; }
}
[DV]
public Unit _pageHeight = Unit.NullValue;
///
/// Gets the effective page height, depending on the Orientation this will either be the height or the width.
///
public Unit EffectivePageHeight
{
get { return IsLandscape ? PageWidth : PageHeight; }
}
///
/// Gets or sets the top margin of the pages in the section.
///
public Unit TopMargin
{
get { return _topMargin; }
set { _topMargin = value; }
}
[DV]
public Unit _topMargin = Unit.NullValue;
///
/// Gets or sets the bottom margin of the pages in the section.
///
public Unit BottomMargin
{
get { return _bottomMargin; }
set { _bottomMargin = value; }
}
[DV]
public Unit _bottomMargin = Unit.NullValue;
///
/// Gets or sets the left margin of the pages in the section.
///
public Unit LeftMargin
{
get { return _leftMargin; }
set { _leftMargin = value; }
}
[DV]
public Unit _leftMargin = Unit.NullValue;
///
/// Gets or sets the right margin of the pages in the section.
///
public Unit RightMargin
{
get { return _rightMargin; }
set { _rightMargin = value; }
}
[DV]
public Unit _rightMargin = Unit.NullValue;
///
/// Gets or sets a value which defines whether the odd and even pages
/// of the section have different header and footer.
///
public bool OddAndEvenPagesHeaderFooter
{
get { return _oddAndEvenPagesHeaderFooter.Value; }
set { _oddAndEvenPagesHeaderFooter.Value = value; }
}
[DV]
public NBool _oddAndEvenPagesHeaderFooter = NBool.NullValue;
///
/// Gets or sets a value which define whether the section has a different
/// first page header and footer.
///
public bool DifferentFirstPageHeaderFooter
{
get { return _differentFirstPageHeaderFooter.Value; }
set { _differentFirstPageHeaderFooter.Value = value; }
}
[DV]
public NBool _differentFirstPageHeaderFooter = NBool.NullValue;
///
/// Gets or sets the distance between the header and the page top
/// of the pages in the section.
///
public Unit HeaderDistance
{
get { return _headerDistance; }
set { _headerDistance = value; }
}
[DV]
public Unit _headerDistance = Unit.NullValue;
///
/// Gets or sets the distance between the footer and the page bottom
/// of the pages in the section.
///
public Unit FooterDistance
{
get { return _footerDistance; }
set { _footerDistance = value; }
}
[DV]
public Unit _footerDistance = Unit.NullValue;
///
/// Gets or sets a value which defines whether the odd and even pages
/// of the section should change left and right margin.
///
public bool MirrorMargins
{
get { return _mirrorMargins.Value; }
set { _mirrorMargins.Value = value; }
}
[DV]
public NBool _mirrorMargins = NBool.NullValue;
///
/// Gets or sets a value which defines whether a page should break horizontally.
/// Currently only tables are supported.
///
public bool HorizontalPageBreak
{
get { return _horizontalPageBreak.Value; }
set { _horizontalPageBreak.Value = value; }
}
[DV]
public NBool _horizontalPageBreak = NBool.NullValue;
///
/// Gets or sets the page format of the section.
///
public PageFormat PageFormat
{
get { return (PageFormat)_pageFormat.Value; }
set { _pageFormat.Value = (int)value; }
}
[DV(Type = typeof(PageFormat))]
public NEnum _pageFormat = NEnum.NullValue(typeof(PageFormat));
///
/// Gets or sets a comment associated with this object.
///
public string Comment
{
get { return _comment.Value; }
set { _comment.Value = value; }
}
[DV]
public NString _comment = NString.NullValue;
#endregion
///
/// Gets the PageSetup of the previous section, or null, if the page setup belongs
/// to the first section.
///
public PageSetup PreviousPageSetup()
{
Section section = Parent as Section;
if (section != null)
{
section = section.PreviousSection();
if (section != null)
return section.PageSetup;
}
return null;
}
///
/// Gets a PageSetup object with default values for all properties.
///
public static PageSetup DefaultPageSetup
{
get
{
if (_defaultPageSetup == null)
{
_defaultPageSetup = new PageSetup();
_defaultPageSetup.PageFormat = PageFormat.A4;
_defaultPageSetup.SectionStart = BreakType.BreakNextPage;
_defaultPageSetup.Orientation = Orientation.Portrait;
_defaultPageSetup.PageWidth = "21cm";
_defaultPageSetup.PageHeight = "29.7cm";
_defaultPageSetup.TopMargin = "2.5cm";
_defaultPageSetup.BottomMargin = "2cm";
_defaultPageSetup.LeftMargin = "2.5cm";
_defaultPageSetup.RightMargin = "2.5cm";
_defaultPageSetup.HeaderDistance = "1.25cm";
_defaultPageSetup.FooterDistance = "1.25cm";
_defaultPageSetup.OddAndEvenPagesHeaderFooter = false;
_defaultPageSetup.DifferentFirstPageHeaderFooter = false;
_defaultPageSetup.MirrorMargins = false;
_defaultPageSetup.HorizontalPageBreak = false;
}
return _defaultPageSetup;
}
}
static PageSetup _defaultPageSetup;
#region public
///
/// Converts PageSetup into DDL.
///
public override void Serialize(Serializer serializer)
{
serializer.WriteComment(_comment.Value);
int pos = serializer.BeginContent("PageSetup");
if (!_pageHeight.IsNull)
serializer.WriteSimpleAttribute("PageHeight", PageHeight);
if (!_pageWidth.IsNull)
serializer.WriteSimpleAttribute("PageWidth", PageWidth);
if (!_orientation.IsNull)
serializer.WriteSimpleAttribute("Orientation", Orientation);
if (!_leftMargin.IsNull)
serializer.WriteSimpleAttribute("LeftMargin", LeftMargin);
if (!_rightMargin.IsNull)
serializer.WriteSimpleAttribute("RightMargin", RightMargin);
if (!_topMargin.IsNull)
serializer.WriteSimpleAttribute("TopMargin", TopMargin);
if (!_bottomMargin.IsNull)
serializer.WriteSimpleAttribute("BottomMargin", BottomMargin);
if (!_footerDistance.IsNull)
serializer.WriteSimpleAttribute("FooterDistance", FooterDistance);
if (!_headerDistance.IsNull)
serializer.WriteSimpleAttribute("HeaderDistance", HeaderDistance);
if (!_oddAndEvenPagesHeaderFooter.IsNull)
serializer.WriteSimpleAttribute("OddAndEvenPagesHeaderFooter", OddAndEvenPagesHeaderFooter);
if (!_differentFirstPageHeaderFooter.IsNull)
serializer.WriteSimpleAttribute("DifferentFirstPageHeaderFooter", DifferentFirstPageHeaderFooter);
if (!_sectionStart.IsNull)
serializer.WriteSimpleAttribute("SectionStart", SectionStart);
if (!_pageFormat.IsNull)
serializer.WriteSimpleAttribute("PageFormat", PageFormat);
if (!_mirrorMargins.IsNull)
serializer.WriteSimpleAttribute("MirrorMargins", MirrorMargins);
if (!_horizontalPageBreak.IsNull)
serializer.WriteSimpleAttribute("HorizontalPageBreak", HorizontalPageBreak);
if (!_startingNumber.IsNull)
serializer.WriteSimpleAttribute("StartingNumber", StartingNumber);
serializer.EndContent(pos);
}
///
/// Returns the meta object of this instance.
///
public override Meta Meta
{
get { return _meta ?? (_meta = new Meta(typeof(PageSetup))); }
}
static Meta _meta;
#endregion
}
}