From 977dd845346cae05eab2249945f083df47552c8f Mon Sep 17 00:00:00 2001
From: richard <none@none>
Date: Mon, 26 Oct 2009 14:25:45 -0700
Subject: tweaked clipping rect for scroll containers to not overlap vertical
 scrollbar fixed reflow logic when resizing text editors that contain widgets
 (would make text appear and disappear)

reviewed by James
---
 indra/llui/llscrollcontainer.cpp |   2 +-
 indra/llui/lltextbase.cpp        | 113 ++++++++++++++++++++-------------------
 indra/llui/lltextbase.h          |   2 +-
 indra/llui/lltexteditor.cpp      |   2 +-
 4 files changed, 60 insertions(+), 59 deletions(-)

(limited to 'indra')

diff --git a/indra/llui/llscrollcontainer.cpp b/indra/llui/llscrollcontainer.cpp
index d8606c6889..5e17372fe9 100644
--- a/indra/llui/llscrollcontainer.cpp
+++ b/indra/llui/llscrollcontainer.cpp
@@ -432,7 +432,7 @@ void LLScrollContainer::draw()
 
 			LLLocalClipRect clip(LLRect(mInnerRect.mLeft, 
 					mInnerRect.mBottom + (show_h_scrollbar ? scrollbar_size : 0) + visible_height,
-					visible_width,
+					mInnerRect.mRight - (show_v_scrollbar ? scrollbar_size: 0),
 					mInnerRect.mBottom + (show_h_scrollbar ? scrollbar_size : 0)
 					));
 			drawChild(mScrolledView);
diff --git a/indra/llui/lltextbase.cpp b/indra/llui/lltextbase.cpp
index 9b976466eb..0add3fb500 100644
--- a/indra/llui/lltextbase.cpp
+++ b/indra/llui/lltextbase.cpp
@@ -232,7 +232,7 @@ LLTextBase::LLTextBase(const LLTextBase::Params &p)
 
 	createDefaultSegment();
 
-	updateTextRect();
+	updateRects();
 }
 
 LLTextBase::~LLTextBase()
@@ -940,7 +940,7 @@ void LLTextBase::reshape(S32 width, S32 height, BOOL called_from_parent)
 
 	// do this first after reshape, because other things depend on
 	// up-to-date mTextRect
-	updateTextRect();
+	updateRects();
 	
 	needsReflow();
 }
@@ -1160,60 +1160,8 @@ void LLTextBase::reflow(S32 start_index)
 			}
 		}
 
-		if (mLineInfoList.empty()) 
-		{
-			mContentsRect = LLRect(0, mVPad, mHPad, 0);
-		}
-		else
-		{
-
-			mContentsRect = mLineInfoList.begin()->mRect;
-			for (line_list_t::const_iterator line_iter = ++mLineInfoList.begin();
-				line_iter != mLineInfoList.end();
-				++line_iter)
-			{
-				mContentsRect.unionWith(line_iter->mRect);
-			}
-
-			mContentsRect.mRight += mHPad;
-			mContentsRect.mTop += mVPad;
-			// get around rounding errors when clipping text against rectangle
-			mContentsRect.stretch(1);
-		}
-
-		// change mDocumentView size to accomodate reflowed text
-		LLRect document_rect;
-		if (mScroller)
-		{
-			// document is size of scroller or size of text contents, whichever is larger
-			document_rect.setOriginAndSize(0, 0, 
-										mScroller->getContentWindowRect().getWidth(), 
-										llmax(mScroller->getContentWindowRect().getHeight(), mContentsRect.getHeight()));
-		}
-		else
-		{
-			// document size is just extents of reflowed text, reset to origin 0,0
-			document_rect.set(0, 
-							getLocalRect().getHeight(), 
-							getLocalRect().getWidth(), 
-							llmin(0, getLocalRect().getHeight() - mContentsRect.getHeight()));
-		}
-		mDocumentView->setShape(document_rect);
-
-		// after making document big enough to hold all the text, move the text to fit in the document
-		if (!mLineInfoList.empty())
-		{
-			S32 delta_pos = mDocumentView->getRect().getHeight() - mLineInfoList.begin()->mRect.mTop - mVPad;
-			// move line segments to fit new document rect
-			for (line_list_t::iterator it = mLineInfoList.begin(); it != mLineInfoList.end(); ++it)
-			{
-				it->mRect.translate(0, delta_pos);
-			}
-			mContentsRect.translate(0, delta_pos);
-		}
-
 		// calculate visible region for diplaying text
