]> git.saurik.com Git - wxWidgets.git/blame - samples/richtext/richtext.cpp
updated aui sample to expose notebook flags
[wxWidgets.git] / samples / richtext / richtext.cpp
CommitLineData
5d7836c4 1/////////////////////////////////////////////////////////////////////////////
dbf38e88 2// Name: samples/richtext/richtext.cpp
5d7836c4
JS
3// Purpose: wxWidgets rich text editor sample
4// Author: Julian Smart
5// Modified by:
6// Created: 2005-10-02
7// RCS-ID: $Id$
8// Copyright: (c) Julian Smart
9// Licence: wxWindows licence
10/////////////////////////////////////////////////////////////////////////////
11
12// ============================================================================
13// declarations
14// ============================================================================
15
16// ----------------------------------------------------------------------------
17// headers
18// ----------------------------------------------------------------------------
19
20// For compilers that support precompilation, includes "wx/wx.h".
21#include "wx/wxprec.h"
22
23#ifdef __BORLANDC__
24 #pragma hdrstop
25#endif
26
27// for all others, include the necessary headers (this file is usually all you
28// need because it includes almost all "standard" wxWidgets headers)
29#ifndef WX_PRECOMP
30 #include "wx/wx.h"
31#endif
32
33#include "wx/fontdlg.h"
34#include "wx/splitter.h"
35#include "wx/sstream.h"
36#include "wx/html/htmlwin.h"
37
720cc10a
JS
38#if wxUSE_FILESYSTEM
39#include "wx/filesys.h"
40#include "wx/fs_mem.h"
41#endif
42
2569ebc2
JS
43#if wxUSE_HELP
44#include "wx/cshelp.h"
45#endif
46
1226b3b3
WS
47#ifndef __WXMSW__
48 #include "../sample.xpm"
49#endif
50
5d7836c4
JS
51#include "bitmaps/smiley.xpm"
52// #include "bitmaps/idea.xpm"
53#include "bitmaps/zebra.xpm"
54
55#include "bitmaps/open.xpm"
56#include "bitmaps/save.xpm"
57#include "bitmaps/copy.xpm"
58#include "bitmaps/cut.xpm"
59#include "bitmaps/paste.xpm"
60#include "bitmaps/undo.xpm"
61#include "bitmaps/redo.xpm"
62#include "bitmaps/bold.xpm"
63#include "bitmaps/italic.xpm"
64#include "bitmaps/underline.xpm"
65
66#include "bitmaps/alignleft.xpm"
67#include "bitmaps/alignright.xpm"
68#include "bitmaps/centre.xpm"
69#include "bitmaps/font.xpm"
70#include "bitmaps/indentless.xpm"
71#include "bitmaps/indentmore.xpm"
72
011b3dcb
JS
73#include "wx/richtext/richtextctrl.h"
74#include "wx/richtext/richtextstyles.h"
75#include "wx/richtext/richtextxml.h"
b71e9aa4 76#include "wx/richtext/richtexthtml.h"
8c9c49a1
JS
77#include "wx/richtext/richtextformatdlg.h"
78#include "wx/richtext/richtextsymboldlg.h"
e4723634 79#include "wx/richtext/richtextstyledlg.h"
8881d9f0 80#include "wx/richtext/richtextprint.h"
5d7836c4
JS
81
82// ----------------------------------------------------------------------------
83// resources
84// ----------------------------------------------------------------------------
85
86// ----------------------------------------------------------------------------
87// private classes
88// ----------------------------------------------------------------------------
89
90// Define a new application type, each program should derive a class from wxApp
91class MyApp : public wxApp
92{
93public:
94 // override base class virtuals
95 // ----------------------------
96
97 // this one is called on application startup and is a good place for the app
98 // initialization (doing it here and not in the ctor allows to have an error
99 // return: if OnInit() returns false, the application terminates)
100 virtual bool OnInit();
101 virtual int OnExit();
102
103 void CreateStyles();
104
105 wxRichTextStyleSheet* GetStyleSheet() const { return m_styleSheet; }
8881d9f0 106 wxRichTextPrinting* GetPrinting() const { return m_printing; }
5d7836c4 107
8881d9f0
JS
108 wxRichTextStyleSheet* m_styleSheet;
109 wxRichTextPrinting* m_printing;
5d7836c4
JS
110};
111
112// Define a new frame type: this is going to be our main frame
113class MyFrame : public wxFrame
114{
115public:
116 // ctor(s)
117 MyFrame(const wxString& title, wxWindowID id, const wxPoint& pos = wxDefaultPosition,
118 const wxSize& size = wxDefaultSize, long style = wxDEFAULT_FRAME_STYLE);
119
120 // event handlers (these functions should _not_ be virtual)
121 void OnQuit(wxCommandEvent& event);
122 void OnAbout(wxCommandEvent& event);
123
124 void OnOpen(wxCommandEvent& event);
125 void OnSave(wxCommandEvent& event);
126 void OnSaveAs(wxCommandEvent& event);
127
128 void OnBold(wxCommandEvent& event);
129 void OnItalic(wxCommandEvent& event);
130 void OnUnderline(wxCommandEvent& event);
131
132 void OnUpdateBold(wxUpdateUIEvent& event);
133 void OnUpdateItalic(wxUpdateUIEvent& event);
134 void OnUpdateUnderline(wxUpdateUIEvent& event);
135
136 void OnAlignLeft(wxCommandEvent& event);
137 void OnAlignCentre(wxCommandEvent& event);
138 void OnAlignRight(wxCommandEvent& event);
139
140 void OnUpdateAlignLeft(wxUpdateUIEvent& event);
141 void OnUpdateAlignCentre(wxUpdateUIEvent& event);
142 void OnUpdateAlignRight(wxUpdateUIEvent& event);
143
5d7836c4
JS
144 void OnIndentMore(wxCommandEvent& event);
145 void OnIndentLess(wxCommandEvent& event);
146
8c9c49a1
JS
147 void OnFont(wxCommandEvent& event);
148 void OnParagraph(wxCommandEvent& event);
149 void OnFormat(wxCommandEvent& event);
150 void OnUpdateFormat(wxUpdateUIEvent& event);
151
152 void OnInsertSymbol(wxCommandEvent& event);
153
5d7836c4
JS
154 void OnLineSpacingHalf(wxCommandEvent& event);
155 void OnLineSpacingDouble(wxCommandEvent& event);
156 void OnLineSpacingSingle(wxCommandEvent& event);
157
158 void OnParagraphSpacingMore(wxCommandEvent& event);
159 void OnParagraphSpacingLess(wxCommandEvent& event);
160
082cfe55 161 void OnNumberList(wxCommandEvent& event);
e4723634 162 void OnBulletsAndNumbering(wxCommandEvent& event);
082cfe55
JS
163 void OnItemizeList(wxCommandEvent& event);
164 void OnRenumberList(wxCommandEvent& event);
165 void OnPromoteList(wxCommandEvent& event);
166 void OnDemoteList(wxCommandEvent& event);
167 void OnClearList(wxCommandEvent& event);
168
5d7836c4
JS
169 void OnViewHTML(wxCommandEvent& event);
170
fe5aa22c 171 void OnSwitchStyleSheets(wxCommandEvent& event);
e4723634 172 void OnManageStyles(wxCommandEvent& event);
fe5aa22c 173
720cc10a
JS
174 void OnInsertURL(wxCommandEvent& event);
175 void OnURL(wxTextUrlEvent& event);
176 void OnStyleSheetReplacing(wxRichTextEvent& event);
177
8881d9f0
JS
178 void OnPrint(wxCommandEvent& event);
179 void OnPreview(wxCommandEvent& event);
180 void OnPageSetup(wxCommandEvent& event);
181
5d7836c4
JS
182 // Forward command events to the current rich text control, if any
183 bool ProcessEvent(wxEvent& event);
184
185private:
186 // any class wishing to process wxWidgets events must use this macro
187 DECLARE_EVENT_TABLE()
188
189 wxRichTextCtrl* m_richTextCtrl;
190};
191
192// ----------------------------------------------------------------------------
193// constants
194// ----------------------------------------------------------------------------
195
196// IDs for the controls and the menu commands
197enum
198{
199 // menu items
200 ID_Quit = wxID_EXIT,
201 ID_About = wxID_ABOUT,
202
203 ID_FORMAT_BOLD = 100,
204 ID_FORMAT_ITALIC,
205 ID_FORMAT_UNDERLINE,
206 ID_FORMAT_FONT,
8c9c49a1
JS
207 ID_FORMAT_PARAGRAPH,
208 ID_FORMAT_CONTENT,
209
210 ID_INSERT_SYMBOL,
720cc10a 211 ID_INSERT_URL,
5d7836c4
JS
212
213 ID_FORMAT_ALIGN_LEFT,
214 ID_FORMAT_ALIGN_CENTRE,
215 ID_FORMAT_ALIGN_RIGHT,
216
217 ID_FORMAT_INDENT_MORE,
218 ID_FORMAT_INDENT_LESS,
219
220 ID_FORMAT_PARAGRAPH_SPACING_MORE,
221 ID_FORMAT_PARAGRAPH_SPACING_LESS,
222
223 ID_FORMAT_LINE_SPACING_HALF,
224 ID_FORMAT_LINE_SPACING_DOUBLE,
225 ID_FORMAT_LINE_SPACING_SINGLE,
226
082cfe55 227 ID_FORMAT_NUMBER_LIST,
e4723634 228 ID_FORMAT_BULLETS_AND_NUMBERING,
082cfe55
JS
229 ID_FORMAT_ITEMIZE_LIST,
230 ID_FORMAT_RENUMBER_LIST,
231 ID_FORMAT_PROMOTE_LIST,
232 ID_FORMAT_DEMOTE_LIST,
233 ID_FORMAT_CLEAR_LIST,
234
fe5aa22c
JS
235 ID_VIEW_HTML,
236 ID_SWITCH_STYLE_SHEETS,
e4723634 237 ID_MANAGE_STYLES,
fe5aa22c 238
8881d9f0
JS
239 ID_PRINT,
240 ID_PREVIEW,
241 ID_PAGE_SETUP,
242
fe5aa22c
JS
243 ID_RICHTEXT_CTRL,
244 ID_RICHTEXT_STYLE_LIST,
245 ID_RICHTEXT_STYLE_COMBO
5d7836c4
JS
246};
247
248// ----------------------------------------------------------------------------
249// event tables and other macros for wxWidgets
250// ----------------------------------------------------------------------------
251
252// the event tables connect the wxWidgets events with the functions (event
253// handlers) which process them. It can be also done at run-time, but for the
254// simple menu events like this the static method is much simpler.
255BEGIN_EVENT_TABLE(MyFrame, wxFrame)
256 EVT_MENU(ID_Quit, MyFrame::OnQuit)
257 EVT_MENU(ID_About, MyFrame::OnAbout)
258
259 EVT_MENU(wxID_OPEN, MyFrame::OnOpen)
260 EVT_MENU(wxID_SAVE, MyFrame::OnSave)
261 EVT_MENU(wxID_SAVEAS, MyFrame::OnSaveAs)
262
263 EVT_MENU(ID_FORMAT_BOLD, MyFrame::OnBold)
264 EVT_MENU(ID_FORMAT_ITALIC, MyFrame::OnItalic)
265 EVT_MENU(ID_FORMAT_UNDERLINE, MyFrame::OnUnderline)
266
267 EVT_UPDATE_UI(ID_FORMAT_BOLD, MyFrame::OnUpdateBold)
268 EVT_UPDATE_UI(ID_FORMAT_ITALIC, MyFrame::OnUpdateItalic)
269 EVT_UPDATE_UI(ID_FORMAT_UNDERLINE, MyFrame::OnUpdateUnderline)
270
271 EVT_MENU(ID_FORMAT_ALIGN_LEFT, MyFrame::OnAlignLeft)
272 EVT_MENU(ID_FORMAT_ALIGN_CENTRE, MyFrame::OnAlignCentre)
273 EVT_MENU(ID_FORMAT_ALIGN_RIGHT, MyFrame::OnAlignRight)
274
275 EVT_UPDATE_UI(ID_FORMAT_ALIGN_LEFT, MyFrame::OnUpdateAlignLeft)
276 EVT_UPDATE_UI(ID_FORMAT_ALIGN_CENTRE, MyFrame::OnUpdateAlignCentre)
277 EVT_UPDATE_UI(ID_FORMAT_ALIGN_RIGHT, MyFrame::OnUpdateAlignRight)
278
279 EVT_MENU(ID_FORMAT_FONT, MyFrame::OnFont)
8c9c49a1
JS
280 EVT_MENU(ID_FORMAT_PARAGRAPH, MyFrame::OnParagraph)
281 EVT_MENU(ID_FORMAT_CONTENT, MyFrame::OnFormat)
282 EVT_UPDATE_UI(ID_FORMAT_CONTENT, MyFrame::OnUpdateFormat)
283 EVT_UPDATE_UI(ID_FORMAT_FONT, MyFrame::OnUpdateFormat)
284 EVT_UPDATE_UI(ID_FORMAT_PARAGRAPH, MyFrame::OnUpdateFormat)
5d7836c4
JS
285 EVT_MENU(ID_FORMAT_INDENT_MORE, MyFrame::OnIndentMore)
286 EVT_MENU(ID_FORMAT_INDENT_LESS, MyFrame::OnIndentLess)
287
288 EVT_MENU(ID_FORMAT_LINE_SPACING_HALF, MyFrame::OnLineSpacingHalf)
289 EVT_MENU(ID_FORMAT_LINE_SPACING_SINGLE, MyFrame::OnLineSpacingSingle)
290 EVT_MENU(ID_FORMAT_LINE_SPACING_DOUBLE, MyFrame::OnLineSpacingDouble)
291
292 EVT_MENU(ID_FORMAT_PARAGRAPH_SPACING_MORE, MyFrame::OnParagraphSpacingMore)
293 EVT_MENU(ID_FORMAT_PARAGRAPH_SPACING_LESS, MyFrame::OnParagraphSpacingLess)
294
8c9c49a1 295 EVT_MENU(ID_INSERT_SYMBOL, MyFrame::OnInsertSymbol)
720cc10a 296 EVT_MENU(ID_INSERT_URL, MyFrame::OnInsertURL)
8c9c49a1 297
082cfe55 298 EVT_MENU(ID_FORMAT_NUMBER_LIST, MyFrame::OnNumberList)
e4723634 299 EVT_MENU(ID_FORMAT_BULLETS_AND_NUMBERING, MyFrame::OnBulletsAndNumbering)
082cfe55
JS
300 EVT_MENU(ID_FORMAT_ITEMIZE_LIST, MyFrame::OnItemizeList)
301 EVT_MENU(ID_FORMAT_RENUMBER_LIST, MyFrame::OnRenumberList)
302 EVT_MENU(ID_FORMAT_PROMOTE_LIST, MyFrame::OnPromoteList)
303 EVT_MENU(ID_FORMAT_DEMOTE_LIST, MyFrame::OnDemoteList)
304 EVT_MENU(ID_FORMAT_CLEAR_LIST, MyFrame::OnClearList)
305
5d7836c4 306 EVT_MENU(ID_VIEW_HTML, MyFrame::OnViewHTML)
fe5aa22c 307 EVT_MENU(ID_SWITCH_STYLE_SHEETS, MyFrame::OnSwitchStyleSheets)
e4723634 308 EVT_MENU(ID_MANAGE_STYLES, MyFrame::OnManageStyles)
720cc10a 309
8881d9f0
JS
310 EVT_MENU(ID_PRINT, MyFrame::OnPrint)
311 EVT_MENU(ID_PREVIEW, MyFrame::OnPreview)
312 EVT_MENU(ID_PAGE_SETUP, MyFrame::OnPageSetup)
313
720cc10a
JS
314 EVT_TEXT_URL(wxID_ANY, MyFrame::OnURL)
315 EVT_RICHTEXT_STYLESHEET_REPLACING(wxID_ANY, MyFrame::OnStyleSheetReplacing)
5d7836c4
JS
316END_EVENT_TABLE()
317
318// Create a new application object: this macro will allow wxWidgets to create
319// the application object during program execution (it's better than using a
320// static object for many reasons) and also implements the accessor function
321// wxGetApp() which will return the reference of the right type (i.e. MyApp and
322// not wxApp)
323IMPLEMENT_APP(MyApp)
324
325// ============================================================================
326// implementation
327// ============================================================================
328
329// ----------------------------------------------------------------------------
330// the application class
331// ----------------------------------------------------------------------------
332
333// 'Main program' equivalent: the program execution "starts" here
334bool MyApp::OnInit()
335{
2569ebc2
JS
336#if wxUSE_HELP
337 wxHelpProvider::Set(new wxSimpleHelpProvider);
338#endif
339
5d7836c4 340 m_styleSheet = new wxRichTextStyleSheet;
8881d9f0
JS
341 m_printing = new wxRichTextPrinting(wxT("Test Document"));
342
343 m_printing->SetFooterText(wxT("@TITLE@"), wxRICHTEXT_PAGE_ALL, wxRICHTEXT_PAGE_CENTRE);
344 m_printing->SetFooterText(wxT("Page @PAGENUM@"), wxRICHTEXT_PAGE_ALL, wxRICHTEXT_PAGE_RIGHT);
5d7836c4
JS
345
346 CreateStyles();
347
348 // Add extra handlers (plain text is automatically added)
349 wxRichTextBuffer::AddHandler(new wxRichTextXMLHandler);
350 wxRichTextBuffer::AddHandler(new wxRichTextHTMLHandler);
351
352 // Add image handlers
353#if wxUSE_LIBPNG
354 wxImage::AddHandler( new wxPNGHandler );
355#endif
9a173d48 356
5d7836c4
JS
357#if wxUSE_LIBJPEG
358 wxImage::AddHandler( new wxJPEGHandler );
359#endif
360
361#if wxUSE_GIF
362 wxImage::AddHandler( new wxGIFHandler );
363#endif
364
720cc10a
JS
365#if wxUSE_FILESYSTEM
366 wxFileSystem::AddHandler( new wxMemoryFSHandler );
367#endif
368
5d7836c4 369 // create the main application window
ebd90cce 370 MyFrame *frame = new MyFrame(_T("wxRichTextCtrl Sample"), wxID_ANY, wxDefaultPosition, wxSize(700, 600));
5d7836c4 371
8881d9f0
JS
372 m_printing->SetParentWindow(frame);
373
5d7836c4
JS
374 // and show it (the frames, unlike simple controls, are not shown when
375 // created initially)
376 frame->Show(true);
377
378 // success: wxApp::OnRun() will be called which will enter the main message
379 // loop and the application will run. If we returned false here, the
380 // application would exit immediately.
381 return true;
382}
383
384int MyApp::OnExit()
385{
8881d9f0 386 delete m_printing;
5d7836c4 387 delete m_styleSheet;
8881d9f0 388
5d7836c4
JS
389 return 0;
390}
391
392void MyApp::CreateStyles()
393{
394 // Paragraph styles
395
396 wxFont romanFont(12, wxROMAN, wxNORMAL, wxNORMAL);
397 wxFont swissFont(12, wxSWISS, wxNORMAL, wxNORMAL);
398
399 wxRichTextParagraphStyleDefinition* normalPara = new wxRichTextParagraphStyleDefinition(wxT("Normal"));
400 wxRichTextAttr normalAttr;
401 normalAttr.SetFontFaceName(romanFont.GetFaceName());
402 normalAttr.SetFontSize(12);
403 // Let's set all attributes for this style
404 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|
405 wxTEXT_ATTR_PARA_SPACING_BEFORE|wxTEXT_ATTR_PARA_SPACING_AFTER|wxTEXT_ATTR_LINE_SPACING|
406 wxTEXT_ATTR_BULLET_STYLE|wxTEXT_ATTR_BULLET_NUMBER);
407 normalPara->SetStyle(normalAttr);
9a173d48 408
5d7836c4
JS
409 m_styleSheet->AddParagraphStyle(normalPara);
410
411 wxRichTextParagraphStyleDefinition* indentedPara = new wxRichTextParagraphStyleDefinition(wxT("Indented"));
412 wxRichTextAttr indentedAttr;
413 indentedAttr.SetFontFaceName(romanFont.GetFaceName());
414 indentedAttr.SetFontSize(12);
415 indentedAttr.SetLeftIndent(100, 0);
416 // We only want to affect indentation
417 indentedAttr.SetFlags(wxTEXT_ATTR_LEFT_INDENT|wxTEXT_ATTR_RIGHT_INDENT);
418 indentedPara->SetStyle(indentedAttr);
9a173d48 419
5d7836c4
JS
420 m_styleSheet->AddParagraphStyle(indentedPara);
421
27e20452
JS
422 wxRichTextParagraphStyleDefinition* indentedPara2 = new wxRichTextParagraphStyleDefinition(wxT("Red Bold Indented"));
423 wxRichTextAttr indentedAttr2;
424 indentedAttr2.SetFontFaceName(romanFont.GetFaceName());
425 indentedAttr2.SetFontSize(12);
426 indentedAttr2.SetFontWeight(wxBOLD);
427 indentedAttr2.SetTextColour(*wxRED);
428 indentedAttr2.SetFontSize(12);
429 indentedAttr2.SetLeftIndent(100, 0);
430 // We want to affect indentation, font and text colour
431 indentedAttr2.SetFlags(wxTEXT_ATTR_LEFT_INDENT|wxTEXT_ATTR_RIGHT_INDENT|wxTEXT_ATTR_FONT|wxTEXT_ATTR_TEXT_COLOUR);
432 indentedPara2->SetStyle(indentedAttr2);
433
434 m_styleSheet->AddParagraphStyle(indentedPara2);
435
5d7836c4
JS
436 wxRichTextParagraphStyleDefinition* flIndentedPara = new wxRichTextParagraphStyleDefinition(wxT("First Line Indented"));
437 wxRichTextAttr flIndentedAttr;
438 flIndentedAttr.SetFontFaceName(swissFont.GetFaceName());
439 flIndentedAttr.SetFontSize(12);
440 flIndentedAttr.SetLeftIndent(100, -100);
441 // We only want to affect indentation
442 flIndentedAttr.SetFlags(wxTEXT_ATTR_LEFT_INDENT|wxTEXT_ATTR_RIGHT_INDENT);
443 flIndentedPara->SetStyle(flIndentedAttr);
9a173d48 444
5d7836c4
JS
445 m_styleSheet->AddParagraphStyle(flIndentedPara);
446
447 // Character styles
448
449 wxRichTextCharacterStyleDefinition* boldDef = new wxRichTextCharacterStyleDefinition(wxT("Bold"));
450 wxRichTextAttr boldAttr;
451 boldAttr.SetFontFaceName(romanFont.GetFaceName());
452 boldAttr.SetFontSize(12);
453 boldAttr.SetFontWeight(wxBOLD);
454 // We only want to affect boldness
455 boldAttr.SetFlags(wxTEXT_ATTR_FONT_WEIGHT);
456 boldDef->SetStyle(boldAttr);
9a173d48 457
5d7836c4
JS
458 m_styleSheet->AddCharacterStyle(boldDef);
459
460 wxRichTextCharacterStyleDefinition* italicDef = new wxRichTextCharacterStyleDefinition(wxT("Italic"));
461 wxRichTextAttr italicAttr;
462 italicAttr.SetFontFaceName(romanFont.GetFaceName());
463 italicAttr.SetFontSize(12);
464 italicAttr.SetFontStyle(wxITALIC);
465 // We only want to affect italics
466 italicAttr.SetFlags(wxTEXT_ATTR_FONT_ITALIC);
467 italicDef->SetStyle(italicAttr);
9a173d48 468
5d7836c4
JS
469 m_styleSheet->AddCharacterStyle(italicDef);
470
471 wxRichTextCharacterStyleDefinition* redDef = new wxRichTextCharacterStyleDefinition(wxT("Red Bold"));
472 wxRichTextAttr redAttr;
473 redAttr.SetFontFaceName(romanFont.GetFaceName());
474 redAttr.SetFontSize(12);
475 redAttr.SetFontWeight(wxBOLD);
476 redAttr.SetTextColour(*wxRED);
477 // We only want to affect colour, weight and face
478 redAttr.SetFlags(wxTEXT_ATTR_FONT_FACE|wxTEXT_ATTR_FONT_WEIGHT|wxTEXT_ATTR_TEXT_COLOUR);
479 redDef->SetStyle(redAttr);
9a173d48 480
5d7836c4 481 m_styleSheet->AddCharacterStyle(redDef);
082cfe55
JS
482
483 wxRichTextListStyleDefinition* bulletList = new wxRichTextListStyleDefinition(wxT("Bullet List 1"));
484 int i;
485 for (i = 0; i < 10; i++)
486 {
720cc10a 487 wxString bulletText;
082cfe55 488 if (i == 0)
720cc10a 489 bulletText = wxT("standard/circle");
082cfe55 490 else if (i == 1)
720cc10a 491 bulletText = wxT("standard/square");
082cfe55 492 else if (i == 2)
720cc10a 493 bulletText = wxT("standard/circle");
082cfe55 494 else if (i == 3)
720cc10a 495 bulletText = wxT("standard/square");
082cfe55 496 else
720cc10a 497 bulletText = wxT("standard/circle");
082cfe55 498
720cc10a 499 bulletList->SetAttributes(i, (i+1)*60, 60, wxTEXT_ATTR_BULLET_STYLE_STANDARD, bulletText);
082cfe55
JS
500 }
501
502 m_styleSheet->AddListStyle(bulletList);
503
504 wxRichTextListStyleDefinition* numberedList = new wxRichTextListStyleDefinition(wxT("Numbered List 1"));
505 for (i = 0; i < 10; i++)
506 {
507 long numberStyle;
508 if (i == 0)
509 numberStyle = wxTEXT_ATTR_BULLET_STYLE_ARABIC|wxTEXT_ATTR_BULLET_STYLE_PERIOD;
510 else if (i == 1)
511 numberStyle = wxTEXT_ATTR_BULLET_STYLE_LETTERS_LOWER|wxTEXT_ATTR_BULLET_STYLE_PARENTHESES;
512 else if (i == 2)
513 numberStyle = wxTEXT_ATTR_BULLET_STYLE_ROMAN_LOWER|wxTEXT_ATTR_BULLET_STYLE_PARENTHESES;
514 else if (i == 3)
515 numberStyle = wxTEXT_ATTR_BULLET_STYLE_ROMAN_UPPER|wxTEXT_ATTR_BULLET_STYLE_PARENTHESES;
516 else
517 numberStyle = wxTEXT_ATTR_BULLET_STYLE_ARABIC|wxTEXT_ATTR_BULLET_STYLE_PERIOD;
518
720cc10a
JS
519 numberStyle |= wxTEXT_ATTR_BULLET_STYLE_ALIGN_RIGHT;
520
082cfe55
JS
521 numberedList->SetAttributes(i, (i+1)*60, 60, numberStyle);
522 }
523
524 m_styleSheet->AddListStyle(numberedList);
720cc10a
JS
525
526 wxRichTextListStyleDefinition* outlineList = new wxRichTextListStyleDefinition(wxT("Outline List 1"));
527 for (i = 0; i < 10; i++)
528 {
529 long numberStyle;
530 if (i < 4)
531 numberStyle = wxTEXT_ATTR_BULLET_STYLE_OUTLINE|wxTEXT_ATTR_BULLET_STYLE_PERIOD;
532 else
533 numberStyle = wxTEXT_ATTR_BULLET_STYLE_ARABIC|wxTEXT_ATTR_BULLET_STYLE_PERIOD;
534
535 outlineList->SetAttributes(i, (i+1)*120, 120, numberStyle);
536 }
537
538 m_styleSheet->AddListStyle(outlineList);
5d7836c4
JS
539}
540
541// ----------------------------------------------------------------------------
542// main frame
543// ----------------------------------------------------------------------------
544
545// frame constructor
546MyFrame::MyFrame(const wxString& title, wxWindowID id, const wxPoint& pos,
547 const wxSize& size, long style)
548 : wxFrame(NULL, id, title, pos, size, style)
549{
550 // set the frame icon
1226b3b3 551 SetIcon(wxICON(sample));
5d7836c4
JS
552
553 // create a menu bar
554 wxMenu *fileMenu = new wxMenu;
555
556 // the "About" item should be in the help menu
557 wxMenu *helpMenu = new wxMenu;
558 helpMenu->Append(ID_About, _T("&About...\tF1"), _T("Show about dialog"));
559
560 fileMenu->Append(wxID_OPEN, _T("&Open\tCtrl+O"), _T("Open a file"));
561 fileMenu->Append(wxID_SAVE, _T("&Save\tCtrl+S"), _T("Save a file"));
562 fileMenu->Append(wxID_SAVEAS, _T("&Save As...\tF12"), _T("Save to a new file"));
563 fileMenu->AppendSeparator();
8881d9f0
JS
564 fileMenu->Append(ID_PAGE_SETUP, _T("Page Set&up..."), _T("Page setup"));
565 fileMenu->Append(ID_PRINT, _T("&Print...\tCtrl+P"), _T("Print"));
566 fileMenu->Append(ID_PREVIEW, _T("Print Pre&view"), _T("Print preview"));
567 fileMenu->AppendSeparator();
5d7836c4
JS
568 fileMenu->Append(ID_VIEW_HTML, _T("&View as HTML"), _T("View HTML"));
569 fileMenu->AppendSeparator();
c4cd20cf 570 fileMenu->Append(ID_Quit, _T("E&xit\tAlt+X"), _T("Quit this program"));
5d7836c4
JS
571
572 wxMenu* editMenu = new wxMenu;
573 editMenu->Append(wxID_UNDO, _("&Undo\tCtrl+Z"));
574 editMenu->Append(wxID_REDO, _("&Redo\tCtrl+Y"));
575 editMenu->AppendSeparator();
576 editMenu->Append(wxID_CUT, _("Cu&t\tCtrl+X"));
577 editMenu->Append(wxID_COPY, _("&Copy\tCtrl+C"));
578 editMenu->Append(wxID_PASTE, _("&Paste\tCtrl+V"));
579
580 editMenu->Append(wxID_CLEAR, _("&Delete\tDel"));
581
582 editMenu->AppendSeparator();
583 editMenu->Append(wxID_SELECTALL, _("Select A&ll\tCtrl+A"));
584#if 0
585 editMenu->AppendSeparator();
586 editMenu->Append(wxID_FIND, _("&Find...\tCtrl+F"));
587 editMenu->Append(stID_FIND_REPLACE, _("&Replace...\tCtrl+R"));
588#endif
589
590 wxMenu* formatMenu = new wxMenu;
591 formatMenu->AppendCheckItem(ID_FORMAT_BOLD, _("&Bold\tCtrl+B"));
592 formatMenu->AppendCheckItem(ID_FORMAT_ITALIC, _("&Italic\tCtrl+I"));
593 formatMenu->AppendCheckItem(ID_FORMAT_UNDERLINE, _("&Underline\tCtrl+U"));
594 formatMenu->AppendSeparator();
595 formatMenu->AppendCheckItem(ID_FORMAT_ALIGN_LEFT, _("L&eft Align"));
596 formatMenu->AppendCheckItem(ID_FORMAT_ALIGN_RIGHT, _("&Right Align"));
597 formatMenu->AppendCheckItem(ID_FORMAT_ALIGN_CENTRE, _("&Centre"));
598 formatMenu->AppendSeparator();
c4cd20cf 599 formatMenu->Append(ID_FORMAT_INDENT_MORE, _("Indent &More"));
5d7836c4
JS
600 formatMenu->Append(ID_FORMAT_INDENT_LESS, _("Indent &Less"));
601 formatMenu->AppendSeparator();
602 formatMenu->Append(ID_FORMAT_PARAGRAPH_SPACING_MORE, _("Increase Paragraph &Spacing"));
603 formatMenu->Append(ID_FORMAT_PARAGRAPH_SPACING_LESS, _("Decrease &Paragraph Spacing"));
604 formatMenu->AppendSeparator();
605 formatMenu->Append(ID_FORMAT_LINE_SPACING_SINGLE, _("Normal Line Spacing"));
606 formatMenu->Append(ID_FORMAT_LINE_SPACING_HALF, _("1.5 Line Spacing"));
607 formatMenu->Append(ID_FORMAT_LINE_SPACING_DOUBLE, _("Double Line Spacing"));
608 formatMenu->AppendSeparator();
609 formatMenu->Append(ID_FORMAT_FONT, _("&Font..."));
8c9c49a1
JS
610 formatMenu->Append(ID_FORMAT_PARAGRAPH, _("&Paragraph..."));
611 formatMenu->Append(ID_FORMAT_CONTENT, _("Font and Pa&ragraph...\tShift+Ctrl+F"));
fe5aa22c
JS
612 formatMenu->AppendSeparator();
613 formatMenu->Append(ID_SWITCH_STYLE_SHEETS, _("&Switch Style Sheets"));
e4723634
JS
614 formatMenu->Append(ID_MANAGE_STYLES, _("&Manage Styles"));
615
616 wxMenu* listsMenu = new wxMenu;
617 listsMenu->Append(ID_FORMAT_BULLETS_AND_NUMBERING, _("Bullets and &Numbering..."));
618 listsMenu->AppendSeparator();
619 listsMenu->Append(ID_FORMAT_NUMBER_LIST, _("Number List"));
620 listsMenu->Append(ID_FORMAT_ITEMIZE_LIST, _("Itemize List"));
621 listsMenu->Append(ID_FORMAT_RENUMBER_LIST, _("Renumber List"));
622 listsMenu->Append(ID_FORMAT_PROMOTE_LIST, _("Promote List Items"));
623 listsMenu->Append(ID_FORMAT_DEMOTE_LIST, _("Demote List Items"));
624 listsMenu->Append(ID_FORMAT_CLEAR_LIST, _("Clear List Formatting"));
5d7836c4 625
8c9c49a1
JS
626 wxMenu* insertMenu = new wxMenu;
627 insertMenu->Append(ID_INSERT_SYMBOL, _("&Symbol...\tCtrl+I"));
720cc10a 628 insertMenu->Append(ID_INSERT_URL, _("&URL..."));
8c9c49a1 629
5d7836c4
JS
630 // now append the freshly created menu to the menu bar...
631 wxMenuBar *menuBar = new wxMenuBar();
632 menuBar->Append(fileMenu, _T("&File"));
633 menuBar->Append(editMenu, _T("&Edit"));
634 menuBar->Append(formatMenu, _T("F&ormat"));
e4723634 635 menuBar->Append(listsMenu, _T("&Lists"));
8c9c49a1 636 menuBar->Append(insertMenu, _T("&Insert"));
5d7836c4
JS
637 menuBar->Append(helpMenu, _T("&Help"));
638
639 // ... and attach this menu bar to the frame
640 SetMenuBar(menuBar);
641
642 // create a status bar just for fun (by default with 1 pane only)
4753c7ce
WS
643 // but don't create it on limited screen space (WinCE)
644 bool is_pda = wxSystemSettings::GetScreenType() <= wxSYS_SCREEN_PDA;
645
9a173d48 646#if wxUSE_STATUSBAR
4753c7ce
WS
647 if ( !is_pda )
648 {
649 CreateStatusBar(2);
650 SetStatusText(_T("Welcome to wxRichTextCtrl!"));
651 }
9a173d48 652#endif
5d7836c4
JS
653
654 wxToolBar* toolBar = CreateToolBar();
655
9a173d48
WS
656 toolBar->AddTool(wxID_OPEN, wxBitmap(open_xpm), wxNullBitmap, false, -1, -1, (wxObject *) NULL, _("Open"));
657 toolBar->AddTool(wxID_SAVEAS, wxBitmap(save_xpm), wxNullBitmap, false, -1, -1, (wxObject *) NULL, _("Save"));
5d7836c4 658 toolBar->AddSeparator();
9a173d48
WS
659 toolBar->AddTool(wxID_CUT, wxBitmap(cut_xpm), wxNullBitmap, false, -1, -1, (wxObject *) NULL, _("Cut"));
660 toolBar->AddTool(wxID_COPY, wxBitmap(copy_xpm), wxNullBitmap, false, -1, -1, (wxObject *) NULL, _("Copy"));
661 toolBar->AddTool(wxID_PASTE, wxBitmap(paste_xpm), wxNullBitmap, false, -1, -1, (wxObject *) NULL, _("Paste"));
5d7836c4 662 toolBar->AddSeparator();
9a173d48
WS
663 toolBar->AddTool(wxID_UNDO, wxBitmap(undo_xpm), wxNullBitmap, false, -1, -1, (wxObject *) NULL, _("Undo"));
664 toolBar->AddTool(wxID_REDO, wxBitmap(redo_xpm), wxNullBitmap, false, -1, -1, (wxObject *) NULL, _("Redo"));
5d7836c4 665 toolBar->AddSeparator();
9a173d48
WS
666 toolBar->AddTool(ID_FORMAT_BOLD, wxBitmap(bold_xpm), wxNullBitmap, true, -1, -1, (wxObject *) NULL, _("Bold"));
667 toolBar->AddTool(ID_FORMAT_ITALIC, wxBitmap(italic_xpm), wxNullBitmap, true, -1, -1, (wxObject *) NULL, _("Italic"));
668 toolBar->AddTool(ID_FORMAT_UNDERLINE, wxBitmap(underline_xpm), wxNullBitmap, true, -1, -1, (wxObject *) NULL, _("Underline"));
5d7836c4 669 toolBar->AddSeparator();
9a173d48
WS
670 toolBar->AddTool(ID_FORMAT_ALIGN_LEFT, wxBitmap(alignleft_xpm), wxNullBitmap, true, -1, -1, (wxObject *) NULL, _("Align Left"));
671 toolBar->AddTool(ID_FORMAT_ALIGN_CENTRE, wxBitmap(centre_xpm), wxNullBitmap, true, -1, -1, (wxObject *) NULL, _("Centre"));
672 toolBar->AddTool(ID_FORMAT_ALIGN_RIGHT, wxBitmap(alignright_xpm), wxNullBitmap, true, -1, -1, (wxObject *) NULL, _("Align Right"));
5d7836c4 673 toolBar->AddSeparator();
9a173d48
WS
674 toolBar->AddTool(ID_FORMAT_INDENT_LESS, wxBitmap(indentless_xpm), wxNullBitmap, false, -1, -1, (wxObject *) NULL, _("Indent Less"));
675 toolBar->AddTool(ID_FORMAT_INDENT_MORE, wxBitmap(indentmore_xpm), wxNullBitmap, false, -1, -1, (wxObject *) NULL, _("Indent More"));
5d7836c4 676 toolBar->AddSeparator();
9a173d48 677 toolBar->AddTool(ID_FORMAT_FONT, wxBitmap(font_xpm), wxNullBitmap, false, -1, -1, (wxObject *) NULL, _("Font"));
5d7836c4 678
fe5aa22c 679 wxRichTextStyleComboCtrl* combo = new wxRichTextStyleComboCtrl(toolBar, ID_RICHTEXT_STYLE_COMBO, wxDefaultPosition, wxSize(200, -1));
e637208a
JS
680 toolBar->AddControl(combo);
681
5d7836c4
JS
682 toolBar->Realize();
683
c59f6793 684 wxSplitterWindow* splitter = new wxSplitterWindow(this, wxID_ANY, wxDefaultPosition, GetClientSize(), wxSP_NO_XP_THEME|wxSP_3D|wxSP_LIVE_UPDATE);
5d7836c4
JS
685
686 wxFont textFont = wxFont(12, wxROMAN, wxNORMAL, wxNORMAL);
687 wxFont boldFont = wxFont(12, wxROMAN, wxNORMAL, wxBOLD);
688 wxFont italicFont = wxFont(12, wxROMAN, wxITALIC, wxNORMAL);
689
fe5aa22c 690 m_richTextCtrl = new wxRichTextCtrl(splitter, ID_RICHTEXT_CTRL, wxEmptyString, wxDefaultPosition, wxSize(200, 200), wxVSCROLL|wxHSCROLL|wxNO_BORDER|wxWANTS_CHARS);
ff2baa25
JS
691 wxFont font(12, wxROMAN, wxNORMAL, wxNORMAL);
692
ff2baa25 693 m_richTextCtrl->SetFont(font);
5d7836c4 694
fe5aa22c
JS
695 m_richTextCtrl->SetStyleSheet(wxGetApp().GetStyleSheet());
696
e637208a
JS
697 combo->SetStyleSheet(wxGetApp().GetStyleSheet());
698 combo->SetRichTextCtrl(m_richTextCtrl);
699 combo->UpdateStyles();
700
082cfe55 701 wxRichTextStyleListCtrl* styleListCtrl = new wxRichTextStyleListCtrl(splitter, ID_RICHTEXT_STYLE_LIST);
4753c7ce
WS
702
703 wxSize display = wxGetDisplaySize();
704 if ( is_pda && ( display.GetWidth() < display.GetHeight() ) )
705 {
082cfe55 706 splitter->SplitHorizontally(m_richTextCtrl, styleListCtrl);
4753c7ce
WS
707 }
708 else
709 {
082cfe55 710 splitter->SplitVertically(m_richTextCtrl, styleListCtrl, 500);
4753c7ce 711 }
5d7836c4 712
c59f6793
JS
713 splitter->UpdateSize();
714
082cfe55
JS
715 styleListCtrl->SetStyleSheet(wxGetApp().GetStyleSheet());
716 styleListCtrl->SetRichTextCtrl(m_richTextCtrl);
717 styleListCtrl->UpdateStyles();
5d7836c4
JS
718
719 wxRichTextCtrl& r = *m_richTextCtrl;
720
721 r.BeginSuppressUndo();
722
723 r.BeginParagraphSpacing(0, 20);
724
725 r.BeginAlignment(wxTEXT_ALIGNMENT_CENTRE);
726 r.BeginBold();
727
728 r.BeginFontSize(14);
729 r.WriteText(wxT("Welcome to wxRichTextCtrl, a wxWidgets control for editing and presenting styled text and images"));
730 r.EndFontSize();
731 r.Newline();
732
733 r.BeginItalic();
734 r.WriteText(wxT("by Julian Smart"));
735 r.EndItalic();
736
737 r.EndBold();
738
739 r.Newline();
740 r.WriteImage(wxBitmap(zebra_xpm));
741
742 r.EndAlignment();
743
744 r.Newline();
745 r.Newline();
746
747 r.WriteText(wxT("What can you do with this thing? "));
748 r.WriteImage(wxBitmap(smiley_xpm));
749 r.WriteText(wxT(" Well, you can change text "));
750
751 r.BeginTextColour(wxColour(255, 0, 0));
752 r.WriteText(wxT("colour, like this red bit."));
753 r.EndTextColour();
754
755 r.BeginTextColour(wxColour(0, 0, 255));
756 r.WriteText(wxT(" And this blue bit."));
757 r.EndTextColour();
758
759 r.WriteText(wxT(" Naturally you can make things "));
760 r.BeginBold();
761 r.WriteText(wxT("bold "));
762 r.EndBold();
763 r.BeginItalic();
764 r.WriteText(wxT("or italic "));
765 r.EndItalic();
766 r.BeginUnderline();
767 r.WriteText(wxT("or underlined."));
768 r.EndUnderline();
769
770 r.BeginFontSize(14);
771 r.WriteText(wxT(" Different font sizes on the same line is allowed, too."));
772 r.EndFontSize();
773
774 r.WriteText(wxT(" Next we'll show an indented paragraph."));
775
776 r.BeginLeftIndent(60);
777 r.Newline();
778
779 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."));
780 r.EndLeftIndent();
781
782 r.Newline();
783
784 r.WriteText(wxT("Next, we'll show a first-line indent, achieved using BeginLeftIndent(100, -40)."));
785
786 r.BeginLeftIndent(100, -40);
787 r.Newline();
788
789 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."));
790 r.EndLeftIndent();
791
792 r.Newline();
793
794 r.WriteText(wxT("Numbered bullets are possible, again using subindents:"));
795
796 r.BeginNumberedBullet(1, 100, 60);
797 r.Newline();
798
082cfe55 799 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."));
5d7836c4
JS
800 r.EndNumberedBullet();
801
802 r.BeginNumberedBullet(2, 100, 60);
803 r.Newline();
804
805 r.WriteText(wxT("This is my second item."));
806 r.EndNumberedBullet();
807
808 r.Newline();
809
810 r.WriteText(wxT("The following paragraph is right-indented:"));
811
812 r.BeginRightIndent(200);
813 r.Newline();
814
815 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."));
816 r.EndRightIndent();
817
818 r.Newline();
819
820 r.WriteText(wxT("The following paragraph is right-aligned with 1.5 line spacing:"));
821
822 r.BeginAlignment(wxTEXT_ALIGNMENT_RIGHT);
823 r.BeginLineSpacing(wxTEXT_ATTR_LINE_SPACING_HALF);
824 r.Newline();
825
826 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."));
827 r.EndLineSpacing();
828 r.EndAlignment();
829
7f0d9d71
JS
830 wxArrayInt tabs;
831 tabs.Add(400);
832 tabs.Add(600);
833 tabs.Add(800);
834 tabs.Add(1000);
835 wxTextAttrEx attr;
836 attr.SetFlags(wxTEXT_ATTR_TABS);
837 attr.SetTabs(tabs);
838 r.SetDefaultStyle(attr);
4753c7ce 839
7f0d9d71
JS
840 r.Newline();
841 r.WriteText(wxT("This line contains tabs:\tFirst tab\tSecond tab\tThird tab"));
842
5d7836c4
JS
843 r.Newline();
844 r.WriteText(wxT("Other notable features of wxRichTextCtrl include:"));
845
846 r.BeginSymbolBullet(wxT('*'), 100, 60);
847 r.Newline();
848 r.WriteText(wxT("Compatibility with wxTextCtrl API"));
849 r.EndSymbolBullet();
850
851 r.BeginSymbolBullet(wxT('*'), 100, 60);
852 r.Newline();
853 r.WriteText(wxT("Easy stack-based BeginXXX()...EndXXX() style setting in addition to SetStyle()"));
854 r.EndSymbolBullet();
855
856 r.BeginSymbolBullet(wxT('*'), 100, 60);
857 r.Newline();
858 r.WriteText(wxT("XML loading and saving"));
859 r.EndSymbolBullet();
860
861 r.BeginSymbolBullet(wxT('*'), 100, 60);
862 r.Newline();
863 r.WriteText(wxT("Undo/Redo, with batching option and Undo suppressing"));
864 r.EndSymbolBullet();
865
866 r.BeginSymbolBullet(wxT('*'), 100, 60);
867 r.Newline();
868 r.WriteText(wxT("Clipboard copy and paste"));
869 r.EndSymbolBullet();
870
871 r.BeginSymbolBullet(wxT('*'), 100, 60);
872 r.Newline();
873 r.WriteText(wxT("wxRichTextStyleSheet with named character and paragraph styles, and control for applying named styles"));
874 r.EndSymbolBullet();
875
876 r.BeginSymbolBullet(wxT('*'), 100, 60);
877 r.Newline();
878 r.WriteText(wxT("A design that can easily be extended to other content types, ultimately with text boxes, tables, controls, and so on"));
879 r.EndSymbolBullet();
880
881 r.Newline();
882
720cc10a
JS
883 // Make a style suitable for showing a URL
884 wxRichTextAttr urlStyle;
885 urlStyle.SetTextColour(*wxBLUE);
886 urlStyle.SetFontUnderlined(true);
887
888 r.WriteText(wxT("wxRichTextCtrl can also display URLs, such as this one: "));
889 r.BeginStyle(urlStyle);
890 r.BeginURL(wxT("http://www.wxwidgets.org"));
891 r.WriteText(wxT("The wxWidgets Web Site"));
892 r.EndURL();
893 r.EndStyle();
894 r.WriteText(wxT(". Click on the URL to generate an event."));
895
896 r.Newline();
897
5d7836c4
JS
898 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!"));
899
900 r.EndParagraphSpacing();
901
902 r.EndSuppressUndo();
903}
904
905
906// event handlers
907
908void MyFrame::OnQuit(wxCommandEvent& WXUNUSED(event))
909{
910 // true is to force the frame to close
911 Close(true);
912}
913
914void MyFrame::OnAbout(wxCommandEvent& WXUNUSED(event))
915{
916 wxString msg;
917 msg.Printf( _T("This is a demo for wxRichTextCtrl, a control for editing styled text.\n(c) Julian Smart, 2005"));
918 wxMessageBox(msg, _T("About wxRichTextCtrl Sample"), wxOK | wxICON_INFORMATION, this);
919}
920
921// Forward command events to the current rich text control, if any
922bool MyFrame::ProcessEvent(wxEvent& event)
923{
924 if (event.IsCommandEvent() && !event.IsKindOf(CLASSINFO(wxChildFocusEvent)))
925 {
926 // Problem: we can get infinite recursion because the events
927 // climb back up to this frame, and repeat.
928 // Assume that command events don't cause another command event
929 // to be called, so we can rely on inCommand not being overwritten
930
931 static int s_eventType = 0;
932 static wxWindowID s_id = 0;
933
934 if (s_id != event.GetId() && s_eventType != event.GetEventType())
935 {
936 s_eventType = event.GetEventType();
937 s_id = event.GetId();
9a173d48 938
5d7836c4
JS
939 wxWindow* focusWin = wxFindFocusDescendant(this);
940 if (focusWin && focusWin->ProcessEvent(event))
941 {
942 //s_command = NULL;
943 s_eventType = 0;
944 s_id = 0;
9a173d48 945 return true;
5d7836c4
JS
946 }
947
948 s_eventType = 0;
949 s_id = 0;
950 }
951 else
952 {
9a173d48 953 return false;
5d7836c4
JS
954 }
955 }
956
957 return wxFrame::ProcessEvent(event);
958}
959
011b3dcb 960void MyFrame::OnOpen(wxCommandEvent& WXUNUSED(event))
5d7836c4 961{
9a173d48
WS
962 wxString path;
963 wxString filename;
1e967276
JS
964 wxArrayInt fileTypes;
965
966 wxString filter = wxRichTextBuffer::GetExtWildcard(false, false, & fileTypes);
9a173d48 967 if (!filter.empty())
5d7836c4
JS
968 filter += wxT("|");
969 filter += wxT("All files (*.*)|*.*");
970
5d7836c4
JS
971 wxFileDialog dialog(this,
972 _("Choose a filename"),
973 path,
974 filename,
975 filter,
ff3e84ff 976 wxFD_OPEN);
5d7836c4
JS
977
978 if (dialog.ShowModal() == wxID_OK)
979 {
980 wxString path = dialog.GetPath();
9a173d48
WS
981
982 if (!path.empty())
5d7836c4 983 {
1e967276 984 int filterIndex = dialog.GetFilterIndex();
dbf38e88
WS
985 int fileType = (filterIndex < (int) fileTypes.GetCount())
986 ? fileTypes[filterIndex]
987 : wxRICHTEXT_TYPE_TEXT;
1e967276 988 m_richTextCtrl->LoadFile(path, fileType);
5d7836c4
JS
989 }
990 }
991}
992
993void MyFrame::OnSave(wxCommandEvent& event)
994{
9a173d48 995 if (m_richTextCtrl->GetFilename().empty())
5d7836c4
JS
996 {
997 OnSaveAs(event);
998 return;
999 }
1000 m_richTextCtrl->SaveFile();
1001}
1002
011b3dcb 1003void MyFrame::OnSaveAs(wxCommandEvent& WXUNUSED(event))
5d7836c4
JS
1004{
1005 wxString filter = wxRichTextBuffer::GetExtWildcard(false, true);
9a173d48
WS
1006 wxString path;
1007 wxString filename;
5d7836c4
JS
1008
1009 wxFileDialog dialog(this,
1010 _("Choose a filename"),
1011 path,
1012 filename,
1013 filter,
ff3e84ff 1014 wxFD_SAVE);
5d7836c4
JS
1015
1016 if (dialog.ShowModal() == wxID_OK)
1017 {
1018 wxString path = dialog.GetPath();
9a173d48
WS
1019
1020 if (!path.empty())
5d7836c4
JS
1021 {
1022 m_richTextCtrl->SaveFile(path);
1023 }
1024 }
1025}
1026
011b3dcb 1027void MyFrame::OnBold(wxCommandEvent& WXUNUSED(event))
5d7836c4
JS
1028{
1029 m_richTextCtrl->ApplyBoldToSelection();
1030}
1031
011b3dcb 1032void MyFrame::OnItalic(wxCommandEvent& WXUNUSED(event))
5d7836c4
JS
1033{
1034 m_richTextCtrl->ApplyItalicToSelection();
1035}
1036
011b3dcb 1037void MyFrame::OnUnderline(wxCommandEvent& WXUNUSED(event))
5d7836c4
JS
1038{
1039 m_richTextCtrl->ApplyUnderlineToSelection();
1040}
1041
1042
1043void MyFrame::OnUpdateBold(wxUpdateUIEvent& event)
1044{
1045 event.Check(m_richTextCtrl->IsSelectionBold());
1046}
1047
1048void MyFrame::OnUpdateItalic(wxUpdateUIEvent& event)
1049{
1050 event.Check(m_richTextCtrl->IsSelectionItalics());
1051}
1052
1053void MyFrame::OnUpdateUnderline(wxUpdateUIEvent& event)
1054{
1055 event.Check(m_richTextCtrl->IsSelectionUnderlined());
1056}
1057
011b3dcb 1058void MyFrame::OnAlignLeft(wxCommandEvent& WXUNUSED(event))
5d7836c4
JS
1059{
1060 m_richTextCtrl->ApplyAlignmentToSelection(wxTEXT_ALIGNMENT_LEFT);
1061}
1062
011b3dcb 1063void MyFrame::OnAlignCentre(wxCommandEvent& WXUNUSED(event))
5d7836c4
JS
1064{
1065 m_richTextCtrl->ApplyAlignmentToSelection(wxTEXT_ALIGNMENT_CENTRE);
1066}
1067
011b3dcb 1068void MyFrame::OnAlignRight(wxCommandEvent& WXUNUSED(event))
5d7836c4
JS
1069{
1070 m_richTextCtrl->ApplyAlignmentToSelection(wxTEXT_ALIGNMENT_RIGHT);
1071}
1072
1073void MyFrame::OnUpdateAlignLeft(wxUpdateUIEvent& event)
1074{
1075 event.Check(m_richTextCtrl->IsSelectionAligned(wxTEXT_ALIGNMENT_LEFT));
1076}
1077
1078void MyFrame::OnUpdateAlignCentre(wxUpdateUIEvent& event)
1079{
1080 event.Check(m_richTextCtrl->IsSelectionAligned(wxTEXT_ALIGNMENT_CENTRE));
1081}
1082
1083void MyFrame::OnUpdateAlignRight(wxUpdateUIEvent& event)
1084{
1085 event.Check(m_richTextCtrl->IsSelectionAligned(wxTEXT_ALIGNMENT_RIGHT));
1086}
1087
011b3dcb 1088void MyFrame::OnFont(wxCommandEvent& WXUNUSED(event))
5d7836c4 1089{
8c9c49a1
JS
1090 wxRichTextRange range;
1091 if (m_richTextCtrl->HasSelection())
1092 range = m_richTextCtrl->GetSelectionRange();
1093 else
1094 range = wxRichTextRange(0, m_richTextCtrl->GetLastPosition()+1);
1095
1096 int pages = wxRICHTEXT_FORMAT_FONT;
1097
1098 wxRichTextFormattingDialog formatDlg(pages, this);
1099 formatDlg.GetStyle(m_richTextCtrl, range);
1100
1101 if (formatDlg.ShowModal() == wxID_OK)
1102 {
1103 formatDlg.ApplyStyle(m_richTextCtrl, range);
1104 }
1105
1106 // Old method using wxFontDialog
1107#if 0
5d7836c4
JS
1108 if (!m_richTextCtrl->HasSelection())
1109 return;
1110
1111 wxRichTextRange range = m_richTextCtrl->GetSelectionRange();
1112 wxFontData fontData;
1113
1114 wxTextAttrEx attr;
1115 attr.SetFlags(wxTEXT_ATTR_FONT);
1116
1117 if (m_richTextCtrl->GetStyle(m_richTextCtrl->GetInsertionPoint(), attr))
1118 fontData.SetInitialFont(attr.GetFont());
1119
1120 wxFontDialog dialog(this, fontData);
1121 if (dialog.ShowModal() == wxID_OK)
1122 {
1123 fontData = dialog.GetFontData();
1124 attr.SetFlags(wxTEXT_ATTR_FONT);
1125 attr.SetFont(fontData.GetChosenFont());
1126 if (attr.GetFont().Ok())
1127 {
1128 m_richTextCtrl->SetStyle(range, attr);
1129 }
1130 }
8c9c49a1
JS
1131#endif
1132}
1133
1134void MyFrame::OnParagraph(wxCommandEvent& WXUNUSED(event))
1135{
1136 wxRichTextRange range;
1137 if (m_richTextCtrl->HasSelection())
1138 range = m_richTextCtrl->GetSelectionRange();
1139 else
1140 range = wxRichTextRange(0, m_richTextCtrl->GetLastPosition()+1);
1141
1142 int pages = wxRICHTEXT_FORMAT_INDENTS_SPACING|wxRICHTEXT_FORMAT_TABS|wxRICHTEXT_FORMAT_BULLETS;
1143
1144 wxRichTextFormattingDialog formatDlg(pages, this);
1145 formatDlg.GetStyle(m_richTextCtrl, range);
1146
1147 if (formatDlg.ShowModal() == wxID_OK)
1148 {
1149 formatDlg.ApplyStyle(m_richTextCtrl, range);
1150 }
1151}
1152
1153void MyFrame::OnFormat(wxCommandEvent& WXUNUSED(event))
1154{
1155 wxRichTextRange range;
1156 if (m_richTextCtrl->HasSelection())
1157 range = m_richTextCtrl->GetSelectionRange();
1158 else
1159 range = wxRichTextRange(0, m_richTextCtrl->GetLastPosition()+1);
1160
1161 int pages = wxRICHTEXT_FORMAT_FONT|wxRICHTEXT_FORMAT_INDENTS_SPACING|wxRICHTEXT_FORMAT_TABS|wxRICHTEXT_FORMAT_BULLETS;
1162
1163 wxRichTextFormattingDialog formatDlg(pages, this);
1164 formatDlg.GetStyle(m_richTextCtrl, range);
1165
1166 if (formatDlg.ShowModal() == wxID_OK)
1167 {
1168 formatDlg.ApplyStyle(m_richTextCtrl, range);
1169 }
1170}
1171
1172void MyFrame::OnUpdateFormat(wxUpdateUIEvent& event)
1173{
1174 event.Enable(m_richTextCtrl->HasSelection());
5d7836c4
JS
1175}
1176
011b3dcb 1177void MyFrame::OnIndentMore(wxCommandEvent& WXUNUSED(event))
5d7836c4
JS
1178{
1179 wxTextAttrEx attr;
1180 attr.SetFlags(wxTEXT_ATTR_LEFT_INDENT);
1181
1182 if (m_richTextCtrl->GetStyle(m_richTextCtrl->GetInsertionPoint(), attr))
1183 {
1184 wxRichTextRange range(m_richTextCtrl->GetInsertionPoint(), m_richTextCtrl->GetInsertionPoint());
1185 if (m_richTextCtrl->HasSelection())
1186 range = m_richTextCtrl->GetSelectionRange();
1187
1188 wxFontData fontData;
1189 attr.SetLeftIndent(attr.GetLeftIndent() + 100);
1190
1191 attr.SetFlags(wxTEXT_ATTR_LEFT_INDENT);
1192 m_richTextCtrl->SetStyle(range, attr);
1193 }
1194}
1195
011b3dcb 1196void MyFrame::OnIndentLess(wxCommandEvent& WXUNUSED(event))
5d7836c4
JS
1197{
1198 wxTextAttrEx attr;
1199 attr.SetFlags(wxTEXT_ATTR_LEFT_INDENT);
1200
1201 if (m_richTextCtrl->GetStyle(m_richTextCtrl->GetInsertionPoint(), attr))
1202 {
1203 wxRichTextRange range(m_richTextCtrl->GetInsertionPoint(), m_richTextCtrl->GetInsertionPoint());
1204 if (m_richTextCtrl->HasSelection())
1205 range = m_richTextCtrl->GetSelectionRange();
1206
1207 if (attr.GetLeftIndent() >= 100)
1208 {
1209 wxFontData fontData;
1210 attr.SetLeftIndent(attr.GetLeftIndent() - 100);
9a173d48 1211
5d7836c4
JS
1212 m_richTextCtrl->SetStyle(range, attr);
1213 }
1214 }
1215}
1216
011b3dcb 1217void MyFrame::OnLineSpacingHalf(wxCommandEvent& WXUNUSED(event))
5d7836c4
JS
1218{
1219 wxTextAttrEx attr;
1220 attr.SetFlags(wxTEXT_ATTR_LINE_SPACING);
1221
1222 if (m_richTextCtrl->GetStyle(m_richTextCtrl->GetInsertionPoint(), attr))
1223 {
1224 wxRichTextRange range(m_richTextCtrl->GetInsertionPoint(), m_richTextCtrl->GetInsertionPoint());
1225 if (m_richTextCtrl->HasSelection())
1226 range = m_richTextCtrl->GetSelectionRange();
1227
1228 wxFontData fontData;
1229 attr.SetFlags(wxTEXT_ATTR_LINE_SPACING);
1230 attr.SetLineSpacing(15);
9a173d48 1231
5d7836c4
JS
1232 m_richTextCtrl->SetStyle(range, attr);
1233 }
1234}
1235
011b3dcb 1236void MyFrame::OnLineSpacingDouble(wxCommandEvent& WXUNUSED(event))
5d7836c4
JS
1237{
1238 wxTextAttrEx attr;
1239 attr.SetFlags(wxTEXT_ATTR_LINE_SPACING);
1240
1241 if (m_richTextCtrl->GetStyle(m_richTextCtrl->GetInsertionPoint(), attr))
1242 {
1243 wxRichTextRange range(m_richTextCtrl->GetInsertionPoint(), m_richTextCtrl->GetInsertionPoint());
1244 if (m_richTextCtrl->HasSelection())
1245 range = m_richTextCtrl->GetSelectionRange();
1246
1247 wxFontData fontData;
1248 attr.SetFlags(wxTEXT_ATTR_LINE_SPACING);
1249 attr.SetLineSpacing(20);
9a173d48 1250
5d7836c4
JS
1251 m_richTextCtrl->SetStyle(range, attr);
1252 }
1253}
1254
011b3dcb 1255void MyFrame::OnLineSpacingSingle(wxCommandEvent& WXUNUSED(event))
5d7836c4
JS
1256{
1257 wxTextAttrEx attr;
1258 attr.SetFlags(wxTEXT_ATTR_LINE_SPACING);
1259
1260 if (m_richTextCtrl->GetStyle(m_richTextCtrl->GetInsertionPoint(), attr))
1261 {
1262 wxRichTextRange range(m_richTextCtrl->GetInsertionPoint(), m_richTextCtrl->GetInsertionPoint());
1263 if (m_richTextCtrl->HasSelection())
1264 range = m_richTextCtrl->GetSelectionRange();
1265
1266 wxFontData fontData;
1267 attr.SetFlags(wxTEXT_ATTR_LINE_SPACING);
1268 attr.SetLineSpacing(0); // Can also use 10
9a173d48 1269
5d7836c4
JS
1270 m_richTextCtrl->SetStyle(range, attr);
1271 }
1272}
1273
011b3dcb 1274void MyFrame::OnParagraphSpacingMore(wxCommandEvent& WXUNUSED(event))
5d7836c4
JS
1275{
1276 wxTextAttrEx attr;
1277 attr.SetFlags(wxTEXT_ATTR_PARA_SPACING_AFTER);
1278
1279 if (m_richTextCtrl->GetStyle(m_richTextCtrl->GetInsertionPoint(), attr))
1280 {
1281 wxRichTextRange range(m_richTextCtrl->GetInsertionPoint(), m_richTextCtrl->GetInsertionPoint());
1282 if (m_richTextCtrl->HasSelection())
1283 range = m_richTextCtrl->GetSelectionRange();
1284
1285 wxFontData fontData;
1286 attr.SetParagraphSpacingAfter(attr.GetParagraphSpacingAfter() + 20);
1287
1288 attr.SetFlags(wxTEXT_ATTR_PARA_SPACING_AFTER);
1289 m_richTextCtrl->SetStyle(range, attr);
1290 }
1291}
1292
011b3dcb 1293void MyFrame::OnParagraphSpacingLess(wxCommandEvent& WXUNUSED(event))
5d7836c4
JS
1294{
1295 wxTextAttrEx attr;
1296 attr.SetFlags(wxTEXT_ATTR_PARA_SPACING_AFTER);
1297
1298 if (m_richTextCtrl->GetStyle(m_richTextCtrl->GetInsertionPoint(), attr))
1299 {
1300 wxRichTextRange range(m_richTextCtrl->GetInsertionPoint(), m_richTextCtrl->GetInsertionPoint());
1301 if (m_richTextCtrl->HasSelection())
1302 range = m_richTextCtrl->GetSelectionRange();
1303
1304 if (attr.GetParagraphSpacingAfter() >= 20)
1305 {
1306 wxFontData fontData;
1307 attr.SetParagraphSpacingAfter(attr.GetParagraphSpacingAfter() - 20);
9a173d48 1308
5d7836c4
JS
1309 attr.SetFlags(wxTEXT_ATTR_PARA_SPACING_AFTER);
1310 m_richTextCtrl->SetStyle(range, attr);
1311 }
1312 }
1313}
1314
011b3dcb 1315void MyFrame::OnViewHTML(wxCommandEvent& WXUNUSED(event))
5d7836c4
JS
1316{
1317 wxDialog dialog(this, wxID_ANY, _("HTML"), wxDefaultPosition, wxSize(500, 400), wxDEFAULT_DIALOG_STYLE);
1318
1319 wxBoxSizer* boxSizer = new wxBoxSizer(wxVERTICAL);
1320 dialog.SetSizer(boxSizer);
1321
1322 wxHtmlWindow* win = new wxHtmlWindow(& dialog, wxID_ANY, wxDefaultPosition, wxSize(500, 400), wxSUNKEN_BORDER);
1323 boxSizer->Add(win, 1, wxALL, 5);
1324
1325 wxButton* cancelButton = new wxButton(& dialog, wxID_CANCEL, wxT("&Close"));
1326 boxSizer->Add(cancelButton, 0, wxALL|wxCENTRE, 5);
1327
1328 wxString text;
1329 wxStringOutputStream strStream(& text);
1330
1331 wxRichTextHTMLHandler htmlHandler;
720cc10a
JS
1332 htmlHandler.SetFlags(wxRICHTEXT_HANDLER_SAVE_IMAGES_TO_MEMORY);
1333
5d7836c4
JS
1334 if (htmlHandler.SaveFile(& m_richTextCtrl->GetBuffer(), strStream))
1335 {
1336 win->SetPage(text);
1337 }
1338
1339 boxSizer->Fit(& dialog);
1340
1341 dialog.ShowModal();
720cc10a
JS
1342
1343 // Now delete the temporary in-memory images
1344 htmlHandler.DeleteTemporaryImages();
5d7836c4 1345}
fe5aa22c
JS
1346
1347// Demonstrates how you can change the style sheets and have the changes
1348// reflected in the control content without wiping out character formatting.
1349
1350void MyFrame::OnSwitchStyleSheets(wxCommandEvent& WXUNUSED(event))
1351{
1352 static wxRichTextStyleSheet* gs_AlternateStyleSheet = NULL;
1353
e4723634 1354 wxRichTextStyleListCtrl *styleList = (wxRichTextStyleListCtrl*) FindWindow(ID_RICHTEXT_STYLE_LIST);
fe5aa22c
JS
1355 wxRichTextStyleComboCtrl* styleCombo = (wxRichTextStyleComboCtrl*) FindWindow(ID_RICHTEXT_STYLE_COMBO);
1356
8881d9f0 1357 wxRichTextStyleSheet* sheet = m_richTextCtrl->GetStyleSheet();
fe5aa22c
JS
1358
1359 // One-time creation of an alternate style sheet
1360 if (!gs_AlternateStyleSheet)
1361 {
1362 gs_AlternateStyleSheet = new wxRichTextStyleSheet(*sheet);
1363
1364 // Make some modifications
1365 for (int i = 0; i < (int) gs_AlternateStyleSheet->GetParagraphStyleCount(); i++)
1366 {
1367 wxRichTextParagraphStyleDefinition* def = gs_AlternateStyleSheet->GetParagraphStyle(i);
1368
1369 if (def->GetStyle().HasTextColour())
1370 def->GetStyle().SetTextColour(*wxBLUE);
1371
1372 if (def->GetStyle().HasAlignment())
1373 {
1374 if (def->GetStyle().GetAlignment() == wxTEXT_ALIGNMENT_CENTRE)
1375 def->GetStyle().SetAlignment(wxTEXT_ALIGNMENT_RIGHT);
1376 else if (def->GetStyle().GetAlignment() == wxTEXT_ALIGNMENT_LEFT)
1377 def->GetStyle().SetAlignment(wxTEXT_ALIGNMENT_CENTRE);
1378 }
1379 if (def->GetStyle().HasLeftIndent())
1380 {
1381 def->GetStyle().SetLeftIndent(def->GetStyle().GetLeftIndent() * 2);
1382 }
1383 }
1384 }
1385
1386 // Switch sheets
1387 wxRichTextStyleSheet* tmp = gs_AlternateStyleSheet;
1388 gs_AlternateStyleSheet = sheet;
1389 sheet = tmp;
1390
8881d9f0
JS
1391 m_richTextCtrl->SetStyleSheet(sheet);
1392 m_richTextCtrl->ApplyStyleSheet(sheet); // Makes the control reflect the new style definitions
fe5aa22c
JS
1393
1394 styleList->SetStyleSheet(sheet);
1395 styleList->UpdateStyles();
1396
1397 styleCombo->SetStyleSheet(sheet);
1398 styleCombo->UpdateStyles();
1399}
8c9c49a1 1400
e4723634
JS
1401void MyFrame::OnManageStyles(wxCommandEvent& WXUNUSED(event))
1402{
8881d9f0 1403 wxRichTextStyleSheet* sheet = m_richTextCtrl->GetStyleSheet();
e4723634
JS
1404
1405 int flags = wxRICHTEXT_ORGANISER_CREATE_STYLES|wxRICHTEXT_ORGANISER_EDIT_STYLES;
1406
1407 wxRichTextStyleOrganiserDialog dlg(flags, sheet, NULL, this, wxID_ANY, _("Style Manager"));
1408 dlg.ShowModal();
1409}
1410
8c9c49a1
JS
1411void MyFrame::OnInsertSymbol(wxCommandEvent& WXUNUSED(event))
1412{
8c9c49a1
JS
1413 wxTextAttrEx attr;
1414 attr.SetFlags(wxTEXT_ATTR_FONT);
8881d9f0 1415 m_richTextCtrl->GetStyle(m_richTextCtrl->GetInsertionPoint(), attr);
8c9c49a1
JS
1416
1417 wxString currentFontName;
1418 if (attr.HasFont() && attr.GetFont().Ok())
1419 currentFontName = attr.GetFont().GetFaceName();
1420
1421 // Don't set the initial font in the dialog (so the user is choosing
1422 // 'normal text', i.e. the current font) but do tell the dialog
1423 // what 'normal text' is.
1424
1425 wxSymbolPickerDialog dlg(wxT("*"), wxEmptyString, currentFontName, this);
1426
1427 if (dlg.ShowModal() == wxID_OK)
1428 {
1429 if (dlg.HasSelection())
1430 {
8881d9f0 1431 long insertionPoint = m_richTextCtrl->GetInsertionPoint();
8c9c49a1 1432
8881d9f0 1433 m_richTextCtrl->WriteText(dlg.GetSymbol());
8c9c49a1
JS
1434
1435 if (!dlg.UseNormalFont())
1436 {
1437 wxFont font(attr.GetFont());
23c386ba 1438 font.SetFaceName(dlg.GetFontName());
8c9c49a1 1439 attr.SetFont(font);
8881d9f0 1440 m_richTextCtrl->SetStyle(insertionPoint, insertionPoint+1, attr);
8c9c49a1
JS
1441 }
1442 }
1443 }
1444}
082cfe55
JS
1445
1446void MyFrame::OnNumberList(wxCommandEvent& WXUNUSED(event))
1447{
8881d9f0 1448 if (m_richTextCtrl->HasSelection())
082cfe55 1449 {
8881d9f0
JS
1450 wxRichTextRange range = m_richTextCtrl->GetSelectionRange();
1451 m_richTextCtrl->SetListStyle(range, wxT("Numbered List 1"), wxRICHTEXT_SETSTYLE_WITH_UNDO|wxRICHTEXT_SETSTYLE_RENUMBER);
082cfe55
JS
1452 }
1453}
1454
e4723634
JS
1455void MyFrame::OnBulletsAndNumbering(wxCommandEvent& WXUNUSED(event))
1456{
8881d9f0 1457 wxRichTextStyleSheet* sheet = m_richTextCtrl->GetStyleSheet();
e4723634
JS
1458
1459 int flags = wxRICHTEXT_ORGANISER_BROWSE_NUMBERING;
1460
8881d9f0 1461 wxRichTextStyleOrganiserDialog dlg(flags, sheet, m_richTextCtrl, this, wxID_ANY, _("Bullets and Numbering"));
e4723634
JS
1462 if (dlg.ShowModal() == wxID_OK)
1463 {
1464 if (dlg.GetSelectedStyleDefinition())
1465 dlg.ApplyStyle();
1466 }
1467}
1468
082cfe55
JS
1469void MyFrame::OnItemizeList(wxCommandEvent& WXUNUSED(event))
1470{
8881d9f0 1471 if (m_richTextCtrl->HasSelection())
082cfe55 1472 {
8881d9f0
JS
1473 wxRichTextRange range = m_richTextCtrl->GetSelectionRange();
1474 m_richTextCtrl->SetListStyle(range, wxT("Bullet List 1"));
082cfe55
JS
1475 }
1476}
1477
1478void MyFrame::OnRenumberList(wxCommandEvent& WXUNUSED(event))
1479{
8881d9f0 1480 if (m_richTextCtrl->HasSelection())
082cfe55 1481 {
8881d9f0
JS
1482 wxRichTextRange range = m_richTextCtrl->GetSelectionRange();
1483 m_richTextCtrl->NumberList(range, NULL, wxRICHTEXT_SETSTYLE_WITH_UNDO|wxRICHTEXT_SETSTYLE_RENUMBER);
082cfe55
JS
1484 }
1485}
1486
1487void MyFrame::OnPromoteList(wxCommandEvent& WXUNUSED(event))
1488{
8881d9f0 1489 if (m_richTextCtrl->HasSelection())
082cfe55 1490 {
8881d9f0
JS
1491 wxRichTextRange range = m_richTextCtrl->GetSelectionRange();
1492 m_richTextCtrl->PromoteList(1, range, NULL);
082cfe55
JS
1493 }
1494}
1495
1496void MyFrame::OnDemoteList(wxCommandEvent& WXUNUSED(event))
1497{
8881d9f0 1498 if (m_richTextCtrl->HasSelection())
082cfe55 1499 {
8881d9f0
JS
1500 wxRichTextRange range = m_richTextCtrl->GetSelectionRange();
1501 m_richTextCtrl->PromoteList(-1, range, NULL);
082cfe55
JS
1502 }
1503}
1504
1505void MyFrame::OnClearList(wxCommandEvent& WXUNUSED(event))
1506{
8881d9f0 1507 if (m_richTextCtrl->HasSelection())
082cfe55 1508 {
8881d9f0
JS
1509 wxRichTextRange range = m_richTextCtrl->GetSelectionRange();
1510 m_richTextCtrl->ClearListStyle(range);
082cfe55
JS
1511 }
1512}
1513
720cc10a
JS
1514void MyFrame::OnInsertURL(wxCommandEvent& WXUNUSED(event))
1515{
1516 wxString url = wxGetTextFromUser(_("URL:"), _("Insert URL"));
1517 if (!url.IsEmpty())
1518 {
720cc10a
JS
1519 // Make a style suitable for showing a URL
1520 wxRichTextAttr urlStyle;
1521 urlStyle.SetTextColour(*wxBLUE);
1522 urlStyle.SetFontUnderlined(true);
1523
8881d9f0
JS
1524 m_richTextCtrl->BeginStyle(urlStyle);
1525 m_richTextCtrl->BeginURL(url);
1526 m_richTextCtrl->WriteText(url);
1527 m_richTextCtrl->EndURL();
1528 m_richTextCtrl->EndStyle();
720cc10a
JS
1529 }
1530}
1531
1532void MyFrame::OnURL(wxTextUrlEvent& event)
1533{
1534 wxMessageBox(event.GetString());
1535}
1536
1537// Veto style sheet replace events when loading from XML, since we want
1538// to keep the original style sheet.
1539void MyFrame::OnStyleSheetReplacing(wxRichTextEvent& event)
1540{
1541 event.Veto();
1542}
8881d9f0
JS
1543
1544void MyFrame::OnPrint(wxCommandEvent& WXUNUSED(event))
1545{
1546 wxGetApp().GetPrinting()->PrintBuffer(m_richTextCtrl->GetBuffer());
1547}
1548
1549void MyFrame::OnPreview(wxCommandEvent& WXUNUSED(event))
1550{
1551 wxGetApp().GetPrinting()->PreviewBuffer(m_richTextCtrl->GetBuffer());
1552}
1553
1554void MyFrame::OnPageSetup(wxCommandEvent& WXUNUSED(event))
1555{
1556 wxGetApp().GetPrinting()->PageSetup();
1557}