+wxDEFINE_FLAGS( wxTextCtrlStyle )
+wxBEGIN_FLAGS( wxTextCtrlStyle )
+// 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(wxTE_PROCESS_ENTER)
+wxFLAGS_MEMBER(wxTE_PROCESS_TAB)
+wxFLAGS_MEMBER(wxTE_MULTILINE)
+wxFLAGS_MEMBER(wxTE_PASSWORD)
+wxFLAGS_MEMBER(wxTE_READONLY)
+wxFLAGS_MEMBER(wxHSCROLL)
+wxFLAGS_MEMBER(wxTE_RICH)
+wxFLAGS_MEMBER(wxTE_RICH2)
+wxFLAGS_MEMBER(wxTE_AUTO_URL)
+wxFLAGS_MEMBER(wxTE_NOHIDESEL)
+wxFLAGS_MEMBER(wxTE_LEFT)
+wxFLAGS_MEMBER(wxTE_CENTRE)
+wxFLAGS_MEMBER(wxTE_RIGHT)
+wxFLAGS_MEMBER(wxTE_DONTWRAP)
+wxFLAGS_MEMBER(wxTE_CHARWRAP)
+wxFLAGS_MEMBER(wxTE_WORDWRAP)
+wxEND_FLAGS( wxTextCtrlStyle )
+
+wxIMPLEMENT_DYNAMIC_CLASS_XTI(wxTextCtrl, wxControl, "wx/textctrl.h")
+
+wxBEGIN_PROPERTIES_TABLE(wxTextCtrl)
+wxEVENT_PROPERTY( TextUpdated, wxEVT_COMMAND_TEXT_UPDATED, wxCommandEvent )
+wxEVENT_PROPERTY( TextEnter, wxEVT_COMMAND_TEXT_ENTER, wxCommandEvent )
+
+wxPROPERTY( Font, wxFont, SetFont, GetFont , wxEMPTY_PARAMETER_VALUE, \
+ 0 /*flags*/, wxT("Helpstring"), wxT("group") )
+wxPROPERTY( Value, wxString, SetValue, GetValue, wxString(), \
+ 0 /*flags*/, wxT("Helpstring"), wxT("group"))
+
+wxPROPERTY_FLAGS( WindowStyle, wxTextCtrlStyle, long, SetWindowStyleFlag, \
+ GetWindowStyleFlag, wxEMPTY_PARAMETER_VALUE, 0 /*flags*/, \
+ wxT("Helpstring"), wxT("group")) // style
+wxEND_PROPERTIES_TABLE()
+
+wxEMPTY_HANDLERS_TABLE(wxTextCtrl)
+
+wxCONSTRUCTOR_6( wxTextCtrl, wxWindow*, Parent, wxWindowID, Id, \
+ wxString, Value, wxPoint, Position, wxSize, Size, \
+ long, WindowStyle)
+
+
+IMPLEMENT_DYNAMIC_CLASS(wxTextUrlEvent, wxCommandEvent)
+
+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)
+
+// ============================================================================
+// wxTextAttr implementation
+// ============================================================================
+
+wxTextAttr::wxTextAttr(const wxColour& colText,
+ const wxColour& colBack,
+ const wxFont& font,
+ wxTextAttrAlignment alignment): m_textAlignment(alignment), m_colText(colText), m_colBack(colBack)
+{
+ Init();
+
+ if (m_colText.IsOk()) m_flags |= wxTEXT_ATTR_TEXT_COLOUR;
+ if (m_colBack.IsOk()) m_flags |= wxTEXT_ATTR_BACKGROUND_COLOUR;
+ if (alignment != wxTEXT_ALIGNMENT_DEFAULT)
+ m_flags |= wxTEXT_ATTR_ALIGNMENT;
+
+ GetFontAttributes(font);
+}
+
+// Initialisation
+void wxTextAttr::Init()
+{
+ m_textAlignment = wxTEXT_ALIGNMENT_DEFAULT;
+ m_flags = 0;
+ m_leftIndent = 0;
+ m_leftSubIndent = 0;
+ m_rightIndent = 0;
+
+ m_fontSize = 12;
+ 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;
+ m_lineSpacing = 0;
+ m_bulletStyle = wxTEXT_ATTR_BULLET_STYLE_NONE;
+ m_textEffects = wxTEXT_ATTR_EFFECT_NONE;
+ m_textEffectFlags = wxTEXT_ATTR_EFFECT_NONE;
+ m_outlineLevel = 0;
+ m_bulletNumber = 0;
+}
+
+// Copy
+void wxTextAttr::Copy(const wxTextAttr& attr)
+{
+ m_colText = attr.m_colText;
+ m_colBack = attr.m_colBack;
+ m_textAlignment = attr.m_textAlignment;
+ m_leftIndent = attr.m_leftIndent;
+ m_leftSubIndent = attr.m_leftSubIndent;
+ m_rightIndent = attr.m_rightIndent;
+ m_tabs = attr.m_tabs;
+ m_flags = attr.m_flags;
+
+ m_fontSize = attr.m_fontSize;
+ m_fontStyle = attr.m_fontStyle;
+ m_fontWeight = attr.m_fontWeight;
+ 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;
+
+ m_paragraphSpacingAfter = attr.m_paragraphSpacingAfter;
+ m_paragraphSpacingBefore = attr.m_paragraphSpacingBefore;
+ m_lineSpacing = attr.m_lineSpacing;
+ m_characterStyleName = attr.m_characterStyleName;
+ m_paragraphStyleName = attr.m_paragraphStyleName;
+ m_listStyleName = attr.m_listStyleName;
+ m_bulletStyle = attr.m_bulletStyle;
+ m_bulletNumber = attr.m_bulletNumber;
+ m_bulletText = attr.m_bulletText;
+ m_bulletFont = attr.m_bulletFont;
+ m_bulletName = attr.m_bulletName;
+ m_outlineLevel = attr.m_outlineLevel;
+
+ m_urlTarget = attr.m_urlTarget;
+}
+
+// operators
+void wxTextAttr::operator= (const wxTextAttr& attr)
+{
+ Copy(attr);
+}
+
+// Equality test
+bool wxTextAttr::operator== (const wxTextAttr& attr) const
+{
+ return GetFlags() == attr.GetFlags() &&
+
+ GetTextColour() == attr.GetTextColour() &&
+ GetBackgroundColour() == attr.GetBackgroundColour() &&
+
+ GetAlignment() == attr.GetAlignment() &&
+ GetLeftIndent() == attr.GetLeftIndent() &&
+ GetLeftSubIndent() == attr.GetLeftSubIndent() &&
+ GetRightIndent() == attr.GetRightIndent() &&
+ TabsEq(GetTabs(), attr.GetTabs()) &&
+
+ GetParagraphSpacingAfter() == attr.GetParagraphSpacingAfter() &&
+ GetParagraphSpacingBefore() == attr.GetParagraphSpacingBefore() &&
+ GetLineSpacing() == attr.GetLineSpacing() &&
+ GetCharacterStyleName() == attr.GetCharacterStyleName() &&
+ GetParagraphStyleName() == attr.GetParagraphStyleName() &&
+ GetListStyleName() == attr.GetListStyleName() &&
+
+ GetBulletStyle() == attr.GetBulletStyle() &&
+ GetBulletText() == attr.GetBulletText() &&
+ GetBulletNumber() == attr.GetBulletNumber() &&
+ GetBulletFont() == attr.GetBulletFont() &&
+ GetBulletName() == attr.GetBulletName() &&
+
+ GetTextEffects() == attr.GetTextEffects() &&
+ GetTextEffectFlags() == attr.GetTextEffectFlags() &&
+
+ GetOutlineLevel() == attr.GetOutlineLevel() &&
+
+ GetFontSize() == attr.GetFontSize() &&
+ GetFontStyle() == attr.GetFontStyle() &&
+ GetFontWeight() == attr.GetFontWeight() &&
+ GetFontUnderlined() == attr.GetFontUnderlined() &&
+ GetFontFaceName() == attr.GetFontFaceName() &&
+ GetFontEncoding() == attr.GetFontEncoding() &&
+ GetFontFamily() == attr.GetFontFamily() &&
+
+ GetURL() == attr.GetURL();
+}
+
+// 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;
+
+ if ((flags & wxTEXT_ATTR_BACKGROUND_COLOUR) && GetBackgroundColour() != attr.GetBackgroundColour())
+ return false;
+
+ if ((flags & wxTEXT_ATTR_FONT_FACE) &&
+ GetFontFaceName() != attr.GetFontFaceName())
+ return false;
+
+ if ((flags & wxTEXT_ATTR_FONT_SIZE) &&
+ GetFontSize() != attr.GetFontSize())
+ return false;
+
+ if ((flags & wxTEXT_ATTR_FONT_WEIGHT) &&
+ GetFontWeight() != attr.GetFontWeight())
+ return false;
+
+ if ((flags & wxTEXT_ATTR_FONT_ITALIC) &&
+ GetFontStyle() != attr.GetFontStyle())
+ return false;
+
+ if ((flags & wxTEXT_ATTR_FONT_UNDERLINE) &&
+ GetFontUnderlined() != attr.GetFontUnderlined())
+ return false;
+
+ if ((flags & wxTEXT_ATTR_FONT_ENCODING) &&
+ 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;
+
+ if ((flags & wxTEXT_ATTR_ALIGNMENT) && GetAlignment() != attr.GetAlignment())
+ return false;
+
+ if ((flags & wxTEXT_ATTR_LEFT_INDENT) &&
+ ((GetLeftIndent() != attr.GetLeftIndent()) || (GetLeftSubIndent() != attr.GetLeftSubIndent())))
+ return false;
+
+ if ((flags & wxTEXT_ATTR_RIGHT_INDENT) &&
+ (GetRightIndent() != attr.GetRightIndent()))
+ return false;
+
+ if ((flags & wxTEXT_ATTR_PARA_SPACING_AFTER) &&
+ (GetParagraphSpacingAfter() != attr.GetParagraphSpacingAfter()))
+ return false;
+
+ if ((flags & wxTEXT_ATTR_PARA_SPACING_BEFORE) &&
+ (GetParagraphSpacingBefore() != attr.GetParagraphSpacingBefore()))
+ return false;
+
+ if ((flags & wxTEXT_ATTR_LINE_SPACING) &&
+ (GetLineSpacing() != attr.GetLineSpacing()))
+ return false;
+
+ if ((flags & wxTEXT_ATTR_CHARACTER_STYLE_NAME) &&
+ (GetCharacterStyleName() != attr.GetCharacterStyleName()))
+ return false;
+
+ if ((flags & wxTEXT_ATTR_PARAGRAPH_STYLE_NAME) &&
+ (GetParagraphStyleName() != attr.GetParagraphStyleName()))
+ return false;
+
+ if ((flags & wxTEXT_ATTR_LIST_STYLE_NAME) &&
+ (GetListStyleName() != attr.GetListStyleName()))
+ return false;
+
+ if ((flags & wxTEXT_ATTR_BULLET_STYLE) &&
+ (GetBulletStyle() != attr.GetBulletStyle()))
+ return false;
+
+ if ((flags & wxTEXT_ATTR_BULLET_NUMBER) &&
+ (GetBulletNumber() != attr.GetBulletNumber()))
+ return false;
+
+ if ((flags & wxTEXT_ATTR_BULLET_TEXT) &&
+ (GetBulletText() != attr.GetBulletText()) &&
+ (GetBulletFont() != attr.GetBulletFont()))
+ return false;
+
+ if ((flags & wxTEXT_ATTR_BULLET_NAME) &&
+ (GetBulletName() != attr.GetBulletName()))
+ return false;
+
+ if ((flags & wxTEXT_ATTR_TABS) &&
+ !TabsEq(GetTabs(), attr.GetTabs()))
+ return false;
+
+ if ((flags & wxTEXT_ATTR_PAGE_BREAK) &&
+ (HasPageBreak() != attr.HasPageBreak()))
+ return false;
+
+ if (flags & wxTEXT_ATTR_EFFECTS)
+ {
+ if (HasTextEffects() != attr.HasTextEffects())
+ return false;
+ if (!BitlistsEqPartial(GetTextEffects(), attr.GetTextEffects(), attr.GetTextEffectFlags()))
+ return false;
+ }
+
+ if ((flags & wxTEXT_ATTR_OUTLINE_LEVEL) &&
+ (GetOutlineLevel() != attr.GetOutlineLevel()))
+ return false;
+
+ return true;
+}
+
+// Create font from font attributes.
+wxFont wxTextAttr::GetFont() const
+{
+ if ( !HasFont() )
+ return wxNullFont;
+
+ int fontSize = 10;
+ if (HasFontSize())
+ fontSize = GetFontSize();
+
+ int fontStyle = wxNORMAL;
+ if (HasFontItalic())
+ fontStyle = GetFontStyle();
+
+ int fontWeight = wxNORMAL;
+ if (HasFontWeight())
+ fontWeight = GetFontWeight();
+
+ bool underlined = false;
+ if (HasFontUnderlined())
+ underlined = GetFontUnderlined();
+
+ wxString fontFaceName;
+ if (HasFontFaceName())
+ fontFaceName = GetFontFaceName();
+
+ wxFontEncoding encoding = wxFONTENCODING_DEFAULT;
+ if (HasFontEncoding())
+ encoding = GetFontEncoding();
+
+ wxFontFamily fontFamily = wxFONTFAMILY_DEFAULT;
+ if (HasFontFamily())
+ fontFamily = GetFontFamily();
+
+ wxFont font(fontSize, fontFamily, fontStyle, fontWeight, underlined, fontFaceName, encoding);
+ return font;
+}
+
+// Get attributes from font.
+bool wxTextAttr::GetFontAttributes(const wxFont& font, int flags)
+{
+ if (!font.IsOk())
+ return false;
+
+ if (flags & wxTEXT_ATTR_FONT_SIZE)
+ m_fontSize = font.GetPointSize();
+
+ if (flags & wxTEXT_ATTR_FONT_ITALIC)
+ m_fontStyle = font.GetStyle();
+
+ if (flags & wxTEXT_ATTR_FONT_WEIGHT)
+ m_fontWeight = font.GetWeight();
+
+ if (flags & wxTEXT_ATTR_FONT_UNDERLINE)
+ m_fontUnderlined = font.GetUnderlined();
+
+ if (flags & wxTEXT_ATTR_FONT_FACE)
+ m_fontFaceName = font.GetFaceName();
+
+ 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)