Merged wxRichTextAttr and wxTextAttrEx into wxTextAttr, and added a font table
[wxWidgets.git] / src / richtext / richtexttabspage.cpp
1 /////////////////////////////////////////////////////////////////////////////
2 // Name: src/richtext/richtexttabspage.cpp
3 // Purpose:
4 // Author: Julian Smart
5 // Modified by:
6 // Created: 10/4/2006 8:03:20 AM
7 // RCS-ID: $Id$
8 // Copyright: (c) Julian Smart
9 // Licence: wxWindows licence
10 /////////////////////////////////////////////////////////////////////////////
11
12 #if wxUSE_RICHTEXT
13
14 #include "wx/richtext/richtexttabspage.h"
15
16 /*!
17 * wxRichTextTabsPage type definition
18 */
19
20 IMPLEMENT_DYNAMIC_CLASS( wxRichTextTabsPage, wxPanel )
21
22 /*!
23 * wxRichTextTabsPage event table definition
24 */
25
26 BEGIN_EVENT_TABLE( wxRichTextTabsPage, wxPanel )
27
28 ////@begin wxRichTextTabsPage event table entries
29 EVT_LISTBOX( ID_RICHTEXTTABSPAGE_TABLIST, wxRichTextTabsPage::OnTablistSelected )
30
31 EVT_BUTTON( ID_RICHTEXTTABSPAGE_NEW_TAB, wxRichTextTabsPage::OnNewTabClick )
32 EVT_UPDATE_UI( ID_RICHTEXTTABSPAGE_NEW_TAB, wxRichTextTabsPage::OnNewTabUpdate )
33
34 EVT_BUTTON( ID_RICHTEXTTABSPAGE_DELETE_TAB, wxRichTextTabsPage::OnDeleteTabClick )
35 EVT_UPDATE_UI( ID_RICHTEXTTABSPAGE_DELETE_TAB, wxRichTextTabsPage::OnDeleteTabUpdate )
36
37 EVT_BUTTON( ID_RICHTEXTTABSPAGE_DELETE_ALL_TABS, wxRichTextTabsPage::OnDeleteAllTabsClick )
38 EVT_UPDATE_UI( ID_RICHTEXTTABSPAGE_DELETE_ALL_TABS, wxRichTextTabsPage::OnDeleteAllTabsUpdate )
39
40 ////@end wxRichTextTabsPage event table entries
41
42 END_EVENT_TABLE()
43
44 /*!
45 * wxRichTextTabsPage constructors
46 */
47
48 wxRichTextTabsPage::wxRichTextTabsPage( )
49 {
50 Init();
51 }
52
53 wxRichTextTabsPage::wxRichTextTabsPage( wxWindow* parent, wxWindowID id, const wxPoint& pos, const wxSize& size, long style )
54 {
55 Init();
56 Create(parent, id, pos, size, style);
57 }
58
59 /*!
60 * Initialise members
61 */
62
63 void wxRichTextTabsPage::Init()
64 {
65 m_tabsPresent = false;
66
67 ////@begin wxRichTextTabsPage member initialisation
68 m_tabEditCtrl = NULL;
69 m_tabListCtrl = NULL;
70 ////@end wxRichTextTabsPage member initialisation
71 }
72
73 /*!
74 * wxRichTextTabsPage creator
75 */
76
77 bool wxRichTextTabsPage::Create( wxWindow* parent, wxWindowID id, const wxPoint& pos, const wxSize& size, long style )
78 {
79 ////@begin wxRichTextTabsPage creation
80 wxPanel::Create( parent, id, pos, size, style );
81
82 CreateControls();
83 if (GetSizer())
84 {
85 GetSizer()->SetSizeHints(this);
86 }
87 Centre();
88 ////@end wxRichTextTabsPage creation
89 return true;
90 }
91
92 /*!
93 * Control creation for wxRichTextTabsPage
94 */
95
96 void wxRichTextTabsPage::CreateControls()
97 {
98 ////@begin wxRichTextTabsPage content construction
99 wxRichTextTabsPage* itemPanel1 = this;
100
101 wxBoxSizer* itemBoxSizer2 = new wxBoxSizer(wxVERTICAL);
102 itemPanel1->SetSizer(itemBoxSizer2);
103
104 wxBoxSizer* itemBoxSizer3 = new wxBoxSizer(wxVERTICAL);
105 itemBoxSizer2->Add(itemBoxSizer3, 1, wxGROW|wxALL, 5);
106
107 wxBoxSizer* itemBoxSizer4 = new wxBoxSizer(wxHORIZONTAL);
108 itemBoxSizer3->Add(itemBoxSizer4, 1, wxGROW, 5);
109
110 wxBoxSizer* itemBoxSizer5 = new wxBoxSizer(wxVERTICAL);
111 itemBoxSizer4->Add(itemBoxSizer5, 0, wxGROW, 5);
112
113 wxStaticText* itemStaticText6 = new wxStaticText( itemPanel1, wxID_STATIC, _("&Position (tenths of a mm):"), wxDefaultPosition, wxDefaultSize, 0 );
114 itemBoxSizer5->Add(itemStaticText6, 0, wxALIGN_LEFT|wxLEFT|wxRIGHT|wxTOP, 5);
115
116 m_tabEditCtrl = new wxTextCtrl( itemPanel1, ID_RICHTEXTTABSPAGE_TABEDIT, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 );
117 m_tabEditCtrl->SetHelpText(_("The tab position."));
118 if (ShowToolTips())
119 m_tabEditCtrl->SetToolTip(_("The tab position."));
120 itemBoxSizer5->Add(m_tabEditCtrl, 0, wxGROW|wxALL, 5);
121
122 wxString m_tabListCtrlStrings[] = {
123 _("The tab positions.")
124 };
125 m_tabListCtrl = new wxListBox( itemPanel1, ID_RICHTEXTTABSPAGE_TABLIST, wxDefaultPosition, wxSize(80, 200), 1, m_tabListCtrlStrings, wxLB_SINGLE );
126 itemBoxSizer5->Add(m_tabListCtrl, 1, wxGROW|wxLEFT|wxRIGHT|wxBOTTOM, 5);
127
128 itemBoxSizer4->Add(2, 1, 1, wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM, 5);
129
130 wxBoxSizer* itemBoxSizer10 = new wxBoxSizer(wxVERTICAL);
131 itemBoxSizer4->Add(itemBoxSizer10, 0, wxGROW, 5);
132
133 wxStaticText* itemStaticText11 = new wxStaticText( itemPanel1, wxID_STATIC, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 );
134 itemBoxSizer10->Add(itemStaticText11, 0, wxALIGN_CENTER_HORIZONTAL|wxBOTTOM, 5);
135
136 wxButton* itemButton12 = new wxButton( itemPanel1, ID_RICHTEXTTABSPAGE_NEW_TAB, _("&New"), wxDefaultPosition, wxDefaultSize, 0 );
137 itemButton12->SetHelpText(_("Click to create a new tab position."));
138 if (ShowToolTips())
139 itemButton12->SetToolTip(_("Click to create a new tab position."));
140 itemBoxSizer10->Add(itemButton12, 0, wxALIGN_CENTER_HORIZONTAL|wxALL, 5);
141
142 wxButton* itemButton13 = new wxButton( itemPanel1, ID_RICHTEXTTABSPAGE_DELETE_TAB, _("&Delete"), wxDefaultPosition, wxDefaultSize, 0 );
143 itemButton13->SetHelpText(_("Click to delete the selected tab position."));
144 if (ShowToolTips())
145 itemButton13->SetToolTip(_("Click to delete the selected tab position."));
146 itemBoxSizer10->Add(itemButton13, 0, wxALIGN_CENTER_HORIZONTAL|wxLEFT|wxRIGHT|wxBOTTOM, 5);
147
148 wxButton* itemButton14 = new wxButton( itemPanel1, ID_RICHTEXTTABSPAGE_DELETE_ALL_TABS, _("Delete A&ll"), wxDefaultPosition, wxDefaultSize, 0 );
149 itemButton14->SetHelpText(_("Click to delete all tab positions."));
150 if (ShowToolTips())
151 itemButton14->SetToolTip(_("Click to delete all tab positions."));
152 itemBoxSizer10->Add(itemButton14, 0, wxALIGN_CENTER_HORIZONTAL|wxLEFT|wxRIGHT|wxBOTTOM, 5);
153
154 ////@end wxRichTextTabsPage content construction
155 }
156
157 /// Transfer data from/to window
158 bool wxRichTextTabsPage::TransferDataFromWindow()
159 {
160 wxPanel::TransferDataFromWindow();
161
162 wxTextAttr* attr = GetAttributes();
163
164 if (m_tabsPresent)
165 {
166 wxArrayInt tabs;
167 size_t i;
168 for (i = 0; i < m_tabListCtrl->GetCount(); i++)
169 {
170 tabs.Add(wxAtoi(m_tabListCtrl->GetString(i)));
171 }
172 attr->SetTabs(tabs);
173 }
174 return true;
175 }
176
177 bool wxRichTextTabsPage::TransferDataToWindow()
178 {
179 wxPanel::TransferDataToWindow();
180
181 wxTextAttr* attr = GetAttributes();
182
183 m_tabListCtrl->Clear();
184 m_tabEditCtrl->SetValue(wxEmptyString);
185
186 if (attr->HasTabs())
187 {
188 m_tabsPresent = true;
189 size_t i;
190 for (i = 0; i < attr->GetTabs().GetCount(); i++)
191 {
192 wxString s(wxString::Format(wxT("%d"), attr->GetTabs()[i]));
193 m_tabListCtrl->Append(s);
194 }
195 }
196
197 return true;
198 }
199
200 static int wxTabSortFunc(int* a, int* b)
201 {
202 if ((*a) < (*b))
203 return -1;
204 else if ((*b) < (*a))
205 return 1;
206 else
207 return 0;
208 }
209
210 /// Sorts the tab array
211 void wxRichTextTabsPage::SortTabs()
212 {
213 wxArrayInt tabs;
214 size_t i;
215 for (i = 0; i < m_tabListCtrl->GetCount(); i++)
216 {
217 tabs.Add(wxAtoi(m_tabListCtrl->GetString(i)));
218 }
219 tabs.Sort(& wxTabSortFunc);
220
221 m_tabListCtrl->Clear();
222 for (i = 0; i < tabs.GetCount(); i++)
223 {
224 wxString s(wxString::Format(wxT("%d"), tabs[i]));
225 m_tabListCtrl->Append(s);
226 }
227 }
228
229 wxTextAttr* wxRichTextTabsPage::GetAttributes()
230 {
231 return wxRichTextFormattingDialog::GetDialogAttributes(this);
232 }
233
234 /*!
235 * Should we show tooltips?
236 */
237
238 bool wxRichTextTabsPage::ShowToolTips()
239 {
240 return wxRichTextFormattingDialog::ShowToolTips();
241 }
242
243 /*!
244 * Get bitmap resources
245 */
246
247 wxBitmap wxRichTextTabsPage::GetBitmapResource( const wxString& name )
248 {
249 // Bitmap retrieval
250 ////@begin wxRichTextTabsPage bitmap retrieval
251 wxUnusedVar(name);
252 return wxNullBitmap;
253 ////@end wxRichTextTabsPage bitmap retrieval
254 }
255
256 /*!
257 * Get icon resources
258 */
259
260 wxIcon wxRichTextTabsPage::GetIconResource( const wxString& name )
261 {
262 // Icon retrieval
263 ////@begin wxRichTextTabsPage icon retrieval
264 wxUnusedVar(name);
265 return wxNullIcon;
266 ////@end wxRichTextTabsPage icon retrieval
267 }
268
269 /*!
270 * wxEVT_COMMAND_BUTTON_CLICKED event handler for ID_RICHTEXTTABSPAGE_NEW_TAB
271 */
272
273 void wxRichTextTabsPage::OnNewTabClick( wxCommandEvent& WXUNUSED(event) )
274 {
275 wxString str = m_tabEditCtrl->GetValue();
276 if (!str.empty() && str.IsNumber())
277 {
278 wxString s(wxString::Format(wxT("%d"), wxAtoi(str)));
279
280 m_tabListCtrl->Append(s);
281 m_tabsPresent = true;
282
283 SortTabs();
284 }
285 }
286
287 /*!
288 * wxEVT_UPDATE_UI event handler for ID_RICHTEXTTABSPAGE_NEW_TAB
289 */
290
291 void wxRichTextTabsPage::OnNewTabUpdate( wxUpdateUIEvent& event )
292 {
293 // This may be a bit expensive - consider updating New button when text
294 // changes in edit control
295 wxString str = m_tabEditCtrl->GetValue();
296 if (!str.empty() && str.IsNumber())
297 {
298 wxString s(wxString::Format(wxT("%d"), wxAtoi(str)));
299 event.Enable(m_tabListCtrl->FindString(s) == wxNOT_FOUND);
300 }
301 else
302 event.Enable(false);
303 }
304
305
306 /*!
307 * wxEVT_COMMAND_BUTTON_CLICKED event handler for ID_RICHTEXTTABSPAGE_DELETE_TAB
308 */
309
310 void wxRichTextTabsPage::OnDeleteTabClick( wxCommandEvent& WXUNUSED(event) )
311 {
312 if (m_tabsPresent && m_tabListCtrl->GetCount() > 0 && m_tabListCtrl->GetSelection() != wxNOT_FOUND)
313 {
314 m_tabListCtrl->Delete(m_tabListCtrl->GetSelection());
315 }
316 }
317
318 /*!
319 * wxEVT_UPDATE_UI event handler for ID_RICHTEXTTABSPAGE_DELETE_TAB
320 */
321
322 void wxRichTextTabsPage::OnDeleteTabUpdate( wxUpdateUIEvent& event )
323 {
324 event.Enable( m_tabsPresent && m_tabListCtrl->GetCount() > 0 && m_tabListCtrl->GetSelection() != wxNOT_FOUND );
325 }
326
327
328 /*!
329 * wxEVT_COMMAND_BUTTON_CLICKED event handler for ID_RICHTEXTTABSPAGE_DELETE_ALL_TABS
330 */
331
332 void wxRichTextTabsPage::OnDeleteAllTabsClick( wxCommandEvent& WXUNUSED(event) )
333 {
334 if (m_tabsPresent && m_tabListCtrl->GetCount() > 0)
335 {
336 m_tabListCtrl->Clear();
337 m_tabEditCtrl->SetValue(wxEmptyString);
338 }
339 }
340
341 /*!
342 * wxEVT_UPDATE_UI event handler for ID_RICHTEXTTABSPAGE_DELETE_ALL_TABS
343 */
344
345 void wxRichTextTabsPage::OnDeleteAllTabsUpdate( wxUpdateUIEvent& event )
346 {
347 event.Enable( m_tabsPresent && m_tabListCtrl->GetCount() > 0 );
348 }
349
350
351 /*!
352 * wxEVT_COMMAND_LISTBOX_SELECTED event handler for ID_RICHTEXTTABSPAGE_TABLIST
353 */
354
355 void wxRichTextTabsPage::OnTablistSelected( wxCommandEvent& WXUNUSED(event) )
356 {
357 wxString str = m_tabListCtrl->GetStringSelection();
358 if (!str.empty())
359 m_tabEditCtrl->SetValue(str);
360 }
361
362 #endif // wxUSE_RICHTEXT