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