]>
git.saurik.com Git - wxWidgets.git/blob - src/common/dlgcmn.cpp
260bb28bc8dcb61b5a1a628a14ba640174865b8e
   1 ///////////////////////////////////////////////////////////////////////////// 
   2 // Name:        common/dlgcmn.cpp 
   3 // Purpose:     common (to all ports) wxDialog functions 
   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 "dialogbase.h" 
  24 // For compilers that support precompilation, includes "wx.h". 
  25 #include "wx/wxprec.h" 
  32     #include "wx/button.h" 
  33     #include "wx/dialog.h" 
  34     #include "wx/dcclient.h" 
  36     #include "wx/settings.h" 
  37     #include "wx/stattext.h" 
  39     #include "wx/button.h" 
  40     #include "wx/containr.h" 
  43 //-------------------------------------------------------------------------- 
  45 //-------------------------------------------------------------------------- 
  47 // FIXME - temporary hack in absence of wxtopLevelWindow, should be always used 
  48 #ifdef wxTopLevelWindowNative 
  49 BEGIN_EVENT_TABLE(wxDialogBase
, wxTopLevelWindow
) 
  50     WX_EVENT_TABLE_CONTROL_CONTAINER(wxDialogBase
) 
  53 WX_DELEGATE_TO_CONTROL_CONTAINER(wxDialogBase
) 
  56 void wxDialogBase::Init() 
  60     // the dialogs have this flag on by default to prevent the events from the 
  61     // dialog controls from reaching the parent frame which is usually 
  62     // undesirable and can lead to unexpected and hard to find bugs 
  63     SetExtraStyle(GetExtraStyle() | wxWS_EX_BLOCK_EVENTS
); 
  65 #ifdef wxTopLevelWindowNative // FIXME - temporary hack, should be always used! 
  66     m_container
.SetContainerWindow(this); 
  70 #if wxUSE_STATTEXT // && wxUSE_TEXTCTRL 
  72 wxSizer 
*wxDialogBase::CreateTextSizer( const wxString
& message 
) 
  74     bool is_pda 
= (wxSystemSettings::GetScreenType() <= wxSYS_SCREEN_PDA
); 
  76     wxString text 
= message
; 
  78     // I admit that this is complete bogus, but it makes 
  79     // message boxes work for pda screens temporarily.. 
  83         max_width 
= wxSystemSettings::GetMetric( wxSYS_SCREEN_X 
) - 25; 
  88     wxBoxSizer 
*box 
= new wxBoxSizer( wxVERTICAL 
); 
  90     // get line height for empty lines 
  92     wxFont 
font( GetFont() ); 
  95     GetTextExtent( wxT("H"), (int*)NULL
, &y
, (int*)NULL
, (int*)NULL
, &font
); 
  97     size_t last_space 
= 0; 
  99     for ( size_t pos 
= 0; pos 
< text
.length(); pos
++ ) 
 106                     wxStaticText 
*s 
= new wxStaticText( this, -1, line 
); 
 117                 // this is used as accel mnemonic prefix in the wxWidgets 
 118                 // controls but in the static messages created by 
 119                 // CreateTextSizer() (used by wxMessageBox, for example), we 
 120                 // don't want this special meaning, so we need to quote it 
 123                 // fall through to add it normally too 
 126                 if (text
[pos
] == wxT(' ')) 
 129                 line 
+= message
[pos
]; 
 134                     GetTextExtent( line
, &width
, (int*)NULL
, (int*)NULL
, (int*)NULL
, &font 
); 
 136                     if (width 
> max_width
) 
 138                         // exception if there was no previous space 
 142                         int diff 
= pos
-last_space
; 
 143                         int len 
= line
.Len(); 
 144                         line
.Remove( len
-diff
, diff 
); 
 146                         wxStaticText 
*s 
= new wxStaticText( this, -1, line 
); 
 157     // remaining text behind last '\n' 
 160         wxStaticText 
*s2 
= new wxStaticText( this, -1, line 
); 
 167 #endif // wxUSE_STATTEXT // && wxUSE_TEXTCTRL 
 171 wxSizer 
*wxDialogBase::CreateButtonSizer( long flags 
) 
 173     bool is_pda 
