Added drawing context to allow 'virtual' (dynamic) attributes, for e.g. showing bookmarks without affecting the content

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@70378 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Julian Smart
2012-01-17 20:03:13 +00:00
parent 907f09f44b
commit 8db2e3ef15
5 changed files with 622 additions and 225 deletions

View File

@@ -445,9 +445,10 @@ void wxRichTextCtrl::OnPaint(wxPaintEvent& WXUNUSED(event))
drawingArea.SetPosition(GetLogicalPoint(drawingArea.GetPosition()));
wxRect availableSpace(GetClientSize());
wxRichTextDrawingContext context(& GetBuffer());
if (GetBuffer().IsDirty())
{
GetBuffer().Layout(dc, availableSpace, availableSpace, wxRICHTEXT_FIXED_WIDTH|wxRICHTEXT_VARIABLE_HEIGHT);
GetBuffer().Layout(dc, context, availableSpace, availableSpace, wxRICHTEXT_FIXED_WIDTH|wxRICHTEXT_VARIABLE_HEIGHT);
GetBuffer().Invalidate(wxRICHTEXT_NONE);
SetupScrollbars();
}
@@ -464,7 +465,7 @@ void wxRichTextCtrl::OnPaint(wxPaintEvent& WXUNUSED(event))
if ((GetExtraStyle() & wxRICHTEXT_EX_NO_GUIDELINES) == 0)
flags |= wxRICHTEXT_DRAW_GUIDELINES;
GetBuffer().Draw(dc, GetBuffer().GetOwnRange(), GetSelection(), drawingArea, 0 /* descent */, flags);
GetBuffer().Draw(dc, context, GetBuffer().GetOwnRange(), GetSelection(), drawingArea, 0 /* descent */, flags);
dc.DestroyClippingRegion();
@@ -573,7 +574,8 @@ void wxRichTextCtrl::OnLeftClick(wxMouseEvent& event)
long position = 0;
wxRichTextObject* hitObj = NULL;
wxRichTextObject* contextObj = NULL;
int hit = GetBuffer().HitTest(dc, event.GetLogicalPosition(dc), position, & hitObj, & contextObj);
wxRichTextDrawingContext context(& GetBuffer());
int hit = GetBuffer().HitTest(dc, context, event.GetLogicalPosition(dc), position, & hitObj, & contextObj);
#if wxUSE_DRAG_AND_DROP
// If there's no selection, or we're not inside it, this isn't an attempt to initiate Drag'n'Drop
@@ -639,8 +641,9 @@ void wxRichTextCtrl::OnLeftUp(wxMouseEvent& event)
wxPoint logicalPt = event.GetLogicalPosition(dc);
wxRichTextObject* hitObj = NULL;
wxRichTextObject* contextObj = NULL;
wxRichTextDrawingContext context(& GetBuffer());
// Only get objects at this level, not nested, because otherwise we couldn't swipe text at a single level.
int hit = GetFocusObject()->HitTest(dc, logicalPt, position, & hitObj, & contextObj, wxRICHTEXT_HITTEST_NO_NESTED_OBJECTS);
int hit = GetFocusObject()->HitTest(dc, context, logicalPt, position, & hitObj, & contextObj, wxRICHTEXT_HITTEST_NO_NESTED_OBJECTS);
#if wxUSE_DRAG_AND_DROP
if (m_preDrag)
@@ -652,7 +655,7 @@ void wxRichTextCtrl::OnLeftUp(wxMouseEvent& event)
long position = 0;
wxRichTextObject* hitObj = NULL;
wxRichTextObject* contextObj = NULL;
int hit = GetBuffer().HitTest(dc, event.GetLogicalPosition(dc), position, & hitObj, & contextObj);
int hit = GetBuffer().HitTest(dc, context, event.GetLogicalPosition(dc), position, & hitObj, & contextObj);
wxRichTextParagraphLayoutBox* oldFocusObject = GetFocusObject();
wxRichTextParagraphLayoutBox* container = wxDynamicCast(contextObj, wxRichTextParagraphLayoutBox);
if (container && container != GetFocusObject() && container->AcceptsFocus())
@@ -823,7 +826,8 @@ void wxRichTextCtrl::OnMoveMouse(wxMouseEvent& event)
flags = wxRICHTEXT_HITTEST_NO_NESTED_OBJECTS;
container = GetFocusObject();
}
int hit = container->HitTest(dc, logicalPt, position, & hitObj, & contextObj, flags);
wxRichTextDrawingContext context(& GetBuffer());
int hit = container->HitTest(dc, context, logicalPt, position, & hitObj, & contextObj, flags);
// See if we need to change the cursor
@@ -857,7 +861,8 @@ void wxRichTextCtrl::OnMoveMouse(wxMouseEvent& event)
// Check for dragging across multiple containers
long position2 = 0;
wxRichTextObject* hitObj2 = NULL, *contextObj2 = NULL;
int hit2 = GetBuffer().HitTest(dc, logicalPt, position2, & hitObj2, & contextObj2, 0);
wxRichTextDrawingContext context(& GetBuffer());
int hit2 = GetBuffer().HitTest(dc, context, logicalPt, position2, & hitObj2, & contextObj2, 0);
if (hit2 != wxRICHTEXT_HITTEST_NONE && !(hit2 & wxRICHTEXT_HITTEST_OUTSIDE) && hitObj2 && hitObj != hitObj2)
{
// See if we can find a common ancestor
@@ -945,7 +950,8 @@ void wxRichTextCtrl::OnRightClick(wxMouseEvent& event)
wxPoint logicalPt = event.GetLogicalPosition(dc);
wxRichTextObject* hitObj = NULL;
wxRichTextObject* contextObj = NULL;
int hit = GetFocusObject()->HitTest(dc, logicalPt, position, & hitObj, & contextObj);
wxRichTextDrawingContext context(& GetBuffer());
int hit = GetFocusObject()->HitTest(dc, context, logicalPt, position, & hitObj, & contextObj);
if (hitObj && hitObj->GetContainer() != GetFocusObject())
{
@@ -1397,7 +1403,7 @@ void wxRichTextCtrl::OnChar(wxKeyEvent& event)
}
}
bool wxRichTextCtrl::ProcessMouseMovement(wxRichTextParagraphLayoutBox* container, wxRichTextObject* obj, long position, const wxPoint& pos)
bool wxRichTextCtrl::ProcessMouseMovement(wxRichTextParagraphLayoutBox* container, wxRichTextObject* WXUNUSED(obj), long position, const wxPoint& WXUNUSED(pos))
{
wxRichTextAttr attr;
if (container && GetStyle(position, attr, container))
@@ -2020,7 +2026,8 @@ bool wxRichTextCtrl::MoveDown(int noLines, int flags)
wxRichTextObject* hitObj = NULL;
wxRichTextObject* contextObj = NULL;
int hitTest = container->HitTest(dc, pt, newPos, & hitObj, & contextObj, hitTestFlags);
wxRichTextDrawingContext context(& GetBuffer());
int hitTest = container->HitTest(dc, context, pt, newPos, & hitObj, & contextObj, hitTestFlags);
if (hitObj &&
((hitTest & wxRICHTEXT_HITTEST_NONE) == 0) &&
@@ -2734,7 +2741,8 @@ wxRichTextCtrl::HitTest(const wxPoint& pt,
wxRichTextObject* hitObj = NULL;
wxRichTextObject* contextObj = NULL;
int hit = ((wxRichTextCtrl*)this)->GetFocusObject()->HitTest(dc, pt2, *pos, & hitObj, & contextObj, wxRICHTEXT_HITTEST_NO_NESTED_OBJECTS);
wxRichTextDrawingContext context((wxRichTextBuffer*) & GetBuffer());
int hit = ((wxRichTextCtrl*)this)->GetFocusObject()->HitTest(dc, context, pt2, *pos, & hitObj, & contextObj, wxRICHTEXT_HITTEST_NO_NESTED_OBJECTS);
if ((hit & wxRICHTEXT_HITTEST_BEFORE) && (hit & wxRICHTEXT_HITTEST_OUTSIDE))
return wxTE_HT_BEFORE;
@@ -2756,7 +2764,8 @@ wxRichTextCtrl::FindContainerAtPoint(const wxPoint pt, long& position, int& hit,
wxPoint logicalPt = GetLogicalPoint(pt);
wxRichTextObject* contextObj = NULL;
hit = GetBuffer().HitTest(dc, logicalPt, position, &hitObj, &contextObj, flags);
wxRichTextDrawingContext context(& GetBuffer());
hit = GetBuffer().HitTest(dc, context, logicalPt, position, &hitObj, &contextObj, flags);
wxRichTextParagraphLayoutBox* container = wxDynamicCast(contextObj, wxRichTextParagraphLayoutBox);
return container;
@@ -3390,7 +3399,8 @@ int wxRichTextCtrl::PrepareContextMenu(wxMenu* menu, const wxPoint& pt, bool add
if (pt != wxDefaultPosition)
{
wxPoint logicalPt = GetLogicalPoint(ScreenToClient(pt));
int hit = GetBuffer().HitTest(dc, logicalPt, position, & hitObj, & contextObj);
wxRichTextDrawingContext context(& GetBuffer());
int hit = GetBuffer().HitTest(dc, context, logicalPt, position, & hitObj, & contextObj);
if (hit == wxRICHTEXT_HITTEST_ON || hit == wxRICHTEXT_HITTEST_BEFORE || hit == wxRICHTEXT_HITTEST_AFTER)
{
@@ -3678,7 +3688,8 @@ bool wxRichTextCtrl::GetCaretPositionForIndex(long position, wxRect& rect, wxRic
if (!container)
container = GetFocusObject();
if (container->FindPosition(dc, position, pt, & height, m_caretAtLineStart))
wxRichTextDrawingContext context(& GetBuffer());
if (container->FindPosition(dc, context, position, pt, & height, m_caretAtLineStart))
{
// Caret height can't be zero
if (height == 0)
@@ -3758,9 +3769,10 @@ bool wxRichTextCtrl::LayoutContent(bool onlyVisibleRect)
PrepareDC(dc);
wxRichTextDrawingContext context(& GetBuffer());
GetBuffer().Defragment();
GetBuffer().UpdateRanges(); // If items were deleted, ranges need recalculation
GetBuffer().Layout(dc, availableSpace, availableSpace, flags);
GetBuffer().Layout(dc, context, availableSpace, availableSpace, flags);
GetBuffer().Invalidate(wxRICHTEXT_NONE);
if (!IsFrozen())