Applied patch #15744: wxRichTextCtrl: HitTest can't find top-level floats (dghart)

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@75343 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Julian Smart
2013-12-03 18:41:09 +00:00
parent 0eae308634
commit bdfd48b69e

View File

@@ -108,7 +108,7 @@ public:
void Draw(wxDC& dc, wxRichTextDrawingContext& context, const wxRichTextRange& range, const wxRichTextSelection& selection, const wxRect& rect, int descent, int style); void Draw(wxDC& dc, wxRichTextDrawingContext& context, const wxRichTextRange& range, const wxRichTextSelection& selection, const wxRect& rect, int descent, int style);
// HitTest the floats // HitTest the floats
int HitTest(wxDC& dc, wxRichTextDrawingContext& context, const wxPoint& pt, long& textPosition, wxRichTextObject** obj, int flags); int HitTest(wxDC& dc, wxRichTextDrawingContext& context, const wxPoint& pt, long& textPosition, wxRichTextObject** obj, wxRichTextObject** contextObj, int flags);
// Get floating object count // Get floating object count
int GetFloatingObjectCount() const { return m_left.GetCount() + m_right.GetCount(); } int GetFloatingObjectCount() const { return m_left.GetCount() + m_right.GetCount(); }
@@ -132,7 +132,7 @@ public:
static void DrawFloat(const wxRichTextFloatRectMapArray& array, wxDC& dc, wxRichTextDrawingContext& context, const wxRichTextRange& range, const wxRichTextSelection& selection, const wxRect& rect, int descent, int style); static void DrawFloat(const wxRichTextFloatRectMapArray& array, wxDC& dc, wxRichTextDrawingContext& context, const wxRichTextRange& range, const wxRichTextSelection& selection, const wxRect& rect, int descent, int style);
static int HitTestFloat(const wxRichTextFloatRectMapArray& array, wxDC& dc, wxRichTextDrawingContext& context, const wxPoint& pt, long& textPosition, wxRichTextObject** obj, int flags); static int HitTestFloat(const wxRichTextFloatRectMapArray& array, wxDC& dc, wxRichTextDrawingContext& context, const wxPoint& pt, long& textPosition, wxRichTextObject** obj, wxRichTextObject** contextObj, int flags);
private: private:
wxRichTextFloatRectMapArray m_left; wxRichTextFloatRectMapArray m_left;
@@ -426,7 +426,7 @@ void wxRichTextFloatCollector::Draw(wxDC& dc, wxRichTextDrawingContext& context,
DrawFloat(m_right, dc, context, range, selection, rect, descent, style); DrawFloat(m_right, dc, context, range, selection, rect, descent, style);
} }
int wxRichTextFloatCollector::HitTestFloat(const wxRichTextFloatRectMapArray& array, wxDC& WXUNUSED(dc), wxRichTextDrawingContext& WXUNUSED(context), const wxPoint& pt, long& textPosition, wxRichTextObject** obj, int WXUNUSED(flags)) int wxRichTextFloatCollector::HitTestFloat(const wxRichTextFloatRectMapArray& array, wxDC& dc, wxRichTextDrawingContext& context, const wxPoint& pt, long& textPosition, wxRichTextObject** obj, wxRichTextObject** contextObj, int WXUNUSED(flags))
{ {
int i; int i;
if (array.GetCount() == 0) if (array.GetCount() == 0)
@@ -442,6 +442,15 @@ int wxRichTextFloatCollector::HitTestFloat(const wxRichTextFloatRectMapArray& ar
if (point.x <= pt.x && point.x + size.x >= pt.x if (point.x <= pt.x && point.x + size.x >= pt.x
&& point.y <= pt.y && point.y + size.y >= pt.y) && point.y <= pt.y && point.y + size.y >= pt.y)
{ {
if (array[i]->anchor->IsTopLevel())
{
int result = array[i]->anchor->HitTest(dc, context, pt, textPosition, obj, contextObj, 0);
if (result != wxRICHTEXT_HITTEST_NONE)
{
return result;
}
}
textPosition = array[i]->anchor->GetRange().GetStart(); textPosition = array[i]->anchor->GetRange().GetStart();
* obj = array[i]->anchor; * obj = array[i]->anchor;
if (pt.x > (pt.x + pt.x + size.x) / 2) if (pt.x > (pt.x + pt.x + size.x) / 2)
@@ -453,12 +462,12 @@ int wxRichTextFloatCollector::HitTestFloat(const wxRichTextFloatRectMapArray& ar
return wxRICHTEXT_HITTEST_NONE; return wxRICHTEXT_HITTEST_NONE;
} }
int wxRichTextFloatCollector::HitTest(wxDC& dc, wxRichTextDrawingContext& context, const wxPoint& pt, long& textPosition, wxRichTextObject** obj, int flags) int wxRichTextFloatCollector::HitTest(wxDC& dc, wxRichTextDrawingContext& context, const wxPoint& pt, long& textPosition, wxRichTextObject** obj, wxRichTextObject** contextObj, int flags)
{ {
int ret = HitTestFloat(m_left, dc, context, pt, textPosition, obj, flags); int ret = HitTestFloat(m_left, dc, context, pt, textPosition, obj, contextObj, flags);
if (ret == wxRICHTEXT_HITTEST_NONE) if (ret == wxRICHTEXT_HITTEST_NONE)
{ {
ret = HitTestFloat(m_right, dc, context, pt, textPosition, obj, flags); ret = HitTestFloat(m_right, dc, context, pt, textPosition, obj, contextObj, flags);
} }
return ret; return ret;
} }
@@ -1886,7 +1895,13 @@ int wxRichTextParagraphLayoutBox::HitTest(wxDC& dc, wxRichTextDrawingContext& co
int ret = wxRICHTEXT_HITTEST_NONE; int ret = wxRICHTEXT_HITTEST_NONE;
if (wxRichTextBuffer::GetFloatingLayoutMode() && m_floatCollector && (flags & wxRICHTEXT_HITTEST_NO_FLOATING_OBJECTS) == 0) if (wxRichTextBuffer::GetFloatingLayoutMode() && m_floatCollector && (flags & wxRICHTEXT_HITTEST_NO_FLOATING_OBJECTS) == 0)
ret = m_floatCollector->HitTest(dc, context, pt, textPosition, obj, flags); {
ret = m_floatCollector->HitTest(dc, context, pt, textPosition, obj, contextObj, flags);
if (ret != wxRICHTEXT_HITTEST_NONE)
{
return ret;
}
}
if (ret == wxRICHTEXT_HITTEST_NONE) if (ret == wxRICHTEXT_HITTEST_NONE)
return wxRichTextCompositeObject::HitTest(dc, context, pt, textPosition, obj, contextObj, flags); return wxRichTextCompositeObject::HitTest(dc, context, pt, textPosition, obj, contextObj, flags);