From d624c3f0d5d3f2667c34059b91a0952cf47cb360 Mon Sep 17 00:00:00 2001
From: andreykproductengine <andreykproductengine@lindenlab.com>
Date: Mon, 20 Jan 2020 16:59:27 +0200
Subject: [PATCH] SL-12595 The checkbox overlaps buttons in the 'Delete
 selected item?' notification

---
 indra/llui/llcheckboxctrl.cpp                 | 46 +++++++++++++++----
 indra/llui/llcheckboxctrl.h                   | 17 +++++++
 .../skins/default/xui/en/panel_login.xml      |  5 +-
 3 files changed, 55 insertions(+), 13 deletions(-)

diff --git a/indra/llui/llcheckboxctrl.cpp b/indra/llui/llcheckboxctrl.cpp
index f5b64d58b08..6a51c4240b5 100644
--- a/indra/llui/llcheckboxctrl.cpp
+++ b/indra/llui/llcheckboxctrl.cpp
@@ -47,10 +47,18 @@ static LLDefaultChildRegistry::Register<LLCheckBoxCtrl> r("check_box");
 template class LLCheckBoxCtrl* LLView::getChild<class LLCheckBoxCtrl>(
 	const std::string& name, BOOL recurse) const;
 
+void LLCheckBoxCtrl::WordWrap::declareValues()
+{
+    declare("none", EWordWrap::WRAP_NONE);
+    declare("down", EWordWrap::WRAP_DOWN);
+    declare("up", EWordWrap::WRAP_UP);
+}
+
 LLCheckBoxCtrl::Params::Params()
 :	initial_value("initial_value", false),
 	label_text("label_text"),
 	check_button("check_button"),
+	word_wrap("word_wrap", EWordWrap::WRAP_NONE),
 	radio_style("radio_style")
 {}
 
@@ -59,14 +67,14 @@ LLCheckBoxCtrl::LLCheckBoxCtrl(const LLCheckBoxCtrl::Params& p)
 :	LLUICtrl(p),
 	mTextEnabledColor(p.label_text.text_color()),
 	mTextDisabledColor(p.label_text.text_readonly_color()),
