2005-10-19 08:52:47 -04:00
/////////////////////////////////////////////////////////////////////////////
2005-11-03 11:53:29 -05:00
// Name: samples/richtext/richtext.cpp
2005-10-19 08:52:47 -04:00
// Purpose: wxWidgets rich text editor sample
// Author: Julian Smart
// Modified by:
// Created: 2005-10-02
// RCS-ID: $Id$
// Copyright: (c) Julian Smart
// Licence: wxWindows licence
/////////////////////////////////////////////////////////////////////////////
// ============================================================================
// declarations
// ============================================================================
// ----------------------------------------------------------------------------
// headers
// ----------------------------------------------------------------------------
// For compilers that support precompilation, includes "wx/wx.h".
# include "wx/wxprec.h"
# ifdef __BORLANDC__
# pragma hdrstop
# endif
// for all others, include the necessary headers (this file is usually all you
// need because it includes almost all "standard" wxWidgets headers)
# ifndef WX_PRECOMP
# include "wx/wx.h"
# endif
# include "wx/fontdlg.h"
# include "wx/splitter.h"
# include "wx/sstream.h"
# include "wx/html/htmlwin.h"
2006-10-26 02:35:57 -04:00
# if wxUSE_FILESYSTEM
# include "wx/filesys.h"
# include "wx/fs_mem.h"
# endif
2006-10-10 07:11:59 -04:00
# if wxUSE_HELP
# include "wx/cshelp.h"
# endif
2006-07-20 10:55:38 -04:00
# ifndef __WXMSW__
# include "../sample.xpm"
# endif
2005-10-19 08:52:47 -04:00
# include "bitmaps/smiley.xpm"
// #include "bitmaps/idea.xpm"
# include "bitmaps/zebra.xpm"
# include "bitmaps/open.xpm"
# include "bitmaps/save.xpm"
# include "bitmaps/copy.xpm"
# include "bitmaps/cut.xpm"
# include "bitmaps/paste.xpm"
# include "bitmaps/undo.xpm"
# include "bitmaps/redo.xpm"
# include "bitmaps/bold.xpm"
# include "bitmaps/italic.xpm"
# include "bitmaps/underline.xpm"
# include "bitmaps/alignleft.xpm"
# include "bitmaps/alignright.xpm"
# include "bitmaps/centre.xpm"
# include "bitmaps/font.xpm"
# include "bitmaps/indentless.xpm"
# include "bitmaps/indentmore.xpm"
2005-10-19 09:54:32 -04:00
# include "wx/richtext/richtextctrl.h"
# include "wx/richtext/richtextstyles.h"
# include "wx/richtext/richtextxml.h"
2005-12-18 07:31:07 -05:00
# include "wx/richtext/richtexthtml.h"
2006-10-08 10:13:03 -04:00
# include "wx/richtext/richtextformatdlg.h"
# include "wx/richtext/richtextsymboldlg.h"
2006-10-19 10:05:36 -04:00
# include "wx/richtext/richtextstyledlg.h"
2006-10-27 04:59:58 -04:00
# include "wx/richtext/richtextprint.h"
2005-10-19 08:52:47 -04:00
// ----------------------------------------------------------------------------
// resources
// ----------------------------------------------------------------------------
// ----------------------------------------------------------------------------
// private classes
// ----------------------------------------------------------------------------
// Define a new application type, each program should derive a class from wxApp
class MyApp : public wxApp
{
public :
// override base class virtuals
// ----------------------------
// this one is called on application startup and is a good place for the app
// initialization (doing it here and not in the ctor allows to have an error
// return: if OnInit() returns false, the application terminates)
virtual bool OnInit ( ) ;
virtual int OnExit ( ) ;
void CreateStyles ( ) ;
wxRichTextStyleSheet * GetStyleSheet ( ) const { return m_styleSheet ; }
2006-10-27 04:59:58 -04:00
wxRichTextPrinting * GetPrinting ( ) const { return m_printing ; }
2005-10-19 08:52:47 -04:00
2006-10-27 04:59:58 -04:00
wxRichTextStyleSheet * m_styleSheet ;
wxRichTextPrinting * m_printing ;
2005-10-19 08:52:47 -04:00
} ;
// Define a new frame type: this is going to be our main frame
class MyFrame : public wxFrame
{
public :
// ctor(s)
MyFrame ( const wxString & title , wxWindowID id , const wxPoint & pos = wxDefaultPosition ,
const wxSize & size = wxDefaultSize , long style = wxDEFAULT_FRAME_STYLE ) ;
// event handlers (these functions should _not_ be virtual)
void OnQuit ( wxCommandEvent & event ) ;
void OnAbout ( wxCommandEvent & event ) ;
void OnOpen ( wxCommandEvent & event ) ;
void OnSave ( wxCommandEvent & event ) ;
void OnSaveAs ( wxCommandEvent & event ) ;
void OnBold ( wxCommandEvent & event ) ;
void OnItalic ( wxCommandEvent & event ) ;
void OnUnderline ( wxCommandEvent & event ) ;
void OnUpdateBold ( wxUpdateUIEvent & event ) ;
void OnUpdateItalic ( wxUpdateUIEvent & event ) ;
void OnUpdateUnderline ( wxUpdateUIEvent & event ) ;
void OnAlignLeft ( wxCommandEvent & event ) ;
void OnAlignCentre ( wxCommandEvent & event ) ;
void OnAlignRight ( wxCommandEvent & event ) ;
void OnUpdateAlignLeft ( wxUpdateUIEvent & event ) ;
void OnUpdateAlignCentre ( wxUpdateUIEvent & event ) ;
void OnUpdateAlignRight ( wxUpdateUIEvent & event ) ;
void OnIndentMore ( wxCommandEvent & event ) ;
void OnIndentLess ( wxCommandEvent & event ) ;
2006-10-08 10:13:03 -04:00
void OnFont ( wxCommandEvent & event ) ;
void OnParagraph ( wxCommandEvent & event ) ;
void OnFormat ( wxCommandEvent & event ) ;
void OnUpdateFormat ( wxUpdateUIEvent & event ) ;
void OnInsertSymbol ( wxCommandEvent & event ) ;
2005-10-19 08:52:47 -04:00
void OnLineSpacingHalf ( wxCommandEvent & event ) ;
void OnLineSpacingDouble ( wxCommandEvent & event ) ;
void OnLineSpacingSingle ( wxCommandEvent & event ) ;
void OnParagraphSpacingMore ( wxCommandEvent & event ) ;
void OnParagraphSpacingLess ( wxCommandEvent & event ) ;
2006-10-17 10:12:03 -04:00
void OnNumberList ( wxCommandEvent & event ) ;
2006-10-19 10:05:36 -04:00
void OnBulletsAndNumbering ( wxCommandEvent & event ) ;
2006-10-17 10:12:03 -04:00
void OnItemizeList ( wxCommandEvent & event ) ;
void OnRenumberList ( wxCommandEvent & event ) ;
void OnPromoteList ( wxCommandEvent & event ) ;
void OnDemoteList ( wxCommandEvent & event ) ;
void OnClearList ( wxCommandEvent & event ) ;
2008-02-12 12:05:54 -05:00
void OnReload ( wxCommandEvent & event ) ;
2005-10-19 08:52:47 -04:00
void OnViewHTML ( wxCommandEvent & event ) ;
2006-09-29 04:53:23 -04:00
void OnSwitchStyleSheets ( wxCommandEvent & event ) ;
2006-10-19 10:05:36 -04:00
void OnManageStyles ( wxCommandEvent & event ) ;
2006-09-29 04:53:23 -04:00
2006-10-26 02:35:57 -04:00
void OnInsertURL ( wxCommandEvent & event ) ;
void OnURL ( wxTextUrlEvent & event ) ;
void OnStyleSheetReplacing ( wxRichTextEvent & event ) ;
2006-10-27 04:59:58 -04:00
void OnPrint ( wxCommandEvent & event ) ;
void OnPreview ( wxCommandEvent & event ) ;
void OnPageSetup ( wxCommandEvent & event ) ;
2005-10-19 08:52:47 -04:00
// Forward command events to the current rich text control, if any
bool ProcessEvent ( wxEvent & event ) ;
2008-02-12 12:05:54 -05:00
// Write text
void WriteInitialText ( ) ;
2005-10-19 08:52:47 -04:00
private :
// any class wishing to process wxWidgets events must use this macro
DECLARE_EVENT_TABLE ( )
wxRichTextCtrl * m_richTextCtrl ;
} ;
// ----------------------------------------------------------------------------
// constants
// ----------------------------------------------------------------------------
// IDs for the controls and the menu commands
enum
{
// menu items
ID_Quit = wxID_EXIT ,
ID_About = wxID_ABOUT ,
ID_FORMAT_BOLD = 100 ,
ID_FORMAT_ITALIC ,
ID_FORMAT_UNDERLINE ,
ID_FORMAT_FONT ,
2006-10-08 10:13:03 -04:00
ID_FORMAT_PARAGRAPH ,
ID_FORMAT_CONTENT ,
2008-02-12 12:05:54 -05:00
ID_RELOAD ,
2006-10-08 10:13:03 -04:00
ID_INSERT_SYMBOL ,
2006-10-26 02:35:57 -04:00
ID_INSERT_URL ,
2005-10-19 08:52:47 -04:00
ID_FORMAT_ALIGN_LEFT ,
ID_FORMAT_ALIGN_CENTRE ,
ID_FORMAT_ALIGN_RIGHT ,
ID_FORMAT_INDENT_MORE ,
ID_FORMAT_INDENT_LESS ,
ID_FORMAT_PARAGRAPH_SPACING_MORE ,
ID_FORMAT_PARAGRAPH_SPACING_LESS ,
ID_FORMAT_LINE_SPACING_HALF ,
ID_FORMAT_LINE_SPACING_DOUBLE ,
ID_FORMAT_LINE_SPACING_SINGLE ,
2006-10-17 10:12:03 -04:00
ID_FORMAT_NUMBER_LIST ,
2006-10-19 10:05:36 -04:00
ID_FORMAT_BULLETS_AND_NUMBERING ,
2006-10-17 10:12:03 -04:00
ID_FORMAT_ITEMIZE_LIST ,
ID_FORMAT_RENUMBER_LIST ,
ID_FORMAT_PROMOTE_LIST ,
ID_FORMAT_DEMOTE_LIST ,
ID_FORMAT_CLEAR_LIST ,
2006-09-29 04:53:23 -04:00
ID_VIEW_HTML ,
ID_SWITCH_STYLE_SHEETS ,
2006-10-19 10:05:36 -04:00
ID_MANAGE_STYLES ,
2006-09-29 04:53:23 -04:00
2006-10-27 04:59:58 -04:00
ID_PRINT ,
ID_PREVIEW ,
ID_PAGE_SETUP ,
2006-09-29 04:53:23 -04:00
ID_RICHTEXT_CTRL ,
ID_RICHTEXT_STYLE_LIST ,
ID_RICHTEXT_STYLE_COMBO
2005-10-19 08:52:47 -04:00
} ;
// ----------------------------------------------------------------------------
// event tables and other macros for wxWidgets
// ----------------------------------------------------------------------------
// the event tables connect the wxWidgets events with the functions (event
// handlers) which process them. It can be also done at run-time, but for the
// simple menu events like this the static method is much simpler.
BEGIN_EVENT_TABLE ( MyFrame , wxFrame )
EVT_MENU ( ID_Quit , MyFrame : : OnQuit )
EVT_MENU ( ID_About , MyFrame : : OnAbout )
EVT_MENU ( wxID_OPEN , MyFrame : : OnOpen )
EVT_MENU ( wxID_SAVE , MyFrame : : OnSave )
EVT_MENU ( wxID_SAVEAS , MyFrame : : OnSaveAs )
EVT_MENU ( ID_FORMAT_BOLD , MyFrame : : OnBold )
EVT_MENU ( ID_FORMAT_ITALIC , MyFrame : : OnItalic )
EVT_MENU ( ID_FORMAT_UNDERLINE , MyFrame : : OnUnderline )
EVT_UPDATE_UI ( ID_FORMAT_BOLD , MyFrame : : OnUpdateBold )
EVT_UPDATE_UI ( ID_FORMAT_ITALIC , MyFrame : : OnUpdateItalic )
EVT_UPDATE_UI ( ID_FORMAT_UNDERLINE , MyFrame : : OnUpdateUnderline )
EVT_MENU ( ID_FORMAT_ALIGN_LEFT , MyFrame : : OnAlignLeft )
EVT_MENU ( ID_FORMAT_ALIGN_CENTRE , MyFrame : : OnAlignCentre )
EVT_MENU ( ID_FORMAT_ALIGN_RIGHT , MyFrame : : OnAlignRight )
EVT_UPDATE_UI ( ID_FORMAT_ALIGN_LEFT , MyFrame : : OnUpdateAlignLeft )
EVT_UPDATE_UI ( ID_FORMAT_ALIGN_CENTRE , MyFrame : : OnUpdateAlignCentre )
EVT_UPDATE_UI ( ID_FORMAT_ALIGN_RIGHT , MyFrame : : OnUpdateAlignRight )
EVT_MENU ( ID_FORMAT_FONT , MyFrame : : OnFont )
2006-10-08 10:13:03 -04:00
EVT_MENU ( ID_FORMAT_PARAGRAPH , MyFrame : : OnParagraph )
EVT_MENU ( ID_FORMAT_CONTENT , MyFrame : : OnFormat )
EVT_UPDATE_UI ( ID_FORMAT_CONTENT , MyFrame : : OnUpdateFormat )
EVT_UPDATE_UI ( ID_FORMAT_FONT , MyFrame : : OnUpdateFormat )
EVT_UPDATE_UI ( ID_FORMAT_PARAGRAPH , MyFrame : : OnUpdateFormat )
2005-10-19 08:52:47 -04:00
EVT_MENU ( ID_FORMAT_INDENT_MORE , MyFrame : : OnIndentMore )
EVT_MENU ( ID_FORMAT_INDENT_LESS , MyFrame : : OnIndentLess )
EVT_MENU ( ID_FORMAT_LINE_SPACING_HALF , MyFrame : : OnLineSpacingHalf )
EVT_MENU ( ID_FORMAT_LINE_SPACING_SINGLE , MyFrame : : OnLineSpacingSingle )
EVT_MENU ( ID_FORMAT_LINE_SPACING_DOUBLE , MyFrame : : OnLineSpacingDouble )
EVT_MENU ( ID_FORMAT_PARAGRAPH_SPACING_MORE , MyFrame : : OnParagraphSpacingMore )
EVT_MENU ( ID_FORMAT_PARAGRAPH_SPACING_LESS , MyFrame : : OnParagraphSpacingLess )
2008-02-12 12:05:54 -05:00
EVT_MENU ( ID_RELOAD , MyFrame : : OnReload )
2006-10-08 10:13:03 -04:00
EVT_MENU ( ID_INSERT_SYMBOL , MyFrame : : OnInsertSymbol )
2006-10-26 02:35:57 -04:00
EVT_MENU ( ID_INSERT_URL , MyFrame : : OnInsertURL )
2006-10-08 10:13:03 -04:00
2006-10-17 10:12:03 -04:00
EVT_MENU ( ID_FORMAT_NUMBER_LIST , MyFrame : : OnNumberList )
2006-10-19 10:05:36 -04:00
EVT_MENU ( ID_FORMAT_BULLETS_AND_NUMBERING , MyFrame : : OnBulletsAndNumbering )
2006-10-17 10:12:03 -04:00
EVT_MENU ( ID_FORMAT_ITEMIZE_LIST , MyFrame : : OnItemizeList )
EVT_MENU ( ID_FORMAT_RENUMBER_LIST , MyFrame : : OnRenumberList )
EVT_MENU ( ID_FORMAT_PROMOTE_LIST , MyFrame : : OnPromoteList )
EVT_MENU ( ID_FORMAT_DEMOTE_LIST , MyFrame : : OnDemoteList )
EVT_MENU ( ID_FORMAT_CLEAR_LIST , MyFrame : : OnClearList )
2005-10-19 08:52:47 -04:00
EVT_MENU ( ID_VIEW_HTML , MyFrame : : OnViewHTML )
2006-09-29 04:53:23 -04:00
EVT_MENU ( ID_SWITCH_STYLE_SHEETS , MyFrame : : OnSwitchStyleSheets )
2006-10-19 10:05:36 -04:00
EVT_MENU ( ID_MANAGE_STYLES , MyFrame : : OnManageStyles )
2006-10-26 02:35:57 -04:00
2006-10-27 04:59:58 -04:00
EVT_MENU ( ID_PRINT , MyFrame : : OnPrint )
EVT_MENU ( ID_PREVIEW , MyFrame : : OnPreview )
EVT_MENU ( ID_PAGE_SETUP , MyFrame : : OnPageSetup )
2006-10-26 02:35:57 -04:00
EVT_TEXT_URL ( wxID_ANY , MyFrame : : OnURL )
EVT_RICHTEXT_STYLESHEET_REPLACING ( wxID_ANY , MyFrame : : OnStyleSheetReplacing )
2005-10-19 08:52:47 -04:00
END_EVENT_TABLE ( )
// Create a new application object: this macro will allow wxWidgets to create
// the application object during program execution (it's better than using a
// static object for many reasons) and also implements the accessor function
// wxGetApp() which will return the reference of the right type (i.e. MyApp and
// not wxApp)
IMPLEMENT_APP ( MyApp )
// ============================================================================
// implementation
// ============================================================================
// ----------------------------------------------------------------------------
// the application class
// ----------------------------------------------------------------------------
// 'Main program' equivalent: the program execution "starts" here
bool MyApp : : OnInit ( )
{
2007-02-03 19:34:18 -05:00
if ( ! wxApp : : OnInit ( ) )
return false ;
2006-10-10 07:11:59 -04:00
# if wxUSE_HELP
wxHelpProvider : : Set ( new wxSimpleHelpProvider ) ;
# endif
2005-10-19 08:52:47 -04:00
m_styleSheet = new wxRichTextStyleSheet ;
2006-10-27 04:59:58 -04:00
m_printing = new wxRichTextPrinting ( wxT ( " Test Document " ) ) ;
m_printing - > SetFooterText ( wxT ( " @TITLE@ " ) , wxRICHTEXT_PAGE_ALL , wxRICHTEXT_PAGE_CENTRE ) ;
m_printing - > SetFooterText ( wxT ( " Page @PAGENUM@ " ) , wxRICHTEXT_PAGE_ALL , wxRICHTEXT_PAGE_RIGHT ) ;
2005-10-19 08:52:47 -04:00
CreateStyles ( ) ;
// Add extra handlers (plain text is automatically added)
wxRichTextBuffer : : AddHandler ( new wxRichTextXMLHandler ) ;
wxRichTextBuffer : : AddHandler ( new wxRichTextHTMLHandler ) ;
// Add image handlers
# if wxUSE_LIBPNG
wxImage : : AddHandler ( new wxPNGHandler ) ;
# endif
2005-10-25 19:18:15 -04:00
2005-10-19 08:52:47 -04:00
# if wxUSE_LIBJPEG
wxImage : : AddHandler ( new wxJPEGHandler ) ;
# endif
# if wxUSE_GIF
wxImage : : AddHandler ( new wxGIFHandler ) ;
# endif
2006-10-26 02:35:57 -04:00
# if wxUSE_FILESYSTEM
wxFileSystem : : AddHandler ( new wxMemoryFSHandler ) ;
# endif
2005-10-19 08:52:47 -04:00
// create the main application window
2006-09-12 08:02:54 -04:00
MyFrame * frame = new MyFrame ( _T ( " wxRichTextCtrl Sample " ) , wxID_ANY , wxDefaultPosition , wxSize ( 700 , 600 ) ) ;
2005-10-19 08:52:47 -04:00
2006-10-27 04:59:58 -04:00
m_printing - > SetParentWindow ( frame ) ;
2005-10-19 08:52:47 -04:00
// and show it (the frames, unlike simple controls, are not shown when
// created initially)
frame - > Show ( true ) ;
// success: wxApp::OnRun() will be called which will enter the main message
// loop and the application will run. If we returned false here, the
// application would exit immediately.
return true ;
}
int MyApp : : OnExit ( )
{
2006-10-27 04:59:58 -04:00
delete m_printing ;
2005-10-19 08:52:47 -04:00
delete m_styleSheet ;
2006-10-27 04:59:58 -04:00
2005-10-19 08:52:47 -04:00
return 0 ;
}
void MyApp : : CreateStyles ( )
{
// Paragraph styles
wxFont romanFont ( 12 , wxROMAN , wxNORMAL , wxNORMAL ) ;
wxFont swissFont ( 12 , wxSWISS , wxNORMAL , wxNORMAL ) ;
wxRichTextParagraphStyleDefinition * normalPara = new wxRichTextParagraphStyleDefinition ( wxT ( " Normal " ) ) ;
wxRichTextAttr normalAttr ;
normalAttr . SetFontFaceName ( romanFont . GetFaceName ( ) ) ;
normalAttr . SetFontSize ( 12 ) ;
// Let's set all attributes for this style
normalAttr . SetFlags ( wxTEXT_ATTR_FONT | wxTEXT_ATTR_BACKGROUND_COLOUR | wxTEXT_ATTR_TEXT_COLOUR | wxTEXT_ATTR_ALIGNMENT | wxTEXT_ATTR_LEFT_INDENT | wxTEXT_ATTR_RIGHT_INDENT | wxTEXT_ATTR_TABS |
wxTEXT_ATTR_PARA_SPACING_BEFORE | wxTEXT_ATTR_PARA_SPACING_AFTER | wxTEXT_ATTR_LINE_SPACING |
wxTEXT_ATTR_BULLET_STYLE | wxTEXT_ATTR_BULLET_NUMBER ) ;
normalPara - > SetStyle ( normalAttr ) ;
2005-10-25 19:18:15 -04:00
2005-10-19 08:52:47 -04:00
m_styleSheet - > AddParagraphStyle ( normalPara ) ;
wxRichTextParagraphStyleDefinition * indentedPara = new wxRichTextParagraphStyleDefinition ( wxT ( " Indented " ) ) ;
wxRichTextAttr indentedAttr ;
indentedAttr . SetFontFaceName ( romanFont . GetFaceName ( ) ) ;
indentedAttr . SetFontSize ( 12 ) ;
indentedAttr . SetLeftIndent ( 100 , 0 ) ;
// We only want to affect indentation
indentedAttr . SetFlags ( wxTEXT_ATTR_LEFT_INDENT | wxTEXT_ATTR_RIGHT_INDENT ) ;
indentedPara - > SetStyle ( indentedAttr ) ;
2005-10-25 19:18:15 -04:00
2005-10-19 08:52:47 -04:00
m_styleSheet - > AddParagraphStyle ( indentedPara ) ;
2006-07-03 17:13:18 -04:00
wxRichTextParagraphStyleDefinition * indentedPara2 = new wxRichTextParagraphStyleDefinition ( wxT ( " Red Bold Indented " ) ) ;
wxRichTextAttr indentedAttr2 ;
indentedAttr2 . SetFontFaceName ( romanFont . GetFaceName ( ) ) ;
indentedAttr2 . SetFontSize ( 12 ) ;
indentedAttr2 . SetFontWeight ( wxBOLD ) ;
indentedAttr2 . SetTextColour ( * wxRED ) ;
indentedAttr2 . SetFontSize ( 12 ) ;
indentedAttr2 . SetLeftIndent ( 100 , 0 ) ;
// We want to affect indentation, font and text colour
indentedAttr2 . SetFlags ( wxTEXT_ATTR_LEFT_INDENT | wxTEXT_ATTR_RIGHT_INDENT | wxTEXT_ATTR_FONT | wxTEXT_ATTR_TEXT_COLOUR ) ;
indentedPara2 - > SetStyle ( indentedAttr2 ) ;
m_styleSheet - > AddParagraphStyle ( indentedPara2 ) ;
2005-10-19 08:52:47 -04:00
wxRichTextParagraphStyleDefinition * flIndentedPara = new wxRichTextParagraphStyleDefinition ( wxT ( " First Line Indented " ) ) ;
wxRichTextAttr flIndentedAttr ;
flIndentedAttr . SetFontFaceName ( swissFont . GetFaceName ( ) ) ;
flIndentedAttr . SetFontSize ( 12 ) ;
flIndentedAttr . SetLeftIndent ( 100 , - 100 ) ;
// We only want to affect indentation
flIndentedAttr . SetFlags ( wxTEXT_ATTR_LEFT_INDENT | wxTEXT_ATTR_RIGHT_INDENT ) ;
flIndentedPara - > SetStyle ( flIndentedAttr ) ;
2005-10-25 19:18:15 -04:00
2005-10-19 08:52:47 -04:00
m_styleSheet - > AddParagraphStyle ( flIndentedPara ) ;
// Character styles
wxRichTextCharacterStyleDefinition * boldDef = new wxRichTextCharacterStyleDefinition ( wxT ( " Bold " ) ) ;
wxRichTextAttr boldAttr ;
boldAttr . SetFontFaceName ( romanFont . GetFaceName ( ) ) ;
boldAttr . SetFontSize ( 12 ) ;
boldAttr . SetFontWeight ( wxBOLD ) ;
// We only want to affect boldness
boldAttr . SetFlags ( wxTEXT_ATTR_FONT_WEIGHT ) ;
boldDef - > SetStyle ( boldAttr ) ;
2005-10-25 19:18:15 -04:00
2005-10-19 08:52:47 -04:00
m_styleSheet - > AddCharacterStyle ( boldDef ) ;
wxRichTextCharacterStyleDefinition * italicDef = new wxRichTextCharacterStyleDefinition ( wxT ( " Italic " ) ) ;
wxRichTextAttr italicAttr ;
italicAttr . SetFontFaceName ( romanFont . GetFaceName ( ) ) ;
italicAttr . SetFontSize ( 12 ) ;
italicAttr . SetFontStyle ( wxITALIC ) ;
// We only want to affect italics
italicAttr . SetFlags ( wxTEXT_ATTR_FONT_ITALIC ) ;
italicDef - > SetStyle ( italicAttr ) ;
2005-10-25 19:18:15 -04:00
2005-10-19 08:52:47 -04:00
m_styleSheet - > AddCharacterStyle ( italicDef ) ;
wxRichTextCharacterStyleDefinition * redDef = new wxRichTextCharacterStyleDefinition ( wxT ( " Red Bold " ) ) ;
wxRichTextAttr redAttr ;
redAttr . SetFontFaceName ( romanFont . GetFaceName ( ) ) ;
redAttr . SetFontSize ( 12 ) ;
redAttr . SetFontWeight ( wxBOLD ) ;
redAttr . SetTextColour ( * wxRED ) ;
// We only want to affect colour, weight and face
redAttr . SetFlags ( wxTEXT_ATTR_FONT_FACE | wxTEXT_ATTR_FONT_WEIGHT | wxTEXT_ATTR_TEXT_COLOUR ) ;
redDef - > SetStyle ( redAttr ) ;
2005-10-25 19:18:15 -04:00
2005-10-19 08:52:47 -04:00
m_styleSheet - > AddCharacterStyle ( redDef ) ;
2006-10-17 10:12:03 -04:00
wxRichTextListStyleDefinition * bulletList = new wxRichTextListStyleDefinition ( wxT ( " Bullet List 1 " ) ) ;
int i ;
for ( i = 0 ; i < 10 ; i + + )
{
2006-10-26 02:35:57 -04:00
wxString bulletText ;
2006-10-17 10:12:03 -04:00
if ( i = = 0 )
2006-10-26 02:35:57 -04:00
bulletText = wxT ( " standard/circle " ) ;
2006-10-17 10:12:03 -04:00
else if ( i = = 1 )
2006-10-26 02:35:57 -04:00
bulletText = wxT ( " standard/square " ) ;
2006-10-17 10:12:03 -04:00
else if ( i = = 2 )
2006-10-26 02:35:57 -04:00
bulletText = wxT ( " standard/circle " ) ;
2006-10-17 10:12:03 -04:00
else if ( i = = 3 )
2006-10-26 02:35:57 -04:00
bulletText = wxT ( " standard/square " ) ;
2006-10-17 10:12:03 -04:00
else
2006-10-26 02:35:57 -04:00
bulletText = wxT ( " standard/circle " ) ;
2006-10-17 10:12:03 -04:00
2006-10-26 02:35:57 -04:00
bulletList - > SetAttributes ( i , ( i + 1 ) * 60 , 60 , wxTEXT_ATTR_BULLET_STYLE_STANDARD , bulletText ) ;
2006-10-17 10:12:03 -04:00
}
m_styleSheet - > AddListStyle ( bulletList ) ;
wxRichTextListStyleDefinition * numberedList = new wxRichTextListStyleDefinition ( wxT ( " Numbered List 1 " ) ) ;
for ( i = 0 ; i < 10 ; i + + )
{
long numberStyle ;
if ( i = = 0 )
numberStyle = wxTEXT_ATTR_BULLET_STYLE_ARABIC | wxTEXT_ATTR_BULLET_STYLE_PERIOD ;
else if ( i = = 1 )
numberStyle = wxTEXT_ATTR_BULLET_STYLE_LETTERS_LOWER | wxTEXT_ATTR_BULLET_STYLE_PARENTHESES ;
else if ( i = = 2 )
numberStyle = wxTEXT_ATTR_BULLET_STYLE_ROMAN_LOWER | wxTEXT_ATTR_BULLET_STYLE_PARENTHESES ;
else if ( i = = 3 )
numberStyle = wxTEXT_ATTR_BULLET_STYLE_ROMAN_UPPER | wxTEXT_ATTR_BULLET_STYLE_PARENTHESES ;
else
numberStyle = wxTEXT_ATTR_BULLET_STYLE_ARABIC | wxTEXT_ATTR_BULLET_STYLE_PERIOD ;
2006-10-26 02:35:57 -04:00
numberStyle | = wxTEXT_ATTR_BULLET_STYLE_ALIGN_RIGHT ;
2006-10-17 10:12:03 -04:00
numberedList - > SetAttributes ( i , ( i + 1 ) * 60 , 60 , numberStyle ) ;
}
m_styleSheet - > AddListStyle ( numberedList ) ;
2006-10-26 02:35:57 -04:00
wxRichTextListStyleDefinition * outlineList = new wxRichTextListStyleDefinition ( wxT ( " Outline List 1 " ) ) ;
for ( i = 0 ; i < 10 ; i + + )
{
long numberStyle ;
if ( i < 4 )
numberStyle = wxTEXT_ATTR_BULLET_STYLE_OUTLINE | wxTEXT_ATTR_BULLET_STYLE_PERIOD ;
else
numberStyle = wxTEXT_ATTR_BULLET_STYLE_ARABIC | wxTEXT_ATTR_BULLET_STYLE_PERIOD ;
outlineList - > SetAttributes ( i , ( i + 1 ) * 120 , 120 , numberStyle ) ;
}
m_styleSheet - > AddListStyle ( outlineList ) ;
2005-10-19 08:52:47 -04:00
}
// ----------------------------------------------------------------------------
// main frame
// ----------------------------------------------------------------------------
// frame constructor
MyFrame : : MyFrame ( const wxString & title , wxWindowID id , const wxPoint & pos ,
const wxSize & size , long style )
: wxFrame ( NULL , id , title , pos , size , style )
{
// set the frame icon
2006-07-20 10:55:38 -04:00
SetIcon ( wxICON ( sample ) ) ;
2005-10-19 08:52:47 -04:00
// create a menu bar
wxMenu * fileMenu = new wxMenu ;
// the "About" item should be in the help menu
wxMenu * helpMenu = new wxMenu ;
helpMenu - > Append ( ID_About , _T ( " &About... \t F1 " ) , _T ( " Show about dialog " ) ) ;
fileMenu - > Append ( wxID_OPEN , _T ( " &Open \t Ctrl+O " ) , _T ( " Open a file " ) ) ;
fileMenu - > Append ( wxID_SAVE , _T ( " &Save \t Ctrl+S " ) , _T ( " Save a file " ) ) ;
fileMenu - > Append ( wxID_SAVEAS , _T ( " &Save As... \t F12 " ) , _T ( " Save to a new file " ) ) ;
fileMenu - > AppendSeparator ( ) ;
2008-02-12 12:05:54 -05:00
fileMenu - > Append ( ID_RELOAD , _T ( " &Reload Text \t F2 " ) , _T ( " Reload the initial text " ) ) ;
fileMenu - > AppendSeparator ( ) ;
2006-10-27 04:59:58 -04:00
fileMenu - > Append ( ID_PAGE_SETUP , _T ( " Page Set&up... " ) , _T ( " Page setup " ) ) ;
fileMenu - > Append ( ID_PRINT , _T ( " &Print... \t Ctrl+P " ) , _T ( " Print " ) ) ;
fileMenu - > Append ( ID_PREVIEW , _T ( " Print Pre&view " ) , _T ( " Print preview " ) ) ;
fileMenu - > AppendSeparator ( ) ;
2005-10-19 08:52:47 -04:00
fileMenu - > Append ( ID_VIEW_HTML , _T ( " &View as HTML " ) , _T ( " View HTML " ) ) ;
fileMenu - > AppendSeparator ( ) ;
2005-10-22 04:46:41 -04:00
fileMenu - > Append ( ID_Quit , _T ( " E&xit \t Alt+X " ) , _T ( " Quit this program " ) ) ;
2005-10-19 08:52:47 -04:00
wxMenu * editMenu = new wxMenu ;
editMenu - > Append ( wxID_UNDO , _ ( " &Undo \t Ctrl+Z " ) ) ;
editMenu - > Append ( wxID_REDO , _ ( " &Redo \t Ctrl+Y " ) ) ;
editMenu - > AppendSeparator ( ) ;
editMenu - > Append ( wxID_CUT , _ ( " Cu&t \t Ctrl+X " ) ) ;
editMenu - > Append ( wxID_COPY , _ ( " &Copy \t Ctrl+C " ) ) ;
editMenu - > Append ( wxID_PASTE , _ ( " &Paste \t Ctrl+V " ) ) ;
editMenu - > AppendSeparator ( ) ;
editMenu - > Append ( wxID_SELECTALL , _ ( " Select A&ll \t Ctrl+A " ) ) ;
#if 0
editMenu - > AppendSeparator ( ) ;
editMenu - > Append ( wxID_FIND , _ ( " &Find... \t Ctrl+F " ) ) ;
editMenu - > Append ( stID_FIND_REPLACE , _ ( " &Replace... \t Ctrl+R " ) ) ;
# endif
wxMenu * formatMenu = new wxMenu ;
formatMenu - > AppendCheckItem ( ID_FORMAT_BOLD , _ ( " &Bold \t Ctrl+B " ) ) ;
formatMenu - > AppendCheckItem ( ID_FORMAT_ITALIC , _ ( " &Italic \t Ctrl+I " ) ) ;
formatMenu - > AppendCheckItem ( ID_FORMAT_UNDERLINE , _ ( " &Underline \t Ctrl+U " ) ) ;
formatMenu - > AppendSeparator ( ) ;
formatMenu - > AppendCheckItem ( ID_FORMAT_ALIGN_LEFT , _ ( " L&eft Align " ) ) ;
formatMenu - > AppendCheckItem ( ID_FORMAT_ALIGN_RIGHT , _ ( " &Right Align " ) ) ;
formatMenu - > AppendCheckItem ( ID_FORMAT_ALIGN_CENTRE , _ ( " &Centre " ) ) ;
formatMenu - > AppendSeparator ( ) ;
2005-10-22 04:46:41 -04:00
formatMenu - > Append ( ID_FORMAT_INDENT_MORE , _ ( " Indent &More " ) ) ;
2005-10-19 08:52:47 -04:00
formatMenu - > Append ( ID_FORMAT_INDENT_LESS , _ ( " Indent &Less " ) ) ;
formatMenu - > AppendSeparator ( ) ;
formatMenu - > Append ( ID_FORMAT_PARAGRAPH_SPACING_MORE , _ ( " Increase Paragraph &Spacing " ) ) ;
formatMenu - > Append ( ID_FORMAT_PARAGRAPH_SPACING_LESS , _ ( " Decrease &Paragraph Spacing " ) ) ;
formatMenu - > AppendSeparator ( ) ;
formatMenu - > Append ( ID_FORMAT_LINE_SPACING_SINGLE , _ ( " Normal Line Spacing " ) ) ;
formatMenu - > Append ( ID_FORMAT_LINE_SPACING_HALF , _ ( " 1.5 Line Spacing " ) ) ;
formatMenu - > Append ( ID_FORMAT_LINE_SPACING_DOUBLE , _ ( " Double Line Spacing " ) ) ;
formatMenu - > AppendSeparator ( ) ;
formatMenu - > Append ( ID_FORMAT_FONT , _ ( " &Font... " ) ) ;
2006-10-08 10:13:03 -04:00
formatMenu - > Append ( ID_FORMAT_PARAGRAPH , _ ( " &Paragraph... " ) ) ;
formatMenu - > Append ( ID_FORMAT_CONTENT , _ ( " Font and Pa&ragraph... \t Shift+Ctrl+F " ) ) ;
2006-09-29 04:53:23 -04:00
formatMenu - > AppendSeparator ( ) ;
formatMenu - > Append ( ID_SWITCH_STYLE_SHEETS , _ ( " &Switch Style Sheets " ) ) ;
2006-10-19 10:05:36 -04:00
formatMenu - > Append ( ID_MANAGE_STYLES , _ ( " &Manage Styles " ) ) ;
wxMenu * listsMenu = new wxMenu ;
listsMenu - > Append ( ID_FORMAT_BULLETS_AND_NUMBERING , _ ( " Bullets and &Numbering... " ) ) ;
listsMenu - > AppendSeparator ( ) ;
listsMenu - > Append ( ID_FORMAT_NUMBER_LIST , _ ( " Number List " ) ) ;
listsMenu - > Append ( ID_FORMAT_ITEMIZE_LIST , _ ( " Itemize List " ) ) ;
listsMenu - > Append ( ID_FORMAT_RENUMBER_LIST , _ ( " Renumber List " ) ) ;
listsMenu - > Append ( ID_FORMAT_PROMOTE_LIST , _ ( " Promote List Items " ) ) ;
listsMenu - > Append ( ID_FORMAT_DEMOTE_LIST , _ ( " Demote List Items " ) ) ;
listsMenu - > Append ( ID_FORMAT_CLEAR_LIST , _ ( " Clear List Formatting " ) ) ;
2005-10-19 08:52:47 -04:00
2006-10-08 10:13:03 -04:00
wxMenu * insertMenu = new wxMenu ;
insertMenu - > Append ( ID_INSERT_SYMBOL , _ ( " &Symbol... \t Ctrl+I " ) ) ;
2006-10-26 02:35:57 -04:00
insertMenu - > Append ( ID_INSERT_URL , _ ( " &URL... " ) ) ;
2006-10-08 10:13:03 -04:00
2005-10-19 08:52:47 -04:00
// now append the freshly created menu to the menu bar...
wxMenuBar * menuBar = new wxMenuBar ( ) ;
menuBar - > Append ( fileMenu , _T ( " &File " ) ) ;
menuBar - > Append ( editMenu , _T ( " &Edit " ) ) ;
menuBar - > Append ( formatMenu , _T ( " F&ormat " ) ) ;
2006-10-19 10:05:36 -04:00
menuBar - > Append ( listsMenu , _T ( " &Lists " ) ) ;
2006-10-08 10:13:03 -04:00
menuBar - > Append ( insertMenu , _T ( " &Insert " ) ) ;
2005-10-19 08:52:47 -04:00
menuBar - > Append ( helpMenu , _T ( " &Help " ) ) ;
// ... and attach this menu bar to the frame
SetMenuBar ( menuBar ) ;
// create a status bar just for fun (by default with 1 pane only)
2006-07-21 11:28:50 -04:00
// but don't create it on limited screen space (WinCE)
bool is_pda = wxSystemSettings : : GetScreenType ( ) < = wxSYS_SCREEN_PDA ;
2005-10-25 19:18:15 -04:00
# if wxUSE_STATUSBAR
2006-07-21 11:28:50 -04:00
if ( ! is_pda )
{
CreateStatusBar ( 2 ) ;
SetStatusText ( _T ( " Welcome to wxRichTextCtrl! " ) ) ;
}
2005-10-25 19:18:15 -04:00
# endif
2005-10-19 08:52:47 -04:00
wxToolBar * toolBar = CreateToolBar ( ) ;
2005-10-25 19:18:15 -04:00
toolBar - > AddTool ( wxID_OPEN , wxBitmap ( open_xpm ) , wxNullBitmap , false , - 1 , - 1 , ( wxObject * ) NULL , _ ( " Open " ) ) ;
toolBar - > AddTool ( wxID_SAVEAS , wxBitmap ( save_xpm ) , wxNullBitmap , false , - 1 , - 1 , ( wxObject * ) NULL , _ ( " Save " ) ) ;
2005-10-19 08:52:47 -04:00
toolBar - > AddSeparator ( ) ;
2005-10-25 19:18:15 -04:00
toolBar - > AddTool ( wxID_CUT , wxBitmap ( cut_xpm ) , wxNullBitmap , false , - 1 , - 1 , ( wxObject * ) NULL , _ ( " Cut " ) ) ;
toolBar - > AddTool ( wxID_COPY , wxBitmap ( copy_xpm ) , wxNullBitmap , false , - 1 , - 1 , ( wxObject * ) NULL , _ ( " Copy " ) ) ;
toolBar - > AddTool ( wxID_PASTE , wxBitmap ( paste_xpm ) , wxNullBitmap , false , - 1 , - 1 , ( wxObject * ) NULL , _ ( " Paste " ) ) ;
2005-10-19 08:52:47 -04:00
toolBar - > AddSeparator ( ) ;
2005-10-25 19:18:15 -04:00
toolBar - > AddTool ( wxID_UNDO , wxBitmap ( undo_xpm ) , wxNullBitmap , false , - 1 , - 1 , ( wxObject * ) NULL , _ ( " Undo " ) ) ;
toolBar - > AddTool ( wxID_REDO , wxBitmap ( redo_xpm ) , wxNullBitmap , false , - 1 , - 1 , ( wxObject * ) NULL , _ ( " Redo " ) ) ;
2005-10-19 08:52:47 -04:00
toolBar - > AddSeparator ( ) ;
2005-10-25 19:18:15 -04:00
toolBar - > AddTool ( ID_FORMAT_BOLD , wxBitmap ( bold_xpm ) , wxNullBitmap , true , - 1 , - 1 , ( wxObject * ) NULL , _ ( " Bold " ) ) ;
toolBar - > AddTool ( ID_FORMAT_ITALIC , wxBitmap ( italic_xpm ) , wxNullBitmap , true , - 1 , - 1 , ( wxObject * ) NULL , _ ( " Italic " ) ) ;
toolBar - > AddTool ( ID_FORMAT_UNDERLINE , wxBitmap ( underline_xpm ) , wxNullBitmap , true , - 1 , - 1 , ( wxObject * ) NULL , _ ( " Underline " ) ) ;
2005-10-19 08:52:47 -04:00
toolBar - > AddSeparator ( ) ;
2005-10-25 19:18:15 -04:00
toolBar - > AddTool ( ID_FORMAT_ALIGN_LEFT , wxBitmap ( alignleft_xpm ) , wxNullBitmap , true , - 1 , - 1 , ( wxObject * ) NULL , _ ( " Align Left " ) ) ;
toolBar - > AddTool ( ID_FORMAT_ALIGN_CENTRE , wxBitmap ( centre_xpm ) , wxNullBitmap , true , - 1 , - 1 , ( wxObject * ) NULL , _ ( " Centre " ) ) ;
toolBar - > AddTool ( ID_FORMAT_ALIGN_RIGHT , wxBitmap ( alignright_xpm ) , wxNullBitmap , true , - 1 , - 1 , ( wxObject * ) NULL , _ ( " Align Right " ) ) ;
2005-10-19 08:52:47 -04:00
toolBar - > AddSeparator ( ) ;
2005-10-25 19:18:15 -04:00
toolBar - > AddTool ( ID_FORMAT_INDENT_LESS , wxBitmap ( indentless_xpm ) , wxNullBitmap , false , - 1 , - 1 , ( wxObject * ) NULL , _ ( " Indent Less " ) ) ;
toolBar - > AddTool ( ID_FORMAT_INDENT_MORE , wxBitmap ( indentmore_xpm ) , wxNullBitmap , false , - 1 , - 1 , ( wxObject * ) NULL , _ ( " Indent More " ) ) ;
2005-10-19 08:52:47 -04:00
toolBar - > AddSeparator ( ) ;
2005-10-25 19:18:15 -04:00
toolBar - > AddTool ( ID_FORMAT_FONT , wxBitmap ( font_xpm ) , wxNullBitmap , false , - 1 , - 1 , ( wxObject * ) NULL , _ ( " Font " ) ) ;
2005-10-19 08:52:47 -04:00
2006-09-29 04:53:23 -04:00
wxRichTextStyleComboCtrl * combo = new wxRichTextStyleComboCtrl ( toolBar , ID_RICHTEXT_STYLE_COMBO , wxDefaultPosition , wxSize ( 200 , - 1 ) ) ;
2006-09-12 06:19:45 -04:00
toolBar - > AddControl ( combo ) ;
2005-10-19 08:52:47 -04:00
toolBar - > Realize ( ) ;
2007-08-07 15:22:43 -04:00
wxSplitterWindow * splitter = new wxSplitterWindow ( this , wxID_ANY , wxDefaultPosition , GetClientSize ( ) , wxSP_LIVE_UPDATE ) ;
2005-10-19 08:52:47 -04:00
wxFont textFont = wxFont ( 12 , wxROMAN , wxNORMAL , wxNORMAL ) ;
wxFont boldFont = wxFont ( 12 , wxROMAN , wxNORMAL , wxBOLD ) ;
wxFont italicFont = wxFont ( 12 , wxROMAN , wxITALIC , wxNORMAL ) ;
2007-08-07 15:22:43 -04:00
m_richTextCtrl = new wxRichTextCtrl ( splitter , ID_RICHTEXT_CTRL , wxEmptyString , wxDefaultPosition , wxSize ( 200 , 200 ) , wxVSCROLL | wxHSCROLL | wxWANTS_CHARS ) ;
2005-10-21 12:31:07 -04:00
wxFont font ( 12 , wxROMAN , wxNORMAL , wxNORMAL ) ;
m_richTextCtrl - > SetFont ( font ) ;
2005-10-19 08:52:47 -04:00
2006-09-29 04:53:23 -04:00
m_richTextCtrl - > SetStyleSheet ( wxGetApp ( ) . GetStyleSheet ( ) ) ;
2006-09-12 06:19:45 -04:00
combo - > SetStyleSheet ( wxGetApp ( ) . GetStyleSheet ( ) ) ;
combo - > SetRichTextCtrl ( m_richTextCtrl ) ;
combo - > UpdateStyles ( ) ;
2006-10-17 10:12:03 -04:00
wxRichTextStyleListCtrl * styleListCtrl = new wxRichTextStyleListCtrl ( splitter , ID_RICHTEXT_STYLE_LIST ) ;
2006-07-21 11:28:50 -04:00
wxSize display = wxGetDisplaySize ( ) ;
if ( is_pda & & ( display . GetWidth ( ) < display . GetHeight ( ) ) )
{
2006-10-17 10:12:03 -04:00
splitter - > SplitHorizontally ( m_richTextCtrl , styleListCtrl ) ;
2006-07-21 11:28:50 -04:00
}
else
{
2006-10-17 10:12:03 -04:00
splitter - > SplitVertically ( m_richTextCtrl , styleListCtrl , 500 ) ;
2006-07-21 11:28:50 -04:00
}
2005-10-19 08:52:47 -04:00
2005-10-21 16:04:53 -04:00
splitter - > UpdateSize ( ) ;
2006-10-17 10:12:03 -04:00
styleListCtrl - > SetStyleSheet ( wxGetApp ( ) . GetStyleSheet ( ) ) ;
styleListCtrl - > SetRichTextCtrl ( m_richTextCtrl ) ;
styleListCtrl - > UpdateStyles ( ) ;
2005-10-19 08:52:47 -04:00
2008-02-12 12:05:54 -05:00
WriteInitialText ( ) ;
}
// Write text
void MyFrame : : WriteInitialText ( )
{
2005-10-19 08:52:47 -04:00
wxRichTextCtrl & r = * m_richTextCtrl ;
2008-02-12 12:05:54 -05:00
r . SetDefaultStyle ( wxRichTextAttr ( ) ) ;
2005-10-19 08:52:47 -04:00
r . BeginSuppressUndo ( ) ;
r . BeginParagraphSpacing ( 0 , 20 ) ;
r . BeginAlignment ( wxTEXT_ALIGNMENT_CENTRE ) ;
r . BeginBold ( ) ;
r . BeginFontSize ( 14 ) ;
2006-11-30 06:55:09 -05:00
2006-07-25 02:50:19 -04:00
wxString lineBreak = ( wxChar ) 29 ;
2006-11-30 06:55:09 -05:00
2008-02-12 12:05:54 -05:00
r . WriteText ( wxString ( wxT ( " Welcome to wxRichTextCtrl, a wxWidgets control " ) ) + lineBreak + wxT ( " for editing and presenting styled text and images \n " ) ) ;
2005-10-19 08:52:47 -04:00
r . EndFontSize ( ) ;
r . BeginItalic ( ) ;
r . WriteText ( wxT ( " by Julian Smart " ) ) ;
r . EndItalic ( ) ;
r . EndBold ( ) ;
r . Newline ( ) ;
2006-11-08 09:05:50 -05:00
2005-10-19 08:52:47 -04:00
r . WriteImage ( wxBitmap ( zebra_xpm ) ) ;
r . Newline ( ) ;
r . Newline ( ) ;
2008-02-12 12:05:54 -05:00
r . EndAlignment ( ) ;
2005-10-19 08:52:47 -04:00
r . WriteText ( wxT ( " What can you do with this thing? " ) ) ;
2006-11-08 09:05:50 -05:00
2005-10-19 08:52:47 -04:00
r . WriteImage ( wxBitmap ( smiley_xpm ) ) ;
r . WriteText ( wxT ( " Well, you can change text " ) ) ;
r . BeginTextColour ( wxColour ( 255 , 0 , 0 ) ) ;
r . WriteText ( wxT ( " colour, like this red bit. " ) ) ;
r . EndTextColour ( ) ;
2007-03-05 10:22:07 -05:00
wxRichTextAttr backgroundColourAttr ;
backgroundColourAttr . SetBackgroundColour ( * wxGREEN ) ;
backgroundColourAttr . SetTextColour ( wxColour ( 0 , 0 , 255 ) ) ;
r . BeginStyle ( backgroundColourAttr ) ;
r . WriteText ( wxT ( " And this blue on green bit. " ) ) ;
r . EndStyle ( ) ;
2005-10-19 08:52:47 -04:00
r . WriteText ( wxT ( " Naturally you can make things " ) ) ;
r . BeginBold ( ) ;
r . WriteText ( wxT ( " bold " ) ) ;
r . EndBold ( ) ;
r . BeginItalic ( ) ;
r . WriteText ( wxT ( " or italic " ) ) ;
r . EndItalic ( ) ;
r . BeginUnderline ( ) ;
r . WriteText ( wxT ( " or underlined. " ) ) ;
r . EndUnderline ( ) ;
r . BeginFontSize ( 14 ) ;
r . WriteText ( wxT ( " Different font sizes on the same line is allowed, too. " ) ) ;
r . EndFontSize ( ) ;
r . WriteText ( wxT ( " Next we'll show an indented paragraph. " ) ) ;
r . Newline ( ) ;
2008-02-12 12:05:54 -05:00
r . BeginLeftIndent ( 60 ) ;
2005-10-19 08:52:47 -04:00
r . WriteText ( wxT ( " 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 . Newline ( ) ;
2008-02-12 12:05:54 -05:00
r . EndLeftIndent ( ) ;
2005-10-19 08:52:47 -04:00
r . WriteText ( wxT ( " Next, we'll show a first-line indent, achieved using BeginLeftIndent(100, -40). " ) ) ;
r . Newline ( ) ;
2008-02-12 12:05:54 -05:00
r . BeginLeftIndent ( 100 , - 40 ) ;
2005-10-19 08:52:47 -04:00
2008-02-12 12:05:54 -05:00
r . WriteText ( wxT ( " It was in January, the most down-trodden month of an Edinburgh winter. An attractive woman came into the cafe, which is nothing remarkable. " ) ) ;
2005-10-19 08:52:47 -04:00
r . Newline ( ) ;
2008-02-12 12:05:54 -05:00
r . EndLeftIndent ( ) ;
2005-10-19 08:52:47 -04:00
2008-02-12 12:05:54 -05:00
r . WriteText ( wxT ( " Numbered bullets are possible, again using subindents: " ) ) ;
2005-10-19 08:52:47 -04:00
r . Newline ( ) ;
2008-02-12 12:05:54 -05:00
r . BeginNumberedBullet ( 1 , 100 , 60 ) ;
2006-10-17 10:12:03 -04:00
r . WriteText ( wxT ( " This is my first item. Note that wxRichTextCtrl can apply numbering and bullets automatically based on list styles, but this list is formatted explicitly by setting indents. " ) ) ;
2008-02-12 12:05:54 -05:00
r . Newline ( ) ;
2005-10-19 08:52:47 -04:00
r . EndNumberedBullet ( ) ;
r . BeginNumberedBullet ( 2 , 100 , 60 ) ;
r . WriteText ( wxT ( " This is my second item. " ) ) ;
r . Newline ( ) ;
2008-02-12 12:05:54 -05:00
r . EndNumberedBullet ( ) ;
2005-10-19 08:52:47 -04:00
r . WriteText ( wxT ( " The following paragraph is right-indented: " ) ) ;
2008-02-12 12:05:54 -05:00
r . Newline ( ) ;
2005-10-19 08:52:47 -04:00
r . BeginRightIndent ( 200 ) ;
r . WriteText ( wxT ( " 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 . Newline ( ) ;
2008-02-12 12:05:54 -05:00
r . EndRightIndent ( ) ;
2005-10-19 08:52:47 -04:00
r . WriteText ( wxT ( " The following paragraph is right-aligned with 1.5 line spacing: " ) ) ;
2008-02-12 12:05:54 -05:00
r . Newline ( ) ;
2005-10-19 08:52:47 -04:00
r . BeginAlignment ( wxTEXT_ALIGNMENT_RIGHT ) ;
r . BeginLineSpacing ( wxTEXT_ATTR_LINE_SPACING_HALF ) ;
r . WriteText ( wxT ( " It was in January, the most down-trodden month of an Edinburgh winter. An attractive woman came into the cafe, which is nothing remarkable. " ) ) ;
2008-02-12 12:05:54 -05:00
r . Newline ( ) ;
2005-10-19 08:52:47 -04:00
r . EndLineSpacing ( ) ;
r . EndAlignment ( ) ;
2006-06-28 06:57:20 -04:00
wxArrayInt tabs ;
tabs . Add ( 400 ) ;
tabs . Add ( 600 ) ;
tabs . Add ( 800 ) ;
tabs . Add ( 1000 ) ;
2008-02-12 12:05:54 -05:00
wxTextAttrEx attr ;
2006-06-28 06:57:20 -04:00
attr . SetFlags ( wxTEXT_ATTR_TABS ) ;
attr . SetTabs ( tabs ) ;
r . SetDefaultStyle ( attr ) ;
2006-07-21 11:28:50 -04:00
2006-06-28 06:57:20 -04:00
r . WriteText ( wxT ( " This line contains tabs: \t First tab \t Second tab \t Third tab " ) ) ;
2005-10-19 08:52:47 -04:00
r . Newline ( ) ;
2008-02-12 12:05:54 -05:00
2005-10-19 08:52:47 -04:00
r . WriteText ( wxT ( " Other notable features of wxRichTextCtrl include: " ) ) ;
2008-02-12 12:05:54 -05:00
r . Newline ( ) ;
2005-10-19 08:52:47 -04:00
r . BeginSymbolBullet ( wxT ( ' * ' ) , 100 , 60 ) ;
r . WriteText ( wxT ( " Compatibility with wxTextCtrl API " ) ) ;
2008-02-12 12:05:54 -05:00
r . Newline ( ) ;
2005-10-19 08:52:47 -04:00
r . EndSymbolBullet ( ) ;
r . BeginSymbolBullet ( wxT ( ' * ' ) , 100 , 60 ) ;
r . WriteText ( wxT ( " Easy stack-based BeginXXX()...EndXXX() style setting in addition to SetStyle() " ) ) ;
2008-02-12 12:05:54 -05:00
r . Newline ( ) ;
2005-10-19 08:52:47 -04:00
r . EndSymbolBullet ( ) ;
r . BeginSymbolBullet ( wxT ( ' * ' ) , 100 , 60 ) ;
r . WriteText ( wxT ( " XML loading and saving " ) ) ;
2008-02-12 12:05:54 -05:00
r . Newline ( ) ;
2005-10-19 08:52:47 -04:00
r . EndSymbolBullet ( ) ;
r . BeginSymbolBullet ( wxT ( ' * ' ) , 100 , 60 ) ;
r . WriteText ( wxT ( " Undo/Redo, with batching option and Undo suppressing " ) ) ;
2008-02-12 12:05:54 -05:00
r . Newline ( ) ;
2005-10-19 08:52:47 -04:00
r . EndSymbolBullet ( ) ;
r . BeginSymbolBullet ( wxT ( ' * ' ) , 100 , 60 ) ;
r . WriteText ( wxT ( " Clipboard copy and paste " ) ) ;
2008-02-12 12:05:54 -05:00
r . Newline ( ) ;
2005-10-19 08:52:47 -04:00
r . EndSymbolBullet ( ) ;
r . BeginSymbolBullet ( wxT ( ' * ' ) , 100 , 60 ) ;
r . WriteText ( wxT ( " wxRichTextStyleSheet with named character and paragraph styles, and control for applying named styles " ) ) ;
2008-02-12 12:05:54 -05:00
r . Newline ( ) ;
2005-10-19 08:52:47 -04:00
r . EndSymbolBullet ( ) ;
r . BeginSymbolBullet ( wxT ( ' * ' ) , 100 , 60 ) ;
r . WriteText ( wxT ( " A design that can easily be extended to other content types, ultimately with text boxes, tables, controls, and so on " ) ) ;
r . Newline ( ) ;
2008-02-12 12:05:54 -05:00
r . EndSymbolBullet ( ) ;
2005-10-19 08:52:47 -04:00
2006-10-26 02:35:57 -04:00
// Make a style suitable for showing a URL
wxRichTextAttr urlStyle ;
urlStyle . SetTextColour ( * wxBLUE ) ;
urlStyle . SetFontUnderlined ( true ) ;
r . WriteText ( wxT ( " wxRichTextCtrl can also display URLs, such as this one: " ) ) ;
r . BeginStyle ( urlStyle ) ;
r . BeginURL ( wxT ( " http://www.wxwidgets.org " ) ) ;
r . WriteText ( wxT ( " The wxWidgets Web Site " ) ) ;
r . EndURL ( ) ;
r . EndStyle ( ) ;
r . WriteText ( wxT ( " . Click on the URL to generate an event. " ) ) ;
r . Newline ( ) ;
2008-02-12 12:05:54 -05:00
r . WriteText ( wxT ( " Note: this sample content was generated programmatically from within the MyFrame constructor in the demo. The images were loaded from inline XPMs. Enjoy wxRichTextCtrl! \n " ) ) ;
2005-10-19 08:52:47 -04:00
r . EndParagraphSpacing ( ) ;
r . EndSuppressUndo ( ) ;
}
// event handlers
void MyFrame : : OnQuit ( wxCommandEvent & WXUNUSED ( event ) )
{
// true is to force the frame to close
Close ( true ) ;
}
void MyFrame : : OnAbout ( wxCommandEvent & WXUNUSED ( event ) )
{
wxString msg ;
msg . Printf ( _T ( " This is a demo for wxRichTextCtrl, a control for editing styled text. \n (c) Julian Smart, 2005 " ) ) ;
wxMessageBox ( msg , _T ( " About wxRichTextCtrl Sample " ) , wxOK | wxICON_INFORMATION , this ) ;
}
// Forward command events to the current rich text control, if any
bool MyFrame : : ProcessEvent ( wxEvent & event )
{
if ( event . IsCommandEvent ( ) & & ! event . IsKindOf ( CLASSINFO ( wxChildFocusEvent ) ) )
{
// Problem: we can get infinite recursion because the events
// climb back up to this frame, and repeat.
// Assume that command events don't cause another command event
// to be called, so we can rely on inCommand not being overwritten
static int s_eventType = 0 ;
static wxWindowID s_id = 0 ;
if ( s_id ! = event . GetId ( ) & & s_eventType ! = event . GetEventType ( ) )
{
s_eventType = event . GetEventType ( ) ;
s_id = event . GetId ( ) ;
2005-10-25 19:18:15 -04:00
2005-10-19 08:52:47 -04:00
wxWindow * focusWin = wxFindFocusDescendant ( this ) ;
if ( focusWin & & focusWin - > ProcessEvent ( event ) )
{
//s_command = NULL;
s_eventType = 0 ;
s_id = 0 ;
2005-10-25 19:18:15 -04:00
return true ;
2005-10-19 08:52:47 -04:00
}
s_eventType = 0 ;
s_id = 0 ;
}
else
{
2005-10-25 19:18:15 -04:00
return false ;
2005-10-19 08:52:47 -04:00
}
}
return wxFrame : : ProcessEvent ( event ) ;
}
2005-10-19 09:54:32 -04:00
void MyFrame : : OnOpen ( wxCommandEvent & WXUNUSED ( event ) )
2005-10-19 08:52:47 -04:00
{
2005-10-25 19:18:15 -04:00
wxString path ;
wxString filename ;
2005-10-20 08:55:53 -04:00
wxArrayInt fileTypes ;
wxString filter = wxRichTextBuffer : : GetExtWildcard ( false , false , & fileTypes ) ;
2005-10-25 19:18:15 -04:00
if ( ! filter . empty ( ) )
2005-10-19 08:52:47 -04:00
filter + = wxT ( " | " ) ;
filter + = wxT ( " All files (*.*)|*.* " ) ;
wxFileDialog dialog ( this ,
_ ( " Choose a filename " ) ,
path ,
filename ,
filter ,
2006-05-28 19:32:12 -04:00
wxFD_OPEN ) ;
2005-10-19 08:52:47 -04:00
if ( dialog . ShowModal ( ) = = wxID_OK )
{
wxString path = dialog . GetPath ( ) ;
2005-10-25 19:18:15 -04:00
if ( ! path . empty ( ) )
2005-10-19 08:52:47 -04:00
{
2005-10-20 08:55:53 -04:00
int filterIndex = dialog . GetFilterIndex ( ) ;
2005-11-03 11:53:29 -05:00
int fileType = ( filterIndex < ( int ) fileTypes . GetCount ( ) )
? fileTypes [ filterIndex ]
: wxRICHTEXT_TYPE_TEXT ;
2005-10-20 08:55:53 -04:00
m_richTextCtrl - > LoadFile ( path , fileType ) ;
2005-10-19 08:52:47 -04:00
}
}
}
void MyFrame : : OnSave ( wxCommandEvent & event )
{
2005-10-25 19:18:15 -04:00
if ( m_richTextCtrl - > GetFilename ( ) . empty ( ) )
2005-10-19 08:52:47 -04:00
{
OnSaveAs ( event ) ;
return ;
}
m_richTextCtrl - > SaveFile ( ) ;
}
2005-10-19 09:54:32 -04:00
void MyFrame : : OnSaveAs ( wxCommandEvent & WXUNUSED ( event ) )
2005-10-19 08:52:47 -04:00
{
wxString filter = wxRichTextBuffer : : GetExtWildcard ( false , true ) ;
2005-10-25 19:18:15 -04:00
wxString path ;
wxString filename ;
2005-10-19 08:52:47 -04:00
wxFileDialog dialog ( this ,
_ ( " Choose a filename " ) ,
path ,
filename ,
filter ,
2006-05-28 19:32:12 -04:00
wxFD_SAVE ) ;
2005-10-19 08:52:47 -04:00
if ( dialog . ShowModal ( ) = = wxID_OK )
{
wxString path = dialog . GetPath ( ) ;
2005-10-25 19:18:15 -04:00
if ( ! path . empty ( ) )
2005-10-19 08:52:47 -04:00
{
m_richTextCtrl - > SaveFile ( path ) ;
}
}
}
2005-10-19 09:54:32 -04:00
void MyFrame : : OnBold ( wxCommandEvent & WXUNUSED ( event ) )
2005-10-19 08:52:47 -04:00
{
m_richTextCtrl - > ApplyBoldToSelection ( ) ;
}
2005-10-19 09:54:32 -04:00
void MyFrame : : OnItalic ( wxCommandEvent & WXUNUSED ( event ) )
2005-10-19 08:52:47 -04:00
{
m_richTextCtrl - > ApplyItalicToSelection ( ) ;
}
2005-10-19 09:54:32 -04:00
void MyFrame : : OnUnderline ( wxCommandEvent & WXUNUSED ( event ) )
2005-10-19 08:52:47 -04:00
{
m_richTextCtrl - > ApplyUnderlineToSelection ( ) ;
}
void MyFrame : : OnUpdateBold ( wxUpdateUIEvent & event )
{
event . Check ( m_richTextCtrl - > IsSelectionBold ( ) ) ;
}
void MyFrame : : OnUpdateItalic ( wxUpdateUIEvent & event )
{
event . Check ( m_richTextCtrl - > IsSelectionItalics ( ) ) ;
}
void MyFrame : : OnUpdateUnderline ( wxUpdateUIEvent & event )
{
event . Check ( m_richTextCtrl - > IsSelectionUnderlined ( ) ) ;
}
2005-10-19 09:54:32 -04:00
void MyFrame : : OnAlignLeft ( wxCommandEvent & WXUNUSED ( event ) )
2005-10-19 08:52:47 -04:00
{
m_richTextCtrl - > ApplyAlignmentToSelection ( wxTEXT_ALIGNMENT_LEFT ) ;
}
2005-10-19 09:54:32 -04:00
void MyFrame : : OnAlignCentre ( wxCommandEvent & WXUNUSED ( event ) )
2005-10-19 08:52:47 -04:00
{
m_richTextCtrl - > ApplyAlignmentToSelection ( wxTEXT_ALIGNMENT_CENTRE ) ;
}
2005-10-19 09:54:32 -04:00
void MyFrame : : OnAlignRight ( wxCommandEvent & WXUNUSED ( event ) )
2005-10-19 08:52:47 -04:00
{
m_richTextCtrl - > ApplyAlignmentToSelection ( wxTEXT_ALIGNMENT_RIGHT ) ;
}
void MyFrame : : OnUpdateAlignLeft ( wxUpdateUIEvent & event )
{
event . Check ( m_richTextCtrl - > IsSelectionAligned ( wxTEXT_ALIGNMENT_LEFT ) ) ;
}
void MyFrame : : OnUpdateAlignCentre ( wxUpdateUIEvent & event )
{
event . Check ( m_richTextCtrl - > IsSelectionAligned ( wxTEXT_ALIGNMENT_CENTRE ) ) ;
}
void MyFrame : : OnUpdateAlignRight ( wxUpdateUIEvent & event )
{
event . Check ( m_richTextCtrl - > IsSelectionAligned ( wxTEXT_ALIGNMENT_RIGHT ) ) ;
}
2005-10-19 09:54:32 -04:00
void MyFrame : : OnFont ( wxCommandEvent & WXUNUSED ( event ) )
2005-10-19 08:52:47 -04:00
{
2006-10-08 10:13:03 -04:00
wxRichTextRange range ;
if ( m_richTextCtrl - > HasSelection ( ) )
range = m_richTextCtrl - > GetSelectionRange ( ) ;
else
range = wxRichTextRange ( 0 , m_richTextCtrl - > GetLastPosition ( ) + 1 ) ;
int pages = wxRICHTEXT_FORMAT_FONT ;
wxRichTextFormattingDialog formatDlg ( pages , this ) ;
formatDlg . GetStyle ( m_richTextCtrl , range ) ;
if ( formatDlg . ShowModal ( ) = = wxID_OK )
{
2006-11-08 09:05:50 -05:00
formatDlg . ApplyStyle ( m_richTextCtrl , range , wxRICHTEXT_SETSTYLE_WITH_UNDO | wxRICHTEXT_SETSTYLE_OPTIMIZE | wxRICHTEXT_SETSTYLE_CHARACTERS_ONLY ) ;
2006-10-08 10:13:03 -04:00
}
// Old method using wxFontDialog
#if 0
2005-10-19 08:52:47 -04:00
if ( ! m_richTextCtrl - > HasSelection ( ) )
return ;
wxRichTextRange range = m_richTextCtrl - > GetSelectionRange ( ) ;
wxFontData fontData ;
wxTextAttrEx attr ;
attr . SetFlags ( wxTEXT_ATTR_FONT ) ;
if ( m_richTextCtrl - > GetStyle ( m_richTextCtrl - > GetInsertionPoint ( ) , attr ) )
fontData . SetInitialFont ( attr . GetFont ( ) ) ;
wxFontDialog dialog ( this , fontData ) ;
if ( dialog . ShowModal ( ) = = wxID_OK )
{
fontData = dialog . GetFontData ( ) ;
attr . SetFlags ( wxTEXT_ATTR_FONT ) ;
attr . SetFont ( fontData . GetChosenFont ( ) ) ;
if ( attr . GetFont ( ) . Ok ( ) )
{
m_richTextCtrl - > SetStyle ( range , attr ) ;
}
}
2006-10-08 10:13:03 -04:00
# endif
}
void MyFrame : : OnParagraph ( wxCommandEvent & WXUNUSED ( event ) )
{
wxRichTextRange range ;
if ( m_richTextCtrl - > HasSelection ( ) )
range = m_richTextCtrl - > GetSelectionRange ( ) ;
else
range = wxRichTextRange ( 0 , m_richTextCtrl - > GetLastPosition ( ) + 1 ) ;
int pages = wxRICHTEXT_FORMAT_INDENTS_SPACING | wxRICHTEXT_FORMAT_TABS | wxRICHTEXT_FORMAT_BULLETS ;
wxRichTextFormattingDialog formatDlg ( pages , this ) ;
formatDlg . GetStyle ( m_richTextCtrl , range ) ;
if ( formatDlg . ShowModal ( ) = = wxID_OK )
{
formatDlg . ApplyStyle ( m_richTextCtrl , range ) ;
}
}
void MyFrame : : OnFormat ( wxCommandEvent & WXUNUSED ( event ) )
{
wxRichTextRange range ;
if ( m_richTextCtrl - > HasSelection ( ) )
range = m_richTextCtrl - > GetSelectionRange ( ) ;
else
range = wxRichTextRange ( 0 , m_richTextCtrl - > GetLastPosition ( ) + 1 ) ;
int pages = wxRICHTEXT_FORMAT_FONT | wxRICHTEXT_FORMAT_INDENTS_SPACING | wxRICHTEXT_FORMAT_TABS | wxRICHTEXT_FORMAT_BULLETS ;
wxRichTextFormattingDialog formatDlg ( pages , this ) ;
formatDlg . GetStyle ( m_richTextCtrl , range ) ;
if ( formatDlg . ShowModal ( ) = = wxID_OK )
{
formatDlg . ApplyStyle ( m_richTextCtrl , range ) ;
}
}
void MyFrame : : OnUpdateFormat ( wxUpdateUIEvent & event )
{
event . Enable ( m_richTextCtrl - > HasSelection ( ) ) ;
2005-10-19 08:52:47 -04:00
}
2005-10-19 09:54:32 -04:00
void MyFrame : : OnIndentMore ( wxCommandEvent & WXUNUSED ( event ) )
2005-10-19 08:52:47 -04:00
{
2007-10-09 07:20:36 -04:00
wxRichTextAttr attr ;
2005-10-19 08:52:47 -04:00
attr . SetFlags ( wxTEXT_ATTR_LEFT_INDENT ) ;
if ( m_richTextCtrl - > GetStyle ( m_richTextCtrl - > GetInsertionPoint ( ) , attr ) )
{
wxRichTextRange range ( m_richTextCtrl - > GetInsertionPoint ( ) , m_richTextCtrl - > GetInsertionPoint ( ) ) ;
if ( m_richTextCtrl - > HasSelection ( ) )
range = m_richTextCtrl - > GetSelectionRange ( ) ;
attr . SetLeftIndent ( attr . GetLeftIndent ( ) + 100 ) ;
attr . SetFlags ( wxTEXT_ATTR_LEFT_INDENT ) ;
m_richTextCtrl - > SetStyle ( range , attr ) ;
}
}
2005-10-19 09:54:32 -04:00
void MyFrame : : OnIndentLess ( wxCommandEvent & WXUNUSED ( event ) )
2005-10-19 08:52:47 -04:00
{
2007-10-09 07:20:36 -04:00
wxRichTextAttr attr ;
2005-10-19 08:52:47 -04:00
attr . SetFlags ( wxTEXT_ATTR_LEFT_INDENT ) ;
if ( m_richTextCtrl - > GetStyle ( m_richTextCtrl - > GetInsertionPoint ( ) , attr ) )
{
wxRichTextRange range ( m_richTextCtrl - > GetInsertionPoint ( ) , m_richTextCtrl - > GetInsertionPoint ( ) ) ;
if ( m_richTextCtrl - > HasSelection ( ) )
range = m_richTextCtrl - > GetSelectionRange ( ) ;
2006-11-30 06:55:09 -05:00
if ( attr . GetLeftIndent ( ) > 0 )
2005-10-19 08:52:47 -04:00
{
2006-11-30 06:55:09 -05:00
attr . SetLeftIndent ( wxMax ( 0 , attr . GetLeftIndent ( ) - 100 ) ) ;
2005-10-25 19:18:15 -04:00
2005-10-19 08:52:47 -04:00
m_richTextCtrl - > SetStyle ( range , attr ) ;
}
}
}
2005-10-19 09:54:32 -04:00
void MyFrame : : OnLineSpacingHalf ( wxCommandEvent & WXUNUSED ( event ) )
2005-10-19 08:52:47 -04:00
{
2007-10-09 07:20:36 -04:00
wxRichTextAttr attr ;
2005-10-19 08:52:47 -04:00
attr . SetFlags ( wxTEXT_ATTR_LINE_SPACING ) ;
if ( m_richTextCtrl - > GetStyle ( m_richTextCtrl - > GetInsertionPoint ( ) , attr ) )
{
wxRichTextRange range ( m_richTextCtrl - > GetInsertionPoint ( ) , m_richTextCtrl - > GetInsertionPoint ( ) ) ;
if ( m_richTextCtrl - > HasSelection ( ) )
range = m_richTextCtrl - > GetSelectionRange ( ) ;
attr . SetFlags ( wxTEXT_ATTR_LINE_SPACING ) ;
attr . SetLineSpacing ( 15 ) ;
2005-10-25 19:18:15 -04:00
2005-10-19 08:52:47 -04:00
m_richTextCtrl - > SetStyle ( range , attr ) ;
}
}
2005-10-19 09:54:32 -04:00
void MyFrame : : OnLineSpacingDouble ( wxCommandEvent & WXUNUSED ( event ) )
2005-10-19 08:52:47 -04:00
{
2007-10-09 07:20:36 -04:00
wxRichTextAttr attr ;
2005-10-19 08:52:47 -04:00
attr . SetFlags ( wxTEXT_ATTR_LINE_SPACING ) ;
if ( m_richTextCtrl - > GetStyle ( m_richTextCtrl - > GetInsertionPoint ( ) , attr ) )
{
wxRichTextRange range ( m_richTextCtrl - > GetInsertionPoint ( ) , m_richTextCtrl - > GetInsertionPoint ( ) ) ;
if ( m_richTextCtrl - > HasSelection ( ) )
range = m_richTextCtrl - > GetSelectionRange ( ) ;
attr . SetFlags ( wxTEXT_ATTR_LINE_SPACING ) ;
attr . SetLineSpacing ( 20 ) ;
2005-10-25 19:18:15 -04:00
2005-10-19 08:52:47 -04:00
m_richTextCtrl - > SetStyle ( range , attr ) ;
}
}
2005-10-19 09:54:32 -04:00
void MyFrame : : OnLineSpacingSingle ( wxCommandEvent & WXUNUSED ( event ) )
2005-10-19 08:52:47 -04:00
{
2007-10-09 07:20:36 -04:00
wxRichTextAttr attr ;
2005-10-19 08:52:47 -04:00
attr . SetFlags ( wxTEXT_ATTR_LINE_SPACING ) ;
if ( m_richTextCtrl - > GetStyle ( m_richTextCtrl - > GetInsertionPoint ( ) , attr ) )
{
wxRichTextRange range ( m_richTextCtrl - > GetInsertionPoint ( ) , m_richTextCtrl - > GetInsertionPoint ( ) ) ;
if ( m_richTextCtrl - > HasSelection ( ) )
range = m_richTextCtrl - > GetSelectionRange ( ) ;
attr . SetFlags ( wxTEXT_ATTR_LINE_SPACING ) ;
attr . SetLineSpacing ( 0 ) ; // Can also use 10
2005-10-25 19:18:15 -04:00
2005-10-19 08:52:47 -04:00
m_richTextCtrl - > SetStyle ( range , attr ) ;
}
}
2005-10-19 09:54:32 -04:00
void MyFrame : : OnParagraphSpacingMore ( wxCommandEvent & WXUNUSED ( event ) )
2005-10-19 08:52:47 -04:00
{
2007-10-09 07:20:36 -04:00
wxRichTextAttr attr ;
2005-10-19 08:52:47 -04:00
attr . SetFlags ( wxTEXT_ATTR_PARA_SPACING_AFTER ) ;
if ( m_richTextCtrl - > GetStyle ( m_richTextCtrl - > GetInsertionPoint ( ) , attr ) )
{
wxRichTextRange range ( m_richTextCtrl - > GetInsertionPoint ( ) , m_richTextCtrl - > GetInsertionPoint ( ) ) ;
if ( m_richTextCtrl - > HasSelection ( ) )
range = m_richTextCtrl - > GetSelectionRange ( ) ;
attr . SetParagraphSpacingAfter ( attr . GetParagraphSpacingAfter ( ) + 20 ) ;
attr . SetFlags ( wxTEXT_ATTR_PARA_SPACING_AFTER ) ;
m_richTextCtrl - > SetStyle ( range , attr ) ;
}
}
2005-10-19 09:54:32 -04:00
void MyFrame : : OnParagraphSpacingLess ( wxCommandEvent & WXUNUSED ( event ) )
2005-10-19 08:52:47 -04:00
{
2007-10-09 07:20:36 -04:00
wxRichTextAttr attr ;
2005-10-19 08:52:47 -04:00
attr . SetFlags ( wxTEXT_ATTR_PARA_SPACING_AFTER ) ;
if ( m_richTextCtrl - > GetStyle ( m_richTextCtrl - > GetInsertionPoint ( ) , attr ) )
{
wxRichTextRange range ( m_richTextCtrl - > GetInsertionPoint ( ) , m_richTextCtrl - > GetInsertionPoint ( ) ) ;
if ( m_richTextCtrl - > HasSelection ( ) )
range = m_richTextCtrl - > GetSelectionRange ( ) ;
if ( attr . GetParagraphSpacingAfter ( ) > = 20 )
{
attr . SetParagraphSpacingAfter ( attr . GetParagraphSpacingAfter ( ) - 20 ) ;
2005-10-25 19:18:15 -04:00
2005-10-19 08:52:47 -04:00
attr . SetFlags ( wxTEXT_ATTR_PARA_SPACING_AFTER ) ;
m_richTextCtrl - > SetStyle ( range , attr ) ;
}
}
}
2008-02-12 12:05:54 -05:00
void MyFrame : : OnReload ( wxCommandEvent & WXUNUSED ( event ) )
{
m_richTextCtrl - > Clear ( ) ;
WriteInitialText ( ) ;
}
2005-10-19 09:54:32 -04:00
void MyFrame : : OnViewHTML ( wxCommandEvent & WXUNUSED ( event ) )
2005-10-19 08:52:47 -04:00
{
wxDialog dialog ( this , wxID_ANY , _ ( " HTML " ) , wxDefaultPosition , wxSize ( 500 , 400 ) , wxDEFAULT_DIALOG_STYLE ) ;
wxBoxSizer * boxSizer = new wxBoxSizer ( wxVERTICAL ) ;
dialog . SetSizer ( boxSizer ) ;
wxHtmlWindow * win = new wxHtmlWindow ( & dialog , wxID_ANY , wxDefaultPosition , wxSize ( 500 , 400 ) , wxSUNKEN_BORDER ) ;
boxSizer - > Add ( win , 1 , wxALL , 5 ) ;
wxButton * cancelButton = new wxButton ( & dialog , wxID_CANCEL , wxT ( " &Close " ) ) ;
boxSizer - > Add ( cancelButton , 0 , wxALL | wxCENTRE , 5 ) ;
wxString text ;
wxStringOutputStream strStream ( & text ) ;
wxRichTextHTMLHandler htmlHandler ;
2006-10-26 02:35:57 -04:00
htmlHandler . SetFlags ( wxRICHTEXT_HANDLER_SAVE_IMAGES_TO_MEMORY ) ;
2006-11-30 06:55:09 -05:00
2006-07-25 02:50:19 -04:00
wxArrayInt fontSizeMapping ;
fontSizeMapping . Add ( 7 ) ;
fontSizeMapping . Add ( 9 ) ;
fontSizeMapping . Add ( 11 ) ;
fontSizeMapping . Add ( 12 ) ;
fontSizeMapping . Add ( 14 ) ;
fontSizeMapping . Add ( 22 ) ;
fontSizeMapping . Add ( 100 ) ;
2006-11-30 06:55:09 -05:00
2006-07-25 02:50:19 -04:00
htmlHandler . SetFontSizeMapping ( fontSizeMapping ) ;
2006-10-26 02:35:57 -04:00
2005-10-19 08:52:47 -04:00
if ( htmlHandler . SaveFile ( & m_richTextCtrl - > GetBuffer ( ) , strStream ) )
{
win - > SetPage ( text ) ;
}
boxSizer - > Fit ( & dialog ) ;
dialog . ShowModal ( ) ;
2006-10-26 02:35:57 -04:00
// Now delete the temporary in-memory images
htmlHandler . DeleteTemporaryImages ( ) ;
2005-10-19 08:52:47 -04:00
}
2006-09-29 04:53:23 -04:00
// Demonstrates how you can change the style sheets and have the changes
// reflected in the control content without wiping out character formatting.
void MyFrame : : OnSwitchStyleSheets ( wxCommandEvent & WXUNUSED ( event ) )
{
static wxRichTextStyleSheet * gs_AlternateStyleSheet = NULL ;
2006-10-19 10:05:36 -04:00
wxRichTextStyleListCtrl * styleList = ( wxRichTextStyleListCtrl * ) FindWindow ( ID_RICHTEXT_STYLE_LIST ) ;
2006-09-29 04:53:23 -04:00
wxRichTextStyleComboCtrl * styleCombo = ( wxRichTextStyleComboCtrl * ) FindWindow ( ID_RICHTEXT_STYLE_COMBO ) ;
2006-10-27 04:59:58 -04:00
wxRichTextStyleSheet * sheet = m_richTextCtrl - > GetStyleSheet ( ) ;
2006-09-29 04:53:23 -04:00
// One-time creation of an alternate style sheet
if ( ! gs_AlternateStyleSheet )
{
gs_AlternateStyleSheet = new wxRichTextStyleSheet ( * sheet ) ;
// Make some modifications
for ( int i = 0 ; i < ( int ) gs_AlternateStyleSheet - > GetParagraphStyleCount ( ) ; i + + )
{
wxRichTextParagraphStyleDefinition * def = gs_AlternateStyleSheet - > GetParagraphStyle ( i ) ;
if ( def - > GetStyle ( ) . HasTextColour ( ) )
def - > GetStyle ( ) . SetTextColour ( * wxBLUE ) ;
if ( def - > GetStyle ( ) . HasAlignment ( ) )
{
if ( def - > GetStyle ( ) . GetAlignment ( ) = = wxTEXT_ALIGNMENT_CENTRE )
def - > GetStyle ( ) . SetAlignment ( wxTEXT_ALIGNMENT_RIGHT ) ;
else if ( def - > GetStyle ( ) . GetAlignment ( ) = = wxTEXT_ALIGNMENT_LEFT )
def - > GetStyle ( ) . SetAlignment ( wxTEXT_ALIGNMENT_CENTRE ) ;
}
if ( def - > GetStyle ( ) . HasLeftIndent ( ) )
{
def - > GetStyle ( ) . SetLeftIndent ( def - > GetStyle ( ) . GetLeftIndent ( ) * 2 ) ;
}
}
}
// Switch sheets
wxRichTextStyleSheet * tmp = gs_AlternateStyleSheet ;
gs_AlternateStyleSheet = sheet ;
sheet = tmp ;
2006-10-27 04:59:58 -04:00
m_richTextCtrl - > SetStyleSheet ( sheet ) ;
m_richTextCtrl - > ApplyStyleSheet ( sheet ) ; // Makes the control reflect the new style definitions
2006-09-29 04:53:23 -04:00
styleList - > SetStyleSheet ( sheet ) ;
styleList - > UpdateStyles ( ) ;
styleCombo - > SetStyleSheet ( sheet ) ;
styleCombo - > UpdateStyles ( ) ;
}
2006-10-08 10:13:03 -04:00
2006-10-19 10:05:36 -04:00
void MyFrame : : OnManageStyles ( wxCommandEvent & WXUNUSED ( event ) )
{
2006-10-27 04:59:58 -04:00
wxRichTextStyleSheet * sheet = m_richTextCtrl - > GetStyleSheet ( ) ;
2006-10-19 10:05:36 -04:00
int flags = wxRICHTEXT_ORGANISER_CREATE_STYLES | wxRICHTEXT_ORGANISER_EDIT_STYLES ;
wxRichTextStyleOrganiserDialog dlg ( flags , sheet , NULL , this , wxID_ANY , _ ( " Style Manager " ) ) ;
dlg . ShowModal ( ) ;
}
2006-10-08 10:13:03 -04:00
void MyFrame : : OnInsertSymbol ( wxCommandEvent & WXUNUSED ( event ) )
{
2007-10-09 07:20:36 -04:00
wxRichTextAttr attr ;
2006-10-08 10:13:03 -04:00
attr . SetFlags ( wxTEXT_ATTR_FONT ) ;
2006-10-27 04:59:58 -04:00
m_richTextCtrl - > GetStyle ( m_richTextCtrl - > GetInsertionPoint ( ) , attr ) ;
2006-10-08 10:13:03 -04:00
wxString currentFontName ;
if ( attr . HasFont ( ) & & attr . GetFont ( ) . Ok ( ) )
currentFontName = attr . GetFont ( ) . GetFaceName ( ) ;
// Don't set the initial font in the dialog (so the user is choosing
// 'normal text', i.e. the current font) but do tell the dialog
// what 'normal text' is.
wxSymbolPickerDialog dlg ( wxT ( " * " ) , wxEmptyString , currentFontName , this ) ;
if ( dlg . ShowModal ( ) = = wxID_OK )
{
if ( dlg . HasSelection ( ) )
{
2006-10-27 04:59:58 -04:00
long insertionPoint = m_richTextCtrl - > GetInsertionPoint ( ) ;
2006-10-08 10:13:03 -04:00
2006-10-27 04:59:58 -04:00
m_richTextCtrl - > WriteText ( dlg . GetSymbol ( ) ) ;
2006-10-08 10:13:03 -04:00
if ( ! dlg . UseNormalFont ( ) )
{
wxFont font ( attr . GetFont ( ) ) ;
2006-10-10 13:02:34 -04:00
font . SetFaceName ( dlg . GetFontName ( ) ) ;
2006-10-08 10:13:03 -04:00
attr . SetFont ( font ) ;
2006-10-27 04:59:58 -04:00
m_richTextCtrl - > SetStyle ( insertionPoint , insertionPoint + 1 , attr ) ;
2006-10-08 10:13:03 -04:00
}
}
}
}
2006-10-17 10:12:03 -04:00
void MyFrame : : OnNumberList ( wxCommandEvent & WXUNUSED ( event ) )
{
2006-10-27 04:59:58 -04:00
if ( m_richTextCtrl - > HasSelection ( ) )
2006-10-17 10:12:03 -04:00
{
2006-10-27 04:59:58 -04:00
wxRichTextRange range = m_richTextCtrl - > GetSelectionRange ( ) ;
m_richTextCtrl - > SetListStyle ( range , wxT ( " Numbered List 1 " ) , wxRICHTEXT_SETSTYLE_WITH_UNDO | wxRICHTEXT_SETSTYLE_RENUMBER ) ;
2006-10-17 10:12:03 -04:00
}
}
2006-10-19 10:05:36 -04:00
void MyFrame : : OnBulletsAndNumbering ( wxCommandEvent & WXUNUSED ( event ) )
{
2006-10-27 04:59:58 -04:00
wxRichTextStyleSheet * sheet = m_richTextCtrl - > GetStyleSheet ( ) ;
2006-10-19 10:05:36 -04:00
int flags = wxRICHTEXT_ORGANISER_BROWSE_NUMBERING ;
2006-10-27 04:59:58 -04:00
wxRichTextStyleOrganiserDialog dlg ( flags , sheet , m_richTextCtrl , this , wxID_ANY , _ ( " Bullets and Numbering " ) ) ;
2006-10-19 10:05:36 -04:00
if ( dlg . ShowModal ( ) = = wxID_OK )
{
if ( dlg . GetSelectedStyleDefinition ( ) )
dlg . ApplyStyle ( ) ;
}
}
2006-10-17 10:12:03 -04:00
void MyFrame : : OnItemizeList ( wxCommandEvent & WXUNUSED ( event ) )
{
2006-10-27 04:59:58 -04:00
if ( m_richTextCtrl - > HasSelection ( ) )
2006-10-17 10:12:03 -04:00
{
2006-10-27 04:59:58 -04:00
wxRichTextRange range = m_richTextCtrl - > GetSelectionRange ( ) ;
m_richTextCtrl - > SetListStyle ( range , wxT ( " Bullet List 1 " ) ) ;
2006-10-17 10:12:03 -04:00
}
}
void MyFrame : : OnRenumberList ( wxCommandEvent & WXUNUSED ( event ) )
{
2006-10-27 04:59:58 -04:00
if ( m_richTextCtrl - > HasSelection ( ) )
2006-10-17 10:12:03 -04:00
{
2006-10-27 04:59:58 -04:00
wxRichTextRange range = m_richTextCtrl - > GetSelectionRange ( ) ;
m_richTextCtrl - > NumberList ( range , NULL , wxRICHTEXT_SETSTYLE_WITH_UNDO | wxRICHTEXT_SETSTYLE_RENUMBER ) ;
2006-10-17 10:12:03 -04:00
}
}
void MyFrame : : OnPromoteList ( wxCommandEvent & WXUNUSED ( event ) )
{
2006-10-27 04:59:58 -04:00
if ( m_richTextCtrl - > HasSelection ( ) )
2006-10-17 10:12:03 -04:00
{
2006-10-27 04:59:58 -04:00
wxRichTextRange range = m_richTextCtrl - > GetSelectionRange ( ) ;
m_richTextCtrl - > PromoteList ( 1 , range , NULL ) ;
2006-10-17 10:12:03 -04:00
}
}
void MyFrame : : OnDemoteList ( wxCommandEvent & WXUNUSED ( event ) )
{
2006-10-27 04:59:58 -04:00
if ( m_richTextCtrl - > HasSelection ( ) )
2006-10-17 10:12:03 -04:00
{
2006-10-27 04:59:58 -04:00
wxRichTextRange range = m_richTextCtrl - > GetSelectionRange ( ) ;
m_richTextCtrl - > PromoteList ( - 1 , range , NULL ) ;
2006-10-17 10:12:03 -04:00
}
}
void MyFrame : : OnClearList ( wxCommandEvent & WXUNUSED ( event ) )
{
2006-10-27 04:59:58 -04:00
if ( m_richTextCtrl - > HasSelection ( ) )
2006-10-17 10:12:03 -04:00
{
2006-10-27 04:59:58 -04:00
wxRichTextRange range = m_richTextCtrl - > GetSelectionRange ( ) ;
m_richTextCtrl - > ClearListStyle ( range ) ;
2006-10-17 10:12:03 -04:00
}
}
2006-10-26 02:35:57 -04:00
void MyFrame : : OnInsertURL ( wxCommandEvent & WXUNUSED ( event ) )
{
wxString url = wxGetTextFromUser ( _ ( " URL: " ) , _ ( " Insert URL " ) ) ;
if ( ! url . IsEmpty ( ) )
{
// Make a style suitable for showing a URL
wxRichTextAttr urlStyle ;
urlStyle . SetTextColour ( * wxBLUE ) ;
urlStyle . SetFontUnderlined ( true ) ;
2006-11-30 06:55:09 -05:00
2006-10-27 04:59:58 -04:00
m_richTextCtrl - > BeginStyle ( urlStyle ) ;
m_richTextCtrl - > BeginURL ( url ) ;
m_richTextCtrl - > WriteText ( url ) ;
m_richTextCtrl - > EndURL ( ) ;
m_richTextCtrl - > EndStyle ( ) ;
2006-10-26 02:35:57 -04:00
}
}
void MyFrame : : OnURL ( wxTextUrlEvent & event )
{
wxMessageBox ( event . GetString ( ) ) ;
}
// Veto style sheet replace events when loading from XML, since we want
// to keep the original style sheet.
void MyFrame : : OnStyleSheetReplacing ( wxRichTextEvent & event )
{
event . Veto ( ) ;
}
2006-10-27 04:59:58 -04:00
void MyFrame : : OnPrint ( wxCommandEvent & WXUNUSED ( event ) )
{
wxGetApp ( ) . GetPrinting ( ) - > PrintBuffer ( m_richTextCtrl - > GetBuffer ( ) ) ;
}
void MyFrame : : OnPreview ( wxCommandEvent & WXUNUSED ( event ) )
{
wxGetApp ( ) . GetPrinting ( ) - > PreviewBuffer ( m_richTextCtrl - > GetBuffer ( ) ) ;
}
void MyFrame : : OnPageSetup ( wxCommandEvent & WXUNUSED ( event ) )
{
wxGetApp ( ) . GetPrinting ( ) - > PageSetup ( ) ;
}