Added Set/GetFloatingLayoutMode to switch off time-consuming floating object layout if required

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@73372 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Julian Smart 2013-01-14 16:19:45 +00:00
parent 880d76dfb1
commit e12b91a306
3 changed files with 76 additions and 32 deletions

View File

@ -5376,6 +5376,19 @@ public:
*/
void SetScale(double scale) { m_scale = scale; }
/**
Sets the floating layout mode. Pass @false to speed up editing by not performing
floating layout. This setting affects all buffers.
*/
static void SetFloatingLayoutMode(bool mode) { sm_floatingLayoutMode = mode; }
/**
Returns the floating layout mode. The default is @true, where objects
are laid out according to their floating status.
*/
static bool GetFloatingLayoutMode() { return sm_floatingLayoutMode; }
protected:
/// Command processor
@ -5429,6 +5442,9 @@ protected:
/// Factor to multiply by character height to get a reasonable bullet size
static float sm_bulletProportion;
/// Floating layout mode, @true by default
static bool sm_floatingLayoutMode;
/// Scaling factor in use: needed to calculate correct dimensions when printing
double m_scale;

View File

@ -5244,6 +5244,19 @@ public:
*/
void SetScale(double scale) { m_scale = scale; }
/**
Returns the floating layout mode. The default is @true, where objects
are laid out according to their floating status.
*/
static bool GetFloatingLayoutMode();
/**
Sets the floating layout mode. Pass @false to speed up editing by not performing
floating layout. This setting affects all buffers.
*/
static void SetFloatingLayoutMode(bool mode);
protected:
/// Command processor

View File

