//
// System.Drawing.PrintDocument.cs
//
// Authors:
// Dennis Hayes (dennish@Raytek.com)
// Herve Poussineau (hpoussineau@fr.st)
// Andreas Nahr (ClassDevelopment@A-SoftTech.com)
//
// (C) 2002 Ximian, Inc
//
//
// Copyright (C) 2004 Novell, Inc (http://www.novell.com)
//
// 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.
//
using System;
using System.ComponentModel;
namespace System.Drawing.Printing{
[DefaultEvent ("PrintPage"), DefaultProperty ("DocumentName")]
[ToolboxItemFilter ("System.Drawing.Printing", ToolboxItemFilterType.Allow)]
public class PrintDocument : System.ComponentModel.Component
{
private PageSettings defaultpagesettings;
private PrinterSettings printersettings;
private PrintController printcontroller;
private string documentname;
#if !(NET_1_0)
private bool originAtMargins = false; // .NET V1.1 Beta
#endif
public PrintDocument() {
documentname = "document"; //offical default.
printersettings = new PrinterSettings(); // use default values
defaultpagesettings = (PageSettings) printersettings.DefaultPageSettings.Clone ();
printcontroller = new StandardPrintController();
}
// properties
[DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]
[Browsable (false)]
[SRDescription ("The settings for the current page.")]
public PageSettings DefaultPageSettings{
get{
return defaultpagesettings;
}
set{
defaultpagesettings = value;
}
}
// Name of the document, not the file!
[DefaultValue ("document")]
[SRDescription ("The name of the document.")]
public string DocumentName{
get{
return documentname;
}
set{
documentname = value;
}
}
[DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]
[Browsable (false)]
[SRDescription ("The print controller object.")]
public PrintController PrintController{
get{
return printcontroller;
}
set{
printcontroller = value;
}
}
[DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]
[Browsable (false)]
[SRDescription ("The current settings for the active printer.")]
public PrinterSettings PrinterSettings{
get{
return printersettings;
}
set{
printersettings = value == null ? new PrinterSettings () : value;
}
}
#if !(NET_1_0)
[DefaultValue (false)]
[SRDescription ("Determines if the origin is set at the specified margins.")]
public bool OriginAtMargins{
get{
return originAtMargins;
}
set{
originAtMargins = value;
}
}
#endif
// methods
public void Print(){
PrintEventArgs printArgs = new PrintEventArgs();
this.OnBeginPrint(printArgs);
if (printArgs.Cancel)
return;
PrintController.OnStartPrint(this, printArgs);
if (printArgs.Cancel)
return;
Graphics g = null;
if (printArgs.GraphicsContext != null) {
g = Graphics.FromHdc (printArgs.GraphicsContext.Hdc);
printArgs.GraphicsContext.Graphics = g;
}
// while there are more pages
PrintPageEventArgs printPageArgs;
do
{
QueryPageSettingsEventArgs queryPageSettingsArgs = new QueryPageSettingsEventArgs (
DefaultPageSettings.Clone () as PageSettings);
OnQueryPageSettings (queryPageSettingsArgs);
PageSettings pageSettings = queryPageSettingsArgs.PageSettings;
printPageArgs = new PrintPageEventArgs(
g,
pageSettings.Bounds,
new Rectangle(0, 0, pageSettings.PaperSize.Width, pageSettings.PaperSize.Height),
pageSettings);
// TODO: We should create a graphics context for each page since they can have diferent paper
// size, orientation, etc. We use a single graphic for now to keep Cairo using a single PDF file.
printPageArgs.GraphicsContext = printArgs.GraphicsContext;
Graphics pg = PrintController.OnStartPage(this, printPageArgs);
// assign Graphics in printPageArgs
printPageArgs.SetGraphics(pg);
if (!printPageArgs.Cancel)
this.OnPrintPage(printPageArgs);
PrintController.OnEndPage(this, printPageArgs);
if (printPageArgs.Cancel)
break;
} while (printPageArgs.HasMorePages);
this.OnEndPrint(printArgs);
PrintController.OnEndPrint(this, printArgs);
}
public override string ToString(){
return "[PrintDocument " + this.DocumentName + "]";
}
// events
protected virtual void OnBeginPrint(PrintEventArgs e){
//fire the event
if (BeginPrint != null)
BeginPrint(this, e);
}
protected virtual void OnEndPrint(PrintEventArgs e){
//fire the event
if (EndPrint != null)
EndPrint(this, e);
}
protected virtual void OnPrintPage(PrintPageEventArgs e){
//fire the event
if (PrintPage != null)
PrintPage(this, e);
}
protected virtual void OnQueryPageSettings(QueryPageSettingsEventArgs e){
//fire the event
if (QueryPageSettings != null)
QueryPageSettings(this, e);
}
[SRDescription ("Raised when printing begins")]
public event PrintEventHandler BeginPrint;
[SRDescription ("Raised when printing ends")]
public event PrintEventHandler EndPrint;
[SRDescription ("Raised when printing of a new page begins")]
public event PrintPageEventHandler PrintPage;
[SRDescription ("Raised before printing of a new page begins")]
public event QueryPageSettingsEventHandler QueryPageSettings;
}
}
|