= (wxSystemSettings::GetScreenType() <= wxSYS_SCREEN_PDA
); 
 175     // If we have a PDA screen, put yes/no button over  
 176     // all other buttons, otherwise on the left side. 
 177     wxBoxSizer 
*box 
= is_pda 
? new wxBoxSizer( wxVERTICAL 
) : new wxBoxSizer( wxHORIZONTAL 
); 
 179     wxBoxSizer 
*inner_yes_no 
= NULL
; 
 181     // Only create sizer containing yes/no 
 182     // if it is actually required 
 183     if ( (flags 
& wxYES_NO
) != 0 ) 
 185         inner_yes_no 
= new wxBoxSizer( wxHORIZONTAL 
); 
 186         box
->Add( inner_yes_no
, 0, wxBOTTOM
, 10 ); 
 189     wxBoxSizer 
*inner_rest 
= new wxBoxSizer( wxHORIZONTAL 
); 
 190     box
->Add( inner_rest
, 0, 0, 0 ); 
 192 #if defined(__WXMSW__) || defined(__WXMAC__) 
 193     static const int margin 
= 6; 
 195     static const int margin 
= 10; 
 198     wxButton 
*ok 
= (wxButton 
*) NULL
; 
 199     wxButton 
*yes 
= (wxButton 
*) NULL
; 
 200     wxButton 
*no 
= (wxButton 
*) NULL
; 
 202     // always show an OK button, unless we have both YES and NO 
 203     if ( (flags 
& wxYES_NO
) != wxYES_NO 
) 
 208         yes 
= new wxButton( this, wxID_YES
, _("Yes"),wxDefaultPosition
,wxDefaultSize
,wxCLIP_SIBLINGS 
); 
 209         inner_yes_no
->Add( yes
, 0, wxLEFT
|wxRIGHT
, margin 
); 
 213         no 
= new wxButton( this, wxID_NO
, _("No"),wxDefaultPosition
,wxDefaultSize
,wxCLIP_SIBLINGS 
); 
 214         inner_yes_no
->Add( no
, 0, wxLEFT
|wxRIGHT
, margin 
); 
 219         ok 
= new wxButton( this, wxID_OK
, _("OK"),wxDefaultPosition
,wxDefaultSize
,wxCLIP_SIBLINGS 
); 
 220         inner_rest
->Add( ok
, 0, wxLEFT
|wxRIGHT
, margin 
); 
 223     if (flags 
& wxFORWARD
) 
 224         inner_rest
->Add( new wxButton( this, wxID_FORWARD
, _("Forward"),wxDefaultPosition
,wxDefaultSize
,wxCLIP_SIBLINGS  
), 0, wxLEFT
|wxRIGHT
, margin 
); 
 226     if (flags 
& wxBACKWARD
) 
 227         inner_rest
->Add( new wxButton( this, wxID_BACKWARD
, _("Backward"),wxDefaultPosition
,wxDefaultSize
,wxCLIP_SIBLINGS  
), 0, wxLEFT
|wxRIGHT
, margin 
); 
 230         inner_rest
->Add( new wxButton( this, wxID_SETUP
, _("Setup"),wxDefaultPosition
,wxDefaultSize
,wxCLIP_SIBLINGS  
), 0, wxLEFT
|wxRIGHT
, margin 
); 
 233         inner_rest
->Add( new wxButton( this, wxID_MORE
, _("More..."),wxDefaultPosition
,wxDefaultSize
,wxCLIP_SIBLINGS  
), 0, wxLEFT
|wxRIGHT
, margin 
); 
 236         inner_rest
->Add( new wxButton( this, wxID_HELP
, _("Help"),wxDefaultPosition
,wxDefaultSize
,wxCLIP_SIBLINGS  
), 0, wxLEFT
|wxRIGHT
, margin 
); 
 238     if (flags 
& wxCANCEL
) 
 240         wxButton 
*cancel 
= new wxButton( this, wxID_CANCEL
, _("Cancel"),wxDefaultPosition
,wxDefaultSize
,wxCLIP_SIBLINGS 
); 
 241         inner_rest
->Add( cancel
, 0, wxLEFT
|wxRIGHT
, margin 
); 
 244     // choose the default button 
 245     if (flags 
& wxNO_DEFAULT
) 
 270 #endif // wxUSE_BUTTON