]> git.saurik.com Git - wxWidgets.git/blobdiff - src/os2/stattext.cpp
Separate out constructors / destructors, add support for enums and include files...
[wxWidgets.git] / src / os2 / stattext.cpp
index d5cfd5c9e4a629b482f66992ac71adbdc0e0e10a..1ee58a4b8c867543dd157eef1d5b6ebd2b8f30c5 100644 (file)
@@ -1,5 +1,5 @@
 /////////////////////////////////////////////////////////////////////////////
-// Name:        stattext.cpp
+// Name:        src/os2/stattext.cpp
 // Purpose:     wxStaticText
 // Author:      David Webster
 // Modified by:
@@ -9,35 +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/scrolwin.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 <stdio.h>
 
 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)
@@ -46,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
@@ -79,13 +78,9 @@ bool wxStaticText::Create(
                                        ,NULL                     // no Presentation parameters
                                       );
 
-    wxCHECK_MSG(m_hWnd, FALSE, wxT("Failed to create static ctrl"));
-
-    wxColour                        vColour;
-
-    vColour.Set(wxString("BLACK"));
+    wxCHECK_MSG(m_hWnd, false, wxT("Failed to create static ctrl"));
 
-    LONG                            lColor = (LONG)vColour.GetPixel();
+    LONG lColor = (LONG)wxBLACK->GetPixel();
 
     ::WinSetPresParam( m_hWnd
                       ,PP_FOREGROUNDCOLOR
@@ -104,24 +99,23 @@ bool wxStaticText::Create(
     SetFont(*wxSMALL_FONT);
     SetXComp(0);
     SetYComp(0);
-    SetSize( nX
-            ,nY
-            ,nWidth
-            ,nHeight
-           );
-    return TRUE;
+    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;
-    bool                            bLastWasAmpersand = FALSE;
+    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++)
     {
@@ -163,16 +157,16 @@ wxSize wxStaticText::DoGetBestSize() const
         else
         {
             //
-            // We shouldn't take into account the '&' which just introduces the
+            // 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
+            // when it is preceded by another '~' in which case it stands for a
+            // literal tilde
             //
-            if (*pc == _T('&'))
+            if (*pc == _T('~'))
             {
-                if (!bLastWasAmpersand)
+                if (!bLastWasTilde)
                 {
-                    bLastWasAmpersand = TRUE;
+                    bLastWasTilde = true;
 
                     //
                     // Skip the statement adding pc to curLine below
@@ -181,9 +175,9 @@ wxSize wxStaticText::DoGetBestSize() const
                 }
 
                 //
-                // It is a literal ampersand
+                // It is a literal tilde
                 //
-                bLastWasAmpersand = FALSE;
+                bLastWasTilde = false;
             }
             sCurLine += *pc;
         }
@@ -211,6 +205,10 @@ void wxStaticText::DoSetSize(
                                 ,nHeight
                                 ,nSizeFlags
                                );
+
+    // eventually update label (if ellipsizing is on):
+    UpdateLabel();
+
     Refresh();
 } // end of wxStaticText::DoSetSize
 
@@ -235,13 +233,18 @@ 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())
     {
         wxCoord                     vX;
         wxCoord                     vY;
@@ -268,3 +271,18 @@ MRESULT wxStaticText::OS2WindowProc(
                                    ,lParam
                                   );
 } // 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());
+}
+