-	mFont(p.font())
+	mFont(p.font()),
+	mWordWrap(p.word_wrap)
 {
 	mViewModel->setValue(LLSD(p.initial_value));
 	mViewModel->resetDirty();
 	static LLUICachedControl<S32> llcheckboxctrl_spacing ("UICheckboxctrlSpacing", 0);
 	static LLUICachedControl<S32> llcheckboxctrl_hpad ("UICheckboxctrlHPad", 0);
 	static LLUICachedControl<S32> llcheckboxctrl_vpad ("UICheckboxctrlVPad", 0);
-	static LLUICachedControl<S32> llcheckboxctrl_btn_size ("UICheckboxctrlBtnSize", 0);
 
 	// must be big enough to hold all children
 	setUseBoundingRect(TRUE);
@@ -85,17 +93,35 @@ LLCheckBoxCtrl::LLCheckBoxCtrl(const LLCheckBoxCtrl::Params& p)
 	{
 		tbparams.font(p.font);
 	}
-	mLabel = LLUICtrlFactory::create<LLTextBox> (tbparams);
+
+    mLabel = LLUICtrlFactory::create<LLTextBox>(tbparams);
+    if (mWordWrap != WRAP_NONE)
+    {
+        // Not setWordWrap(mWordWrap != WRAP_NONE) because there might be some old lurking code that sets it manually
+        mLabel->setWordWrap(true);
+        S32 new_width = getRect().getWidth() - p.check_button.rect().getWidth() - llcheckboxctrl_hpad;
+        LLRect label_rect = mLabel->getRect();
+        label_rect.mRight = label_rect.mLeft + new_width;
+        mLabel->setRect(label_rect);
+    }
 	mLabel->reshapeToFitText();
+
 	LLRect label_rect = mLabel->getRect();
 	if (mLabel->getLineCount() > 1)
 	{
-		// reshapeToFitText uses LLView::reshape() which always reshapes
-		// from bottom to top, but we want to extend the bottom
-		// Note: might be better idea to use getRect().mTop of LLCheckBoxCtrl (+pad) as top point of new rect
-		S32 delta = ll_round((F32)mLabel->getFont()->getLineHeight() * mLabel->getLineSpacingMult()) - label_rect.getHeight();
-		label_rect.translate(0, delta);
-		mLabel->setRect(label_rect);
+        if (mWordWrap == WRAP_DOWN)
+        {
+            // reshapeToFitText uses LLView::reshape() which always reshapes
+            // from bottom to top, but we want to extend the bottom
+            // Note: might be better idea to use getRect().mTop of LLCheckBoxCtrl (+pad) as top point of new rect
+            S32 delta = ll_round((F32)mLabel->getFont()->getLineHeight() * mLabel->getLineSpacingMult()) - label_rect.getHeight();
+            label_rect.translate(0, delta);
+            mLabel->setRect(label_rect);
+        }
+        // else
+        // WRAP_UP is essentially done by reshapeToFitText() (extends from bottom to top)
+        // howhever it doesn't respect rect of checkbox
+        // todo: this should be fixed, but there are at least couple checkboxes that use this feature as is.
 	}
 
 	addChild(mLabel);
@@ -165,7 +191,7 @@ void LLCheckBoxCtrl::reshape(S32 width, S32 height, BOOL called_from_parent)
 	mLabel->reshapeToFitText();
 
 	LLRect label_rect = mLabel->getRect();
-	if (label_top != label_rect.mTop)
+	if (label_top != label_rect.mTop && mWordWrap == WRAP_DOWN)
 	{
 		// reshapeToFitText uses LLView::reshape() which always reshapes
 		// from bottom to top, but we want to extend the bottom so
diff --git a/indra/llui/llcheckboxctrl.h b/indra/llui/llcheckboxctrl.h
index 07ae9c3b186..eb5bd5b6da5 100644
--- a/indra/llui/llcheckboxctrl.h
+++ b/indra/llui/llcheckboxctrl.h
@@ -50,6 +50,19 @@ class LLCheckBoxCtrl
 , public ll::ui::SearchableControl
 {
 public:
+
+    enum EWordWrap
+    {
+        WRAP_NONE,
+        WRAP_UP,
+        WRAP_DOWN
+    };
+
+    struct WordWrap : public LLInitParam::TypeValuesHelper<EWordWrap, WordWrap>
+    {
+        static void declareValues();
+    };
+
 	struct Params 
 	:	public LLInitParam::Block<Params, LLUICtrl::Params>
 	{
@@ -58,6 +71,8 @@ class LLCheckBoxCtrl
 		Optional<LLTextBox::Params> label_text;
 		Optional<LLButton::Params> check_button;
 
+		Optional<EWordWrap, WordWrap>	word_wrap;
+
 		Ignored					radio_style;
 
 		Params();
@@ -129,6 +144,8 @@ class LLCheckBoxCtrl
 
 	LLUIColor		mTextEnabledColor;
 	LLUIColor		mTextDisabledColor;
+
+	EWordWrap		mWordWrap; // off, shifts text up, shifts text down
 };
 
 // Build time optimization, generate once in .cpp file
diff --git a/indra/newview/skins/default/xui/en/panel_login.xml b/indra/newview/skins/default/xui/en/panel_login.xml
index eab53c99854..58352509c40 100644
--- a/indra/newview/skins/default/xui/en/panel_login.xml
+++ b/indra/newview/skins/default/xui/en/panel_login.xml
@@ -148,11 +148,10 @@
     left="408"
     bottom_delta="0"
     label="Remember password"
-    label_text.word_wrap="true"
-    label_text.width="150"
+    word_wrap="down"
     check_button.bottom="3"
     name="remember_password"
-    width="170" />
+    width="165" />
   <combo_box
     allow_text_entry="false"
     font="SansSerifTiny"
-- 
GitLab