From 4afea28aabbe9dd704d80280d0d5d73af9846d3c Mon Sep 17 00:00:00 2001 From: Maarten Bent Date: Sat, 6 Jul 2019 13:47:00 +0200 Subject: [PATCH] Improve underline changes of wxTextCtrl Get rid of m_fontUnderlined, use m_fontUnderlineType instead. Bugfixes in wxMSW, wxGTK and wxOSX code. Show more underline usage in the text sample. --- include/wx/textctrl.h | 16 +++---- samples/text/text.cpp | 26 +++++++----- src/common/gdicmn.cpp | 11 ++--- src/common/textcmn.cpp | 19 +++++---- src/gtk/textctrl.cpp | 37 +++++++--------- src/msw/textctrl.cpp | 88 +++++++++++++++++++++------------------ src/osx/cocoa/textctrl.mm | 57 +++++++++++++------------ 7 files changed, 126 insertions(+), 128 deletions(-) diff --git a/include/wx/textctrl.h b/include/wx/textctrl.h index 0d1f3892eb..693529bab4 100644 --- a/include/wx/textctrl.h +++ b/include/wx/textctrl.h @@ -271,7 +271,7 @@ enum wxTextAttrLineSpacing }; enum wxTextAttrUnderlineType - { +{ wxTEXT_ATTR_UNDERLINE_NONE, wxTEXT_ATTR_UNDERLINE_SOLID, wxTEXT_ATTR_UNDERLINE_DOUBLE, @@ -328,12 +328,10 @@ public: void SetFontStyle(wxFontStyle fontStyle) { m_fontStyle = fontStyle; m_flags |= wxTEXT_ATTR_FONT_ITALIC; } void SetFontWeight(wxFontWeight fontWeight) { m_fontWeight = fontWeight; m_flags |= wxTEXT_ATTR_FONT_WEIGHT; } void SetFontFaceName(const wxString& faceName) { m_fontFaceName = faceName; m_flags |= wxTEXT_ATTR_FONT_FACE; } - void SetFontUnderlined(bool underlined) { m_fontUnderlined = underlined; m_flags |= wxTEXT_ATTR_FONT_UNDERLINE; } - void SetFontUnderline(/*bool underlined, */wxTextAttrUnderlineType type = wxTEXT_ATTR_UNDERLINE_NONE, const wxColour& colour = wxNullColour) + void SetFontUnderlined(bool underlined) { SetFontUnderlined(underlined ? wxTEXT_ATTR_UNDERLINE_SOLID : wxTEXT_ATTR_UNDERLINE_NONE); } + void SetFontUnderlined(wxTextAttrUnderlineType type, const wxColour& colour = wxNullColour) { - if( type != wxTEXT_ATTR_UNDERLINE_NONE ) - m_flags |= wxTEXT_ATTR_FONT_UNDERLINE; -// m_fontUnderlined = underlined; + m_flags |= wxTEXT_ATTR_FONT_UNDERLINE; m_fontUnderlineType = type; m_colUnderline = colour; } @@ -375,7 +373,7 @@ public: int GetFontSize() const { return m_fontSize; } wxFontStyle GetFontStyle() const { return m_fontStyle; } wxFontWeight GetFontWeight() const { return m_fontWeight; } - bool GetFontUnderlined() const { return m_fontUnderlined; } + bool GetFontUnderlined() const { return m_fontUnderlineType != wxTEXT_ATTR_UNDERLINE_NONE; } wxTextAttrUnderlineType GetUnderlineType() const { return m_fontUnderlineType; } const wxColour& GetUnderlineColour() const { return m_colUnderline; } bool GetFontStrikethrough() const { return m_fontStrikethrough; } @@ -414,8 +412,7 @@ public: bool HasFontPointSize() const { return HasFlag(wxTEXT_ATTR_FONT_POINT_SIZE); } bool HasFontPixelSize() const { return HasFlag(wxTEXT_ATTR_FONT_PIXEL_SIZE); } bool HasFontItalic() const { return HasFlag(wxTEXT_ATTR_FONT_ITALIC); } - bool HasFontUnderlined() const { return m_fontUnderlined; } - bool HasFontUnderline() const { return HasFlag(wxTEXT_ATTR_FONT_UNDERLINE); } + bool HasFontUnderlined() const { return HasFlag(wxTEXT_ATTR_FONT_UNDERLINE); } bool HasFontStrikethrough() const { return HasFlag(wxTEXT_ATTR_FONT_STRIKETHROUGH); } bool HasFontFaceName() const { return HasFlag(wxTEXT_ATTR_FONT_FACE); } bool HasFontEncoding() const { return HasFlag(wxTEXT_ATTR_FONT_ENCODING); } @@ -527,7 +524,6 @@ private: wxFontStyle m_fontStyle; wxFontWeight m_fontWeight; wxFontFamily m_fontFamily; - bool m_fontUnderlined; wxTextAttrUnderlineType m_fontUnderlineType; wxColour m_colUnderline; bool m_fontStrikethrough; diff --git a/samples/text/text.cpp b/samples/text/text.cpp index a8ad333492..f5df4e4045 100644 --- a/samples/text/text.cpp +++ b/samples/text/text.cpp @@ -1229,17 +1229,23 @@ MyPanel::MyPanel( wxFrame *frame, int x, int y, int w, int h ) m_textrich->SetDefaultStyle(wxTextAttr(*wxBLUE, *wxWHITE)); m_textrich->AppendText("And this should be in blue and the text you " "type should be in blue as well.\n"); - m_textrich->SetDefaultStyle( wxTextAttr() ); - m_textrich->AppendText("And there is a "); + m_textrich->SetDefaultStyle(wxTextAttr()); wxTextAttr attr = m_textrich->GetDefaultStyle(); - attr.SetFontUnderline( /*true, */wxTEXT_ATTR_UNDERLINE_WAVE, *wxRED ); - m_textrich->SetDefaultStyle( attr ); - m_textrich->AppendText("mispeled "); - attr.SetFontUnderline( /*false, */wxTEXT_ATTR_UNDERLINE_NONE ); - m_textrich->SetDefaultStyle( attr ); - m_textrich->AppendText("word"); - m_textrich->SetDefaultStyle(wxTextAttr(*wxBLUE, *wxWHITE)); - + attr.SetFontUnderlined(true); + m_textrich->SetDefaultStyle(attr); + m_textrich->AppendText("\nAnd there"); + attr.SetFontUnderlined(false); + m_textrich->SetDefaultStyle(attr); + m_textrich->AppendText(" is a "); + attr.SetFontUnderlined(wxTEXT_ATTR_UNDERLINE_WAVE, *wxRED); + m_textrich->SetDefaultStyle(attr); + m_textrich->AppendText("mispeled"); + attr.SetFontUnderlined(false); + m_textrich->SetDefaultStyle(attr); + m_textrich->AppendText(" word."); + attr.SetFontUnderlined(wxTEXT_ATTR_UNDERLINE_DOUBLE, *wxGREEN); + const long endPos = m_textrich->GetLastPosition(); + m_textrich->SetStyle(endPos - 4, endPos - 2, attr); // lay out the controls wxBoxSizer *column1 = new wxBoxSizer(wxVERTICAL); diff --git a/src/common/gdicmn.cpp b/src/common/gdicmn.cpp index 1245e8c274..a7d8980501 100644 --- a/src/common/gdicmn.cpp +++ b/src/common/gdicmn.cpp @@ -328,6 +328,7 @@ void wxColourDatabase::Initialize() {wxT("INDIAN RED"), 79, 47, 47}, {wxT("KHAKI"), 159, 159, 95}, {wxT("LIGHT BLUE"), 191, 216, 216}, + {wxT("LIGHT GREEN"), 0, 128, 0}, {wxT("LIGHT GREY"), 192, 192, 192}, {wxT("LIGHT STEEL BLUE"), 143, 143, 188}, {wxT("LIME GREEN"), 50, 204, 50}, @@ -347,6 +348,7 @@ void wxColourDatabase::Initialize() {wxT("MEDIUM VIOLET RED"), 219, 112, 147}, {wxT("MIDNIGHT BLUE"), 47, 47, 79}, {wxT("NAVY"), 35, 35, 142}, + {wxT("OLIVE"), 128, 128, 0}, {wxT("ORANGE"), 204, 50, 50}, {wxT("ORANGE RED"), 255, 0, 127}, {wxT("ORCHID"), 219, 112, 219}, @@ -363,6 +365,7 @@ void wxColourDatabase::Initialize() {wxT("SPRING GREEN"), 0, 255, 127}, {wxT("STEEL BLUE"), 35, 107, 142}, {wxT("TAN"), 219, 147, 112}, + {wxT("TEAL"), 0, 128, 128}, {wxT("THISTLE"), 216, 191, 216}, {wxT("TURQUOISE"), 173, 234, 234}, {wxT("VIOLET"), 79, 47, 79}, @@ -370,13 +373,7 @@ void wxColourDatabase::Initialize() {wxT("WHEAT"), 216, 216, 191}, {wxT("WHITE"), 255, 255, 255}, {wxT("YELLOW"), 255, 255, 0}, - {wxT("YELLOW GREEN"), 153, 204, 50}, - {wxT("wxNAVY"), 0, 0, 128}, - {wxT("wxTEAL"), 0, 128, 128}, - {wxT("wxLIGHT GREEN"), 0, 128, 0}, - {wxT("wxPURPLE"), 128, 0, 128}, - {wxT("wxMAROON"), 128, 0, 0}, - {wxT("wxDARK GREY"), 128, 128, 128} + {wxT("YELLOW GREEN"), 153, 204, 50} }; size_t n; diff --git a/src/common/textcmn.cpp b/src/common/textcmn.cpp index 104f62a62d..9f8de569bd 100644 --- a/src/common/textcmn.cpp +++ b/src/common/textcmn.cpp @@ -162,7 +162,6 @@ void wxTextAttr::Init() m_fontSize = 12; m_fontStyle = wxFONTSTYLE_NORMAL; m_fontWeight = wxFONTWEIGHT_NORMAL; - m_fontUnderlined = false; m_fontUnderlineType = wxTEXT_ATTR_UNDERLINE_NONE; m_fontStrikethrough = false; m_fontEncoding = wxFONTENCODING_DEFAULT; @@ -194,7 +193,6 @@ void wxTextAttr::Copy(const wxTextAttr& attr) m_fontSize = attr.m_fontSize; m_fontStyle = attr.m_fontStyle; m_fontWeight = attr.m_fontWeight; - m_fontUnderlined = attr.m_fontUnderlined; m_fontUnderlineType = attr.m_fontUnderlineType; m_colUnderline = attr.m_colUnderline; m_fontStrikethrough = attr.m_fontStrikethrough; @@ -261,8 +259,7 @@ bool wxTextAttr::operator== (const wxTextAttr& attr) const (!HasFontSize() || (GetFontSize() == attr.GetFontSize())) && (!HasFontItalic() || (GetFontStyle() == attr.GetFontStyle())) && (!HasFontWeight() || (GetFontWeight() == attr.GetFontWeight())) && - (!HasFontUnderlined() || (GetFontUnderlined() == attr.GetFontUnderlined())) && - ( ( GetUnderlineType() == attr.GetUnderlineType() ) && ( GetUnderlineColour() == attr.GetUnderlineColour() ) ) && + (!HasFontUnderlined() || ((GetUnderlineType() == attr.GetUnderlineType()) && (GetUnderlineColour() == attr.GetUnderlineColour()) )) && (!HasFontStrikethrough() || (GetFontStrikethrough() == attr.GetFontStrikethrough())) && (!HasFontFaceName() || (GetFontFaceName() == attr.GetFontFaceName())) && (!HasFontEncoding() || (GetFontEncoding() == attr.GetFontEncoding())) && @@ -332,7 +329,8 @@ bool wxTextAttr::EqPartial(const wxTextAttr& attr, bool weakTest) const if (HasFontItalic() && attr.HasFontItalic() && GetFontStyle() != attr.GetFontStyle()) return false; - if (HasFontUnderlined() && attr.HasFontUnderlined() && GetFontUnderlined() != attr.GetFontUnderlined()) + if (HasFontUnderlined() && attr.HasFontUnderlined() && + ( (GetUnderlineType() != attr.GetUnderlineType()) || (GetUnderlineColour() != attr.GetUnderlineColour()) )) return false; if (HasFontStrikethrough() && attr.HasFontStrikethrough() && GetFontStrikethrough() != attr.GetFontStrikethrough()) @@ -507,7 +505,7 @@ bool wxTextAttr::GetFontAttributes(const wxFont& font, int flags) m_fontWeight = font.GetWeight(); if (flags & wxTEXT_ATTR_FONT_UNDERLINE) - m_fontUnderlined = font.GetUnderlined(); + m_fontUnderlineType = font.GetUnderlined() ? wxTEXT_ATTR_UNDERLINE_SOLID : wxTEXT_ATTR_UNDERLINE_NONE; if (flags & wxTEXT_ATTR_FONT_STRIKETHROUGH) m_fontStrikethrough = font.GetStrikethrough(); @@ -576,8 +574,10 @@ bool wxTextAttr::Apply(const wxTextAttr& style, const wxTextAttr* compareWith) if (style.HasFontUnderlined()) { - if (!(compareWith && compareWith->HasFontUnderlined() && compareWith->GetFontUnderlined() == style.GetFontUnderlined())) - destStyle.SetFontUnderlined(style.GetFontUnderlined()); + if (!(compareWith && compareWith->HasFontUnderlined() && + compareWith->GetUnderlineType() == style.GetUnderlineType() && + compareWith->GetUnderlineColour() == style.GetUnderlineColour())) + destStyle.SetFontUnderlined(style.GetUnderlineType(), style.GetUnderlineColour()); } if (style.HasFontStrikethrough()) @@ -796,7 +796,8 @@ wxTextAttr wxTextAttr::Combine(const wxTextAttr& attr, } wxTextAttr newAttr(colFg, colBg, font); - newAttr.SetFontUnderline( /*attr.GetFontUnderlined(), */attr.GetUnderlineType(), attr.GetUnderlineColour()); + if (attr.HasFontUnderlined()) + newAttr.SetFontUnderlined(attr.GetUnderlineType(), attr.GetUnderlineColour()); if (attr.HasAlignment()) newAttr.SetAlignment(attr.GetAlignment()); diff --git a/src/gtk/textctrl.cpp b/src/gtk/textctrl.cpp index f059ee2d10..ba2d043c53 100644 --- a/src/gtk/textctrl.cpp +++ b/src/gtk/textctrl.cpp @@ -126,7 +126,6 @@ static void wxGtkTextApplyTagsFromAttr(GtkWidget *text, if ( attr.HasFontUnderlined() ) { - GtkTextTag *underlineColorTag; PangoUnderline pangoUnderlineStyle; switch ( attr.GetUnderlineType() ) { @@ -144,40 +143,34 @@ static void wxGtkTextApplyTagsFromAttr(GtkWidget *text, break; } - g_snprintf(buf, sizeof(buf), "WXFONTUNDERLINEWITHEFFECT"); + g_snprintf(buf, sizeof(buf), "WXFONTUNDERLINESTYLE %u", + (unsigned)pangoUnderlineStyle); tag = gtk_text_tag_table_lookup( gtk_text_buffer_get_tag_table( text_buffer ), buf ); if (!tag) - { tag = gtk_text_buffer_create_tag( text_buffer, buf, "underline-set", TRUE, "underline", pangoUnderlineStyle, NULL ); - } gtk_text_buffer_apply_tag (text_buffer, tag, start, end); #ifdef __WXGTK3__ - if ( gtk_check_version( 3, 16, 0 ) ) + if ( wx_is_at_least_gtk3(16) ) { - wxColour color = attr.GetUnderlineColour(); - if ( !color.IsOk() ) + wxColour colour = attr.GetUnderlineColour(); + if ( colour.IsOk() ) { - color = attr.GetTextColour(); - if( !color.IsOk() ) - color = *wxBLACK; + g_snprintf(buf, sizeof(buf), "WXFONTUNDERLINECOLOUR %u %u %u %u", + colour.Red(), colour.Green(), colour.Blue(), colour.Alpha()); + tag = gtk_text_tag_table_lookup( gtk_text_buffer_get_tag_table( text_buffer ), + buf ); + if (!tag) + tag = gtk_text_buffer_create_tag( text_buffer, buf, + "underline-rgba-set", TRUE, + "underline-rgba", static_cast(colour), + NULL ); + gtk_text_buffer_apply_tag (text_buffer, tag, start, end); } - const GdkColor *gdkColor = attr.GetUnderlineColour().GetColor(); - GdkRGBA color_rgba = { - .red = CLAMP( (double) gdkColor->red / 65535.0, 0.0, 1.0 ), - .green = CLAMP( (double) gdkColor->green / 65535.0, 0.0, 1.0 ), - .blue = CLAMP ((double) gdkColor->blue / 65535.0, 0.0, 1.0 ), - .alpha = 1.0, - }; - underlineColorTag = gtk_text_buffer_create_tag( text_buffer, buf, - "underline-rgba-set", TRUE, - "underline-rgba", color_rgba, - NULL ); - gtk_text_buffer_apply_tag (text_buffer, underlineColorTag, start, end); } #endif } diff --git a/src/msw/textctrl.cpp b/src/msw/textctrl.cpp index 164935b07b..42ea91176e 100644 --- a/src/msw/textctrl.cpp +++ b/src/msw/textctrl.cpp @@ -82,19 +82,23 @@ // missing defines for MinGW build #ifndef CFM_UNDERLINETYPE -#define CFM_UNDERLINETYPE 0x00800000 + #define CFM_UNDERLINETYPE 0x00800000 +#endif + +#ifndef CFU_UNDERLINENONE + #define CFU_UNDERLINENONE 0 #endif #ifndef CFU_UNDERLINE -#define CFU_UNDERLINE 1 + #define CFU_UNDERLINE 1 #endif #ifndef CFU_UNDERLINEDOUBLE -#define CFU_UNDERLINEDOUBLE 3 + #define CFU_UNDERLINEDOUBLE 3 #endif #ifndef CFU_UNDERLINEWAVE -#define CFU_UNDERLINEWAVE 8 + #define CFU_UNDERLINEWAVE 8 #endif #if wxUSE_DRAG_AND_DROP && wxUSE_RICHEDIT @@ -2879,12 +2883,14 @@ bool wxTextCtrl::MSWSetCharFormat(const wxTextAttr& style, long start, long end) } } - if ( style.HasFontUnderline() ) + if ( style.HasFontUnderlined() ) { cf.dwMask |= CFM_UNDERLINETYPE; - wxTextAttrUnderlineType underlineType = style.GetUnderlineType(); - switch ( underlineType ) + switch ( style.GetUnderlineType() ) { + case wxTEXT_ATTR_UNDERLINE_NONE: + cf.bUnderlineType = CFU_UNDERLINENONE; + break; case wxTEXT_ATTR_UNDERLINE_SOLID: cf.bUnderlineType = CFU_UNDERLINE; break; @@ -2898,42 +2904,42 @@ bool wxTextCtrl::MSWSetCharFormat(const wxTextAttr& style, long start, long end) #if _RICHEDIT_VER >= 0x0800 // The colours are coming from https://docs.microsoft.com/en-us/windows/desktop/api/tom/nf-tom-itextdocument2-geteffectcolor. - // Not all values from wxTheColourDatabase are supported as can be seen from the code - // Those are commented out currently BYTE colour = 0; wxColour col = style.GetUnderlineColour(); - if ( col == wxTheColourDatabase->Find( "BLACK" ) ) - colour = 0x01; - else if ( col == wxTheColourDatabase->Find( "BLUE" ) ) - colour = 0x02; - else if ( col == wxTheColourDatabase->Find( "CYAN" ) ) - colour = 0x03; - else if ( col == wxTheColourDatabase->Find( "GREEN" ) ) - colour = 0x04; - else if ( col == wxTheColourDatabase->Find( "MAGENTA" ) ) - colour = 0x05; - else if ( col == wxTheColourDatabase->Find( "RED" ) ) - colour = 0x06; - else if ( col == wxTheColourDatabase->Find( "YELLOW" ) ) - colour = 0x07; - else if ( col == wxTheColourDatabase->Find( "WHITE" ) ) - colour = 0x08; - else if ( col == wxTheColourDatabase->Find( "WXNAVY" ) ) - colour = 0x09; - else if ( col == wxTheColourDatabase->Find( "WXTEAL" ) ) - colour = 0x0A; - else if ( col == wxTheColourDatabase->Find( "WXLIGHT GREEN" ) ) - colour = 0x0B; - else if ( col == wxTheColourDatabase->Find( "WXPURPLE" ) ) - colour = 0x0C; - else if ( col == wxTheColourDatabase->Find( "WXMAROON" ) ) - colour = 0x0D; - else if ( col == wxTheColourDatabase->Find( "OLIVE" ) ) - colour = 0x0E; - else if ( col == wxTheColourDatabase->Find( "wxDARK GREY" ) ) - colour = 0x0F; - else if ( col == wxTheColourDatabase->Find( "LIGHT GREY" ) ) - colour = 0x10; + if ( col == wxNullColour ) + colour = 0; + else if ( col == wxTheColourDatabase->Find("BLACK") ) + colour = 1; + else if ( col == wxTheColourDatabase->Find("BLUE") ) + colour = 2; + else if ( col == wxTheColourDatabase->Find("CYAN") ) + colour = 3; + else if ( col == wxTheColourDatabase->Find("GREEN") ) + colour = 4; + else if ( col == wxTheColourDatabase->Find("MAGENTA") ) + colour = 5; + else if ( col == wxTheColourDatabase->Find("RED") ) + colour = 6; + else if ( col == wxTheColourDatabase->Find("YELLOW") ) + colour = 7; + else if ( col == wxTheColourDatabase->Find("WHITE") ) + colour = 8; + else if ( col == wxColour(0, 0, 128) ) // navy + colour = 9; + else if ( col == wxTheColourDatabase->Find("TEAL") ) + colour = 10; + else if ( col == wxTheColourDatabase->Find("LIGHT GREEN") ) + colour = 11; + else if ( col == wxColour(128, 0, 128) ) // purple + colour = 12; + else if ( col == wxColour(128, 0, 0) ) // maroon + colour = 13; + else if ( col == wxTheColourDatabase->Find("OLIVE") ) + colour = 14; + else if ( col == wxTheColourDatabase->Find("GREY") ) + colour = 15; + else if ( col == wxTheColourDatabase->Find("LIGHT GREY") ) + colour = 16; cf.bUnderlineColor = colour; #endif } diff --git a/src/osx/cocoa/textctrl.mm b/src/osx/cocoa/textctrl.mm index 6561fc4fb5..d1f8e3d4c7 100644 --- a/src/osx/cocoa/textctrl.mm +++ b/src/osx/cocoa/textctrl.mm @@ -1089,35 +1089,31 @@ void wxNSTextViewControl::SetStyle(long start, [attrs setValue:style.GetBackgroundColour().OSXGetNSColor() forKey:NSBackgroundColorAttributeName]; if ( style.HasTextColour() ) [attrs setValue:style.GetTextColour().OSXGetNSColor() forKey:NSForegroundColorAttributeName]; - if ( style.GetUnderlineType() ) + if ( style.HasFontUnderlined() ) { - wxTextAttrUnderlineType underlineType = style.GetUnderlineType(); - switch ( underlineType ) + switch ( style.GetUnderlineType() ) { case wxTEXT_ATTR_UNDERLINE_NONE: [attrs setObject:[NSNumber numberWithInt:( NSUnderlineStyleNone )] forKey:NSUnderlineStyleAttributeName]; break; case wxTEXT_ATTR_UNDERLINE_SOLID: - [attrs setObject:[NSNumber numberWithInt:( NSUnderlineStyleSingle | NSUnderlineStyleSingle )] forKey:NSUnderlineStyleAttributeName]; + [attrs setObject:[NSNumber numberWithInt:( NSUnderlineStyleSingle )] forKey:NSUnderlineStyleAttributeName]; break; case wxTEXT_ATTR_UNDERLINE_DOUBLE: - [attrs setObject:[NSNumber numberWithInt:( NSUnderlineStyleSingle | NSUnderlineStyleDouble )] forKey:NSUnderlineStyleAttributeName]; + [attrs setObject:[NSNumber numberWithInt:( NSUnderlineStyleDouble )] forKey:NSUnderlineStyleAttributeName]; break; case wxTEXT_ATTR_UNDERLINE_WAVE: [attrs setObject:[NSNumber numberWithInt:( NSUnderlineStyleSingle | NSUnderlinePatternDot )] forKey:NSUnderlineStyleAttributeName]; break; } - wxColour color = style.GetUnderlineColour(); - if ( !color.IsOk() ) + wxColour colour = style.GetUnderlineColour(); + if ( colour.IsOk() ) { - color = style.GetTextColour(); - if ( !color.IsOk() ) - color = *wxBLACK; + [attrs setValue:colour.OSXGetNSColor() forKey:NSUnderlineColorAttributeName]; } - [attrs setValue:color.OSXGetNSColor() forKey:NSUnderlineColorAttributeName]; } [m_textView setTypingAttributes:attrs]; } @@ -1138,26 +1134,29 @@ void wxNSTextViewControl::SetStyle(long start, if( style.HasFontUnderlined() ) { NSMutableDictionary *dict = [[NSMutableDictionary alloc] init]; - if( style.GetUnderlineType() == wxTEXT_ATTR_UNDERLINE_NONE ) - [dict setObject:[NSNumber numberWithInt:(NSUnderlineStyleNone)] forKey:NSUnderlineStyleAttributeName]; - - if( style.GetUnderlineType() == wxTEXT_ATTR_UNDERLINE_SOLID ) - [dict setObject:[NSNumber numberWithInt:( NSUnderlineStyleSingle )] forKey:NSUnderlineStyleAttributeName]; - - if( style.GetUnderlineType() == wxTEXT_ATTR_UNDERLINE_DOUBLE ) - [dict setObject:[NSNumber numberWithInt:( NSUnderlineStyleDouble )] forKey:NSUnderlineStyleAttributeName]; - - if( style.GetUnderlineType() == wxTEXT_ATTR_UNDERLINE_WAVE ) - [dict setObject:[NSNumber numberWithInt:( NSUnderlinePatternDot )] forKey:NSUnderlineStyleAttributeName]; - wxColour color = style.GetUnderlineColour(); - if( !color.IsOk() ) + switch ( style.GetUnderlineType() ) { - color = style.GetTextColour(); - if( !color.IsOk() ) - color = *wxBLACK; - } - [dict setValue:color.OSXGetNSColor() forKey:NSUnderlineColorAttributeName]; + case wxTEXT_ATTR_UNDERLINE_NONE: + [dict setObject:[NSNumber numberWithInt:( NSUnderlineStyleNone )] forKey:NSUnderlineStyleAttributeName]; + break; + case wxTEXT_ATTR_UNDERLINE_SOLID: + [dict setObject:[NSNumber numberWithInt:( NSUnderlineStyleSingle )] forKey:NSUnderlineStyleAttributeName]; + break; + + case wxTEXT_ATTR_UNDERLINE_DOUBLE: + [dict setObject:[NSNumber numberWithInt:( NSUnderlineStyleDouble )] forKey:NSUnderlineStyleAttributeName]; + break; + + case wxTEXT_ATTR_UNDERLINE_WAVE: + [dict setObject:[NSNumber numberWithInt:( NSUnderlineStyleSingle | NSUnderlinePatternDot )] forKey:NSUnderlineStyleAttributeName]; + break; + } + wxColour colour = style.GetUnderlineColour(); + if ( colour.IsOk() ) + { + [dict setValue:colour.OSXGetNSColor() forKey:NSUnderlineColorAttributeName]; + } [storage addAttributes:dict range:range]; [dict release]; }