#############################################################################
## 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;