X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/170acdc90e9f92f8b8120fa6c04acdbf45c89582..a0f4d36895556e3054e2256cb5f1787cc9fcf75c:/src/richtext/richtextstyles.cpp diff --git a/src/richtext/richtextstyles.cpp b/src/richtext/richtextstyles.cpp index 804f28061d..0ce957ad79 100644 --- a/src/richtext/richtextstyles.cpp +++ b/src/richtext/richtextstyles.cpp @@ -45,6 +45,7 @@ void wxRichTextStyleDefinition::Copy(const wxRichTextStyleDefinition& def) 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 @@ -52,6 +53,22 @@ 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 +wxTextAttr wxRichTextStyleDefinition::GetStyleMergedWithBase(const wxRichTextStyleSheet* sheet) const +{ + if (!m_baseStyle.IsEmpty()) + { + wxRichTextStyleDefinition* baseStyle = sheet->FindStyle(m_baseStyle); + if (baseStyle) + { + wxTextAttr baseAttr = baseStyle->GetStyleMergedWithBase(sheet); + baseAttr.Apply(m_style, NULL); + return baseAttr; + } + } + return m_style; +} + /*! * Paragraph style definition */ @@ -94,14 +111,14 @@ bool wxRichTextListStyleDefinition::operator ==(const wxRichTextListStyleDefinit } /// Sets/gets the attributes for the given level -void wxRichTextListStyleDefinition::SetLevelAttributes(int i, const wxRichTextAttr& attr) +void wxRichTextListStyleDefinition::SetLevelAttributes(int i, const wxTextAttr& attr) { wxASSERT( (i >= 0 && i < 10) ); if (i >= 0 && i < 10) m_levelStyles[i] = attr; } -const wxRichTextAttr* wxRichTextListStyleDefinition::GetLevelAttributes(int i) const +const wxTextAttr* wxRichTextListStyleDefinition::GetLevelAttributes(int i) const { wxASSERT( (i >= 0 && i < 10) ); if (i >= 0 && i < 10) @@ -110,7 +127,7 @@ const wxRichTextAttr* wxRichTextListStyleDefinition::GetLevelAttributes(int i) c return NULL; } -wxRichTextAttr* wxRichTextListStyleDefinition::GetLevelAttributes(int i) +wxTextAttr* wxRichTextListStyleDefinition::GetLevelAttributes(int i) { wxASSERT( (i >= 0 && i < 10) ); if (i >= 0 && i < 10) @@ -125,7 +142,7 @@ void wxRichTextListStyleDefinition::SetAttributes(int i, int leftIndent, int lef wxASSERT( (i >= 0 && i < 10) ); if (i >= 0 && i < 10) { - wxRichTextAttr attr; + wxTextAttr attr; attr.SetBulletStyle(bulletStyle); attr.SetLeftIndent(leftIndent, leftSubIndent); @@ -161,19 +178,22 @@ int wxRichTextListStyleDefinition::FindLevelForIndent(int indent) const /// Combine the list style with a paragraph style, using the given indent (from which /// an appropriate level is found) -wxRichTextAttr wxRichTextListStyleDefinition::CombineWithParagraphStyle(int indent, const wxRichTextAttr& paraStyle) +wxTextAttr wxRichTextListStyleDefinition::CombineWithParagraphStyle(int indent, const wxTextAttr& paraStyle, wxRichTextStyleSheet* styleSheet) { int listLevel = FindLevelForIndent(indent); - wxRichTextAttr attr(*GetLevelAttributes(listLevel)); + wxTextAttr attr(*GetLevelAttributes(listLevel)); int oldLeftIndent = attr.GetLeftIndent(); int oldLeftSubIndent = attr.GetLeftSubIndent(); // First apply the overall paragraph style, if any - wxRichTextApplyStyle(attr, GetStyle()); + 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); @@ -183,22 +203,25 @@ wxRichTextAttr wxRichTextListStyleDefinition::CombineWithParagraphStyle(int inde /// Combine the base and list style, using the given indent (from which /// an appropriate level is found) -wxRichTextAttr wxRichTextListStyleDefinition::GetCombinedStyle(int indent) +wxTextAttr 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) -wxRichTextAttr wxRichTextListStyleDefinition::GetCombinedStyleForLevel(int listLevel) +wxTextAttr wxRichTextListStyleDefinition::GetCombinedStyleForLevel(int listLevel, wxRichTextStyleSheet* styleSheet) { - wxRichTextAttr attr(*GetLevelAttributes(listLevel)); + wxTextAttr attr(*GetLevelAttributes(listLevel)); int oldLeftIndent = attr.GetLeftIndent(); int oldLeftSubIndent = attr.GetLeftSubIndent(); // Apply the overall paragraph style, if any - wxRichTextApplyStyle(attr, GetStyle()); + if (styleSheet) + attr.Apply(GetStyleMergedWithBase(styleSheet)); + else + attr.Apply(GetStyle()); // We override the indents according to the list definition attr.SetLeftIndent(oldLeftIndent, oldLeftSubIndent); @@ -265,6 +288,18 @@ bool wxRichTextStyleSheet::RemoveStyle(wxList& list, wxRichTextStyleDefinition* 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 { @@ -352,6 +387,42 @@ bool wxRichTextStyleSheet::AddListStyle(wxRichTextListStyleDefinition* def) 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) { @@ -376,6 +447,9 @@ void wxRichTextStyleSheet::Copy(const wxRichTextStyleSheet& sheet) wxRichTextListStyleDefinition* def = (wxRichTextListStyleDefinition*) node->GetData(); AddListStyle(new wxRichTextListStyleDefinition(*def)); } + + SetName(sheet.GetName()); + SetDescription(sheet.GetDescription()); } /// Equality @@ -435,32 +509,10 @@ wxRichTextStyleDefinition* wxRichTextStyleListBox::GetStyle(size_t i) const 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 @@ -470,14 +522,27 @@ void wxRichTextStyleListBox::UpdateStyles() { 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(); @@ -492,19 +557,7 @@ void wxRichTextStyleListBox::UpdateStyles() // 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 @@ -533,16 +586,32 @@ wxString wxRichTextStyleListBox::CreateHTML(wxRichTextStyleDefinition* def) cons { // TODO: indicate list format for list style types - wxString str(wxT("")); + wxString str; + + bool isCentred = false; + + wxTextAttr attr(def->GetStyleMergedWithBase(GetStyleSheet())); + + if (attr.HasAlignment() && attr.GetAlignment() == wxTEXT_ALIGNMENT_CENTRE) + isCentred = true; - if (def->GetStyle().GetLeftIndent() > 0) + if (isCentred) + str << wxT("
"); + + + str << wxT("
"); + + if (attr.GetLeftIndent() > 0) { wxClientDC dc((wxWindow*) this); - str << wxT(""); + str << wxT(""); } - str << wxT("
"); + if (isCentred) + str << wxT(""); + else + str << wxT(""); #ifdef __WXMSW__ int size = 3; @@ -551,7 +620,7 @@ wxString wxRichTextStyleListBox::CreateHTML(wxRichTextStyleDefinition* def) cons #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 ++; @@ -562,11 +631,11 @@ wxString wxRichTextStyleListBox::CreateHTML(wxRichTextStyleDefinition* def) cons 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(">"); @@ -574,11 +643,11 @@ wxString wxRichTextStyleListBox::CreateHTML(wxRichTextStyleDefinition* def) cons 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) @@ -597,9 +666,16 @@ wxString wxRichTextStyleListBox::CreateHTML(wxRichTextStyleDefinition* def) cons if (hasBold) str << wxT(""); + if (isCentred) + str << wxT(""); + str << wxT(""); - str += wxT("
"); + str << wxT(""); + + if (isCentred) + str << wxT(""); + return str; } @@ -638,38 +714,40 @@ wxString wxRichTextStyleListBox::GetStyleToShowInIdleTime(wxRichTextCtrl* ctrl, { int adjustedCaretPos = ctrl->GetAdjustedCaretPosition(ctrl->GetCaretPosition()); - wxRichTextParagraph* para = ctrl->GetBuffer().GetParagraphAtPosition(adjustedCaretPos); - wxRichTextObject* obj = ctrl->GetBuffer().GetLeafObjectAtPosition(adjustedCaretPos); - wxString styleName; + wxTextAttr attr; + ctrl->GetStyle(adjustedCaretPos, attr); + // Take into account current default style just chosen by user if (ctrl->IsDefaultStyleShowing()) { + 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()) + else if ((styleType == wxRICHTEXT_STYLE_ALL || styleType == wxRICHTEXT_STYLE_CHARACTER) && + !attr.GetCharacterStyleName().IsEmpty()) { - styleName = obj->GetAttributes().GetCharacterStyleName(); + styleName = attr.GetCharacterStyleName(); } - else if (para && (styleType == wxRICHTEXT_STYLE_ALL || styleType == wxRICHTEXT_STYLE_PARAGRAPH) && - !para->GetAttributes().GetParagraphStyleName().IsEmpty()) + else if ((styleType == wxRICHTEXT_STYLE_ALL || styleType == wxRICHTEXT_STYLE_PARAGRAPH) && + !attr.GetParagraphStyleName().IsEmpty()) { - styleName = para->GetAttributes().GetParagraphStyleName(); + styleName = attr.GetParagraphStyleName(); } - else if (para && (styleType == wxRICHTEXT_STYLE_ALL || styleType == wxRICHTEXT_STYLE_LIST) && - !para->GetAttributes().GetListStyleName().IsEmpty()) + else if ((styleType == wxRICHTEXT_STYLE_ALL || styleType == wxRICHTEXT_STYLE_LIST) && + !attr.GetListStyleName().IsEmpty()) { - styleName = para->GetAttributes().GetListStyleName(); + styleName = attr.GetListStyleName(); } return styleName; @@ -678,7 +756,7 @@ wxString wxRichTextStyleListBox::GetStyleToShowInIdleTime(wxRichTextCtrl* ctrl, /// Auto-select from style under caret in idle time void wxRichTextStyleListBox::OnIdle(wxIdleEvent& event) { - if (CanAutoSetSelection() && GetRichTextCtrl() && wxWindow::FindFocus() != this) + if (CanAutoSetSelection() && GetRichTextCtrl() && IsShownOnScreen() && wxWindow::FindFocus() != this) { wxString styleName = GetStyleToShowInIdleTime(GetRichTextCtrl(), GetStyleType()); @@ -733,6 +811,9 @@ wxRichTextStyleListCtrl::wxRichTextStyleListCtrl(wxWindow* parent, wxWindowID id bool wxRichTextStyleListCtrl::Create(wxWindow* parent, wxWindowID id, const wxPoint& pos, const wxSize& size, long style) { + if ((style & wxBORDER_MASK) == wxBORDER_DEFAULT) + style |= wxBORDER_THEME; + wxControl::Create(parent, id, pos, size, style); SetBackgroundColour(wxSystemSettings::GetColour(wxSYS_COLOUR_WINDOW)); @@ -741,7 +822,13 @@ bool wxRichTextStyleListCtrl::Create(wxWindow* parent, wxWindowID id, const wxPo bool showSelector = ((style & wxRICHTEXTSTYLELIST_HIDE_TYPE_SELECTOR) == 0); - m_styleListBox = new wxRichTextStyleListBox(this, wxID_ANY, wxDefaultPosition, wxDefaultSize, showSelector ? wxSIMPLE_BORDER : wxNO_BORDER); + wxBorder listBoxStyle; + if (showSelector) + listBoxStyle = wxBORDER_THEME; + else + listBoxStyle = wxBORDER_NONE; + + m_styleListBox = new wxRichTextStyleListBox(this, wxID_ANY, wxDefaultPosition, wxDefaultSize, listBoxStyle); wxBoxSizer* boxSizer = new wxBoxSizer(wxVERTICAL); @@ -756,7 +843,7 @@ bool wxRichTextStyleListCtrl::Create(wxWindow* parent, wxWindowID id, const wxPo 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_styleChoice, 0, wxLEFT|wxRIGHT|wxBOTTOM|wxEXPAND, 5); } else { @@ -874,8 +961,10 @@ wxRichTextCtrl* wxRichTextStyleListCtrl::GetRichTextCtrl() const /// 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; @@ -915,6 +1004,17 @@ BEGIN_EVENT_TABLE(wxRichTextStyleComboPopup, wxRichTextStyleListBox) EVT_LEFT_DOWN(wxRichTextStyleComboPopup::OnMouseClick) END_EVENT_TABLE() +bool wxRichTextStyleComboPopup::Create( wxWindow* parent ) +{ + int borderStyle = GetDefaultBorder(); + if (borderStyle == wxBORDER_SUNKEN) + borderStyle = wxBORDER_SIMPLE; + + return wxRichTextStyleListBox::Create(parent, wxID_ANY, + wxPoint(0,0), wxDefaultSize, + borderStyle); +} + void wxRichTextStyleComboPopup::SetStringValue( const wxString& s ) { m_value = SetStyleSelection(s); @@ -1005,9 +1105,19 @@ bool wxRichTextStyleComboCtrl::Create(wxWindow* parent, wxWindowID id, const wxP 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() && IsShownOnScreen() && 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()) @@ -1021,7 +1131,6 @@ void wxRichTextStyleComboCtrl::OnIdle(wxIdleEvent& event) else if (!currentValue.IsEmpty()) SetValue(wxEmptyString); } - event.Skip(); } #endif