]> git.saurik.com Git - wxWidgets.git/blobdiff - src/msw/stattext.cpp
Added wxComboCtrl::SetHint(), GetHint()
[wxWidgets.git] / src / msw / stattext.cpp
index f0252e1fc4c679ecff7ff7a027b072b6dba53614..a2862c2179ed188b3fe52d2b4a022f72f4311609 100644 (file)
@@ -94,15 +94,24 @@ bool wxStaticText::Create(wxWindow *parent,
     if ( !CreateControl(parent, id, pos, size, style, wxDefaultValidator, name) )
         return false;
 
-    if ( !MSWCreateControl(wxT("STATIC"), label, pos, size) )
+    if ( !MSWCreateControl(wxT("STATIC"), wxEmptyString, pos, size) )
         return false;
 
-    return true;
-}
+    // we set the label here and not through MSWCreateControl() because we
+    // need to do many operation on it for ellipsization&markup support
+    SetLabel(label);
 
-wxBorder wxStaticText::GetDefaultBorder() const
-{
-    return wxBORDER_NONE;
+    // as we didn't pass the correct label to MSWCreateControl(), it didn't set
+    // the initial size correctly -- do it now
+    InvalidateBestSize();
+    SetInitialSize(size);
+
+    // NOTE: if the label contains ampersand characters which are interpreted as
+    //       accelerators, they will be rendered (at least on WinXP) only if the
+    //       static text is placed inside a window class which correctly handles
+    //       focusing by TAB traversal (e.g. wxPanel).
+
+    return true;
 }
 
 WXDWORD wxStaticText::MSWGetStyle(long style, WXDWORD *exstyle) const
@@ -120,6 +129,7 @@ WXDWORD wxStaticText::MSWGetStyle(long style, WXDWORD *exstyle) const
     else
         msStyle |= SS_LEFT;
 
+#ifdef SS_ENDELLIPSIS
     // this style is necessary to receive mouse events
     // Win NT and later have the SS_ENDELLIPSIS style which is useful to us:
     if (wxGetOsVersion() == wxOS_WINDOWS_NT)
@@ -130,15 +140,16 @@ WXDWORD wxStaticText::MSWGetStyle(long style, WXDWORD *exstyle) const
         if ( style & wxST_ELLIPSIZE_END )
             msStyle |= SS_ENDELLIPSIS;
     }
+#endif // SS_ENDELLIPSIS
 
     msStyle |= SS_NOTIFY;
 
     return msStyle;
 }
 
-wxSize wxStaticText::DoGetBestSize() const
+wxSize wxStaticText::DoGetBestClientSize() const
 {
-    wxClientDC dc(wx_const_cast(wxStaticText *, this));
+    wxClientDC dc(const_cast<wxStaticText *>(this));
     wxFont font(GetFont());
     if (!font.Ok())
         font = wxSystemSettings::GetFont(wxSYS_DEFAULT_GUI_FONT);
@@ -153,40 +164,7 @@ wxSize wxStaticText::DoGetBestSize() const
         widthTextMax += 2;
 #endif // __WXWINCE__
 
-    // border takes extra space
-    //
-    // TODO: this is probably not wxStaticText-specific and should be moved
-    wxCoord border;
-    switch ( GetBorder() )
-    {
-        case wxBORDER_STATIC:
-        case wxBORDER_SIMPLE:
-            border = 1;
-            break;
-
-        case wxBORDER_SUNKEN:
-            border = 2;
-            break;
-
-        case wxBORDER_RAISED:
-        case wxBORDER_DOUBLE:
-            border = 3;
-            break;
-
-        default:
-            wxFAIL_MSG( _T("unknown border style") );
-            // fall through
-
-        case wxBORDER_NONE:
-            border = 0;
-    }
-
-    widthTextMax += 2*border;
-    heightTextTotal += 2*border;
-
-    wxSize best(widthTextMax, heightTextTotal);
-    CacheBestSize(best);
-    return best;
+    return wxSize(widthTextMax, heightTextTotal);
 }
 
 void wxStaticText::DoSetSize(int x, int y, int w, int h, int sizeFlags)
@@ -194,6 +172,7 @@ void wxStaticText::DoSetSize(int x, int y, int w, int h, int sizeFlags)
     // note: we first need to set the size and _then_ call UpdateLabel
     wxStaticTextBase::DoSetSize(x, y, w, h, sizeFlags);
 
+#ifdef SS_ENDELLIPSIS
     // do we need to ellipsize the contents?
     long styleReal = ::GetWindowLong(GetHwnd(), GWL_STYLE);
     if ( !(styleReal & SS_ENDELLIPSIS) )
@@ -203,6 +182,7 @@ void wxStaticText::DoSetSize(int x, int y, int w, int h, int sizeFlags)
         UpdateLabel();
     }
     //else: we don't or the OS will do it for us
+#endif // SS_ENDELLIPSIS
 
     // we need to refresh the window after changing its size as the standard
     // control doesn't always update itself properly
@@ -211,13 +191,14 @@ void wxStaticText::DoSetSize(int x, int y, int w, int h, int sizeFlags)
 
 void wxStaticText::SetLabel(const wxString& label)
 {
+#ifdef SS_ENDELLIPSIS
     long styleReal = ::GetWindowLong(GetHwnd(), GWL_STYLE);
     if ( HasFlag(wxST_ELLIPSIZE_END) &&
           wxGetOsVersion() == wxOS_WINDOWS_NT )
     {
-        // adding SS_ENDELLIPSIS or SS_ENDELLIPSIS "disables" the correct 
-        // newline handling in static texts: the newlines in the labels are 
-        // shown as square. Thus we don't use it even on newer OS when 
+        // adding SS_ENDELLIPSIS or SS_ENDELLIPSIS "disables" the correct
+        // newline handling in static texts: the newlines in the labels are
+        // shown as square. Thus we don't use it even on newer OS when
         // the static label contains a newline.
         if ( label.Contains(wxT('\n')) )
             styleReal &= ~SS_ENDELLIPSIS;
@@ -231,15 +212,18 @@ void wxStaticText::SetLabel(const wxString& label)
         styleReal &= ~SS_ENDELLIPSIS;
         ::SetWindowLong(GetHwnd(), GWL_STYLE, styleReal);
     }
+#endif // SS_ENDELLIPSIS
 
     // this call will save the label in m_labelOrig and set it into this window
     // (through wxWindow::SetLabel)
     m_labelOrig = label;
 
-    if ((styleReal & SS_ENDELLIPSIS) == 0)
-        DoSetLabel(GetEllipsizedLabelWithoutMarkup());
-    else
+#ifdef SS_ENDELLIPSIS
+    if ( styleReal & SS_ENDELLIPSIS )
         DoSetLabel(RemoveMarkup(label));
+    else
+#endif // SS_ENDELLIPSIS
+        DoSetLabel(GetEllipsizedLabelWithoutMarkup());
 
     // adjust the size of the window to fit to the label unless autoresizing is
     // disabled