1 /////////////////////////////////////////////////////////////////////////////
2 // Name: src/richtext/richtextimagedlg.cpp
4 // Author: Mingquan Yang
6 // Created: Wed 02 Jun 2010 11:27:23 CST
8 // Copyright: (c) Mingquan Yang
9 // Licence: wxWindows licence
10 /////////////////////////////////////////////////////////////////////////////
12 #if defined(__GNUG__) && !defined(NO_GCC_PRAGMA)
13 #pragma implementation "wx/richtext/richtextimagedlg.h"
16 // For compilers that support precompilation, includes "wx/wx.h".
17 #include "wx/wxprec.h"
30 #include "wx/richtext/richtextimagedlg.h"
31 #include "wx/richtext/richtextctrl.h"
38 * wxRichTextImageDialog type definition
41 IMPLEMENT_DYNAMIC_CLASS( wxRichTextImageDialog
, wxDialog
)
45 * wxRichTextImageDialog event table definition
48 BEGIN_EVENT_TABLE( wxRichTextImageDialog
, wxDialog
)
50 ////@begin wxRichTextImageDialog event table entries
51 EVT_BUTTON( ID_RICHTEXTIMAGEDIALOG_PARA_UP
, wxRichTextImageDialog
::OnRichtextimagedialogParaUpClick
)
53 EVT_BUTTON( ID_RICHTEXTIMAGEDIALOG_DOWN
, wxRichTextImageDialog
::OnRichtextimagedialogDownClick
)
55 ////@end wxRichTextImageDialog event table entries
61 * wxRichTextImageDialog constructors
64 wxRichTextImageDialog
::wxRichTextImageDialog()
69 wxRichTextImageDialog
::wxRichTextImageDialog( wxWindow
* parent
, wxWindowID id
, const wxString
& caption
, const wxPoint
& pos
, const wxSize
& size
, long style
)
72 Create(parent
, id
, caption
, pos
, size
, style
);
77 * wxRichTextImageDlg creator
80 bool wxRichTextImageDialog
::Create( wxWindow
* parent
, wxWindowID id
, const wxString
& caption
, const wxPoint
& pos
, const wxSize
& size
, long style
)
82 ////@begin wxRichTextImageDialog creation
83 SetExtraStyle(wxDIALOG_EX_CONTEXTHELP
);
84 wxDialog
::Create( parent
, id
, caption
, pos
, size
, style
);
89 GetSizer()->SetSizeHints(this);
92 ////@end wxRichTextImageDialog creation
98 * wxRichTextImageDialog destructor
101 wxRichTextImageDialog
::~wxRichTextImageDialog()
103 ////@begin wxRichTextImageDialog destruction
104 ////@end wxRichTextImageDialog destruction
109 * Member initialisation
112 void wxRichTextImageDialog
::Init()
114 ////@begin wxRichTextImageDialog member initialisation
122 m_unitsOffset
= NULL
;
124 m_cancelButton
= NULL
;
125 ////@end wxRichTextImageDialog member initialisation
130 * Control creation for wxRichTextImageDlg
133 void wxRichTextImageDialog
::CreateControls()
136 SetWindowVariant(wxWINDOW_VARIANT_SMALL
);
139 ////@begin wxRichTextImageDialog content construction
140 wxRichTextImageDialog
* itemDialog1
= this;
142 wxBoxSizer
* itemBoxSizer2
= new wxBoxSizer(wxVERTICAL
);
143 itemDialog1
->SetSizer(itemBoxSizer2
);
145 wxBoxSizer
* itemBoxSizer3
= new wxBoxSizer(wxHORIZONTAL
);
146 itemBoxSizer2
->Add(itemBoxSizer3
, 0, wxGROW
|wxALL
, 5);
148 wxFlexGridSizer
* itemFlexGridSizer4
= new wxFlexGridSizer(0, 2, 0, 0);
149 itemBoxSizer3
->Add(itemFlexGridSizer4
, 0, wxALIGN_TOP
|wxRIGHT
, 5);
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);
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);
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);
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);
178 wxStaticText
* itemStaticText9
= new wxStaticText( itemDialog1
, wxID_STATIC
, _("&Width:"), wxDefaultPosition
, wxDefaultSize
, 0 );
179 itemFlexGridSizer4
->Add(itemStaticText9
, 0, wxALIGN_RIGHT
|wxALIGN_CENTER_VERTICAL
|wxALL
, 5);
181 wxBoxSizer
* itemBoxSizer10
= new wxBoxSizer(wxHORIZONTAL
);
182 itemFlexGridSizer4
->Add(itemBoxSizer10
, 0, wxALIGN_LEFT
|wxALIGN_CENTER_VERTICAL
, 5);
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);
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);
200 wxStaticText
* itemStaticText13
= new wxStaticText( itemDialog1
, wxID_STATIC
, _("&Height:"), wxDefaultPosition
, wxDefaultSize
, 0 );
201 itemFlexGridSizer4
->Add(itemStaticText13
, 0, wxALIGN_RIGHT
|wxALIGN_CENTER_VERTICAL
|wxALL
, 5);
203 wxBoxSizer
* itemBoxSizer14
= new wxBoxSizer(wxHORIZONTAL
);
204 itemFlexGridSizer4
->Add(itemBoxSizer14
, 0, wxALIGN_LEFT
|wxALIGN_CENTER_VERTICAL
, 5);
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);
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);
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);
225 wxBoxSizer
* itemBoxSizer18
= new wxBoxSizer(wxHORIZONTAL
);
226 itemFlexGridSizer4
->Add(itemBoxSizer18
, 1, wxALIGN_LEFT
|wxALIGN_CENTER_VERTICAL
, 5);
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);
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);
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);
248 wxBoxSizer
* itemBoxSizer22
= new wxBoxSizer(wxHORIZONTAL
);
249 itemFlexGridSizer4
->Add(itemBoxSizer22
, 0, wxALIGN_LEFT
|wxALIGN_CENTER_VERTICAL
, 5);
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);
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);
263 wxStaticLine
* itemStaticLine25
= new wxStaticLine( itemDialog1
, wxID_STATIC
, wxDefaultPosition
, wxDefaultSize
, wxLI_HORIZONTAL
);
264 itemBoxSizer2
->Add(itemStaticLine25
, 0, wxGROW
|wxALL
, 5);
266 wxStdDialogButtonSizer
* itemStdDialogButtonSizer26
= new wxStdDialogButtonSizer
;
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
);
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
);
281 itemStdDialogButtonSizer26
->Realize();
283 ////@end wxRichTextImageDialog content construction
288 * Should we show tooltips?
291 bool wxRichTextImageDialog
::ShowToolTips()
297 * Get bitmap resources
300 wxBitmap wxRichTextImageDialog
::GetBitmapResource( const wxString
& name
)
303 ////@begin wxRichTextImageDialog bitmap retrieval
306 ////@end wxRichTextImageDialog bitmap retrieval
313 wxIcon wxRichTextImageDialog
::GetIconResource( const wxString
& name
)
316 ////@begin wxRichTextImageDialog icon retrieval
319 ////@end wxRichTextImageDialog icon retrieval
323 * Set the image attribute
325 void wxRichTextImageDialog
::SetImageAttr(const wxRichTextAnchoredObjectAttr
& attr
)
328 TransferDataToWindow();
332 * Apply the new style
334 wxRichTextImage
* wxRichTextImageDialog
::ApplyImageAttr()
336 wxRichTextImage
* image
= wxDynamicCast(m_image
, wxRichTextImage
);
338 TransferDataFromWindow();
339 if (m_buffer
->GetRichTextCtrl())
341 m_buffer
->GetRichTextCtrl()->SetImageStyle(image
, m_attr
);
346 void wxRichTextImageDialog
::SetImageObject(wxRichTextImage
* image
, wxRichTextBuffer
* buffer
)
348 wxRichTextObject
* parent
= image
->GetParent();
353 SetImageAttr(image
->GetAnchoredAttr());
354 if (image
->GetImageCache().IsOk())
356 if (m_attr
.m_width
== -1)
358 m_attr
.m_width
= image
->GetImageCache().GetWidth();
359 wxASSERT(m_attr
.m_unitsW
== wxRICHTEXT_PX
);
361 m_attr
.m_unitsW
= wxRICHTEXT_PX
;
363 if (m_attr
.m_height
== -1)
365 m_attr
.m_height
= image
->GetImageCache().GetHeight();
366 wxASSERT(m_attr
.m_unitsH
== wxRICHTEXT_PX
);
368 m_attr
.m_unitsH
= wxRICHTEXT_PX
;
373 bool wxRichTextImageDialog
::TransferDataToWindow()
377 m_alignment
->SetSelection(m_attr
.m_align
);
378 m_float
->SetSelection(m_attr
.m_floating
);
381 m_unitsW
->SetSelection(m_attr
.m_unitsW
);
382 m_unitsH
->SetSelection(m_attr
.m_unitsH
);
383 m_unitsOffset
->SetSelection(m_attr
.m_unitsOffset
);
387 if (m_attr
.m_unitsW
== wxRICHTEXT_MM
)
389 int remainder
= m_attr
.m_width
% remain
;
390 *m_width
<< m_attr
.m_width
/ remain
;
393 *m_width
<< '.' << remainder
;
398 *m_width
<< m_attr
.m_width
;
402 if (m_attr
.m_unitsH
== wxRICHTEXT_MM
)
404 int remainder
= m_attr
.m_height
% remain
;
405 *m_height
<< m_attr
.m_height
/ remain
;
408 *m_height
<< '.' << remainder
;
413 *m_height
<< m_attr
.m_height
;
417 if (m_attr
.m_unitsOffset
== wxRICHTEXT_MM
)
419 int remainder
= m_attr
.m_offset
% remain
;
420 *m_offset
<< m_attr
.m_offset
/ remain
;
423 *m_offset
<< '.' << remainder
;
428 *m_offset
<< m_attr
.m_offset
;
434 bool wxRichTextImageDialog
::TransferDataFromWindow()
436 wxString width
= m_width
->GetValue();
437 wxString height
= m_height
->GetValue();
438 wxString offset
= m_offset
->GetValue();
441 m_attr
.m_align
= m_alignment
->GetSelection();
442 m_attr
.m_floating
= m_float
->GetSelection();
444 m_attr
.m_unitsW
= m_unitsW
->GetSelection();
445 m_attr
.m_unitsH
= m_unitsH
->GetSelection();
446 m_attr
.m_unitsOffset
= m_unitsOffset
->GetSelection();
448 if (ConvertFromString(width
, w
, m_attr
.m_unitsW
))
450 if (ConvertFromString(height
, h
, m_attr
.m_unitsH
))
452 if (ConvertFromString(offset
, o
, m_attr
.m_unitsOffset
))
458 bool wxRichTextImageDialog
::ConvertFromString(const wxString
& string
, int& ret
, int scale
)
460 const wxChar
* chars
= string
.GetData();
465 for (unsigned int i
= 0; i
< string
.Len() && remain
; i
++)
467 if (!(chars
[i
] >= '0' && chars
[i
] <= '9') && !(scale
== wxRICHTEXT_MM
&& chars
[i
] == '.'))
479 ret
= ret
* 10 + chars
[i
] - '0';
482 while (remain
-- > 0 && scale
== wxRICHTEXT_MM
)
490 * wxEVT_COMMAND_BUTTON_CLICKED event handler for ID_BUTTON_PARA_UP
492 void wxRichTextImageDialog
::OnRichtextimagedialogParaUpClick( wxCommandEvent
& WXUNUSED(event
))
494 // Before editing this code, remove the block markers.
495 wxRichTextRange range
= m_image
->GetRange();
496 wxRichTextObjectList
::compatibility_iterator iter
= m_buffer
->GetChildren().GetFirst();
502 if (iter
->GetData() == m_parent
)
504 iter
= iter
->GetNext();
507 iter
= iter
->GetPrevious();
511 wxRichTextObject
*obj
= iter
->GetData();
512 wxRichTextRange rg
= obj
->GetRange();
513 m_image
= m_image
->Clone();
515 m_buffer
->DeleteRangeWithUndo(range
, m_buffer
->GetRichTextCtrl());
516 m_buffer
->InsertObjectWithUndo(rg
.GetEnd(), m_image
, m_buffer
->GetRichTextCtrl(), 0);
518 m_image
->SetRange(wxRichTextRange(rg
.GetEnd(), rg
.GetEnd()));
523 * wxEVT_COMMAND_BUTTON_CLICKED event handler for ID_BUTTON_PARA_DOWN
526 void wxRichTextImageDialog
::OnRichtextimagedialogDownClick( wxCommandEvent
& WXUNUSED(event
))
528 // Before editing this code, remove the block markers.
529 wxRichTextRange range
= m_image
->GetRange();
530 wxRichTextObjectList
::compatibility_iterator iter
= m_buffer
->GetChildren().GetFirst();
536 if (iter
->GetData() == m_parent
)
538 iter
= iter
->GetNext();
541 iter
= iter
->GetNext();
545 wxRichTextObject
*obj
= iter
->GetData();
546 wxRichTextRange rg
= obj
->GetRange();
547 m_image
= m_image
->Clone();
549 m_buffer
->DeleteRangeWithUndo(range
, m_buffer
->GetRichTextCtrl());
550 m_buffer
->InsertObjectWithUndo(rg
.GetEnd(), m_image
, m_buffer
->GetRichTextCtrl(), 0);
552 m_image
->SetRange(wxRichTextRange(rg
.GetEnd(), rg
.GetEnd()));