1 /////////////////////////////////////////////////////////////////////////////// 
   3 // Purpose:     implementation of wxTipDialog 
   4 // Author:      Vadim Zeitlin 
   8 // Copyright:   (c) Vadim Zeitlin 
   9 // Licence:     wxWindows licence 
  10 /////////////////////////////////////////////////////////////////////////////// 
  12 // ============================================================================ 
  14 // ============================================================================ 
  16 // ---------------------------------------------------------------------------- 
  18 // ---------------------------------------------------------------------------- 
  20 #if defined(__GNUG__) && !defined(NO_GCC_PRAGMA) 
  21     #pragma implementation "tipdlg.h" 
  24 // For compilers that support precompilation, includes "wx.h". 
  25 #include "wx/wxprec.h" 
  31 #if wxUSE_STARTUP_TIPS 
  34     #include "wx/button.h" 
  35     #include "wx/checkbox.h" 
  36     #include "wx/statbox.h" 
  37     #include "wx/dialog.h" 
  40     #include "wx/settings.h" 
  41     #include "wx/textctrl.h" 
  42     #include "wx/statbmp.h" 
  43     #include "wx/stattext.h" 
  47 #include "wx/statline.h" 
  48 #include "wx/artprov.h" 
  50 #include "wx/tipdlg.h" 
  52 // ---------------------------------------------------------------------------- 
  54 // ---------------------------------------------------------------------------- 
  56 static const int wxID_NEXT_TIP 
