X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/7993e67c758d0321c3bf2a6cab2ee16c42c73eab..05e0b047d879cdbfade7f2ab346c0acdf3e29f96:/src/os2/stattext.cpp diff --git a/src/os2/stattext.cpp b/src/os2/stattext.cpp index fbeefc707f..1ee58a4b8c 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,34 @@ 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; + m_hWnd = (WXHWND)::WinCreateWindow( (HWND)GetHwndOf(pParent) // Parent window handle ,WC_STATIC // Window class - ,(PSZ)rsLabel.c_str() // Initial Text + ,NULL // Initial Text ,(ULONG)lSstyle // Style flags ,0L, 0L, 0L, 0L // Origin -- 0 size ,(HWND)GetHwndOf(pParent) // owner window handle (same as parent @@ -78,13 +78,9 @@ bool wxStaticText::Create( ,NULL // no Presentation parameters ); - wxCHECK_MSG(m_hWnd, FALSE, wxT("Failed to create static ctrl")); + wxCHECK_MSG(m_hWnd, false, wxT("Failed to create static ctrl")); - wxColour vColour; - - vColour.Set(wxString("BLACK")); - - LONG lColor = (LONG)vColour.GetPixel(); + LONG lColor = (LONG)wxBLACK->GetPixel(); ::WinSetPresParam( m_hWnd ,PP_FOREGROUNDCOLOR @@ -100,24 +96,26 @@ 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 ); + + SetLabel(rsLabel); + + 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(GetLabel()); + 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; } } @@ -184,6 +205,10 @@ void wxStaticText::DoSetSize( ,nHeight ,nSizeFlags ); + + // eventually update label (if ellipsizing is on): + UpdateLabel(); + Refresh(); } // end of wxStaticText::DoSetSize @@ -208,17 +233,31 @@ void wxStaticText::SetLabel( const wxString& rsLabel ) { - ::WinSetWindowText(GetHwnd(), rsLabel.c_str()); + m_labelOrig = rsLabel; // save original label + + // OS/2 does not support neither ellipsize nor markup in static text: + DoSetLabel(rsLabel); + DoSetLabel(GetEllipsizedLabelWithoutMarkup()); // // Adjust the size of the window to fit to the label unless autoresizing is // disabled // - if (!(GetWindowStyle() & wxST_NO_AUTORESIZE)) + if (!(GetWindowStyle() & wxST_NO_AUTORESIZE) && + !IsEllipsized()) { - 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( @@ -234,3 +273,16 @@ MRESULT wxStaticText::OS2WindowProc( } // end of wxStaticText::OS2WindowProc +// for wxST_ELLIPSIZE_* support: + +void wxStaticText::DoSetLabel(const wxString& str) +{ + wxString sLabel = ::wxPMTextToLabel(str); + ::WinSetWindowText(GetHwnd(), sLabel.c_str()); +} + +wxString wxStaticText::DoGetLabel() const +{ + return wxGetWindowText(GetHwnd()); +} +