-		updateTextRect();
+		updateRects();
 
 		for (segment_set_t::iterator segment_it = mSegments.begin();
 			segment_it != mSegments.end();
@@ -2081,8 +2029,30 @@ S32 LLTextBase::getEditableIndex(S32 index, bool increasing_direction)
 	}
 }
 
-void LLTextBase::updateTextRect()
+void LLTextBase::updateRects()
 {
+	if (mLineInfoList.empty()) 
+	{
+		mContentsRect = LLRect(0, mVPad, mHPad, 0);
+	}
+	else
+	{
+
+		mContentsRect = mLineInfoList.begin()->mRect;
+		for (line_list_t::const_iterator line_iter = ++mLineInfoList.begin();
+			line_iter != mLineInfoList.end();
+			++line_iter)
+		{
+			mContentsRect.unionWith(line_iter->mRect);
+		}
+
+		mContentsRect.mRight += mHPad;
+		mContentsRect.mTop += mVPad;
+		// get around rounding errors when clipping text against rectangle
+		mContentsRect.stretch(1);
+	}
+
+
 	LLRect old_text_rect = mTextRect;
 	mTextRect = mScroller ? mScroller->getContentWindowRect() : getLocalRect();
 	//FIXME: replace border with image?
@@ -2096,6 +2066,37 @@ void LLTextBase::updateTextRect()
 	{
 		needsReflow();
 	}
+
+	// change document rect size too
+	LLRect document_rect;
+	if (mScroller)
+	{
+		// document is size of scroller or size of text contents, whichever is larger
+		document_rect.setOriginAndSize(0, 0, 
+									mScroller->getContentWindowRect().getWidth(), 
+									llmax(mScroller->getContentWindowRect().getHeight(), mContentsRect.getHeight()));
+	}
+	else
+	{
+		// document size is just extents of reflowed text, reset to origin 0,0
+		document_rect.set(0, 
+						getLocalRect().getHeight(), 
+						getLocalRect().getWidth(), 
+						llmin(0, getLocalRect().getHeight() - mContentsRect.getHeight()));
+	}
+	mDocumentView->setShape(document_rect);
+
+	// after making document big enough to hold all the text, move the text to fit in the document
+	if (!mLineInfoList.empty())
+	{
+		S32 delta_pos = mDocumentView->getRect().getHeight() - mLineInfoList.begin()->mRect.mTop - mVPad;
+		// move line segments to fit new document rect
+		for (line_list_t::iterator it = mLineInfoList.begin(); it != mLineInfoList.end(); ++it)
+		{
+			it->mRect.translate(0, delta_pos);
+		}
+		mContentsRect.translate(0, delta_pos);
+	}
 }
 
 
diff --git a/indra/llui/lltextbase.h b/indra/llui/lltextbase.h
index f0b8878491..d0787f001e 100644
--- a/indra/llui/lltextbase.h
+++ b/indra/llui/lltextbase.h
@@ -294,7 +294,7 @@ protected:
 	void 							endSelection();
 
 	// misc
-	void							updateTextRect();
+	void							updateRects();
 	void							needsReflow() { mReflowNeeded = TRUE; }
 	void							needsScroll() { mScrollNeeded = TRUE; }
 	void							replaceUrlLabel(const std::string &url, const std::string &label);
diff --git a/indra/llui/lltexteditor.cpp b/indra/llui/lltexteditor.cpp
index d507cf7ce4..0ca9a18e0c 100644
--- a/indra/llui/lltexteditor.cpp
+++ b/indra/llui/lltexteditor.cpp
@@ -273,7 +273,7 @@ LLTextEditor::LLTextEditor(const LLTextEditor::Params& p) :
 	if (mShowLineNumbers)
 	{
 		mHPad += UI_TEXTEDITOR_LINE_NUMBER_MARGIN;
-		updateTextRect();
+		updateRects();
 	}
 }
 
-- 
cgit v1.2.3