@ -602,7 +602,7 @@ void wxRichTextObject::Invalidate(const wxRichTextRange& invalidRange)
// If this is a floating object, size may not be recalculated
// after floats have been collected in an early stage of Layout.
// So avoid resetting the cache for floating objects during layout.
if (!IsFloating())
if (!IsFloating() || !wxRichTextBuffer::GetFloatingLayoutMode())
SetCachedSize(wxDefaultSize);
SetMaxSize(wxDefaultSize);
SetMinSize(wxDefaultSize);
@ -1076,7 +1076,8 @@ bool wxRichTextObject::LayoutToBestSize(wxDC& dc, wxRichTextDrawingContext& cont
// If a paragraph, align the whole paragraph.
// Problem with this: if we're limited by a floating object, a line may be centered
// w.r.t. the smaller resulting box rather than the actual available width.
if (attr.HasAlignment() && !GetContainer()->GetFloatCollector()->HasFloats()) // FIXME: aligning whole paragraph not compatible with floating objects
// FIXME: aligning whole paragraph not compatible with floating objects
if (attr.HasAlignment() && (!wxRichTextBuffer::GetFloatingLayoutMode() || (GetContainer()->GetFloatCollector() && !GetContainer()->GetFloatCollector()->HasFloats())))
{
// centering, right-justification
if (attr.GetAlignment() == wxTEXT_ALIGNMENT_CENTRE)
@ -1492,7 +1493,7 @@ bool wxRichTextCompositeObject::GetRangeSize(const wxRichTextRange& range, wxSiz
if (!child->GetRange().IsOutside(range))
{
// Floating objects have a zero size within the paragraph.
if (child->IsFloating())
if (child->IsFloating() && wxRichTextBuffer::GetFloatingLayoutMode())
{
if (partialExtents)
{
@ -1581,7 +1582,7 @@ void wxRichTextCompositeObject::Invalidate(const wxRichTextRange& invalidRange)
}
else if (child->IsTopLevel())
{
if (child->IsFloating() && GetBuffer()->GetFloatCollector() && GetBuffer()->GetFloatCollector()->HasFloat(child))
if (wxRichTextBuffer::GetFloatingLayoutMode() && child->IsFloating() && GetBuffer()->GetFloatCollector() && GetBuffer()->GetFloatCollector()->HasFloat(child))
{
// Don't invalidate subhierarchy if we've already been laid out
}
@ -1740,7 +1741,7 @@ int wxRichTextParagraphLayoutBox::HitTest(wxDC& dc, wxRichTextDrawingContext& co
return wxRICHTEXT_HITTEST_NONE;
int ret = wxRICHTEXT_HITTEST_NONE;
if (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);
if (ret == wxRICHTEXT_HITTEST_NONE)
@ -1755,7 +1756,7 @@ int wxRichTextParagraphLayoutBox::HitTest(wxDC& dc, wxRichTextDrawingContext& co
/// Draw the floating objects
void wxRichTextParagraphLayoutBox::DrawFloats(wxDC& dc, wxRichTextDrawingContext& context, const wxRichTextRange& range, const wxRichTextSelection& selection, const wxRect& rect, int descent, int style)
{
if (m_floatCollector)
if (wxRichTextBuffer::GetFloatingLayoutMode() && m_floatCollector)
m_floatCollector->Draw(dc, context, range, selection, rect, descent, style);
}
@ -1789,7 +1790,9 @@ bool wxRichTextParagraphLayoutBox::Draw(wxDC& dc, wxRichTextDrawingContext& cont
theseFlags &= ~wxRICHTEXT_DRAW_GUIDELINES;
DrawBoxAttributes(dc, GetBuffer(), attr, thisRect, theseFlags);
DrawFloats(dc, context, range, selection, rect, descent, style);
if (wxRichTextBuffer::GetFloatingLayoutMode())
DrawFloats(dc, context, range, selection, rect, descent, style);
wxRichTextObjectList::compatibility_iterator node = m_children.GetFirst();
while (node)
{
@ -1923,7 +1926,8 @@ bool wxRichTextParagraphLayoutBox::Layout(wxDC& dc, wxRichTextDrawingContext& co
// Gather information about only those floating objects that will not be formatted,
// after which floats will be gathered per-paragraph during layout.
UpdateFloatingObjects(availableSpace, node ? node->GetData() : (wxRichTextObject*) NULL);
if (wxRichTextBuffer::GetFloatingLayoutMode())
UpdateFloatingObjects(availableSpace, node ? node->GetData() : (wxRichTextObject*) NULL);
// A way to force speedy rest-of-buffer layout (the 'else' below)
bool forceQuickLayout = false;
@ -2027,7 +2031,7 @@ bool wxRichTextParagraphLayoutBox::Layout(wxDC& dc, wxRichTextDrawingContext& co
maxHeight = 0; // topMargin + bottomMargin;
// Check the bottom edge of any floating object
if (GetFloatCollector() && GetFloatCollector()->HasFloats())
if (wxRichTextBuffer::GetFloatingLayoutMode() && GetFloatCollector() && GetFloatCollector()->HasFloats())
{
int bottom = GetFloatCollector()->GetLastRectBottom();
if (bottom > maxHeight)
@ -4502,7 +4506,7 @@ bool wxRichTextParagraph::Draw(wxDC& dc, wxRichTextDrawingContext& context, cons
{
wxRichTextObject* child = node2->GetData();
if (!child->IsFloating() && child->GetRange().GetLength() > 0 && !child->GetRange().IsOutside(lineRange) && !lineRange.IsOutside(range))
if ((!child->IsFloating() || !wxRichTextBuffer::GetFloatingLayoutMode()) && child->GetRange().GetLength() > 0 && !child->GetRange().IsOutside(lineRange) && !lineRange.IsOutside(range))
{
// Draw this part of the line at the correct position
wxRichTextRange objectRange(child->GetRange());
@ -4575,9 +4579,15 @@ bool wxRichTextParagraph::Layout(wxDC& dc, wxRichTextDrawingContext& context, co
// Deal with floating objects firstly before the normal layout
wxRichTextBuffer* buffer = GetBuffer();
wxASSERT(buffer);
wxRichTextFloatCollector* collector = GetContainer()->GetFloatCollector();
wxASSERT(collector);
LayoutFloat(dc, context, rect, parentRect, style, collector);
if (wxRichTextBuffer::GetFloatingLayoutMode())
{
wxASSERT(collector != NULL);
if (collector)
LayoutFloat(dc, context, rect, parentRect, style, collector);
}
wxRichTextAttr attr = GetCombinedAttributes();
context.ApplyVirtualAttributes(attr, this);
@ -4665,8 +4675,8 @@ bool wxRichTextParagraph::Layout(wxDC& dc, wxRichTextDrawingContext& context, co
// If floating, ignore. We already laid out floats.
// Also ignore if empty object, except if we haven't got any
// size yet.
if (child->IsFloating() || !child->IsShown() ||
(child->GetRange().GetLength() == 0 && maxHeight > spaceBeforePara)
if ((child->IsFloating() && wxRichTextBuffer::GetFloatingLayoutMode())
|| !child->IsShown() || (child->GetRange().GetLength() == 0 && maxHeight > spaceBeforePara)
)
{
node = node->GetNext();
@ -4775,20 +4785,24 @@ bool wxRichTextParagraph::Layout(wxDC& dc, wxRichTextDrawingContext& context, co
lineAscent = wxMax(childSize.y-childDescent, maxAscent);
}
lineHeight = wxMax(lineHeight, (lineDescent + lineAscent));
wxRect floatAvailableRect = collector->GetAvailableRect(rect.y + currentPosition.y, rect.y + currentPosition.y + lineHeight);
// Adjust availableRect to the space that is available when taking floating objects into account.
if (floatAvailableRect.x + startOffset > availableRect.x)
if (wxRichTextBuffer::GetFloatingLayoutMode() && collector)
{
int newX = floatAvailableRect.x + startOffset;
int newW = availableRect.width - (newX - availableRect.x);
availableRect.x = newX;
availableRect.width = newW;
}
wxRect floatAvailableRect = collector->GetAvailableRect(rect.y + currentPosition.y, rect.y + currentPosition.y + lineHeight);
if (floatAvailableRect.width < availableRect.width)
availableRect.width = floatAvailableRect.width;
// Adjust availableRect to the space that is available when taking floating objects into account.
if (floatAvailableRect.x + startOffset > availableRect.x)
{
int newX = floatAvailableRect.x + startOffset;
int newW = availableRect.width - (newX - availableRect.x);
availableRect.x = newX;
availableRect.width = newW;
}
if (floatAvailableRect.width < availableRect.width)
availableRect.width = floatAvailableRect.width;
}
currentPosition.x = availableRect.x - rect.x;
@ -5018,7 +5032,7 @@ bool wxRichTextParagraph::Layout(wxDC& dc, wxRichTextDrawingContext& context, co
// If floating, ignore. We already laid out floats.
// Also ignore if empty object, except if we haven't got any
// size yet.
if (!child->IsFloating() && child->GetRange().GetLength() != 0 && !wxDynamicCast(child, wxRichTextPlainText))
if ((!child->IsFloating() || !wxRichTextBuffer::GetFloatingLayoutMode()) && child->GetRange().GetLength() != 0 && !wxDynamicCast(child, wxRichTextPlainText))
{
if (child->GetCachedSize().x > minWidth)
minWidth = child->GetMinSize().x;
@ -5230,7 +5244,7 @@ bool wxRichTextParagraph::GetRangeSize(const wxRichTextRange& range, wxSize& siz
if (!child->GetRange().IsOutside(range))
{
// Floating objects have a zero size within the paragraph.
if (child->IsFloating())
if (child->IsFloating() && wxRichTextBuffer::GetFloatingLayoutMode())
{
if (partialExtents)
{
@ -5394,7 +5408,7 @@ bool wxRichTextParagraph::GetRangeSize(const wxRichTextRange& range, wxSize& siz
{
wxRichTextObject* child = node2->GetData();
if (!child->IsFloating() && !child->GetRange().IsOutside(lineRange))
if ((!child->IsFloating() || !wxRichTextBuffer::GetFloatingLayoutMode()) && !child->GetRange().IsOutside(lineRange))
{
wxRichTextRange rangeToUse = lineRange;
rangeToUse.LimitTo(child->GetRange());
@ -6948,6 +6962,7 @@ wxRichTextFieldTypeHashMap wxRichTextBuffer::sm_fieldTypes;
wxRichTextRenderer* wxRichTextBuffer::sm_renderer = NULL;
int wxRichTextBuffer::sm_bulletRightMargin = 20;
float wxRichTextBuffer::sm_bulletProportion = (float) 0.3;
bool wxRichTextBuffer::sm_floatingLayoutMode = true;
/// Initialisation
void wxRichTextBuffer::Init()
@ -10285,7 +10300,7 @@ bool wxRichTextAction::Do()
ApplyParagraphs(GetNewParagraphs());
// Invalidate the whole buffer if there were floating objects
if (container->GetFloatingObjectCount() > 0)
if (wxRichTextBuffer::GetFloatingLayoutMode() && container->GetFloatingObjectCount() > 0)
m_buffer->InvalidateHierarchy(wxRICHTEXT_ALL);
else
{
@ -10321,7 +10336,7 @@ bool wxRichTextAction::Do()
// InvalidateHierarchy goes up the hierarchy as well as down, otherwise with a nested object,
// Layout() would stop prematurely at the top level.
// Invalidate the whole buffer if there were floating objects
if (container->GetFloatingObjectCount() > 0)
if (wxRichTextBuffer::GetFloatingLayoutMode() && container->GetFloatingObjectCount() > 0)
m_buffer->InvalidateHierarchy(wxRICHTEXT_ALL);
else
container->InvalidateHierarchy(GetRange());
@ -10358,7 +10373,7 @@ bool wxRichTextAction::Do()
// InvalidateHierarchy goes up the hierarchy as well as down, otherwise with a nested object,
// Layout() would stop prematurely at the top level.
// Invalidate the whole buffer if there were floating objects
if (container->GetFloatingObjectCount() > 0)
if (wxRichTextBuffer::GetFloatingLayoutMode() && container->GetFloatingObjectCount() > 0)
m_buffer->InvalidateHierarchy(wxRICHTEXT_ALL);
else
container->InvalidateHierarchy(GetRange());
@ -10504,7 +10519,7 @@ void wxRichTextAction::UpdateAppearance(long caretPosition, bool sendUpdateEvent
// Refresh everything if there were floating objects or the container changed size
// (we can't yet optimize in these cases, since more complex interaction with other content occurs)
if (container->GetFloatingObjectCount() > 0 || (container->GetParent() && containerRect != container->GetRect()))
if ((wxRichTextBuffer::GetFloatingLayoutMode() && container->GetFloatingObjectCount() > 0) || (container->GetParent() && containerRect != container->GetRect()))
{
m_ctrl->Refresh(false);
}