]> git.saurik.com Git - wxWidgets.git/blobdiff - src/richtext/richtextstyles.cpp
Fixing icon drawing and implementing HitTest and GetItemRect for native OS X list...
[wxWidgets.git] / src / richtext / richtextstyles.cpp
index 86ac5b074d25a9f9b78c930d27a5526eacce6616..804f28061dcf60e850eab05b8b7c452803019c6d 100644 (file)
@@ -75,7 +75,7 @@ bool wxRichTextParagraphStyleDefinition::operator ==(const wxRichTextParagraphSt
 void wxRichTextListStyleDefinition::Copy(const wxRichTextListStyleDefinition& def)
 {
     wxRichTextParagraphStyleDefinition::Copy(def);
-    
+
     int i;
     for (i = 0; i < 10; i++)
         m_levelStyles[i] = def.m_levelStyles[i];
@@ -89,19 +89,19 @@ bool wxRichTextListStyleDefinition::operator ==(const wxRichTextListStyleDefinit
     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)
@@ -110,7 +110,7 @@ const wxTextAttrEx* wxRichTextListStyleDefinition::GetLevelAttributes(int i) con
         return NULL;
 }
 
-wxTextAttrEx* wxRichTextListStyleDefinition::GetLevelAttributes(int i)
+wxRichTextAttr* wxRichTextListStyleDefinition::GetLevelAttributes(int i)
 {
     wxASSERT( (i >= 0 && i < 10) );
     if (i >= 0 && i < 10)
@@ -125,16 +125,21 @@ void wxRichTextListStyleDefinition::SetAttributes(int i, int leftIndent, int lef
     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
@@ -156,29 +161,29 @@ 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)
-wxTextAttrEx wxRichTextListStyleDefinition::CombineWithParagraphStyle(int indent, const wxTextAttrEx& paraStyle)
+wxRichTextAttr wxRichTextListStyleDefinition::CombineWithParagraphStyle(int indent, const wxRichTextAttr& paraStyle)
 {
     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    
+    // First apply the overall paragraph style, if any
     wxRichTextApplyStyle(attr, GetStyle());
 
     // Then apply paragraph style, e.g. from paragraph style definition
     wxRichTextApplyStyle(attr, 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)
 {
     int listLevel = FindLevelForIndent(indent);
     return GetCombinedStyleForLevel(listLevel);
@@ -186,18 +191,18 @@ wxTextAttrEx wxRichTextListStyleDefinition::GetCombinedStyle(int indent)
 
 /// 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)
 {
-    wxTextAttrEx attr(*GetLevelAttributes(listLevel));
+    wxRichTextAttr attr(*GetLevelAttributes(listLevel));
     int oldLeftIndent = attr.GetLeftIndent();
     int oldLeftSubIndent = attr.GetLeftSubIndent();
 
-    // Apply the overall paragraph style, if any    
+    // Apply the overall paragraph style, if any
     wxRichTextApplyStyle(attr, GetStyle());
 
     // We override the indents according to the list definition
     attr.SetLeftIndent(oldLeftIndent, oldLeftSubIndent);
-    
+
     return attr;
 }
 
@@ -221,10 +226,10 @@ wxRichTextStyleSheet::~wxRichTextStyleSheet()
 
     if (m_nextSheet)
         m_nextSheet->m_previousSheet = m_previousSheet;
-    
+
     if (m_previousSheet)
         m_previousSheet->m_nextSheet = m_nextSheet;
-    
+
     m_previousSheet = NULL;
     m_nextSheet = NULL;
 }
@@ -269,7 +274,7 @@ wxRichTextStyleDefinition* wxRichTextStyleSheet::FindStyle(const wxList& list, c
         if (def->GetName().Lower() == name.Lower())
             return def;
     }
-    
+
     if (m_nextSheet && recurse)
         return m_nextSheet->FindStyle(list, name, recurse);
 
@@ -289,7 +294,7 @@ bool wxRichTextStyleSheet::InsertSheet(wxRichTextStyleSheet* before)
 {
     m_previousSheet = before->m_previousSheet;
     m_nextSheet = before;
-    
+
     before->m_previousSheet = this;
     return true;
 }
@@ -302,12 +307,12 @@ bool wxRichTextStyleSheet::AppendSheet(wxRichTextStyleSheet* after)
     {
         last = last->m_nextSheet;
     }
-    
+
     if (last)
     {
         m_previousSheet = last;
         last->m_nextSheet = this;
-        
+
         return true;
     }
     else
@@ -321,7 +326,7 @@ void wxRichTextStyleSheet::Unlink()
         m_previousSheet->m_nextSheet = m_nextSheet;
     if (m_nextSheet)
         m_nextSheet->m_previousSheet = m_previousSheet;
-    
+
     m_previousSheet = NULL;
     m_nextSheet = NULL;
 }
@@ -389,7 +394,6 @@ bool wxRichTextStyleSheet::operator==(const wxRichTextStyleSheet& WXUNUSED(sheet
 IMPLEMENT_CLASS(wxRichTextStyleListBox, wxHtmlListBox)
 
 BEGIN_EVENT_TABLE(wxRichTextStyleListBox, wxHtmlListBox)
-    EVT_LISTBOX(wxID_ANY, wxRichTextStyleListBox::OnSelect)
     EVT_LEFT_DOWN(wxRichTextStyleListBox::OnLeftDown)
     EVT_LEFT_DCLICK(wxRichTextStyleListBox::OnLeftDoubleClick)
     EVT_IDLE(wxRichTextStyleListBox::OnIdle)
@@ -417,7 +421,7 @@ wxString wxRichTextStyleListBox::OnGetItem(size_t n) const
 {
     if (!GetStyleSheet())
         return wxEmptyString;
-    
+
     wxRichTextStyleDefinition* def = GetStyle(n);
     if (def)
         return CreateHTML(def);
@@ -454,7 +458,7 @@ wxRichTextStyleDefinition* wxRichTextStyleListBox::GetStyle(size_t i) const
     else if ((GetStyleType() == wxRICHTEXT_STYLE_LIST) && (i < GetStyleSheet()->GetListStyleCount()))
     {
         return GetStyleSheet()->GetListStyle(i);
-    }          
+    }
 
     return NULL;
 }
@@ -464,6 +468,8 @@ void wxRichTextStyleListBox::UpdateStyles()
 {
     if (GetStyleSheet())
     {
+        SetSelection(wxNOT_FOUND);
+
         if (GetStyleType() == wxRICHTEXT_STYLE_ALL)
             SetItemCount(GetStyleSheet()->GetParagraphStyleCount()+GetStyleSheet()->GetCharacterStyleCount()+GetStyleSheet()->GetListStyleCount());
         else if (GetStyleType() == wxRICHTEXT_STYLE_PARAGRAPH)
@@ -472,7 +478,14 @@ void wxRichTextStyleListBox::UpdateStyles()
             SetItemCount(GetStyleSheet()->GetCharacterStyleCount());
         else if (GetStyleType() == wxRICHTEXT_STYLE_LIST)
             SetItemCount(GetStyleSheet()->GetListStyleCount());
+
         Refresh();
+
+        if (GetItemCount() > 0)
+        {
+            SetSelection(0);
+            SendSelectedEvent();
+        }
     }
 }
 
@@ -531,10 +544,19 @@ wxString wxRichTextStyleListBox::CreateHTML(wxRichTextStyleDefinition* def) cons
 
     str << wxT("<td nowrap>");
 
+#ifdef __WXMSW__
+    int size = 3;
+#else
     int size = 4;
+#endif
 
-    // Standard size is 12, say
-    size += (def->GetStyle().HasFont() ? def->GetStyle().GetFontSize() : 12) - 12;
+    int stdFontSize = 12;
+    int thisFontSize = ((def->GetStyle().GetFlags() & wxTEXT_ATTR_FONT_SIZE) != 0) ? def->GetStyle().GetFontSize() : stdFontSize;
+
+    if (thisFontSize < stdFontSize)
+        size ++;
+    else if (thisFontSize > stdFontSize)
+        size --;
 
     str += wxT("<font");
 
@@ -593,18 +615,6 @@ int wxRichTextStyleListBox::ConvertTenthsMMToPixels(wxDC& dc, int units) const
     return (int) pixels;
 }
 
-/// React to selection
-void wxRichTextStyleListBox::OnSelect(wxCommandEvent& WXUNUSED(event))
-{
-#if 0
-    wxRichTextStyleDefinition* def = GetStyle(event.GetSelection());
-    if (def)
-    {
-        wxMessageBox(def->GetName());
-    }
-#endif
-}
-
 void wxRichTextStyleListBox::OnLeftDown(wxMouseEvent& event)
 {
     wxVListBox::OnLeftDown(event);
@@ -661,7 +671,7 @@ wxString wxRichTextStyleListBox::GetStyleToShowInIdleTime(wxRichTextCtrl* ctrl,
     {
         styleName = para->GetAttributes().GetListStyleName();
     }
-    
+
     return styleName;
 }
 
@@ -724,37 +734,54 @@ bool wxRichTextStyleListCtrl::Create(wxWindow* parent, wxWindowID id, const wxPo
         const wxSize& size, long style)
 {
     wxControl::Create(parent, id, pos, size, style);
-    
+
     SetBackgroundColour(wxSystemSettings::GetColour(wxSYS_COLOUR_WINDOW));
-    
-    m_styleListBox = new wxRichTextStyleListBox(this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxSIMPLE_BORDER);
-    
-    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);
-    
+    if (size != wxDefaultSize)
+        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);
-    boxSizer->Add(m_styleListBox, 1, wxALL|wxEXPAND, 5);
-    boxSizer->Add(m_styleChoice, 0, wxALL|wxEXPAND, 5);
-    
-    SetSizer(boxSizer);    
+
+    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);
+    }
+    else
+    {
+        boxSizer->Add(m_styleListBox, 1, wxALL|wxEXPAND, 0);
+    }
+
+    SetSizer(boxSizer);
+    Layout();
 
     m_dontUpdate = true;
