home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 10 Tools / 10-Tools.zip / wxos2233.zip / wxOS2-2_3_3.zip / wxWindows-2.3.3 / src / common / dlgcmn.cpp < prev    next >
C/C++ Source or Header  |  2002-04-17  |  7KB  |  214 lines

  1. /////////////////////////////////////////////////////////////////////////////
  2. // Name:        common/dlgcmn.cpp
  3. // Purpose:     common (to all ports) wxDialog functions
  4. // Author:      Vadim Zeitlin
  5. // Modified by:
  6. // Created:     28.06.99
  7. // RCS-ID:      $Id: dlgcmn.cpp,v 1.19 2002/04/16 19:34:42 VZ Exp $
  8. // Copyright:   (c) Vadim Zeitlin
  9. // Licence:     wxWindows license
  10. /////////////////////////////////////////////////////////////////////////////
  11.  
  12. // ============================================================================
  13. // declarations
  14. // ============================================================================
  15.  
  16. // ----------------------------------------------------------------------------
  17. // headers
  18. // ----------------------------------------------------------------------------
  19.  
  20. #ifdef __GNUG__
  21.     #pragma implementation "dialogbase.h"
  22. #endif
  23.  
  24. // For compilers that support precompilation, includes "wx.h".
  25. #include "wx/wxprec.h"
  26.  
  27. #ifdef __BORLANDC__
  28.     #pragma hdrstop
  29. #endif
  30.  
  31. #ifndef WX_PRECOMP
  32.     #include "wx/button.h"
  33.     #include "wx/dialog.h"
  34.     #include "wx/dcclient.h"
  35.     #include "wx/intl.h"
  36.     #include "wx/settings.h"
  37.     #include "wx/stattext.h"
  38.     #include "wx/sizer.h"
  39.     #include "wx/button.h"
  40.     #include "wx/containr.h"
  41. #endif
  42.  
  43.  
  44. //--------------------------------------------------------------------------
  45. // wxDialogBase
  46. //--------------------------------------------------------------------------
  47.  
  48. // FIXME - temporary hack in absence of wxtopLevelWindow, should be always used
  49. #ifdef wxTopLevelWindowNative
  50. BEGIN_EVENT_TABLE(wxDialogBase, wxTopLevelWindow)
  51.     WX_EVENT_TABLE_CONTROL_CONTAINER(wxDialogBase)
  52. END_EVENT_TABLE()
  53.  
  54. WX_DELEGATE_TO_CONTROL_CONTAINER(wxDialogBase)
  55. #endif
  56.  
  57. void wxDialogBase::Init()
  58. {
  59.     m_returnCode = 0;
  60.  
  61.     // the dialogs have this flag on by default to prevent the events from the
  62.     // dialog controls from reaching the parent frame which is usually
  63.     // undesirable and can lead to unexpected and hard to find bugs
  64.     SetExtraStyle(GetExtraStyle() | wxWS_EX_BLOCK_EVENTS);
  65.  
  66. #ifdef wxTopLevelWindowNative // FIXME - temporary hack, should be always used!
  67.     m_container.SetContainerWindow(this);
  68. #endif
  69. }
  70.  
  71. #if wxUSE_STATTEXT && wxUSE_TEXTCTRL
  72.  
  73. wxSizer *wxDialogBase::CreateTextSizer( const wxString& message )
  74. {
  75.     wxBoxSizer *box = new wxBoxSizer( wxVERTICAL );
  76.  
  77.     // get line height for empty lines
  78.     int y = 0;
  79.     wxFont font( GetFont() );
  80.     if (!font.Ok())
  81.         font = *wxSWISS_FONT;
  82.     GetTextExtent(_T("H"), (int*)NULL, &y, (int*)NULL, (int*)NULL, &font);
  83.  
  84.     wxString line;
  85.     for ( size_t pos = 0; pos < message.length(); pos++ )
  86.     {
  87.         switch ( message[pos] )
  88.         {
  89.             case _T('\n'):
  90.                 if (!line.IsEmpty())
  91.                 {
  92.                     wxStaticText *s1 = new wxStaticText( this, -1, line );
  93.                     box->Add( s1 );
  94.                     line = wxT("");
  95.                 }
  96.                 else
  97.                 {
  98.                     box->Add( 5, y );
  99.                 }
  100.                 break;
  101.  
  102.             case _T('&'):
  103.                 // this is used as accel mnemonic prefix in the wxWindows
  104.                 // controls but in the static messages created by
  105.                 // CreateTextSizer() (used by wxMessageBox, for example), we
  106.                 // don't want this special meaning, so we need to quote it
  107.                 line += _T('&');
  108.  
  109.                 // fall through to add it normally too
  110.  
  111.             default:
  112.                 line += message[pos];
  113.         }
  114.     }
  115.  
  116.     // remaining text behind last '\n'
  117.     if (!line.IsEmpty())
  118.     {
  119.         wxStaticText *s2 = new wxStaticText( this, -1, line );
  120.         box->Add( s2 );
  121.     }
  122.  
  123.     return box;
  124. }
  125.  
  126. #endif // wxUSE_STATTEXT && wxUSE_TEXTCTRL
  127.  
  128. #if wxUSE_BUTTON
  129.  
  130. wxSizer *wxDialogBase::CreateButtonSizer( long flags )
  131. {
  132.     wxBoxSizer *box = new wxBoxSizer( wxHORIZONTAL );
  133.  
  134. #if defined(__WXMSW__) || defined(__WXMAC__)
  135.     static const int margin = 6;
  136. #else
  137.     static const int margin = 10;
  138. #endif
  139.  
  140.     wxButton *ok = (wxButton *) NULL;
  141.     wxButton *cancel = (wxButton *) NULL;
  142.     wxButton *yes = (wxButton *) NULL;
  143.     wxButton *no = (wxButton *) NULL;
  144.  
  145.     // always show an OK button, unless we have both YES and NO
  146.     if ( (flags & wxYES_NO) != wxYES_NO )
  147.         flags |= wxOK;
  148.  
  149.     if (flags & wxYES)
  150.     {
  151.         yes = new wxButton( this, wxID_YES, _("Yes"),wxDefaultPosition,wxDefaultSize,wxCLIP_SIBLINGS );
  152.         box->Add( yes, 0, wxLEFT|wxRIGHT, margin );
  153.     }
  154.     if (flags & wxNO)
  155.     {
  156.         no = new wxButton( this, wxID_NO, _("No"),wxDefaultPosition,wxDefaultSize,wxCLIP_SIBLINGS );
  157.         box->Add( no, 0, wxLEFT|wxRIGHT, margin );
  158.     }
  159.  
  160.     if (flags & wxOK)
  161.     {
  162.         ok = new wxButton( this, wxID_OK, _("OK"),wxDefaultPosition,wxDefaultSize,wxCLIP_SIBLINGS );
  163.         box->Add( ok, 0, wxLEFT|wxRIGHT, margin );
  164.     }
  165.  
  166.     if (flags & wxFORWARD)
  167.         box->Add( new wxButton( this, wxID_FORWARD, _("Forward"),wxDefaultPosition,wxDefaultSize,wxCLIP_SIBLINGS  ), 0, wxLEFT|wxRIGHT, margin );
  168.  
  169.     if (flags & wxBACKWARD)
  170.         box->Add( new wxButton( this, wxID_BACKWARD, _("Backward"),wxDefaultPosition,wxDefaultSize,wxCLIP_SIBLINGS  ), 0, wxLEFT|wxRIGHT, margin );
  171.  
  172.     if (flags & wxSETUP)
  173.         box->Add( new wxButton( this, wxID_SETUP, _("Setup"),wxDefaultPosition,wxDefaultSize,wxCLIP_SIBLINGS  ), 0, wxLEFT|wxRIGHT, margin );
  174.  
  175.     if (flags & wxMORE)
  176.         box->Add( new wxButton( this, wxID_MORE, _("More..."),wxDefaultPosition,wxDefaultSize,wxCLIP_SIBLINGS  ), 0, wxLEFT|wxRIGHT, margin );
  177.  
  178.     if (flags & wxHELP)
  179.         box->Add( new wxButton( this, wxID_HELP, _("Help"),wxDefaultPosition,wxDefaultSize,wxCLIP_SIBLINGS  ), 0, wxLEFT|wxRIGHT, margin );
  180.  
  181.     if (flags & wxCANCEL)
  182.     {
  183.         cancel = new wxButton( this, wxID_CANCEL, _("Cancel"),wxDefaultPosition,wxDefaultSize,wxCLIP_SIBLINGS );
  184.         box->Add( cancel, 0, wxLEFT|wxRIGHT, margin );
  185.     }
  186.  
  187.     // choose the default button
  188.     if (flags & wxNO_DEFAULT)
  189.     {
  190.         if (no)
  191.         {
  192.             no->SetDefault();
  193.             no->SetFocus();
  194.         }
  195.     }
  196.     else
  197.     {
  198.         if (ok)
  199.         {
  200.             ok->SetDefault();
  201.             ok->SetFocus();
  202.         }
  203.         else if (yes)
  204.         {
  205.             yes->SetDefault();
  206.             yes->SetFocus();
  207.         }
  208.     }
  209.  
  210.     return box;
  211. }
  212.  
  213. #endif // wxUSE_BUTTON
  214.