X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/1408104d04fdea106c8ec288866c4143078ae71b..21689736a7139bc341463ab3db9329029fb93b85:/src/common/dlgcmn.cpp diff --git a/src/common/dlgcmn.cpp b/src/common/dlgcmn.cpp index eccae2934a..04ad2b6756 100644 --- a/src/common/dlgcmn.cpp +++ b/src/common/dlgcmn.cpp @@ -17,10 +17,8 @@ // headers // ---------------------------------------------------------------------------- -#if 0 #ifdef __GNUG__ - #pragma implementation -#endif + #pragma implementation "dialogbase.h" #endif // For compilers that support precompilation, includes "wx.h". @@ -31,155 +29,190 @@ #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 -// ---------------------------------------------------------------------------- -// constants -// ---------------------------------------------------------------------------- -const long wxDialogBase::LAYOUT_X_MARGIN = 5; -const long wxDialogBase::LAYOUT_Y_MARGIN = 5; +//-------------------------------------------------------------------------- +// wxDialogBase +//-------------------------------------------------------------------------- -const long wxDialogBase::MARGIN_BETWEEN_BUTTONS = 3*LAYOUT_X_MARGIN; +// 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() -// ============================================================================ -// implementation -// ============================================================================ - -// ---------------------------------------------------------------------------- -// dialog layout functions -// ---------------------------------------------------------------------------- +WX_DELEGATE_TO_CONTROL_CONTAINER(wxDialogBase) +#endif -wxSize wxDialogBase::SplitTextMessage(const wxString& message, - wxArrayString *lines) +void wxDialogBase::Init() { - wxClientDC dc(this); - dc.SetFont(wxSystemSettings::GetSystemFont(wxSYS_DEFAULT_GUI_FONT)); + m_returnCode = 0; - wxString curLine; - long height, width, heightTextMax = 0, widthTextMax = 0; - for ( const wxChar *pc = message; ; pc++ ) - { - if ( *pc == _T('\n') || !*pc ) - { -#if defined(__VISAGECPP__) -// have two versions of this in wxWindowDC tp avoid function hiding -// since there are two of these in wxDCBase, and in turn in wxDC. -// VA cannot resolve this so: - dc.GetTextExtent(curLine, &width, &height, NULL, NULL, NULL, FALSE); -#else - dc.GetTextExtent(curLine, &width, &height); + // 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 ( width > widthTextMax ) - widthTextMax = width; - if ( height > heightTextMax ) - heightTextMax = height; +} - lines->Add(curLine); +#if wxUSE_STATTEXT && wxUSE_TEXTCTRL - if ( !*pc ) - { - // the end of string - break; - } +wxSizer *wxDialogBase::CreateTextSizer( const wxString& message ) +{ + wxBoxSizer *box = new wxBoxSizer( wxVERTICAL ); - curLine.Empty(); - } - else + // get line height for empty lines + int y = 0; + wxFont font( GetFont() ); + if (!font.Ok()) + font = *wxSWISS_FONT; + GetTextExtent(_T("H"), (int*)NULL, &y, (int*)NULL, (int*)NULL, &font); + + wxString line; + for ( size_t pos = 0; pos < message.length(); pos++ ) + { + switch ( message[pos] ) { - curLine += *pc; + case _T('\n'): + if (!line.IsEmpty()) + { + wxStaticText *s1 = new wxStaticText( this, -1, line ); + box->Add( s1 ); + line = wxT(""); + } + else + { + box->Add( 5, y ); + } + break; + + case _T('&'): + // 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('&'); + + // fall through to add it normally too + + default: + line += message[pos]; } } - return wxSize(widthTextMax, heightTextMax); -} - -long wxDialogBase::CreateTextMessage(const wxArrayString& lines, - const wxPoint& posText, - const wxSize& sizeText) -{ - wxStaticText *text; - int y = posText.y; - size_t nLineCount = lines.GetCount(); - for ( size_t nLine = 0; nLine < nLineCount; nLine++ ) + // remaining text behind last '\n' + if (!line.IsEmpty()) { - text = new wxStaticText(this, -1, lines[nLine], - wxPoint(posText.x, y), - sizeText); - y += sizeText.GetHeight(); + wxStaticText *s2 = new wxStaticText( this, -1, line ); + box->Add( s2 ); } - return y; + return box; } -wxSize wxDialogBase::GetStandardButtonSize(bool hasCancel) +#endif // wxUSE_STATTEXT && wxUSE_TEXTCTRL + +#if wxUSE_BUTTON + +wxSizer *wxDialogBase::CreateButtonSizer( long flags ) { - int wButton = 0; - GetTextExtent(_("OK"), &wButton, NULL); + wxBoxSizer *box = new wxBoxSizer( wxHORIZONTAL ); - if ( hasCancel ) - { - int width; - GetTextExtent(_("Cancel"), &width, NULL); - if ( width > wButton ) - wButton = width; - } +#if defined(__WXMSW__) || defined(__WXMAC__) + static const int margin = 6; +#else + static const int margin = 10; +#endif - if ( wButton < 75 ) + wxButton *ok = (wxButton *) NULL; + wxButton *cancel = (wxButton *) NULL; + 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; + + if (flags & wxYES_NO) { - // the minimal acceptable width - wButton = 75; + 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 + if (flags & wxNO) + { + no = new wxButton( this, wxID_NO, _("No"),wxDefaultPosition,wxDefaultSize,wxCLIP_SIBLINGS ); + box->Add( no, 0, wxLEFT|wxRIGHT, margin ); } - else + + if (flags & wxOK) { - // the width of the button is not just the width of the label... - wButton += 2*LAYOUT_X_MARGIN; + ok = new wxButton( this, wxID_OK, _("OK"),wxDefaultPosition,wxDefaultSize,wxCLIP_SIBLINGS ); + box->Add( ok, 0, wxLEFT|wxRIGHT, margin ); } - // a nice looking proportion - int hButton = (wButton * 23) / 75; + if (flags & wxFORWARD) + box->Add( new wxButton( this, wxID_FORWARD, _("Forward"),wxDefaultPosition,wxDefaultSize,wxCLIP_SIBLINGS ), 0, wxLEFT|wxRIGHT, margin ); - return wxSize(wButton, hButton); -} + if (flags & wxBACKWARD) + box->Add( new wxButton( this, wxID_BACKWARD, _("Backward"),wxDefaultPosition,wxDefaultSize,wxCLIP_SIBLINGS ), 0, wxLEFT|wxRIGHT, margin ); -void wxDialogBase::CreateStandardButtons(long wDialog, - long y, - long wButton, - long hButton, - bool hasCancel) -{ - // NB: create [Ok] first to get the right tab order - wxButton *ok = (wxButton *) NULL; - wxButton *cancel = (wxButton *) NULL; + if (flags & wxSETUP) + box->Add( new wxButton( this, wxID_SETUP, _("Setup"),wxDefaultPosition,wxDefaultSize,wxCLIP_SIBLINGS ), 0, wxLEFT|wxRIGHT, margin ); - long x = wDialog / 2; - if ( hasCancel ) - x -= MARGIN_BETWEEN_BUTTONS / 2 + wButton; - else - x -= wButton / 2; + if (flags & wxMORE) + box->Add( new wxButton( this, wxID_MORE, _("More..."),wxDefaultPosition,wxDefaultSize,wxCLIP_SIBLINGS ), 0, wxLEFT|wxRIGHT, margin ); - ok = new wxButton( this, wxID_OK, _("OK"), - wxPoint(x, y), - wxSize(wButton, hButton) ); + if (flags & wxHELP) + box->Add( new wxButton( this, wxID_HELP, _("Help"),wxDefaultPosition,wxDefaultSize,wxCLIP_SIBLINGS ), 0, wxLEFT|wxRIGHT, margin ); - if ( hasCancel ) + if (flags & wxCANCEL) { - x += MARGIN_BETWEEN_BUTTONS + wButton; - cancel = new wxButton( this, wxID_CANCEL, _("Cancel"), - wxPoint(x, y), - wxSize(wButton, hButton) ); + cancel = new wxButton( this, wxID_CANCEL, _("Cancel"),wxDefaultPosition,wxDefaultSize,wxCLIP_SIBLINGS ); + box->Add( cancel, 0, wxLEFT|wxRIGHT, margin ); } - ok->SetDefault(); - ok->SetFocus(); -} + if (flags & wxNO_DEFAULT) + { + if (no) + { + no->SetDefault(); + no->SetFocus(); + } + } + else + { + if (ok) + { + ok->SetDefault(); + ok->SetFocus(); + } + else if (yes) + { + yes->SetDefault(); + yes->SetFocus(); + } + } -long wxDialogBase::GetStandardTextHeight() -{ - return (3*GetCharHeight()) / 2; + return box; } + +#endif // wxUSE_BUTTON