1 /////////////////////////////////////////////////////////////////////////////// 
   2 // Name:        src/generic/tipdlg.cpp 
   3 // Purpose:     implementation of wxTipDialog 
   4 // Author:      Vadim Zeitlin 
   8 // Copyright:   (c) Vadim Zeitlin 
   9 // Licence:     wxWindows licence 
  10 /////////////////////////////////////////////////////////////////////////////// 
  12 // ============================================================================ 
  14 // ============================================================================ 
  16 // ---------------------------------------------------------------------------- 
  18 // ---------------------------------------------------------------------------- 
  20 // For compilers that support precompilation, includes "wx.h". 
  21 #include "wx/wxprec.h" 
  27 #if wxUSE_STARTUP_TIPS 
  30     #include "wx/button.h" 
  31     #include "wx/checkbox.h" 
  32     #include "wx/statbox.h" 
  33     #include "wx/dialog.h" 
  36     #include "wx/textctrl.h" 
  37     #include "wx/statbmp.h" 
  38     #include "wx/stattext.h" 
  40     #include "wx/settings.h" 
  43 #include "wx/statline.h" 
  44 #include "wx/artprov.h" 
  46 #include "wx/tipdlg.h" 
  48 // ---------------------------------------------------------------------------- 
  50 // ---------------------------------------------------------------------------- 
  52 static const int wxID_NEXT_TIP 
