X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/9617f65bccba124625546fd798e03e59d97b35c9..2bfca191bf2261e385594a369da9aa4e4441aa43:/src/msw/button.cpp?ds=sidebyside diff --git a/src/msw/button.cpp b/src/msw/button.cpp index 45f6b37795..b342fbc0b2 100644 --- a/src/msw/button.cpp +++ b/src/msw/button.cpp @@ -40,8 +40,8 @@ #endif #include "wx/stockitem.h" -#include "wx/tokenzr.h" #include "wx/msw/private.h" +#include "wx/msw/private/button.h" #if wxUSE_UXTHEME #include "wx/msw/uxtheme.h" @@ -183,10 +183,7 @@ bool wxButton::Create(wxWindow *parent, // // NB: we do it here and not in MSWGetStyle() because we need the label // value and the label is not set yet when MSWGetStyle() is called - if ( label.find(_T('\n')) != wxString::npos ) - { - msStyle |= BS_MULTILINE; - } + msStyle |= wxMSWButton::GetMultilineStyle(label); return MSWCreateControl(_T("BUTTON"), msStyle, pos, size, label, exstyle); } @@ -238,19 +235,7 @@ WXDWORD wxButton::MSWGetStyle(long style, WXDWORD *exstyle) const void wxButton::SetLabel(const wxString& label) { - // update BS_MULTILINE style depending on the new label (resetting it - // doesn't seem to do anything very useful but it shouldn't hurt and we do - // have to set it whenever the label becomes multi line as otherwise it - // wouldn't be shown correctly) - long styleOld = ::GetWindowLong(GetHwnd(), GWL_STYLE), - styleNew; - if ( label.find(_T('\n')) != wxString::npos ) - styleNew = styleOld | BS_MULTILINE; - else - styleNew = styleOld & ~BS_MULTILINE; - - if ( styleNew != styleOld ) - ::SetWindowLong(GetHwnd(), GWL_STYLE, styleNew); + wxMSWButton::UpdateMultilineStyle(GetHwnd(), label); wxButtonBase::SetLabel(label); } @@ -367,26 +352,32 @@ wxWindow *wxButton::SetDefault() return winOldDefault; } -// special version of wxGetTopLevelParent() which is safe to call when the -// parent is being destroyed: wxGetTopLevelParent() would just return NULL in -// this case because wxWindow version of IsTopLevel() is used when it's called -// during window destruction instead of wxTLW one, but we want to distinguish -// between these cases +// return the top level parent window if it's not being deleted yet, otherwise +// return NULL static wxTopLevelWindow *GetTLWParentIfNotBeingDeleted(wxWindow *win) { - for ( ; win; win = win->GetParent() ) + for ( ;; ) { - if ( win->IsTopLevel() ) + // IsTopLevel() will return false for a wxTLW being deleted, so we also + // need the parent test for this case + wxWindow * const parent = win->GetParent(); + if ( !parent || win->IsTopLevel() ) { if ( win->IsBeingDeleted() ) return NULL; + break; } + + win = parent; } wxASSERT_MSG( win, _T("button without top level parent?") ); - return wxDynamicCast(win, wxTopLevelWindow); + wxTopLevelWindow * const tlw = wxDynamicCast(win, wxTopLevelWindow); + wxASSERT_MSG( tlw, _T("logic error in GetTLWParentIfNotBeingDeleted()") ); + + return tlw; } // set this button as being currently default