Automated merge with ssh://hg.lindenlab.com/viewer/viewer-2-0/

master
Nat Goodspeed 2009-10-20 11:34:46 -04:00
commit aa75245a1a
14 changed files with 119 additions and 23 deletions

View File

@ -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}
)

View File

@ -35,8 +35,6 @@
#ifndef LL_LLDATE_H
#define LL_LLDATE_H
#include "linden_common.h"
#include <iosfwd>
#include <string>

View File

@ -32,6 +32,7 @@
* $/LicenseInfo$
*/
#include "linden_common.h"
#include "../test/lltut.h"
#include "../llstring.h"

View File

@ -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

View File

@ -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();
}

View File

@ -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);

View File

@ -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

View File

@ -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);
}
}

View File

@ -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) */

View File

@ -437,6 +437,18 @@ void LLView::setEnabled(BOOL enabled)
mEnabled = 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 )
{

View File

@ -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 );

View File

@ -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
//

View File

@ -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();
}

View File

@ -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) */