+    for (const wxChar *pc = sText; ; pc++)
+    {
+        if ( *pc == wxT('\n') || *pc == wxT('\0') )
+        {
+            if (!sCurLine )
+            {
+                //
+                // We can't use GetTextExtent - it will return 0 for both width
+                // and height and an empty line should count in height
+                // calculation
+                //
+                if (!nHeightLineDefault)
+                    nHeightLineDefault = nHeightLine;
+                if (!nHeightLineDefault)
+                    GetTextExtent(_T("W"), NULL, &nHeightLineDefault);
+                nHeightTextTotal += nHeightLineDefault;
+            }
+            else
+            {
+                GetTextExtent( sCurLine
+                              ,&nWidthLine
+                              ,&nHeightLine
+                             );
+                if (nWidthLine > nWidthTextMax)
+                    nWidthTextMax = nWidthLine;
+                nHeightTextTotal += nHeightLine;
+            }
+
+            if ( *pc == wxT('\n') )
+            {
+                sCurLine.Empty();
+            }
+            else
+            {
+               break;
+            }
+        }
+        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 ampersand
+            //
+            if (*pc == _T('&'))
+            {
+                if (!bLastWasAmpersand)
+                {
+                    bLastWasAmpersand = TRUE;
+
+                    //
+                    // Skip the statement adding pc to curLine below
+                    //
+                    continue;
+                }
+
+                //
+                // It is a literal ampersand
+                //
+                bLastWasAmpersand = FALSE;
+            }
+            sCurLine += *pc;
+        }
+    }
+    return wxSize( nWidthTextMax
+                  ,nHeightTextTotal
+                 );
+} // 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
+)