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 // For compilers that support precompilation, includes "wx/wx.h".
13 #include "wx/wxprec.h"
26 #include "wx/richtext/richtextimagedlg.h"
27 #include "wx/richtext/richtextctrl.h"
34 * wxRichTextImageDialog type definition
37 IMPLEMENT_DYNAMIC_CLASS( wxRichTextImageDialog
, wxDialog
)
41 * wxRichTextImageDialog event table definition
44 BEGIN_EVENT_TABLE( wxRichTextImageDialog
, wxDialog
)
46 ////@begin wxRichTextImageDialog event table entries
47 EVT_BUTTON( ID_RICHTEXTIMAGEDIALOG_PARA_UP
, wxRichTextImageDialog
::OnRichtextimagedialogParaUpClick
)
49 EVT_BUTTON( ID_RICHTEXTIMAGEDIALOG_DOWN
, wxRichTextImageDialog
::OnRichtextimagedialogDownClick
)
51 ////@end wxRichTextImageDialog event table entries
57 * wxRichTextImageDialog constructors
60 wxRichTextImageDialog
::wxRichTextImageDialog()
65 wxRichTextImageDialog
::wxRichTextImageDialog( wxWindow
* parent
, wxWindowID id
, const wxString
& caption
, const wxPoint
& pos
, const wxSize
& size
, long style
)
68 Create(parent
, id
, caption
, pos
, size
, style
);
73 * wxRichTextImageDlg creator
76 bool wxRichTextImageDialog
::Create( wxWindow
* parent
, wxWindowID id
, const wxString
& caption
, const wxPoint
& pos
, const wxSize
& size
, long style
)
78 ////@begin wxRichTextImageDialog creation
79 SetExtraStyle(wxDIALOG_EX_CONTEXTHELP
);
80 wxDialog
::Create( parent
, id
, caption
, pos
, size
, style
);
85 GetSizer()->SetSizeHints(this);
88 ////@end wxRichTextImageDialog creation
94 * wxRichTextImageDialog destructor
97 wxRichTextImageDialog
::~wxRichTextImageDialog()
99 ////@begin wxRichTextImageDialog destruction
100 ////@end wxRichTextImageDialog destruction
105 * Member initialisation
108 void wxRichTextImageDialog
::Init()
110 ////@begin wxRichTextImageDialog member initialisation
118 m_unitsOffset
= NULL
;
120 m_cancelButton
= NULL
;
121 ////@end wxRichTextImageDialog member initialisation
126 * Control creation for wxRichTextImageDlg
129 void wxRichTextImageDialog
::CreateControls()
132 SetWindowVariant(wxWINDOW_VARIANT_SMALL
);
135 ////@begin wxRichTextImageDialog content construction
136 wxRichTextImageDialog
* itemDialog1
= this;
138 wxBoxSizer
* itemBoxSizer2
= new wxBoxSizer(wxVERTICAL
);
139 itemDialog1
->SetSizer(itemBoxSizer2
);
141 wxBoxSizer
* itemBoxSizer3
= new wxBoxSizer(wxHORIZONTAL
);
142 itemBoxSizer2
->Add(itemBoxSizer3
, 0, wxGROW
|wxALL
, 5);
144 wxFlexGridSizer
* itemFlexGridSizer4
= new wxFlexGridSizer(0, 2, 0, 0);
145 itemBoxSizer3
->Add(itemFlexGridSizer4
, 0, wxALIGN_TOP
|wxRIGHT
, 5);
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);
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);
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);
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);
174 wxStaticText
* itemStaticText9
= new wxStaticText( itemDialog1
, wxID_STATIC
, _("&Width:"), wxDefaultPosition
, wxDefaultSize
, 0 );
175 itemFlexGridSizer4
->Add(itemStaticText9
, 0, wxALIGN_RIGHT
|wxALIGN_CENTER_VERTICAL
|wxALL
, 5);
177 wxBoxSizer
* itemBoxSizer10
= new wxBoxSizer(wxHORIZONTAL
);
178 itemFlexGridSizer4
->Add(itemBoxSizer10
, 0, wxALIGN_LEFT
|wxALIGN_CENTER_VERTICAL
, 5);
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);
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);
196 wxStaticText
* itemStaticText13
= new wxStaticText( itemDialog1
, wxID_STATIC
, _("&Height:"), wxDefaultPosition
, wxDefaultSize
, 0 );
197 itemFlexGridSizer4
->Add(itemStaticText13
, 0, wxALIGN_RIGHT
|wxALIGN_CENTER_VERTICAL
|wxALL
, 5);
199 wxBoxSizer
* itemBoxSizer14
= new wxBoxSizer(wxHORIZONTAL
);
200 itemFlexGridSizer4
->Add(itemBoxSizer14
, 0, wxALIGN_LEFT
|wxALIGN_CENTER_VERTICAL
, 5);
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);
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);
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);
221 wxBoxSizer
* itemBoxSizer18
= new wxBoxSizer(wxHORIZONTAL
);
222 itemFlexGridSizer4
->Add(itemBoxSizer18
, 1, wxALIGN_LEFT
|wxALIGN_CENTER_VERTICAL
, 5);
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);
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);
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);
244 wxBoxSizer
* itemBoxSizer22
= new wxBoxSizer(wxHORIZONTAL
);
245 itemFlexGridSizer4
->Add(itemBoxSizer22
, 0, wxALIGN_LEFT
|wxALIGN_CENTER_VERTICAL
, 5);
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);
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);
259 wxStaticLine
* itemStaticLine25
= new wxStaticLine( itemDialog1
, wxID_STATIC
, wxDefaultPosition
, wxDefaultSize
, wxLI_HORIZONTAL
);
260 itemBoxSizer2
->Add(itemStaticLine25
, 0, wxGROW
|wxALL
, 5);
262 wxStdDialogButtonSizer
* itemStdDialogButtonSizer26
= new wxStdDialogButtonSizer
;
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
);
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
);
277 itemStdDialogButtonSizer26
->Realize();
279 ////@end wxRichTextImageDialog content construction
284 * Should we show tooltips?
287 bool wxRichTextImageDialog
::ShowToolTips()
293 * Get bitmap resources
296 wxBitmap wxRichTextImageDialog
::GetBitmapResource( const wxString
& name
)
299 ////@begin wxRichTextImageDialog bitmap retrieval
302 ////@end wxRichTextImageDialog bitmap retrieval
309 wxIcon wxRichTextImageDialog
::GetIconResource( const wxString
& name
)
312 ////@begin wxRichTextImageDialog icon retrieval
315 ////@end wxRichTextImageDialog icon retrieval
319 * Set the image attribute
321 void wxRichTextImageDialog
::SetImageAttr(const wxRichTextAnchoredObjectAttr
& attr
)
324 TransferDataToWindow();
328 * Apply the new style
330 wxRichTextImage
* wxRichTextImageDialog
::ApplyImageAttr()
332 wxRichTextImage
* image
= wxDynamicCast(m_image
, wxRichTextImage
);
334 TransferDataFromWindow();
335 if (m_buffer
->GetRichTextCtrl())
337 m_buffer
->GetRichTextCtrl()->SetImageStyle(image
, m_attr
);
342 void wxRichTextImageDialog
::SetImageObject(wxRichTextImage
* image
, wxRichTextBuffer
* buffer
)
344 wxRichTextObject
* parent
= image
->GetParent();
349 SetImageAttr(image
->GetAnchoredAttr());
350 if (image
->GetImageCache().IsOk())
352 if (m_attr
.m_width
== -1)
354 m_attr
.m_width
= image
->GetImageCache().GetWidth();
355 wxASSERT(m_attr
.m_unitsW
== wxRICHTEXT_PX
);
357 m_attr
.m_unitsW
= wxRICHTEXT_PX
;
359 if (m_attr
.m_height
== -1)
361 m_attr
.m_height
= image
->GetImageCache().GetHeight();
362 wxASSERT(m_attr
.m_unitsH
== wxRICHTEXT_PX
);
364 m_attr
.m_unitsH
= wxRICHTEXT_PX
;
369 bool wxRichTextImageDialog
::TransferDataToWindow()
373 m_alignment
->SetSelection(m_attr
.m_align
);
374 m_float
->SetSelection(m_attr
.m_floating
);
377 m_unitsW
->SetSelection(m_attr
.m_unitsW
);
378 m_unitsH
->SetSelection(m_attr
.m_unitsH
);
379 m_unitsOffset
->SetSelection(m_attr
.m_unitsOffset
);
383 if (m_attr
.m_unitsW
== wxRICHTEXT_MM
)
385 int remainder
= m_attr
.m_width
% remain
;
386 *m_width
<< m_attr
.m_width
/ remain
;
389 *m_width
<< '.' << remainder
;
394 *m_width
<< m_attr
.m_width
;
398 if (m_attr
.m_unitsH
== wxRICHTEXT_MM
)
400 int remainder
= m_attr
.m_height
% remain
;
401 *m_height
<< m_attr
.m_height
/ remain
;
404 *m_height
<< '.' << remainder
;
409 *m_height
<< m_attr
.m_height
;
413 if (m_attr
.m_unitsOffset
== wxRICHTEXT_MM
)
415 int remainder
= m_attr
.m_offset
% remain
;
416 *m_offset
<< m_attr
.m_offset
/ remain
;
419 *m_offset
<< '.' << remainder
;
424 *m_offset
<< m_attr
.m_offset
;
430 bool wxRichTextImageDialog
::TransferDataFromWindow()
432 wxString width
= m_width
->GetValue();
433 wxString height
= m_height
->GetValue();
434 wxString offset
= m_offset
->GetValue();
437 m_attr
.m_align
= m_alignment
->GetSelection();
438 m_attr
.m_floating
= m_float
->GetSelection();
440 m_attr
.m_unitsW
= m_unitsW
->GetSelection();
441 m_attr
.m_unitsH
= m_unitsH
->GetSelection();
442 m_attr
.m_unitsOffset
= m_unitsOffset
->GetSelection();
444 if (ConvertFromString(width
, w
, m_attr
.m_unitsW
))
446 if (ConvertFromString(height
, h
, m_attr
.m_unitsH
))
448 if (ConvertFromString(offset
, o
, m_attr
.m_unitsOffset
))
454 bool wxRichTextImageDialog
::ConvertFromString(const wxString
& string
, int& ret
, int scale
)
456 const wxChar
* chars
= string
.GetData();
461 for (unsigned int i
= 0; i
< string
.Len() && remain
; i
++)
463 if (!(chars
[i
] >= '0' && chars
[i
] <= '9') && !(scale
== wxRICHTEXT_MM
&& chars
[i
] == '.'))
475 ret
= ret
* 10 + chars
[i
] - '0';
478 while (remain
-- > 0 && scale
== wxRICHTEXT_MM
)
486 * wxEVT_COMMAND_BUTTON_CLICKED event handler for ID_BUTTON_PARA_UP
488 void wxRichTextImageDialog
::OnRichtextimagedialogParaUpClick( wxCommandEvent
& WXUNUSED(event
))
490 // Before editing this code, remove the block markers.
491 wxRichTextRange range
= m_image
->GetRange();
492 wxRichTextObjectList
::compatibility_iterator iter
= m_buffer
->GetChildren().GetFirst();
498 if (iter
->GetData() == m_parent
)
500 iter
= iter
->GetNext();
503 iter
= iter
->GetPrevious();
507 wxRichTextObject
*obj
= iter
->GetData();
508 wxRichTextRange rg
= obj
->GetRange();
509 m_image
= m_image
->Clone();
511 m_buffer
->DeleteRangeWithUndo(range
, m_buffer
->GetRichTextCtrl());
512 m_buffer
->InsertObjectWithUndo(rg
.GetEnd(), m_image
, m_buffer
->GetRichTextCtrl(), 0);
514 m_image
->SetRange(wxRichTextRange(rg
.GetEnd(), rg
.GetEnd()));
519 * wxEVT_COMMAND_BUTTON_CLICKED event handler for ID_BUTTON_PARA_DOWN
522 void wxRichTextImageDialog
::OnRichtextimagedialogDownClick( wxCommandEvent
& WXUNUSED(event
))
524 // Before editing this code, remove the block markers.
525 wxRichTextRange range
= m_image
->GetRange();
526 wxRichTextObjectList
::compatibility_iterator iter
= m_buffer
->GetChildren().GetFirst();
532 if (iter
->GetData() == m_parent
)
534 iter
= iter
->GetNext();
537 iter
= iter
->GetNext();
541 wxRichTextObject
*obj
= iter
->GetData();
542 wxRichTextRange rg
= obj
->GetRange();
543 m_image
= m_image
->Clone();
545 m_buffer
->DeleteRangeWithUndo(range
, m_buffer
->GetRichTextCtrl());
546 m_buffer
->InsertObjectWithUndo(rg
.GetEnd(), m_image
, m_buffer
->GetRichTextCtrl(), 0);
548 m_image
->SetRange(wxRichTextRange(rg
.GetEnd(), rg
.GetEnd()));