diff options
Diffstat (limited to 'indra/llui')
| -rw-r--r-- | indra/llui/llfloater.cpp | 10 | ||||
| -rw-r--r-- | indra/llui/llfolderviewmodel.h | 2 | ||||
| -rw-r--r-- | indra/llui/llscrolllistctrl.cpp | 64 | ||||
| -rw-r--r-- | indra/llui/llurlentry.cpp | 39 | ||||
| -rw-r--r-- | indra/llui/llurlentry.h | 13 | ||||
| -rw-r--r-- | indra/llui/llurlregistry.cpp | 1 | ||||
| -rw-r--r-- | indra/llui/tests/llurlentry_test.cpp | 34 | 
7 files changed, 142 insertions, 21 deletions
| diff --git a/indra/llui/llfloater.cpp b/indra/llui/llfloater.cpp index abb043f428..e9c980ad9a 100644 --- a/indra/llui/llfloater.cpp +++ b/indra/llui/llfloater.cpp @@ -303,12 +303,10 @@ void LLFloater::initFloater(const Params& p)  		mButtonsEnabled[BUTTON_CLOSE] = TRUE;  	} -	// Help button: '?' -	if ( !mHelpTopic.empty() ) -	{ -		mButtonsEnabled[BUTTON_HELP] = TRUE; -	} - +	// Help button: '?'  +	//SL-14050 Disable all Help question marks +	mButtonsEnabled[BUTTON_HELP] = FALSE; +	  	// Minimize button only for top draggers  	if ( !mDragOnLeft && mCanMinimize )  	{ diff --git a/indra/llui/llfolderviewmodel.h b/indra/llui/llfolderviewmodel.h index 4739d4e6fe..e62b2779dd 100644 --- a/indra/llui/llfolderviewmodel.h +++ b/indra/llui/llfolderviewmodel.h @@ -286,7 +286,7 @@ public:  	typedef std::list<LLFolderViewModelItem*> child_list_t;  	virtual void addChild(LLFolderViewModelItem* child)  -	{ +	{   		mChildren.push_back(child);  		child->setParent(this);   		dirtyFilter(); diff --git a/indra/llui/llscrolllistctrl.cpp b/indra/llui/llscrolllistctrl.cpp index 367c6c3c5b..a6e4f3a2af 100644 --- a/indra/llui/llscrolllistctrl.cpp +++ b/indra/llui/llscrolllistctrl.cpp @@ -763,14 +763,20 @@ void LLScrollListCtrl::updateColumns(bool force_update)  		}  	} +	bool header_changed_width = false;  	// expand last column header we encountered to full list width  	if (last_header)  	{ +		S32 old_width = last_header->getColumn()->getWidth();  		S32 new_width = llmax(0, mItemListRect.mRight - last_header->getRect().mLeft);  		last_header->reshape(new_width, last_header->getRect().getHeight());  		last_header->setVisible(mDisplayColumnHeaders && new_width > 0); -		last_header->getColumn()->setWidth(new_width); -	} +        if (old_width != new_width) +        { +            last_header->getColumn()->setWidth(new_width); +            header_changed_width = true; +        } +    }  	// propagate column widths to individual cells  	if (columns_changed_width || force_update) @@ -789,6 +795,20 @@ void LLScrollListCtrl::updateColumns(bool force_update)  			}  		}  	} +    else if (header_changed_width) +    { +        item_list::iterator iter; +        S32 index = last_header->getColumn()->mIndex; // Not always identical to last column! +        for (iter = mItemList.begin(); iter != mItemList.end(); iter++) +        { +            LLScrollListItem *itemp = *iter; +            LLScrollListCell* cell = itemp->getColumn(index); +            if (cell) +            { +                cell->setWidth(last_header->getColumn()->getWidth()); +            } +        } +    }  }  void LLScrollListCtrl::setHeadingHeight(S32 heading_height) @@ -1381,18 +1401,34 @@ BOOL LLScrollListCtrl::setSelectedByValue(const LLSD& value, BOOL selected)  	for (iter = mItemList.begin(); iter != mItemList.end(); iter++)  	{  		LLScrollListItem* item = *iter; -		if (item->getEnabled() && (item->getValue().asString() == value.asString())) -		{ -			if (selected) -			{ -				selectItem(item); -			} -			else -			{ -				deselectItem(item); -			} -			found = TRUE; -			break; +		if (item->getEnabled()) +		{ +            if (value.isBinary()) +            { +                if (item->getValue().isBinary()) +                { +                    LLSD::Binary data1 = value.asBinary(); +                    LLSD::Binary data2 = item->getValue().asBinary(); +                    found = std::equal(data1.begin(), data1.end(), data2.begin()) ? TRUE : FALSE; +                } +            } +            else +            { +                found = item->getValue().asString() == value.asString() ? TRUE : FALSE; +            } + +            if (found) +            { +                if (selected) +                { +                    selectItem(item); +                } +                else +                { +                    deselectItem(item); +                } +                break; +            }  		}  	} diff --git a/indra/llui/llurlentry.cpp b/indra/llui/llurlentry.cpp index 72447b4000..20dda54771 100644 --- a/indra/llui/llurlentry.cpp +++ b/indra/llui/llurlentry.cpp @@ -1507,4 +1507,43 @@ void LLUrlEntryExperienceProfile::onExperienceDetails( const LLSD& experience_de      callObservers(experience_details[LLExperienceCache::EXPERIENCE_ID].asString(), name, LLStringUtil::null);  } +// +// LLUrlEntryEmail Describes an IPv6 address +// +LLUrlEntryIPv6::LLUrlEntryIPv6() +	: LLUrlEntryBase() +{ +	mHostPath = "https?://\\[([a-f0-9:]+:+)+[a-f0-9]+]"; +	mPattern = boost::regex(mHostPath + "(:\\d{1,5})?(/\\S*)?", +		boost::regex::perl | boost::regex::icase); +	mMenuName = "menu_url_http.xml"; +	mTooltip = LLTrans::getString("TooltipHttpUrl"); +} +std::string LLUrlEntryIPv6::getLabel(const std::string &url, const LLUrlLabelCallback &cb) +{ +	boost::regex regex = boost::regex(mHostPath, boost::regex::perl | boost::regex::icase); +	boost::match_results<std::string::const_iterator> matches; + +	if (boost::regex_search(url, matches, regex)) +	{ +		return  url.substr(0, matches[0].length()); +	} +	else +	{ +		return url; +	} +} + +std::string LLUrlEntryIPv6::getQuery(const std::string &url) const +{ +	boost::regex regex = boost::regex(mHostPath, boost::regex::perl | boost::regex::icase); +	boost::match_results<std::string::const_iterator> matches; + +	return boost::regex_replace(url, regex, ""); +} + +std::string LLUrlEntryIPv6::getUrl(const std::string &string) const +{ +	return string; +} diff --git a/indra/llui/llurlentry.h b/indra/llui/llurlentry.h index 61aa94a813..4af1ab5096 100644 --- a/indra/llui/llurlentry.h +++ b/indra/llui/llurlentry.h @@ -525,5 +525,18 @@ public:  	/*virtual*/ std::string getUrl(const std::string &string) const;  }; +/// +/// LLUrlEntryEmail Describes an IPv6 address +/// +class LLUrlEntryIPv6 : public LLUrlEntryBase +{ +public: +	LLUrlEntryIPv6(); +	/*virtual*/ std::string getLabel(const std::string &url, const LLUrlLabelCallback &cb); +	/*virtual*/ std::string getUrl(const std::string &string) const; +	/*virtual*/ std::string getQuery(const std::string &url) const; + +	std::string mHostPath; +};  #endif diff --git a/indra/llui/llurlregistry.cpp b/indra/llui/llurlregistry.cpp index ba6fa1e2e9..321a0ec5b9 100644 --- a/indra/llui/llurlregistry.cpp +++ b/indra/llui/llurlregistry.cpp @@ -79,6 +79,7 @@ LLUrlRegistry::LLUrlRegistry()  	mUrlEntrySLLabel = new LLUrlEntrySLLabel();  	registerUrl(mUrlEntrySLLabel);  	registerUrl(new LLUrlEntryEmail()); +	registerUrl(new LLUrlEntryIPv6());  }  LLUrlRegistry::~LLUrlRegistry() diff --git a/indra/llui/tests/llurlentry_test.cpp b/indra/llui/tests/llurlentry_test.cpp index 3c34fd269e..4a4fdb72e3 100644 --- a/indra/llui/tests/llurlentry_test.cpp +++ b/indra/llui/tests/llurlentry_test.cpp @@ -903,4 +903,38 @@ namespace tut  				  "and even no www something lindenlab.com",  				  "");  	} + +	template<> template<> +	void object::test<16>() +	{ +		// +		// test LLUrlEntryIPv6 +		// +		LLUrlEntryIPv6 url; + +		// Regex tests. +		testRegex("match urls with a protocol", url, +			"this url should match http://[::1]", +			"http://[::1]"); + +		testRegex("match urls with a protocol and query", url, +			"this url should match http://[::1]/file.mp3", +			"http://[::1]/file.mp3"); + +		testRegex("match urls with a protocol", url, +			"this url should match http://[2001:0db8:11a3:09d7:1f34:8a2e:07a0:765d]", +			"http://[2001:0db8:11a3:09d7:1f34:8a2e:07a0:765d]"); + +		testRegex("match urls with port", url, +			"let's specify some port http://[2001:0db8:11a3:09d7:1f34:8a2e:07a0:765d]:8080", +			"http://[2001:0db8:11a3:09d7:1f34:8a2e:07a0:765d]:8080"); + +		testRegex("don't match urls w/o protocol", url, +			"looks like an url something [2001:0db8:11a3:09d7:1f34:8a2e:07a0:765d] but no https prefix", +			""); + +		testRegex("don't match incorrect urls", url, +			"http://[ 2001:0db8:11a3:09d7:1f34:8a2e:07a0:765d ]", +			""); +	}  } | 
