package Padre::Wx::Printout;

use 5.008;
use strict;
use warnings;
use Padre::Wx 'Print';

our $VERSION = '1.00';
our @ISA     = 'Wx::Printout';

sub new {
	my $class  = shift;
	my $editor = shift;
	my $self   = $class->SUPER::new(@_);

	$self->{EDITOR}  = $editor;
	$self->{PRINTED} = 0;

	return $self;
}

sub OnPrintPage {
	my ( $self, $page ) = @_;
	my $dc = $self->GetDC;

	return 0 unless defined $dc;

	$self->PrintScaling($dc);

	my $e = $self->{EDITOR};

	if ( $page == 1 ) {
		$self->{PRINTED} = 0;
	}
	$self->{PRINTED} =
		$e->FormatRange( 1, $self->{PRINTED}, $e->GetLength, $dc, $dc, $self->{printRect}, $self->{pageRect} );

	return 1;
}

sub GetPageInfo {
	my $self = shift;
	my ( $minPage, $maxPage, $selPageFrom, $selPageTo ) = ( 0, 0, 0, 0 );

	my $dc = $self->GetDC;
	if ( not defined $dc ) {
		return ( $minPage, $maxPage, $selPageFrom, $selPageTo );
	}
	$self->PrintScaling($dc);

	# get print page informations and convert to printer pixels
	my ( $x, $y ) = $self->GetPPIScreen;
	my $ppiScr = Wx::Size->new( $x, $y );

	my $pageSize = Wx::Size->new( $self->GetPageSizeMM );
	$pageSize->SetWidth( int( $pageSize->GetWidth * $ppiScr->GetWidth / 25.4 ) );
	$pageSize->SetHeight( int( $pageSize->GetHeight * $ppiScr->GetHeight / 25.4 ) );

	$self->{pageRect} = Wx::Rect->new( 0, 0, $pageSize->GetWidth, $pageSize->GetHeight );

	# my $topLeft  = $psdd->GetMarginTopLeft;
	my $left = 25.4; # $topLeft->x;
	my $top  = 25.4; # $topLeft->y;

	# my $btmRight = $psdd->GetMarginBottomRight;
	my $right  = Wx::Size->new( $self->GetPageSizeMM )->GetWidth - 50.8; # $btmRight->x;
	my $bottom = 25.4;                                                   # $btmRight->y;

	$top    = int( $top * $ppiScr->GetHeight / 25.4 );
	$bottom = int( $bottom * $ppiScr->GetHeight / 25.4 );
	$left   = int( $left * $ppiScr->GetWidth / 25.4 );
	$right  = int( $right * $ppiScr->GetWidth / 25.4 );

	$self->{printRect} = Wx::Rect->new(
		int( $left * $dc->GetUserScale ),
		int( $top * $dc->GetUserScale ),
		$right,
		( $pageSize->GetHeight - int( ( $top + $bottom ) * $dc->GetUserScale ) )
	);

	while ( $self->HasPage($maxPage) ) {
		$self->{PRINTED} = $self->{EDITOR}->FormatRange(
			0,
			$self->{PRINTED},
			$self->{EDITOR}->GetLength,
			$dc,
			$dc,
			$self->{printRect},
			$self->{pageRect}
		);

		$maxPage += 1;
	}
	$self->{PRINTED} = 0;

	if ( $maxPage > 0 ) {
		$minPage = 1;
	}
	$selPageFrom = $minPage;
	$selPageTo   = $maxPage;
	return ( $minPage, $maxPage, $selPageFrom, $selPageTo );
}

sub HasPage {
	my $self = shift;
	my $page = shift;

	return $self->{PRINTED} < $self->{EDITOR}->GetLength;
}

sub PrintScaling {
	my $self = shift;
	my $dc   = shift;

	return 0 unless defined $dc;

	my ( $sx, $sy ) = $self->GetPPIScreen;

	my $ppiScr = Wx::Size->new( $sx, $sy );
	if ( $ppiScr->GetWidth == 0 ) { # guessing 96 dpi
		$ppiScr->SetWidth(96);
		$ppiScr->SetHeight(96);
	}

	my ( $px, $py ) = $self->GetPPIPrinter;
	my $ppiPrt = Wx::Size->new( $px, $py );

	if ( $ppiPrt->GetWidth == 0 ) { # scaling factor 1
		$ppiPrt->SetWidth( $ppiScr->GetWidth );
		$ppiPrt->SetHeight( $ppiScr->GetHeight );
	}

	my $dcSize = $dc->GetSize;
	my ( $pax, $pay ) = $self->GetPageSizePixels;
	my $pageSize = Wx::Size->new( $pax, $pay );

	# set user scale
	my $scale_x = ( $ppiPrt->GetWidth * $dcSize->GetWidth ) /   ( $ppiScr->GetWidth * $pageSize->GetWidth );
	my $scale_y = ( $ppiPrt->GetHeight * $dcSize->GetHeight ) / ( $ppiScr->GetHeight * $pageSize->GetHeight );

	$dc->SetUserScale( $scale_x, $scale_y );

	return 1;
}

1;

# Copyright 2008-2013 The Padre development team as listed in Padre.pm.
# LICENSE
# This program is free software; you can redistribute it and/or
# modify it under the same terms as Perl 5 itself.
