Remove all lines containing cvs/svn "$Id$" keyword.
[wxWidgets.git] / src / generic / tipdlg.cpp
1 ///////////////////////////////////////////////////////////////////////////////
2 // Name: src/generic/tipdlg.cpp
3 // Purpose: implementation of wxTipDialog
4 // Author: Vadim Zeitlin
5 // Modified by:
6 // Created: 28.06.99
7 // Copyright: (c) Vadim Zeitlin
8 // Licence: wxWindows licence
9 ///////////////////////////////////////////////////////////////////////////////
10
11 // ============================================================================
12 // declarations
13 // ============================================================================
14
15 // ----------------------------------------------------------------------------
16 // headers
17 // ----------------------------------------------------------------------------
18
19 // For compilers that support precompilation, includes "wx.h".
20 #include "wx/wxprec.h"
21
22 #ifdef __BORLANDC__
23 #pragma hdrstop
24 #endif
25
26 #if wxUSE_STARTUP_TIPS
27
28 #ifndef WX_PRECOMP
29 #include "wx/button.h"
30 #include "wx/checkbox.h"
31 #include "wx/statbox.h"
32 #include "wx/dialog.h"
33 #include "wx/icon.h"
34 #include "wx/intl.h"
35 #include "wx/textctrl.h"
36 #include "wx/statbmp.h"
37 #include "wx/stattext.h"
38 #include "wx/sizer.h"
39 #include "wx/settings.h"
40 #endif // WX_PRECOMP
41
42 #include "wx/statline.h"
43 #include "wx/artprov.h"
44
45 #include "wx/tipdlg.h"
46
47 // ----------------------------------------------------------------------------
48 // constants
49 // ----------------------------------------------------------------------------
50
51 static const int wxID_NEXT_TIP = 32000; // whatever
52
53 // ---------------------------------------------------------------------------
54 // macros
55 // ---------------------------------------------------------------------------
56
57 /* Macro for avoiding #ifdefs when value have to be different depending on size of
58 device we display on - take it from something like wxDesktopPolicy in the future
59 */
60
61 #if defined(__SMARTPHONE__)
62 #define wxLARGESMALL(large,small) small
63 #else
64 #define wxLARGESMALL(large,small) large
65 #endif
66
67 // ----------------------------------------------------------------------------
68 // private classes
69 // ----------------------------------------------------------------------------
70
71 // an implementation which takes the tips from the text file - each line
72 // represents a tip
73 #if wxUSE_TEXTFILE
74 class WXDLLIMPEXP_ADV wxFileTipProvider : public wxTipProvider
75 {
76 public:
77 wxFileTipProvider(const wxString& filename, size_t currentTip);
78
79 virtual wxString GetTip();
80
81 private:
82 wxTextFile m_textfile;
83
84 wxDECLARE_NO_COPY_CLASS(wxFileTipProvider);
85 };
86 #endif // wxUSE_TEXTFILE
87
88 #ifdef __WIN32__
89 // TODO an implementation which takes the tips from the given registry key
90 class WXDLLIMPEXP_ADV wxRegTipProvider : public wxTipProvider
91 {
92 public:
93 wxRegTipProvider(const wxString& keyname);
94
95 virtual wxString GetTip();
96 };
97
98 // Empty implementation for now to keep the linker happy
99 wxString wxRegTipProvider::GetTip()
100 {
101 return wxEmptyString;
102 }
103
104 #endif // __WIN32__
105
106 // the dialog we show in wxShowTip()
107 class WXDLLIMPEXP_ADV wxTipDialog : public wxDialog
108 {
109 public:
110 wxTipDialog(wxWindow *parent,
111 wxTipProvider *tipProvider,
112 bool showAtStartup);
113
114 // the tip dialog has "Show tips on startup" checkbox - return true if it
115 // was checked (or wasn't unchecked)
116 bool ShowTipsOnStartup() const { return m_checkbox->GetValue(); }
117
118 // sets the (next) tip text
119 void SetTipText() { m_text->SetValue(m_tipProvider->GetTip()); }
120
121 // "Next" button handler
122 void OnNextTip(wxCommandEvent& WXUNUSED(event)) { SetTipText(); }
123
124 private:
125 wxTipProvider *m_tipProvider;
126
127 wxTextCtrl *m_text;
128 wxCheckBox *m_checkbox;
129
130 DECLARE_EVENT_TABLE()
131 wxDECLARE_NO_COPY_CLASS(wxTipDialog);
132 };
133
134 // ============================================================================
135 // implementation
136 // ============================================================================
137
138 // ----------------------------------------------------------------------------
139 // wxFileTipProvider
140 // ----------------------------------------------------------------------------
141 #if wxUSE_TEXTFILE
142 wxFileTipProvider::wxFileTipProvider(const wxString& filename,
143 size_t currentTip)
144 : wxTipProvider(currentTip), m_textfile(filename)
145 {
146 m_textfile.Open();
147 }
148
149 wxString wxFileTipProvider::GetTip()
150 {
151 size_t count = m_textfile.GetLineCount();
152 if ( !count )
153 {
154 return _("Tips not available, sorry!");
155 }
156
157 wxString tip;
158
159 // Comments start with a # symbol.
160 // Loop reading lines until get the first one that isn't a comment.
161 // The max number of loop executions is the number of lines in the
162 // textfile so that can't go into an eternal loop in the [oddball]
163 // case of a comment-only tips file, or the developer has vetoed
164 // them all via PreprecessTip().
165 for ( size_t i=0; i < count; i++ )
166 {
167 // The current tip may be at the last line of the textfile, (or
168 // past it, if the number of lines in the textfile changed, such
169 // as changing to a different textfile, with less tips). So check
170 // to see at last line of text file, (or past it)...
171 if ( m_currentTip >= count )
172 {
173 // .. and if so, wrap back to line 0.
174 m_currentTip = 0;
175 }
176
177 // Read the tip, and increment the current tip counter.
178 tip = m_textfile.GetLine(m_currentTip++);
179
180 // Allow a derived class's overrided virtual to modify the tip
181 // now if so desired.
182 tip = PreprocessTip(tip);
183
184 // Break if tip isn't a comment, and isn't an empty string
185 // (or only stray space characters).
186 if ( !tip.StartsWith(wxT("#")) && (tip.Trim() != wxEmptyString) )
187 {
188 break;
189 }
190 }
191
192 // If tip starts with '_(', then it is a gettext string of format
193 // _("My \"global\" tip text") so first strip off the leading '_("'...
194 if ( tip.StartsWith(wxT("_(\"" ), &tip))
195 {
196 //...and strip off the trailing '")'...
197 tip = tip.BeforeLast(wxT('\"'));
198 // ...and replace escaped quotes
199 tip.Replace(wxT("\\\""), wxT("\""));
200
201 // and translate it as requested
202 tip = wxGetTranslation(tip);
203 }
204
205 return tip;
206 }
207 #endif // wxUSE_TEXTFILE
208
209 // ----------------------------------------------------------------------------
210 // wxTipDialog
211 // ----------------------------------------------------------------------------
212
213 BEGIN_EVENT_TABLE(wxTipDialog, wxDialog)
214 EVT_BUTTON(wxID_NEXT_TIP, wxTipDialog::OnNextTip)
215 END_EVENT_TABLE()
216
217 wxTipDialog::wxTipDialog(wxWindow *parent,
218 wxTipProvider *tipProvider,
219 bool showAtStartup)
220 : wxDialog(GetParentForModalDialog(parent, 0), wxID_ANY, _("Tip of the Day"),
221 wxDefaultPosition, wxDefaultSize,
222 wxDEFAULT_DIALOG_STYLE | wxRESIZE_BORDER
223 )
224 {
225 m_tipProvider = tipProvider;
226 bool isPda = (wxSystemSettings::GetScreenType() <= wxSYS_SCREEN_PDA);
227
228 // 1) create all controls in tab order
229
230 wxStaticText *text = new wxStaticText(this, wxID_ANY, _("Did you know..."));
231
232 if (!isPda)
233 {
234 wxFont font = text->GetFont();
235 font.SetPointSize(int(1.6 * font.GetPointSize()));
236 font.SetWeight(wxFONTWEIGHT_BOLD);
237 text->SetFont(font);
238 }
239
240 m_text = new wxTextCtrl(this, wxID_ANY, wxEmptyString,
241 wxDefaultPosition, wxSize(200, 160),
242 wxTE_MULTILINE |
243 wxTE_READONLY |
244 wxTE_NO_VSCROLL |
245 wxTE_RICH2 | // a hack to get rid of vert scrollbar
246 wxDEFAULT_CONTROL_BORDER
247 );
248 #if defined(__WXMSW__)
249 m_text->SetFont(wxFont(12, wxSWISS, wxNORMAL, wxNORMAL));
250 #endif
251
252 //#if defined(__WXPM__)
253 //
254 // The only way to get icons into an OS/2 static bitmap control
255 //
256 // wxBitmap vBitmap;
257
258 // vBitmap.SetId(wxICON_TIP); // OS/2 specific bitmap method--OS/2 wxBitmaps all have an ID.
259 // // and for StatBmp's under OS/2 it MUST be a valid resource ID.
260 //
261 // wxStaticBitmap* bmp = new wxStaticBitmap(this, wxID_ANY, vBitmap);
262 //
263 //#else
264
265 wxIcon icon = wxArtProvider::GetIcon(wxART_TIP, wxART_CMN_DIALOG);
266 wxStaticBitmap *bmp = new wxStaticBitmap(this, wxID_ANY, icon);
267
268 //#endif
269
270 m_checkbox = new wxCheckBox(this, wxID_ANY, _("&Show tips at startup"));
271 m_checkbox->SetValue(showAtStartup);
272 m_checkbox->SetFocus();
273
274 // smart phones does not support or do not waste space for wxButtons
275 #ifndef __SMARTPHONE__
276 wxButton *btnNext = new wxButton(this, wxID_NEXT_TIP, _("&Next Tip"));
277 #endif
278
279 // smart phones does not support or do not waste space for wxButtons
280 #ifndef __SMARTPHONE__
281 wxButton *btnClose = new wxButton(this, wxID_CLOSE);
282 SetAffirmativeId(wxID_CLOSE);
283 #endif
284
285
286 // 2) put them in boxes
287
288 wxBoxSizer *topsizer = new wxBoxSizer( wxVERTICAL );
289
290 wxBoxSizer *icon_text = new wxBoxSizer( wxHORIZONTAL );
291 icon_text->Add( bmp, 0, wxCENTER );
292 icon_text->Add( text, 1, wxCENTER | wxLEFT, wxLARGESMALL(20,0) );
293 topsizer->Add( icon_text, 0, wxEXPAND | wxALL, wxLARGESMALL(10,0) );
294
295 topsizer->Add( m_text, 1, wxEXPAND | wxLEFT|wxRIGHT, wxLARGESMALL(10,0) );
296
297 wxBoxSizer *bottom = new wxBoxSizer( wxHORIZONTAL );
298 if (isPda)
299 topsizer->Add( m_checkbox, 0, wxCENTER|wxTOP );
300 else
301 bottom->Add( m_checkbox, 0, wxCENTER );
302
303 // smart phones does not support or do not waste space for wxButtons
304 #ifdef __SMARTPHONE__
305 SetRightMenu(wxID_NEXT_TIP, _("Next"));
306 SetLeftMenu(wxID_CLOSE);
307 #else
308 if (!isPda)
309 bottom->Add( 10,10,1 );
310 bottom->Add( btnNext, 0, wxCENTER | wxLEFT, wxLARGESMALL(10,0) );
311 bottom->Add( btnClose, 0, wxCENTER | wxLEFT, wxLARGESMALL(10,0) );
312 #endif
313
314 if (isPda)
315 topsizer->Add( bottom, 0, wxCENTER | wxALL, 5 );
316 else
317 topsizer->Add( bottom, 0, wxEXPAND | wxALL, wxLARGESMALL(10,0) );
318
319 SetTipText();
320
321 SetSizer( topsizer );
322
323 topsizer->SetSizeHints( this );
324 topsizer->Fit( this );
325
326 Centre(wxBOTH | wxCENTER_FRAME);
327 }
328
329 // ----------------------------------------------------------------------------
330 // our public interface
331 // ----------------------------------------------------------------------------
332
333 #if wxUSE_TEXTFILE
334 wxTipProvider *wxCreateFileTipProvider(const wxString& filename,
335 size_t currentTip)
336 {
337 return new wxFileTipProvider(filename, currentTip);
338 }
339 #endif // wxUSE_TEXTFILE
340
341 bool wxShowTip(wxWindow *parent,
342 wxTipProvider *tipProvider,
343 bool showAtStartup)
344 {
345 wxTipDialog dlg(parent, tipProvider, showAtStartup);
346 dlg.ShowModal();
347
348 return dlg.ShowTipsOnStartup();
349 }
350
351 #endif // wxUSE_STARTUP_TIPS