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