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"
20 #include "wx/button.h"
21 #include "wx/combobox.h"
23 #include "wx/stattext.h"
24 #include "wx/textctrl.h"
27 #include "wx/statline.h"
29 #include "wx/richtext/richtextimagedlg.h"
30 #include "wx/richtext/richtextctrl.h"
37 * wxRichTextImageDialog type definition
40 IMPLEMENT_DYNAMIC_CLASS( wxRichTextImageDialog
, wxDialog
)
44 * wxRichTextImageDialog event table definition
47 BEGIN_EVENT_TABLE( wxRichTextImageDialog
, wxDialog
)
49 ////@begin wxRichTextImageDialog event table entries
50 EVT_BUTTON( ID_RICHTEXTIMAGEDIALOG_PARA_UP
, wxRichTextImageDialog::OnRichtextimagedialogParaUpClick
)
52 EVT_BUTTON( ID_RICHTEXTIMAGEDIALOG_DOWN
, wxRichTextImageDialog::OnRichtextimagedialogDownClick
)
54 ////@end wxRichTextImageDialog event table entries
60 * wxRichTextImageDialog constructors
63 wxRichTextImageDialog::wxRichTextImageDialog()
68 wxRichTextImageDialog::wxRichTextImageDialog( wxWindow
* parent
, wxWindowID id
, const wxString
& caption
, const wxPoint
& pos
, const wxSize
& size
, long style
)
71 Create(parent
, id
, caption
, pos
, size
, style
);
76 * wxRichTextImageDlg creator
79 bool wxRichTextImageDialog::Create( wxWindow
* parent
, wxWindowID id
, const wxString
& caption
, const wxPoint
& pos
, const wxSize
& size
, long style
)
81 ////@begin wxRichTextImageDialog creation
82 SetExtraStyle(wxDIALOG_EX_CONTEXTHELP
);
83 wxDialog::Create( parent
, id
, caption
, pos
, size
, style
);
88 GetSizer()->SetSizeHints(this);
91 ////@end wxRichTextImageDialog creation
97 * wxRichTextImageDialog destructor
100 wxRichTextImageDialog::~wxRichTextImageDialog()
102 ////@begin wxRichTextImageDialog destruction
103 ////@end wxRichTextImageDialog destruction
108 * Member initialisation
111 void wxRichTextImageDialog::Init()
113 ////@begin wxRichTextImageDialog member initialisation
121 m_unitsOffset
= NULL
;
123 m_cancelButton
= NULL
;
124 ////@end wxRichTextImageDialog member initialisation
129 * Control creation for wxRichTextImageDlg
132 void wxRichTextImageDialog::CreateControls()
135 SetWindowVariant(wxWINDOW_VARIANT_SMALL
);
138 ////@begin wxRichTextImageDialog content construction
139 wxRichTextImageDialog
* itemDialog1
= this;
141 wxBoxSizer
* itemBoxSizer2
= new wxBoxSizer(wxVERTICAL
);
142 itemDialog1
->SetSizer(itemBoxSizer2
);
144 wxBoxSizer
* itemBoxSizer3
= new wxBoxSizer(wxHORIZONTAL
);
145 itemBoxSizer2
->Add(itemBoxSizer3
, 0, wxGROW
|wxALL
, 5);
147 wxFlexGridSizer
* itemFlexGridSizer4
= new wxFlexGridSizer(0, 2, 0, 0);
148 itemBoxSizer3
->Add(itemFlexGridSizer4
, 0, wxALIGN_TOP
|wxRIGHT
, 5);
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);
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);
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);
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);
177 wxStaticText
* itemStaticText9
= new wxStaticText( itemDialog1
, wxID_STATIC
, _("&Width:"), wxDefaultPosition
, wxDefaultSize
, 0 );
178 itemFlexGridSizer4
->Add(itemStaticText9
, 0, wxALIGN_RIGHT
|wxALIGN_CENTER_VERTICAL
|wxALL
, 5);
180 wxBoxSizer
* itemBoxSizer10
= new wxBoxSizer(wxHORIZONTAL
);
181 itemFlexGridSizer4
->Add(itemBoxSizer10
, 0, wxALIGN_LEFT
|wxALIGN_CENTER_VERTICAL
, 5);
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);
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);
199 wxStaticText
* itemStaticText13
= new wxStaticText( itemDialog1
, wxID_STATIC
, _("&Height:"), wxDefaultPosition
, wxDefaultSize
, 0 );
200 itemFlexGridSizer4
->Add(itemStaticText13
, 0, wxALIGN_RIGHT
|wxALIGN_CENTER_VERTICAL
|wxALL
, 5);
202 wxBoxSizer
* itemBoxSizer14
= new wxBoxSizer(wxHORIZONTAL
);
203 itemFlexGridSizer4
->Add(itemBoxSizer14
, 0, wxALIGN_LEFT
|wxALIGN_CENTER_VERTICAL
, 5);
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);
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);
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);
224 wxBoxSizer
* itemBoxSizer18
= new wxBoxSizer(wxHORIZONTAL
);
225 itemFlexGridSizer4
->Add(itemBoxSizer18
, 1, wxALIGN_LEFT
|wxALIGN_CENTER_VERTICAL
, 5);
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);
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);
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);
247 wxBoxSizer
* itemBoxSizer22
= new wxBoxSizer(wxHORIZONTAL
);
248 itemFlexGridSizer4
->Add(itemBoxSizer22
, 0, wxALIGN_LEFT
|wxALIGN_CENTER_VERTICAL
, 5);
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);
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);
262 wxStaticLine
* itemStaticLine25
= new wxStaticLine( itemDialog1
, wxID_STATIC
, wxDefaultPosition
, wxDefaultSize
, wxLI_HORIZONTAL
);
263 itemBoxSizer2
->Add(itemStaticLine25
, 0, wxGROW
|wxALL
, 5);
265 wxStdDialogButtonSizer
* itemStdDialogButtonSizer26
= new wxStdDialogButtonSizer
;
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
);
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
);
280 itemStdDialogButtonSizer26
->Realize();
282 ////@end wxRichTextImageDialog content construction
287 * Should we show tooltips?
290 bool wxRichTextImageDialog::ShowToolTips()
296 * Get bitmap resources
299 wxBitmap
wxRichTextImageDialog::GetBitmapResource( const wxString
& name
)
302 ////@begin wxRichTextImageDialog bitmap retrieval
305 ////@end wxRichTextImageDialog bitmap retrieval
312 wxIcon
wxRichTextImageDialog::GetIconResource( const wxString
& name
)
315 ////@begin wxRichTextImageDialog icon retrieval
318 ////@end wxRichTextImageDialog icon retrieval
322 * Set the image attribute
324 void wxRichTextImageDialog::SetImageAttr(const wxRichTextAnchoredObjectAttr
& attr
)
327 TransferDataToWindow();
331 * Apply the new style
333 wxRichTextImage
* wxRichTextImageDialog::ApplyImageAttr()
335 wxRichTextImage
* image
= wxDynamicCast(m_image
, wxRichTextImage
);
337 TransferDataFromWindow();
338 if (m_buffer
->GetRichTextCtrl())
340 m_buffer
->GetRichTextCtrl()->SetImageStyle(image
, m_attr
);
345 void wxRichTextImageDialog::SetImageObject(wxRichTextImage
* image
, wxRichTextBuffer
* buffer
)
347 wxRichTextObject
* parent
= image
->GetParent();
352 SetImageAttr(image
->GetAnchoredAttr());
353 if (image
->GetImageCache().IsOk())
355 if (m_attr
.m_width
== -1)
357 m_attr
.m_width
= image
->GetImageCache().GetWidth();
358 wxASSERT(m_attr
.m_unitsW
== wxRICHTEXT_PX
);
360 m_attr
.m_unitsW
= wxRICHTEXT_PX
;
362 if (m_attr
.m_height
== -1)
364 m_attr
.m_height
= image
->GetImageCache().GetHeight();
365 wxASSERT(m_attr
.m_unitsH
== wxRICHTEXT_PX
);
367 m_attr
.m_unitsH
= wxRICHTEXT_PX
;
372 bool wxRichTextImageDialog::TransferDataToWindow()
376 m_alignment
->SetSelection(m_attr
.m_align
);
377 m_float
->SetSelection(m_attr
.m_floating
);
380 m_unitsW
->SetSelection(m_attr
.m_unitsW
);
381 m_unitsH
->SetSelection(m_attr
.m_unitsH
);
382 m_unitsOffset
->SetSelection(m_attr
.m_unitsOffset
);
386 if (m_attr
.m_unitsW
== wxRICHTEXT_MM
)
388 int remainder
= m_attr
.m_width
% remain
;
389 *m_width
<< m_attr
.m_width
/ remain
;
392 *m_width
<< '.' << remainder
;
397 *m_width
<< m_attr
.m_width
;
401 if (m_attr
.m_unitsH
== wxRICHTEXT_MM
)
403 int remainder
= m_attr
.m_height
% remain
;
404 *m_height
<< m_attr
.m_height
/ remain
;
407 *m_height
<< '.' << remainder
;
412 *m_height
<< m_attr
.m_height
;
416 if (m_attr
.m_unitsOffset
== wxRICHTEXT_MM
)
418 int remainder
= m_attr
.m_offset
% remain
;
419 *m_offset
<< m_attr
.m_offset
/ remain
;
422 *m_offset
<< '.' << remainder
;
427 *m_offset
<< m_attr
.m_offset
;
433 bool wxRichTextImageDialog::TransferDataFromWindow()
435 wxString width
= m_width
->GetValue();
436 wxString height
= m_height
->GetValue();
437 wxString offset
= m_offset
->GetValue();
440 m_attr
.m_align
= m_alignment
->GetSelection();
441 m_attr
.m_floating
= m_float
->GetSelection();
443 m_attr
.m_unitsW
= m_unitsW
->GetSelection();
444 m_attr
.m_unitsH
= m_unitsH
->GetSelection();
445 m_attr
.m_unitsOffset
= m_unitsOffset
->GetSelection();
447 if (ConvertFromString(width
, w
, m_attr
.m_unitsW
))
449 if (ConvertFromString(height
, h
, m_attr
.m_unitsH
))
451 if (ConvertFromString(offset
, o
, m_attr
.m_unitsOffset
))
457 bool wxRichTextImageDialog::ConvertFromString(const wxString
& string
, int& ret
, int scale
)
459 const wxChar
* chars
= string
.GetData();
464 for (unsigned int i
= 0; i
< string
.Len() && remain
; i
++)
466 if (!(chars
[i
] >= '0' && chars
[i
] <= '9') && !(scale
== wxRICHTEXT_MM
&& chars
[i
] == '.'))
478 ret
= ret
* 10 + chars
[i
] - '0';
481 while (remain
-- > 0 && scale
== wxRICHTEXT_MM
)
489 * wxEVT_COMMAND_BUTTON_CLICKED event handler for ID_BUTTON_PARA_UP
491 void wxRichTextImageDialog::OnRichtextimagedialogParaUpClick( wxCommandEvent
& WXUNUSED(event
))
493 // Before editing this code, remove the block markers.
494 wxRichTextRange range
= m_image
->GetRange();
495 wxRichTextObjectList::compatibility_iterator iter
= m_buffer
->GetChildren().GetFirst();
501 if (iter
->GetData() == m_parent
)
503 iter
= iter
->GetNext();
506 iter
= iter
->GetPrevious();
510 wxRichTextObject
*obj
= iter
->GetData();
511 wxRichTextRange rg
= obj
->GetRange();
512 m_image
= m_image
->Clone();
514 m_buffer
->DeleteRangeWithUndo(range
, m_buffer
->GetRichTextCtrl());
515 m_buffer
->InsertObjectWithUndo(rg
.GetEnd(), m_image
, m_buffer
->GetRichTextCtrl(), 0);
517 m_image
->SetRange(wxRichTextRange(rg
.GetEnd(), rg
.GetEnd()));
522 * wxEVT_COMMAND_BUTTON_CLICKED event handler for ID_BUTTON_PARA_DOWN
525 void wxRichTextImageDialog::OnRichtextimagedialogDownClick( wxCommandEvent
& WXUNUSED(event
))
527 // Before editing this code, remove the block markers.
528 wxRichTextRange range
= m_image
->GetRange();
529 wxRichTextObjectList::compatibility_iterator iter
= m_buffer
->GetChildren().GetFirst();
535 if (iter
->GetData() == m_parent
)
537 iter
= iter
->GetNext();
540 iter
= iter
->GetNext();
544 wxRichTextObject
*obj
= iter
->GetData();
545 wxRichTextRange rg
= obj
->GetRange();
546 m_image
= m_image
->Clone();
548 m_buffer
->DeleteRangeWithUndo(range
, m_buffer
->GetRichTextCtrl());
549 m_buffer
->InsertObjectWithUndo(rg
.GetEnd(), m_image
, m_buffer
->GetRichTextCtrl(), 0);
551 m_image
->SetRange(wxRichTextRange(rg
.GetEnd(), rg
.GetEnd()));