X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/a350a4884134b13ec47a7c5c18f473f878e7cbc4..64dcc269136ad1ad47c6df4d707c9a42961c5694:/src/common/dlgcmn.cpp diff --git a/src/common/dlgcmn.cpp b/src/common/dlgcmn.cpp index 3688684b37..82501e06d9 100644 --- a/src/common/dlgcmn.cpp +++ b/src/common/dlgcmn.cpp @@ -6,7 +6,7 @@ // Created: 28.06.99 // RCS-ID: $Id$ // Copyright: (c) Vadim Zeitlin -// Licence: wxWindows license +// Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// // ============================================================================ @@ -17,7 +17,7 @@ // headers // ---------------------------------------------------------------------------- -#ifdef __GNUG__ +#if defined(__GNUG__) && !defined(NO_GCC_PRAGMA) #pragma implementation "dialogbase.h" #endif @@ -40,7 +40,6 @@ #include "wx/containr.h" #endif - //-------------------------------------------------------------------------- // wxDialogBase //-------------------------------------------------------------------------- @@ -57,15 +56,35 @@ WX_DELEGATE_TO_CONTROL_CONTAINER(wxDialogBase) void wxDialogBase::Init() { m_returnCode = 0; + + // the dialogs have this flag on by default to prevent the events from the + // dialog controls from reaching the parent frame which is usually + // undesirable and can lead to unexpected and hard to find bugs + SetExtraStyle(GetExtraStyle() | wxWS_EX_BLOCK_EVENTS); + #ifdef wxTopLevelWindowNative // FIXME - temporary hack, should be always used! m_container.SetContainerWindow(this); #endif } -#if wxUSE_STATTEXT && wxUSE_TEXTCTRL +#if wxUSE_STATTEXT // && wxUSE_TEXTCTRL wxSizer *wxDialogBase::CreateTextSizer( const wxString& message ) { + bool is_pda = (wxSystemSettings::GetScreenType() <= wxSYS_SCREEN_PDA); + + wxString text = message; + + // I admit that this is complete bogus, but it makes + // message boxes work for pda screens temporarily.. + int max_width = -1; + if (is_pda) + { + max_width = wxSystemSettings::GetMetric( wxSYS_SCREEN_X ) - 25; + text += wxT('\n'); + } + + wxBoxSizer *box = new wxBoxSizer( wxVERTICAL ); // get line height for empty lines @@ -73,18 +92,19 @@ wxSizer *wxDialogBase::CreateTextSizer( const wxString& message ) wxFont font( GetFont() ); if (!font.Ok()) font = *wxSWISS_FONT; - GetTextExtent(_T("H"), (int*)NULL, &y, (int*)NULL, (int*)NULL, &font); + GetTextExtent( wxT("H"), (int*)NULL, &y, (int*)NULL, (int*)NULL, &font); + size_t last_space = 0; wxString line; - for ( size_t pos = 0; pos < message.length(); pos++ ) + for ( size_t pos = 0; pos < text.length(); pos++ ) { - switch ( message[pos] ) + switch ( text[pos] ) { - case _T('\n'): + case wxT('\n'): if (!line.IsEmpty()) { - wxStaticText *s1 = new wxStaticText( this, -1, line ); - box->Add( s1 ); + wxStaticText *s = new wxStaticText( this, -1, line ); + box->Add( s ); line = wxT(""); } else @@ -93,17 +113,44 @@ wxSizer *wxDialogBase::CreateTextSizer( const wxString& message ) } break; - case _T('&'): + case wxT('&'): // this is used as accel mnemonic prefix in the wxWindows // controls but in the static messages created by // CreateTextSizer() (used by wxMessageBox, for example), we // don't want this special meaning, so we need to quote it - line += _T('&'); + line += wxT('&'); // fall through to add it normally too default: + if (text[pos] == wxT(' ')) + last_space = pos; + line += message[pos]; + + if (is_pda) + { + int width = 0; + GetTextExtent( line, &width, (int*)NULL, (int*)NULL, (int*)NULL, &font ); + + if (width > max_width) + { + // exception if there was no previous space + if (last_space == 0) + last_space = pos; + + int diff = pos-last_space; + int len = line.Len(); + line.Remove( len-diff, diff ); + + wxStaticText *s = new wxStaticText( this, -1, line ); + box->Add( s ); + + pos = last_space; + last_space = 0; + line = wxT(""); + } + } } } @@ -117,13 +164,35 @@ wxSizer *wxDialogBase::CreateTextSizer( const wxString& message ) return box; } -#endif // wxUSE_STATTEXT && wxUSE_TEXTCTRL +#endif // wxUSE_STATTEXT // && wxUSE_TEXTCTRL #if wxUSE_BUTTON wxSizer *wxDialogBase::CreateButtonSizer( long flags ) { - wxBoxSizer *box = new wxBoxSizer( wxHORIZONTAL ); + bool is_pda = (wxSystemSettings::GetScreenType() <= wxSYS_SCREEN_PDA); + + wxBoxSizer *box = NULL; + + // If we have a PDA screen, put yes/no button over + // all other buttons, otherwise on the left side. + if (is_pda) + box = new wxBoxSizer( wxVERTICAL ); + else + box = new wxBoxSizer( wxHORIZONTAL ); + + wxBoxSizer *inner_yes_no = NULL; + + // Only create sizer containing yes/no + // if it is actually required + if ( (flags & wxYES_NO) != 0 ) + { + inner_yes_no = new wxBoxSizer( wxHORIZONTAL ); + box->Add( inner_yes_no, 0, wxBOTTOM, 10 ); + } + + wxBoxSizer *inner_rest = new wxBoxSizer( wxHORIZONTAL ); + box->Add( inner_rest, 0, 0, 0 ); #if defined(__WXMSW__) || defined(__WXMAC__) static const int margin = 6; @@ -136,54 +205,49 @@ wxSizer *wxDialogBase::CreateButtonSizer( long flags ) wxButton *yes = (wxButton *) NULL; wxButton *no = (wxButton *) NULL; - // always show an OK button, unless only YES_NO is given - if ((flags & wxYES_NO) == 0) flags = flags | wxOK; + // always show an OK button, unless we have both YES and NO + if ( (flags & wxYES_NO) != wxYES_NO ) + flags |= wxOK; - if (flags & wxYES_NO) - { - yes = new wxButton( this, wxID_YES, _("Yes"),wxDefaultPosition,wxDefaultSize,wxCLIP_SIBLINGS ); - box->Add( yes, 0, wxLEFT|wxRIGHT, margin ); - no = new wxButton( this, wxID_NO, _("No") ,wxDefaultPosition,wxDefaultSize,wxCLIP_SIBLINGS); - box->Add( no, 0, wxLEFT|wxRIGHT, margin ); - } else if (flags & wxYES) { yes = new wxButton( this, wxID_YES, _("Yes"),wxDefaultPosition,wxDefaultSize,wxCLIP_SIBLINGS ); - box->Add( yes, 0, wxLEFT|wxRIGHT, margin ); - } else + inner_yes_no->Add( yes, 0, wxLEFT|wxRIGHT, margin ); + } if (flags & wxNO) { no = new wxButton( this, wxID_NO, _("No"),wxDefaultPosition,wxDefaultSize,wxCLIP_SIBLINGS ); - box->Add( no, 0, wxLEFT|wxRIGHT, margin ); + inner_yes_no->Add( no, 0, wxLEFT|wxRIGHT, margin ); } if (flags & wxOK) { ok = new wxButton( this, wxID_OK, _("OK"),wxDefaultPosition,wxDefaultSize,wxCLIP_SIBLINGS ); - box->Add( ok, 0, wxLEFT|wxRIGHT, margin ); + inner_rest->Add( ok, 0, wxLEFT|wxRIGHT, margin ); } if (flags & wxFORWARD) - box->Add( new wxButton( this, wxID_FORWARD, _("Forward"),wxDefaultPosition,wxDefaultSize,wxCLIP_SIBLINGS ), 0, wxLEFT|wxRIGHT, margin ); + inner_rest->Add( new wxButton( this, wxID_FORWARD, _("Forward"),wxDefaultPosition,wxDefaultSize,wxCLIP_SIBLINGS ), 0, wxLEFT|wxRIGHT, margin ); if (flags & wxBACKWARD) - box->Add( new wxButton( this, wxID_BACKWARD, _("Backward"),wxDefaultPosition,wxDefaultSize,wxCLIP_SIBLINGS ), 0, wxLEFT|wxRIGHT, margin ); + inner_rest->Add( new wxButton( this, wxID_BACKWARD, _("Backward"),wxDefaultPosition,wxDefaultSize,wxCLIP_SIBLINGS ), 0, wxLEFT|wxRIGHT, margin ); if (flags & wxSETUP) - box->Add( new wxButton( this, wxID_SETUP, _("Setup"),wxDefaultPosition,wxDefaultSize,wxCLIP_SIBLINGS ), 0, wxLEFT|wxRIGHT, margin ); + inner_rest->Add( new wxButton( this, wxID_SETUP, _("Setup"),wxDefaultPosition,wxDefaultSize,wxCLIP_SIBLINGS ), 0, wxLEFT|wxRIGHT, margin ); if (flags & wxMORE) - box->Add( new wxButton( this, wxID_MORE, _("More..."),wxDefaultPosition,wxDefaultSize,wxCLIP_SIBLINGS ), 0, wxLEFT|wxRIGHT, margin ); + inner_rest->Add( new wxButton( this, wxID_MORE, _("More..."),wxDefaultPosition,wxDefaultSize,wxCLIP_SIBLINGS ), 0, wxLEFT|wxRIGHT, margin ); if (flags & wxHELP) - box->Add( new wxButton( this, wxID_HELP, _("Help"),wxDefaultPosition,wxDefaultSize,wxCLIP_SIBLINGS ), 0, wxLEFT|wxRIGHT, margin ); + inner_rest->Add( new wxButton( this, wxID_HELP, _("Help"),wxDefaultPosition,wxDefaultSize,wxCLIP_SIBLINGS ), 0, wxLEFT|wxRIGHT, margin ); if (flags & wxCANCEL) { cancel = new wxButton( this, wxID_CANCEL, _("Cancel"),wxDefaultPosition,wxDefaultSize,wxCLIP_SIBLINGS ); - box->Add( cancel, 0, wxLEFT|wxRIGHT, margin ); + inner_rest->Add( cancel, 0, wxLEFT|wxRIGHT, margin ); } + // choose the default button if (flags & wxNO_DEFAULT) { if (no)