X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/b1f17bf00ff1480a50a657674b974c40da82eda1..fdfedfc07701a1db96b8217321b09bd19808ac24:/src/common/stattextcmn.cpp diff --git a/src/common/stattextcmn.cpp b/src/common/stattextcmn.cpp index f7b6a787dd..3c485e058c 100644 --- a/src/common/stattextcmn.cpp +++ b/src/common/stattextcmn.cpp @@ -26,26 +26,85 @@ #include "wx/private/stattext.h" +const wxChar *const wxMarkupEntities[][wxMARKUP_ENTITY_MAX] = +{ + // the entities handled by SetLabel() when wxST_MARKUP is used and their referenced string + + { wxT("&"), wxT("<"), wxT(">"), wxT("'"), wxT(""") }, + { wxT("&"), wxT("<"), wxT(">"), wxT("'"), wxT("\"") } +}; + +#if wxUSE_STATTEXT + #ifndef WX_PRECOMP + #include "wx/stattext.h" #include "wx/button.h" #include "wx/dcclient.h" #include "wx/intl.h" #include "wx/log.h" #include "wx/settings.h" - #include "wx/stattext.h" #include "wx/sizer.h" #include "wx/containr.h" #endif -const wxChar *wxMarkupEntities[][wxMARKUP_ENTITY_MAX] = -{ - // the entities handled by SetLabel() when wxST_MARKUP is used and their referenced string +#include "wx/textwrapper.h" - { wxT("&"), wxT("<"), wxT(">"), wxT("'"), wxT(""") }, - { wxT("&"), wxT("<"), wxT(">"), wxT("'"), wxT("\"") } -}; +extern WXDLLEXPORT_DATA(const char) wxStaticTextNameStr[] = "staticText"; + +// ---------------------------------------------------------------------------- +// XTI +// ---------------------------------------------------------------------------- + +wxDEFINE_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 ) + +wxIMPLEMENT_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, wxEMPTY_PARAMETER_VALUE, 0 /*flags*/, \ + wxT("Helpstring"), wxT("group")) // style +wxEND_PROPERTIES_TABLE() + +wxEMPTY_HANDLERS_TABLE(wxStaticText) + +wxCONSTRUCTOR_6( wxStaticText, wxWindow*, Parent, wxWindowID, Id, \ + wxString, Label, wxPoint, Position, wxSize, Size, long, WindowStyle ) -#if wxUSE_STATTEXT // ---------------------------------------------------------------------------- // wxTextWrapper @@ -68,7 +127,7 @@ void wxTextWrapper::Wrap(wxWindow *win, const wxString& text, int widthMax) lineStart = p; } - if ( p == text.end() || *p == _T('\n') ) + if ( p == text.end() || *p == wxT('\n') ) { DoOutputLine(line); @@ -77,7 +136,7 @@ void wxTextWrapper::Wrap(wxWindow *win, const wxString& text, int widthMax) } else // not EOL { - if ( *p == _T(' ') ) + if ( *p == wxT(' ') ) lastSpace = p; line += *p; @@ -126,7 +185,7 @@ protected: virtual void OnNewLine() { - m_text += _T('\n'); + m_text += wxT('\n'); } private: @@ -153,15 +212,28 @@ wxString wxStaticTextBase::GetLabelText() const return RemoveMnemonics(ret); } -/*static*/ +void wxStaticTextBase::SetLabelText(const wxString& text) +{ + wxString str = text; + + if (HasFlag(wxST_MARKUP)) + str = EscapeMarkup(str); // escapes markup and the & characters (which are also mnemonics) + else + str = EscapeMnemonics(text); // escape only the mnemonics + SetLabel(str); +} + +/* static */ wxString wxStaticTextBase::GetLabelText(const wxString& label) { - // remove markup wxString ret = RemoveMarkup(label); + // always remove the markup (this function is static + // and cannot check for wxST_MARKUP presence/absence) + return RemoveMnemonics(ret); } -/*static*/ +/* static */ wxString wxStaticTextBase::RemoveMarkup(const wxString& text) { // strip out of "text" the markup for platforms which don't support it natively @@ -270,7 +342,6 @@ wxString wxStaticTextBase::EscapeMarkup(const wxString& text) } - // ---------------------------------------------------------------------------- // wxStaticTextBase - generic implementation for wxST_ELLIPSIZE_* support // ---------------------------------------------------------------------------- @@ -285,7 +356,7 @@ void wxStaticTextBase::UpdateLabel() // we need to touch the "real" label (i.e. the text set inside the control, // using port-specific functions) instead of the string returned by GetLabel(). // - // In fact, we must be careful not to touch the original label passed to + // In fact, we must be careful not to touch the original label passed to // SetLabel() otherwise GetLabel() will behave in a strange way to the user // (e.g. returning a "Ver...ing" instead of "Very long string") ! if (newlabel == DoGetLabel()) @@ -293,6 +364,17 @@ void wxStaticTextBase::UpdateLabel() DoSetLabel(newlabel); } +wxString wxStaticTextBase::GetLabelWithoutMarkup() const +{ + wxString ret(m_labelOrig); + + if (HasFlag(wxST_MARKUP)) + ret = RemoveMarkup(ret); + + // unlike GetLabelText() we don't remove the mnemonics here! + return ret; +} + wxString wxStaticTextBase::GetEllipsizedLabelWithoutMarkup() const { // this function should be used only by ports which do not support @@ -312,8 +394,6 @@ wxString wxStaticTextBase::GetEllipsizedLabelWithoutMarkup() const return ret; } -#define wxELLIPSE_REPLACEMENT wxT("...") - wxString wxStaticTextBase::Ellipsize(const wxString& label) const { wxSize sz(GetSize()); @@ -323,169 +403,24 @@ wxString wxStaticTextBase::Ellipsize(const wxString& label) const return label; } - wxClientDC dc(wx_const_cast(wxStaticTextBase*, this)); + wxClientDC dc(const_cast(this)); dc.SetFont(GetFont()); - wxArrayInt charOffsets; - wxString ret; - - // these cannot be cached as they can change because of e.g. a font change - int replacementWidth = dc.GetTextExtent(wxELLIPSE_REPLACEMENT).GetWidth(); - int marginWidth = dc.GetCharWidth()*2; - - // handle correctly labels with newlines - wxString curLine; - wxSize reqsize; - size_t len; - for ( wxString::const_iterator pc = label.begin(); ; ++pc ) + wxEllipsizeMode mode; + if ( HasFlag(wxST_ELLIPSIZE_START) ) + mode = wxELLIPSIZE_START; + else if ( HasFlag(wxST_ELLIPSIZE_MIDDLE) ) + mode = wxELLIPSIZE_MIDDLE; + else if ( HasFlag(wxST_ELLIPSIZE_END) ) + mode = wxELLIPSIZE_END; + else { - if ( pc == label.end() || *pc == _T('\n') ) - { - len = curLine.length(); - if (len > 0 && - dc.GetPartialTextExtents(curLine, charOffsets)) - { - wxASSERT(charOffsets.GetCount() == len); - - size_t totalWidth = charOffsets.Last(); - if ( totalWidth > (size_t)sz.GetWidth() ) - { - // we need to ellipsize this row - int excessPixels = totalWidth - sz.GetWidth() + - replacementWidth + - marginWidth; // security margin (NEEDED!) - - // remove characters in excess - size_t initialChar, // index of first char to erase - nChars; // how many chars do we need to erase? - if (HasFlag(wxST_ELLIPSIZE_START)) - { - initialChar = 0; - for (nChars=0; - nChars < len && charOffsets[nChars] < excessPixels; - nChars++) - ; - } - else if (HasFlag(wxST_ELLIPSIZE_MIDDLE)) - { - // the start & end of the removed span of chars - initialChar = len/2; - size_t endChar = len/2; - - int removed = 0; - for ( ; removed < excessPixels; ) - { - if (initialChar > 0) - { - // width of the initialChar-th character - int width = charOffsets[initialChar] - - charOffsets[initialChar-1]; - - // remove the initialChar-th character - removed += width; - initialChar--; - } - - if (endChar < len - 1 && - removed < excessPixels) - { - // width of the (endChar+1)-th character - int width = charOffsets[endChar+1] - - charOffsets[endChar]; - - // remove the endChar-th character - removed += width; - endChar++; - } - - if (initialChar == 0 && endChar == len-1) - { - nChars = len+1; - break; - } - } - - initialChar++; - nChars = endChar - initialChar + 1; - } - else - { - wxASSERT(HasFlag(wxST_ELLIPSIZE_END)); - wxASSERT(len > 0); - - int maxWidth = totalWidth - excessPixels; - for (initialChar=0; - initialChar < len && - charOffsets[initialChar] < maxWidth; - initialChar++) - ; - - if (initialChar == 0) - { - nChars = len; - } - else - { - initialChar--; // go back one character - nChars = len - initialChar; - } - } + wxFAIL_MSG( "should only be called if have one of wxST_ELLIPSIZE_XXX" ); - if (nChars > len) - { - // need to remove the entire row! - curLine.clear(); - } - else - { - // erase nChars characters after initialChar (included): - curLine.erase(initialChar, nChars+1); - - // if there is space for the replacement dots, add them - if (sz.GetWidth() > replacementWidth) - curLine.insert(initialChar, wxELLIPSE_REPLACEMENT); - } - - // if everything was ok, we should have shortened this line - // enough to make it fit in sz.GetWidth(): - wxASSERT(dc.GetTextExtent(curLine).GetWidth() < sz.GetWidth()); - } - } - - // add this (ellipsized) row to the rest of the label - ret << curLine; - if ( pc == label.end() ) - { - return ret; - } - else - { - ret << *pc; - curLine.clear(); - } - } - // we need to remove mnemonics from the label for correct calculations - else if ( *pc == _T('&') ) - { - // pc+1 is safe: at worst we'll be at end() - wxString::const_iterator next = pc + 1; - if ( next != label.end() && *next == _T('&') ) - curLine += _T('&'); // && becomes & - //else: remove this ampersand - } - // we need also to expand tabs to properly calc their size - else if ( *pc == _T('\t') ) - { - // Windows natively expands the TABs to 6 spaces. Do the same: - curLine += wxT(" "); - } - else - { - curLine += *pc; - } + return label; } - //return ret; + return wxControl::Ellipsize(label, dc, mode, sz.GetWidth()); } #endif // wxUSE_STATTEXT