X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/39bc0347fda3505f7fb43447f21efd84b9e00b3c..b404a8f3b072129c107c6d9a5e0f6f53cd34807b:/src/msw/stattext.cpp?ds=inline diff --git a/src/msw/stattext.cpp b/src/msw/stattext.cpp index f0252e1fc4..f7ced7f939 100644 --- a/src/msw/stattext.cpp +++ b/src/msw/stattext.cpp @@ -30,59 +30,6 @@ #include "wx/msw/private.h" -#if wxUSE_EXTENDED_RTTI -WX_DEFINE_FLAGS( wxStaticTextStyle ) - -wxBEGIN_FLAGS( wxStaticTextStyle ) - // new style border flags, we put them first to - // use them for streaming out - wxFLAGS_MEMBER(wxBORDER_SIMPLE) - wxFLAGS_MEMBER(wxBORDER_SUNKEN) - wxFLAGS_MEMBER(wxBORDER_DOUBLE) - wxFLAGS_MEMBER(wxBORDER_RAISED) - wxFLAGS_MEMBER(wxBORDER_STATIC) - wxFLAGS_MEMBER(wxBORDER_NONE) - - // old style border flags - wxFLAGS_MEMBER(wxSIMPLE_BORDER) - wxFLAGS_MEMBER(wxSUNKEN_BORDER) - wxFLAGS_MEMBER(wxDOUBLE_BORDER) - wxFLAGS_MEMBER(wxRAISED_BORDER) - wxFLAGS_MEMBER(wxSTATIC_BORDER) - wxFLAGS_MEMBER(wxBORDER) - - // standard window styles - wxFLAGS_MEMBER(wxTAB_TRAVERSAL) - wxFLAGS_MEMBER(wxCLIP_CHILDREN) - wxFLAGS_MEMBER(wxTRANSPARENT_WINDOW) - wxFLAGS_MEMBER(wxWANTS_CHARS) - wxFLAGS_MEMBER(wxFULL_REPAINT_ON_RESIZE) - wxFLAGS_MEMBER(wxALWAYS_SHOW_SB ) - wxFLAGS_MEMBER(wxVSCROLL) - wxFLAGS_MEMBER(wxHSCROLL) - - wxFLAGS_MEMBER(wxST_NO_AUTORESIZE) - wxFLAGS_MEMBER(wxALIGN_LEFT) - wxFLAGS_MEMBER(wxALIGN_RIGHT) - wxFLAGS_MEMBER(wxALIGN_CENTRE) - -wxEND_FLAGS( wxStaticTextStyle ) - -IMPLEMENT_DYNAMIC_CLASS_XTI(wxStaticText, wxControl,"wx/stattext.h") - -wxBEGIN_PROPERTIES_TABLE(wxStaticText) - wxPROPERTY( Label,wxString, SetLabel, GetLabel, wxString() , 0 /*flags*/ , wxT("Helpstring") , wxT("group")) - wxPROPERTY_FLAGS( WindowStyle , wxStaticTextStyle , long , SetWindowStyleFlag , GetWindowStyleFlag , EMPTY_MACROVALUE, 0 /*flags*/ , wxT("Helpstring") , wxT("group")) // style -wxEND_PROPERTIES_TABLE() - -wxBEGIN_HANDLERS_TABLE(wxStaticText) -wxEND_HANDLERS_TABLE() - -wxCONSTRUCTOR_6( wxStaticText , wxWindow* , Parent , wxWindowID , Id , wxString , Label , wxPoint , Position , wxSize , Size , long , WindowStyle ) -#else -IMPLEMENT_DYNAMIC_CLASS(wxStaticText, wxControl) -#endif - bool wxStaticText::Create(wxWindow *parent, wxWindowID id, const wxString& label, @@ -94,15 +41,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 +76,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,17 +87,18 @@ 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(this)); wxFont font(GetFont()); - if (!font.Ok()) + if (!font.IsOk()) font = wxSystemSettings::GetFont(wxSYS_DEFAULT_GUI_FONT); dc.SetFont(font); @@ -153,40 +111,26 @@ wxSize wxStaticText::DoGetBestSize() const widthTextMax += 2; #endif // __WXWINCE__ - // border takes extra space + // It looks like the static control needs "slightly" more vertical space + // than the character height and while the text isn't actually truncated if + // we use just the minimal height, it is positioned differently than when + // the control has enough space and this result in the text in edit and + // static controls not being aligned when the controls themselves are. As + // this is something you really should be able to count on, increase the + // space allocated for the control so that the base lines do align + // correctly. Notice that while the above is true at least for the single + // line controls, there doesn't seem to do any harm to allocate two extra + // pixels in multi-line case neither so do it always for consistency. // - // 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; + // I still have no idea why exactly is this needed nor why should we use 2 + // and not something else. This seems to work in all the configurations + // though (small/large fonts, different OS versions, ...) so just hard code + // it for now. If we need something better later it might be worth looking + // at the height of the text control returned by ::GetComboBoxInfo() as it + // seems to be the "minimal acceptable" height. + heightTextTotal += 2; + + return wxSize(widthTextMax, heightTextTotal); } void wxStaticText::DoSetSize(int x, int y, int w, int h, int sizeFlags) @@ -194,6 +138,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 +148,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 +157,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 +178,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) + // save the label in m_labelOrig with both the markup (if any) and + // the mnemonics characters (if any) m_labelOrig = label; - if ((styleReal & SS_ENDELLIPSIS) == 0) - DoSetLabel(GetEllipsizedLabelWithoutMarkup()); +#ifdef SS_ENDELLIPSIS + if ( styleReal & SS_ENDELLIPSIS ) + DoSetLabel(GetLabel()); else - DoSetLabel(RemoveMarkup(label)); +#endif // SS_ENDELLIPSIS + DoSetLabel(GetEllipsizedLabel()); // adjust the size of the window to fit to the label unless autoresizing is // disabled