diff options
Diffstat (limited to 'indra')
| -rw-r--r-- | indra/cmake/LLAddBuildTest.cmake | 2 | ||||
| -rw-r--r-- | indra/llcommon/lldate.h | 2 | ||||
| -rw-r--r-- | indra/llcommon/tests/llstring_test.cpp | 1 | ||||
| -rw-r--r-- | indra/llmessage/tests/llhost_test.cpp | 16 | ||||
| -rw-r--r-- | indra/llui/llfloater.cpp | 10 | ||||
| -rw-r--r-- | indra/llui/llfloater.h | 8 | ||||
| -rw-r--r-- | indra/llui/llfloaterreg.cpp | 11 | ||||
| -rw-r--r-- | indra/llui/llfloaterreglistener.cpp | 48 | ||||
| -rw-r--r-- | indra/llui/llfloaterreglistener.h | 1 | ||||
| -rw-r--r-- | indra/llui/llview.cpp | 12 | ||||
| -rw-r--r-- | indra/llui/llview.h | 5 | ||||
| -rw-r--r-- | indra/newview/llappviewer.cpp | 2 | ||||
| -rw-r--r-- | indra/newview/llappviewerlistener.cpp | 17 | ||||
| -rw-r--r-- | indra/newview/llappviewerlistener.h | 7 | 
14 files changed, 119 insertions, 23 deletions
| diff --git a/indra/cmake/LLAddBuildTest.cmake b/indra/cmake/LLAddBuildTest.cmake index 499bf19afd..d8f64199cf 100644 --- a/indra/cmake/LLAddBuildTest.cmake +++ b/indra/cmake/LLAddBuildTest.cmake @@ -1,5 +1,6 @@  # -*- cmake -*-  include(LLTestCommand) +include(GoogleMock)  MACRO(LL_ADD_PROJECT_UNIT_TESTS project sources)    # Given a project name and a list of sourcefiles (with optional properties on each), @@ -190,6 +191,7 @@ FUNCTION(LL_ADD_INTEGRATION_TEST    SET(libraries      ${library_dependencies} +    ${GOOGLEMOCK_LIBRARIES}      ${PTHREAD_LIBRARY}      ) diff --git a/indra/llcommon/lldate.h b/indra/llcommon/lldate.h index b7d8b32030..f8b2f2f163 100644 --- a/indra/llcommon/lldate.h +++ b/indra/llcommon/lldate.h @@ -35,8 +35,6 @@  #ifndef LL_LLDATE_H  #define LL_LLDATE_H -#include "linden_common.h" -  #include <iosfwd>  #include <string> diff --git a/indra/llcommon/tests/llstring_test.cpp b/indra/llcommon/tests/llstring_test.cpp index 6a2ebc61f5..beba55416a 100644 --- a/indra/llcommon/tests/llstring_test.cpp +++ b/indra/llcommon/tests/llstring_test.cpp @@ -32,6 +32,7 @@   * $/LicenseInfo$   */ +#include "linden_common.h"  #include "../test/lltut.h"  #include "../llstring.h" diff --git a/indra/llmessage/tests/llhost_test.cpp b/indra/llmessage/tests/llhost_test.cpp index 6dbdcb86e7..4c9e75456a 100644 --- a/indra/llmessage/tests/llhost_test.cpp +++ b/indra/llmessage/tests/llhost_test.cpp @@ -166,7 +166,21 @@ namespace tut  		// the main domain name and not do the exact compare  		std::string hostname = host.getHostName(); -		ensure("getHostName failed", hostname.find(hostStr) != std::string::npos); +/*==========================================================================*| +		// nat 2009-10-20: not sure this ensure() is such a good idea, at +		// least with "google.com". The logic below is failing for me with: +		// set 'google.com'; reported 'yx-in-f100.1e100.net' +		// Disabling test until we can replace it with something more robust. +		try +		{ +			ensure("getHostName failed", hostname.find(hostStr) != std::string::npos); +		} +		catch (const std::exception&) +		{ +			std::cerr << "set '" << hostStr << "'; reported '" << hostname << "'" << std::endl; +			throw; +		} +|*==========================================================================*/  	}  //	setHostByName for dotted IP diff --git a/indra/llui/llfloater.cpp b/indra/llui/llfloater.cpp index cad1fd1a33..021e2e94ac 100644 --- a/indra/llui/llfloater.cpp +++ b/indra/llui/llfloater.cpp @@ -2619,3 +2619,13 @@ bool LLFloater::initFloaterXML(LLXMLNodePtr node, LLView *parent, LLXMLNodePtr o  	return true; // *TODO: Error checking  } +bool LLFloater::isShown() const +{ +    return ! isMinimized() && isInVisibleChain(); +} + +/* static */ +bool LLFloater::isShown(const LLFloater* floater) +{ +    return floater && floater->isShown(); +} diff --git a/indra/llui/llfloater.h b/indra/llui/llfloater.h index 366f146821..2fdaecf59a 100644 --- a/indra/llui/llfloater.h +++ b/indra/llui/llfloater.h @@ -185,7 +185,13 @@ public:  	void			addDependentFloater(LLHandle<LLFloater> dependent_handle, BOOL reposition = TRUE);  	LLFloater*		getDependee() { return (LLFloater*)mDependeeHandle.get(); }  	void		removeDependentFloater(LLFloater* dependent); -	BOOL			isMinimized()					{ return mMinimized; } +	BOOL			isMinimized() const				{ return mMinimized; } +	/// isShown() differs from getVisible() in that isShown() also considers +	/// isMinimized(). isShown() is true only if visible and not minimized. +	bool			isShown() const; +	/// The static isShown() can accept a NULL pointer (which of course +	/// returns false). When non-NULL, it calls the non-static isShown(). +	static bool		isShown(const LLFloater* floater);  	BOOL			isFrontmost();  	BOOL			isDependent()					{ return !mDependeeHandle.isDead(); }  	void			setCanMinimize(BOOL can_minimize); diff --git a/indra/llui/llfloaterreg.cpp b/indra/llui/llfloaterreg.cpp index 8e56951dbf..3c5a8a6921 100644 --- a/indra/llui/llfloaterreg.cpp +++ b/indra/llui/llfloaterreg.cpp @@ -252,7 +252,7 @@ bool LLFloaterReg::hideInstance(const std::string& name, const LLSD& key)  bool LLFloaterReg::toggleInstance(const std::string& name, const LLSD& key)  {  	LLFloater* instance = findInstance(name, key);  -	if (instance && !instance->isMinimized() && instance->isInVisibleChain()) +	if (LLFloater::isShown(instance))  	{  		// When toggling *visibility*, close the host instead of the floater when hosted  		if (instance->getHost()) @@ -272,14 +272,7 @@ bool LLFloaterReg::toggleInstance(const std::string& name, const LLSD& key)  bool LLFloaterReg::instanceVisible(const std::string& name, const LLSD& key)  {  	LLFloater* instance = findInstance(name, key);  -	if (instance && !instance->isMinimized() && instance->isInVisibleChain()) -	{ -		return true; -	} -	else -	{ -		return false; -	} +	return LLFloater::isShown(instance);  }  //static diff --git a/indra/llui/llfloaterreglistener.cpp b/indra/llui/llfloaterreglistener.cpp index cb8fa6dfda..57d148b5af 100644 --- a/indra/llui/llfloaterreglistener.cpp +++ b/indra/llui/llfloaterreglistener.cpp @@ -18,6 +18,8 @@  // external library headers  // other Linden headers  #include "llfloaterreg.h" +#include "llfloater.h" +#include "llbutton.h"  LLFloaterRegListener::LLFloaterRegListener(const std::string& pumpName):      LLDispatchListener(pumpName, "op") @@ -28,6 +30,10 @@ LLFloaterRegListener::LLFloaterRegListener(const std::string& pumpName):      add("showInstance", &LLFloaterRegListener::showInstance, requiredName);      add("hideInstance", &LLFloaterRegListener::hideInstance, requiredName);      add("toggleInstance", &LLFloaterRegListener::toggleInstance, requiredName); +    LLSD requiredNameButton; +    requiredNameButton["name"] = LLSD(); +    requiredNameButton["button"] = LLSD(); +    add("clickButton", &LLFloaterRegListener::clickButton, requiredNameButton);  }  void LLFloaterRegListener::getBuildMap(const LLSD& event) const @@ -64,3 +70,45 @@ void LLFloaterRegListener::toggleInstance(const LLSD& event) const  {      LLFloaterReg::toggleInstance(event["name"], event["key"]);  } + +void LLFloaterRegListener::clickButton(const LLSD& event) const +{ +    // If the caller requests a reply, build the reply. +    LLReqID reqID(event); +    LLSD reply(reqID.makeResponse()); + +    LLFloater* floater = LLFloaterReg::findInstance(event["name"], event["key"]); +    if (! LLFloater::isShown(floater)) +    { +        reply["type"]  = "LLFloater"; +        reply["name"]  = event["name"]; +        reply["key"]   = event["key"]; +        reply["error"] = floater? "!isShown()" : "NULL"; +    } +    else +    { +        // Here 'floater' points to an LLFloater instance with the specified +        // name and key which isShown(). +        LLButton* button = floater->findChild<LLButton>(event["button"]); +        if (! LLButton::isAvailable(button)) +        { +            reply["type"]  = "LLButton"; +            reply["name"]  = event["button"]; +            reply["error"] = button? "!isAvailable()" : "NULL"; +        } +        else +        { +            // Here 'button' points to an isAvailable() LLButton child of +            // 'floater' with the specified button name. Pretend to click it. +            button->onCommit(); +            // Leave reply["error"] isUndefined(): no error, i.e. success. +        } +    } + +    // Send a reply only if caller asked for a reply. +    LLSD replyPump(event["reply"]); +    if (replyPump.isString())       // isUndefined() if absent +    { +        LLEventPumps::instance().obtain(replyPump).post(reply); +    } +} diff --git a/indra/llui/llfloaterreglistener.h b/indra/llui/llfloaterreglistener.h index 58d2c07936..304ecd1090 100644 --- a/indra/llui/llfloaterreglistener.h +++ b/indra/llui/llfloaterreglistener.h @@ -30,6 +30,7 @@ private:      void showInstance(const LLSD& event) const;      void hideInstance(const LLSD& event) const;      void toggleInstance(const LLSD& event) const; +    void clickButton(const LLSD& event) const;  };  #endif /* ! defined(LL_LLFLOATERREGLISTENER_H) */ diff --git a/indra/llui/llview.cpp b/indra/llui/llview.cpp index 31f12fe312..fe7fd59de8 100644 --- a/indra/llui/llview.cpp +++ b/indra/llui/llview.cpp @@ -438,6 +438,18 @@ void LLView::setEnabled(BOOL enabled)  }  //virtual +bool LLView::isAvailable() const +{ +    return isInEnabledChain() && isInVisibleChain(); +} + +//static +bool LLView::isAvailable(const LLView* view) +{ +    return view && view->isAvailable(); +} + +//virtual  BOOL LLView::setLabelArg( const std::string& key, const LLStringExplicit& text )  {  	return FALSE; diff --git a/indra/llui/llview.h b/indra/llui/llview.h index 73146b2c1f..c3b442e022 100644 --- a/indra/llui/llview.h +++ b/indra/llui/llview.h @@ -304,6 +304,11 @@ public:  	BOOL			getVisible() const			{ return mVisible; }  	virtual void	setEnabled(BOOL enabled);  	BOOL			getEnabled() const			{ return mEnabled; } +	/// 'available' in this context means 'visible and enabled': in other +	/// words, can a user actually interact with this? +	virtual bool	isAvailable() const; +	/// The static isAvailable() tests an LLView* that could be NULL. +	static bool		isAvailable(const LLView* view);  	U8              getSoundFlags() const       { return mSoundFlags; }  	virtual BOOL	setLabelArg( const std::string& key, const LLStringExplicit& text ); diff --git a/indra/newview/llappviewer.cpp b/indra/newview/llappviewer.cpp index 4cb3b92476..5b769dcab4 100644 --- a/indra/newview/llappviewer.cpp +++ b/indra/newview/llappviewer.cpp @@ -205,7 +205,7 @@  #pragma warning (disable:4702)  #endif -static LLAppViewerListener sAppViewerListener("LLAppViewer", NULL); +static LLAppViewerListener sAppViewerListener("LLAppViewer", LLAppViewer::instance);  ////// Windows-specific includes to the bottom - nasty defines in these pollute the preprocessor  // diff --git a/indra/newview/llappviewerlistener.cpp b/indra/newview/llappviewerlistener.cpp index a3af251a3c..3259309eee 100644 --- a/indra/newview/llappviewerlistener.cpp +++ b/indra/newview/llappviewerlistener.cpp @@ -19,19 +19,22 @@  // other Linden headers  #include "llappviewer.h" -LLAppViewerListener::LLAppViewerListener(const std::string& pumpname, LLAppViewer* llappviewer): +LLAppViewerListener::LLAppViewerListener(const std::string& pumpname, +                                         const LLAppViewerGetter& getter):      LLDispatchListener(pumpname, "op"), -    mAppViewer(llappviewer) +    mAppViewerGetter(getter)  {      // add() every method we want to be able to invoke via this event API.      add("requestQuit", &LLAppViewerListener::requestQuit); +    add("forceQuit", &LLAppViewerListener::forceQuit);  }  void LLAppViewerListener::requestQuit(const LLSD& event)  { -    if(mAppViewer == NULL) -    { -        mAppViewer = LLAppViewer::instance(); -    } -    mAppViewer->requestQuit(); +    mAppViewerGetter()->requestQuit(); +} + +void LLAppViewerListener::forceQuit(const LLSD& event) +{ +    mAppViewerGetter()->forceQuit();  } diff --git a/indra/newview/llappviewerlistener.h b/indra/newview/llappviewerlistener.h index d702f605ef..73227cb95a 100644 --- a/indra/newview/llappviewerlistener.h +++ b/indra/newview/llappviewerlistener.h @@ -13,6 +13,7 @@  #define LL_LLAPPVIEWERLISTENER_H  #include "lleventdispatcher.h" +#include <boost/function.hpp>  class LLAppViewer;  class LLSD; @@ -21,14 +22,16 @@ class LLSD;  class LLAppViewerListener: public LLDispatchListener  {  public: +    typedef boost::function<LLAppViewer*(void)> LLAppViewerGetter;      /// Specify the pump name on which to listen, and bind the LLAppViewer      /// instance to use (e.g. LLAppViewer::instance()). -    LLAppViewerListener(const std::string& pumpname, LLAppViewer* llappviewer); +    LLAppViewerListener(const std::string& pumpname, const LLAppViewerGetter& getter);  private:      void requestQuit(const LLSD& event); +    void forceQuit(const LLSD& event); -    LLAppViewer* mAppViewer; +    LLAppViewerGetter mAppViewerGetter;  };  #endif /* ! defined(LL_LLAPPVIEWERLISTENER_H) */ | 
