| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381 |
- // 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.
- //
- // Copyright (c) 2006 Novell, Inc.
- //
- // Authors:
- // Jonathan Chambers ([email protected])
- //
- using System;
- using System.ComponentModel;
- using System.ComponentModel.Design;
- using System.ComponentModel.Design.Serialization;
- using System.Collections;
- using System.Diagnostics;
- using System.Drawing;
- using System.Drawing.Printing;
- using System.Reflection;
- namespace System.Windows.Forms {
- [DefaultPropertyAttribute("Document")]
- public class PrintPreviewControl : Control {
- #region Local variables
- bool autozoom;
- int columns;
- int rows;
- int startPage;
- double zoom;
- int padding = ThemeEngine.Current.PrintPreviewControlPadding;
- PrintDocument document;
- internal PreviewPrintController controller;
- internal PreviewPageInfo[] page_infos;
- private VScrollBar vbar;
- private HScrollBar hbar;
- internal Rectangle ViewPort;
- internal Image[] image_cache;
- Size image_size;
- #endregion // Local variables
- #region Public Constructors
- public PrintPreviewControl() {
- autozoom = true;
- columns = 1;
- rows = 0;
- startPage = 1;
- this.BackColor = SystemColors.AppWorkspace;
- controller = new PreviewPrintController ();
- vbar = new ImplicitVScrollBar ();
- hbar = new ImplicitHScrollBar ();
- vbar.Visible = false;
- hbar.Visible = false;
- vbar.ValueChanged += new EventHandler (VScrollBarValueChanged);
- hbar.ValueChanged += new EventHandler (HScrollBarValueChanged);
- SuspendLayout ();
- Controls.AddImplicit (vbar);
- Controls.AddImplicit (hbar);
- ResumeLayout ();
- }
- #endregion // Public Constructors
-
- #region Public Instance Properties
- [DefaultValue(true)]
- public bool AutoZoom {
- get { return autozoom; }
- set {
- if (autozoom != value) {
- InvalidatePreview ();
- Invalidate ();
- }
- autozoom = value;
- }
- }
- [DefaultValue(1)]
- public int Columns {
- get { return columns; }
- set {
- if (columns != value) {
- columns = value;
- if (AutoZoom)
- InvalidatePreview ();
- Invalidate ();
- }
- }
- }
- [DefaultValue(null)]
- public PrintDocument Document {
- get { return document; }
- set {
- document = value;
- }
- }
- [DefaultValue(1)]
- public int Rows {
- get { return rows; }
- set {
- if (rows != value) {
- rows = value;
- if (AutoZoom)
- InvalidatePreview ();
- Invalidate ();
- }
- }
- }
- [DefaultValue(0)]
- public int StartPage {
- get { return startPage; }
- set {
- if (value < 1)
- return;
- if (document != null && value + (Rows + 1) * Columns > page_infos.Length + 1) {
- value = page_infos.Length + 1 - (Rows + 1) * Columns;
- if (value < 1)
- value = 1;
- }
- if (startPage != value)
- Invalidate ();
- startPage = value;
- OnStartPageChanged (EventArgs.Empty);
- }
- }
- [Bindable(false)]
- [Browsable(false)]
- [EditorBrowsable(EditorBrowsableState.Never)]
- [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
- public override string Text {
- get { return base.Text; }
- set { base.Text = value; }
- }
- [DefaultValue(false)]
- public bool UseAntiAlias {
- get { return controller.UseAntiAlias; }
- set { controller.UseAntiAlias = value; }
- }
- public double Zoom {
- get { return zoom; }
- set {
- if (zoom < 0.0)
- throw new ArgumentException ("zoom");
- if (zoom != value) {
- InvalidatePreview ();
- Invalidate ();
- }
- zoom = value;
- }
- }
- #endregion // Public Instance Properties
-
- #region Public Instance Methods
- internal void GeneratePreview ()
- {
- try {
- if (document == null)
- return;
- if (page_infos == null) {
- document.PrintController = new PrintControllerWithStatusDialog (controller);
- document.Print ();
- page_infos = controller.GetPreviewPageInfo ();
- }
-
- if (image_cache == null) {
- image_cache = new Image[page_infos.Length];
- if (page_infos.Length > 0) {
- image_size = ThemeEngine.Current.PrintPreviewControlGetPageSize (this);
- if (image_size.Width >= 0 && image_size.Width < page_infos[0].Image.Width
- && image_size.Height >= 0 && image_size.Height < page_infos[0].Image.Height) {
- for (int i = 0; i < page_infos.Length; i ++) {
- image_cache[i] = new Bitmap (image_size.Width, image_size.Height);
- Graphics g = Graphics.FromImage (image_cache[i]);
- g.DrawImage (page_infos[i].Image, new Rectangle (new Point (0, 0), image_size), 0, 0, page_infos[i].Image.Width, page_infos[i].Image.Height, GraphicsUnit.Pixel);
- g.Dispose ();
- }
- }
- }
- }
- UpdateScrollBars();
- }
- catch (Exception e) {
- page_infos = new PreviewPageInfo[0];
- image_cache = new Image[0];
- MessageBox.Show (e.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
- }
- }
- public void InvalidatePreview()
- {
- page_infos = null;
- image_cache = null;
- }
- [EditorBrowsable(EditorBrowsableState.Never)]
- public override void ResetBackColor()
- {
- base.ResetBackColor();
- }
- [EditorBrowsable(EditorBrowsableState.Never)]
- public override void ResetForeColor()
- {
- base.ResetForeColor ();
- }
- #endregion // Public Instance Methods
- #region Protected Instance Properties
- protected override CreateParams CreateParams {
- get {
- return base.CreateParams;
- }
- }
- #endregion // Protected Instance Methods
- #region Protected Instance Properties
- protected override void OnPaint(PaintEventArgs e)
- {
- if (page_infos == null || image_cache == null)
- GeneratePreview ();
- ThemeEngine.Current.PrintPreviewControlPaint (e, this, image_size);
- }
- protected override void OnResize(EventArgs e)
- {
- base.OnResize (e);
- if (AutoZoom) {
- if (page_infos != null && page_infos.Length > 0) {
- Size new_size = ThemeEngine.Current.PrintPreviewControlGetPageSize (this);
- if (new_size.Width != image_size.Width && new_size.Height != image_size.Height)
- image_cache = null;
- }
- }
- UpdateScrollBars ();
- Invalidate ();
- }
- protected virtual void OnStartPageChanged(EventArgs e)
- {
- if (StartPageChanged != null)
- StartPageChanged(this, e);
- }
- protected override void WndProc(ref Message m)
- {
- base.WndProc (ref m);
- }
- #endregion // Protected Instance Methods
- public event EventHandler StartPageChanged;
- [Browsable(false)]
- [EditorBrowsable(EditorBrowsableState.Never)]
- public new event EventHandler TextChanged {
- add { base.TextChanged += value; }
- remove { base.TextChanged -= value; }
- }
- internal int vbar_value;
- internal int hbar_value;
- private void VScrollBarValueChanged (object sender, EventArgs e)
- {
- int pixels;
- if (vbar.Value > vbar_value)
- pixels = -1 * (vbar.Value - vbar_value);
- else
- pixels = vbar_value - vbar.Value;
- vbar_value = vbar.Value;
- XplatUI.ScrollWindow (Handle, ViewPort, 0, pixels, false);
- }
- private void HScrollBarValueChanged (object sender, EventArgs e)
- {
- int pixels;
- if (hbar.Value > hbar_value)
- pixels = -1 * (hbar.Value - hbar_value);
- else
- pixels = hbar_value - hbar.Value;
- hbar_value = hbar.Value;
- XplatUI.ScrollWindow (Handle, ViewPort, pixels, 0, false);
- }
- private void UpdateScrollBars ()
- {
- ViewPort = ClientRectangle;
- if (AutoZoom)
- return;
- int total_width, total_height;
- total_width = image_size.Width * Columns + (Columns + 1) * padding;
- total_height = image_size.Height * (Rows + 1) + (Rows + 2) * padding;
- bool vert = false;
- bool horz = false;
- if (total_width > ClientRectangle.Width) {
- /* we need the hbar */
- horz = true;
- ViewPort.Height -= hbar.Height;
- }
- if (total_height > ViewPort.Height) {
- /* we need the vbar */
- vert = true;
- ViewPort.Width -= vbar.Width;
- }
- if (!horz && total_width > ViewPort.Width) {
- horz = true;
- ViewPort.Height -= hbar.Height;
- }
- SuspendLayout ();
- if (vert) {
- vbar.SetValues (total_height, ViewPort.Height);
- vbar.Bounds = new Rectangle (ClientRectangle.Width - vbar.Width, 0, vbar.Width,
- ClientRectangle.Height -
- (horz ? SystemInformation.VerticalScrollBarWidth : 0));
- vbar.Visible = true;
- vbar_value = vbar.Value;
- }
- else {
- vbar.Visible = false;
- }
- if (horz) {
- hbar.SetValues (total_width, ViewPort.Width);
- hbar.Bounds = new Rectangle (0, ClientRectangle.Height - hbar.Height,
- ClientRectangle.Width - (vert ?
- SystemInformation.HorizontalScrollBarHeight : 0),
- hbar.Height);
- hbar.Visible = true;
- hbar_value = hbar.Value;
- }
- else {
- hbar.Visible = false;
- }
- ResumeLayout (false);
- }
- }
- }
|