X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/1f3154c809eebf42351427a4eaf7ea1e56864742..aee12bfb80fb63b82552f59127d5e66b7f056ff2:/src/os2/stattext.cpp diff --git a/src/os2/stattext.cpp b/src/os2/stattext.cpp index 0491f7b260..a344877e2b 100644 --- a/src/os2/stattext.cpp +++ b/src/os2/stattext.cpp @@ -9,10 +9,6 @@ // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// -#ifdef __GNUG__ -#pragma implementation "stattext.h" -#endif - // For compilers that support precompilation, includes "wx.h". #include "wx/wxprec.h" @@ -20,6 +16,7 @@ #include "wx/event.h" #include "wx/app.h" #include "wx/brush.h" +#include "wx/scrolwin.h" #endif #include "wx/stattext.h" @@ -45,7 +42,7 @@ bool wxStaticText::Create( SetBackgroundColour(pParent->GetBackgroundColour()) ; SetForegroundColour(pParent->GetForegroundColour()) ; - if ( id == -1 ) + if ( vId == -1 ) m_windowId = (int)NewControlId(); else m_windowId = vId; @@ -59,16 +56,22 @@ bool wxStaticText::Create( long lSstyle = 0L; - lSstyle = WS_VISIBLE | SS_TEXT | DT_VCENTER; + // Used to have DT_VCENTER but that doesn't work correctly with + // multiline strings and DT_WORDBREAK. Accept a reasonable + // compromise for now + lSstyle = WS_VISIBLE | SS_TEXT | DT_WORDBREAK | DT_MNEMONIC; if (m_windowStyle & wxALIGN_CENTRE) lSstyle |= DT_CENTER; else if (m_windowStyle & wxALIGN_RIGHT) lSstyle |= DT_RIGHT; else lSstyle |= DT_LEFT; + + wxString sLabel = ::wxPMTextToLabel(rsLabel); + m_hWnd = (WXHWND)::WinCreateWindow( (HWND)GetHwndOf(pParent) // Parent window handle ,WC_STATIC // Window class - ,(PSZ)rsLabel.c_str() // Initial Text + ,(PSZ)sLabel.c_str() // Initial Text ,(ULONG)lSstyle // Style flags ,0L, 0L, 0L, 0L // Origin -- 0 size ,(HWND)GetHwndOf(pParent) // owner window handle (same as parent @@ -80,10 +83,35 @@ bool wxStaticText::Create( wxCHECK_MSG(m_hWnd, FALSE, wxT("Failed to create static ctrl")); + wxColour vColour; + + vColour.Set(wxString(wxT("BLACK"))); + + LONG lColor = (LONG)vColour.GetPixel(); + + ::WinSetPresParam( m_hWnd + ,PP_FOREGROUNDCOLOR + ,sizeof(LONG) + ,(PVOID)&lColor + ); + lColor = (LONG)m_backgroundColour.GetPixel(); + + ::WinSetPresParam( m_hWnd + ,PP_BACKGROUNDCOLOR + ,sizeof(LONG) + ,(PVOID)&lColor + ); + SubclassWin(m_hWnd); - wxControl::SetFont(pParent->GetFont()); - SetSize(nX, nY, nWidth, nHeight); - return FALSE; + SetFont(*wxSMALL_FONT); + SetXComp(0); + SetYComp(0); + SetSize( nX + ,nY + ,nWidth + ,nHeight + ); + return TRUE; } // end of wxStaticText::Create wxSize wxStaticText::DoGetBestSize() const @@ -95,8 +123,9 @@ wxSize wxStaticText::DoGetBestSize() const int nHeightLineDefault = 0; int nHeightLine = 0; wxString sCurLine; + bool bLastWasTilde = FALSE; - for ( const wxChar *pc = sText; ; pc++ ) + for (const wxChar *pc = sText; ; pc++) { if ( *pc == wxT('\n') || *pc == wxT('\0') ) { @@ -135,6 +164,29 @@ wxSize wxStaticText::DoGetBestSize() const } else { + // + // We shouldn't take into account the '~' which just introduces the + // mnemonic characters and so are not shown on the screen -- except + // when it is preceded by another '~' in which case it stands for a + // literal tilde + // + if (*pc == _T('~')) + { + if (!bLastWasTilde) + { + bLastWasTilde = TRUE; + + // + // Skip the statement adding pc to curLine below + // + continue; + } + + // + // It is a literal tilde + // + bLastWasTilde = FALSE; + } sCurLine += *pc; } } @@ -143,22 +195,26 @@ wxSize wxStaticText::DoGetBestSize() const ); } // end of wxStaticText::DoGetBestSize -void wxStaticText::SetLabel( - const wxString& rsLabel +void wxStaticText::DoSetSize( + int nX +, int nY +, int nWidth +, int nHeight +, int nSizeFlags ) { - ::WinSetWindowText(GetHwnd(), rsLabel.c_str()); - // - // Adjust the size of the window to fit to the label unless autoresizing is - // disabled + // We need to refresh the window after changing its size as the standard + // control doesn't always update itself properly. // - if (!(GetWindowStyle() & wxST_NO_AUTORESIZE)) - { - DoSetSize(-1, -1, -1, -1, wxSIZE_AUTO_WIDTH | wxSIZE_AUTO_HEIGHT); - } - DoSetSize(-1, -1, -1, -1, wxSIZE_AUTO_WIDTH | wxSIZE_AUTO_HEIGHT); -} // end of wxStaticText::SetLabel + wxStaticTextBase::DoSetSize( nX + ,nY + ,nWidth + ,nHeight + ,nSizeFlags + ); + Refresh(); +} // end of wxStaticText::DoSetSize bool wxStaticText::SetFont( const wxFont& rFont @@ -177,6 +233,33 @@ bool wxStaticText::SetFont( return bRet; } // end of wxStaticText::SetFont +void wxStaticText::SetLabel( + const wxString& rsLabel +) +{ + wxString sLabel = ::wxPMTextToLabel(rsLabel); + ::WinSetWindowText(GetHwnd(), (PSZ)sLabel.c_str()); + + // + // Adjust the size of the window to fit to the label unless autoresizing is + // disabled + // + if (!(GetWindowStyle() & wxST_NO_AUTORESIZE)) + { + wxCoord vX; + wxCoord vY; + wxCoord vWidth; + wxCoord vHeight; + + GetPosition(&vX, &vY); + GetSize(&vWidth, &vHeight); + if (!(vX == -1 && vY == -1 && vWidth == -1 && vHeight == -1)) + DoSetSize(vX, vY, vWidth, vHeight, wxSIZE_AUTO_WIDTH | wxSIZE_AUTO_HEIGHT); + else + DoSetSize(-1, -1, -1, -1, wxSIZE_AUTO_WIDTH | wxSIZE_AUTO_HEIGHT); + } +} // end of wxStaticText::SetLabel + MRESULT wxStaticText::OS2WindowProc( WXUINT uMsg , WXWPARAM wParam @@ -188,5 +271,3 @@ MRESULT wxStaticText::OS2WindowProc( ,lParam ); } // end of wxStaticText::OS2WindowProc - -