The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#############################################################################
## Name:        ext/richtext/XS/RichTextPrinting.xsp
## Purpose:     XS++ for Wx::RichTextPrinting
## Author:      Mark Dootson
## Modified by:
## Created:     10/04/2010
## RCS-ID:      $Id: RichTextPrinting.xsp 3293 2012-05-16 20:02:24Z mdootson $
## Copyright:   (c) 2010 Mark Dootson
## Licence:     This program is free software; you can redistribute it and/or
##              modify it under the same terms as Perl itself
#############################################################################

#if WXPERL_W_VERSION_GE( 2, 8, 0 )

#include <wx/richtext/richtextprint.h>

%module{Wx};

%name{Wx::RichTextPrintout} class wxRichTextPrintout : public %name{Wx::Printout} wxPrintout
{

public:

    wxRichTextPrintout(const wxString& title = wxT("Printout"));
 
    %name{Destroy} ~wxRichTextPrintout()
        %code%{ delete THIS; %};

    /// The buffer to print
    void SetRichTextBuffer(wxRichTextBuffer* buffer);

    wxRichTextBuffer* GetRichTextBuffer() const ;

    /// Set/get header/footer data
    void SetHeaderFooterData(const wxRichTextHeaderFooterData& data) ;
    const wxRichTextHeaderFooterData& GetHeaderFooterData() const ;

    /// Sets margins in 10ths of millimetre. Defaults to 1 inch for margins.
    void SetMargins(int top = 254, int bottom = 254, int left = 254, int right = 254);

    /// Calculate scaling and rectangles, setting the device context scaling
    void CalculateScaling(wxDC* dc, wxRect& textRect, wxRect& headerRect, wxRect& footerRect);

    // wxPrintout virtual functions
    virtual bool OnPrintPage(int page);
    virtual bool HasPage(int page);
    //virtual void GetPageInfo(int *minPage, int *maxPage, int *selPageFrom, int *selPageTo);
    virtual bool OnBeginDocument(int startPage, int endPage);
    virtual void OnPreparePrinting();
};

%{

void
wxRichTextPrintout::GetPageInfo()
  PREINIT:
    int minPage, maxPage, pageFrom, pageTo;
  PPCODE:
    THIS->wxRichTextPrintout::GetPageInfo( &minPage, &maxPage, &pageFrom, &pageTo );
    EXTEND( SP, 4 );
    PUSHs( sv_2mortal( newSViv( minPage ) ) );
    PUSHs( sv_2mortal( newSViv( maxPage ) ) );
    PUSHs( sv_2mortal( newSViv( pageFrom ) ) );
    PUSHs( sv_2mortal( newSViv( pageTo ) ) );

%}

%name{Wx::RichTextPrinting} class wxRichTextPrinting : public wxObject
{
    wxRichTextPrinting(  wxString name = wxT("Printing"), wxWindow *parentWindow = NULL );

    ~wxRichTextPrinting()
        %code%{  wxPli_thread_sv_unregister( aTHX_ "Wx::RichTextPrinting", THIS, ST(0) );
                 delete THIS; %};

%{
static void
wxRichTextPrinting::CLONE()
  CODE:
    wxPli_thread_sv_clone( aTHX_ CLASS, (wxPliCloneSV)wxPli_detach_object );
%}

    bool PreviewFile(const wxString& richTextFile);
    bool PreviewBuffer(const wxRichTextBuffer& buffer);

#if WXPERL_W_VERSION_GE( 2, 9, 4 )
    bool PrintFile(const wxString& richTextFile, bool showPrintDialog = true ); 
    bool PrintBuffer(const wxRichTextBuffer& buffer, bool showPrintDialog = true ); 
#else
    bool PrintFile(const wxString& richTextFile);
    bool PrintBuffer(const wxRichTextBuffer& buffer);
#endif

    void PageSetup();

    void SetHeaderFooterData(const wxRichTextHeaderFooterData& data);
    const wxRichTextHeaderFooterData& GetHeaderFooterData() const;

    void SetHeaderText(const wxString& text, wxRichTextOddEvenPage page = wxRICHTEXT_PAGE_ALL, wxRichTextPageLocation location = wxRICHTEXT_PAGE_CENTRE);
    wxString GetHeaderText(wxRichTextOddEvenPage page = wxRICHTEXT_PAGE_EVEN, wxRichTextPageLocation location = wxRICHTEXT_PAGE_CENTRE) const;
    void SetFooterText(const wxString& text, wxRichTextOddEvenPage page = wxRICHTEXT_PAGE_ALL, wxRichTextPageLocation location = wxRICHTEXT_PAGE_CENTRE);
    wxString GetFooterText(wxRichTextOddEvenPage page = wxRICHTEXT_PAGE_EVEN, wxRichTextPageLocation location = wxRICHTEXT_PAGE_CENTRE) const;

    void SetShowOnFirstPage(bool show);

    void SetHeaderFooterFont(const wxFont& font);
    void SetHeaderFooterTextColour(const wxColour& font);

    wxPrintData *GetPrintData();
    void SetPrintData(const wxPrintData& printData);
    
    wxPageSetupDialogData *GetPageSetupData() const;
    void SetPageSetupData(const wxPageSetupDialogData& pageSetupData);

    void SetRichTextBufferPreview(wxRichTextBuffer* buffer)
        %code%{ THIS->SetRichTextBufferPreview(buffer); %}
        %cleanup%{ wxPli_object_set_deleteable( aTHX_ ST(0), false ); %};
         
    wxRichTextBuffer* GetRichTextBufferPreview() const
        %code%{ RETVAL = THIS->GetRichTextBufferPreview(); %}
        %cleanup%{ wxPli_object_set_deleteable( aTHX_ ST(0), false ); %};

    void SetRichTextBufferPrinting(wxRichTextBuffer* buffer)
        %code%{ THIS->SetRichTextBufferPrinting(buffer); %}
        %cleanup%{ wxPli_object_set_deleteable( aTHX_ ST(0), false ); %};    
    
    wxRichTextBuffer* GetRichTextBufferPrinting() const
        %code%{ RETVAL = THIS->GetRichTextBufferPrinting(); %}
        %cleanup%{ wxPli_object_set_deleteable( aTHX_ ST(0), false ); %};

    void SetParentWindow(wxWindow* parent);
    wxWindow* GetParentWindow() const;

    void SetTitle(const wxString& title);
    const wxString& GetTitle() const;

    void SetPreviewRect(const wxRect& rect);
    const wxRect& GetPreviewRect() const;
    
};


