Fixed a problem with text effects flag always being set on dialog exit
[wxWidgets.git] / src / richtext / richtextbulletspage.cpp
1 /////////////////////////////////////////////////////////////////////////////
2 // Name: src/richtext/richtextbulletspage.cpp
3 // Purpose:
4 // Author: Julian Smart
5 // Modified by:
6 // Created: 10/4/2006 10:32:31 AM
7 // RCS-ID: $Id$
8 // Copyright: (c) Julian Smart
9 // Licence: wxWindows licence
10 /////////////////////////////////////////////////////////////////////////////
11
12 #if wxUSE_RICHTEXT
13
14 #include "wx/spinctrl.h"
15 #include "wx/utils.h"
16 #include "wx/richtext/richtextbulletspage.h"
17 #include "wx/richtext/richtextsymboldlg.h"
18
19 /*!
20 * wxRichTextBulletsPage type definition
21 */
22
23 IMPLEMENT_DYNAMIC_CLASS( wxRichTextBulletsPage, wxRichTextDialogPage )
24
25 /*!
26 * wxRichTextBulletsPage event table definition
27 */
28
29 BEGIN_EVENT_TABLE( wxRichTextBulletsPage, wxRichTextDialogPage )
30
31 ////@begin wxRichTextBulletsPage event table entries
32 EVT_LISTBOX( ID_RICHTEXTBULLETSPAGE_STYLELISTBOX, wxRichTextBulletsPage::OnStylelistboxSelected )
33
34 EVT_CHECKBOX( ID_RICHTEXTBULLETSPAGE_PERIODCTRL, wxRichTextBulletsPage::OnPeriodctrlClick )
35 EVT_UPDATE_UI( ID_RICHTEXTBULLETSPAGE_PERIODCTRL, wxRichTextBulletsPage::OnPeriodctrlUpdate )
36
37 EVT_CHECKBOX( ID_RICHTEXTBULLETSPAGE_PARENTHESESCTRL, wxRichTextBulletsPage::OnParenthesesctrlClick )
38 EVT_UPDATE_UI( ID_RICHTEXTBULLETSPAGE_PARENTHESESCTRL, wxRichTextBulletsPage::OnParenthesesctrlUpdate )
39
40 EVT_CHECKBOX( ID_RICHTEXTBULLETSPAGE_RIGHTPARENTHESISCTRL, wxRichTextBulletsPage::OnRightParenthesisCtrlClick )
41 EVT_UPDATE_UI( ID_RICHTEXTBULLETSPAGE_RIGHTPARENTHESISCTRL, wxRichTextBulletsPage::OnRightParenthesisCtrlUpdate )
42
43 EVT_COMBOBOX( ID_RICHTEXTBULLETSPAGE_BULLETALIGNMENTCTRL, wxRichTextBulletsPage::OnBulletAlignmentCtrlSelected )
44
45 EVT_UPDATE_UI( ID_RICHTEXTBULLETSPAGE_SYMBOLSTATIC, wxRichTextBulletsPage::OnSymbolstaticUpdate )
46
47 EVT_COMBOBOX( ID_RICHTEXTBULLETSPAGE_SYMBOLCTRL, wxRichTextBulletsPage::OnSymbolctrlSelected )
48 EVT_TEXT( ID_RICHTEXTBULLETSPAGE_SYMBOLCTRL, wxRichTextBulletsPage::OnSymbolctrlUpdated )
49 EVT_UPDATE_UI( ID_RICHTEXTBULLETSPAGE_SYMBOLCTRL, wxRichTextBulletsPage::OnSymbolctrlUpdate )
50
51 EVT_BUTTON( ID_RICHTEXTBULLETSPAGE_CHOOSE_SYMBOL, wxRichTextBulletsPage::OnChooseSymbolClick )
52 EVT_UPDATE_UI( ID_RICHTEXTBULLETSPAGE_CHOOSE_SYMBOL, wxRichTextBulletsPage::OnChooseSymbolUpdate )
53
54 EVT_COMBOBOX( ID_RICHTEXTBULLETSPAGE_SYMBOLFONTCTRL, wxRichTextBulletsPage::OnSymbolfontctrlSelected )
55 EVT_TEXT( ID_RICHTEXTBULLETSPAGE_SYMBOLFONTCTRL, wxRichTextBulletsPage::OnSymbolfontctrlUpdated )
56 EVT_UPDATE_UI( ID_RICHTEXTBULLETSPAGE_SYMBOLFONTCTRL, wxRichTextBulletsPage::OnSymbolfontctrlUIUpdate )
57
58 EVT_UPDATE_UI( ID_RICHTEXTBULLETSPAGE_NAMESTATIC, wxRichTextBulletsPage::OnNamestaticUpdate )
59
60 EVT_COMBOBOX( ID_RICHTEXTBULLETSPAGE_NAMECTRL, wxRichTextBulletsPage::OnNamectrlSelected )
61 EVT_TEXT( ID_RICHTEXTBULLETSPAGE_NAMECTRL, wxRichTextBulletsPage::OnNamectrlUpdated )
62 EVT_UPDATE_UI( ID_RICHTEXTBULLETSPAGE_NAMECTRL, wxRichTextBulletsPage::OnNamectrlUIUpdate )
63
64 EVT_UPDATE_UI( ID_RICHTEXTBULLETSPAGE_NUMBERSTATIC, wxRichTextBulletsPage::OnNumberstaticUpdate )
65
66 EVT_SPINCTRL( ID_RICHTEXTBULLETSPAGE_NUMBERCTRL, wxRichTextBulletsPage::OnNumberctrlUpdated )
67 EVT_SPIN_UP( ID_RICHTEXTBULLETSPAGE_NUMBERCTRL, wxRichTextBulletsPage::OnNumberctrlUp )
68 EVT_SPIN_DOWN( ID_RICHTEXTBULLETSPAGE_NUMBERCTRL, wxRichTextBulletsPage::OnNumberctrlDown )
69 EVT_TEXT( ID_RICHTEXTBULLETSPAGE_NUMBERCTRL, wxRichTextBulletsPage::OnNumberctrlTextUpdated )
70 EVT_UPDATE_UI( ID_RICHTEXTBULLETSPAGE_NUMBERCTRL, wxRichTextBulletsPage::OnNumberctrlUpdate )
71
72 ////@end wxRichTextBulletsPage event table entries
73
74 END_EVENT_TABLE()
75
76 IMPLEMENT_HELP_PROVISION(wxRichTextBulletsPage)
77
78 /*!
79 * wxRichTextBulletsPage constructors
80 */
81
82 wxRichTextBulletsPage::wxRichTextBulletsPage( )
83 {
84 Init();
85 }
86
87 wxRichTextBulletsPage::wxRichTextBulletsPage( wxWindow* parent, wxWindowID id, const wxPoint& pos, const wxSize& size, long style )
88 {
89 Init();
90 Create(parent, id, pos, size, style);
91 }
92
93 /*!
94 * Initialise members
95 */
96
97 void wxRichTextBulletsPage::Init()
98 {
99 m_hasBulletStyle = false;
100 m_hasBulletNumber = false;
101 m_hasBulletSymbol = false;
102 m_dontUpdate = false;
103
104 ////@begin wxRichTextBulletsPage member initialisation
105 m_styleListBox = NULL;
106 m_periodCtrl = NULL;
107 m_parenthesesCtrl = NULL;
108 m_rightParenthesisCtrl = NULL;
109 m_bulletAlignmentCtrl = NULL;
110 m_symbolCtrl = NULL;
111 m_symbolFontCtrl = NULL;
112 m_bulletNameCtrl = NULL;
113 m_numberCtrl = NULL;
114 m_previewCtrl = NULL;
115 ////@end wxRichTextBulletsPage member initialisation
116 }
117
118 /*!
119 * wxRichTextBulletsPage creator
120 */
121
122 bool wxRichTextBulletsPage::Create( wxWindow* parent, wxWindowID id, const wxPoint& pos, const wxSize& size, long style )
123 {
124 ////@begin wxRichTextBulletsPage creation
125 wxRichTextDialogPage::Create( parent, id, pos, size, style );
126
127 CreateControls();
128 if (GetSizer())
129 {
130 GetSizer()->SetSizeHints(this);
131 }
132 Centre();
133 ////@end wxRichTextBulletsPage creation
134 return true;
135 }
136
137 /*!
138 * Control creation for wxRichTextBulletsPage
139 */
140
141 void wxRichTextBulletsPage::CreateControls()
142 {
143 m_dontUpdate = true;
144
145 ////@begin wxRichTextBulletsPage content construction
146 wxRichTextBulletsPage* itemRichTextDialogPage1 = this;
147
148 wxBoxSizer* itemBoxSizer2 = new wxBoxSizer(wxVERTICAL);
149 itemRichTextDialogPage1->SetSizer(itemBoxSizer2);
150
151 wxBoxSizer* itemBoxSizer3 = new wxBoxSizer(wxVERTICAL);
152 itemBoxSizer2->Add(itemBoxSizer3, 1, wxGROW|wxALL, 5);
153
154 wxBoxSizer* itemBoxSizer4 = new wxBoxSizer(wxHORIZONTAL);
155 itemBoxSizer3->Add(itemBoxSizer4, 0, wxGROW, 5);
156
157 wxBoxSizer* itemBoxSizer5 = new wxBoxSizer(wxVERTICAL);
158 itemBoxSizer4->Add(itemBoxSizer5, 0, wxGROW, 5);
159
160 wxStaticText* itemStaticText6 = new wxStaticText( itemRichTextDialogPage1, wxID_STATIC, _("&Bullet style:"), wxDefaultPosition, wxDefaultSize, 0 );
161 itemBoxSizer5->Add(itemStaticText6, 0, wxALIGN_LEFT|wxLEFT|wxRIGHT|wxTOP, 5);
162
163 wxArrayString m_styleListBoxStrings;
164 m_styleListBox = new wxListBox( itemRichTextDialogPage1, ID_RICHTEXTBULLETSPAGE_STYLELISTBOX, wxDefaultPosition, wxSize(-1, 90), m_styleListBoxStrings, wxLB_SINGLE );
165 m_styleListBox->SetHelpText(_("The available bullet styles."));
166 if (wxRichTextBulletsPage::ShowToolTips())
167 m_styleListBox->SetToolTip(_("The available bullet styles."));
168 itemBoxSizer5->Add(m_styleListBox, 1, wxGROW|wxALL, 5);
169
170 wxBoxSizer* itemBoxSizer8 = new wxBoxSizer(wxHORIZONTAL);
171 itemBoxSizer5->Add(itemBoxSizer8, 0, wxGROW, 5);
172
173 m_periodCtrl = new wxCheckBox( itemRichTextDialogPage1, ID_RICHTEXTBULLETSPAGE_PERIODCTRL, _("Peri&od"), wxDefaultPosition, wxDefaultSize, 0 );
174 m_periodCtrl->SetValue(false);
175 m_periodCtrl->SetHelpText(_("Check to add a period after the bullet."));
176 if (wxRichTextBulletsPage::ShowToolTips())
177 m_periodCtrl->SetToolTip(_("Check to add a period after the bullet."));
178 itemBoxSizer8->Add(m_periodCtrl, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5);
179
180 m_parenthesesCtrl = new wxCheckBox( itemRichTextDialogPage1, ID_RICHTEXTBULLETSPAGE_PARENTHESESCTRL, _("(*)"), wxDefaultPosition, wxDefaultSize, 0 );
181 m_parenthesesCtrl->SetValue(false);
182 m_parenthesesCtrl->SetHelpText(_("Check to enclose the bullet in parentheses."));
183 if (wxRichTextBulletsPage::ShowToolTips())
184 m_parenthesesCtrl->SetToolTip(_("Check to enclose the bullet in parentheses."));
185 itemBoxSizer8->Add(m_parenthesesCtrl, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5);
186
187 m_rightParenthesisCtrl = new wxCheckBox( itemRichTextDialogPage1, ID_RICHTEXTBULLETSPAGE_RIGHTPARENTHESISCTRL, _("*)"), wxDefaultPosition, wxDefaultSize, 0 );
188 m_rightParenthesisCtrl->SetValue(false);
189 m_rightParenthesisCtrl->SetHelpText(_("Check to add a right parenthesis."));
190 if (wxRichTextBulletsPage::ShowToolTips())
191 m_rightParenthesisCtrl->SetToolTip(_("Check to add a right parenthesis."));
192 itemBoxSizer8->Add(m_rightParenthesisCtrl, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5);
193
194 itemBoxSizer5->Add(5, 5, 0, wxALIGN_CENTER_HORIZONTAL, 5);
195
196 wxStaticText* itemStaticText13 = new wxStaticText( itemRichTextDialogPage1, wxID_STATIC, _("Bullet &Alignment:"), wxDefaultPosition, wxDefaultSize, 0 );
197 itemBoxSizer5->Add(itemStaticText13, 0, wxALIGN_LEFT|wxLEFT|wxRIGHT|wxTOP, 5);
198
199 wxArrayString m_bulletAlignmentCtrlStrings;
200 m_bulletAlignmentCtrlStrings.Add(_("Left"));
201 m_bulletAlignmentCtrlStrings.Add(_("Centre"));
202 m_bulletAlignmentCtrlStrings.Add(_("Right"));
203 m_bulletAlignmentCtrl = new wxComboBox( itemRichTextDialogPage1, ID_RICHTEXTBULLETSPAGE_BULLETALIGNMENTCTRL, _("Left"), wxDefaultPosition, wxSize(60, -1), m_bulletAlignmentCtrlStrings, wxCB_READONLY );
204 m_bulletAlignmentCtrl->SetStringSelection(_("Left"));
205 m_bulletAlignmentCtrl->SetHelpText(_("The bullet character."));
206 if (wxRichTextBulletsPage::ShowToolTips())
207 m_bulletAlignmentCtrl->SetToolTip(_("The bullet character."));
208 itemBoxSizer5->Add(m_bulletAlignmentCtrl, 0, wxGROW|wxALL|wxFIXED_MINSIZE, 5);
209
210 itemBoxSizer4->Add(2, 1, 1, wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM, 5);
211
212 wxStaticLine* itemStaticLine16 = new wxStaticLine( itemRichTextDialogPage1, wxID_STATIC, wxDefaultPosition, wxDefaultSize, wxLI_VERTICAL );
213 itemBoxSizer4->Add(itemStaticLine16, 0, wxGROW|wxLEFT|wxRIGHT, 5);
214
215 itemBoxSizer4->Add(2, 1, 1, wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM, 5);
216
217 wxBoxSizer* itemBoxSizer18 = new wxBoxSizer(wxVERTICAL);
218 itemBoxSizer4->Add(itemBoxSizer18, 0, wxGROW, 5);
219
220 wxBoxSizer* itemBoxSizer19 = new wxBoxSizer(wxHORIZONTAL);
221 itemBoxSizer18->Add(itemBoxSizer19, 0, wxGROW, 5);
222
223 wxStaticText* itemStaticText20 = new wxStaticText( itemRichTextDialogPage1, ID_RICHTEXTBULLETSPAGE_SYMBOLSTATIC, _("&Symbol:"), wxDefaultPosition, wxDefaultSize, 0 );
224 itemBoxSizer19->Add(itemStaticText20, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5);
225
226 wxArrayString m_symbolCtrlStrings;
227 m_symbolCtrl = new wxComboBox( itemRichTextDialogPage1, ID_RICHTEXTBULLETSPAGE_SYMBOLCTRL, wxEmptyString, wxDefaultPosition, wxSize(60, -1), m_symbolCtrlStrings, wxCB_DROPDOWN );
228 m_symbolCtrl->SetHelpText(_("The bullet character."));
229 if (wxRichTextBulletsPage::ShowToolTips())
230 m_symbolCtrl->SetToolTip(_("The bullet character."));
231 itemBoxSizer19->Add(m_symbolCtrl, 0, wxALIGN_CENTER_VERTICAL|wxALL|wxFIXED_MINSIZE, 5);
232
233 wxButton* itemButton22 = new wxButton( itemRichTextDialogPage1, ID_RICHTEXTBULLETSPAGE_CHOOSE_SYMBOL, _("Ch&oose..."), wxDefaultPosition, wxDefaultSize, 0 );
234 itemButton22->SetHelpText(_("Click to browse for a symbol."));
235 if (wxRichTextBulletsPage::ShowToolTips())
236 itemButton22->SetToolTip(_("Click to browse for a symbol."));
237 itemBoxSizer19->Add(itemButton22, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5);
238
239 itemBoxSizer18->Add(5, 5, 0, wxALIGN_CENTER_HORIZONTAL, 5);
240
241 wxStaticText* itemStaticText24 = new wxStaticText( itemRichTextDialogPage1, ID_RICHTEXTBULLETSPAGE_SYMBOLSTATIC, _("Symbol &font:"), wxDefaultPosition, wxDefaultSize, 0 );
242 itemBoxSizer18->Add(itemStaticText24, 0, wxALIGN_LEFT|wxLEFT|wxRIGHT|wxTOP, 5);
243
244 wxArrayString m_symbolFontCtrlStrings;
245 m_symbolFontCtrl = new wxComboBox( itemRichTextDialogPage1, ID_RICHTEXTBULLETSPAGE_SYMBOLFONTCTRL, wxEmptyString, wxDefaultPosition, wxDefaultSize, m_symbolFontCtrlStrings, wxCB_DROPDOWN );
246 m_symbolFontCtrl->SetHelpText(_("Available fonts."));
247 if (wxRichTextBulletsPage::ShowToolTips())
248 m_symbolFontCtrl->SetToolTip(_("Available fonts."));
249 itemBoxSizer18->Add(m_symbolFontCtrl, 0, wxGROW|wxALL, 5);
250
251 itemBoxSizer18->Add(5, 5, 1, wxALIGN_CENTER_HORIZONTAL, 5);
252
253 wxStaticText* itemStaticText27 = new wxStaticText( itemRichTextDialogPage1, ID_RICHTEXTBULLETSPAGE_NAMESTATIC, _("S&tandard bullet name:"), wxDefaultPosition, wxDefaultSize, 0 );
254 itemBoxSizer18->Add(itemStaticText27, 0, wxALIGN_LEFT|wxLEFT|wxRIGHT|wxTOP, 5);
255
256 wxArrayString m_bulletNameCtrlStrings;
257 m_bulletNameCtrl = new wxComboBox( itemRichTextDialogPage1, ID_RICHTEXTBULLETSPAGE_NAMECTRL, wxEmptyString, wxDefaultPosition, wxDefaultSize, m_bulletNameCtrlStrings, wxCB_DROPDOWN );
258 m_bulletNameCtrl->SetHelpText(_("A standard bullet name."));
259 if (wxRichTextBulletsPage::ShowToolTips())
260 m_bulletNameCtrl->SetToolTip(_("A standard bullet name."));
261 itemBoxSizer18->Add(m_bulletNameCtrl, 0, wxGROW|wxALL, 5);
262
263 itemBoxSizer18->Add(5, 5, 1, wxALIGN_CENTER_HORIZONTAL, 5);
264
265 wxStaticText* itemStaticText30 = new wxStaticText( itemRichTextDialogPage1, ID_RICHTEXTBULLETSPAGE_NUMBERSTATIC, _("&Number:"), wxDefaultPosition, wxDefaultSize, 0 );
266 itemBoxSizer18->Add(itemStaticText30, 0, wxALIGN_LEFT|wxLEFT|wxRIGHT|wxTOP, 5);
267
268 m_numberCtrl = new wxSpinCtrl( itemRichTextDialogPage1, ID_RICHTEXTBULLETSPAGE_NUMBERCTRL, wxT("0"), wxDefaultPosition, wxSize(50, -1), wxSP_ARROW_KEYS, 0, 100000, 0 );
269 m_numberCtrl->SetHelpText(_("The list item number."));
270 if (wxRichTextBulletsPage::ShowToolTips())
271 m_numberCtrl->SetToolTip(_("The list item number."));
272 itemBoxSizer18->Add(m_numberCtrl, 0, wxGROW|wxALL, 5);
273
274 itemBoxSizer3->Add(5, 5, 0, wxALIGN_CENTER_HORIZONTAL, 5);
275
276 m_previewCtrl = new wxRichTextCtrl( itemRichTextDialogPage1, ID_RICHTEXTBULLETSPAGE_PREVIEW_CTRL, wxEmptyString, wxDefaultPosition, wxSize(350, 100), wxBORDER_THEME|wxVSCROLL|wxTE_READONLY );
277 m_previewCtrl->SetHelpText(_("Shows a preview of the bullet settings."));
278 if (wxRichTextBulletsPage::ShowToolTips())
279 m_previewCtrl->SetToolTip(_("Shows a preview of the bullet settings."));
280 itemBoxSizer3->Add(m_previewCtrl, 1, wxGROW|wxALL, 5);
281
282 ////@end wxRichTextBulletsPage content construction
283
284 if (wxGetDisplaySize().y < 600)
285 m_previewCtrl->SetMinSize(wxSize(350, 50));
286
287 m_styleListBox->Append(_("(None)"));
288 m_styleListBox->Append(_("Arabic"));
289 m_styleListBox->Append(_("Upper case letters"));
290 m_styleListBox->Append(_("Lower case letters"));
291 m_styleListBox->Append(_("Upper case roman numerals"));
292 m_styleListBox->Append(_("Lower case roman numerals"));
293 m_styleListBox->Append(_("Numbered outline"));
294 m_styleListBox->Append(_("Symbol"));
295 m_styleListBox->Append(_("Bitmap"));
296 m_styleListBox->Append(_("Standard"));
297
298 m_symbolCtrl->Append(_("*"));
299 m_symbolCtrl->Append(_("-"));
300 m_symbolCtrl->Append(_(">"));
301 m_symbolCtrl->Append(_("+"));
302 m_symbolCtrl->Append(_("~"));
303
304 wxArrayString standardBulletNames;
305 if (wxRichTextBuffer::GetRenderer())
306 wxRichTextBuffer::GetRenderer()->EnumerateStandardBulletNames(standardBulletNames);
307
308 size_t i;
309 for (i = 0; i < standardBulletNames.GetCount(); i++)
310 m_bulletNameCtrl->Append(wxGetTranslation(standardBulletNames[i]));
311
312 wxArrayString facenames = wxRichTextCtrl::GetAvailableFontNames();
313 facenames.Sort();
314
315 m_symbolFontCtrl->Append(facenames);
316
317 m_dontUpdate = false;
318 }
319
320 /// Transfer data from/to window
321 bool wxRichTextBulletsPage::TransferDataFromWindow()
322 {
323 wxPanel::TransferDataFromWindow();
324
325 wxRichTextAttr* attr = GetAttributes();
326
327 int index = m_styleListBox->GetSelection();
328 if (index < 1)
329 {
330 m_hasBulletStyle = false;
331 m_hasBulletNumber = false;
332 m_hasBulletSymbol = false;
333 attr->SetBulletStyle(wxTEXT_ATTR_BULLET_STYLE_NONE);
334 attr->SetFlags(attr->GetFlags() & ~(wxTEXT_ATTR_BULLET_STYLE|wxTEXT_ATTR_BULLET_NUMBER|wxTEXT_ATTR_BULLET_TEXT|wxTEXT_ATTR_BULLET_NAME));
335 }
336 else
337 {
338 m_hasBulletStyle = true;
339 }
340
341 if (m_hasBulletStyle)
342 {
343 long bulletStyle = wxRICHTEXT_BULLETINDEX_NONE;
344
345 if (index == wxRICHTEXT_BULLETINDEX_ARABIC)
346 bulletStyle |= wxTEXT_ATTR_BULLET_STYLE_ARABIC;
347
348 else if (index == wxRICHTEXT_BULLETINDEX_UPPER_CASE)
349 bulletStyle |= wxTEXT_ATTR_BULLET_STYLE_LETTERS_UPPER;
350
351 else if (index == wxRICHTEXT_BULLETINDEX_LOWER_CASE)
352 bulletStyle |= wxTEXT_ATTR_BULLET_STYLE_LETTERS_LOWER;
353
354 else if (index == wxRICHTEXT_BULLETINDEX_UPPER_CASE_ROMAN)
355 bulletStyle |= wxTEXT_ATTR_BULLET_STYLE_ROMAN_UPPER;
356
357 else if (index == wxRICHTEXT_BULLETINDEX_LOWER_CASE_ROMAN)
358 bulletStyle |= wxTEXT_ATTR_BULLET_STYLE_ROMAN_LOWER;
359
360 else if (index == wxRICHTEXT_BULLETINDEX_OUTLINE)
361 bulletStyle |= wxTEXT_ATTR_BULLET_STYLE_OUTLINE;
362
363 else if (index == wxRICHTEXT_BULLETINDEX_SYMBOL)
364 bulletStyle |= wxTEXT_ATTR_BULLET_STYLE_SYMBOL;
365
366 else if (index == wxRICHTEXT_BULLETINDEX_BITMAP)
367 bulletStyle |= wxTEXT_ATTR_BULLET_STYLE_BITMAP;
368
369 else if (index == wxRICHTEXT_BULLETINDEX_STANDARD)
370 {
371 bulletStyle |= wxTEXT_ATTR_BULLET_STYLE_STANDARD;
372 wxArrayString standardBulletNames;
373 if (wxRichTextBuffer::GetRenderer() && m_bulletNameCtrl->GetSelection() != wxNOT_FOUND)
374 {
375 int sel = m_bulletNameCtrl->GetSelection();
376 wxString selName = m_bulletNameCtrl->GetString(sel);
377
378 // Try to get the untranslated name using the current selection index of the combobox.
379 // into account.
380 wxRichTextBuffer::GetRenderer()->EnumerateStandardBulletNames(standardBulletNames);
381 if (sel < (int) standardBulletNames.GetCount() && m_bulletNameCtrl->GetValue() == selName)
382 attr->SetBulletName(standardBulletNames[sel]);
383 else
384 attr->SetBulletName(m_bulletNameCtrl->GetValue());
385 }
386 else
387 attr->SetBulletName(m_bulletNameCtrl->GetValue());
388 }
389
390 if (m_parenthesesCtrl->GetValue())
391 bulletStyle |= wxTEXT_ATTR_BULLET_STYLE_PARENTHESES;
392 if (m_rightParenthesisCtrl->GetValue())
393 bulletStyle |= wxTEXT_ATTR_BULLET_STYLE_RIGHT_PARENTHESIS;
394 if (m_periodCtrl->GetValue())
395 bulletStyle |= wxTEXT_ATTR_BULLET_STYLE_PERIOD;
396
397 if (m_bulletAlignmentCtrl->GetSelection() == 1)
398 bulletStyle |= wxTEXT_ATTR_BULLET_STYLE_ALIGN_CENTRE;
399 else if (m_bulletAlignmentCtrl->GetSelection() == 2)
400 bulletStyle |= wxTEXT_ATTR_BULLET_STYLE_ALIGN_RIGHT;
401 // Left is implied
402
403 attr->SetBulletStyle(bulletStyle);
404 }
405
406 if (m_hasBulletNumber)
407 {
408 attr->SetBulletNumber(m_numberCtrl->GetValue());
409 }
410
411 if (m_hasBulletSymbol)
412 {
413 attr->SetBulletText(m_symbolCtrl->GetValue());
414 attr->SetBulletFont(m_symbolFontCtrl->GetValue());
415 }
416
417 return true;
418 }
419
420 bool wxRichTextBulletsPage::TransferDataToWindow()
421 {
422 m_dontUpdate = true;
423
424 wxPanel::TransferDataToWindow();
425
426 wxRichTextAttr* attr = GetAttributes();
427
428 if (attr->HasBulletStyle())
429 {
430 m_hasBulletStyle = true;
431 int index = wxRICHTEXT_BULLETINDEX_NONE;
432
433 if (attr->GetBulletStyle() & wxTEXT_ATTR_BULLET_STYLE_ARABIC)
434 index = wxRICHTEXT_BULLETINDEX_ARABIC;
435
436 else if (attr->GetBulletStyle() & wxTEXT_ATTR_BULLET_STYLE_LETTERS_UPPER)
437 index = wxRICHTEXT_BULLETINDEX_UPPER_CASE;
438
439 else if (attr->GetBulletStyle() & wxTEXT_ATTR_BULLET_STYLE_LETTERS_LOWER)
440 index = wxRICHTEXT_BULLETINDEX_LOWER_CASE;
441
442 else if (attr->GetBulletStyle() & wxTEXT_ATTR_BULLET_STYLE_ROMAN_UPPER)
443 index = wxRICHTEXT_BULLETINDEX_UPPER_CASE_ROMAN;
444
445 else if (attr->GetBulletStyle() & wxTEXT_ATTR_BULLET_STYLE_ROMAN_LOWER)
446 index = wxRICHTEXT_BULLETINDEX_LOWER_CASE_ROMAN;
447
448 else if (attr->GetBulletStyle() & wxTEXT_ATTR_BULLET_STYLE_OUTLINE)
449 index = wxRICHTEXT_BULLETINDEX_OUTLINE;
450
451 else if (attr->GetBulletStyle() & wxTEXT_ATTR_BULLET_STYLE_SYMBOL)
452 index = wxRICHTEXT_BULLETINDEX_SYMBOL;
453
454 else if (attr->GetBulletStyle() & wxTEXT_ATTR_BULLET_STYLE_BITMAP)
455 index = wxRICHTEXT_BULLETINDEX_BITMAP;
456
457 else if (attr->GetBulletStyle() & wxTEXT_ATTR_BULLET_STYLE_STANDARD)
458 index = wxRICHTEXT_BULLETINDEX_STANDARD;
459
460 m_styleListBox->SetSelection(index);
461
462 if (attr->GetBulletStyle() & wxTEXT_ATTR_BULLET_STYLE_PARENTHESES)
463 m_parenthesesCtrl->SetValue(true);
464 else
465 m_parenthesesCtrl->SetValue(false);
466
467 if (attr->GetBulletStyle() & wxTEXT_ATTR_BULLET_STYLE_RIGHT_PARENTHESIS)
468 m_rightParenthesisCtrl->SetValue(true);
469 else
470 m_rightParenthesisCtrl->SetValue(false);
471
472 if (attr->GetBulletStyle() & wxTEXT_ATTR_BULLET_STYLE_PERIOD)
473 m_periodCtrl->SetValue(true);
474 else
475 m_periodCtrl->SetValue(false);
476
477 if (attr->GetBulletStyle() & wxTEXT_ATTR_BULLET_STYLE_ALIGN_CENTRE)
478 m_bulletAlignmentCtrl->SetSelection(1);
479 else if (attr->GetBulletStyle() & wxTEXT_ATTR_BULLET_STYLE_ALIGN_RIGHT)
480 m_bulletAlignmentCtrl->SetSelection(2);
481 else
482 m_bulletAlignmentCtrl->SetSelection(0);
483 }
484 else
485 {
486 m_hasBulletStyle = false;
487 m_styleListBox->SetSelection(-1);
488 m_bulletAlignmentCtrl->SetSelection(-1);
489 }
490
491 if (attr->HasBulletText())
492 {
493 m_symbolCtrl->SetValue(attr->GetBulletText());
494 m_symbolFontCtrl->SetValue(attr->GetBulletFont());
495 }
496 else
497 m_symbolCtrl->SetValue(wxEmptyString);
498
499 if (attr->HasBulletNumber())
500 m_numberCtrl->SetValue(attr->GetBulletNumber());
501 else
502 m_numberCtrl->SetValue(0);
503
504 if (attr->HasBulletName())
505 {
506 wxArrayString standardBulletNames;
507 if (wxRichTextBuffer::GetRenderer())
508 {
509 // Try to set the control by index in order to take translated combo control strings
510 // into account.
511 wxRichTextBuffer::GetRenderer()->EnumerateStandardBulletNames(standardBulletNames);
512 int idx = standardBulletNames.Index(attr->GetBulletName());
513 if (idx != -1 && idx < (int) m_bulletNameCtrl->GetCount())
514 m_bulletNameCtrl->SetSelection(idx);
515 else
516 m_bulletNameCtrl->SetValue(attr->GetBulletName());
517 }
518 else
519 m_bulletNameCtrl->SetValue(attr->GetBulletName());
520 }
521 else
522 m_bulletNameCtrl->SetValue(wxEmptyString);
523
524 UpdatePreview();
525
526 m_dontUpdate = false;
527
528 return true;
529 }
530
531 /// Updates the bullet preview
532 void wxRichTextBulletsPage::UpdatePreview()
533 {
534 static const wxChar* s_para1 = wxT("Lorem ipsum dolor sit amet, consectetuer adipiscing elit. \
535 Nullam ante sapien, vestibulum nonummy, pulvinar sed, luctus ut, lacus.\n");
536
537 static const wxChar* s_para2 = wxT("Duis pharetra consequat dui. Cum sociis natoque penatibus \
538 et magnis dis parturient montes, nascetur ridiculus mus. Nullam vitae justo id mauris lobortis interdum.\n");
539
540 static const wxChar* s_para3 = wxT("Integer convallis dolor at augue \
541 iaculis malesuada. Donec bibendum ipsum ut ante porta fringilla.\n");
542
543 TransferDataFromWindow();
544 wxRichTextAttr attr(*GetAttributes());
545 attr.SetFlags(attr.GetFlags() &
546 (wxTEXT_ATTR_BULLET_STYLE|wxTEXT_ATTR_BULLET_NUMBER|wxTEXT_ATTR_BULLET_TEXT|wxTEXT_ATTR_BULLET_NAME|
547 wxTEXT_ATTR_ALIGNMENT|wxTEXT_ATTR_LEFT_INDENT|wxTEXT_ATTR_RIGHT_INDENT|wxTEXT_ATTR_PARA_SPACING_BEFORE|wxTEXT_ATTR_PARA_SPACING_AFTER|
548 wxTEXT_ATTR_LINE_SPACING));
549
550 wxFont font(m_previewCtrl->GetFont());
551 font.SetPointSize(9);
552 m_previewCtrl->SetFont(font);
553
554 wxRichTextAttr normalParaAttr;
555 normalParaAttr.SetFont(font);
556 normalParaAttr.SetTextColour(wxColour(wxT("LIGHT GREY")));
557
558 m_previewCtrl->Freeze();
559 m_previewCtrl->Clear();
560
561 m_previewCtrl->BeginStyle(normalParaAttr);
562 m_previewCtrl->WriteText(s_para1);
563 m_previewCtrl->EndStyle();
564
565 m_previewCtrl->BeginStyle(attr);
566 m_previewCtrl->WriteText(s_para2);
567 m_previewCtrl->EndStyle();
568
569 m_previewCtrl->BeginStyle(normalParaAttr);
570 m_previewCtrl->WriteText(s_para3);
571 m_previewCtrl->EndStyle();
572
573 m_previewCtrl->NumberList(wxRichTextRange(0, m_previewCtrl->GetLastPosition()+1));
574
575 m_previewCtrl->Thaw();
576 }
577
578 wxRichTextAttr* wxRichTextBulletsPage::GetAttributes()
579 {
580 return wxRichTextFormattingDialog::GetDialogAttributes(this);
581 }
582
583 /*!
584 * Should we show tooltips?
585 */
586
587 bool wxRichTextBulletsPage::ShowToolTips()
588 {
589 return wxRichTextFormattingDialog::ShowToolTips();
590 }
591
592 /*!
593 * Get bitmap resources
594 */
595
596 wxBitmap wxRichTextBulletsPage::GetBitmapResource( const wxString& name )
597 {
598 // Bitmap retrieval
599 ////@begin wxRichTextBulletsPage bitmap retrieval
600 wxUnusedVar(name);
601 return wxNullBitmap;
602 ////@end wxRichTextBulletsPage bitmap retrieval
603 }
604
605 /*!
606 * Get icon resources
607 */
608
609 wxIcon wxRichTextBulletsPage::GetIconResource( const wxString& name )
610 {
611 // Icon retrieval
612 ////@begin wxRichTextBulletsPage icon retrieval
613 wxUnusedVar(name);
614 return wxNullIcon;
615 ////@end wxRichTextBulletsPage icon retrieval
616 }
617
618 /*!
619 * wxEVT_COMMAND_LISTBOX_SELECTED event handler for ID_RICHTEXTBULLETSPAGE_STYLELISTBOX
620 */
621
622 void wxRichTextBulletsPage::OnStylelistboxSelected( wxCommandEvent& WXUNUSED(event) )
623 {
624 if (!m_dontUpdate)
625 {
626 m_hasBulletStyle = true;
627
628 if (m_styleListBox->GetSelection() == wxRICHTEXT_BULLETINDEX_SYMBOL)
629 m_hasBulletSymbol = true;
630
631 UpdatePreview();
632 }
633 }
634
635 /*!
636 * wxEVT_COMMAND_COMBOBOX_SELECTED event handler for ID_RICHTEXTBULLETSPAGE_SYMBOLCTRL
637 */
638
639 void wxRichTextBulletsPage::OnSymbolctrlSelected( wxCommandEvent& WXUNUSED(event) )
640 {
641 if (!m_dontUpdate)
642 {
643 m_hasBulletSymbol = true;
644 UpdatePreview();
645 }
646 }
647
648 /*!
649 * wxEVT_COMMAND_TEXT_UPDATED event handler for ID_RICHTEXTBULLETSPAGE_SYMBOLCTRL
650 */
651
652 void wxRichTextBulletsPage::OnSymbolctrlUpdated( wxCommandEvent& WXUNUSED(event) )
653 {
654 if (!m_dontUpdate)
655 {
656 m_hasBulletSymbol = true;
657 UpdatePreview();
658 }
659 }
660
661 /*!
662 * wxEVT_UPDATE_UI event handler for ID_RICHTEXTBULLETSPAGE_SYMBOLCTRL
663 */
664
665 void wxRichTextBulletsPage::OnSymbolctrlUpdate( wxUpdateUIEvent& event )
666 {
667 OnSymbolUpdate(event);
668 }
669
670 /*!
671 * wxEVT_COMMAND_SPINCTRL_UPDATED event handler for ID_RICHTEXTBULLETSPAGE_NUMBERCTRL
672 */
673
674 void wxRichTextBulletsPage::OnNumberctrlUpdated( wxSpinEvent& WXUNUSED(event) )
675 {
676 if (!m_dontUpdate)
677 {
678 m_hasBulletNumber = true;
679 UpdatePreview();
680 }
681 }
682
683 /*!
684 * wxEVT_SCROLL_LINEUP event handler for ID_RICHTEXTBULLETSPAGE_NUMBERCTRL
685 */
686
687 void wxRichTextBulletsPage::OnNumberctrlUp( wxSpinEvent& WXUNUSED(event) )
688 {
689 if (!m_dontUpdate)
690 {
691 m_hasBulletNumber = true;
692 UpdatePreview();
693 }
694 }
695
696 /*!
697 * wxEVT_SCROLL_LINEDOWN event handler for ID_RICHTEXTBULLETSPAGE_NUMBERCTRL
698 */
699
700 void wxRichTextBulletsPage::OnNumberctrlDown( wxSpinEvent& WXUNUSED(event) )
701 {
702 if (!m_dontUpdate)
703 {
704 m_hasBulletNumber = true;
705 UpdatePreview();
706 }
707 }
708
709 /*!
710 * wxEVT_COMMAND_TEXT_UPDATED event handler for ID_RICHTEXTBULLETSPAGE_NUMBERCTRL
711 */
712
713 void wxRichTextBulletsPage::OnNumberctrlTextUpdated( wxCommandEvent& WXUNUSED(event) )
714 {
715 if (!m_dontUpdate)
716 {
717 m_hasBulletNumber = true;
718 UpdatePreview();
719 }
720 }
721
722 /*!
723 * wxEVT_UPDATE_UI event handler for ID_RICHTEXTBULLETSPAGE_NUMBERCTRL
724 */
725
726 void wxRichTextBulletsPage::OnNumberctrlUpdate( wxUpdateUIEvent& event )
727 {
728 OnNumberUpdate(event);
729 }
730
731 /*!
732 * wxEVT_COMMAND_CHECKBOX_CLICKED event handler for ID_RICHTEXTBULLETSPAGE_PARENTHESESCTRL
733 */
734
735 void wxRichTextBulletsPage::OnParenthesesctrlClick( wxCommandEvent& WXUNUSED(event) )
736 {
737 if (!m_dontUpdate)
738 {
739 m_hasBulletStyle = true;
740 UpdatePreview();
741 }
742 }
743
744 /*!
745 * wxEVT_UPDATE_UI event handler for ID_RICHTEXTBULLETSPAGE_PARENTHESESCTRL
746 */
747
748 void wxRichTextBulletsPage::OnParenthesesctrlUpdate( wxUpdateUIEvent& event )
749 {
750 int sel = m_styleListBox->GetSelection();
751 event.Enable(m_hasBulletStyle && (sel != wxRICHTEXT_BULLETINDEX_SYMBOL &&
752 sel != wxRICHTEXT_BULLETINDEX_BITMAP &&
753 sel != wxRICHTEXT_BULLETINDEX_NONE));
754 }
755
756 /*!
757 * wxEVT_COMMAND_CHECKBOX_CLICKED event handler for ID_RICHTEXTBULLETSPAGE_PERIODCTRL
758 */
759
760 void wxRichTextBulletsPage::OnPeriodctrlClick( wxCommandEvent& WXUNUSED(event) )
761 {
762 if (!m_dontUpdate)
763 {
764 m_hasBulletStyle = true;
765 UpdatePreview();
766 }
767 }
768
769 /*!
770 * wxEVT_UPDATE_UI event handler for ID_RICHTEXTBULLETSPAGE_PERIODCTRL
771 */
772
773 void wxRichTextBulletsPage::OnPeriodctrlUpdate( wxUpdateUIEvent& event )
774 {
775 int sel = m_styleListBox->GetSelection();
776 event.Enable(m_hasBulletStyle && (sel != wxRICHTEXT_BULLETINDEX_SYMBOL &&
777 sel != wxRICHTEXT_BULLETINDEX_BITMAP &&
778 sel != wxRICHTEXT_BULLETINDEX_NONE));
779 }
780
781 /*!
782 * wxEVT_COMMAND_BUTTON_CLICKED event handler for ID_RICHTEXTBULLETSPAGE_CHOOSE_SYMBOL
783 */
784
785 void wxRichTextBulletsPage::OnChooseSymbolClick( wxCommandEvent& WXUNUSED(event) )
786 {
787 int sel = m_styleListBox->GetSelection();
788 if (m_hasBulletStyle && sel == wxRICHTEXT_BULLETINDEX_SYMBOL)
789 {
790 wxString symbol = m_symbolCtrl->GetValue();
791 wxString fontName = m_symbolFontCtrl->GetValue();
792 wxSymbolPickerDialog dlg(symbol, fontName, fontName, this);
793
794 if (dlg.ShowModal() == wxID_OK)
795 {
796 m_dontUpdate = true;
797
798 m_symbolCtrl->SetValue(dlg.GetSymbol());
799 m_symbolFontCtrl->SetValue(dlg.GetFontName());
800
801 UpdatePreview();
802
803 m_dontUpdate = false;
804 }
805 }
806 }
807
808 /*!
809 * wxEVT_UPDATE_UI event handler for ID_RICHTEXTBULLETSPAGE_CHOOSE_SYMBOL
810 */
811
812 void wxRichTextBulletsPage::OnChooseSymbolUpdate( wxUpdateUIEvent& event )
813 {
814 OnSymbolUpdate(event);
815 }
816 /*!
817 * wxEVT_COMMAND_COMBOBOX_SELECTED event handler for ID_RICHTEXTBULLETSPAGE_SYMBOLFONTCTRL
818 */
819
820 void wxRichTextBulletsPage::OnSymbolfontctrlSelected( wxCommandEvent& WXUNUSED(event) )
821 {
822 if (m_dontUpdate)
823 return;
824 UpdatePreview();
825 }
826
827 /*!
828 * wxEVT_COMMAND_TEXT_UPDATED event handler for ID_RICHTEXTBULLETSPAGE_SYMBOLFONTCTRL
829 */
830
831 void wxRichTextBulletsPage::OnSymbolfontctrlUpdated( wxCommandEvent& WXUNUSED(event) )
832 {
833 if (m_dontUpdate)
834 return;
835 UpdatePreview();
836 }
837
838
839 /*!
840 * wxEVT_UPDATE_UI event handler for ID_RICHTEXTBULLETSPAGE_SYMBOLFONTCTRL
841 */
842
843 void wxRichTextBulletsPage::OnSymbolfontctrlUIUpdate( wxUpdateUIEvent& event )
844 {
845 OnSymbolUpdate(event);
846 }
847
848 /// Update for symbol-related controls
849 void wxRichTextBulletsPage::OnSymbolUpdate( wxUpdateUIEvent& event )
850 {
851 int sel = m_styleListBox->GetSelection();
852 event.Enable(m_hasBulletStyle && (sel == wxRICHTEXT_BULLETINDEX_SYMBOL));
853 }
854
855 /// Update for number-related controls
856 void wxRichTextBulletsPage::OnNumberUpdate( wxUpdateUIEvent& event )
857 {
858 int sel = m_styleListBox->GetSelection();
859 event.Enable( m_hasBulletStyle && (sel != wxRICHTEXT_BULLETINDEX_SYMBOL &&
860 sel != wxRICHTEXT_BULLETINDEX_BITMAP &&
861 sel != wxRICHTEXT_BULLETINDEX_STANDARD &&
862 sel != wxRICHTEXT_BULLETINDEX_NONE));
863 }
864
865 /// Update for standard bullet-related controls
866 void wxRichTextBulletsPage::OnStandardBulletUpdate( wxUpdateUIEvent& event )
867 {
868 int sel = m_styleListBox->GetSelection();
869 event.Enable( sel == wxRICHTEXT_BULLETINDEX_STANDARD );
870 }
871
872
873 /*!
874 * wxEVT_UPDATE_UI event handler for ID_RICHTEXTBULLETSPAGE_SYMBOLSTATIC
875 */
876
877 void wxRichTextBulletsPage::OnSymbolstaticUpdate( wxUpdateUIEvent& event )
878 {
879 OnSymbolUpdate(event);
880 }
881
882
883 /*!
884 * wxEVT_UPDATE_UI event handler for ID_RICHTEXTBULLETSPAGE_NUMBERSTATIC
885 */
886
887 void wxRichTextBulletsPage::OnNumberstaticUpdate( wxUpdateUIEvent& event )
888 {
889 OnNumberUpdate(event);
890 }
891
892 /*!
893 * wxEVT_UPDATE_UI event handler for ID_RICHTEXTBULLETSPAGE_NAMESTATIC
894 */
895
896 void wxRichTextBulletsPage::OnNamestaticUpdate( wxUpdateUIEvent& event )
897 {
898 OnStandardBulletUpdate(event);
899 }
900
901
902 /*!
903 * wxEVT_COMMAND_COMBOBOX_SELECTED event handler for ID_RICHTEXTBULLETSPAGE_NAMECTRL
904 */
905
906 void wxRichTextBulletsPage::OnNamectrlSelected( wxCommandEvent& WXUNUSED(event) )
907 {
908 if (m_dontUpdate)
909 return;
910 UpdatePreview();
911 }
912
913 /*!
914 * wxEVT_COMMAND_TEXT_UPDATED event handler for ID_RICHTEXTBULLETSPAGE_NAMECTRL
915 */
916
917 void wxRichTextBulletsPage::OnNamectrlUpdated( wxCommandEvent& WXUNUSED(event) )
918 {
919 if (m_dontUpdate)
920 return;
921 UpdatePreview();
922 }
923
924 /*!
925 * wxEVT_UPDATE_UI event handler for ID_RICHTEXTBULLETSPAGE_NAMECTRL
926 */
927
928 void wxRichTextBulletsPage::OnNamectrlUIUpdate( wxUpdateUIEvent& event )
929 {
930 OnStandardBulletUpdate(event);
931 }
932
933 #endif // wxUSE_RICHTEXT
934 /*!
935 * wxEVT_COMMAND_CHECKBOX_CLICKED event handler for ID_RICHTEXTBULLETSPAGE_RIGHT_PARENTHESIS_CTRL
936 */
937
938 void wxRichTextBulletsPage::OnRightParenthesisCtrlClick( wxCommandEvent& WXUNUSED(event) )
939 {
940 if (!m_dontUpdate)
941 {
942 m_hasBulletStyle = true;
943 UpdatePreview();
944 }
945 }
946
947 /*!
948 * wxEVT_UPDATE_UI event handler for ID_RICHTEXTBULLETSPAGE_RIGHT_PARENTHESIS_CTRL
949 */
950
951 void wxRichTextBulletsPage::OnRightParenthesisCtrlUpdate( wxUpdateUIEvent& event )
952 {
953 int sel = m_styleListBox->GetSelection();
954 event.Enable(m_hasBulletStyle && (sel != wxRICHTEXT_BULLETINDEX_SYMBOL &&
955 sel != wxRICHTEXT_BULLETINDEX_BITMAP &&
956 sel != wxRICHTEXT_BULLETINDEX_NONE));
957 }
958
959 /*!
960 * wxEVT_COMMAND_COMBOBOX_SELECTED event handler for ID_COMBOBOX
961 */
962
963 void wxRichTextBulletsPage::OnBulletAlignmentCtrlSelected( wxCommandEvent& WXUNUSED(event) )
964 {
965 if (m_dontUpdate)
966 return;
967 UpdatePreview();
968 }
969
970