diff options
Diffstat (limited to 'indra/newview/llviewerhelp.cpp')
-rw-r--r-- | indra/newview/llviewerhelp.cpp | 178 |
1 files changed, 178 insertions, 0 deletions
diff --git a/indra/newview/llviewerhelp.cpp b/indra/newview/llviewerhelp.cpp new file mode 100644 index 0000000000..9fe8c142b9 --- /dev/null +++ b/indra/newview/llviewerhelp.cpp @@ -0,0 +1,178 @@ +/** + * @file llviewerhelp.cpp + * @brief Utility functions for the Help system + * @author Tofu Linden + * + * $LicenseInfo:firstyear=2009&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2010, Linden Research, Inc. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; + * version 2.1 of the License only. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA + * $/LicenseInfo$ + */ + +#include "llviewerprecompiledheaders.h" + +#include "llcommandhandler.h" +#include "llfloaterhelpbrowser.h" +#include "llfloaterreg.h" +#include "llfocusmgr.h" +#include "llviewercontrol.h" +#include "llappviewer.h" +#include "lllogininstance.h" + +#include "llviewerhelputil.h" +#include "llviewerhelp.h" + +// support for secondlife:///app/help/{TOPIC} SLapps +class LLHelpHandler : public LLCommandHandler +{ +public: + // requests will be throttled from a non-trusted browser + LLHelpHandler() : LLCommandHandler("help", UNTRUSTED_THROTTLE) {} + + bool handle(const LLSD& params, const LLSD& query_map, LLMediaCtrl* web) + { + LLViewerHelp* vhelp = LLViewerHelp::getInstance(); + if (! vhelp) + { + return false; + } + + // get the requested help topic name, or use the fallback if none + std::string help_topic = vhelp->defaultTopic(); + if (params.size() >= 1) + { + help_topic = params[0].asString(); + } + + vhelp->showTopic(help_topic); + return true; + } +}; +LLHelpHandler gHelpHandler; + +////////////////////////////// +// implement LLHelp interface + +void LLViewerHelp::showTopic(const std::string &topic) +{ + // allow overriding the help server with a local help file + if( gSavedSettings.getBOOL("HelpUseLocal") ) + { + showHelp(); + LLFloaterHelpBrowser* helpbrowser = dynamic_cast<LLFloaterHelpBrowser*>(LLFloaterReg::getInstance("help_browser")); + helpbrowser->navigateToLocalPage( "help-offline" , "index.html" ); + return; + } + + // if the help topic is empty, use the default topic + std::string help_topic = topic; + if (help_topic.empty()) + { + help_topic = defaultTopic(); + } + + // f1 help topic means: if the user is not logged in yet, show + // the pre-login topic instead of the default fallback topic, + // otherwise show help for the focused item + if (help_topic == f1HelpTopic()) + { + help_topic = getTopicFromFocus(); + if (help_topic == defaultTopic() && ! LLLoginInstance::getInstance()->authSuccess()) + { + help_topic = preLoginTopic(); + } + } + + // work out the URL for this topic and display it + showHelp(); + std::string helpURL = LLViewerHelpUtil::buildHelpURL( help_topic ); + setRawURL( helpURL ); +} + +std::string LLViewerHelp::defaultTopic() +{ + // *hack: to be done properly + return "this_is_fallbacktopic"; +} + +std::string LLViewerHelp::preLoginTopic() +{ + // *hack: to be done properly + return "pre_login_help"; +} + +std::string LLViewerHelp::f1HelpTopic() +{ + // *hack: to be done properly + return "f1_help"; +} + +////////////////////////////// +// our own interfaces + +std::string LLViewerHelp::getTopicFromFocus() +{ + // use UI element with viewer's keyboard focus as basis for searching + LLUICtrl* focused = dynamic_cast<LLUICtrl*>(gFocusMgr.getKeyboardFocus()); + + if (focused) + { + std::string topic; + if (focused->findHelpTopic(topic)) + { + return topic; + } + } + + // didn't find a help topic in the UI hierarchy for focused + // element, return the fallback topic name instead. + return defaultTopic(); +} + +// static +void LLViewerHelp::showHelp() +{ + LLFloaterHelpBrowser* helpbrowser = dynamic_cast<LLFloaterHelpBrowser*>(LLFloaterReg::getInstance("help_browser")); + if (helpbrowser) + { + BOOL visible = TRUE; + BOOL take_focus = TRUE; + helpbrowser->setVisible(visible); + helpbrowser->setFrontmost(take_focus); + } + else + { + llwarns << "Eep, help_browser floater not found" << llendl; + } +} + +// static +void LLViewerHelp::setRawURL(std::string url) +{ + LLFloaterHelpBrowser* helpbrowser = dynamic_cast<LLFloaterHelpBrowser*>(LLFloaterReg::getInstance("help_browser")); + if (helpbrowser) + { + helpbrowser->openMedia(url); + } + else + { + llwarns << "Eep, help_browser floater not found" << llendl; + } +} + |