m_name = def.m_name;
m_baseStyle = def.m_baseStyle;
m_style = def.m_style;
+ m_description = def.m_description;
}
bool wxRichTextStyleDefinition::Eq(const wxRichTextStyleDefinition& def) const
return (m_name == def.m_name && m_baseStyle == def.m_baseStyle && m_style == def.m_style);
}
+/// Gets the style combined with the base style
+wxRichTextAttr wxRichTextStyleDefinition::GetStyleMergedWithBase(const wxRichTextStyleSheet* sheet) const
+{
+ if (!m_baseStyle.IsEmpty())
+ {
+ wxRichTextStyleDefinition* baseStyle = sheet->FindStyle(m_baseStyle);
+ if (baseStyle)
+ {
+ wxRichTextAttr baseAttr = baseStyle->GetStyleMergedWithBase(sheet);
+ baseAttr.Apply(m_style, NULL);
+ return baseAttr;
+ }
+ }
+ return m_style;
+}
+
/*!
* Paragraph style definition
*/
void wxRichTextListStyleDefinition::Copy(const wxRichTextListStyleDefinition& def)
{
wxRichTextParagraphStyleDefinition::Copy(def);
-
+
int i;
for (i = 0; i < 10; i++)
m_levelStyles[i] = def.m_levelStyles[i];
for (i = 0; i < 10; i++)
if (!(m_levelStyles[i] == def.m_levelStyles[i]))
return false;
-
+
return true;
}
/// Sets/gets the attributes for the given level
-void wxRichTextListStyleDefinition::SetLevelAttributes(int i, const wxTextAttrEx& attr)
+void wxRichTextListStyleDefinition::SetLevelAttributes(int i, const wxRichTextAttr& attr)
{
wxASSERT( (i >= 0 && i < 10) );
if (i >= 0 && i < 10)
m_levelStyles[i] = attr;
}
-const wxTextAttrEx* wxRichTextListStyleDefinition::GetLevelAttributes(int i) const
+const wxRichTextAttr* wxRichTextListStyleDefinition::GetLevelAttributes(int i) const
{
wxASSERT( (i >= 0 && i < 10) );
if (i >= 0 && i < 10)
return NULL;
}
-wxTextAttrEx* wxRichTextListStyleDefinition::GetLevelAttributes(int i)
+wxRichTextAttr* wxRichTextListStyleDefinition::GetLevelAttributes(int i)
{
wxASSERT( (i >= 0 && i < 10) );
if (i >= 0 && i < 10)
wxASSERT( (i >= 0 && i < 10) );
if (i >= 0 && i < 10)
{
- wxTextAttrEx attr;
-
+ wxRichTextAttr attr;
+
attr.SetBulletStyle(bulletStyle);
attr.SetLeftIndent(leftIndent, leftSubIndent);
if (!bulletSymbol.IsEmpty())
- attr.SetBulletSymbol(bulletSymbol[0]);
-
- m_levelStyles[i] = attr;
- }
+ {
+ if (bulletStyle & wxTEXT_ATTR_BULLET_STYLE_SYMBOL)
+ attr.SetBulletText(bulletSymbol);
+ else
+ attr.SetBulletName(bulletSymbol);
+ }
+
+ m_levelStyles[i] = attr;
+ }
}
/// Finds the level corresponding to the given indentation
/// Combine the list style with a paragraph style, using the given indent (from which
/// an appropriate level is found)
-wxTextAttrEx wxRichTextListStyleDefinition::CombineWithParagraphStyle(int indent, const wxTextAttrEx& paraStyle)
+wxRichTextAttr wxRichTextListStyleDefinition::CombineWithParagraphStyle(int indent, const wxRichTextAttr& paraStyle, wxRichTextStyleSheet* styleSheet)
{
int listLevel = FindLevelForIndent(indent);
-
- wxTextAttrEx attr(*GetLevelAttributes(listLevel));
+
+ wxRichTextAttr attr(*GetLevelAttributes(listLevel));
int oldLeftIndent = attr.GetLeftIndent();
int oldLeftSubIndent = attr.GetLeftSubIndent();
- // First apply the overall paragraph style, if any
- wxRichTextApplyStyle(attr, GetStyle());
+ // First apply the overall paragraph style, if any
+ if (styleSheet)
+ attr.Apply(GetStyleMergedWithBase(styleSheet));
+ else
+ attr.Apply(GetStyle());
// Then apply paragraph style, e.g. from paragraph style definition
- wxRichTextApplyStyle(attr, paraStyle);
-
+ attr.Apply(paraStyle);
+
// We override the indents according to the list definition
attr.SetLeftIndent(oldLeftIndent, oldLeftSubIndent);
-
+
return attr;
}
/// Combine the base and list style, using the given indent (from which
/// an appropriate level is found)
-wxTextAttrEx wxRichTextListStyleDefinition::GetCombinedStyle(int indent)
+wxRichTextAttr wxRichTextListStyleDefinition::GetCombinedStyle(int indent, wxRichTextStyleSheet* styleSheet)
{
int listLevel = FindLevelForIndent(indent);
- return GetCombinedStyleForLevel(listLevel);
+ return GetCombinedStyleForLevel(listLevel, styleSheet);
}
/// Combine the base and list style, using the given indent (from which
/// an appropriate level is found)
-wxTextAttrEx wxRichTextListStyleDefinition::GetCombinedStyleForLevel(int listLevel)
+wxRichTextAttr wxRichTextListStyleDefinition::GetCombinedStyleForLevel(int listLevel, wxRichTextStyleSheet* styleSheet)
{
- wxTextAttrEx attr(*GetLevelAttributes(listLevel));
+ wxRichTextAttr attr(*GetLevelAttributes(listLevel));
int oldLeftIndent = attr.GetLeftIndent();
int oldLeftSubIndent = attr.GetLeftSubIndent();
- // Apply the overall paragraph style, if any
- wxRichTextApplyStyle(attr, GetStyle());
+ // Apply the overall paragraph style, if any
+ if (styleSheet)
+ attr.Apply(GetStyleMergedWithBase(styleSheet));
+ else
+ attr.Apply(GetStyle());
// We override the indents according to the list definition
attr.SetLeftIndent(oldLeftIndent, oldLeftSubIndent);
-
+
return attr;
}
if (m_nextSheet)
m_nextSheet->m_previousSheet = m_previousSheet;
-
+
if (m_previousSheet)
m_previousSheet->m_nextSheet = m_nextSheet;
-
+
m_previousSheet = NULL;
m_nextSheet = NULL;
}
return false;
}
+/// Remove a style
+bool wxRichTextStyleSheet::RemoveStyle(wxRichTextStyleDefinition* def, bool deleteStyle)
+{
+ if (RemoveParagraphStyle(def, deleteStyle))
+ return true;
+ if (RemoveCharacterStyle(def, deleteStyle))
+ return true;
+ if (RemoveListStyle(def, deleteStyle))
+ return true;
+ return false;
+}
+
/// Find a definition by name
wxRichTextStyleDefinition* wxRichTextStyleSheet::FindStyle(const wxList& list, const wxString& name, bool recurse) const
{
if (def->GetName().Lower() == name.Lower())
return def;
}
-
+
if (m_nextSheet && recurse)
return m_nextSheet->FindStyle(list, name, recurse);
{
m_previousSheet = before->m_previousSheet;
m_nextSheet = before;
-
+
before->m_previousSheet = this;
return true;
}
{
last = last->m_nextSheet;
}
-
+
if (last)
{
m_previousSheet = last;
last->m_nextSheet = this;
-
+
return true;
}
else
m_previousSheet->m_nextSheet = m_nextSheet;
if (m_nextSheet)
m_nextSheet->m_previousSheet = m_previousSheet;
-
+
m_previousSheet = NULL;
m_nextSheet = NULL;
}
return AddStyle(m_listStyleDefinitions, def);
}
+/// Add a definition to the appropriate style list
+bool wxRichTextStyleSheet::AddStyle(wxRichTextStyleDefinition* def)
+{
+ wxRichTextListStyleDefinition* listDef = wxDynamicCast(def, wxRichTextListStyleDefinition);
+ if (listDef)
+ return AddListStyle(listDef);
+
+ wxRichTextParagraphStyleDefinition* paraDef = wxDynamicCast(def, wxRichTextParagraphStyleDefinition);
+ if (paraDef)
+ return AddParagraphStyle(paraDef);
+
+ wxRichTextCharacterStyleDefinition* charDef = wxDynamicCast(def, wxRichTextCharacterStyleDefinition);
+ if (charDef)
+ return AddCharacterStyle(charDef);
+
+ return false;
+}
+
+/// Find any definition by name
+wxRichTextStyleDefinition* wxRichTextStyleSheet::FindStyle(const wxString& name, bool recurse) const
+{
+ wxRichTextListStyleDefinition* listDef = FindListStyle(name, recurse);
+ if (listDef)
+ return listDef;
+
+ wxRichTextParagraphStyleDefinition* paraDef = FindParagraphStyle(name, recurse);
+ if (paraDef)
+ return paraDef;
+
+ wxRichTextCharacterStyleDefinition* charDef = FindCharacterStyle(name, recurse);
+ if (charDef)
+ return charDef;
+
+ return NULL;
+}
+
/// Copy
void wxRichTextStyleSheet::Copy(const wxRichTextStyleSheet& sheet)
{
wxRichTextListStyleDefinition* def = (wxRichTextListStyleDefinition*) node->GetData();
AddListStyle(new wxRichTextListStyleDefinition(*def));
}
+
+ SetName(sheet.GetName());
+ SetDescription(sheet.GetDescription());
}
/// Equality
{
if (!GetStyleSheet())
return wxEmptyString;
-
+
wxRichTextStyleDefinition* def = GetStyle(n);
if (def)
return CreateHTML(def);
if (!GetStyleSheet())
return NULL;
- if (GetStyleType() == wxRICHTEXT_STYLE_ALL)
- {
- // First paragraph styles, then character, then list
- if (i < GetStyleSheet()->GetParagraphStyleCount())
- return GetStyleSheet()->GetParagraphStyle(i);
-
- if ((i - GetStyleSheet()->GetParagraphStyleCount()) < GetStyleSheet()->GetCharacterStyleCount())
- return GetStyleSheet()->GetCharacterStyle(i - GetStyleSheet()->GetParagraphStyleCount());
-
- if ((i - GetStyleSheet()->GetParagraphStyleCount() - GetStyleSheet()->GetCharacterStyleCount()) < GetStyleSheet()->GetListStyleCount())
- return GetStyleSheet()->GetListStyle(i - GetStyleSheet()->GetParagraphStyleCount() - GetStyleSheet()->GetCharacterStyleCount());
- }
- else if ((GetStyleType() == wxRICHTEXT_STYLE_PARAGRAPH) && (i < GetStyleSheet()->GetParagraphStyleCount()))
- {
- return GetStyleSheet()->GetParagraphStyle(i);
- }
- else if ((GetStyleType() == wxRICHTEXT_STYLE_CHARACTER) && (i < GetStyleSheet()->GetCharacterStyleCount()))
- {
- return GetStyleSheet()->GetCharacterStyle(i);
- }
- else if ((GetStyleType() == wxRICHTEXT_STYLE_LIST) && (i < GetStyleSheet()->GetListStyleCount()))
- {
- return GetStyleSheet()->GetListStyle(i);
- }
+ if (i >= m_styleNames.GetCount() /* || i < 0 */ )
+ return NULL;
- return NULL;
+ return GetStyleSheet()->FindStyle(m_styleNames[i]);
}
/// Updates the list
if (GetStyleSheet())
{
SetSelection(wxNOT_FOUND);
-
- if (GetStyleType() == wxRICHTEXT_STYLE_ALL)
- SetItemCount(GetStyleSheet()->GetParagraphStyleCount()+GetStyleSheet()->GetCharacterStyleCount()+GetStyleSheet()->GetListStyleCount());
- else if (GetStyleType() == wxRICHTEXT_STYLE_PARAGRAPH)
- SetItemCount(GetStyleSheet()->GetParagraphStyleCount());
- else if (GetStyleType() == wxRICHTEXT_STYLE_CHARACTER)
- SetItemCount(GetStyleSheet()->GetCharacterStyleCount());
- else if (GetStyleType() == wxRICHTEXT_STYLE_LIST)
- SetItemCount(GetStyleSheet()->GetListStyleCount());
-
+
+ m_styleNames.Clear();
+
+ size_t i;
+ if (GetStyleType() == wxRICHTEXT_STYLE_ALL || GetStyleType() == wxRICHTEXT_STYLE_PARAGRAPH)
+ {
+ for (i = 0; i < GetStyleSheet()->GetParagraphStyleCount(); i++)
+ m_styleNames.Add(GetStyleSheet()->GetParagraphStyle(i)->GetName());
+ }
+ if (GetStyleType() == wxRICHTEXT_STYLE_ALL || GetStyleType() == wxRICHTEXT_STYLE_CHARACTER)
+ {
+ for (i = 0; i < GetStyleSheet()->GetCharacterStyleCount(); i++)
+ m_styleNames.Add(GetStyleSheet()->GetCharacterStyle(i)->GetName());
+ }
+ if (GetStyleType() == wxRICHTEXT_STYLE_ALL || GetStyleType() == wxRICHTEXT_STYLE_LIST)
+ {
+ for (i = 0; i < GetStyleSheet()->GetListStyleCount(); i++)
+ m_styleNames.Add(GetStyleSheet()->GetListStyle(i)->GetName());
+ }
+
+ m_styleNames.Sort();
+ SetItemCount(m_styleNames.GetCount());
+
Refresh();
if (GetItemCount() > 0)
{
SetSelection(0);
SendSelectedEvent();
- }
+ }
}
}
// Get index for style name
int wxRichTextStyleListBox::GetIndexForStyle(const wxString& name) const
{
- if (GetStyleSheet())
- {
- int count = GetItemCount();
-
- int i;
- for (i = 0; i < (int) count; i++)
- {
- wxRichTextStyleDefinition* def = GetStyle(i);
- if (def->GetName() == name)
- return i;
- }
- }
- return -1;
+ return m_styleNames.Index(name);
}
/// Set selection for string
{
// TODO: indicate list format for list style types
- wxString str(wxT("<table><tr>"));
+ wxString str;
+
+ bool isCentred = false;
+
+ wxRichTextAttr attr(def->GetStyleMergedWithBase(GetStyleSheet()));
- if (def->GetStyle().GetLeftIndent() > 0)
+ if (attr.HasAlignment() && attr.GetAlignment() == wxTEXT_ALIGNMENT_CENTRE)
+ isCentred = true;
+
+ if (isCentred)
+ str << wxT("<center>");
+
+
+ str << wxT("<table><tr>");
+
+ if (attr.GetLeftIndent() > 0)
{
wxClientDC dc((wxWindow*) this);
- str << wxT("<td width=") << (ConvertTenthsMMToPixels(dc, def->GetStyle().GetLeftIndent())/2) << wxT("></td>");
+ str << wxT("<td width=") << wxMin(50, (ConvertTenthsMMToPixels(dc, attr.GetLeftIndent())/2)) << wxT("></td>");
}
- str << wxT("<td nowrap>");
+ if (isCentred)
+ str << wxT("<td nowrap align=\"center\">");
+ else
+ str << wxT("<td nowrap>");
#ifdef __WXMSW__
int size = 3;
#endif
int stdFontSize = 12;
- int thisFontSize = ((def->GetStyle().GetFlags() & wxTEXT_ATTR_FONT_SIZE) != 0) ? def->GetStyle().GetFontSize() : stdFontSize;
+ int thisFontSize = ((attr.GetFlags() & wxTEXT_ATTR_FONT_SIZE) != 0) ? attr.GetFontSize() : stdFontSize;
if (thisFontSize < stdFontSize)
size ++;
str << wxT(" size=") << size;
- if (!def->GetStyle().GetFontFaceName().IsEmpty())
- str << wxT(" face=\"") << def->GetStyle().GetFontFaceName() << wxT("\"");
+ if (!attr.GetFontFaceName().IsEmpty())
+ str << wxT(" face=\"") << attr.GetFontFaceName() << wxT("\"");
- if (def->GetStyle().GetTextColour().Ok())
- str << wxT(" color=\"#") << ColourToHexString(def->GetStyle().GetTextColour()) << wxT("\"");
+ if (attr.GetTextColour().Ok())
+ str << wxT(" color=\"#") << ColourToHexString(attr.GetTextColour()) << wxT("\"");
str << wxT(">");
bool hasItalic = false;
bool hasUnderline = false;
- if (def->GetStyle().GetFontWeight() == wxBOLD)
+ if (attr.GetFontWeight() == wxBOLD)
hasBold = true;
- if (def->GetStyle().GetFontStyle() == wxITALIC)
+ if (attr.GetFontStyle() == wxITALIC)
hasItalic = true;
- if (def->GetStyle().GetFontUnderlined())
+ if (attr.GetFontUnderlined())
hasUnderline = true;
if (hasBold)
if (hasBold)
str << wxT("</b>");
+ if (isCentred)
+ str << wxT("</centre>");
+
str << wxT("</font>");
- str += wxT("</td></tr></table>");
+ str << wxT("</td></tr></table>");
+
+ if (isCentred)
+ str << wxT("</center>");
+
return str;
}
// Take into account current default style just chosen by user
if (ctrl->IsDefaultStyleShowing())
{
+ wxTextAttrEx attr;
+
+ ctrl->GetStyle(adjustedCaretPos, attr);
+ wxRichTextApplyStyle(attr, ctrl->GetDefaultStyleEx());
+
if ((styleType == wxRICHTEXT_STYLE_ALL || styleType == wxRICHTEXT_STYLE_CHARACTER) &&
- !ctrl->GetDefaultStyleEx().GetCharacterStyleName().IsEmpty())
- styleName = ctrl->GetDefaultStyleEx().GetCharacterStyleName();
+ !attr.GetCharacterStyleName().IsEmpty())
+ styleName = attr.GetCharacterStyleName();
else if ((styleType == wxRICHTEXT_STYLE_ALL || styleType == wxRICHTEXT_STYLE_PARAGRAPH) &&
- !ctrl->GetDefaultStyleEx().GetParagraphStyleName().IsEmpty())
- styleName = ctrl->GetDefaultStyleEx().GetParagraphStyleName();
+ !attr.GetParagraphStyleName().IsEmpty())
+ styleName = attr.GetParagraphStyleName();
else if ((styleType == wxRICHTEXT_STYLE_ALL || styleType == wxRICHTEXT_STYLE_LIST) &&
- !ctrl->GetDefaultStyleEx().GetListStyleName().IsEmpty())
- styleName = ctrl->GetDefaultStyleEx().GetListStyleName();
+ !attr.GetListStyleName().IsEmpty())
+ styleName = attr.GetListStyleName();
}
else if (obj && (styleType == wxRICHTEXT_STYLE_ALL || styleType == wxRICHTEXT_STYLE_CHARACTER) &&
!obj->GetAttributes().GetCharacterStyleName().IsEmpty())
{
styleName = para->GetAttributes().GetListStyleName();
}
-
+
return styleName;
}
const wxSize& size, long style)
{
wxControl::Create(parent, id, pos, size, style);
-
+
SetBackgroundColour(wxSystemSettings::GetColour(wxSYS_COLOUR_WINDOW));
if (size != wxDefaultSize)
- SetBestFittingSize(size);
-
+ SetInitialSize(size);
+
bool showSelector = ((style & wxRICHTEXTSTYLELIST_HIDE_TYPE_SELECTOR) == 0);
-
+
m_styleListBox = new wxRichTextStyleListBox(this, wxID_ANY, wxDefaultPosition, wxDefaultSize, showSelector ? wxSIMPLE_BORDER : wxNO_BORDER);
wxBoxSizer* boxSizer = new wxBoxSizer(wxVERTICAL);
-
+
if (showSelector)
- {
+ {
wxArrayString choices;
choices.Add(_("All styles"));
choices.Add(_("Paragraph styles"));
choices.Add(_("Character styles"));
choices.Add(_("List styles"));
-
+
m_styleChoice = new wxChoice(this, wxID_ANY, wxDefaultPosition, wxDefaultSize, choices);
-
+
boxSizer->Add(m_styleListBox, 1, wxALL|wxEXPAND, 5);
boxSizer->Add(m_styleChoice, 0, wxALL|wxEXPAND, 5);
}
{
boxSizer->Add(m_styleListBox, 1, wxALL|wxEXPAND, 0);
}
-
+
SetSizer(boxSizer);
Layout();
m_dontUpdate = true;
if (m_styleChoice)
- {
+ {
int i = StyleTypeToIndex(m_styleListBox->GetStyleType());
m_styleChoice->SetSelection(i);
}
-
+
m_dontUpdate = false;
-
+
return true;
}
wxRichTextStyleListCtrl::~wxRichTextStyleListCtrl()
{
-
+
}
/// React to style type choice
{
if (m_dontUpdate)
return;
-
+
wxRichTextStyleListBox::wxRichTextStyleType styleType = StyleIndexToType(event.GetSelection());
m_styleListBox->SetStyleType(styleType);
}
/// Set/get the style type to display
void wxRichTextStyleListCtrl::SetStyleType(wxRichTextStyleListBox::wxRichTextStyleType styleType)
{
- if (m_styleListBox)
- m_styleListBox->SetStyleType(styleType);
+ if ( !m_styleListBox )
+ return;
+
+ m_styleListBox->SetStyleType(styleType);
m_dontUpdate = true;
if (m_styleChoice)
- {
+ {
int i = StyleTypeToIndex(m_styleListBox->GetStyleType());
m_styleChoice->SetSelection(i);
}
-
+
m_dontUpdate = false;
}
void wxRichTextStyleListCtrl::UpdateStyles()
{
if (m_styleListBox)
- m_styleListBox->UpdateStyles();
+ m_styleListBox->UpdateStyles();
}
#if wxUSE_COMBOCTRL
void wxRichTextStyleComboCtrl::OnIdle(wxIdleEvent& event)
{
- if (GetRichTextCtrl() && !IsPopupShown() && m_stylePopup && wxWindow::FindFocus() != this)
+ event.Skip();
+
+ if ( !m_stylePopup )
+ return;
+
+ wxRichTextCtrl * const richtext = GetRichTextCtrl();
+ if ( !richtext )
+ return;
+
+ if ( !IsPopupShown() && wxWindow::FindFocus() != this )
{
- wxString styleName = wxRichTextStyleListBox::GetStyleToShowInIdleTime(GetRichTextCtrl(), m_stylePopup->GetStyleType());
-
+ wxString styleName =
+ wxRichTextStyleListBox::GetStyleToShowInIdleTime(richtext, m_stylePopup->GetStyleType());
+
wxString currentValue = GetValue();
if (!styleName.IsEmpty())
{
else if (!currentValue.IsEmpty())
SetValue(wxEmptyString);
}
- event.Skip();
}
#endif
#endif
// wxUSE_RICHTEXT
-