X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/7993e67c758d0321c3bf2a6cab2ee16c42c73eab..17d87392c601ead3507b05a47d59ae5e395ccf6d:/src/os2/stattext.cpp diff --git a/src/os2/stattext.cpp b/src/os2/stattext.cpp index fbeefc707f..b636f26e3d 100644 --- a/src/os2/stattext.cpp +++ b/src/os2/stattext.cpp @@ -1,5 +1,5 @@ ///////////////////////////////////////////////////////////////////////////// -// Name: stattext.cpp +// Name: src/os2/stattext.cpp // Purpose: wxStaticText // Author: David Webster // Modified by: @@ -9,34 +9,30 @@ // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// -#ifdef __GNUG__ -#pragma implementation "stattext.h" -#endif - // For compilers that support precompilation, includes "wx.h". #include "wx/wxprec.h" +#include "wx/stattext.h" + #ifndef WX_PRECOMP -#include "wx/event.h" -#include "wx/app.h" -#include "wx/brush.h" + #include "wx/event.h" + #include "wx/app.h" + #include "wx/brush.h" + #include "wx/scrolwin.h" #endif -#include "wx/stattext.h" #include "wx/os2/private.h" #include IMPLEMENT_DYNAMIC_CLASS(wxStaticText, wxControl) -bool wxStaticText::Create( - wxWindow* pParent -, wxWindowID vId -, const wxString& rsLabel -, const wxPoint& rPos -, const wxSize& rSize -, long lStyle -, const wxString& rsName -) +bool wxStaticText::Create( wxWindow* pParent, + wxWindowID vId, + const wxString& rsLabel, + const wxPoint& rPos, + const wxSize& rSize, + long lStyle, + const wxString& rsName ) { SetName(rsName); if (pParent) @@ -45,30 +41,36 @@ bool wxStaticText::Create( SetBackgroundColour(pParent->GetBackgroundColour()) ; SetForegroundColour(pParent->GetForegroundColour()) ; - if ( vId == -1 ) + if ( vId == wxID_ANY ) m_windowId = (int)NewControlId(); else m_windowId = vId; - int nX = rPos.x; - int nY = rPos.y; - int nWidth = rSize.x; - int nHeight = rSize.y; + int nX = rPos.x; + int nY = rPos.y; + int nWidth = rSize.x; + int nHeight = rSize.y; m_windowStyle = lStyle; - long lSstyle = 0L; + 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 @@ -78,13 +80,9 @@ bool wxStaticText::Create( ,NULL // no Presentation parameters ); - wxCHECK_MSG(m_hWnd, FALSE, wxT("Failed to create static ctrl")); - - wxColour vColour; + wxCHECK_MSG(m_hWnd, false, wxT("Failed to create static ctrl")); - vColour.Set(wxString("BLACK")); - - LONG lColor = (LONG)vColour.GetPixel(); + LONG lColor = (LONG)wxBLACK->GetPixel(); ::WinSetPresParam( m_hWnd ,PP_FOREGROUNDCOLOR @@ -100,24 +98,24 @@ bool wxStaticText::Create( ); SubclassWin(m_hWnd); - wxControl::SetFont(pParent->GetFont()); - SetSize( nX - ,nY - ,nWidth - ,nHeight - ); - return TRUE; + SetFont(*wxSMALL_FONT); + SetXComp(0); + SetYComp(0); + SetSize( nX, nY, nWidth, nHeight ); + + return true; } // end of wxStaticText::Create wxSize wxStaticText::DoGetBestSize() const { - wxString sText(wxGetWindowText(GetHWND())); - int nWidthTextMax = 0; - int nWidthLine = 0; - int nHeightTextTotal = 0; - int nHeightLineDefault = 0; - int nHeightLine = 0; - wxString sCurLine; + wxString sText(wxGetWindowText(GetHWND())); + int nWidthTextMax = 0; + int nWidthLine = 0; + int nHeightTextTotal = 0; + int nHeightLineDefault = 0; + int nHeightLine = 0; + wxString sCurLine; + bool bLastWasTilde = false; for (const wxChar *pc = sText; ; pc++) { @@ -158,6 +156,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; } } @@ -208,7 +229,8 @@ void wxStaticText::SetLabel( const wxString& rsLabel ) { - ::WinSetWindowText(GetHwnd(), rsLabel.c_str()); + wxString sLabel = ::wxPMTextToLabel(rsLabel); + ::WinSetWindowText(GetHwnd(), (PSZ)sLabel.c_str()); // // Adjust the size of the window to fit to the label unless autoresizing is @@ -216,9 +238,18 @@ void wxStaticText::SetLabel( // if (!(GetWindowStyle() & wxST_NO_AUTORESIZE)) { - DoSetSize(-1, -1, -1, -1, wxSIZE_AUTO_WIDTH | wxSIZE_AUTO_HEIGHT); + 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); } - DoSetSize(-1, -1, -1, -1, wxSIZE_AUTO_WIDTH | wxSIZE_AUTO_HEIGHT); } // end of wxStaticText::SetLabel MRESULT wxStaticText::OS2WindowProc( @@ -232,5 +263,3 @@ MRESULT wxStaticText::OS2WindowProc( ,lParam ); } // end of wxStaticText::OS2WindowProc - -