X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/fd3ece57847921264876c8daa1649b597e988d5b..a43a9e5521440dbb28037646ed4a07125c8823a9:/src/common/statbar.cpp diff --git a/src/common/statbar.cpp b/src/common/statbar.cpp index 9db337c9a5..c8e47cec57 100644 --- a/src/common/statbar.cpp +++ b/src/common/statbar.cpp @@ -41,8 +41,8 @@ const char wxStatusBarNameStr[] = "statusBar"; IMPLEMENT_DYNAMIC_CLASS(wxStatusBar, wxWindow) -#include // This is a magic incantation which must be done! -WX_DEFINE_OBJARRAY(wxStatusBarPaneArray); +#include "wx/arrimpl.cpp" // This is a magic incantation which must be done! +WX_DEFINE_EXPORTED_OBJARRAY(wxStatusBarPaneArray) // ---------------------------------------------------------------------------- @@ -58,7 +58,7 @@ wxStatusBarBase::~wxStatusBarBase() { // notify the frame that it doesn't have a status bar any longer to avoid // dangling pointers - wxFrame *frame = dynamic_cast(GetParent()); + wxFrame *frame = wxDynamicCast(GetParent(), wxFrame); if ( frame && frame->GetStatusBar() == this ) frame->SetStatusBar(NULL); } @@ -104,7 +104,7 @@ void wxStatusBarBase::SetStatusWidths(int WXUNUSED_UNLESS_DEBUG(n), else { for ( size_t i = 0; i < m_panes.GetCount(); i++ ) - m_panes[i].nWidth = widths[i]; + m_panes[i].m_nWidth = widths[i]; m_bSameWidthForAllPanes = false; } @@ -121,7 +121,7 @@ void wxStatusBarBase::SetStatusStyles(int WXUNUSED_UNLESS_DEBUG(n), wxASSERT_MSG( (size_t)n == m_panes.GetCount(), _T("field number mismatch") ); for ( size_t i = 0; i < m_panes.GetCount(); i++ ) - m_panes[i].nStyle = styles[i]; + m_panes[i].m_nStyle = styles[i]; // update the display after the widths changed Refresh(); @@ -158,10 +158,10 @@ wxArrayInt wxStatusBarBase::CalculateAbsWidths(wxCoord widthTotal) const for ( i = 0; i < m_panes.GetCount(); i++ ) { - if ( m_panes[i].nWidth >= 0 ) - nTotalWidth += m_panes[i].nWidth; + if ( m_panes[i].GetWidth() >= 0 ) + nTotalWidth += m_panes[i].GetWidth(); else - nVarCount += -m_panes[i].nWidth; + nVarCount += -m_panes[i].GetWidth(); } // the amount of extra width we have per each var width field @@ -170,12 +170,12 @@ wxArrayInt wxStatusBarBase::CalculateAbsWidths(wxCoord widthTotal) const // do fill the array for ( i = 0; i < m_panes.GetCount(); i++ ) { - if ( m_panes[i].nWidth >= 0 ) - widths.Add(m_panes[i].nWidth); + if ( m_panes[i].GetWidth() >= 0 ) + widths.Add(m_panes[i].GetWidth()); else { - int nVarWidth = widthExtra > 0 ? (widthExtra * (-m_panes[i].nWidth)) / nVarCount : 0; - nVarCount += m_panes[i].nWidth; + int nVarWidth = widthExtra > 0 ? (widthExtra * (-m_panes[i].GetWidth())) / nVarCount : 0; + nVarCount += m_panes[i].GetWidth(); widthExtra -= nVarWidth; widths.Add(nVarWidth); } @@ -191,20 +191,43 @@ wxArrayInt wxStatusBarBase::CalculateAbsWidths(wxCoord widthTotal) const void wxStatusBarBase::PushStatusText(const wxString& text, int number) { - // save current status text in the stack - m_panes[number].arrStack.push_back(GetStatusText(number)); + // save the new text (in non-ellipsized form) in the stack + m_panes[number].m_arrStack.push_back(text); - // update current status text SetStatusText(text, number); + // update current status text (which will possibly be ellipsized) + // also in the native control + + // SetStatusText() typically has an optimization built-in to avoid flickering + // which won't refresh the status bar pane if the current top of the stack + // is identic to the text passed to that function. + // Since this optimization however cannot detect push/pop operations on the stack + // we need to explicitely refresh the status bar pane ourselves: + wxRect rect; + GetFieldRect(number, rect); + Refresh(true, &rect); + Update(); } void wxStatusBarBase::PopStatusText(int number) { - wxString text = m_panes[number].arrStack.back(); - m_panes[number].arrStack.pop_back(); // also remove it from the stack + wxASSERT_MSG(m_panes[number].m_arrStack.GetCount() > 1, + "can't pop any further string"); - // restore the popped status text in the pane + // the top of the stack is the status text currently shown in the native control; + // remove it + m_panes[number].m_arrStack.pop_back(); + + // restore the previous status text in the native control + const wxString& text = m_panes[number].m_arrStack.back(); SetStatusText(text, number); + + // see comment in wxStatusBarBase::PushStatusText about why we need to explicitely + // refresh the status bar pane + wxRect rect; + GetFieldRect(number, rect); + Refresh(true, &rect); + Update(); } #endif // wxUSE_STATUSBAR