= 32000;  // whatever 
  58 // --------------------------------------------------------------------------- 
  60 // --------------------------------------------------------------------------- 
  62 /* Macro for avoiding #ifdefs when value have to be different depending on size of 
  66 #if defined(__SMARTPHONE__) 
  67     #define wxLARGESMALL(large,small) small 
  69     #define wxLARGESMALL(large,small) large 
  72 // ---------------------------------------------------------------------------- 
  74 // ---------------------------------------------------------------------------- 
  76 // an implementation which takes the tips from the text file - each line 
  78 class WXDLLIMPEXP_ADV wxFileTipProvider 
: public wxTipProvider
 
  81     wxFileTipProvider(const wxString
& filename
, size_t currentTip
); 
  83     virtual wxString 
GetTip(); 
  86     wxTextFile m_textfile
; 
  88     DECLARE_NO_COPY_CLASS(wxFileTipProvider
) 
  92 // TODO an implementation which takes the tips from the given registry key 
  93 class WXDLLIMPEXP_ADV wxRegTipProvider 
: public wxTipProvider
 
  96     wxRegTipProvider(const wxString
& keyname
); 
  98     virtual wxString 
GetTip(); 
 101 // Empty implementation for now to keep the linker happy 
 102 wxString 
wxRegTipProvider::GetTip() 
 104     return wxEmptyString
; 
 109 // the dialog we show in wxShowTip() 
 110 class WXDLLIMPEXP_ADV wxTipDialog 
: public wxDialog
 
 113     wxTipDialog(wxWindow 
*parent
, 
 114                 wxTipProvider 
*tipProvider
, 
 117     // the tip dialog has "Show tips on startup" checkbox - return true if it 
 118     // was checked (or wasn't unchecked) 
 119     bool ShowTipsOnStartup() const { return m_checkbox
->GetValue(); } 
 121     // sets the (next) tip text 
 122     void SetTipText() { m_text
->SetValue(m_tipProvider
->GetTip()); } 
 124     // "Next" button handler 
 125     void OnNextTip(wxCommandEvent
& WXUNUSED(event
)) { SetTipText(); } 
 128     wxTipProvider 
*m_tipProvider
; 
 131     wxCheckBox 
*m_checkbox
; 
 133     DECLARE_EVENT_TABLE() 
 134     DECLARE_NO_COPY_CLASS(wxTipDialog
) 
 137 // ============================================================================ 
 139 // ============================================================================ 
 141 // ---------------------------------------------------------------------------- 
 143 // ---------------------------------------------------------------------------- 
 145 wxFileTipProvider::wxFileTipProvider(const wxString
& filename
, 
 147                  : wxTipProvider(currentTip
), m_textfile(filename
) 
 152 wxString 
wxFileTipProvider::GetTip() 
 154     size_t count 
= m_textfile
.GetLineCount(); 
 157         return _("Tips not available, sorry!"); 
 162     // Comments start with a # symbol. 
 163     // Loop reading lines until get the first one that isn't a comment. 
 164     // The max number of loop executions is the number of lines in the 
 165     // textfile so that can't go into an eternal loop in the [oddball] 
 166     // case of a comment-only tips file, or the developer has vetoed 
 167     // them all via PreprecessTip(). 
 168     for ( size_t i
=0; i 
< count
; i
++ ) 
 170         // The current tip may be at the last line of the textfile, (or 
 171         // past it, if the number of lines in the textfile changed, such 
 172         // as changing to a different textfile, with less tips). So check 
 173         // to see at last line of text file, (or past it)... 
 174         if ( m_currentTip 
>= count 
) 
 176             // .. and if so, wrap back to line 0. 
 180         // Read the tip, and increment the current tip counter. 
 181         tip 
= m_textfile
.GetLine(m_currentTip
++); 
 183         // Allow a derived class's overrided virtual to modify the tip 
 184         // now if so desired. 
 185         tip 
= PreprocessTip(tip
); 
 187         // Break if tip isn't a comment, and isn't an empty string 
 188         // (or only stray space characters). 
 189         if ( !tip
.StartsWith(wxT("#")) && (tip
.Trim() != wxEmptyString
) ) 
 195     // If tip starts with '_(', then it is a gettext string of format 
 196     // _("My \"global\" tip text") so first strip off the leading '_("'... 
 197     if ( tip
.StartsWith(wxT("_(\"" ), &tip
)) 
 199         //...and strip off the trailing '")'... 
 200         tip 
= tip
.BeforeLast(wxT('\"')); 
 201         // ...and replace escaped quotes 
 202         tip
.Replace(wxT("\\\""), wxT("\"")); 
 208 // ---------------------------------------------------------------------------- 
 210 // ---------------------------------------------------------------------------- 
 212 BEGIN_EVENT_TABLE(wxTipDialog
, wxDialog
) 
 213     EVT_BUTTON(wxID_NEXT_TIP
, wxTipDialog::OnNextTip
) 
 216 wxTipDialog::wxTipDialog(wxWindow 
*parent
, 
 217                          wxTipProvider 
*tipProvider
, 
 219            : wxDialog(parent
, wxID_ANY
, _("Tip of the Day"), 
 220                       wxDefaultPosition
, wxDefaultSize
, 
 221                       wxDEFAULT_DIALOG_STYLE 
| wxRESIZE_BORDER
) 
 223     m_tipProvider 
= tipProvider
; 
 225     // 1) create all controls in tab order 
 227 #ifndef __SMARTPHONE__ 
 228     wxButton 
*btnClose 
= new wxButton(this, wxID_CANCEL
, _("&Close")); 
 231     m_checkbox 
= new wxCheckBox(this, wxID_ANY
, _("&Show tips at startup")); 
 232     m_checkbox
->SetValue(showAtStartup
); 
 234 #ifndef __SMARTPHONE__ 
 235     wxButton 
*btnNext 
= new wxButton(this, wxID_NEXT_TIP
, _("&Next Tip")); 
 238     wxStaticText 
*text 
= new wxStaticText(this, wxID_ANY
, _("Did you know...")); 
 240 #ifndef __SMARTPHONE__ 
 241     wxFont font 
= text
->GetFont(); 
 242     font
.SetPointSize(int(1.6 * font
.GetPointSize())); 
 243     font
.SetWeight(wxFONTWEIGHT_BOLD
); 
 247     m_text 
= new wxTextCtrl(this, wxID_ANY
, wxEmptyString
, 
 248                             wxDefaultPosition
, wxSize(200, 160), 
 252                             wxTE_RICH 
| // a hack to get rid of vert scrollbar 
 254 #if defined(__WXMSW__) 
 255     m_text
->SetFont(wxFont(12, wxSWISS
, wxNORMAL
, wxNORMAL
)); 
 258 //#if defined(__WXPM__) 
 260     // The only way to get icons into an OS/2 static bitmap control 
 264 //    vBitmap.SetId(wxICON_TIP); // OS/2 specific bitmap method--OS/2 wxBitmaps all have an ID. 
 265 //                               // and for StatBmp's under OS/2 it MUST be a valid resource ID. 
 267 //    wxStaticBitmap*                 bmp = new wxStaticBitmap(this, wxID_ANY, vBitmap); 
 271     wxIcon icon 
= wxArtProvider::GetIcon(wxART_TIP
, wxART_CMN_DIALOG
); 
 272     wxStaticBitmap 
*bmp 
= new wxStaticBitmap(this, wxID_ANY
, icon
); 
 276     // 2) put them in boxes 
 278     wxBoxSizer 
*topsizer 
= new wxBoxSizer( wxVERTICAL 
); 
 280     wxBoxSizer 
*icon_text 
= new wxBoxSizer( wxHORIZONTAL 
); 
 281     icon_text
->Add( bmp
, 0, wxCENTER 
); 
 282     icon_text
->Add( text
, 1, wxCENTER 
| wxLEFT
, wxLARGESMALL(20,0) ); 
 283     topsizer
->Add( icon_text
, 0, wxEXPAND 
| wxALL
, wxLARGESMALL(10,0) ); 
 285     topsizer
->Add( m_text
, 1, wxEXPAND 
| wxLEFT
|wxRIGHT
, wxLARGESMALL(10,0) ); 
 287     wxBoxSizer 
*bottom 
= new wxBoxSizer( wxHORIZONTAL 
); 
 288     bottom
->Add( m_checkbox
, 0, wxCENTER 
); 
 290 #ifndef __SMARTPHONE__ 
 291     bottom
->Add( 10,10,1 ); 
 292     bottom
->Add( btnNext
, 0, wxCENTER 
| wxLEFT
, wxLARGESMALL(10,0) ); 
 293     bottom
->Add( btnClose
, 0, wxCENTER 
| wxLEFT
, wxLARGESMALL(10,0) ); 
 296     topsizer
->Add( bottom
, 0, wxEXPAND 
| wxALL
, wxLARGESMALL(10,0) ); 
 300     SetSizer( topsizer 
); 
 302     topsizer
->SetSizeHints( this ); 
 303     topsizer
->Fit( this ); 
 305     Centre(wxBOTH 
| wxCENTER_FRAME
); 
 307 #ifdef __SMARTPHONE__ 
 308     SetRightMenu(wxID_NEXT_TIP
, _("Next")); 
 309     SetLeftMenu(wxID_CANCEL
, _("Close")); 
 314 // ---------------------------------------------------------------------------- 
 315 // our public interface 
 316 // ---------------------------------------------------------------------------- 
 318 wxTipProvider 
*wxCreateFileTipProvider(const wxString
& filename
, 
 321     return new wxFileTipProvider(filename
, currentTip
); 
 324 bool wxShowTip(wxWindow 
*parent
, 
 325                wxTipProvider 
*tipProvider
, 
 328     wxTipDialog 
dlg(parent
, tipProvider
, showAtStartup
); 
 331     return dlg
.ShowTipsOnStartup(); 
 334 #endif // wxUSE_STARTUP_TIPS