]> git.saurik.com Git - wxWidgets.git/blobdiff - src/os2/stattext.cpp
wxControl::SetLabel no longer strips out codes so do it here
[wxWidgets.git] / src / os2 / stattext.cpp
index cb8e29c0b35b11ff8e3820065b70db4bb817780a..a344877e2bde55a4b73ea80c68c36f6dcbdde21a 100644 (file)
@@ -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"
@@ -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
@@ -82,7 +85,7 @@ bool wxStaticText::Create(
 
     wxColour                        vColour;
 
-    vColour.Set(wxString("BLACK"));
+    vColour.Set(wxString(wxT("BLACK")));
 
     LONG                            lColor = (LONG)vColour.GetPixel();
 
@@ -91,9 +94,18 @@ bool wxStaticText::Create(
                       ,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());
+    SetFont(*wxSMALL_FONT);
+    SetXComp(0);
+    SetYComp(0);
     SetSize( nX
             ,nY
             ,nWidth
@@ -111,6 +123,7 @@ wxSize wxStaticText::DoGetBestSize() const
     int                             nHeightLineDefault = 0;
     int                             nHeightLine = 0;
     wxString                        sCurLine;
+    bool                            bLastWasTilde = FALSE;
 
     for (const wxChar *pc = sText; ; pc++)
     {
@@ -151,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;
         }
     }
@@ -159,6 +195,27 @@ wxSize wxStaticText::DoGetBestSize() const
                  );
 } // end of wxStaticText::DoGetBestSize
 
+void wxStaticText::DoSetSize(
+  int                               nX
+, int                               nY
+, int                               nWidth
+, int                               nHeight
+, int                               nSizeFlags
+)
+{
+    //
+    // We need to refresh the window after changing its size as the standard
+    // control doesn't always update itself properly.
+    //
+    wxStaticTextBase::DoSetSize( nX
+                                ,nY
+                                ,nWidth
+                                ,nHeight
+                                ,nSizeFlags
+                               );
+    Refresh();
+} // end of wxStaticText::DoSetSize
+
 bool wxStaticText::SetFont(
   const wxFont&                     rFont
 )
@@ -180,7 +237,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
@@ -188,9 +246,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(
@@ -204,5 +271,3 @@ MRESULT wxStaticText::OS2WindowProc(
                                    ,lParam
                                   );
 } // end of wxStaticText::OS2WindowProc
-
-