#############################################################################
## Name:        lib/Wx/DemoModules/wxDocView.pm
## Purpose:     Document/View demo
## Author:      Simon Flack
## Modified by:
## Created:     28/08/2002
## RCS-ID:      $Id: wxDocView.pm 2189 2007-08-21 18:15:31Z mbarbon $
## Copyright:   (c) 2002, 2005-2007 Simon Flack and Mattia Barbon
## Licence:     This program is free software; you can redistribute it and/or
##              modify it under the same terms as Perl itself
#############################################################################

use Wx 0.70;
use Wx::DocView;
use Wx::MDI;

package Wx::DemoModules::wxDocView;

use strict;
use base qw(Wx::DocMDIParentFrame Class::Accessor::Fast);

use Wx qw(:docview :frame :misc :toolbar :bitmap :id);

__PACKAGE__->mk_accessors( qw(manager) );

our $THE_FRAME;

sub _bitmap($) {
    my $file = shift;

    my $rel_path = File::Spec->catfile( 'docview', "$file.xpm" );
    my $abs_path = Wx::Demo->get_data_file( $rel_path );
    return Wx::Bitmap->new( $abs_path, wxBITMAP_TYPE_XPM );
}

sub new {
    my( $class, $parent ) = @_;

    # Create a document manager and load a document template
    my $manager = Wx::DemoModules::wxDocView::DocManager->new( wxDOC_MDI );
    Wx::DocTemplate->new( $manager, "Text Files",
                          "*.txt", "", "txt", "Text Document",
                          "Text View",
                          "Wx::DemoModules::wxDocView::Document",
                          "Wx::DemoModules::wxDocView::View",
                          1 );

    # Create the parent frame. For this app, we'll use MDI
    # We get a "Window" menu for free under MSW.
    # You can turn that off with
    # wxFRAME_NO_WINDOW_MENU flag
    my $self = $class->SUPER::new( $manager, undef, -1, 'Doc/View demo' );
    $self->manager( $manager );

    $self->SetIcon( Wx::GetWxPerlIcon() );

    my $file_menu = Wx::Menu->new;
    my $edit_menu = Wx::Menu->new;

    # Using these special contants will automatically use the doc/view
    $file_menu->Append( wxID_NEW, "&New\tCtrl+N" );
    $file_menu->Append( wxID_OPEN, "&Open\tCtrl+O" );
    $file_menu->Append( wxID_SAVE, "&Save\tCtrl+S" );
    $file_menu->Append( wxID_SAVEAS, "Save &As" );
    $file_menu->Append( wxID_CLOSE, "&Close\tCtrl+W" );
    $file_menu->AppendSeparator;
    $file_menu->Append( wxID_PRINT, "&Print\tCtrl+P" );
    $file_menu->Append( wxID_PRINT_SETUP, "Print Set&up" );
    $file_menu->Append( wxID_PREVIEW, "Print Pre&view" );
    $file_menu->Append( wxID_EXIT, "E&xit" );

    $self->manager->FileHistoryUseMenu( $file_menu );

    $edit_menu->Append( wxID_UNDO, "&Undo\tCtrl+Z" );
    $edit_menu->Append( wxID_REDO, "&Redo\tCtrl+R" );
    $edit_menu->AppendSeparator;

    my $menu_bar = Wx::MenuBar->new;
    $menu_bar->Append( $file_menu, "&File" );
    $menu_bar->Append( $edit_menu, "&Edit" );

    $self->SetMenuBar( $menu_bar );

    my $toolbar = $self->CreateToolBar( wxTB_HORIZONTAL | wxNO_BORDER |
                                        wxTB_FLAT | wxTB_DOCKABLE, 5050 );
    $toolbar->AddTool( wxID_NEW, '', _bitmap('new'), 'New File' );
    $toolbar->AddTool( wxID_OPEN, '', _bitmap('open'), 'Open File' );
    $toolbar->AddTool( wxID_CLOSE, '', _bitmap('help'), 'Close File' );
    $toolbar->AddTool( wxID_SAVE, '', _bitmap('save'), 'Toggle button 1' );
    $toolbar->AddTool( wxID_COPY, '', _bitmap('copy'), 'Toggle button 1' );
    $toolbar->AddTool( wxID_CUT, '', _bitmap('cut'), 'Toggle button 1' );
#    $toolbar->AddTool( wxID_PASTE, '', _bitmap('paste'), 'Toggle button 1' );
    $toolbar->AddTool( wxID_PRINT, '', _bitmap('print'), 'Toggle button 1' );

    $toolbar->AddSeparator;
    $toolbar->Realize;

    $THE_FRAME = $self;

    return $self;
}

sub CreateChildFrame {
    my( $self, $doc, $view, $flags ) = @_;

    # Get the filename for the window title
    my $filename = $doc->GetFilename;

    my $child_frame = new Wx::DocMDIChildFrame
      ( $doc, $view, $self, -1, $filename, [10,10], [300,300],
        wxDEFAULT_FRAME_STYLE | wxMAXIMIZE );
    $child_frame->Show;

    return $child_frame;
}

sub add_to_tags { qw(misc) }
sub title { 'Document/View' }

package Wx::DemoModules::wxDocView::DocManager;

use strict;
use base qw(Wx::DocManager);

# The default wxWidgets untitled name is "unnamedN"
# (where N is a number)
# It's a bit ugly, and you can customise it...
my $unnamed_doc_count = 0;

sub MakeDefaultName {
    my( $docmgr, $name ) = @_;

    return "Untitled" . ++$unnamed_doc_count;
}

package Wx::DemoModules::wxDocView::Document;

use strict;
use base qw(Wx::Document);

sub OnSaveDocument {
    my( $doc, $filename ) = @_;
    my $view = $doc->GetFirstView;
    $view->Activate( 0 );

    return unless $view->{editor}->SaveFile( $filename );

    $doc->Modify( 0 );
    $view->Activate( 1 );

    return 1;
}

sub OnOpenDocument {
    my( $doc, $filename ) = @_;
    my $view = $doc->GetFirstView;

    return 0 unless $view->{editor}->LoadFile( $filename );

    $doc->UpdateAllViews;
    $doc->Modify( 0 );

    return 1;
}

# This is called internally to see if the document has been modified
# since it was last saved.
sub IsModified {
    my( $doc ) = @_;

    my $view = $doc->GetFirstView;

    if( defined $view->{editor} ) {
        return $view->{editor}->IsModified;
    }

    return;
}

package Wx::DemoModules::wxDocView::View;

use strict;
use base qw(Wx::View);

use Wx qw(wxTE_MULTILINE wxDefaultPosition wxDefaultSize);

sub OnCreate {
    my( $view, $doc, $flags )  = @_;

    my $child_frame = $Wx::DemoModules::wxDocView::THE_FRAME
                        ->CreateChildFrame( $doc, $view );
    $view->{editor} = new Wx::TextCtrl( $child_frame, -1, "", [0,0],
                                        [200,300], wxTE_MULTILINE );
    $child_frame->Show;
    $view->Activate( 1 );

    return 1;
}

sub OnClose {
    my( $view, $deletewindow ) = @_;

    if( $deletewindow ) {
        $view->{editor}->Hide;
        delete $view->{editor};
        $view->GetFrame->Destroy;
    } else {
        $view->GetDocument->Close;
    }

    $view->Activate( 0 );

    return 1;
}

1;