############################################################################# ## Name: lib/Wx/DemoModules/wxRichTextCtrl.pm ## Purpose: wxPerl demo helper for Wx::SpinCtrl ## Author: Mattia Barbon ## Modified by: ## Created: 11/11/2006 ## RCS-ID: $Id: wxRichTextCtrl.pm 3043 2011-03-21 17:25:36Z mdootson $ ## Copyright: (c) 2006, 2010 Mattia Barbon ## Licence: This program is free software; you can redistribute it and/or ## modify it under the same terms as Perl itself ############################################################################# package Wx::DemoModules::wxRichTextCtrl; use strict; BEGIN { eval { require Wx::RichText; } } use base qw(Wx::DemoModules::lib::BaseModule Class::Accessor::Fast); use Wx qw(:richtextctrl :textctrl :font :sizer :color); # use Wx::Event qw(EVT_SPINCTRL EVT_SPIN EVT_SPIN_DOWN EVT_SPIN_UP); __PACKAGE__->mk_accessors( qw(richtext stylesheet control preview) ); sub DESTROY { my( $self ) = @_; $self->stylesheet( undef ); } sub expandinsizer { 1 }; sub commands { my( $self ) = @_; my @commands = ( { with_value => 0, label => 'Add styled text', action => \&add_styled_text, }, ); push(@commands, ( { with_value => 0, label => 'Print Preview', action => \&print_preview, }, { with_value => 0, label => 'Page Setup', action => \&page_setup, }, ) ) if defined(&Wx::RichTextPrinting::new); return @commands; } sub create_control { my( $self ) = @_; my $panel = Wx::Panel->new( $self, -1 ); my $richtext = Wx::RichTextCtrl->new( $panel, -1, 'Rich text', [-1, -1], [400, 300] ); my $stylectrl = Wx::RichTextStyleListCtrl->new( $panel, -1, [-1, -1], [100, -1]); $self->richtext( $richtext ); if(defined(&Wx::RichTextPrinting::new)) { my $parent = Wx::GetTopLevelParent($self); my $preview = Wx::RichTextPrinting->new('Wx::Demo Printing', $parent); $self->preview( $preview ); } my $sizer = Wx::BoxSizer->new( wxHORIZONTAL ); $sizer->Add( $stylectrl, 0, wxGROW|wxALL, 5 ); $sizer->Add( $richtext, 1, wxGROW|wxALL, 5 ); $panel->SetSizerAndFit( $sizer ); $self->stylesheet( $self->create_style_sheet ); $stylectrl->SetRichTextCtrl( $richtext ); $stylectrl->SetStyleSheet( $self->stylesheet ); $stylectrl->GetStyleListBox->SetApplyOnSelection( 1 ); $stylectrl->UpdateStyles; $self->control( $panel ); return $panel; } sub create_style_sheet { my( $self ) = @_; my $charstyle1 = Wx::RichTextCharacterStyleDefinition->new( "red" ); my $charstyle2 = Wx::RichTextCharacterStyleDefinition->new( "italic blue" ); my $parstyle1 = Wx::RichTextParagraphStyleDefinition->new( "bold red" ); my $parstyle2 = Wx::RichTextParagraphStyleDefinition->new( "indented" ); my $liststyle1 = Wx::RichTextListStyleDefinition->new( "numbered" ); my $liststyle2 = Wx::RichTextListStyleDefinition->new( "symbols" ); my $stylesheet = Wx::RichTextStyleSheet->new; my $attr; $attr = Wx::RichTextAttr->new; $attr->SetTextColour( wxRED ); $charstyle1->SetStyle( $attr ); $attr = Wx::RichTextAttr->new; $attr->SetTextColour( wxBLUE ); $attr->SetFontStyle( wxITALIC ); $charstyle2->SetStyle( $attr ); $attr = Wx::RichTextAttr->new; $attr->SetTextColour( wxRED ); $attr->SetFontStyle( wxBOLD ); $parstyle1->SetStyle( $attr ); $attr = Wx::RichTextAttr->new; $attr->SetLeftIndent( 100, 200 ); $attr->SetRightIndent( 200 ); $parstyle2->SetStyle( $attr ); $attr = Wx::RichTextAttr->new; $attr->SetTextColour( wxRED ); $liststyle1->SetStyle( $attr ); $liststyle1->SetAttributes( 0, 50, 70, wxTEXT_ATTR_BULLET_STYLE_ARABIC ); $liststyle1->SetAttributes( 1, 50, 70, wxTEXT_ATTR_BULLET_STYLE_ROMAN_UPPER ); $liststyle1->SetAttributes( 2, 50, 70, wxTEXT_ATTR_BULLET_STYLE_ROMAN_LOWER ); $liststyle2->SetAttributes( 0, 50, 70, wxTEXT_ATTR_BULLET_STYLE_SYMBOL, "*" ); $liststyle2->SetAttributes( 1, 50, 70, wxTEXT_ATTR_BULLET_STYLE_SYMBOL, "-" ); $liststyle2->SetAttributes( 2, 50, 70, wxTEXT_ATTR_BULLET_STYLE_SYMBOL, "+" ); $liststyle2->SetAttributes( 3, 50, 70, wxTEXT_ATTR_BULLET_STYLE_SYMBOL, "*" ); $liststyle2->SetAttributes( 4, 50, 70, wxTEXT_ATTR_BULLET_STYLE_SYMBOL, "-" ); $stylesheet->AddCharacterStyle( $charstyle1 ); $stylesheet->AddCharacterStyle( $charstyle2 ); $stylesheet->AddParagraphStyle( $parstyle1 ); $stylesheet->AddParagraphStyle( $parstyle2 ); $stylesheet->AddListStyle( $liststyle1 ); $stylesheet->AddListStyle( $liststyle2 ); return $stylesheet; } sub add_styled_text { my( $self ) = @_; my $r = $self->richtext; my $textFont = Wx::Font->new( 12, wxROMAN, wxNORMAL, wxNORMAL ); my $boldFont = Wx::Font->new( 12, wxROMAN, wxNORMAL, wxBOLD ); my $italicFont = Wx::Font->new( 12, wxROMAN, wxITALIC, wxNORMAL ); my $font = Wx::Font->new( 12, wxROMAN, wxNORMAL, wxNORMAL ); $r->BeginSuppressUndo; $r->BeginParagraphSpacing(0, 20); $r->BeginAlignment(wxTEXT_ALIGNMENT_CENTRE); $r->BeginBold; $r->BeginFontSize(14); $r->WriteText("Welcome to wxRichTextCtrl, a wxWidgets control for editing and presenting styled text and images"); $r->EndFontSize; $r->Newline; $r->BeginItalic; $r->WriteText("by Julian Smart"); $r->EndItalic; $r->EndBold; $r->Newline; # $r->WriteImage(wxBitmap(zebra_xpm)); $r->EndAlignment; $r->Newline; $r->Newline; $r->WriteText("What can you do with this thing? "); # $r->WriteImage(wxBitmap(smiley_xpm)); $r->WriteText(" Well, you can change text "); $r->BeginTextColour(Wx::Colour->new(255, 0, 0)); $r->WriteText("colour, like this red bit."); $r->EndTextColour; $r->BeginTextColour(Wx::Colour->new(0, 0, 255)); $r->WriteText(" And this blue bit."); $r->EndTextColour; $r->WriteText(" Naturally you can make things "); $r->BeginBold; $r->WriteText("bold "); $r->EndBold; $r->BeginItalic; $r->WriteText("or italic "); $r->EndItalic; $r->BeginUnderline; $r->WriteText("or underlined."); $r->EndUnderline; $r->BeginFontSize(14); $r->WriteText(" Different font sizes on the same line is allowed, too."); $r->EndFontSize; $r->WriteText(" Next we'll show an indented paragraph."); $r->BeginLeftIndent(60); $r->Newline; $r->WriteText("Indented paragraph."); $r->EndLeftIndent; $r->Newline; $r->WriteText("Next, we'll show a first-line indent, achieved using BeginLeftIndent(100, -40)."); $r->BeginLeftIndent(100, -40); $r->Newline; $r->WriteText("It was in January, the most down-trodden month of an Edinburgh winter."); $r->EndLeftIndent; $r->Newline; $r->WriteText("Numbered bullets are possible, again using subindents:"); $r->BeginNumberedBullet(1, 100, 60); $r->Newline; $r->WriteText("This is my first item. Note that wxRichTextCtrl doesn't automatically do numbering, but this will be added later."); $r->EndNumberedBullet; $r->BeginNumberedBullet(2, 100, 60); $r->Newline; $r->WriteText("This is my second item."); $r->EndNumberedBullet; $r->Newline; $r->WriteText("The following paragraph is right-indented:"); $r->BeginRightIndent(200); $r->Newline; $r->WriteText("It was in January, the most down-trodden month of an Edinburgh winter. An attractive woman came into the cafe, which is nothing remarkable."); $r->EndRightIndent; $r->Newline; my $attr = Wx::TextAttrEx->new;; $attr->SetFlags( wxTEXT_ATTR_TABS ); $attr->SetTabs( [ 400, 600, 800, 1000 ] ); $r->SetDefaultStyle($attr); $r->WriteText("This line contains tabs:\tFirst tab\tSecond tab\tThird tab"); $r->Newline; $r->WriteText("Other notable features of wxRichTextCtrl include:"); $r->BeginSymbolBullet('*', 100, 60); $r->Newline; $r->WriteText("Compatibility with wxTextCtrl API"); $r->EndSymbolBullet; $r->EndSuppressUndo; } sub print_preview { my($self) = @_; my $pv = $self->preview; $pv->SetHeaderText('Wx::Demo Richtext Printing', wxRICHTEXT_PAGE_ALL, wxRICHTEXT_PAGE_LEFT); $pv->SetFooterText('Page @PAGENUM@ of @PAGESCNT@', wxRICHTEXT_PAGE_ALL, wxRICHTEXT_PAGE_RIGHT); $pv->SetShowOnFirstPage(0); # we can only set header / footer margins using wxRichTextHeaderFooterData my $hfdata = $pv->GetHeaderFooterData; $hfdata->SetMargins(100,100); $pv->SetHeaderFooterData($hfdata); $self->preview->PreviewBuffer($self->richtext->GetBuffer()); } sub page_setup { my($self) = @_; $self->preview->PageSetup; } sub add_to_tags { qw(controls) } sub title { 'wxRichTextCtrl' } defined &Wx::RichTextCtrl::new ? 1 : 0;