]> git.saurik.com Git - wxWidgets.git/blob - src/richtext/richtextstyledlg.cpp
Added a list style editor page to the formatting dialog.
[wxWidgets.git] / src / richtext / richtextstyledlg.cpp
1 /////////////////////////////////////////////////////////////////////////////
2 // Name: richtextstyledlg.cpp
3 // Purpose:
4 // Author: Julian Smart
5 // Modified by:
6 // Created: 10/5/2006 12:05:31 PM
7 // RCS-ID:
8 // Copyright: (c) Julian Smart
9 // Licence:
10 /////////////////////////////////////////////////////////////////////////////
11
12 // For compilers that support precompilation, includes "wx/wx.h".
13 #include "wx/wxprec.h"
14
15 #ifdef __BORLANDC__
16 #pragma hdrstop
17 #endif
18
19 #ifndef WX_PRECOMP
20 #include "wx/wx.h"
21 #endif
22
23 ////@begin includes
24 ////@end includes
25
26 #include "wx/richtext/richtextstyledlg.h"
27 #include "wx/richtext/richtextformatdlg.h"
28
29 ////@begin XPM images
30 ////@end XPM images
31
32 /*!
33 * wxRichTextStyleOrganiserDialog type definition
34 */
35
36 bool wxRichTextStyleOrganiserDialog::sm_showToolTips = false;
37
38 IMPLEMENT_DYNAMIC_CLASS( wxRichTextStyleOrganiserDialog, wxDialog )
39
40 /*!
41 * wxRichTextStyleOrganiserDialog event table definition
42 */
43
44 BEGIN_EVENT_TABLE( wxRichTextStyleOrganiserDialog, wxDialog )
45
46 EVT_LISTBOX(wxID_ANY, wxRichTextStyleOrganiserDialog::OnListSelection)
47
48 ////@begin wxRichTextStyleOrganiserDialog event table entries
49 EVT_BUTTON( ID_RICHTEXTSTYLEORGANISERDIALOG_NEW_CHAR, wxRichTextStyleOrganiserDialog::OnNewCharClick )
50 EVT_UPDATE_UI( ID_RICHTEXTSTYLEORGANISERDIALOG_NEW_CHAR, wxRichTextStyleOrganiserDialog::OnNewCharUpdate )
51
52 EVT_BUTTON( ID_RICHTEXTSTYLEORGANISERDIALOG_NEW_PARA, wxRichTextStyleOrganiserDialog::OnNewParaClick )
53 EVT_UPDATE_UI( ID_RICHTEXTSTYLEORGANISERDIALOG_NEW_PARA, wxRichTextStyleOrganiserDialog::OnNewParaUpdate )
54
55 EVT_BUTTON( ID_RICHTEXTSTYLEORGANISERDIALOG_NEW_LIST, wxRichTextStyleOrganiserDialog::OnNewListClick )
56 EVT_UPDATE_UI( ID_RICHTEXTSTYLEORGANISERDIALOG_NEW_LIST, wxRichTextStyleOrganiserDialog::OnNewListUpdate )
57
58 EVT_BUTTON( ID_RICHTEXTSTYLEORGANISERDIALOG_APPLY, wxRichTextStyleOrganiserDialog::OnApplyClick )
59 EVT_UPDATE_UI( ID_RICHTEXTSTYLEORGANISERDIALOG_APPLY, wxRichTextStyleOrganiserDialog::OnApplyUpdate )
60
61 EVT_BUTTON( ID_RICHTEXTSTYLEORGANISERDIALOG_RENAME, wxRichTextStyleOrganiserDialog::OnRenameClick )
62 EVT_UPDATE_UI( ID_RICHTEXTSTYLEORGANISERDIALOG_RENAME, wxRichTextStyleOrganiserDialog::OnRenameUpdate )
63
64 EVT_BUTTON( ID_RICHTEXTSTYLEORGANISERDIALOG_EDIT, wxRichTextStyleOrganiserDialog::OnEditClick )
65 EVT_UPDATE_UI( ID_RICHTEXTSTYLEORGANISERDIALOG_EDIT, wxRichTextStyleOrganiserDialog::OnEditUpdate )
66
67 EVT_BUTTON( ID_RICHTEXTSTYLEORGANISERDIALOG_DELETE, wxRichTextStyleOrganiserDialog::OnDeleteClick )
68 EVT_UPDATE_UI( ID_RICHTEXTSTYLEORGANISERDIALOG_DELETE, wxRichTextStyleOrganiserDialog::OnDeleteUpdate )
69
70 ////@end wxRichTextStyleOrganiserDialog event table entries
71
72 END_EVENT_TABLE()
73
74 /*!
75 * wxRichTextStyleOrganiserDialog constructors
76 */
77
78 wxRichTextStyleOrganiserDialog::wxRichTextStyleOrganiserDialog( )
79 {
80 Init();
81 }
82
83 wxRichTextStyleOrganiserDialog::wxRichTextStyleOrganiserDialog( int flags, wxRichTextStyleSheet* sheet, wxRichTextCtrl* ctrl, wxWindow* parent, wxWindowID id, const wxString& caption, const wxPoint& pos, const wxSize& size, long style )
84 {
85 Init();
86 Create(flags, sheet, ctrl, parent, id, caption, pos, size, style);
87 }
88
89 /*!
90 * Member initialisation for wxSymbolPickerDialog
91 */
92
93 void wxRichTextStyleOrganiserDialog::Init()
94 {
95 m_richTextStyleSheet = NULL;
96 m_richTextCtrl = NULL;
97 m_dontUpdate = NULL;
98 m_flags = 0;
99 m_restartNumbering = true;
100
101 ////@begin wxRichTextStyleOrganiserDialog member initialisation
102 m_innerSizer = NULL;
103 m_buttonSizerParent = NULL;
104 m_stylesListBox = NULL;
105 m_previewCtrl = NULL;
106 m_buttonSizer = NULL;
107 m_newCharacter = NULL;
108 m_newParagraph = NULL;
109 m_newList = NULL;
110 m_applyStyle = NULL;
111 m_renameStyle = NULL;
112 m_editStyle = NULL;
113 m_deleteStyle = NULL;
114 m_closeButton = NULL;
115 m_bottomButtonSizer = NULL;
116 m_restartNumberingCtrl = NULL;
117 m_okButton = NULL;
118 m_cancelButton = NULL;
119 ////@end wxRichTextStyleOrganiserDialog member initialisation
120 }
121
122 /*!
123 * wxRichTextStyleOrganiserDialog creator
124 */
125
126 bool wxRichTextStyleOrganiserDialog::Create( int flags, wxRichTextStyleSheet* sheet, wxRichTextCtrl* ctrl, wxWindow* parent, wxWindowID id, const wxString& caption, const wxPoint& pos, const wxSize& size, long style )
127 {
128 m_richTextStyleSheet = sheet;
129 m_richTextCtrl = ctrl;
130 m_flags = flags;
131
132 ////@begin wxRichTextStyleOrganiserDialog creation
133 SetExtraStyle(GetExtraStyle()|wxWS_EX_BLOCK_EVENTS|wxDIALOG_EX_CONTEXTHELP);
134 wxDialog::Create( parent, id, caption, pos, size, style );
135
136 CreateControls();
137 if (GetSizer())
138 {
139 GetSizer()->SetSizeHints(this);
140 }
141 Centre();
142 ////@end wxRichTextStyleOrganiserDialog creation
143 return true;
144 }
145
146 /*!
147 * Control creation for wxRichTextStyleOrganiserDialog
148 */
149
150 void wxRichTextStyleOrganiserDialog::CreateControls()
151 {
152 bool hideTypeSelector = false;
153 wxRichTextStyleListBox::wxRichTextStyleType typesToShow = wxRichTextStyleListBox::wxRICHTEXT_STYLE_ALL;
154
155 if ((m_flags & wxRICHTEXT_ORGANISER_SHOW_CHARACTER) != 0)
156 {
157 typesToShow = wxRichTextStyleListBox::wxRICHTEXT_STYLE_CHARACTER;
158 hideTypeSelector = true;
159 }
160 else if ((m_flags & wxRICHTEXT_ORGANISER_SHOW_PARAGRAPH) != 0)
161 {
162 typesToShow = wxRichTextStyleListBox::wxRICHTEXT_STYLE_PARAGRAPH;
163 hideTypeSelector = true;
164 }
165 else if ((m_flags & wxRICHTEXT_ORGANISER_SHOW_LIST) != 0)
166 {
167 typesToShow = wxRichTextStyleListBox::wxRICHTEXT_STYLE_LIST;
168 hideTypeSelector = true;
169 }
170 else
171 {
172 // wxRICHTEXT_ORGANISER_SHOW_ALL is implied if the other styles aren't included
173 }
174
175 long listCtrlStyle = 0;
176 if (hideTypeSelector)
177 listCtrlStyle = wxRICHTEXTSTYLELIST_HIDE_TYPE_SELECTOR;
178
179 ////@begin wxRichTextStyleOrganiserDialog content construction
180 wxRichTextStyleOrganiserDialog* itemDialog1 = this;
181
182 wxBoxSizer* itemBoxSizer2 = new wxBoxSizer(wxVERTICAL);
183 itemDialog1->SetSizer(itemBoxSizer2);
184
185 m_innerSizer = new wxBoxSizer(wxVERTICAL);
186 itemBoxSizer2->Add(m_innerSizer, 1, wxGROW|wxALL, 5);
187
188 m_buttonSizerParent = new wxBoxSizer(wxHORIZONTAL);
189 m_innerSizer->Add(m_buttonSizerParent, 1, wxGROW, 5);
190
191 wxBoxSizer* itemBoxSizer5 = new wxBoxSizer(wxVERTICAL);
192 m_buttonSizerParent->Add(itemBoxSizer5, 1, wxGROW, 5);
193
194 wxStaticText* itemStaticText6 = new wxStaticText( itemDialog1, wxID_STATIC, _("&Styles:"), wxDefaultPosition, wxDefaultSize, 0 );
195 itemBoxSizer5->Add(itemStaticText6, 0, wxALIGN_LEFT|wxLEFT|wxRIGHT|wxTOP|wxADJUST_MINSIZE, 5);
196
197 m_stylesListBox = new wxRichTextStyleListCtrl( itemDialog1, ID_RICHTEXTSTYLEORGANISERDIALOG_STYLES, wxDefaultPosition, wxSize(200, 350), wxSIMPLE_BORDER|listCtrlStyle );
198 m_stylesListBox->SetHelpText(_("The available styles."));
199 if (ShowToolTips())
200 m_stylesListBox->SetToolTip(_("The available styles."));
201 itemBoxSizer5->Add(m_stylesListBox, 1, wxGROW|wxALL, 5);
202
203 wxBoxSizer* itemBoxSizer8 = new wxBoxSizer(wxVERTICAL);
204 m_buttonSizerParent->Add(itemBoxSizer8, 0, wxGROW, 5);
205
206 wxStaticText* itemStaticText9 = new wxStaticText( itemDialog1, wxID_STATIC, _(" "), wxDefaultPosition, wxDefaultSize, 0 );
207 itemBoxSizer8->Add(itemStaticText9, 0, wxALIGN_LEFT|wxLEFT|wxRIGHT|wxTOP|wxADJUST_MINSIZE, 5);
208
209 m_previewCtrl = new wxRichTextCtrl( itemDialog1, ID_RICHTEXTSTYLEORGANISERDIALOG_PREVIEW, wxEmptyString, wxDefaultPosition, wxSize(310, 200), wxSIMPLE_BORDER|wxTE_READONLY );
210 m_previewCtrl->SetHelpText(_("The style preview."));
211 if (ShowToolTips())
212 m_previewCtrl->SetToolTip(_("The style preview."));
213 itemBoxSizer8->Add(m_previewCtrl, 1, wxGROW|wxALL, 5);
214
215 m_buttonSizer = new wxBoxSizer(wxVERTICAL);
216 m_buttonSizerParent->Add(m_buttonSizer, 0, wxGROW, 5);
217
218 wxStaticText* itemStaticText12 = new wxStaticText( itemDialog1, wxID_STATIC, _(" "), wxDefaultPosition, wxDefaultSize, 0 );
219 m_buttonSizer->Add(itemStaticText12, 0, wxALIGN_LEFT|wxLEFT|wxRIGHT|wxTOP|wxADJUST_MINSIZE, 5);
220
221 m_newCharacter = new wxButton( itemDialog1, ID_RICHTEXTSTYLEORGANISERDIALOG_NEW_CHAR, _("New &Character Style..."), wxDefaultPosition, wxDefaultSize, 0 );
222 m_newCharacter->SetHelpText(_("Click to create a new character style."));
223 if (ShowToolTips())
224 m_newCharacter->SetToolTip(_("Click to create a new character style."));
225 m_buttonSizer->Add(m_newCharacter, 0, wxGROW|wxALL, 5);
226
227 m_newParagraph = new wxButton( itemDialog1, ID_RICHTEXTSTYLEORGANISERDIALOG_NEW_PARA, _("New &Paragraph Style..."), wxDefaultPosition, wxDefaultSize, 0 );
228 m_newParagraph->SetHelpText(_("Click to create a new paragraph style."));
229 if (ShowToolTips())
230 m_newParagraph->SetToolTip(_("Click to create a new paragraph style."));
231 m_buttonSizer->Add(m_newParagraph, 0, wxGROW|wxLEFT|wxRIGHT|wxBOTTOM, 5);
232
233 m_newList = new wxButton( itemDialog1, ID_RICHTEXTSTYLEORGANISERDIALOG_NEW_LIST, _("New &List Style..."), wxDefaultPosition, wxDefaultSize, 0 );
234 m_newList->SetHelpText(_("Click to create a new list style."));
235 if (ShowToolTips())
236 m_newList->SetToolTip(_("Click to create a new list style."));
237 m_buttonSizer->Add(m_newList, 0, wxGROW|wxLEFT|wxRIGHT|wxBOTTOM, 5);
238
239 m_buttonSizer->Add(5, 5, 1, wxALIGN_CENTER_HORIZONTAL|wxALL, 5);
240
241 m_applyStyle = new wxButton( itemDialog1, ID_RICHTEXTSTYLEORGANISERDIALOG_APPLY, _("&Apply Style"), wxDefaultPosition, wxDefaultSize, 0 );
242 m_applyStyle->SetHelpText(_("Click to apply the selected style."));
243 if (ShowToolTips())
244 m_applyStyle->SetToolTip(_("Click to apply the selected style."));
245 m_buttonSizer->Add(m_applyStyle, 0, wxGROW|wxALL, 5);
246
247 m_renameStyle = new wxButton( itemDialog1, ID_RICHTEXTSTYLEORGANISERDIALOG_RENAME, _("&Rename Style..."), wxDefaultPosition, wxDefaultSize, 0 );
248 m_renameStyle->SetHelpText(_("Click to rename the selected style."));
249 if (ShowToolTips())
250 m_renameStyle->SetToolTip(_("Click to rename the selected style."));
251 m_buttonSizer->Add(m_renameStyle, 0, wxGROW|wxLEFT|wxRIGHT|wxBOTTOM, 5);
252
253 m_editStyle = new wxButton( itemDialog1, ID_RICHTEXTSTYLEORGANISERDIALOG_EDIT, _("&Edit Style..."), wxDefaultPosition, wxDefaultSize, 0 );
254 m_editStyle->SetHelpText(_("Click to edit the selected style."));
255 if (ShowToolTips())
256 m_editStyle->SetToolTip(_("Click to edit the selected style."));
257 m_buttonSizer->Add(m_editStyle, 0, wxGROW|wxLEFT|wxRIGHT|wxBOTTOM, 5);
258
259 m_deleteStyle = new wxButton( itemDialog1, ID_RICHTEXTSTYLEORGANISERDIALOG_DELETE, _("&Delete Style..."), wxDefaultPosition, wxDefaultSize, 0 );
260 m_deleteStyle->SetHelpText(_("Click to delete the selected style."));
261 if (ShowToolTips())
262 m_deleteStyle->SetToolTip(_("Click to delete the selected style."));
263 m_buttonSizer->Add(m_deleteStyle, 0, wxGROW|wxLEFT|wxRIGHT|wxBOTTOM, 5);
264
265 m_buttonSizer->Add(5, 5, 1, wxALIGN_CENTER_HORIZONTAL|wxALL, 5);
266
267 m_closeButton = new wxButton( itemDialog1, wxID_CANCEL, _("Close"), wxDefaultPosition, wxDefaultSize, 0 );
268 m_closeButton->SetDefault();
269 m_closeButton->SetHelpText(_("Click to close this window."));
270 if (ShowToolTips())
271 m_closeButton->SetToolTip(_("Click to close this window."));
272 m_buttonSizer->Add(m_closeButton, 0, wxGROW|wxALL, 5);
273
274 m_bottomButtonSizer = new wxBoxSizer(wxHORIZONTAL);
275 m_innerSizer->Add(m_bottomButtonSizer, 0, wxGROW, 5);
276
277 m_restartNumberingCtrl = new wxCheckBox( itemDialog1, ID_RICHTEXTSTYLEORGANISERDIALOG_RESTART_NUMBERING, _("&Restart numbering"), wxDefaultPosition, wxDefaultSize, 0 );
278 m_restartNumberingCtrl->SetValue(false);
279 m_restartNumberingCtrl->SetHelpText(_("Check to restart numbering."));
280 if (ShowToolTips())
281 m_restartNumberingCtrl->SetToolTip(_("Check to restart numbering."));
282 m_bottomButtonSizer->Add(m_restartNumberingCtrl, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5);
283
284 m_bottomButtonSizer->Add(5, 5, 1, wxALIGN_CENTER_VERTICAL|wxALL, 5);
285
286 m_okButton = new wxButton( itemDialog1, wxID_OK, _("OK"), wxDefaultPosition, wxDefaultSize, 0 );
287 m_okButton->SetDefault();
288 m_okButton->SetHelpText(_("Click to confirm your selection."));
289 if (ShowToolTips())
290 m_okButton->SetToolTip(_("Click to confirm your selection."));
291 m_bottomButtonSizer->Add(m_okButton, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5);
292
293 m_cancelButton = new wxButton( itemDialog1, wxID_CANCEL, _("Cancel"), wxDefaultPosition, wxDefaultSize, 0 );
294 m_cancelButton->SetHelpText(_("Click to cancel this window."));
295 if (ShowToolTips())
296 m_cancelButton->SetToolTip(_("Click to cancel this window."));
297 m_bottomButtonSizer->Add(m_cancelButton, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5);
298
299 ////@end wxRichTextStyleOrganiserDialog content construction
300
301 if ((m_flags & wxRICHTEXT_ORGANISER_CREATE_STYLES) == 0)
302 {
303 m_buttonSizer->Show(m_newCharacter, false);
304 m_buttonSizer->Show(m_newParagraph, false);
305 m_buttonSizer->Show(m_newList, false);
306 }
307 if ((m_flags & wxRICHTEXT_ORGANISER_DELETE_STYLES) == 0)
308 {
309 m_buttonSizer->Show(m_deleteStyle, false);
310 }
311 if ((m_flags & wxRICHTEXT_ORGANISER_APPLY_STYLES) == 0)
312 {
313 m_buttonSizer->Show(m_applyStyle, false);
314 }
315 if ((m_flags & wxRICHTEXT_ORGANISER_EDIT_STYLES) == 0)
316 {
317 m_buttonSizer->Show(m_editStyle, false);
318 }
319 if ((m_flags & wxRICHTEXT_ORGANISER_RENAME_STYLES) == 0)
320 {
321 m_buttonSizer->Show(m_renameStyle, false);
322 }
323 if ((m_flags & wxRICHTEXT_ORGANISER_RENUMBER) == 0)
324 {
325 m_bottomButtonSizer->Show(m_restartNumberingCtrl, false);
326 }
327
328 if ((m_flags & wxRICHTEXT_ORGANISER_OK_CANCEL) == 0)
329 {
330 m_bottomButtonSizer->Show(m_okButton, false);
331 m_bottomButtonSizer->Show(m_cancelButton, false);
332 }
333 else
334 {
335 m_buttonSizer->Show(m_closeButton, false);
336 }
337
338 // No buttons in the vertical group are shown, so hide the whole sizer
339 if ((m_flags & wxRICHTEXT_ORGANISER_ORGANISE) == 0)
340 {
341 m_buttonSizerParent->Show(m_buttonSizer, false);
342 }
343
344 // No buttons in the horizontal group are shown, so hide the whole sizer
345 if ((m_flags & (wxRICHTEXT_ORGANISER_OK_CANCEL|wxRICHTEXT_ORGANISER_RENUMBER)) == 0)
346 {
347 m_innerSizer->Show(m_bottomButtonSizer, false);
348 }
349
350 if (hideTypeSelector)
351 {
352 m_stylesListBox->GetStyleListBox()->SetStyleType(typesToShow);
353 }
354
355 m_stylesListBox->SetStyleSheet(m_richTextStyleSheet);
356 m_stylesListBox->SetRichTextCtrl(m_richTextCtrl);
357 m_stylesListBox->UpdateStyles();
358 m_stylesListBox->GetStyleListBox()->SetAutoSetSelection(false); // stop idle-time auto selection
359 if (m_stylesListBox->GetStyleListBox()->GetItemCount() > 0)
360 {
361 m_stylesListBox->GetStyleListBox()->SetSelection(0);
362 ShowPreview();
363 }
364 }
365
366 /*!
367 * Should we show tooltips?
368 */
369
370 /// Get selected style name or definition
371 wxString wxRichTextStyleOrganiserDialog::GetSelectedStyle() const
372 {
373 wxRichTextStyleDefinition* def = GetSelectedStyleDefinition();
374 if (def)
375 return def->GetName();
376 else
377 return wxEmptyString;
378 }
379
380 wxRichTextStyleDefinition* wxRichTextStyleOrganiserDialog::GetSelectedStyleDefinition() const
381 {
382 int sel = m_stylesListBox->GetStyleListBox()->GetSelection();
383 return m_stylesListBox->GetStyleListBox()->GetStyle(sel);
384 }
385
386
387 /// Transfer data from/to window
388 bool wxRichTextStyleOrganiserDialog::TransferDataFromWindow()
389 {
390 if (!wxDialog::TransferDataFromWindow())
391 return false;
392
393 m_restartNumbering = m_restartNumberingCtrl->GetValue();
394
395 return true;
396 }
397
398 bool wxRichTextStyleOrganiserDialog::TransferDataToWindow()
399 {
400 if (!wxDialog::TransferDataToWindow())
401 return false;
402
403 m_restartNumberingCtrl->SetValue(m_restartNumbering);
404
405 return true;
406 }
407
408 /// Show preview for given or selected preview
409 void wxRichTextStyleOrganiserDialog::ShowPreview(int sel)
410 {
411 static const wxChar* s_para1 = wxT("Lorem ipsum dolor sit amet, consectetuer adipiscing elit. \
412 Nullam ante sapien, vestibulum nonummy, pulvinar sed, luctus ut, lacus.");
413
414 static const wxChar* s_para2List = wxT("Duis pharetra consequat dui. Nullam vitae justo id mauris lobortis interdum.");
415
416 static const wxChar* s_para2 = wxT("Duis pharetra consequat dui. Cum sociis natoque penatibus \
417 et magnis dis parturient montes, nascetur ridiculus mus. Nullam vitae justo id mauris lobortis interdum.");
418
419 static const wxChar* s_para3 = wxT("\nInteger convallis dolor at augue \
420 iaculis malesuada. Donec bibendum ipsum ut ante porta fringilla.\n");
421
422 if (sel == -1)
423 {
424 sel = m_stylesListBox->GetStyleListBox()->GetSelection();
425 if (sel == -1)
426 return;
427 }
428
429 wxRichTextStyleDefinition* def = m_stylesListBox->GetStyleListBox()->GetStyle(sel);
430
431 wxRichTextListStyleDefinition* listDef = wxDynamicCast(def, wxRichTextListStyleDefinition);
432 //wxRichTextParagraphStyleDefinition* paraDef = wxDynamicCast(def, wxRichTextParagraphStyleDefinition);
433 //wxRichTextCharacterStyleDefinition* charDef = wxDynamicCast(def, wxRichTextCharacterStyleDefinition);
434
435 wxTextAttrEx attr(def->GetStyle());
436 #if 0
437 attr.SetFlags(attr.GetFlags() &
438 (wxTEXT_ATTR_ALIGNMENT|wxTEXT_ATTR_LEFT_INDENT|wxTEXT_ATTR_RIGHT_INDENT|wxTEXT_ATTR_PARA_SPACING_BEFORE|wxTEXT_ATTR_PARA_SPACING_AFTER|
439 wxTEXT_ATTR_LINE_SPACING|
440 wxTEXT_ATTR_BULLET_STYLE|wxTEXT_ATTR_BULLET_NUMBER|wxTEXT_ATTR_BULLET_SYMBOL));
441 #endif
442
443 wxFont font(m_previewCtrl->GetFont());
444 font.SetPointSize(9);
445 m_previewCtrl->SetFont(font);
446
447 wxTextAttrEx normalParaAttr;
448 normalParaAttr.SetFont(font);
449 normalParaAttr.SetTextColour(wxColour(wxT("LIGHT GREY")));
450
451 m_previewCtrl->Freeze();
452 m_previewCtrl->Clear();
453
454 m_previewCtrl->BeginStyle(normalParaAttr);
455 m_previewCtrl->WriteText(s_para1);
456 m_previewCtrl->EndStyle();
457
458 m_previewCtrl->BeginStyle(attr);
459
460 if (listDef)
461 {
462 int i;
463 for (i = 0; i < 10; i++)
464 {
465 wxTextAttrEx levelAttr = * listDef->GetLevelAttributes(i);
466 levelAttr.SetBulletNumber(1);
467 m_previewCtrl->BeginStyle(levelAttr);
468 m_previewCtrl->WriteText(wxString::Format(wxT("\nList level %d. "), i+1) + s_para2List);
469 m_previewCtrl->EndStyle();
470 }
471 }
472 else
473 {
474 m_previewCtrl->WriteText(wxString(wxT("\n")) + s_para2);
475 }
476
477 m_previewCtrl->EndStyle();
478
479 m_previewCtrl->BeginStyle(normalParaAttr);
480 m_previewCtrl->WriteText(s_para3);
481 m_previewCtrl->EndStyle();
482
483 m_previewCtrl->Thaw();
484 }
485
486 /// Clears the preview
487 void wxRichTextStyleOrganiserDialog::ClearPreview()
488 {
489 m_richTextCtrl->Clear();
490 }
491
492 bool wxRichTextStyleOrganiserDialog::ApplyStyle(wxRichTextCtrl* ctrl)
493 {
494 int sel = m_stylesListBox->GetStyleListBox()->GetSelection();
495 if (sel == -1)
496 return false;
497 if (!ctrl)
498 ctrl = GetRichTextCtrl();
499 if (!ctrl)
500 return false;
501 if (!ctrl->HasSelection())
502 return false;
503
504
505 wxRichTextStyleDefinition* def = m_stylesListBox->GetStyleListBox()->GetStyle(sel);
506 wxRichTextListStyleDefinition* listDef = wxDynamicCast(def, wxRichTextListStyleDefinition);
507
508 if (listDef && m_restartNumberingCtrl->GetValue())
509 {
510 wxRichTextRange range = ctrl->GetSelectionRange();
511 return ctrl->SetListStyle(range, listDef, wxRICHTEXT_SETSTYLE_WITH_UNDO|wxRICHTEXT_SETSTYLE_RENUMBER);
512 }
513 else
514 {
515 return ctrl->ApplyStyle(def);
516 }
517 }
518
519 /*!
520 * Get bitmap resources
521 */
522
523 wxBitmap wxRichTextStyleOrganiserDialog::GetBitmapResource( const wxString& name )
524 {
525 // Bitmap retrieval
526 ////@begin wxRichTextStyleOrganiserDialog bitmap retrieval
527 wxUnusedVar(name);
528 return wxNullBitmap;
529 ////@end wxRichTextStyleOrganiserDialog bitmap retrieval
530 }
531
532 /*!
533 * Get icon resources
534 */
535
536 wxIcon wxRichTextStyleOrganiserDialog::GetIconResource( const wxString& name )
537 {
538 // Icon retrieval
539 ////@begin wxRichTextStyleOrganiserDialog icon retrieval
540 wxUnusedVar(name);
541 return wxNullIcon;
542 ////@end wxRichTextStyleOrganiserDialog icon retrieval
543 }
544
545 /*!
546 * wxEVT_COMMAND_BUTTON_CLICKED event handler for ID_RICHTEXTSTYLEORGANISERDIALOG_APPLY
547 */
548
549 void wxRichTextStyleOrganiserDialog::OnApplyClick( wxCommandEvent& WXUNUSED(event) )
550 {
551 ApplyStyle();
552 }
553
554 /*!
555 * wxEVT_UPDATE_UI event handler for ID_RICHTEXTSTYLEORGANISERDIALOG_APPLY
556 */
557
558 void wxRichTextStyleOrganiserDialog::OnApplyUpdate( wxUpdateUIEvent& event )
559 {
560 event.Enable(((GetFlags() & wxRICHTEXT_ORGANISER_APPLY_STYLES) != 0) && m_stylesListBox->GetStyleListBox()->GetSelection() != wxNOT_FOUND);
561 }
562
563
564 /*!
565 * wxEVT_COMMAND_BUTTON_CLICKED event handler for ID_RICHTEXTSTYLEORGANISERDIALOG_NEW_CHAR
566 */
567
568 void wxRichTextStyleOrganiserDialog::OnNewCharClick( wxCommandEvent& WXUNUSED(event) )
569 {
570 wxString styleName = wxGetTextFromUser(_("Enter a character style name"), _("New Style"));
571 if (!styleName.IsEmpty())
572 {
573 if (GetStyleSheet()->FindCharacterStyle(styleName))
574 {
575 wxMessageBox(_("Sorry, that name is taken. Please choose another."), _("New Style"), wxICON_EXCLAMATION|wxOK, this);
576 return;
577 }
578
579 wxRichTextCharacterStyleDefinition* style = new wxRichTextCharacterStyleDefinition(styleName);
580
581 int pages = wxRICHTEXT_FORMAT_FONT|wxRICHTEXT_FORMAT_STYLE_EDITOR;
582 wxRichTextFormattingDialog formatDlg;
583 formatDlg.SetStyleDefinition(*style, GetStyleSheet());
584 formatDlg.Create(pages, this);
585
586 if (formatDlg.ShowModal() == wxID_OK)
587 {
588 wxRichTextCharacterStyleDefinition* charDef = wxDynamicCast(formatDlg.GetStyleDefinition(), wxRichTextCharacterStyleDefinition);
589
590 (*((wxRichTextCharacterStyleDefinition* ) style)) = (*charDef);
591
592 GetStyleSheet()->AddCharacterStyle(style);
593
594 m_stylesListBox->UpdateStyles();
595 ShowPreview();
596 }
597 else
598 delete style;
599 }
600 }
601
602 /*!
603 * wxEVT_UPDATE_UI event handler for ID_RICHTEXTSTYLEORGANISERDIALOG_NEW_CHAR
604 */
605
606 void wxRichTextStyleOrganiserDialog::OnNewCharUpdate( wxUpdateUIEvent& event )
607 {
608 event.Enable((GetFlags() & wxRICHTEXT_ORGANISER_CREATE_STYLES) != 0);
609 }
610
611
612 /*!
613 * wxEVT_COMMAND_BUTTON_CLICKED event handler for ID_RICHTEXTSTYLEORGANISERDIALOG_NEW_PARA
614 */
615
616 void wxRichTextStyleOrganiserDialog::OnNewParaClick( wxCommandEvent& WXUNUSED(event) )
617 {
618 wxString styleName = wxGetTextFromUser(_("Enter a paragraph style name"), _("New Style"));
619 if (!styleName.IsEmpty())
620 {
621 if (GetStyleSheet()->FindParagraphStyle(styleName))
622 {
623 wxMessageBox(_("Sorry, that name is taken. Please choose another."), _("New Style"), wxICON_EXCLAMATION|wxOK, this);
624 return;
625 }
626
627 wxRichTextParagraphStyleDefinition* style = new wxRichTextParagraphStyleDefinition(styleName);
628
629 int pages = wxRICHTEXT_FORMAT_STYLE_EDITOR|wxRICHTEXT_FORMAT_FONT|wxRICHTEXT_FORMAT_INDENTS_SPACING|wxRICHTEXT_FORMAT_TABS|wxRICHTEXT_FORMAT_BULLETS;
630 wxRichTextFormattingDialog formatDlg;
631 formatDlg.SetStyleDefinition(*style, GetStyleSheet());
632 formatDlg.Create(pages, this);
633
634 if (formatDlg.ShowModal() == wxID_OK)
635 {
636 wxRichTextParagraphStyleDefinition* paraDef = wxDynamicCast(formatDlg.GetStyleDefinition(), wxRichTextParagraphStyleDefinition);
637
638 (*((wxRichTextParagraphStyleDefinition* ) style)) = (*paraDef);
639
640 GetStyleSheet()->AddParagraphStyle(style);
641
642 m_stylesListBox->UpdateStyles();
643 ShowPreview();
644 }
645 else
646 delete style;
647 }
648 }
649
650 /*!
651 * wxEVT_UPDATE_UI event handler for ID_RICHTEXTSTYLEORGANISERDIALOG_NEW_PARA
652 */
653
654 void wxRichTextStyleOrganiserDialog::OnNewParaUpdate( wxUpdateUIEvent& event )
655 {
656 event.Enable((GetFlags() & wxRICHTEXT_ORGANISER_CREATE_STYLES) != 0);
657 }
658
659
660 /*!
661 * wxEVT_COMMAND_BUTTON_CLICKED event handler for ID_RICHTEXTSTYLEORGANISERDIALOG_EDIT
662 */
663
664 void wxRichTextStyleOrganiserDialog::OnEditClick( wxCommandEvent& WXUNUSED(event) )
665 {
666 int sel = m_stylesListBox->GetStyleListBox()->GetSelection();
667 if (sel != wxNOT_FOUND)
668 {
669 wxRichTextStyleDefinition* def = m_stylesListBox->GetStyleListBox()->GetStyle(sel);
670
671 int pages = wxRICHTEXT_FORMAT_STYLE_EDITOR;
672
673 if (def->IsKindOf(CLASSINFO(wxRichTextCharacterStyleDefinition)))
674 {
675 pages |= wxRICHTEXT_FORMAT_FONT;
676 }
677 else if (def->IsKindOf(CLASSINFO(wxRichTextListStyleDefinition)))
678 {
679 pages |= wxRICHTEXT_FORMAT_LIST_STYLE|wxRICHTEXT_FORMAT_FONT|wxRICHTEXT_FORMAT_INDENTS_SPACING;
680 }
681 else if (def->IsKindOf(CLASSINFO(wxRichTextParagraphStyleDefinition)))
682 {
683 pages |= wxRICHTEXT_FORMAT_FONT|wxRICHTEXT_FORMAT_INDENTS_SPACING|wxRICHTEXT_FORMAT_TABS|wxRICHTEXT_FORMAT_BULLETS;
684 }
685
686 wxRichTextFormattingDialog formatDlg;
687 formatDlg.SetStyleDefinition(*def, GetStyleSheet());
688 formatDlg.Create(pages, this);
689
690 if (formatDlg.ShowModal() == wxID_OK)
691 {
692 wxRichTextParagraphStyleDefinition* paraDef = wxDynamicCast(formatDlg.GetStyleDefinition(), wxRichTextParagraphStyleDefinition);
693 wxRichTextCharacterStyleDefinition* charDef = wxDynamicCast(formatDlg.GetStyleDefinition(), wxRichTextCharacterStyleDefinition);
694 wxRichTextListStyleDefinition* listDef = wxDynamicCast(formatDlg.GetStyleDefinition(), wxRichTextListStyleDefinition);
695
696 if (listDef)
697 {
698 (*((wxRichTextListStyleDefinition* ) def)) = (*listDef);
699 }
700 else if (paraDef)
701 {
702 (*((wxRichTextParagraphStyleDefinition* ) def)) = (*paraDef);
703 }
704 else
705 {
706 (*((wxRichTextCharacterStyleDefinition* ) def)) = (*charDef);
707 }
708
709 m_stylesListBox->UpdateStyles();
710 ShowPreview();
711 }
712 }
713 }
714
715 /*!
716 * wxEVT_UPDATE_UI event handler for ID_RICHTEXTSTYLEORGANISERDIALOG_EDIT
717 */
718
719 void wxRichTextStyleOrganiserDialog::OnEditUpdate( wxUpdateUIEvent& event )
720 {
721 event.Enable(((GetFlags() & wxRICHTEXT_ORGANISER_EDIT_STYLES) != 0) && m_stylesListBox->GetStyleListBox()->GetSelection() != wxNOT_FOUND);
722 }
723
724
725 /*!
726 * wxEVT_COMMAND_BUTTON_CLICKED event handler for ID_RICHTEXTSTYLEORGANISERDIALOG_DELETE
727 */
728
729 void wxRichTextStyleOrganiserDialog::OnDeleteClick( wxCommandEvent& WXUNUSED(event) )
730 {
731 int sel = m_stylesListBox->GetStyleListBox()->GetSelection();
732 if (sel != wxNOT_FOUND)
733 {
734 wxRichTextStyleDefinition* def = m_stylesListBox->GetStyleListBox()->GetStyle(sel);
735 wxString name(def->GetName());
736 if (wxYES == wxMessageBox(wxString::Format(_("Delete style %s?"), (const wxChar*) name), _("Delete Style"), wxYES_NO|wxICON_QUESTION, this))
737 {
738 m_stylesListBox->GetStyleListBox()->SetItemCount(0);
739
740 if (def->IsKindOf(CLASSINFO(wxRichTextListStyleDefinition)))
741 GetStyleSheet()->RemoveListStyle((wxRichTextListStyleDefinition*) def, true);
742 else if (def->IsKindOf(CLASSINFO(wxRichTextParagraphStyleDefinition)))
743 GetStyleSheet()->RemoveParagraphStyle((wxRichTextParagraphStyleDefinition*) def, true);
744 else if (def->IsKindOf(CLASSINFO(wxRichTextCharacterStyleDefinition)))
745 GetStyleSheet()->RemoveCharacterStyle((wxRichTextCharacterStyleDefinition*) def, true);
746
747 m_stylesListBox->UpdateStyles();
748
749 if (m_stylesListBox->GetStyleListBox()->GetSelection() != -1)
750 ShowPreview();
751 else
752 ClearPreview();
753 }
754 }
755 }
756
757 /*!
758 * wxEVT_UPDATE_UI event handler for ID_RICHTEXTSTYLEORGANISERDIALOG_DELETE
759 */
760
761 void wxRichTextStyleOrganiserDialog::OnDeleteUpdate( wxUpdateUIEvent& event )
762 {
763 event.Enable(((GetFlags() & wxRICHTEXT_ORGANISER_DELETE_STYLES) != 0) && m_stylesListBox->GetStyleListBox()->GetSelection() != wxNOT_FOUND);
764 }
765
766 /*!
767 * wxEVT_COMMAND_BUTTON_CLICKED event handler for ID_RICHTEXTSTYLEORGANISERDIALOG_NEW_LIST
768 */
769
770 void wxRichTextStyleOrganiserDialog::OnNewListClick( wxCommandEvent& WXUNUSED(event) )
771 {
772 wxString styleName = wxGetTextFromUser(_("Enter a list style name"), _("New Style"));
773 if (!styleName.IsEmpty())
774 {
775 if (GetStyleSheet()->FindListStyle(styleName))
776 {
777 wxMessageBox(_("Sorry, that name is taken. Please choose another."), _("New Style"), wxICON_EXCLAMATION|wxOK, this);
778 return;
779 }
780
781 wxRichTextListStyleDefinition* style = new wxRichTextListStyleDefinition(styleName);
782
783 // Initialize the style to make it easier to edit
784 int i;
785 for (i = 0; i < 10; i++)
786 {
787 wxString bulletSymbol;
788 if (i == 0)
789 bulletSymbol = wxT("*");
790 else if (i == 1)
791 bulletSymbol = wxT("-");
792 else if (i == 2)
793 bulletSymbol = wxT("*");
794 else if (i == 3)
795 bulletSymbol = wxT("-");
796 else
797 bulletSymbol = wxT("*");
798
799 style->SetAttributes(i, (i+1)*60, 60, wxTEXT_ATTR_BULLET_STYLE_SYMBOL, bulletSymbol);
800 }
801
802 int pages = wxRICHTEXT_FORMAT_LIST_STYLE|wxRICHTEXT_FORMAT_STYLE_EDITOR|wxRICHTEXT_FORMAT_FONT|wxRICHTEXT_FORMAT_INDENTS_SPACING;
803 wxRichTextFormattingDialog formatDlg;
804 formatDlg.SetStyleDefinition(*style, GetStyleSheet());
805 formatDlg.Create(pages, this);
806
807 if (formatDlg.ShowModal() == wxID_OK)
808 {
809 wxRichTextListStyleDefinition* listDef = wxDynamicCast(formatDlg.GetStyleDefinition(), wxRichTextListStyleDefinition);
810
811 (*((wxRichTextListStyleDefinition* ) style)) = (*listDef);
812
813 GetStyleSheet()->AddListStyle(style);
814
815 m_stylesListBox->UpdateStyles();
816 ShowPreview();
817 }
818 else
819 delete style;
820 }
821 }
822
823 /*!
824 * wxEVT_UPDATE_UI event handler for ID_RICHTEXTSTYLEORGANISERDIALOG_NEW_LIST
825 */
826
827 void wxRichTextStyleOrganiserDialog::OnNewListUpdate( wxUpdateUIEvent& event )
828 {
829 event.Enable((GetFlags() & wxRICHTEXT_ORGANISER_CREATE_STYLES) != 0);
830 }
831
832 /*!
833 * wxEVT_COMMAND_BUTTON_CLICKED event handler for ID_RICHTEXTSTYLEORGANISERDIALOG_RENAME
834 */
835
836 void wxRichTextStyleOrganiserDialog::OnRenameClick( wxCommandEvent& WXUNUSED(event) )
837 {
838 }
839
840 /*!
841 * wxEVT_UPDATE_UI event handler for ID_RICHTEXTSTYLEORGANISERDIALOG_RENAME
842 */
843
844 void wxRichTextStyleOrganiserDialog::OnRenameUpdate( wxUpdateUIEvent& event )
845 {
846 event.Enable(((GetFlags() & wxRICHTEXT_ORGANISER_RENAME_STYLES) != 0) && m_stylesListBox->GetStyleListBox()->GetSelection() != wxNOT_FOUND);
847 }
848
849 /// List selection
850 void wxRichTextStyleOrganiserDialog::OnListSelection(wxCommandEvent& event)
851 {
852 if (event.GetEventObject() == m_stylesListBox->GetStyleListBox())
853 ShowPreview();
854 else
855 event.Skip();
856 }
857