1 /////////////////////////////////////////////////////////////////////////////
2 // Name: samples/richtext/richtext.cpp
3 // Purpose: wxWidgets rich text editor sample
4 // Author: Julian Smart
8 // Copyright: (c) Julian Smart
9 // Licence: wxWindows licence
10 /////////////////////////////////////////////////////////////////////////////
12 // ============================================================================
14 // ============================================================================
16 // ----------------------------------------------------------------------------
18 // ----------------------------------------------------------------------------
20 // For compilers that support precompilation, includes "wx/wx.h".
21 #include "wx/wxprec.h"
27 // for all others, include the necessary headers (this file is usually all you
28 // need because it includes almost all "standard" wxWidgets headers)
33 #include "wx/fontdlg.h"
34 #include "wx/splitter.h"
35 #include "wx/sstream.h"
36 #include "wx/html/htmlwin.h"
37 #include "wx/stopwatch.h"
40 #include "wx/filesys.h"
41 #include "wx/fs_mem.h"
45 #include "wx/cshelp.h"
49 #include "../sample.xpm"
52 #include "bitmaps/smiley.xpm"
53 // #include "bitmaps/idea.xpm"
54 #include "bitmaps/zebra.xpm"
56 #include "bitmaps/open.xpm"
57 #include "bitmaps/save.xpm"
58 #include "bitmaps/copy.xpm"
59 #include "bitmaps/cut.xpm"
60 #include "bitmaps/paste.xpm"
61 #include "bitmaps/undo.xpm"
62 #include "bitmaps/redo.xpm"
63 #include "bitmaps/bold.xpm"
64 #include "bitmaps/italic.xpm"
65 #include "bitmaps/underline.xpm"
67 #include "bitmaps/alignleft.xpm"
68 #include "bitmaps/alignright.xpm"
69 #include "bitmaps/centre.xpm"
70 #include "bitmaps/font.xpm"
71 #include "bitmaps/indentless.xpm"
72 #include "bitmaps/indentmore.xpm"
74 #include "wx/richtext/richtextctrl.h"
75 #include "wx/richtext/richtextstyles.h"
76 #include "wx/richtext/richtextxml.h"
77 #include "wx/richtext/richtexthtml.h"
78 #include "wx/richtext/richtextformatdlg.h"
79 #include "wx/richtext/richtextsymboldlg.h"
80 #include "wx/richtext/richtextstyledlg.h"
81 #include "wx/richtext/richtextprint.h"
82 #include "wx/richtext/richtextimagedlg.h"
84 // ----------------------------------------------------------------------------
86 // ----------------------------------------------------------------------------
88 // ----------------------------------------------------------------------------
90 // ----------------------------------------------------------------------------
92 // Define a new application type, each program should derive a class from wxApp
93 class MyApp
: public wxApp
96 // override base class virtuals
97 // ----------------------------
99 // this one is called on application startup and is a good place for the app
100 // initialization (doing it here and not in the ctor allows to have an error
101 // return: if OnInit() returns false, the application terminates)
102 virtual bool OnInit();
103 virtual int OnExit();
107 wxRichTextStyleSheet
* GetStyleSheet() const { return m_styleSheet
; }
108 wxRichTextPrinting
* GetPrinting() const { return m_printing
; }
110 wxRichTextStyleSheet
* m_styleSheet
;
111 wxRichTextPrinting
* m_printing
;
114 // Define a new frame type: this is going to be our main frame
115 class MyFrame
: public wxFrame
119 MyFrame(const wxString
& title
, wxWindowID id
, const wxPoint
& pos
= wxDefaultPosition
,
120 const wxSize
& size
= wxDefaultSize
, long style
= wxDEFAULT_FRAME_STYLE
);
122 // event handlers (these functions should _not_ be virtual)
123 void OnQuit(wxCommandEvent
& event
);
124 void OnAbout(wxCommandEvent
& event
);
126 void OnOpen(wxCommandEvent
& event
);
127 void OnSave(wxCommandEvent
& event
);
128 void OnSaveAs(wxCommandEvent
& event
);
130 void OnBold(wxCommandEvent
& event
);
131 void OnItalic(wxCommandEvent
& event
);
132 void OnUnderline(wxCommandEvent
& event
);
134 void OnStrikethrough(wxCommandEvent
& event
);
135 void OnSuperscript(wxCommandEvent
& event
);
136 void OnSubscript(wxCommandEvent
& event
);
138 void OnUpdateBold(wxUpdateUIEvent
& event
);
139 void OnUpdateItalic(wxUpdateUIEvent
& event
);
140 void OnUpdateUnderline(wxUpdateUIEvent
& event
);
141 void OnUpdateStrikethrough(wxUpdateUIEvent
& event
);
142 void OnUpdateSuperscript(wxUpdateUIEvent
& event
);
143 void OnUpdateSubscript(wxUpdateUIEvent
& event
);
145 void OnAlignLeft(wxCommandEvent
& event
);
146 void OnAlignCentre(wxCommandEvent
& event
);
147 void OnAlignRight(wxCommandEvent
& event
);
149 void OnUpdateAlignLeft(wxUpdateUIEvent
& event
);
150 void OnUpdateAlignCentre(wxUpdateUIEvent
& event
);
151 void OnUpdateAlignRight(wxUpdateUIEvent
& event
);
153 void OnIndentMore(wxCommandEvent
& event
);
154 void OnIndentLess(wxCommandEvent
& event
);
156 void OnFont(wxCommandEvent
& event
);
157 void OnImage(wxCommandEvent
& event
);
158 void OnUpdateImage(wxUpdateUIEvent
& event
);
159 void OnParagraph(wxCommandEvent
& event
);
160 void OnFormat(wxCommandEvent
& event
);
161 void OnUpdateFormat(wxUpdateUIEvent
& event
);
163 void OnInsertSymbol(wxCommandEvent
& event
);
165 void OnLineSpacingHalf(wxCommandEvent
& event
);
166 void OnLineSpacingDouble(wxCommandEvent
& event
);
167 void OnLineSpacingSingle(wxCommandEvent
& event
);
169 void OnParagraphSpacingMore(wxCommandEvent
& event
);
170 void OnParagraphSpacingLess(wxCommandEvent
& event
);
172 void OnNumberList(wxCommandEvent
& event
);
173 void OnBulletsAndNumbering(wxCommandEvent
& event
);
174 void OnItemizeList(wxCommandEvent
& event
);
175 void OnRenumberList(wxCommandEvent
& event
);
176 void OnPromoteList(wxCommandEvent
& event
);
177 void OnDemoteList(wxCommandEvent
& event
);
178 void OnClearList(wxCommandEvent
& event
);
180 void OnReload(wxCommandEvent
& event
);
182 void OnViewHTML(wxCommandEvent
& event
);
184 void OnSwitchStyleSheets(wxCommandEvent
& event
);
185 void OnManageStyles(wxCommandEvent
& event
);
187 void OnInsertURL(wxCommandEvent
& event
);
188 void OnURL(wxTextUrlEvent
& event
);
189 void OnStyleSheetReplacing(wxRichTextEvent
& event
);
191 void OnPrint(wxCommandEvent
& event
);
192 void OnPreview(wxCommandEvent
& event
);
193 void OnPageSetup(wxCommandEvent
& event
);
195 void OnInsertImage(wxCommandEvent
& event
);
198 // Forward command events to the current rich text control, if any
199 bool ProcessEvent(wxEvent
& event
);
202 void WriteInitialText();
205 // any class wishing to process wxWidgets events must use this macro
206 DECLARE_EVENT_TABLE()
208 wxRichTextCtrl
* m_richTextCtrl
;
211 // ----------------------------------------------------------------------------
213 // ----------------------------------------------------------------------------
215 // IDs for the controls and the menu commands
220 ID_About
= wxID_ABOUT
,
222 ID_FORMAT_BOLD
= 100,
225 ID_FORMAT_STRIKETHROUGH
,
226 ID_FORMAT_SUPERSCRIPT
,
239 ID_FORMAT_ALIGN_LEFT
,
240 ID_FORMAT_ALIGN_CENTRE
,
241 ID_FORMAT_ALIGN_RIGHT
,
243 ID_FORMAT_INDENT_MORE
,
244 ID_FORMAT_INDENT_LESS
,
246 ID_FORMAT_PARAGRAPH_SPACING_MORE
,
247 ID_FORMAT_PARAGRAPH_SPACING_LESS
,
249 ID_FORMAT_LINE_SPACING_HALF
,
250 ID_FORMAT_LINE_SPACING_DOUBLE
,
251 ID_FORMAT_LINE_SPACING_SINGLE
,
253 ID_FORMAT_NUMBER_LIST
,
254 ID_FORMAT_BULLETS_AND_NUMBERING
,
255 ID_FORMAT_ITEMIZE_LIST
,
256 ID_FORMAT_RENUMBER_LIST
,
257 ID_FORMAT_PROMOTE_LIST
,
258 ID_FORMAT_DEMOTE_LIST
,
259 ID_FORMAT_CLEAR_LIST
,
262 ID_SWITCH_STYLE_SHEETS
,
270 ID_RICHTEXT_STYLE_LIST
,
271 ID_RICHTEXT_STYLE_COMBO
274 // ----------------------------------------------------------------------------
275 // event tables and other macros for wxWidgets
276 // ----------------------------------------------------------------------------
278 // the event tables connect the wxWidgets events with the functions (event
279 // handlers) which process them. It can be also done at run-time, but for the
280 // simple menu events like this the static method is much simpler.
281 BEGIN_EVENT_TABLE(MyFrame
, wxFrame
)
282 EVT_MENU(ID_Quit
, MyFrame::OnQuit
)
283 EVT_MENU(ID_About
, MyFrame::OnAbout
)
285 EVT_MENU(wxID_OPEN
, MyFrame::OnOpen
)
286 EVT_MENU(wxID_SAVE
, MyFrame::OnSave
)
287 EVT_MENU(wxID_SAVEAS
, MyFrame::OnSaveAs
)
289 EVT_MENU(ID_FORMAT_BOLD
, MyFrame::OnBold
)
290 EVT_MENU(ID_FORMAT_ITALIC
, MyFrame::OnItalic
)
291 EVT_MENU(ID_FORMAT_UNDERLINE
, MyFrame::OnUnderline
)
293 EVT_MENU(ID_FORMAT_STRIKETHROUGH
, MyFrame::OnStrikethrough
)
294 EVT_MENU(ID_FORMAT_SUPERSCRIPT
, MyFrame::OnSuperscript
)
295 EVT_MENU(ID_FORMAT_SUBSCRIPT
, MyFrame::OnSubscript
)
297 EVT_UPDATE_UI(ID_FORMAT_BOLD
, MyFrame::OnUpdateBold
)
298 EVT_UPDATE_UI(ID_FORMAT_ITALIC
, MyFrame::OnUpdateItalic
)
299 EVT_UPDATE_UI(ID_FORMAT_UNDERLINE
, MyFrame::OnUpdateUnderline
)
301 EVT_UPDATE_UI(ID_FORMAT_STRIKETHROUGH
, MyFrame::OnUpdateStrikethrough
)
302 EVT_UPDATE_UI(ID_FORMAT_SUPERSCRIPT
, MyFrame::OnUpdateSuperscript
)
303 EVT_UPDATE_UI(ID_FORMAT_SUBSCRIPT
, MyFrame::OnUpdateSubscript
)
305 EVT_MENU(ID_FORMAT_ALIGN_LEFT
, MyFrame::OnAlignLeft
)
306 EVT_MENU(ID_FORMAT_ALIGN_CENTRE
, MyFrame::OnAlignCentre
)
307 EVT_MENU(ID_FORMAT_ALIGN_RIGHT
, MyFrame::OnAlignRight
)
309 EVT_UPDATE_UI(ID_FORMAT_ALIGN_LEFT
, MyFrame::OnUpdateAlignLeft
)
310 EVT_UPDATE_UI(ID_FORMAT_ALIGN_CENTRE
, MyFrame::OnUpdateAlignCentre
)
311 EVT_UPDATE_UI(ID_FORMAT_ALIGN_RIGHT
, MyFrame::OnUpdateAlignRight
)
313 EVT_MENU(ID_FORMAT_FONT
, MyFrame::OnFont
)
314 EVT_MENU(ID_FORMAT_IMAGE
, MyFrame::OnImage
)
315 EVT_MENU(ID_FORMAT_PARAGRAPH
, MyFrame::OnParagraph
)
316 EVT_MENU(ID_FORMAT_CONTENT
, MyFrame::OnFormat
)
317 EVT_UPDATE_UI(ID_FORMAT_CONTENT
, MyFrame::OnUpdateFormat
)
318 EVT_UPDATE_UI(ID_FORMAT_FONT
, MyFrame::OnUpdateFormat
)
319 EVT_UPDATE_UI(ID_FORMAT_IMAGE
, MyFrame::OnUpdateImage
)
320 EVT_UPDATE_UI(ID_FORMAT_PARAGRAPH
, MyFrame::OnUpdateFormat
)
321 EVT_MENU(ID_FORMAT_INDENT_MORE
, MyFrame::OnIndentMore
)
322 EVT_MENU(ID_FORMAT_INDENT_LESS
, MyFrame::OnIndentLess
)
324 EVT_MENU(ID_FORMAT_LINE_SPACING_HALF
, MyFrame::OnLineSpacingHalf
)
325 EVT_MENU(ID_FORMAT_LINE_SPACING_SINGLE
, MyFrame::OnLineSpacingSingle
)
326 EVT_MENU(ID_FORMAT_LINE_SPACING_DOUBLE
, MyFrame::OnLineSpacingDouble
)
328 EVT_MENU(ID_FORMAT_PARAGRAPH_SPACING_MORE
, MyFrame::OnParagraphSpacingMore
)
329 EVT_MENU(ID_FORMAT_PARAGRAPH_SPACING_LESS
, MyFrame::OnParagraphSpacingLess
)
331 EVT_MENU(ID_RELOAD
, MyFrame::OnReload
)
333 EVT_MENU(ID_INSERT_SYMBOL
, MyFrame::OnInsertSymbol
)
334 EVT_MENU(ID_INSERT_URL
, MyFrame::OnInsertURL
)
335 EVT_MENU(ID_INSERT_IMAGE
, MyFrame::OnInsertImage
)
337 EVT_MENU(ID_FORMAT_NUMBER_LIST
, MyFrame::OnNumberList
)
338 EVT_MENU(ID_FORMAT_BULLETS_AND_NUMBERING
, MyFrame::OnBulletsAndNumbering
)
339 EVT_MENU(ID_FORMAT_ITEMIZE_LIST
, MyFrame::OnItemizeList
)
340 EVT_MENU(ID_FORMAT_RENUMBER_LIST
, MyFrame::OnRenumberList
)
341 EVT_MENU(ID_FORMAT_PROMOTE_LIST
, MyFrame::OnPromoteList
)
342 EVT_MENU(ID_FORMAT_DEMOTE_LIST
, MyFrame::OnDemoteList
)
343 EVT_MENU(ID_FORMAT_CLEAR_LIST
, MyFrame::OnClearList
)
345 EVT_MENU(ID_VIEW_HTML
, MyFrame::OnViewHTML
)
346 EVT_MENU(ID_SWITCH_STYLE_SHEETS
, MyFrame::OnSwitchStyleSheets
)
347 EVT_MENU(ID_MANAGE_STYLES
, MyFrame::OnManageStyles
)
349 EVT_MENU(ID_PRINT
, MyFrame::OnPrint
)
350 EVT_MENU(ID_PREVIEW
, MyFrame::OnPreview
)
351 EVT_MENU(ID_PAGE_SETUP
, MyFrame::OnPageSetup
)
353 EVT_TEXT_URL(wxID_ANY
, MyFrame::OnURL
)
354 EVT_RICHTEXT_STYLESHEET_REPLACING(wxID_ANY
, MyFrame::OnStyleSheetReplacing
)
357 // Create a new application object: this macro will allow wxWidgets to create
358 // the application object during program execution (it's better than using a
359 // static object for many reasons) and also implements the accessor function
360 // wxGetApp() which will return the reference of the right type (i.e. MyApp and
364 // ============================================================================
366 // ============================================================================
368 // ----------------------------------------------------------------------------
369 // the application class
370 // ----------------------------------------------------------------------------
372 // 'Main program' equivalent: the program execution "starts" here
375 if ( !wxApp::OnInit() )
379 wxHelpProvider::Set(new wxSimpleHelpProvider
);
382 m_styleSheet
= new wxRichTextStyleSheet
;
383 m_printing
= new wxRichTextPrinting(wxT("Test Document"));
385 m_printing
->SetFooterText(wxT("@TITLE@"), wxRICHTEXT_PAGE_ALL
, wxRICHTEXT_PAGE_CENTRE
);
386 m_printing
->SetFooterText(wxT("Page @PAGENUM@"), wxRICHTEXT_PAGE_ALL
, wxRICHTEXT_PAGE_RIGHT
);
390 // Add extra handlers (plain text is automatically added)
391 wxRichTextBuffer::AddHandler(new wxRichTextXMLHandler
);
392 wxRichTextBuffer::AddHandler(new wxRichTextHTMLHandler
);
394 // Add image handlers
396 wxImage::AddHandler( new wxPNGHandler
);
400 wxImage::AddHandler( new wxJPEGHandler
);
404 wxImage::AddHandler( new wxGIFHandler
);
408 wxFileSystem::AddHandler( new wxMemoryFSHandler
);
411 // create the main application window
412 MyFrame
*frame
= new MyFrame(wxT("wxRichTextCtrl Sample"), wxID_ANY
, wxDefaultPosition
, wxSize(700, 600));
414 m_printing
->SetParentWindow(frame
);
416 // and show it (the frames, unlike simple controls, are not shown when
417 // created initially)
420 // success: wxApp::OnRun() will be called which will enter the main message
421 // loop and the application will run. If we returned false here, the
422 // application would exit immediately.
434 void MyApp::CreateStyles()
438 wxFont
romanFont(12, wxROMAN
, wxNORMAL
, wxNORMAL
);
439 wxFont
swissFont(12, wxSWISS
, wxNORMAL
, wxNORMAL
);
441 wxRichTextParagraphStyleDefinition
* normalPara
= new wxRichTextParagraphStyleDefinition(wxT("Normal"));
442 wxRichTextAttr normalAttr
;
443 normalAttr
.SetFontFaceName(romanFont
.GetFaceName());
444 normalAttr
.SetFontSize(12);
445 // Let's set all attributes for this style
446 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
|
447 wxTEXT_ATTR_PARA_SPACING_BEFORE
|wxTEXT_ATTR_PARA_SPACING_AFTER
|wxTEXT_ATTR_LINE_SPACING
|
448 wxTEXT_ATTR_BULLET_STYLE
|wxTEXT_ATTR_BULLET_NUMBER
);
449 normalPara
->SetStyle(normalAttr
);
451 m_styleSheet
->AddParagraphStyle(normalPara
);
453 wxRichTextParagraphStyleDefinition
* indentedPara
= new wxRichTextParagraphStyleDefinition(wxT("Indented"));
454 wxRichTextAttr indentedAttr
;
455 indentedAttr
.SetFontFaceName(romanFont
.GetFaceName());
456 indentedAttr
.SetFontSize(12);
457 indentedAttr
.SetLeftIndent(100, 0);
458 // We only want to affect indentation
459 indentedAttr
.SetFlags(wxTEXT_ATTR_LEFT_INDENT
|wxTEXT_ATTR_RIGHT_INDENT
);
460 indentedPara
->SetStyle(indentedAttr
);
462 m_styleSheet
->AddParagraphStyle(indentedPara
);
464 wxRichTextParagraphStyleDefinition
* indentedPara2
= new wxRichTextParagraphStyleDefinition(wxT("Red Bold Indented"));
465 wxRichTextAttr indentedAttr2
;
466 indentedAttr2
.SetFontFaceName(romanFont
.GetFaceName());
467 indentedAttr2
.SetFontSize(12);
468 indentedAttr2
.SetFontWeight(wxFONTWEIGHT_BOLD
);
469 indentedAttr2
.SetTextColour(*wxRED
);
470 indentedAttr2
.SetFontSize(12);
471 indentedAttr2
.SetLeftIndent(100, 0);
472 // We want to affect indentation, font and text colour
473 indentedAttr2
.SetFlags(wxTEXT_ATTR_LEFT_INDENT
|wxTEXT_ATTR_RIGHT_INDENT
|wxTEXT_ATTR_FONT
|wxTEXT_ATTR_TEXT_COLOUR
);
474 indentedPara2
->SetStyle(indentedAttr2
);
476 m_styleSheet
->AddParagraphStyle(indentedPara2
);
478 wxRichTextParagraphStyleDefinition
* flIndentedPara
= new wxRichTextParagraphStyleDefinition(wxT("First Line Indented"));
479 wxRichTextAttr flIndentedAttr
;
480 flIndentedAttr
.SetFontFaceName(swissFont
.GetFaceName());
481 flIndentedAttr
.SetFontSize(12);
482 flIndentedAttr
.SetLeftIndent(100, -100);
483 // We only want to affect indentation
484 flIndentedAttr
.SetFlags(wxTEXT_ATTR_LEFT_INDENT
|wxTEXT_ATTR_RIGHT_INDENT
);
485 flIndentedPara
->SetStyle(flIndentedAttr
);
487 m_styleSheet
->AddParagraphStyle(flIndentedPara
);
491 wxRichTextCharacterStyleDefinition
* boldDef
= new wxRichTextCharacterStyleDefinition(wxT("Bold"));
492 wxRichTextAttr boldAttr
;
493 boldAttr
.SetFontFaceName(romanFont
.GetFaceName());
494 boldAttr
.SetFontSize(12);
495 boldAttr
.SetFontWeight(wxFONTWEIGHT_BOLD
);
496 // We only want to affect boldness
497 boldAttr
.SetFlags(wxTEXT_ATTR_FONT_WEIGHT
);
498 boldDef
->SetStyle(boldAttr
);
500 m_styleSheet
->AddCharacterStyle(boldDef
);
502 wxRichTextCharacterStyleDefinition
* italicDef
= new wxRichTextCharacterStyleDefinition(wxT("Italic"));
503 wxRichTextAttr italicAttr
;
504 italicAttr
.SetFontFaceName(romanFont
.GetFaceName());
505 italicAttr
.SetFontSize(12);
506 italicAttr
.SetFontStyle(wxFONTSTYLE_ITALIC
);
507 // We only want to affect italics
508 italicAttr
.SetFlags(wxTEXT_ATTR_FONT_ITALIC
);
509 italicDef
->SetStyle(italicAttr
);
511 m_styleSheet
->AddCharacterStyle(italicDef
);
513 wxRichTextCharacterStyleDefinition
* redDef
= new wxRichTextCharacterStyleDefinition(wxT("Red Bold"));
514 wxRichTextAttr redAttr
;
515 redAttr
.SetFontFaceName(romanFont
.GetFaceName());
516 redAttr
.SetFontSize(12);
517 redAttr
.SetFontWeight(wxFONTWEIGHT_BOLD
);
518 redAttr
.SetTextColour(*wxRED
);
519 // We only want to affect colour, weight and face
520 redAttr
.SetFlags(wxTEXT_ATTR_FONT_FACE
|wxTEXT_ATTR_FONT_WEIGHT
|wxTEXT_ATTR_TEXT_COLOUR
);
521 redDef
->SetStyle(redAttr
);
523 m_styleSheet
->AddCharacterStyle(redDef
);
525 wxRichTextListStyleDefinition
* bulletList
= new wxRichTextListStyleDefinition(wxT("Bullet List 1"));
527 for (i
= 0; i
< 10; i
++)
531 bulletText
= wxT("standard/circle");
533 bulletText
= wxT("standard/square");
535 bulletText
= wxT("standard/circle");
537 bulletText
= wxT("standard/square");
539 bulletText
= wxT("standard/circle");
541 bulletList
->SetAttributes(i
, (i
+1)*60, 60, wxTEXT_ATTR_BULLET_STYLE_STANDARD
, bulletText
);
544 m_styleSheet
->AddListStyle(bulletList
);
546 wxRichTextListStyleDefinition
* numberedList
= new wxRichTextListStyleDefinition(wxT("Numbered List 1"));
547 for (i
= 0; i
< 10; i
++)
551 numberStyle
= wxTEXT_ATTR_BULLET_STYLE_ARABIC
|wxTEXT_ATTR_BULLET_STYLE_PERIOD
;
553 numberStyle
= wxTEXT_ATTR_BULLET_STYLE_LETTERS_LOWER
|wxTEXT_ATTR_BULLET_STYLE_PARENTHESES
;
555 numberStyle
= wxTEXT_ATTR_BULLET_STYLE_ROMAN_LOWER
|wxTEXT_ATTR_BULLET_STYLE_PARENTHESES
;
557 numberStyle
= wxTEXT_ATTR_BULLET_STYLE_ROMAN_UPPER
|wxTEXT_ATTR_BULLET_STYLE_PARENTHESES
;
559 numberStyle
= wxTEXT_ATTR_BULLET_STYLE_ARABIC
|wxTEXT_ATTR_BULLET_STYLE_PERIOD
;
561 numberStyle
|= wxTEXT_ATTR_BULLET_STYLE_ALIGN_RIGHT
;
563 numberedList
->SetAttributes(i
, (i
+1)*60, 60, numberStyle
);
566 m_styleSheet
->AddListStyle(numberedList
);
568 wxRichTextListStyleDefinition
* outlineList
= new wxRichTextListStyleDefinition(wxT("Outline List 1"));
569 for (i
= 0; i
< 10; i
++)
573 numberStyle
= wxTEXT_ATTR_BULLET_STYLE_OUTLINE
|wxTEXT_ATTR_BULLET_STYLE_PERIOD
;
575 numberStyle
= wxTEXT_ATTR_BULLET_STYLE_ARABIC
|wxTEXT_ATTR_BULLET_STYLE_PERIOD
;
577 outlineList
->SetAttributes(i
, (i
+1)*120, 120, numberStyle
);
580 m_styleSheet
->AddListStyle(outlineList
);
583 // ----------------------------------------------------------------------------
585 // ----------------------------------------------------------------------------
588 MyFrame::MyFrame(const wxString
& title
, wxWindowID id
, const wxPoint
& pos
,
589 const wxSize
& size
, long style
)
590 : wxFrame(NULL
, id
, title
, pos
, size
, style
)
592 // set the frame icon
593 SetIcon(wxICON(sample
));
596 wxMenu
*fileMenu
= new wxMenu
;
598 // the "About" item should be in the help menu
599 wxMenu
*helpMenu
= new wxMenu
;
600 helpMenu
->Append(ID_About
, wxT("&About...\tF1"), wxT("Show about dialog"));
602 fileMenu
->Append(wxID_OPEN
, wxT("&Open\tCtrl+O"), wxT("Open a file"));
603 fileMenu
->Append(wxID_SAVE
, wxT("&Save\tCtrl+S"), wxT("Save a file"));
604 fileMenu
->Append(wxID_SAVEAS
, wxT("&Save As...\tF12"), wxT("Save to a new file"));
605 fileMenu
->AppendSeparator();
606 fileMenu
->Append(ID_RELOAD
, wxT("&Reload Text\tF2"), wxT("Reload the initial text"));
607 fileMenu
->AppendSeparator();
608 fileMenu
->Append(ID_PAGE_SETUP
, wxT("Page Set&up..."), wxT("Page setup"));
609 fileMenu
->Append(ID_PRINT
, wxT("&Print...\tCtrl+P"), wxT("Print"));
610 fileMenu
->Append(ID_PREVIEW
, wxT("Print Pre&view"), wxT("Print preview"));
611 fileMenu
->AppendSeparator();
612 fileMenu
->Append(ID_VIEW_HTML
, wxT("&View as HTML"), wxT("View HTML"));
613 fileMenu
->AppendSeparator();
614 fileMenu
->Append(ID_Quit
, wxT("E&xit\tAlt+X"), wxT("Quit this program"));
616 wxMenu
* editMenu
= new wxMenu
;
617 editMenu
->Append(wxID_UNDO
, _("&Undo\tCtrl+Z"));
618 editMenu
->Append(wxID_REDO
, _("&Redo\tCtrl+Y"));
619 editMenu
->AppendSeparator();
620 editMenu
->Append(wxID_CUT
, _("Cu&t\tCtrl+X"));
621 editMenu
->Append(wxID_COPY
, _("&Copy\tCtrl+C"));
622 editMenu
->Append(wxID_PASTE
, _("&Paste\tCtrl+V"));
624 editMenu
->AppendSeparator();
625 editMenu
->Append(wxID_SELECTALL
, _("Select A&ll\tCtrl+A"));
627 editMenu
->AppendSeparator();
628 editMenu
->Append(wxID_FIND
, _("&Find...\tCtrl+F"));
629 editMenu
->Append(stID_FIND_REPLACE
, _("&Replace...\tCtrl+R"));
632 wxMenu
* formatMenu
= new wxMenu
;
633 formatMenu
->AppendCheckItem(ID_FORMAT_BOLD
, _("&Bold\tCtrl+B"));
634 formatMenu
->AppendCheckItem(ID_FORMAT_ITALIC
, _("&Italic\tCtrl+I"));
635 formatMenu
->AppendCheckItem(ID_FORMAT_UNDERLINE
, _("&Underline\tCtrl+U"));
636 formatMenu
->AppendSeparator();
637 formatMenu
->AppendCheckItem(ID_FORMAT_STRIKETHROUGH
, _("Stri&kethrough"));
638 formatMenu
->AppendCheckItem(ID_FORMAT_SUPERSCRIPT
, _("Superscrip&t"));
639 formatMenu
->AppendCheckItem(ID_FORMAT_SUBSCRIPT
, _("Subscrip&t"));
640 formatMenu
->AppendSeparator();
641 formatMenu
->AppendCheckItem(ID_FORMAT_ALIGN_LEFT
, _("L&eft Align"));
642 formatMenu
->AppendCheckItem(ID_FORMAT_ALIGN_RIGHT
, _("&Right Align"));
643 formatMenu
->AppendCheckItem(ID_FORMAT_ALIGN_CENTRE
, _("&Centre"));
644 formatMenu
->AppendSeparator();
645 formatMenu
->Append(ID_FORMAT_INDENT_MORE
, _("Indent &More"));
646 formatMenu
->Append(ID_FORMAT_INDENT_LESS
, _("Indent &Less"));
647 formatMenu
->AppendSeparator();
648 formatMenu
->Append(ID_FORMAT_PARAGRAPH_SPACING_MORE
, _("Increase Paragraph &Spacing"));
649 formatMenu
->Append(ID_FORMAT_PARAGRAPH_SPACING_LESS
, _("Decrease &Paragraph Spacing"));
650 formatMenu
->AppendSeparator();
651 formatMenu
->Append(ID_FORMAT_LINE_SPACING_SINGLE
, _("Normal Line Spacing"));
652 formatMenu
->Append(ID_FORMAT_LINE_SPACING_HALF
, _("1.5 Line Spacing"));
653 formatMenu
->Append(ID_FORMAT_LINE_SPACING_DOUBLE
, _("Double Line Spacing"));
654 formatMenu
->AppendSeparator();
655 formatMenu
->Append(ID_FORMAT_FONT
, _("&Font..."));
656 formatMenu
->Append(ID_FORMAT_IMAGE
, _("Image Property"));
657 formatMenu
->Append(ID_FORMAT_PARAGRAPH
, _("&Paragraph..."));
658 formatMenu
->Append(ID_FORMAT_CONTENT
, _("Font and Pa&ragraph...\tShift+Ctrl+F"));
659 formatMenu
->AppendSeparator();
660 formatMenu
->Append(ID_SWITCH_STYLE_SHEETS
, _("&Switch Style Sheets"));
661 formatMenu
->Append(ID_MANAGE_STYLES
, _("&Manage Styles"));
663 wxMenu
* listsMenu
= new wxMenu
;
664 listsMenu
->Append(ID_FORMAT_BULLETS_AND_NUMBERING
, _("Bullets and &Numbering..."));
665 listsMenu
->AppendSeparator();
666 listsMenu
->Append(ID_FORMAT_NUMBER_LIST
, _("Number List"));
667 listsMenu
->Append(ID_FORMAT_ITEMIZE_LIST
, _("Itemize List"));
668 listsMenu
->Append(ID_FORMAT_RENUMBER_LIST
, _("Renumber List"));
669 listsMenu
->Append(ID_FORMAT_PROMOTE_LIST
, _("Promote List Items"));
670 listsMenu
->Append(ID_FORMAT_DEMOTE_LIST
, _("Demote List Items"));
671 listsMenu
->Append(ID_FORMAT_CLEAR_LIST
, _("Clear List Formatting"));
673 wxMenu
* insertMenu
= new wxMenu
;
674 insertMenu
->Append(ID_INSERT_SYMBOL
, _("&Symbol...\tCtrl+I"));
675 insertMenu
->Append(ID_INSERT_URL
, _("&URL..."));
676 insertMenu
->Append(ID_INSERT_IMAGE
, _("&Image..."));
678 // now append the freshly created menu to the menu bar...
679 wxMenuBar
*menuBar
= new wxMenuBar();
680 menuBar
->Append(fileMenu
, wxT("&File"));
681 menuBar
->Append(editMenu
, wxT("&Edit"));
682 menuBar
->Append(formatMenu
, wxT("F&ormat"));
683 menuBar
->Append(listsMenu
, wxT("&Lists"));
684 menuBar
->Append(insertMenu
, wxT("&Insert"));
685 menuBar
->Append(helpMenu
, wxT("&Help"));
687 // ... and attach this menu bar to the frame
690 // create a status bar just for fun (by default with 1 pane only)
691 // but don't create it on limited screen space (WinCE)
692 bool is_pda
= wxSystemSettings::GetScreenType() <= wxSYS_SCREEN_PDA
;
698 SetStatusText(wxT("Welcome to wxRichTextCtrl!"));
702 wxToolBar
* toolBar
= CreateToolBar();
704 toolBar
->AddTool(wxID_OPEN
, wxEmptyString
, wxBitmap(open_xpm
), _("Open"));
705 toolBar
->AddTool(wxID_SAVEAS
, wxEmptyString
, wxBitmap(save_xpm
), _("Save"));
706 toolBar
->AddSeparator();
707 toolBar
->AddTool(wxID_CUT
, wxEmptyString
, wxBitmap(cut_xpm
), _("Cut"));
708 toolBar
->AddTool(wxID_COPY
, wxEmptyString
, wxBitmap(copy_xpm
), _("Copy"));
709 toolBar
->AddTool(wxID_PASTE
, wxEmptyString
, wxBitmap(paste_xpm
), _("Paste"));
710 toolBar
->AddSeparator();
711 toolBar
->AddTool(wxID_UNDO
, wxEmptyString
, wxBitmap(undo_xpm
), _("Undo"));
712 toolBar
->AddTool(wxID_REDO
, wxEmptyString
, wxBitmap(redo_xpm
), _("Redo"));
713 toolBar
->AddSeparator();
714 toolBar
->AddCheckTool(ID_FORMAT_BOLD
, wxEmptyString
, wxBitmap(bold_xpm
), wxNullBitmap
, _("Bold"));
715 toolBar
->AddCheckTool(ID_FORMAT_ITALIC
, wxEmptyString
, wxBitmap(italic_xpm
), wxNullBitmap
, _("Italic"));
716 toolBar
->AddCheckTool(ID_FORMAT_UNDERLINE
, wxEmptyString
, wxBitmap(underline_xpm
), wxNullBitmap
, _("Underline"));
717 toolBar
->AddSeparator();
718 toolBar
->AddCheckTool(ID_FORMAT_ALIGN_LEFT
, wxEmptyString
, wxBitmap(alignleft_xpm
), wxNullBitmap
, _("Align Left"));
719 toolBar
->AddCheckTool(ID_FORMAT_ALIGN_CENTRE
, wxEmptyString
, wxBitmap(centre_xpm
), wxNullBitmap
, _("Centre"));
720 toolBar
->AddCheckTool(ID_FORMAT_ALIGN_RIGHT
, wxEmptyString
, wxBitmap(alignright_xpm
), wxNullBitmap
, _("Align Right"));
721 toolBar
->AddSeparator();
722 toolBar
->AddTool(ID_FORMAT_INDENT_LESS
, wxEmptyString
, wxBitmap(indentless_xpm
), _("Indent Less"));
723 toolBar
->AddTool(ID_FORMAT_INDENT_MORE
, wxEmptyString
, wxBitmap(indentmore_xpm
), _("Indent More"));
724 toolBar
->AddSeparator();
725 toolBar
->AddTool(ID_FORMAT_FONT
, wxEmptyString
, wxBitmap(font_xpm
), _("Font"));
726 toolBar
->AddTool(ID_FORMAT_IMAGE
, wxString("Im"), wxBitmap(font_xpm
), _("Image Property"));
728 wxRichTextStyleComboCtrl
* combo
= new wxRichTextStyleComboCtrl(toolBar
, ID_RICHTEXT_STYLE_COMBO
, wxDefaultPosition
, wxSize(200, -1));
729 toolBar
->AddControl(combo
);
733 wxSplitterWindow
* splitter
= new wxSplitterWindow(this, wxID_ANY
, wxDefaultPosition
, GetClientSize(), wxSP_LIVE_UPDATE
);
735 wxFont textFont
= wxFont(12, wxROMAN
, wxNORMAL
, wxNORMAL
);
736 wxFont boldFont
= wxFont(12, wxROMAN
, wxNORMAL
, wxBOLD
);
737 wxFont italicFont
= wxFont(12, wxROMAN
, wxITALIC
, wxNORMAL
);
739 m_richTextCtrl
= new wxRichTextCtrl(splitter
, ID_RICHTEXT_CTRL
, wxEmptyString
, wxDefaultPosition
, wxSize(200, 200), wxVSCROLL
|wxHSCROLL
|wxWANTS_CHARS
);
740 wxFont
font(12, wxROMAN
, wxNORMAL
, wxNORMAL
);
742 m_richTextCtrl
->SetFont(font
);
744 m_richTextCtrl
->SetMargins(10, 10);
746 m_richTextCtrl
->SetStyleSheet(wxGetApp().GetStyleSheet());
748 combo
->SetStyleSheet(wxGetApp().GetStyleSheet());
749 combo
->SetRichTextCtrl(m_richTextCtrl
);
750 combo
->UpdateStyles();
752 wxRichTextStyleListCtrl
* styleListCtrl
= new wxRichTextStyleListCtrl(splitter
, ID_RICHTEXT_STYLE_LIST
);
754 wxSize display
= wxGetDisplaySize();
755 if ( is_pda
&& ( display
.GetWidth() < display
.GetHeight() ) )
757 splitter
->SplitHorizontally(m_richTextCtrl
, styleListCtrl
);
761 splitter
->SplitVertically(m_richTextCtrl
, styleListCtrl
, 500);
764 splitter
->UpdateSize();
766 styleListCtrl
->SetStyleSheet(wxGetApp().GetStyleSheet());
767 styleListCtrl
->SetRichTextCtrl(m_richTextCtrl
);
768 styleListCtrl
->UpdateStyles();
774 void MyFrame::WriteInitialText()
776 wxRichTextCtrl
& r
= *m_richTextCtrl
;
778 r
.SetDefaultStyle(wxRichTextAttr());
780 r
.BeginSuppressUndo();
784 r
.BeginParagraphSpacing(0, 20);
786 r
.BeginAlignment(wxTEXT_ALIGNMENT_CENTRE
);
791 wxString lineBreak
= (wxChar
) 29;
793 r
.WriteText(wxString(wxT("Welcome to wxRichTextCtrl, a wxWidgets control")) + lineBreak
+ wxT("for editing and presenting styled text and images\n"));
797 r
.WriteText(wxT("by Julian Smart"));
803 r
.WriteImage(wxBitmap(zebra_xpm
));
810 r
.BeginAlignment(wxTEXT_ALIGNMENT_LEFT
);
811 wxRichTextAttr imageAttr
;
812 imageAttr
.GetTextBoxAttr().SetFloatMode(wxTEXT_BOX_ATTR_FLOAT_LEFT
);
813 r
.WriteText(wxString(wxT("This is a simple test for a floating left image test. The zebra image should be placed at the left side of the current buffer and all the text should flow around it at the right side. This is a simple test for a floating left image test. The zebra image should be placed at the left side of the current buffer and all the text should flow around it at the right side. This is a simple test for a floating left image test. The zebra image should be placed at the left side of the current buffer and all the text should flow around it at the right side.")));
814 r
.WriteImage(wxBitmap(zebra_xpm
), wxBITMAP_TYPE_PNG
, imageAttr
);
816 imageAttr
.GetTextBoxAttr().GetTop().SetValue(200);
817 imageAttr
.GetTextBoxAttr().GetTop().SetUnits(wxTEXT_ATTR_UNITS_PIXELS
);
818 imageAttr
.GetTextBoxAttr().SetFloatMode(wxTEXT_BOX_ATTR_FLOAT_RIGHT
);
819 r
.WriteImage(wxBitmap(zebra_xpm
), wxBITMAP_TYPE_PNG
, imageAttr
);
820 r
.WriteText(wxString(wxT("This is a simple test for a floating right image test. The zebra image should be placed at the right side of the current buffer and all the text should flow around it at the left side. This is a simple test for a floating left image test. The zebra image should be placed at the right side of the current buffer and all the text should flow around it at the left side. This is a simple test for a floating left image test. The zebra image should be placed at the right side of the current buffer and all the text should flow around it at the left side.")));
824 r
.WriteText(wxT("What can you do with this thing? "));
826 r
.WriteImage(wxBitmap(smiley_xpm
));
827 r
.WriteText(wxT(" Well, you can change text "));
829 r
.BeginTextColour(wxColour(255, 0, 0));
830 r
.WriteText(wxT("colour, like this red bit."));
833 wxRichTextAttr backgroundColourAttr
;
834 backgroundColourAttr
.SetBackgroundColour(*wxGREEN
);
835 backgroundColourAttr
.SetTextColour(wxColour(0, 0, 255));
836 r
.BeginStyle(backgroundColourAttr
);
837 r
.WriteText(wxT(" And this blue on green bit."));
840 r
.WriteText(wxT(" Naturally you can make things "));
842 r
.WriteText(wxT("bold "));
845 r
.WriteText(wxT("or italic "));
848 r
.WriteText(wxT("or underlined."));
852 r
.WriteText(wxT(" Different font sizes on the same line is allowed, too."));
855 r
.WriteText(wxT(" Next we'll show an indented paragraph."));
859 r
.BeginLeftIndent(60);
860 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."));
865 r
.WriteText(wxT("Next, we'll show a first-line indent, achieved using BeginLeftIndent(100, -40)."));
869 r
.BeginLeftIndent(100, -40);
871 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."));
876 r
.WriteText(wxT("Numbered bullets are possible, again using subindents:"));
879 r
.BeginNumberedBullet(1, 100, 60);
880 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."));
882 r
.EndNumberedBullet();
884 r
.BeginNumberedBullet(2, 100, 60);
885 r
.WriteText(wxT("This is my second item."));
887 r
.EndNumberedBullet();
889 r
.WriteText(wxT("The following paragraph is right-indented:"));
892 r
.BeginRightIndent(200);
894 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."));
899 r
.WriteText(wxT("The following paragraph is right-aligned with 1.5 line spacing:"));
902 r
.BeginAlignment(wxTEXT_ALIGNMENT_RIGHT
);
903 r
.BeginLineSpacing(wxTEXT_ATTR_LINE_SPACING_HALF
);
904 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."));
915 attr
.SetFlags(wxTEXT_ATTR_TABS
);
917 r
.SetDefaultStyle(attr
);
919 r
.WriteText(wxT("This line contains tabs:\tFirst tab\tSecond tab\tThird tab"));
922 r
.WriteText(wxT("Other notable features of wxRichTextCtrl include:"));
925 r
.BeginSymbolBullet(wxT('*'), 100, 60);
926 r
.WriteText(wxT("Compatibility with wxTextCtrl API"));
930 r
.BeginSymbolBullet(wxT('*'), 100, 60);
931 r
.WriteText(wxT("Easy stack-based BeginXXX()...EndXXX() style setting in addition to SetStyle()"));
935 r
.BeginSymbolBullet(wxT('*'), 100, 60);
936 r
.WriteText(wxT("XML loading and saving"));
940 r
.BeginSymbolBullet(wxT('*'), 100, 60);
941 r
.WriteText(wxT("Undo/Redo, with batching option and Undo suppressing"));
945 r
.BeginSymbolBullet(wxT('*'), 100, 60);
946 r
.WriteText(wxT("Clipboard copy and paste"));
950 r
.BeginSymbolBullet(wxT('*'), 100, 60);
951 r
.WriteText(wxT("wxRichTextStyleSheet with named character and paragraph styles, and control for applying named styles"));
955 r
.BeginSymbolBullet(wxT('*'), 100, 60);
956 r
.WriteText(wxT("A design that can easily be extended to other content types, ultimately with text boxes, tables, controls, and so on"));
960 // Make a style suitable for showing a URL
961 wxRichTextAttr urlStyle
;
962 urlStyle
.SetTextColour(*wxBLUE
);
963 urlStyle
.SetFontUnderlined(true);
965 r
.WriteText(wxT("wxRichTextCtrl can also display URLs, such as this one: "));
966 r
.BeginStyle(urlStyle
);
967 r
.BeginURL(wxT("http://www.wxwidgets.org"));
968 r
.WriteText(wxT("The wxWidgets Web Site"));
971 r
.WriteText(wxT(". Click on the URL to generate an event."));
975 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"));
977 r
.EndParagraphSpacing();
986 attr
.GetTextBoxAttr().GetMargins().GetLeft().SetValue(20, wxTEXT_ATTR_UNITS_PIXELS
);
987 attr
.GetTextBoxAttr().GetMargins().GetTop().SetValue(20, wxTEXT_ATTR_UNITS_PIXELS
);
988 attr
.GetTextBoxAttr().GetMargins().GetRight().SetValue(20, wxTEXT_ATTR_UNITS_PIXELS
);
989 attr
.GetTextBoxAttr().GetMargins().GetBottom().SetValue(20, wxTEXT_ATTR_UNITS_PIXELS
);
991 attr
.GetTextBoxAttr().GetBorder().SetColour(*wxBLACK
);
992 attr
.GetTextBoxAttr().GetBorder().SetWidth(1, wxTEXT_ATTR_UNITS_PIXELS
);
993 attr
.GetTextBoxAttr().GetBorder().SetStyle(wxTEXT_BOX_ATTR_BORDER_SOLID
);
995 wxRichTextBox
* textBox
= r
.WriteTextBox(attr
);
996 r
.SetFocusObject(textBox
);
998 r
.WriteText(wxT("This is a text box. Just testing! Once more unto the breach, dear friends, once more..."));
1000 r
.SetFocusObject(NULL
); // Set the focus back to the main buffer
1001 r
.SetInsertionPointEnd();
1010 wxRichTextAttr attr
;
1011 attr
.GetTextBoxAttr().GetMargins().GetLeft().SetValue(5, wxTEXT_ATTR_UNITS_PIXELS
);
1012 attr
.GetTextBoxAttr().GetMargins().GetTop().SetValue(5, wxTEXT_ATTR_UNITS_PIXELS
);
1013 attr
.GetTextBoxAttr().GetMargins().GetRight().SetValue(5, wxTEXT_ATTR_UNITS_PIXELS
);
1014 attr
.GetTextBoxAttr().GetMargins().GetBottom().SetValue(5, wxTEXT_ATTR_UNITS_PIXELS
);
1015 attr
.GetTextBoxAttr().GetPadding() = attr
.GetTextBoxAttr().GetMargins();
1017 attr
.GetTextBoxAttr().GetBorder().SetColour(*wxBLACK
);
1018 attr
.GetTextBoxAttr().GetBorder().SetWidth(1, wxTEXT_ATTR_UNITS_PIXELS
);
1019 attr
.GetTextBoxAttr().GetBorder().SetStyle(wxTEXT_BOX_ATTR_BORDER_SOLID
);
1021 wxRichTextAttr cellAttr
= attr
;
1022 cellAttr
.GetTextBoxAttr().GetWidth().SetValue(200, wxTEXT_ATTR_UNITS_PIXELS
);
1023 cellAttr
.GetTextBoxAttr().GetHeight().SetValue(150, wxTEXT_ATTR_UNITS_PIXELS
);
1025 wxRichTextTable
* table
= r
.WriteTable(3, 2, attr
, cellAttr
);
1027 for (j
= 0; j
< table
->GetRowCount(); j
++)
1029 for (i
= 0; i
< table
->GetColumnCount(); i
++)
1031 wxString msg
= wxString::Format(wxT("This is cell %d, %d"), (j
+1), (i
+1));
1032 r
.SetFocusObject(table
->GetCell(j
, i
));
1036 r
.SetFocusObject(NULL
); // Set the focus back to the main buffer
1037 r
.SetInsertionPointEnd();
1043 r
.EndSuppressUndo();
1048 void MyFrame::OnQuit(wxCommandEvent
& WXUNUSED(event
))
1050 // true is to force the frame to close
1054 void MyFrame::OnAbout(wxCommandEvent
& WXUNUSED(event
))
1057 msg
.Printf( wxT("This is a demo for wxRichTextCtrl, a control for editing styled text.\n(c) Julian Smart, 2005"));
1058 wxMessageBox(msg
, wxT("About wxRichTextCtrl Sample"), wxOK
| wxICON_INFORMATION
, this);
1061 // Forward command events to the current rich text control, if any
1062 bool MyFrame::ProcessEvent(wxEvent
& event
)
1064 if (event
.IsCommandEvent() && !event
.IsKindOf(CLASSINFO(wxChildFocusEvent
)))
1066 // Problem: we can get infinite recursion because the events
1067 // climb back up to this frame, and repeat.
1068 // Assume that command events don't cause another command event
1069 // to be called, so we can rely on inCommand not being overwritten
1071 static int s_eventType
= 0;
1072 static wxWindowID s_id
= 0;
1074 if (s_id
!= event
.GetId() && s_eventType
!= event
.GetEventType())
1076 s_eventType
= event
.GetEventType();
1077 s_id
= event
.GetId();
1079 wxWindow
* focusWin
= wxFindFocusDescendant(this);
1080 if (focusWin
&& focusWin
->GetEventHandler()->ProcessEvent(event
))
1097 return wxFrame::ProcessEvent(event
);
1100 void MyFrame::OnOpen(wxCommandEvent
& WXUNUSED(event
))
1104 wxArrayInt fileTypes
;
1106 wxString filter
= wxRichTextBuffer::GetExtWildcard(false, false, & fileTypes
);
1107 if (!filter
.empty())
1109 filter
+= wxT("All files (*.*)|*.*");
1111 wxFileDialog
dialog(this,
1112 _("Choose a filename"),
1118 if (dialog
.ShowModal() == wxID_OK
)
1120 wxString path
= dialog
.GetPath();
1124 int filterIndex
= dialog
.GetFilterIndex();
1125 int fileType
= (filterIndex
< (int) fileTypes
.GetCount())
1126 ? fileTypes
[filterIndex
]
1127 : wxRICHTEXT_TYPE_TEXT
;
1128 m_richTextCtrl
->LoadFile(path
, fileType
);
1133 void MyFrame::OnSave(wxCommandEvent
& event
)
1135 if (m_richTextCtrl
->GetFilename().empty())
1140 m_richTextCtrl
->SaveFile();
1143 void MyFrame::OnSaveAs(wxCommandEvent
& WXUNUSED(event
))
1145 wxString filter
= wxRichTextBuffer::GetExtWildcard(false, true);
1149 wxFileDialog
dialog(this,
1150 _("Choose a filename"),
1156 if (dialog
.ShowModal() == wxID_OK
)
1158 wxString path
= dialog
.GetPath();
1163 wxStopWatch stopwatch
;
1165 m_richTextCtrl
->SaveFile(path
);
1167 long t
= stopwatch
.Time();
1168 wxLogDebug(wxT("Saving took %ldms"), t
);
1169 wxMessageBox(wxString::Format(wxT("Saving took %ldms"), t
));
1174 void MyFrame::OnBold(wxCommandEvent
& WXUNUSED(event
))
1176 m_richTextCtrl
->ApplyBoldToSelection();
1179 void MyFrame::OnItalic(wxCommandEvent
& WXUNUSED(event
))
1181 m_richTextCtrl
->ApplyItalicToSelection();
1184 void MyFrame::OnUnderline(wxCommandEvent
& WXUNUSED(event
))
1186 m_richTextCtrl
->ApplyUnderlineToSelection();
1189 void MyFrame::OnStrikethrough(wxCommandEvent
& WXUNUSED(event
))
1191 m_richTextCtrl
->ApplyTextEffectToSelection(wxTEXT_ATTR_EFFECT_STRIKETHROUGH
);
1194 void MyFrame::OnSuperscript(wxCommandEvent
& WXUNUSED(event
))
1196 m_richTextCtrl
->ApplyTextEffectToSelection(wxTEXT_ATTR_EFFECT_SUPERSCRIPT
);
1199 void MyFrame::OnSubscript(wxCommandEvent
& WXUNUSED(event
))
1201 m_richTextCtrl
->ApplyTextEffectToSelection(wxTEXT_ATTR_EFFECT_SUBSCRIPT
);
1205 void MyFrame::OnUpdateBold(wxUpdateUIEvent
& event
)
1207 event
.Check(m_richTextCtrl
->IsSelectionBold());
1210 void MyFrame::OnUpdateItalic(wxUpdateUIEvent
& event
)
1212 event
.Check(m_richTextCtrl
->IsSelectionItalics());
1215 void MyFrame::OnUpdateUnderline(wxUpdateUIEvent
& event
)
1217 event
.Check(m_richTextCtrl
->IsSelectionUnderlined());
1220 void MyFrame::OnUpdateStrikethrough(wxUpdateUIEvent
& event
)
1222 event
.Check(m_richTextCtrl
->DoesSelectionHaveTextEffectFlag(wxTEXT_ATTR_EFFECT_STRIKETHROUGH
));
1225 void MyFrame::OnUpdateSuperscript(wxUpdateUIEvent
& event
)
1227 event
.Check(m_richTextCtrl
->DoesSelectionHaveTextEffectFlag(wxTEXT_ATTR_EFFECT_SUPERSCRIPT
));
1230 void MyFrame::OnUpdateSubscript(wxUpdateUIEvent
& event
)
1232 event
.Check(m_richTextCtrl
->DoesSelectionHaveTextEffectFlag(wxTEXT_ATTR_EFFECT_SUBSCRIPT
));
1235 void MyFrame::OnAlignLeft(wxCommandEvent
& WXUNUSED(event
))
1237 m_richTextCtrl
->ApplyAlignmentToSelection(wxTEXT_ALIGNMENT_LEFT
);
1240 void MyFrame::OnAlignCentre(wxCommandEvent
& WXUNUSED(event
))
1242 m_richTextCtrl
->ApplyAlignmentToSelection(wxTEXT_ALIGNMENT_CENTRE
);
1245 void MyFrame::OnAlignRight(wxCommandEvent
& WXUNUSED(event
))
1247 m_richTextCtrl
->ApplyAlignmentToSelection(wxTEXT_ALIGNMENT_RIGHT
);
1250 void MyFrame::OnUpdateAlignLeft(wxUpdateUIEvent
& event
)
1252 event
.Check(m_richTextCtrl
->IsSelectionAligned(wxTEXT_ALIGNMENT_LEFT
));
1255 void MyFrame::OnUpdateAlignCentre(wxUpdateUIEvent
& event
)
1257 event
.Check(m_richTextCtrl
->IsSelectionAligned(wxTEXT_ALIGNMENT_CENTRE
));
1260 void MyFrame::OnUpdateAlignRight(wxUpdateUIEvent
& event
)
1262 event
.Check(m_richTextCtrl
->IsSelectionAligned(wxTEXT_ALIGNMENT_RIGHT
));
1265 void MyFrame::OnFont(wxCommandEvent
& WXUNUSED(event
))
1267 wxRichTextRange range
;
1268 if (m_richTextCtrl
->HasSelection())
1269 range
= m_richTextCtrl
->GetSelectionRange();
1271 range
= wxRichTextRange(0, m_richTextCtrl
->GetLastPosition()+1);
1273 int pages
= wxRICHTEXT_FORMAT_FONT
;
1275 wxRichTextFormattingDialog
formatDlg(pages
, this);
1276 formatDlg
.GetStyle(m_richTextCtrl
, range
);
1278 if (formatDlg
.ShowModal() == wxID_OK
)
1280 formatDlg
.ApplyStyle(m_richTextCtrl
, range
, wxRICHTEXT_SETSTYLE_WITH_UNDO
|wxRICHTEXT_SETSTYLE_OPTIMIZE
|wxRICHTEXT_SETSTYLE_CHARACTERS_ONLY
);
1283 // Old method using wxFontDialog
1285 if (!m_richTextCtrl
->HasSelection())
1288 wxRichTextRange range
= m_richTextCtrl
->GetSelectionRange();
1289 wxFontData fontData
;
1291 wxRichTextAttr attr
;
1292 attr
.SetFlags(wxTEXT_ATTR_FONT
);
1294 if (m_richTextCtrl
->GetStyle(m_richTextCtrl
->GetInsertionPoint(), attr
))
1295 fontData
.SetInitialFont(attr
.GetFont());
1297 wxFontDialog
dialog(this, fontData
);
1298 if (dialog
.ShowModal() == wxID_OK
)
1300 fontData
= dialog
.GetFontData();
1301 attr
.SetFlags(wxTEXT_ATTR_FONT
);
1302 attr
.SetFont(fontData
.GetChosenFont());
1303 if (attr
.GetFont().IsOk())
1305 m_richTextCtrl
->SetStyle(range
, attr
);
1311 void MyFrame::OnImage(wxCommandEvent
& WXUNUSED(event
))
1313 wxRichTextRange range
;
1314 wxASSERT(m_richTextCtrl
->HasSelection());
1316 range
= m_richTextCtrl
->GetSelectionRange();
1317 wxASSERT(range
.ToInternal().GetLength() == 1);
1319 wxRichTextImage
* image
= wxDynamicCast(m_richTextCtrl
->GetFocusObject()->GetLeafObjectAtPosition(range
.GetStart()), wxRichTextImage
);
1322 wxRichTextObjectPropertiesDialog
imageDlg(image
, this);
1324 if (imageDlg
.ShowModal() == wxID_OK
)
1326 imageDlg
.ApplyStyle(m_richTextCtrl
);
1331 void MyFrame::OnParagraph(wxCommandEvent
& WXUNUSED(event
))
1333 wxRichTextRange range
;
1334 if (m_richTextCtrl
->HasSelection())
1335 range
= m_richTextCtrl
->GetSelectionRange();
1337 range
= wxRichTextRange(0, m_richTextCtrl
->GetLastPosition()+1);
1339 int pages
= wxRICHTEXT_FORMAT_INDENTS_SPACING
|wxRICHTEXT_FORMAT_TABS
|wxRICHTEXT_FORMAT_BULLETS
;
1341 wxRichTextFormattingDialog
formatDlg(pages
, this);
1342 formatDlg
.GetStyle(m_richTextCtrl
, range
);
1344 if (formatDlg
.ShowModal() == wxID_OK
)
1346 formatDlg
.ApplyStyle(m_richTextCtrl
, range
);
1350 void MyFrame::OnFormat(wxCommandEvent
& WXUNUSED(event
))
1352 wxRichTextRange range
;
1353 if (m_richTextCtrl
->HasSelection())
1354 range
= m_richTextCtrl
->GetSelectionRange();
1356 range
= wxRichTextRange(0, m_richTextCtrl
->GetLastPosition()+1);
1358 int pages
= wxRICHTEXT_FORMAT_FONT
|wxRICHTEXT_FORMAT_INDENTS_SPACING
|wxRICHTEXT_FORMAT_TABS
|wxRICHTEXT_FORMAT_BULLETS
;
1360 wxRichTextFormattingDialog
formatDlg(pages
, this);
1361 formatDlg
.GetStyle(m_richTextCtrl
, range
);
1363 if (formatDlg
.ShowModal() == wxID_OK
)
1365 formatDlg
.ApplyStyle(m_richTextCtrl
, range
);
1369 void MyFrame::OnUpdateFormat(wxUpdateUIEvent
& event
)
1371 event
.Enable(m_richTextCtrl
->HasSelection());
1374 void MyFrame::OnUpdateImage(wxUpdateUIEvent
& event
)
1376 wxRichTextRange range
;
1377 wxRichTextObject
*obj
;
1379 range
= m_richTextCtrl
->GetSelectionRange();
1380 if (range
.ToInternal().GetLength() == 1)
1382 obj
= m_richTextCtrl
->GetFocusObject()->GetLeafObjectAtPosition(range
.GetStart());
1383 if (obj
&& obj
->IsKindOf(CLASSINFO(wxRichTextImage
)))
1390 event
.Enable(false);
1393 void MyFrame::OnIndentMore(wxCommandEvent
& WXUNUSED(event
))
1395 wxRichTextAttr attr
;
1396 attr
.SetFlags(wxTEXT_ATTR_LEFT_INDENT
);
1398 if (m_richTextCtrl
->GetStyle(m_richTextCtrl
->GetInsertionPoint(), attr
))
1400 wxRichTextRange
range(m_richTextCtrl
->GetInsertionPoint(), m_richTextCtrl
->GetInsertionPoint());
1401 if (m_richTextCtrl
->HasSelection())
1402 range
= m_richTextCtrl
->GetSelectionRange();
1404 attr
.SetLeftIndent(attr
.GetLeftIndent() + 100);
1406 attr
.SetFlags(wxTEXT_ATTR_LEFT_INDENT
);
1407 m_richTextCtrl
->SetStyle(range
, attr
);
1411 void MyFrame::OnIndentLess(wxCommandEvent
& WXUNUSED(event
))
1413 wxRichTextAttr attr
;
1414 attr
.SetFlags(wxTEXT_ATTR_LEFT_INDENT
);
1416 if (m_richTextCtrl
->GetStyle(m_richTextCtrl
->GetInsertionPoint(), attr
))
1418 wxRichTextRange
range(m_richTextCtrl
->GetInsertionPoint(), m_richTextCtrl
->GetInsertionPoint());
1419 if (m_richTextCtrl
->HasSelection())
1420 range
= m_richTextCtrl
->GetSelectionRange();
1422 if (attr
.GetLeftIndent() > 0)
1424 attr
.SetLeftIndent(wxMax(0, attr
.GetLeftIndent() - 100));
1426 m_richTextCtrl
->SetStyle(range
, attr
);
1431 void MyFrame::OnLineSpacingHalf(wxCommandEvent
& WXUNUSED(event
))
1433 wxRichTextAttr attr
;
1434 attr
.SetFlags(wxTEXT_ATTR_LINE_SPACING
);
1436 if (m_richTextCtrl
->GetStyle(m_richTextCtrl
->GetInsertionPoint(), attr
))
1438 wxRichTextRange
range(m_richTextCtrl
->GetInsertionPoint(), m_richTextCtrl
->GetInsertionPoint());
1439 if (m_richTextCtrl
->HasSelection())
1440 range
= m_richTextCtrl
->GetSelectionRange();
1442 attr
.SetFlags(wxTEXT_ATTR_LINE_SPACING
);
1443 attr
.SetLineSpacing(15);
1445 m_richTextCtrl
->SetStyle(range
, attr
);
1449 void MyFrame::OnLineSpacingDouble(wxCommandEvent
& WXUNUSED(event
))
1451 wxRichTextAttr attr
;
1452 attr
.SetFlags(wxTEXT_ATTR_LINE_SPACING
);
1454 if (m_richTextCtrl
->GetStyle(m_richTextCtrl
->GetInsertionPoint(), attr
))
1456 wxRichTextRange
range(m_richTextCtrl
->GetInsertionPoint(), m_richTextCtrl
->GetInsertionPoint());
1457 if (m_richTextCtrl
->HasSelection())
1458 range
= m_richTextCtrl
->GetSelectionRange();
1460 attr
.SetFlags(wxTEXT_ATTR_LINE_SPACING
);
1461 attr
.SetLineSpacing(20);
1463 m_richTextCtrl
->SetStyle(range
, attr
);
1467 void MyFrame::OnLineSpacingSingle(wxCommandEvent
& WXUNUSED(event
))
1469 wxRichTextAttr attr
;
1470 attr
.SetFlags(wxTEXT_ATTR_LINE_SPACING
);
1472 if (m_richTextCtrl
->GetStyle(m_richTextCtrl
->GetInsertionPoint(), attr
))
1474 wxRichTextRange
range(m_richTextCtrl
->GetInsertionPoint(), m_richTextCtrl
->GetInsertionPoint());
1475 if (m_richTextCtrl
->HasSelection())
1476 range
= m_richTextCtrl
->GetSelectionRange();
1478 attr
.SetFlags(wxTEXT_ATTR_LINE_SPACING
);
1479 attr
.SetLineSpacing(0); // Can also use 10
1481 m_richTextCtrl
->SetStyle(range
, attr
);
1485 void MyFrame::OnParagraphSpacingMore(wxCommandEvent
& WXUNUSED(event
))
1487 wxRichTextAttr attr
;
1488 attr
.SetFlags(wxTEXT_ATTR_PARA_SPACING_AFTER
);
1490 if (m_richTextCtrl
->GetStyle(m_richTextCtrl
->GetInsertionPoint(), attr
))
1492 wxRichTextRange
range(m_richTextCtrl
->GetInsertionPoint(), m_richTextCtrl
->GetInsertionPoint());
1493 if (m_richTextCtrl
->HasSelection())
1494 range
= m_richTextCtrl
->GetSelectionRange();
1496 attr
.SetParagraphSpacingAfter(attr
.GetParagraphSpacingAfter() + 20);
1498 attr
.SetFlags(wxTEXT_ATTR_PARA_SPACING_AFTER
);
1499 m_richTextCtrl
->SetStyle(range
, attr
);
1503 void MyFrame::OnParagraphSpacingLess(wxCommandEvent
& WXUNUSED(event
))
1505 wxRichTextAttr attr
;
1506 attr
.SetFlags(wxTEXT_ATTR_PARA_SPACING_AFTER
);
1508 if (m_richTextCtrl
->GetStyle(m_richTextCtrl
->GetInsertionPoint(), attr
))
1510 wxRichTextRange
range(m_richTextCtrl
->GetInsertionPoint(), m_richTextCtrl
->GetInsertionPoint());
1511 if (m_richTextCtrl
->HasSelection())
1512 range
= m_richTextCtrl
->GetSelectionRange();
1514 if (attr
.GetParagraphSpacingAfter() >= 20)
1516 attr
.SetParagraphSpacingAfter(attr
.GetParagraphSpacingAfter() - 20);
1518 attr
.SetFlags(wxTEXT_ATTR_PARA_SPACING_AFTER
);
1519 m_richTextCtrl
->SetStyle(range
, attr
);
1524 void MyFrame::OnReload(wxCommandEvent
& WXUNUSED(event
))
1526 m_richTextCtrl
->Clear();
1530 void MyFrame::OnViewHTML(wxCommandEvent
& WXUNUSED(event
))
1532 wxDialog
dialog(this, wxID_ANY
, _("HTML"), wxDefaultPosition
, wxSize(500, 400), wxDEFAULT_DIALOG_STYLE
);
1534 wxBoxSizer
* boxSizer
= new wxBoxSizer(wxVERTICAL
);
1535 dialog
.SetSizer(boxSizer
);
1537 wxHtmlWindow
* win
= new wxHtmlWindow(& dialog
, wxID_ANY
, wxDefaultPosition
, wxSize(500, 400), wxSUNKEN_BORDER
);
1538 boxSizer
->Add(win
, 1, wxALL
, 5);
1540 wxButton
* cancelButton
= new wxButton(& dialog
, wxID_CANCEL
, wxT("&Close"));
1541 boxSizer
->Add(cancelButton
, 0, wxALL
|wxCENTRE
, 5);
1544 wxStringOutputStream
strStream(& text
);
1546 wxRichTextHTMLHandler htmlHandler
;
1547 htmlHandler
.SetFlags(wxRICHTEXT_HANDLER_SAVE_IMAGES_TO_MEMORY
);
1549 wxArrayInt fontSizeMapping
;
1550 fontSizeMapping
.Add(7);
1551 fontSizeMapping
.Add(9);
1552 fontSizeMapping
.Add(11);
1553 fontSizeMapping
.Add(12);
1554 fontSizeMapping
.Add(14);
1555 fontSizeMapping
.Add(22);
1556 fontSizeMapping
.Add(100);
1558 htmlHandler
.SetFontSizeMapping(fontSizeMapping
);
1560 if (htmlHandler
.SaveFile(& m_richTextCtrl
->GetBuffer(), strStream
))
1565 boxSizer
->Fit(& dialog
);
1569 // Now delete the temporary in-memory images
1570 htmlHandler
.DeleteTemporaryImages();
1573 // Demonstrates how you can change the style sheets and have the changes
1574 // reflected in the control content without wiping out character formatting.
1576 void MyFrame::OnSwitchStyleSheets(wxCommandEvent
& WXUNUSED(event
))
1578 static wxRichTextStyleSheet
* gs_AlternateStyleSheet
= NULL
;
1580 wxRichTextStyleListCtrl
*styleList
= (wxRichTextStyleListCtrl
*) FindWindow(ID_RICHTEXT_STYLE_LIST
);
1581 wxRichTextStyleComboCtrl
* styleCombo
= (wxRichTextStyleComboCtrl
*) FindWindow(ID_RICHTEXT_STYLE_COMBO
);
1583 wxRichTextStyleSheet
* sheet
= m_richTextCtrl
->GetStyleSheet();
1585 // One-time creation of an alternate style sheet
1586 if (!gs_AlternateStyleSheet
)
1588 gs_AlternateStyleSheet
= new wxRichTextStyleSheet(*sheet
);
1590 // Make some modifications
1591 for (int i
= 0; i
< (int) gs_AlternateStyleSheet
->GetParagraphStyleCount(); i
++)
1593 wxRichTextParagraphStyleDefinition
* def
= gs_AlternateStyleSheet
->GetParagraphStyle(i
);
1595 if (def
->GetStyle().HasTextColour())
1596 def
->GetStyle().SetTextColour(*wxBLUE
);
1598 if (def
->GetStyle().HasAlignment())
1600 if (def
->GetStyle().GetAlignment() == wxTEXT_ALIGNMENT_CENTRE
)
1601 def
->GetStyle().SetAlignment(wxTEXT_ALIGNMENT_RIGHT
);
1602 else if (def
->GetStyle().GetAlignment() == wxTEXT_ALIGNMENT_LEFT
)
1603 def
->GetStyle().SetAlignment(wxTEXT_ALIGNMENT_CENTRE
);
1605 if (def
->GetStyle().HasLeftIndent())
1607 def
->GetStyle().SetLeftIndent(def
->GetStyle().GetLeftIndent() * 2);
1613 wxRichTextStyleSheet
* tmp
= gs_AlternateStyleSheet
;
1614 gs_AlternateStyleSheet
= sheet
;
1617 m_richTextCtrl
->SetStyleSheet(sheet
);
1618 m_richTextCtrl
->ApplyStyleSheet(sheet
); // Makes the control reflect the new style definitions
1620 styleList
->SetStyleSheet(sheet
);
1621 styleList
->UpdateStyles();
1623 styleCombo
->SetStyleSheet(sheet
);
1624 styleCombo
->UpdateStyles();
1627 void MyFrame::OnManageStyles(wxCommandEvent
& WXUNUSED(event
))
1629 wxRichTextStyleSheet
* sheet
= m_richTextCtrl
->GetStyleSheet();
1631 int flags
= wxRICHTEXT_ORGANISER_CREATE_STYLES
|wxRICHTEXT_ORGANISER_EDIT_STYLES
;
1633 wxRichTextStyleOrganiserDialog
dlg(flags
, sheet
, NULL
, this, wxID_ANY
, _("Style Manager"));
1637 void MyFrame::OnInsertSymbol(wxCommandEvent
& WXUNUSED(event
))
1639 wxRichTextAttr attr
;
1640 attr
.SetFlags(wxTEXT_ATTR_FONT
);
1641 m_richTextCtrl
->GetStyle(m_richTextCtrl
->GetInsertionPoint(), attr
);
1643 wxString currentFontName
;
1644 if (attr
.HasFont() && attr
.GetFont().IsOk())
1645 currentFontName
= attr
.GetFont().GetFaceName();
1647 // Don't set the initial font in the dialog (so the user is choosing
1648 // 'normal text', i.e. the current font) but do tell the dialog
1649 // what 'normal text' is.
1651 wxSymbolPickerDialog
dlg(wxT("*"), wxEmptyString
, currentFontName
, this);
1653 if (dlg
.ShowModal() == wxID_OK
)
1655 if (dlg
.HasSelection())
1657 long insertionPoint
= m_richTextCtrl
->GetInsertionPoint();
1659 m_richTextCtrl
->WriteText(dlg
.GetSymbol());
1661 if (!dlg
.UseNormalFont())
1663 wxFont
font(attr
.GetFont());
1664 font
.SetFaceName(dlg
.GetFontName());
1666 m_richTextCtrl
->SetStyle(insertionPoint
, insertionPoint
+1, attr
);
1672 void MyFrame::OnNumberList(wxCommandEvent
& WXUNUSED(event
))
1674 if (m_richTextCtrl
->HasSelection())
1676 wxRichTextRange range
= m_richTextCtrl
->GetSelectionRange();
1677 m_richTextCtrl
->SetListStyle(range
, wxT("Numbered List 1"), wxRICHTEXT_SETSTYLE_WITH_UNDO
|wxRICHTEXT_SETSTYLE_RENUMBER
);
1681 void MyFrame::OnBulletsAndNumbering(wxCommandEvent
& WXUNUSED(event
))
1683 wxRichTextStyleSheet
* sheet
= m_richTextCtrl
->GetStyleSheet();
1685 int flags
= wxRICHTEXT_ORGANISER_BROWSE_NUMBERING
;
1687 wxRichTextStyleOrganiserDialog
dlg(flags
, sheet
, m_richTextCtrl
, this, wxID_ANY
, _("Bullets and Numbering"));
1688 if (dlg
.ShowModal() == wxID_OK
)
1690 if (dlg
.GetSelectedStyleDefinition())
1695 void MyFrame::OnItemizeList(wxCommandEvent
& WXUNUSED(event
))
1697 if (m_richTextCtrl
->HasSelection())
1699 wxRichTextRange range
= m_richTextCtrl
->GetSelectionRange();
1700 m_richTextCtrl
->SetListStyle(range
, wxT("Bullet List 1"));
1704 void MyFrame::OnRenumberList(wxCommandEvent
& WXUNUSED(event
))
1706 if (m_richTextCtrl
->HasSelection())
1708 wxRichTextRange range
= m_richTextCtrl
->GetSelectionRange();
1709 m_richTextCtrl
->NumberList(range
, NULL
, wxRICHTEXT_SETSTYLE_WITH_UNDO
|wxRICHTEXT_SETSTYLE_RENUMBER
);
1713 void MyFrame::OnPromoteList(wxCommandEvent
& WXUNUSED(event
))
1715 if (m_richTextCtrl
->HasSelection())
1717 wxRichTextRange range
= m_richTextCtrl
->GetSelectionRange();
1718 m_richTextCtrl
->PromoteList(1, range
, NULL
);
1722 void MyFrame::OnDemoteList(wxCommandEvent
& WXUNUSED(event
))
1724 if (m_richTextCtrl
->HasSelection())
1726 wxRichTextRange range
= m_richTextCtrl
->GetSelectionRange();
1727 m_richTextCtrl
->PromoteList(-1, range
, NULL
);
1731 void MyFrame::OnClearList(wxCommandEvent
& WXUNUSED(event
))
1733 if (m_richTextCtrl
->HasSelection())
1735 wxRichTextRange range
= m_richTextCtrl
->GetSelectionRange();
1736 m_richTextCtrl
->ClearListStyle(range
);
1740 void MyFrame::OnInsertURL(wxCommandEvent
& WXUNUSED(event
))
1742 wxString url
= wxGetTextFromUser(_("URL:"), _("Insert URL"));
1745 // Make a style suitable for showing a URL
1746 wxRichTextAttr urlStyle
;
1747 urlStyle
.SetTextColour(*wxBLUE
);
1748 urlStyle
.SetFontUnderlined(true);
1750 m_richTextCtrl
->BeginStyle(urlStyle
);
1751 m_richTextCtrl
->BeginURL(url
);
1752 m_richTextCtrl
->WriteText(url
);
1753 m_richTextCtrl
->EndURL();
1754 m_richTextCtrl
->EndStyle();
1758 void MyFrame::OnInsertImage(wxCommandEvent
& WXUNUSED(event
))
1760 wxFileDialog
dialog(this, _("Choose an image"), "", "", "BMP and GIF files (*.bmp;*.gif)|*.bmp;*.gif|PNG files (*.png)|*.png");
1761 if (dialog
.ShowModal() == wxID_OK
)
1763 wxString path
= dialog
.GetPath();
1764 m_richTextCtrl
->WriteImage(path
, wxBITMAP_TYPE_ANY
);
1768 void MyFrame::OnURL(wxTextUrlEvent
& event
)
1770 wxMessageBox(event
.GetString());
1773 // Veto style sheet replace events when loading from XML, since we want
1774 // to keep the original style sheet.
1775 void MyFrame::OnStyleSheetReplacing(wxRichTextEvent
& event
)
1780 void MyFrame::OnPrint(wxCommandEvent
& WXUNUSED(event
))
1782 wxGetApp().GetPrinting()->PrintBuffer(m_richTextCtrl
->GetBuffer());
1785 void MyFrame::OnPreview(wxCommandEvent
& WXUNUSED(event
))
1787 wxGetApp().GetPrinting()->PreviewBuffer(m_richTextCtrl
->GetBuffer());
1790 void MyFrame::OnPageSetup(wxCommandEvent
& WXUNUSED(event
))
1792 wxDialog
dialog(this, wxID_ANY
, wxT("Testing"), wxPoint(10, 10), wxSize(400, 300), wxDEFAULT_DIALOG_STYLE
);
1794 wxNotebook
* nb
= new wxNotebook(& dialog
, wxID_ANY
, wxPoint(5, 5), wxSize(300, 250));
1795 wxPanel
* panel
= new wxPanel(nb
, wxID_ANY
, wxDefaultPosition
, wxDefaultSize
);
1796 wxPanel
* panel2
= new wxPanel(nb
, wxID_ANY
, wxDefaultPosition
, wxDefaultSize
);
1798 new wxRichTextCtrl(panel
, wxID_ANY
, wxEmptyString
, wxPoint(5, 5), wxSize(200, 150), wxVSCROLL
|wxTE_READONLY
);
1799 nb
->AddPage(panel
, wxT("Page 1"));
1801 new wxRichTextCtrl(panel2
, wxID_ANY
, wxEmptyString
, wxPoint(5, 5), wxSize(200, 150), wxVSCROLL
|wxTE_READONLY
);
1802 nb
->AddPage(panel2
, wxT("Page 2"));
1804 new wxButton(& dialog
, wxID_OK
, wxT("OK"), wxPoint(5, 180));
1808 // wxGetApp().GetPrinting()->PageSetup();