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