+IMPLEMENT_CLASS(wxRichTextDrawingHandler, wxObject)
+IMPLEMENT_CLASS(wxRichTextDrawingContext, wxObject)
+
+bool wxRichTextDrawingContext::HasVirtualAttributes(wxRichTextObject* obj) const
+{
+ wxList::compatibility_iterator node = m_buffer->GetDrawingHandlers().GetFirst();
+ while (node)
+ {
+ wxRichTextDrawingHandler *handler = (wxRichTextDrawingHandler*)node->GetData();
+ if (handler->HasVirtualAttributes(obj))
+ return true;
+
+ node = node->GetNext();
+ }
+ return false;
+}
+
+wxRichTextAttr wxRichTextDrawingContext::GetVirtualAttributes(wxRichTextObject* obj) const
+{
+ wxRichTextAttr attr;
+ // We apply all handlers, so we can may combine several different attributes
+ wxList::compatibility_iterator node = m_buffer->GetDrawingHandlers().GetFirst();
+ while (node)
+ {
+ wxRichTextDrawingHandler *handler = (wxRichTextDrawingHandler*)node->GetData();
+ if (handler->HasVirtualAttributes(obj))
+ {
+ bool success = handler->GetVirtualAttributes(attr, obj);
+ wxASSERT(success);
+ }
+
+ node = node->GetNext();
+ }
+ return attr;
+}
+
+bool wxRichTextDrawingContext::ApplyVirtualAttributes(wxRichTextAttr& attr, wxRichTextObject* obj) const
+{
+ if (HasVirtualAttributes(obj))
+ {
+ wxRichTextAttr a(GetVirtualAttributes(obj));
+ attr.Apply(a);
+ return true;
+ }
+ else
+ return false;
+}
+
+/// Adds a handler to the end
+void wxRichTextBuffer::AddDrawingHandler(wxRichTextDrawingHandler *handler)
+{
+ sm_drawingHandlers.Append(handler);
+}
+
+/// Inserts a handler at the front
+void wxRichTextBuffer::InsertDrawingHandler(wxRichTextDrawingHandler *handler)
+{
+ sm_drawingHandlers.Insert( handler );
+}
+
+/// Removes a handler
+bool wxRichTextBuffer::RemoveDrawingHandler(const wxString& name)
+{
+ wxRichTextDrawingHandler *handler = FindDrawingHandler(name);
+ if (handler)
+ {
+ sm_drawingHandlers.DeleteObject(handler);
+ delete handler;
+ return true;
+ }
+ else
+ return false;
+}
+
+wxRichTextDrawingHandler* wxRichTextBuffer::FindDrawingHandler(const wxString& name)
+{
+ wxList::compatibility_iterator node = sm_drawingHandlers.GetFirst();
+ while (node)
+ {
+ wxRichTextDrawingHandler *handler = (wxRichTextDrawingHandler*)node->GetData();
+ if (handler->GetName().Lower() == name.Lower()) return handler;
+
+ node = node->GetNext();
+ }
+ return NULL;
+}
+
+void wxRichTextBuffer::CleanUpDrawingHandlers()
+{
+ wxList::compatibility_iterator node = sm_drawingHandlers.GetFirst();
+ while (node)
+ {
+ wxRichTextDrawingHandler* handler = (wxRichTextDrawingHandler*)node->GetData();
+ wxList::compatibility_iterator next = node->GetNext();
+ delete handler;
+ node = next;
+ }
+
+ sm_drawingHandlers.Clear();
+}