%name{Wx::RichTextHeaderFooterData} class wxRichTextHeaderFooterData : public wxObject
{

    %name{newDefault} wxRichTextHeaderFooterData();
    %name{newCopy} wxRichTextHeaderFooterData(const wxRichTextHeaderFooterData& data);

    ~wxRichTextPrinting()
        %code%{  wxPli_thread_sv_unregister( aTHX_ "Wx::RichTextHeaderFooterData", THIS, ST(0) );
                 delete THIS; %};

%{
static void
wxRichTextPrinting::CLONE()
  CODE:
    wxPli_thread_sv_clone( aTHX_ CLASS, (wxPliCloneSV)wxPli_detach_object );
%}

    // void Init();
    // void Copy(const wxRichTextHeaderFooterData& data);

    void SetHeaderText(const wxString& text, wxRichTextOddEvenPage page = wxRICHTEXT_PAGE_ALL, wxRichTextPageLocation location = wxRICHTEXT_PAGE_CENTRE);
    wxString GetHeaderText(wxRichTextOddEvenPage page = wxRICHTEXT_PAGE_EVEN, wxRichTextPageLocation location = wxRICHTEXT_PAGE_CENTRE) const;

    void SetFooterText(const wxString& text, wxRichTextOddEvenPage page = wxRICHTEXT_PAGE_ALL, wxRichTextPageLocation location = wxRICHTEXT_PAGE_CENTRE);
    wxString GetFooterText(wxRichTextOddEvenPage page = wxRICHTEXT_PAGE_EVEN, wxRichTextPageLocation location = wxRICHTEXT_PAGE_CENTRE) const;

    void SetText(const wxString& text, int headerFooter, wxRichTextOddEvenPage page, wxRichTextPageLocation location);
    wxString GetText(int headerFooter, wxRichTextOddEvenPage page, wxRichTextPageLocation location) const;

    void SetMargins(int headerMargin, int footerMargin);
    int GetHeaderMargin();
    int GetFooterMargin();

    void SetShowOnFirstPage(bool showOnFirstPage);
    bool GetShowOnFirstPage() const;
    void Clear();
    
    void SetFont(const wxFont& font);
    const wxFont& GetFont() const;

    void SetTextColour(const wxColour& col);
    const wxColour& GetTextColour() const;
    
};

## DECLARE_OVERLOAD( wrth, Wx::RichTextHeaderFooterData )

%{
void
wxRichTextHeaderFooterData::new( ... )
  PPCODE:
    BEGIN_OVERLOAD()
        MATCH_VOIDM_REDISP( newDefault )
        MATCH_REDISP( wxPliOvl_wrth, newCopy )
    END_OVERLOAD( Wx::RichTextHeaderFooterData::new )

%}

#endif