From e16c1f6fdd300f284f0b39b76b4e82f7366b5cdb Mon Sep 17 00:00:00 2001
From: Richard Nelson <none@none>
Date: Thu, 12 Aug 2010 10:08:39 -0700
Subject: [PATCH] forgot some files

---
 indra/newview/llhints.cpp | 250 ++++++++++++++++++++++++++++++++++++++
 indra/newview/llhints.h   |  51 ++++++++
 2 files changed, 301 insertions(+)
 create mode 100644 indra/newview/llhints.cpp
 create mode 100644 indra/newview/llhints.h

diff --git a/indra/newview/llhints.cpp b/indra/newview/llhints.cpp
new file mode 100644
index 00000000000..a8c31833019
--- /dev/null
+++ b/indra/newview/llhints.cpp
@@ -0,0 +1,250 @@
+/**
+ * @file llhints.cpp
+ * @brief Hint popups for displaying context sensitive help in a UI overlay
+ *
+ * $LicenseInfo:firstyear=2000&license=viewergpl$
+ *
+ * Copyright (c) 2000-2009, Linden Research, Inc.
+ *
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab.  Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ *
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ *
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ *
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+
+#include "llviewerprecompiledheaders.h" // must be first include
+
+#include "llhints.h"
+
+#include "llbutton.h"
+#include "lltextbox.h"
+#include "llviewerwindow.h"
+#include "llsdparam.h"
+
+class LLHintPopup : public LLPanel
+{
+public:
+
+	typedef enum e_popup_direction
+	{
+		LEFT,
+		TOP,
+		RIGHT,
+		BOTTOM
+	} EPopupDirection;
+
+	struct PopupDirections : public LLInitParam::TypeValuesHelper<LLHintPopup::EPopupDirection, PopupDirections>
+	{
+		static void declareValues()
+		{
+			declare("left", LLHintPopup::LEFT);
+			declare("right", LLHintPopup::RIGHT);
+			declare("top", LLHintPopup::TOP);
+			declare("bottom", LLHintPopup::BOTTOM);
+		}
+	};
+
+	struct Params : public LLInitParam::Block<Params, LLPanel::Params>
+	{
+		Mandatory<LLNotificationPtr>	notification;
+		Optional<std::string>			target;
+		Optional<EPopupDirection, PopupDirections>	direction;
+		Optional<S32>					distance;
+		Optional<LLUIImage*>			left_arrow,
+										up_arrow,
+										right_arrow,
+										down_arrow;									
+
+		Params()
+		:	direction("direction", TOP),
+			distance("distance", 24),
+			target("target"),
+			left_arrow("left_arrow", LLUI::getUIImage("hint_arrow_left")),
+			up_arrow("up_arrow", LLUI::getUIImage("hint_arrow_up")),
+			right_arrow("right_arrow", LLUI::getUIImage("hint_arrow_right")),
+			down_arrow("down_arrow", LLUI::getUIImage("hint_arrow_down"))
+		{}
+	};
+
+	LLHintPopup(const Params&);
+
+	void setHintTarget(LLHandle<LLView> target) { mTarget = target; }
+	/*virtual*/ BOOL postBuild();
+
+	void onClickClose() { hide(); }
+	void draw();
+	void hide() { die(); }
+
+private:
+	LLNotificationPtr	mNotification;
+	LLHandle<LLView>	mTarget;
+	EPopupDirection		mDirection;
+	S32					mDistance;
+	LLUIImagePtr		mArrowLeft,
+						mArrowUp,
+						mArrowRight,
+						mArrowDown;
+};
+
+
+
+
+LLHintPopup::LLHintPopup(const LLHintPopup::Params& p)
+:	mNotification(p.notification),
+	mDirection(p.direction),
+	mDistance(p.distance),
+	mTarget(LLHints::getHintTarget(p.target)),
+	mArrowLeft(p.left_arrow),
+	mArrowUp(p.up_arrow),
+	mArrowRight(p.right_arrow),
+	mArrowDown(p.down_arrow),
+	LLPanel(p)
+{
+	LLUICtrlFactory::getInstance()->buildPanel(this, "panel_hint.xml");
+}
+
+BOOL LLHintPopup::postBuild()
+{
+	LLTextBox& hint_text = getChildRef<LLTextBox>("hint_text");
+	hint_text.setText(mNotification->getMessage());
+	
+	getChild<LLButton>("close")->setClickedCallback(boost::bind(&LLHintPopup::onClickClose, this));
+	getChild<LLTextBox>("hint_title")->setText(mNotification->getLabel());
+
+	LLRect text_bounds = hint_text.getTextBoundingRect();
+	S32 delta_height = text_bounds.getHeight() - hint_text.getRect().getHeight();
+	reshape(getRect().getWidth(), getRect().getHeight() + delta_height);
+	return TRUE;
+}
+
+void LLHintPopup::draw()
+{
+	LLView* targetp = mTarget.get();
+	if (!targetp || !targetp->isInVisibleChain()) 
+	{
+		hide();
+	}
+	else
+	{
+		LLRect target_rect;
+		targetp->localRectToOtherView(targetp->getLocalRect(), &target_rect, getParent());
+
+		LLRect my_local_rect = getLocalRect();
+		LLRect my_rect = getRect();
+		LLRect arrow_rect;
+		LLUIImagePtr arrow_imagep;
+
+		const S32 OVERLAP = 5;
+
+		switch(mDirection)
+		{
+		case LEFT:
+			my_rect.setCenterAndSize(	target_rect.mLeft - (my_rect.getWidth() / 2 + mDistance), 
+										target_rect.getCenterY(), 
+										my_rect.getWidth(), 
+										my_rect.getHeight());
+			arrow_rect.setCenterAndSize(my_local_rect.mRight + mArrowRight->getWidth() / 2 - OVERLAP,
+										my_local_rect.getCenterY(),
+										mArrowRight->getWidth(), 
+										mArrowRight->getHeight());
+			arrow_imagep = mArrowRight;
+			break;
+		case TOP:
+			my_rect.setCenterAndSize(	target_rect.getCenterX(), 
+										target_rect.mTop + (my_rect.getHeight() / 2 + mDistance), 
+										my_rect.getWidth(), 
+										my_rect.getHeight());
+			arrow_rect.setCenterAndSize(my_local_rect.getCenterX(),
+										my_local_rect.mBottom - mArrowDown->getHeight() / 2 + OVERLAP,
+										mArrowDown->getWidth(), 
+										mArrowDown->getHeight());
+			arrow_imagep = mArrowDown;
+			break;
+		case RIGHT:
+			my_rect.setCenterAndSize(	target_rect.getCenterX(), 
+										target_rect.mTop - (my_rect.getHeight() / 2 + mDistance), 
+										my_rect.getWidth(), 
+										my_rect.getHeight());
+			arrow_rect.setCenterAndSize(my_local_rect.mLeft - mArrowLeft->getWidth() / 2 + OVERLAP,
+										my_local_rect.getCenterY(),
+										mArrowLeft->getWidth(), 
+										mArrowLeft->getHeight());
+			arrow_imagep = mArrowLeft;
+			break;
+		case BOTTOM:
+			my_rect.setCenterAndSize(	target_rect.mLeft + (my_rect.getWidth() / 2 + mDistance), 
+										target_rect.getCenterY(), 
+										my_rect.getWidth(), 
+										my_rect.getHeight());
+			arrow_rect.setCenterAndSize(my_local_rect.getCenterX(),
+										my_local_rect.mTop + mArrowUp->getHeight() / 2 - OVERLAP,
+										mArrowUp->getWidth(), 
+										mArrowUp->getHeight());
+			arrow_imagep = mArrowUp;
+			break;
+		}
+		setShape(my_rect);
+		LLPanel::draw();
+
+		arrow_imagep->draw(arrow_rect);
+	}
+}
+
+
+LLRegistry<std::string, LLHandle<LLView> > LLHints::sTargetRegistry;
+
+//static
+void LLHints::show(LLNotificationPtr hint)
+{
+	LLHintPopup::Params p;
+	LLParamSDParser::instance().readSD(hint->getPayload(), p);
+
+	p.notification = hint;
+
+	LLHintPopup* popup = new LLHintPopup(p);
+	LLView* hint_holder = gViewerWindow->getHintHolder();
+	if (hint_holder)
+	{
+		hint_holder->addChild(popup);
+		popup->centerWithin(hint_holder->getLocalRect());
+	}
+}
+
+//static
+void LLHints::registerHintTarget(const std::string& name, LLHandle<LLView> target)
+{
+	sTargetRegistry.defaultRegistrar().add(name, target);
+}
+
+//static 
+LLHandle<LLView> LLHints::getHintTarget(const std::string& name)
+{
+	LLHandle<LLView>* handlep = sTargetRegistry.getValue(name);
+	if (handlep) 
+	{
+		return *handlep;
+	}
+	else
+	{
+		return LLHandle<LLView>();
+	}
+}
diff --git a/indra/newview/llhints.h b/indra/newview/llhints.h
new file mode 100644
index 00000000000..b5255db95be
--- /dev/null
+++ b/indra/newview/llhints.h
@@ -0,0 +1,51 @@
+/**
+ * @file llhints.h
+ * @brief Hint popups for displaying context sensitive help in a UI overlay
+ *
+ * $LicenseInfo:firstyear=2000&license=viewergpl$
+ *
+ * Copyright (c) 2000-2009, Linden Research, Inc.
+ *
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab.  Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ *
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ *
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ *
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+#ifndef LL_LLHINTS_H
+#define LL_LLHINTS_H
+
+#include "llpanel.h"
+#include "llnotifications.h"
+
+
+class LLHints
+{
+public:
+	static void show(LLNotificationPtr hint);
+	static void registerHintTarget(const std::string& name, LLHandle<LLView> target);
+	static LLHandle<LLView> getHintTarget(const std::string& name);
+private:
+	static LLRegistry<std::string, LLHandle<LLView> > sTargetRegistry;
+};
+
+
+#endif
\ No newline at end of file
-- 
GitLab