X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/1fee6e257780f17b4d53b48aa0e7d2ac69664595..538f4dd82b7d37293a45516da0036b453f631f9f:/src/common/textcmn.cpp diff --git a/src/common/textcmn.cpp b/src/common/textcmn.cpp index c69ba3aea1..473de1178f 100644 --- a/src/common/textcmn.cpp +++ b/src/common/textcmn.cpp @@ -49,10 +49,10 @@ IMPLEMENT_DYNAMIC_CLASS(wxTextUrlEvent, wxCommandEvent) -DEFINE_EVENT_TYPE(wxEVT_COMMAND_TEXT_UPDATED) -DEFINE_EVENT_TYPE(wxEVT_COMMAND_TEXT_ENTER) -DEFINE_EVENT_TYPE(wxEVT_COMMAND_TEXT_URL) -DEFINE_EVENT_TYPE(wxEVT_COMMAND_TEXT_MAXLEN) +wxDEFINE_EVENT( wxEVT_COMMAND_TEXT_UPDATED, wxCommandEvent ); +wxDEFINE_EVENT( wxEVT_COMMAND_TEXT_ENTER, wxCommandEvent ); +wxDEFINE_EVENT( wxEVT_COMMAND_TEXT_URL, wxTextUrlEvent ); +wxDEFINE_EVENT( wxEVT_COMMAND_TEXT_MAXLEN, wxCommandEvent ); IMPLEMENT_ABSTRACT_CLASS(wxTextCtrlBase, wxControl) @@ -85,10 +85,11 @@ void wxTextAttr::Init() m_rightIndent = 0; m_fontSize = 12; - m_fontStyle = wxNORMAL; - m_fontWeight = wxNORMAL; + m_fontStyle = wxFONTSTYLE_NORMAL; + m_fontWeight = wxFONTWEIGHT_NORMAL; m_fontUnderlined = false; m_fontEncoding = wxFONTENCODING_DEFAULT; + m_fontFamily = wxFONTFAMILY_DEFAULT; m_paragraphSpacingAfter = 0; m_paragraphSpacingBefore = 0; @@ -118,6 +119,7 @@ void wxTextAttr::Copy(const wxTextAttr& attr) m_fontUnderlined = attr.m_fontUnderlined; m_fontFaceName = attr.m_fontFaceName; m_fontEncoding = attr.m_fontEncoding; + m_fontFamily = attr.m_fontFamily; m_textEffects = attr.m_textEffects; m_textEffectFlags = attr.m_textEffectFlags; @@ -181,13 +183,16 @@ bool wxTextAttr::operator== (const wxTextAttr& attr) const GetFontUnderlined() == attr.GetFontUnderlined() && GetFontFaceName() == attr.GetFontFaceName() && GetFontEncoding() == attr.GetFontEncoding() && + GetFontFamily() == attr.GetFontFamily() && GetURL() == attr.GetURL(); } -// Partial equality test taking flags into account -bool wxTextAttr::EqPartial(const wxTextAttr& attr, int flags) const +// Partial equality test. Only returns false if an attribute doesn't match. +bool wxTextAttr::EqPartial(const wxTextAttr& attr) const { + int flags = attr.GetFlags(); + if ((flags & wxTEXT_ATTR_TEXT_COLOUR) && GetTextColour() != attr.GetTextColour()) return false; @@ -218,6 +223,10 @@ bool wxTextAttr::EqPartial(const wxTextAttr& attr, int flags) const GetFontEncoding() != attr.GetFontEncoding()) return false; + if ((flags & wxTEXT_ATTR_FONT_FAMILY) && + GetFontFamily() != attr.GetFontFamily()) + return false; + if ((flags & wxTEXT_ATTR_URL) && GetURL() != attr.GetURL()) return false; @@ -326,10 +335,11 @@ wxFont wxTextAttr::GetFont() const if (HasFontEncoding()) encoding = GetFontEncoding(); - wxFont font(fontSize, wxDEFAULT, fontStyle, fontWeight, underlined, fontFaceName, encoding); -#ifdef __WXMAC__ - font.SetNoAntiAliasing(true); -#endif + wxFontFamily fontFamily = wxFONTFAMILY_DEFAULT; + if (HasFontFamily()) + fontFamily = GetFontFamily(); + + wxFont font(fontSize, fontFamily, fontStyle, fontWeight, underlined, fontFaceName, encoding); return font; } @@ -357,11 +367,35 @@ bool wxTextAttr::GetFontAttributes(const wxFont& font, int flags) if (flags & wxTEXT_ATTR_FONT_ENCODING) m_fontEncoding = font.GetEncoding(); + if (flags & wxTEXT_ATTR_FONT_FAMILY) + { + // wxFont might not know its family, avoid setting m_fontFamily to an + // invalid value and rather pretend that we don't have any font family + // information at all in this case + const wxFontFamily fontFamily = font.GetFamily(); + if ( fontFamily == wxFONTFAMILY_UNKNOWN ) + flags &= ~wxTEXT_ATTR_FONT_FAMILY; + else + m_fontFamily = fontFamily; + } + m_flags |= flags; return true; } +// Resets bits in destination so new attributes aren't merged with mutually exclusive ones +static bool wxResetIncompatibleBits(const int mask, const int srcFlags, int& destFlags, int& destBits) +{ + if ((srcFlags & mask) && (destFlags & mask)) + { + destBits &= ~mask; + destFlags &= ~mask; + } + + return true; +} + bool wxTextAttr::Apply(const wxTextAttr& style, const wxTextAttr* compareWith) { wxTextAttr& destStyle = (*this); @@ -402,6 +436,12 @@ bool wxTextAttr::Apply(const wxTextAttr& style, const wxTextAttr* compareWith) destStyle.SetFontEncoding(style.GetFontEncoding()); } + if (style.HasFontFamily()) + { + if (!(compareWith && compareWith->HasFontFamily() && compareWith->GetFontFamily() == style.GetFontFamily())) + destStyle.SetFontFamily(style.GetFontFamily()); + } + if (style.GetTextColour().Ok() && style.HasTextColour()) { if (!(compareWith && compareWith->HasTextColour() && compareWith->GetTextColour() == style.GetTextColour())) @@ -524,6 +564,11 @@ bool wxTextAttr::Apply(const wxTextAttr& style, const wxTextAttr* compareWith) int srcBits = style.GetTextEffects(); int srcFlags = style.GetTextEffectFlags(); + // Reset incompatible bits in the destination + wxResetIncompatibleBits((wxTEXT_ATTR_EFFECT_SUPERSCRIPT|wxTEXT_ATTR_EFFECT_SUBSCRIPT), srcFlags, destFlags, destBits); + wxResetIncompatibleBits((wxTEXT_ATTR_EFFECT_CAPITALS|wxTEXT_ATTR_EFFECT_SMALL_CAPITALS), srcFlags, destFlags, destBits); + wxResetIncompatibleBits((wxTEXT_ATTR_EFFECT_STRIKETHROUGH|wxTEXT_ATTR_EFFECT_DOUBLE_STRIKETHROUGH), srcFlags, destFlags, destBits); + CombineBitlists(destBits, srcBits, destFlags, srcFlags); destStyle.SetTextEffects(destBits); @@ -702,7 +747,7 @@ bool wxTextCtrlBase::SetDefaultStyle(const wxTextAttr& style) // file IO functions // ---------------------------------------------------------------------------- -bool wxTextCtrlBase::DoLoadFile(const wxString& filename, int WXUNUSED(fileType)) +bool wxTextAreaBase::DoLoadFile(const wxString& filename, int WXUNUSED(fileType)) { #if wxUSE_FFILE wxFFile file(filename); @@ -713,18 +758,34 @@ bool wxTextCtrlBase::DoLoadFile(const wxString& filename, int WXUNUSED(fileType) { SetValue(text); - DiscardEdits(); - - m_filename = filename; - return true; } } +#endif // wxUSE_FFILE + return false; +} + +bool wxTextCtrlBase::DoLoadFile(const wxString& filename, int fileType) +{ + if ( wxTextAreaBase::DoLoadFile(filename, fileType) ) + { + DiscardEdits(); + m_filename = filename; + return true; + } wxLogError(_("File couldn't be loaded.")); -#endif // wxUSE_FFILE + return false; +} +bool wxTextAreaBase::DoSaveFile(const wxString& filename, int WXUNUSED(fileType)) +{ +#if wxUSE_FFILE + wxFFile file(filename, wxT("w")); + return file.IsOpened() && file.Write(GetValue(), *wxConvCurrent); +#else return false; +#endif // wxUSE_FFILE } bool wxTextAreaBase::SaveFile(const wxString& filename, int fileType) @@ -741,11 +802,9 @@ bool wxTextAreaBase::SaveFile(const wxString& filename, int fileType) return DoSaveFile(filenameToUse, fileType); } -bool wxTextCtrlBase::DoSaveFile(const wxString& filename, int WXUNUSED(fileType)) +bool wxTextCtrlBase::DoSaveFile(const wxString& filename, int fileType) { -#if wxUSE_FFILE - wxFFile file(filename, _T("w")); - if ( file.IsOpened() && file.Write(GetValue()) ) + if ( wxTextAreaBase::DoSaveFile(filename, fileType) ) { // if it worked, save for future calls m_filename = filename; @@ -755,10 +814,6 @@ bool wxTextCtrlBase::DoSaveFile(const wxString& filename, int WXUNUSED(fileType) return true; } -#endif // wxUSE_FFILE - - wxLogError(_("The text couldn't be saved.")); - return false; } @@ -772,41 +827,19 @@ wxTextCtrl& wxTextCtrlBase::operator<<(const wxString& s) return *TEXTCTRL(this); } -wxTextCtrl& wxTextCtrlBase::operator<<(float f) -{ - wxString str; - str.Printf(wxT("%.2f"), f); - AppendText(str); - return *TEXTCTRL(this); -} - wxTextCtrl& wxTextCtrlBase::operator<<(double d) { - wxString str; - str.Printf(wxT("%.2f"), d); - AppendText(str); - return *TEXTCTRL(this); + return *this << wxString::Format("%.2f", d); } wxTextCtrl& wxTextCtrlBase::operator<<(int i) { - wxString str; - str.Printf(wxT("%d"), i); - AppendText(str); - return *TEXTCTRL(this); + return *this << wxString::Format("%d", i); } -wxTextCtrl& wxTextCtrlBase::operator<<(long i) +wxTextCtrl& wxTextCtrlBase::operator<<(long l) { - wxString str; - str.Printf(wxT("%ld"), i); - AppendText(str); - return *TEXTCTRL(this); -} - -wxTextCtrl& wxTextCtrlBase::operator<<(const wxChar c) -{ - return operator<<(wxString(c)); + return *this << wxString::Format("%ld", l); } // ---------------------------------------------------------------------------- @@ -847,32 +880,32 @@ bool wxTextCtrlBase::EmulateKeyPress(const wxKeyEvent& event) case WXK_NUMPAD7: case WXK_NUMPAD8: case WXK_NUMPAD9: - ch = (wxChar)(_T('0') + keycode - WXK_NUMPAD0); + ch = (wxChar)(wxT('0') + keycode - WXK_NUMPAD0); break; case WXK_MULTIPLY: case WXK_NUMPAD_MULTIPLY: - ch = _T('*'); + ch = wxT('*'); break; case WXK_ADD: case WXK_NUMPAD_ADD: - ch = _T('+'); + ch = wxT('+'); break; case WXK_SUBTRACT: case WXK_NUMPAD_SUBTRACT: - ch = _T('-'); + ch = wxT('-'); break; case WXK_DECIMAL: case WXK_NUMPAD_DECIMAL: - ch = _T('.'); + ch = wxT('.'); break; case WXK_DIVIDE: case WXK_NUMPAD_DIVIDE: - ch = _T('/'); + ch = wxT('/'); break; case WXK_DELETE: @@ -914,7 +947,7 @@ bool wxTextCtrlBase::EmulateKeyPress(const wxKeyEvent& event) } else { - ch = _T('\0'); + ch = wxT('\0'); } } @@ -975,30 +1008,11 @@ wxTextAreaBase::HitTest(const wxPoint& WXUNUSED(pt), long * WXUNUSED(pos)) const return wxTE_HT_UNKNOWN; } -// ---------------------------------------------------------------------------- -// events -// ---------------------------------------------------------------------------- - -/* static */ -bool wxTextCtrlBase::SendTextUpdatedEvent(wxWindow *win) -{ - wxCommandEvent event(wxEVT_COMMAND_TEXT_UPDATED, win->GetId()); - - // do not do this as it could be very inefficient if the text control - // contains a lot of text and we're not using ref-counted wxString - // implementation -- instead, event.GetString() will query the control for - // its current text if needed - //event.SetString(win->GetValue()); - - event.SetEventObject(win); - return win->GetEventHandler()->ProcessEvent(event); -} - #else // !wxUSE_TEXTCTRL // define this one even if !wxUSE_TEXTCTRL because it is also used by other // controls (wxComboBox and wxSpinCtrl) -DEFINE_EVENT_TYPE(wxEVT_COMMAND_TEXT_UPDATED) +wxDEFINE_EVENT( wxEVT_COMMAND_TEXT_UPDATED, wxCommandEvent ); #endif // wxUSE_TEXTCTRL/!wxUSE_TEXTCTRL