-    
-    int i = StyleTypeToIndex(m_styleListBox->GetStyleType());
-    m_styleChoice->SetSelection(i);
-    
+
+    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
@@ -766,7 +793,7 @@ void wxRichTextStyleListCtrl::OnChooseType(wxCommandEvent& event)
     {
         if (m_dontUpdate)
             return;
-        
+
         wxRichTextStyleListBox::wxRichTextStyleType styleType = StyleIndexToType(event.GetSelection());
         m_styleListBox->SetStyleType(styleType);
     }
@@ -853,11 +880,11 @@ void wxRichTextStyleListCtrl::SetStyleType(wxRichTextStyleListBox::wxRichTextSty
     m_dontUpdate = true;
 
     if (m_styleChoice)
-    {    
+    {
         int i = StyleTypeToIndex(m_styleListBox->GetStyleType());
         m_styleChoice->SetSelection(i);
     }
-    
+
     m_dontUpdate = false;
 }
 
@@ -873,7 +900,7 @@ wxRichTextStyleListBox::wxRichTextStyleType wxRichTextStyleListCtrl::GetStyleTyp
 void wxRichTextStyleListCtrl::UpdateStyles()
 {
     if (m_styleListBox)
-        m_styleListBox->UpdateStyles();    
+        m_styleListBox->UpdateStyles();
 }
 
 #if wxUSE_COMBOCTRL
@@ -981,7 +1008,7 @@ void wxRichTextStyleComboCtrl::OnIdle(wxIdleEvent& event)
     if (GetRichTextCtrl() && !IsPopupShown() && m_stylePopup && wxWindow::FindFocus() != this)
     {
         wxString styleName = wxRichTextStyleListBox::GetStyleToShowInIdleTime(GetRichTextCtrl(), m_stylePopup->GetStyleType());
-        
+
         wxString currentValue = GetValue();
         if (!styleName.IsEmpty())
         {
@@ -1005,4 +1032,3 @@ void wxRichTextStyleComboCtrl::OnIdle(wxIdleEvent& event)
 
 #endif
     // wxUSE_RICHTEXT
-