= 32000;  // whatever 
  54 // --------------------------------------------------------------------------- 
  56 // --------------------------------------------------------------------------- 
  58 /* Macro for avoiding #ifdefs when value have to be different depending on size of 
  59    device we display on - take it from something like wxDesktopPolicy in the future 
  62 #if defined(__SMARTPHONE__) 
  63     #define wxLARGESMALL(large,small) small 
  65     #define wxLARGESMALL(large,small) large 
  68 // ---------------------------------------------------------------------------- 
  70 // ---------------------------------------------------------------------------- 
  72 // an implementation which takes the tips from the text file - each line 
  74 class WXDLLIMPEXP_ADV wxFileTipProvider 
: public wxTipProvider
 
  77     wxFileTipProvider(const wxString
& filename
, size_t currentTip
); 
  79     virtual wxString 
GetTip(); 
  82     wxTextFile m_textfile
; 
  84     DECLARE_NO_COPY_CLASS(wxFileTipProvider
) 
  88 // TODO an implementation which takes the tips from the given registry key 
  89 class WXDLLIMPEXP_ADV wxRegTipProvider 
: public wxTipProvider
 
  92     wxRegTipProvider(const wxString
& keyname
); 
  94     virtual wxString 
GetTip(); 
  97 // Empty implementation for now to keep the linker happy 
  98 wxString 
wxRegTipProvider::GetTip() 
 100     return wxEmptyString
; 
 105 // the dialog we show in wxShowTip() 
 106 class WXDLLIMPEXP_ADV wxTipDialog 
: public wxDialog
 
 109     wxTipDialog(wxWindow 
*parent
, 
 110                 wxTipProvider 
*tipProvider
, 
 113     // the tip dialog has "Show tips on startup" checkbox - return true if it 
 114     // was checked (or wasn't unchecked) 
 115     bool ShowTipsOnStartup() const { return m_checkbox
->GetValue(); } 
 117     // sets the (next) tip text 
 118     void SetTipText() { m_text
->SetValue(m_tipProvider
->GetTip()); } 
 120     // "Next" button handler 
 121     void OnNextTip(wxCommandEvent
& WXUNUSED(event
)) { SetTipText(); } 
 124     wxTipProvider 
*m_tipProvider
; 
 127     wxCheckBox 
*m_checkbox
; 
 129     DECLARE_EVENT_TABLE() 
 130     DECLARE_NO_COPY_CLASS(wxTipDialog
) 
 133 // ============================================================================ 
 135 // ============================================================================ 
 137 // ---------------------------------------------------------------------------- 
 139 // ---------------------------------------------------------------------------- 
 141 wxFileTipProvider::wxFileTipProvider(const wxString
& filename
, 
 143                  : wxTipProvider(currentTip
), m_textfile(filename
) 
 148 wxString 
wxFileTipProvider::GetTip() 
 150     size_t count 
= m_textfile
.GetLineCount(); 
 153         return _("Tips not available, sorry!"); 
 158     // Comments start with a # symbol. 
 159     // Loop reading lines until get the first one that isn't a comment. 
 160     // The max number of loop executions is the number of lines in the 
 161     // textfile so that can't go into an eternal loop in the [oddball] 
 162     // case of a comment-only tips file, or the developer has vetoed 
 163     // them all via PreprecessTip(). 
 164     for ( size_t i
=0; i 
< count
; i
++ ) 
 166         // The current tip may be at the last line of the textfile, (or 
 167         // past it, if the number of lines in the textfile changed, such 
 168         // as changing to a different textfile, with less tips). So check 
 169         // to see at last line of text file, (or past it)... 
 170         if ( m_currentTip 
>= count 
) 
 172             // .. and if so, wrap back to line 0. 
 176         // Read the tip, and increment the current tip counter. 
 177         tip 
= m_textfile
.GetLine(m_currentTip
++); 
 179         // Allow a derived class's overrided virtual to modify the tip 
 180         // now if so desired. 
 181         tip 
= PreprocessTip(tip
); 
 183         // Break if tip isn't a comment, and isn't an empty string 
 184         // (or only stray space characters). 
 185         if ( !tip
.StartsWith(wxT("#")) && (tip
.Trim() != wxEmptyString
) ) 
 191     // If tip starts with '_(', then it is a gettext string of format 
 192     // _("My \"global\" tip text") so first strip off the leading '_("'... 
 193     if ( tip
.StartsWith(wxT("_(\"" ), &tip
)) 
 195         //...and strip off the trailing '")'... 
 196         tip 
= tip
.BeforeLast(wxT('\"')); 
 197         // ...and replace escaped quotes 
 198         tip
.Replace(wxT("\\\""), wxT("\"")); 
 200         // and translate it as requested 
 201         tip 
= wxGetTranslation(tip
); 
 207 // ---------------------------------------------------------------------------- 
 209 // ---------------------------------------------------------------------------- 
 211 BEGIN_EVENT_TABLE(wxTipDialog
, wxDialog
) 
 212     EVT_BUTTON(wxID_NEXT_TIP
, wxTipDialog::OnNextTip
) 
 213     EVT_BUTTON(wxID_CLOSE
, wxTipDialog::OnCancel
) 
 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
 
 224     m_tipProvider 
= tipProvider
; 
 225     bool isPda 
= (wxSystemSettings::GetScreenType() <= wxSYS_SCREEN_PDA
); 
 227     // 1) create all controls in tab order 
 229     // smart phones does not support or do not waste space for wxButtons 
 230 #ifndef __SMARTPHONE__ 
 231     wxButton 
*btnClose 
= new wxButton(this, wxID_CLOSE
); 
 234     m_checkbox 
= new wxCheckBox(this, wxID_ANY
, _("&Show tips at startup")); 
 235     m_checkbox
->SetValue(showAtStartup
); 
 237     // smart phones does not support or do not waste space for wxButtons 
 238 #ifndef __SMARTPHONE__ 
 239     wxButton 
*btnNext 
= new wxButton(this, wxID_NEXT_TIP
, _("&Next Tip")); 
 242     wxStaticText 
*text 
= new wxStaticText(this, wxID_ANY
, _("Did you know...")); 
 246         wxFont font 
= text
->GetFont(); 
 247         font
.SetPointSize(int(1.6 * font
.GetPointSize())); 
 248         font
.SetWeight(wxFONTWEIGHT_BOLD
); 
 252     m_text 
= new wxTextCtrl(this, wxID_ANY
, wxEmptyString
, 
 253                             wxDefaultPosition
, wxSize(200, 160), 
 257                             wxTE_RICH2 
| // a hack to get rid of vert scrollbar 
 258                             wxDEFAULT_CONTROL_BORDER
 
 260 #if defined(__WXMSW__) 
 261     m_text
->SetFont(wxFont(12, wxSWISS
, wxNORMAL
, wxNORMAL
)); 
 264 //#if defined(__WXPM__) 
 266     // The only way to get icons into an OS/2 static bitmap control 
 270 //    vBitmap.SetId(wxICON_TIP); // OS/2 specific bitmap method--OS/2 wxBitmaps all have an ID. 
 271 //                               // and for StatBmp's under OS/2 it MUST be a valid resource ID. 
 273 //    wxStaticBitmap*                 bmp = new wxStaticBitmap(this, wxID_ANY, vBitmap); 
 277     wxIcon icon 
= wxArtProvider::GetIcon(wxART_TIP
, wxART_CMN_DIALOG
); 
 278     wxStaticBitmap 
*bmp 
= new wxStaticBitmap(this, wxID_ANY
, icon
); 
 282     // 2) put them in boxes 
 284     wxBoxSizer 
*topsizer 
= new wxBoxSizer( wxVERTICAL 
); 
 286     wxBoxSizer 
*icon_text 
= new wxBoxSizer( wxHORIZONTAL 
); 
 287     icon_text
->Add( bmp
, 0, wxCENTER 
); 
 288     icon_text
->Add( text
, 1, wxCENTER 
| wxLEFT
, wxLARGESMALL(20,0) ); 
 289     topsizer
->Add( icon_text
, 0, wxEXPAND 
| wxALL
, wxLARGESMALL(10,0) ); 
 291     topsizer
->Add( m_text
, 1, wxEXPAND 
| wxLEFT
|wxRIGHT
, wxLARGESMALL(10,0) ); 
 293     wxBoxSizer 
*bottom 
= new wxBoxSizer( wxHORIZONTAL 
); 
 295         topsizer
->Add( m_checkbox
, 0, wxCENTER
|wxTOP 
); 
 297         bottom
->Add( m_checkbox
, 0, wxCENTER 
); 
 299     // smart phones does not support or do not waste space for wxButtons 
 300 #ifdef __SMARTPHONE__ 
 301     SetRightMenu(wxID_NEXT_TIP
, _("Next")); 
 302     SetLeftMenu(wxID_CLOSE
); 
 305         bottom
->Add( 10,10,1 ); 
 306     bottom
->Add( btnNext
, 0, wxCENTER 
| wxLEFT
, wxLARGESMALL(10,0) ); 
 307     bottom
->Add( btnClose
, 0, wxCENTER 
| wxLEFT
, wxLARGESMALL(10,0) ); 
 311         topsizer
->Add( bottom
, 0, wxCENTER 
| wxALL
, 5 ); 
 313         topsizer
->Add( bottom
, 0, wxEXPAND 
| wxALL
, wxLARGESMALL(10,0) ); 
 317     SetSizer( topsizer 
); 
 319     topsizer
->SetSizeHints( this ); 
 320     topsizer
->Fit( this ); 
 322     Centre(wxBOTH 
| wxCENTER_FRAME
); 
 325 // ---------------------------------------------------------------------------- 
 326 // our public interface 
 327 // ---------------------------------------------------------------------------- 
 329 wxTipProvider 
*wxCreateFileTipProvider(const wxString
& filename
, 
 332     return new wxFileTipProvider(filename
, currentTip
); 
 335 bool wxShowTip(wxWindow 
*parent
, 
 336                wxTipProvider 
*tipProvider
, 
 339     wxTipDialog 
dlg(parent
, tipProvider
, showAtStartup
); 
 342     return dlg
.ShowTipsOnStartup(); 
 345 #endif // wxUSE_STARTUP_TIPS