X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/9c8849722a71ee7139e035bca5fdb2ae7b0af570..5f7348ce627157e21bec507623ebd31c1e9dc762:/src/common/dlgcmn.cpp diff --git a/src/common/dlgcmn.cpp b/src/common/dlgcmn.cpp index faf7074891..d32ba91318 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,10 +17,8 @@ // headers // ---------------------------------------------------------------------------- -#if 0 -#ifdef __GNUG__ - #pragma implementation -#endif +#if defined(__GNUG__) && !defined(NO_GCC_PRAGMA) + #pragma implementation "dialogbase.h" #endif // For compilers that support precompilation, includes "wx.h". @@ -31,124 +29,215 @@ #endif #ifndef WX_PRECOMP + #include "wx/button.h" #include "wx/dialog.h" #include "wx/dcclient.h" #include "wx/intl.h" #include "wx/settings.h" #include "wx/stattext.h" #include "wx/sizer.h" + #include "wx/button.h" + #include "wx/containr.h" #endif //-------------------------------------------------------------------------- // wxDialogBase //-------------------------------------------------------------------------- -wxSizer *wxDialogBase::CreateTextSizer( const wxString &message ) +// FIXME - temporary hack in absence of wxtopLevelWindow, should be always used +#ifdef wxTopLevelWindowNative +BEGIN_EVENT_TABLE(wxDialogBase, wxTopLevelWindow) + WX_EVENT_TABLE_CONTROL_CONTAINER(wxDialogBase) +END_EVENT_TABLE() + +WX_DELEGATE_TO_CONTROL_CONTAINER(wxDialogBase) +#endif + +void wxDialogBase::Init() { - wxBoxSizer *box = new wxBoxSizer( wxVERTICAL ); + m_returnCode = 0; + m_affirmativeId = wxID_OK; + // 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 + +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 int y = 0; - wxFont new_font( GetFont() ); - if (!new_font.Ok()) new_font = *wxSWISS_FONT; - GetTextExtent( "H", (int*)NULL, &y, (int*)NULL, (int*)NULL, &new_font ); - + wxFont font( GetFont() ); + if (!font.Ok()) + font = *wxSWISS_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.Len(); pos++) + for ( size_t pos = 0; pos < text.length(); pos++ ) { - if (message[pos] == _T('\n')) - { - if (!line.IsEmpty()) - { - wxStaticText *s1 = new wxStaticText( this, -1, line ); - box->Add( s1 ); - line = _T(""); - } - else - { - box->Add( 5, y ); - } - } - else + switch ( text[pos] ) { - line += message[pos]; + case wxT('\n'): + if (!line.empty()) + { + wxStaticText *s = new wxStaticText( this, wxID_ANY, line ); + box->Add( s ); + line = wxEmptyString; + } + else + { + box->Add( 5, y ); + } + break; + + case wxT('&'): + // this is used as accel mnemonic prefix in the wxWidgets + // 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 += 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, wxID_ANY, line ); + box->Add( s ); + + pos = last_space; + last_space = 0; + line = wxEmptyString; + } + } } } - + // remaining text behind last '\n' - if (!line.IsEmpty()) + if (!line.empty()) { - wxStaticText *s2 = new wxStaticText( this, -1, line ); - box->Add( s2 ); + wxStaticText *s2 = new wxStaticText( this, wxID_ANY, line ); + box->Add( s2 ); } - + return box; } - + +#endif // wxUSE_STATTEXT // && wxUSE_TEXTCTRL + +#if wxUSE_BUTTON + wxSizer *wxDialogBase::CreateButtonSizer( long flags ) { - wxBoxSizer *box = new wxBoxSizer( wxHORIZONTAL ); +#ifdef __SMARTPHONE__ + wxDialog* dialog = (wxDialog*) this; + if (flags & wxOK){ + dialog->SetLeftMenu(wxID_OK); + } + + if (flags & wxCANCEL){ + dialog->SetRightMenu(wxID_CANCEL); + } + + if (flags & wxYES){ + dialog->SetLeftMenu(wxID_YES); + } -#if defined(__WXMSW__) || defined(__WXMAC__) - int margin = 6; + if (flags & wxNO){ + dialog->SetLeftMenu(wxID_NO); + } + wxBoxSizer* sizer = new wxBoxSizer(wxHORIZONTAL); + return sizer; #else - int margin = 10; + return CreateStdDialogButtonSizer( flags ); #endif +} - wxButton *ok = (wxButton *) NULL; - wxButton *cancel = (wxButton *) NULL; - wxButton *yes = (wxButton *) NULL; - wxButton *no = (wxButton *) NULL; +wxStdDialogButtonSizer *wxDialogBase::CreateStdDialogButtonSizer( long flags ) +{ + wxStdDialogButtonSizer *sizer = new wxStdDialogButtonSizer(); + wxButton *ok = NULL; + wxButton *yes = NULL; + wxButton *no = NULL; - // always show an OK button, unless only YES_NO is given - if ((flags & wxYES_NO) == 0) flags = flags | wxOK; - - if (flags & wxYES_NO) - { - yes = new wxButton( this, wxID_YES, _("Yes") ); - box->Add( yes, 0, wxLEFT|wxRIGHT, margin ); - no = new wxButton( this, wxID_NO, _("No") ); - box->Add( no, 0, wxLEFT|wxRIGHT, margin ); - } else - if (flags & wxYES) - { - yes = new wxButton( this, wxID_YES, _("Yes") ); - box->Add( yes, 0, wxLEFT|wxRIGHT, margin ); - } else - if (flags & wxNO) - { - no = new wxButton( this, wxID_NO, _("No") ); - box->Add( no, 0, wxLEFT|wxRIGHT, margin ); + if (flags & wxOK){ + ok = new wxButton(this, wxID_OK); + sizer->AddButton(ok); } - if (flags & wxOK) - { - ok = new wxButton( this, wxID_OK, _("OK") ); - box->Add( ok, 0, wxLEFT|wxRIGHT, margin ); + if (flags & wxCANCEL){ + wxButton *cancel = new wxButton(this, wxID_CANCEL); + sizer->AddButton(cancel); } - if (flags & wxFORWARD) - box->Add( new wxButton( this, wxID_FORWARD, _("Forward") ), 0, wxLEFT|wxRIGHT, margin ); - - if (flags & wxBACKWARD) - box->Add( new wxButton( this, wxID_BACKWARD, _("Backward") ), 0, wxLEFT|wxRIGHT, margin ); + if (flags & wxYES){ + yes = new wxButton(this, wxID_YES); + sizer->AddButton(yes); + } - if (flags & wxSETUP) - box->Add( new wxButton( this, wxID_SETUP, _("Setup") ), 0, wxLEFT|wxRIGHT, margin ); + if (flags & wxNO){ + no = new wxButton(this, wxID_NO); + sizer->AddButton(no); + } - if (flags & wxMORE) - box->Add( new wxButton( this, wxID_MORE, _("More...") ), 0, wxLEFT|wxRIGHT, margin ); + if (flags & wxHELP){ + wxButton *help = new wxButton(this, wxID_HELP); + sizer->AddButton(help); + } - if (flags & wxHELP) - box->Add( new wxButton( this, wxID_HELP, _("Help") ), 0, wxLEFT|wxRIGHT, margin ); + sizer->Realize(); - if (flags & wxCANCEL) + if (flags & wxNO_DEFAULT) { - cancel = new wxButton( this, wxID_CANCEL, _("Cancel") ); - box->Add( cancel, 0, wxLEFT|wxRIGHT, margin ); + if (no) + { + no->SetDefault(); + no->SetFocus(); + } } - - if ((flags & wxNO_DEFAULT) == 0) + else { if (ok) { @@ -162,6 +251,13 @@ wxSizer *wxDialogBase::CreateButtonSizer( long flags ) } } - return box; + if (flags & wxOK) + SetAffirmativeId(wxID_OK); + else if (flags & wxYES) + SetAffirmativeId(wxID_YES); + + return sizer; } + +#endif // wxUSE_BUTTON