Remove interface/implementation #pragmas from richtextimagedlg.*.
[wxWidgets.git] / src / richtext / richtextimagedlg.cpp
1 /////////////////////////////////////////////////////////////////////////////
2 // Name: src/richtext/richtextimagedlg.cpp
3 // Purpose:
4 // Author: Mingquan Yang
5 // Modified by:
6 // Created: Wed 02 Jun 2010 11:27:23 CST
7 // RCS-ID:
8 // Copyright: (c) Mingquan Yang
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 #ifndef WX_PRECOMP
20 #include "wx/wx.h"
21 #endif
22
23 ////@begin includes
24 ////@end includes
25
26 #include "wx/richtext/richtextimagedlg.h"
27 #include "wx/richtext/richtextctrl.h"
28
29 ////@begin XPM images
30 ////@end XPM images
31
32
33 /*!
34 * wxRichTextImageDialog type definition
35 */
36
37 IMPLEMENT_DYNAMIC_CLASS( wxRichTextImageDialog, wxDialog )
38
39
40 /*!
41 * wxRichTextImageDialog event table definition
42 */
43
44 BEGIN_EVENT_TABLE( wxRichTextImageDialog, wxDialog )
45
46 ////@begin wxRichTextImageDialog event table entries
47 EVT_BUTTON( ID_RICHTEXTIMAGEDIALOG_PARA_UP, wxRichTextImageDialog::OnRichtextimagedialogParaUpClick )
48
49 EVT_BUTTON( ID_RICHTEXTIMAGEDIALOG_DOWN, wxRichTextImageDialog::OnRichtextimagedialogDownClick )
50
51 ////@end wxRichTextImageDialog event table entries
52
53 END_EVENT_TABLE()
54
55
56 /*!
57 * wxRichTextImageDialog constructors
58 */
59
60 wxRichTextImageDialog::wxRichTextImageDialog()
61 {
62 Init();
63 }
64
65 wxRichTextImageDialog::wxRichTextImageDialog( wxWindow* parent, wxWindowID id, const wxString& caption, const wxPoint& pos, const wxSize& size, long style )
66 {
67 Init();
68 Create(parent, id, caption, pos, size, style);
69 }
70
71
72 /*!
73 * wxRichTextImageDlg creator
74 */
75
76 bool wxRichTextImageDialog::Create( wxWindow* parent, wxWindowID id, const wxString& caption, const wxPoint& pos, const wxSize& size, long style )
77 {
78 ////@begin wxRichTextImageDialog creation
79 SetExtraStyle(wxDIALOG_EX_CONTEXTHELP);
80 wxDialog::Create( parent, id, caption, pos, size, style );
81
82 CreateControls();
83 if (GetSizer())
84 {
85 GetSizer()->SetSizeHints(this);
86 }
87 Centre();
88 ////@end wxRichTextImageDialog creation
89 return true;
90 }
91
92
93 /*!
94 * wxRichTextImageDialog destructor
95 */
96
97 wxRichTextImageDialog::~wxRichTextImageDialog()
98 {
99 ////@begin wxRichTextImageDialog destruction
100 ////@end wxRichTextImageDialog destruction
101 }
102
103
104 /*!
105 * Member initialisation
106 */
107
108 void wxRichTextImageDialog::Init()
109 {
110 ////@begin wxRichTextImageDialog member initialisation
111 m_alignment = NULL;
112 m_float = NULL;
113 m_width = NULL;
114 m_unitsW = NULL;
115 m_height = NULL;
116 m_unitsH = NULL;
117 m_offset = NULL;
118 m_unitsOffset = NULL;
119 m_saveButton = NULL;
120 m_cancelButton = NULL;
121 ////@end wxRichTextImageDialog member initialisation
122 }
123
124
125 /*!
126 * Control creation for wxRichTextImageDlg
127 */
128
129 void wxRichTextImageDialog::CreateControls()
130 {
131 #ifdef __WXMAC__
132 SetWindowVariant(wxWINDOW_VARIANT_SMALL);
133 #endif
134
135 ////@begin wxRichTextImageDialog content construction
136 wxRichTextImageDialog* itemDialog1 = this;
137
138 wxBoxSizer* itemBoxSizer2 = new wxBoxSizer(wxVERTICAL);
139 itemDialog1->SetSizer(itemBoxSizer2);
140
141 wxBoxSizer* itemBoxSizer3 = new wxBoxSizer(wxHORIZONTAL);
142 itemBoxSizer2->Add(itemBoxSizer3, 0, wxGROW|wxALL, 5);
143
144 wxFlexGridSizer* itemFlexGridSizer4 = new wxFlexGridSizer(0, 2, 0, 0);
145 itemBoxSizer3->Add(itemFlexGridSizer4, 0, wxALIGN_TOP|wxRIGHT, 5);
146
147 wxStaticText* itemStaticText5 = new wxStaticText( itemDialog1, wxID_STATIC, _("Alignment:"), wxDefaultPosition, wxDefaultSize, 0 );
148 itemStaticText5->Show(false);
149 itemFlexGridSizer4->Add(itemStaticText5, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL|wxALL, 5);
150
151 wxArrayString m_alignmentStrings;
152 m_alignmentStrings.Add(_("Left"));
153 m_alignmentStrings.Add(_("Centre"));
154 m_alignmentStrings.Add(_("Right"));
155 m_alignment = new wxComboBox( itemDialog1, ID_COMBOBOX_ALIGN, _("Left"), wxDefaultPosition, wxSize(80, -1), m_alignmentStrings, wxCB_READONLY );
156 m_alignment->SetStringSelection(_("Left"));
157 m_alignment->Show(false);
158 itemFlexGridSizer4->Add(m_alignment, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL|wxALL, 5);
159
160 wxStaticText* itemStaticText7 = new wxStaticText( itemDialog1, wxID_STATIC, _("&Floating mode:"), wxDefaultPosition, wxDefaultSize, 0 );
161 itemFlexGridSizer4->Add(itemStaticText7, 0, wxALIGN_RIGHT|wxALIGN_CENTER_VERTICAL|wxALL, 5);
162
163 wxArrayString m_floatStrings;
164 m_floatStrings.Add(_("None"));
165 m_floatStrings.Add(_("Left"));
166 m_floatStrings.Add(_("Right"));
167 m_float = new wxComboBox( itemDialog1, ID_RICHTEXTIMAGEDIALOG_FLOATING_MODE, _("None"), wxDefaultPosition, wxSize(80, -1), m_floatStrings, wxCB_READONLY );
168 m_float->SetStringSelection(_("None"));
169 m_float->SetHelpText(_("How the image will float relative to the text."));
170 if (wxRichTextImageDialog::ShowToolTips())
171 m_float->SetToolTip(_("How the image will float relative to the text."));
172 itemFlexGridSizer4->Add(m_float, 0, wxALIGN_LEFT|wxALIGN_CENTER_VERTICAL|wxALL, 5);
173
174 wxStaticText* itemStaticText9 = new wxStaticText( itemDialog1, wxID_STATIC, _("&Width:"), wxDefaultPosition, wxDefaultSize, 0 );
175 itemFlexGridSizer4->Add(itemStaticText9, 0, wxALIGN_RIGHT|wxALIGN_CENTER_VERTICAL|wxALL, 5);
176
177 wxBoxSizer* itemBoxSizer10 = new wxBoxSizer(wxHORIZONTAL);
178 itemFlexGridSizer4->Add(itemBoxSizer10, 0, wxALIGN_LEFT|wxALIGN_CENTER_VERTICAL, 5);
179
180 m_width = new wxTextCtrl( itemDialog1, ID_RICHTEXTIMAGEDIALOG_WIDTH, wxEmptyString, wxDefaultPosition, wxSize(65, -1), 0 );
181 m_width->SetHelpText(_("The image width to be shown - does not change the source image width."));
182 if (wxRichTextImageDialog::ShowToolTips())
183 m_width->SetToolTip(_("The image width to be shown - does not change the source image width."));
184 itemBoxSizer10->Add(m_width, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5);
185
186 wxArrayString m_unitsWStrings;
187 m_unitsWStrings.Add(_("px"));
188 m_unitsWStrings.Add(_("cm"));
189 m_unitsW = new wxComboBox( itemDialog1, ID_RICHTEXTIMAGEDIALOG_UNITS_W, _("px"), wxDefaultPosition, wxSize(60, -1), m_unitsWStrings, wxCB_READONLY );
190 m_unitsW->SetStringSelection(_("px"));
191 m_unitsW->SetHelpText(_("Units for the image width."));
192 if (wxRichTextImageDialog::ShowToolTips())
193 m_unitsW->SetToolTip(_("Units for the image width."));
194 itemBoxSizer10->Add(m_unitsW, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5);
195
196 wxStaticText* itemStaticText13 = new wxStaticText( itemDialog1, wxID_STATIC, _("&Height:"), wxDefaultPosition, wxDefaultSize, 0 );
197 itemFlexGridSizer4->Add(itemStaticText13, 0, wxALIGN_RIGHT|wxALIGN_CENTER_VERTICAL|wxALL, 5);
198
199 wxBoxSizer* itemBoxSizer14 = new wxBoxSizer(wxHORIZONTAL);
200 itemFlexGridSizer4->Add(itemBoxSizer14, 0, wxALIGN_LEFT|wxALIGN_CENTER_VERTICAL, 5);
201
202 m_height = new wxTextCtrl( itemDialog1, ID_RICHTEXTIMAGEDIALOG_HEIGHT, wxEmptyString, wxDefaultPosition, wxSize(65, -1), 0 );
203 m_height->SetHelpText(_("The image height to be shown - does not change the source image height."));
204 if (wxRichTextImageDialog::ShowToolTips())
205 m_height->SetToolTip(_("The image height to be shown - does not change the source image height."));
206 itemBoxSizer14->Add(m_height, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5);
207
208 wxArrayString m_unitsHStrings;
209 m_unitsHStrings.Add(_("px"));
210 m_unitsHStrings.Add(_("cm"));
211 m_unitsH = new wxComboBox( itemDialog1, ID_RICHTEXTIMAGEDIALOG_UNITS_H, _("px"), wxDefaultPosition, wxSize(60, -1), m_unitsHStrings, wxCB_READONLY );
212 m_unitsH->SetStringSelection(_("px"));
213 m_unitsH->SetHelpText(_("Units for the image height."));
214 if (wxRichTextImageDialog::ShowToolTips())
215 m_unitsH->SetToolTip(_("Units for the image height."));
216 itemBoxSizer14->Add(m_unitsH, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5);
217
218 wxStaticText* itemStaticText17 = new wxStaticText( itemDialog1, wxID_STATIC, _("Image Vertical &Offset:"), wxDefaultPosition, wxDefaultSize, 0 );
219 itemFlexGridSizer4->Add(itemStaticText17, 0, wxALIGN_RIGHT|wxALIGN_CENTER_VERTICAL|wxALL, 5);
220
221 wxBoxSizer* itemBoxSizer18 = new wxBoxSizer(wxHORIZONTAL);
222 itemFlexGridSizer4->Add(itemBoxSizer18, 1, wxALIGN_LEFT|wxALIGN_CENTER_VERTICAL, 5);
223
224 m_offset = new wxTextCtrl( itemDialog1, ID_RICHTEXTIMAGEDIALOG_OFFSET, wxEmptyString, wxDefaultPosition, wxSize(65, -1), 0 );
225 m_offset->SetMaxLength(10);
226 m_offset->SetHelpText(_("The vertical offset relative to the paragraph."));
227 if (wxRichTextImageDialog::ShowToolTips())
228 m_offset->SetToolTip(_("The vertical offset relative to the paragraph."));
229 itemBoxSizer18->Add(m_offset, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5);
230
231 wxArrayString m_unitsOffsetStrings;
232 m_unitsOffsetStrings.Add(_("px"));
233 m_unitsOffsetStrings.Add(_("cm"));
234 m_unitsOffset = new wxComboBox( itemDialog1, ID_RICHTEXTIMAGEDIALOG_OFFSET_UNITS, _("px"), wxDefaultPosition, wxSize(60, -1), m_unitsOffsetStrings, wxCB_READONLY );
235 m_unitsOffset->SetStringSelection(_("px"));
236 m_unitsOffset->SetHelpText(_("Units for the image offset."));
237 if (wxRichTextImageDialog::ShowToolTips())
238 m_unitsOffset->SetToolTip(_("Units for the image offset."));
239 itemBoxSizer18->Add(m_unitsOffset, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5);
240
241 wxStaticText* itemStaticText21 = new wxStaticText( itemDialog1, wxID_STATIC, _("&Move the image to:"), wxDefaultPosition, wxDefaultSize, 0 );
242 itemFlexGridSizer4->Add(itemStaticText21, 0, wxALIGN_RIGHT|wxALIGN_CENTER_VERTICAL|wxALL, 5);
243
244 wxBoxSizer* itemBoxSizer22 = new wxBoxSizer(wxHORIZONTAL);
245 itemFlexGridSizer4->Add(itemBoxSizer22, 0, wxALIGN_LEFT|wxALIGN_CENTER_VERTICAL, 5);
246
247 wxButton* itemButton23 = new wxButton( itemDialog1, ID_RICHTEXTIMAGEDIALOG_PARA_UP, _("&Previous Paragraph"), wxDefaultPosition, wxDefaultSize, 0 );
248 itemButton23->SetHelpText(_("Moves the image to the previous paragraph."));
249 if (wxRichTextImageDialog::ShowToolTips())
250 itemButton23->SetToolTip(_("Moves the image to the previous paragraph."));
251 itemBoxSizer22->Add(itemButton23, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5);
252
253 wxButton* itemButton24 = new wxButton( itemDialog1, ID_RICHTEXTIMAGEDIALOG_DOWN, _("&Next Paragraph"), wxDefaultPosition, wxDefaultSize, 0 );
254 itemButton24->SetHelpText(_("Moves the image to the next paragraph."));
255 if (wxRichTextImageDialog::ShowToolTips())
256 itemButton24->SetToolTip(_("Moves the image to the next paragraph."));
257 itemBoxSizer22->Add(itemButton24, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT|wxTOP|wxBOTTOM, 5);
258
259 wxStaticLine* itemStaticLine25 = new wxStaticLine( itemDialog1, wxID_STATIC, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL );
260 itemBoxSizer2->Add(itemStaticLine25, 0, wxGROW|wxALL, 5);
261
262 wxStdDialogButtonSizer* itemStdDialogButtonSizer26 = new wxStdDialogButtonSizer;
263
264 itemBoxSizer2->Add(itemStdDialogButtonSizer26, 0, wxGROW|wxALL, 5);
265 m_saveButton = new wxButton( itemDialog1, wxID_OK, _("OK"), wxDefaultPosition, wxDefaultSize, 0 );
266 m_saveButton->SetHelpText(_("Click to confirm your changes."));
267 if (wxRichTextImageDialog::ShowToolTips())
268 m_saveButton->SetToolTip(_("Click to confirm your changes."));
269 itemStdDialogButtonSizer26->AddButton(m_saveButton);
270
271 m_cancelButton = new wxButton( itemDialog1, wxID_CANCEL, _("Cancel"), wxDefaultPosition, wxDefaultSize, 0 );
272 m_cancelButton->SetHelpText(_("Click to discard your changes."));
273 if (wxRichTextImageDialog::ShowToolTips())
274 m_cancelButton->SetToolTip(_("Click to discard your changes."));
275 itemStdDialogButtonSizer26->AddButton(m_cancelButton);
276
277 itemStdDialogButtonSizer26->Realize();
278
279 ////@end wxRichTextImageDialog content construction
280 }
281
282
283 /*!
284 * Should we show tooltips?
285 */
286
287 bool wxRichTextImageDialog::ShowToolTips()
288 {
289 return true;
290 }
291
292 /*!
293 * Get bitmap resources
294 */
295
296 wxBitmap wxRichTextImageDialog::GetBitmapResource( const wxString& name )
297 {
298 // Bitmap retrieval
299 ////@begin wxRichTextImageDialog bitmap retrieval
300 wxUnusedVar(name);
301 return wxNullBitmap;
302 ////@end wxRichTextImageDialog bitmap retrieval
303 }
304
305 /*!
306 * Get icon resources
307 */
308
309 wxIcon wxRichTextImageDialog::GetIconResource( const wxString& name )
310 {
311 // Icon retrieval
312 ////@begin wxRichTextImageDialog icon retrieval
313 wxUnusedVar(name);
314 return wxNullIcon;
315 ////@end wxRichTextImageDialog icon retrieval
316 }
317
318 /*!
319 * Set the image attribute
320 */
321 void wxRichTextImageDialog::SetImageAttr(const wxRichTextAnchoredObjectAttr& attr)
322 {
323 m_attr = attr;
324 TransferDataToWindow();
325 }
326
327 /*!
328 * Apply the new style
329 */
330 wxRichTextImage* wxRichTextImageDialog::ApplyImageAttr()
331 {
332 wxRichTextImage* image = wxDynamicCast(m_image, wxRichTextImage);
333
334 TransferDataFromWindow();
335 if (m_buffer->GetRichTextCtrl())
336 {
337 m_buffer->GetRichTextCtrl()->SetImageStyle(image, m_attr);
338 }
339 return image;
340 }
341
342 void wxRichTextImageDialog::SetImageObject(wxRichTextImage* image, wxRichTextBuffer* buffer)
343 {
344 wxRichTextObject* parent = image->GetParent();
345
346 m_buffer = buffer;
347 m_image = image;
348 m_parent = parent;
349 SetImageAttr(image->GetAnchoredAttr());
350 if (image->GetImageCache().IsOk())
351 {
352 if (m_attr.m_width == -1)
353 {
354 m_attr.m_width = image->GetImageCache().GetWidth();
355 wxASSERT(m_attr.m_unitsW == wxRICHTEXT_PX);
356
357 m_attr.m_unitsW = wxRICHTEXT_PX;
358 }
359 if (m_attr.m_height == -1)
360 {
361 m_attr.m_height = image->GetImageCache().GetHeight();
362 wxASSERT(m_attr.m_unitsH == wxRICHTEXT_PX);
363
364 m_attr.m_unitsH = wxRICHTEXT_PX;
365 }
366 }
367 }
368
369 bool wxRichTextImageDialog::TransferDataToWindow()
370 {
371 int remain = 100;
372
373 m_alignment->SetSelection(m_attr.m_align);
374 m_float->SetSelection(m_attr.m_floating);
375
376 // Update scale
377 m_unitsW->SetSelection(m_attr.m_unitsW);
378 m_unitsH->SetSelection(m_attr.m_unitsH);
379 m_unitsOffset->SetSelection(m_attr.m_unitsOffset);
380
381 // Update metric
382 m_width->Clear();
383 if (m_attr.m_unitsW == wxRICHTEXT_MM)
384 {
385 int remainder = m_attr.m_width % remain;
386 *m_width << m_attr.m_width / remain;
387 if (remainder)
388 {
389 *m_width << '.' << remainder;
390 }
391 }
392 else
393 {
394 *m_width << m_attr.m_width;
395 }
396
397 m_height->Clear();
398 if (m_attr.m_unitsH == wxRICHTEXT_MM)
399 {
400 int remainder = m_attr.m_height % remain;
401 *m_height << m_attr.m_height / remain;
402 if (remainder)
403 {
404 *m_height << '.' << remainder;
405 }
406 }
407 else
408 {
409 *m_height << m_attr.m_height;
410 }
411
412 m_offset->Clear();
413 if (m_attr.m_unitsOffset == wxRICHTEXT_MM)
414 {
415 int remainder = m_attr.m_offset % remain;
416 *m_offset << m_attr.m_offset / remain;
417 if (remainder)
418 {
419 *m_offset << '.' << remainder;
420 }
421 }
422 else
423 {
424 *m_offset << m_attr.m_offset;
425 }
426
427 return true;
428 }
429
430 bool wxRichTextImageDialog::TransferDataFromWindow()
431 {
432 wxString width = m_width->GetValue();
433 wxString height = m_height->GetValue();
434 wxString offset = m_offset->GetValue();
435 int w, h, o;
436
437 m_attr.m_align = m_alignment->GetSelection();
438 m_attr.m_floating = m_float->GetSelection();
439
440 m_attr.m_unitsW = m_unitsW->GetSelection();
441 m_attr.m_unitsH = m_unitsH->GetSelection();
442 m_attr.m_unitsOffset = m_unitsOffset->GetSelection();
443
444 if (ConvertFromString(width, w, m_attr.m_unitsW))
445 m_attr.m_width = w;
446 if (ConvertFromString(height, h, m_attr.m_unitsH))
447 m_attr.m_height = h;
448 if (ConvertFromString(offset, o, m_attr.m_unitsOffset))
449 m_attr.m_offset = o;
450
451 return true;
452 }
453
454 bool wxRichTextImageDialog::ConvertFromString(const wxString& string, int& ret, int scale)
455 {
456 const wxChar* chars = string.GetData();
457 int remain = 2;
458 bool dot = false;
459 ret = 0;
460
461 for (unsigned int i = 0; i < string.Len() && remain; i++)
462 {
463 if (!(chars[i] >= '0' && chars[i] <= '9') && !(scale == wxRICHTEXT_MM && chars[i] == '.'))
464 return false;
465
466 if (chars[i] == '.')
467 {
468 dot = true;
469 continue;
470 }
471
472 if (dot)
473 remain--;
474
475 ret = ret * 10 + chars[i] - '0';
476 }
477
478 while (remain-- > 0 && scale == wxRICHTEXT_MM)
479 ret *= 10;
480
481 return true;
482 }
483
484
485 /*!
486 * wxEVT_COMMAND_BUTTON_CLICKED event handler for ID_BUTTON_PARA_UP
487 */
488 void wxRichTextImageDialog::OnRichtextimagedialogParaUpClick( wxCommandEvent& WXUNUSED(event))
489 {
490 // Before editing this code, remove the block markers.
491 wxRichTextRange range = m_image->GetRange();
492 wxRichTextObjectList::compatibility_iterator iter = m_buffer->GetChildren().GetFirst();
493 if (iter == NULL)
494 return;
495
496 while (iter)
497 {
498 if (iter->GetData() == m_parent)
499 break;
500 iter = iter->GetNext();
501 }
502
503 iter = iter->GetPrevious();
504 if (iter == NULL)
505 return;
506
507 wxRichTextObject *obj = iter->GetData();
508 wxRichTextRange rg = obj->GetRange();
509 m_image = m_image->Clone();
510
511 m_buffer->DeleteRangeWithUndo(range, m_buffer->GetRichTextCtrl());
512 m_buffer->InsertObjectWithUndo(rg.GetEnd(), m_image, m_buffer->GetRichTextCtrl(), 0);
513 m_parent = obj;
514 m_image->SetRange(wxRichTextRange(rg.GetEnd(), rg.GetEnd()));
515 }
516
517
518 /*!
519 * wxEVT_COMMAND_BUTTON_CLICKED event handler for ID_BUTTON_PARA_DOWN
520 */
521
522 void wxRichTextImageDialog::OnRichtextimagedialogDownClick( wxCommandEvent& WXUNUSED(event))
523 {
524 // Before editing this code, remove the block markers.
525 wxRichTextRange range = m_image->GetRange();
526 wxRichTextObjectList::compatibility_iterator iter = m_buffer->GetChildren().GetFirst();
527 if (iter == NULL)
528 return;
529
530 while (iter)
531 {
532 if (iter->GetData() == m_parent)
533 break;
534 iter = iter->GetNext();
535 }
536
537 iter = iter->GetNext();
538 if (iter == NULL)
539 return;
540
541 wxRichTextObject *obj = iter->GetData();
542 wxRichTextRange rg = obj->GetRange();
543 m_image = m_image->Clone();
544
545 m_buffer->DeleteRangeWithUndo(range, m_buffer->GetRichTextCtrl());
546 m_buffer->InsertObjectWithUndo(rg.GetEnd(), m_image, m_buffer->GetRichTextCtrl(), 0);
547 m_parent = obj;
548 m_image->SetRange(wxRichTextRange(rg.GetEnd(), rg.GetEnd()));
549 }
550