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.
This commit is contained in:
Maarten Bent
2019-07-06 13:47:00 +02:00
parent f99ae84d7c
commit 4afea28aab
7 changed files with 126 additions and 128 deletions

View File

@@ -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;

View File

@@ -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);

View File

@@ -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;

View File

@@ -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());

View File

@@ -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<const GdkRGBA*>(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
}

View File

@@ -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
}

View File

@@ -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];
}