diff --git a/.hgtags b/.hgtags index 04b353036af2b882f7a1bb313e2c2dd1ec2ca597..fd247f451929cc232de9865f7113490ab97a2698 100644 --- a/.hgtags +++ b/.hgtags @@ -82,3 +82,5 @@ f1827b441e05bf37c68e2c15ebc6d09e9b03f527 2.6.0-start 9283d6d1d7eb71dfe4c330e7c9144857e7356bde 2.6.0-beta1 9283d6d1d7eb71dfe4c330e7c9144857e7356bde DRTVWR-40_2.6.0-beta1 c5bdef3aaa2744626aef3c217ce29e1900d357b3 2.6.1-start +9e4641f4a7870c0f565a25a2971368d5a29516a1 DRTVWR-41_2.6.0-beta2 +9e4641f4a7870c0f565a25a2971368d5a29516a1 2.6.0-beta2 diff --git a/indra/newview/llchathistory.cpp b/indra/newview/llchathistory.cpp index d4ec377e03ddb3e606966734d30c489859ffecb3..c0c9ea145164b27d65ee4a0d0e201043e78d80d9 100644 --- a/indra/newview/llchathistory.cpp +++ b/indra/newview/llchathistory.cpp @@ -793,21 +793,7 @@ void LLChatHistory::appendMessage(const LLChat& chat, const LLSD &args, const LL if ( chat.mSourceType == CHAT_SOURCE_OBJECT && chat.mFromID.notNull()) { // for object IMs, create a secondlife:///app/objectim SLapp - std::string url = LLSLURL("objectim", chat.mFromID, "").getSLURLString(); - url += "?name=" + chat.mFromName; - url += "&owner=" + chat.mOwnerID.asString(); - - std::string slurl = args["slurl"].asString(); - if (slurl.empty()) - { - LLViewerRegion *region = LLWorld::getInstance()->getRegionFromPosAgent(chat.mPosAgent); - if(region) - { - LLSLURL region_slurl(region->getName(), chat.mPosAgent); - slurl = region_slurl.getLocationString(); - } - } - url += "&slurl=" + LLURI::escape(slurl); + std::string url = LLViewerChat::getSenderSLURL(chat, args); // set the link for the object name to be the objectim SLapp // (don't let object names with hyperlinks override our objectim Url) diff --git a/indra/newview/llchatitemscontainerctrl.cpp b/indra/newview/llchatitemscontainerctrl.cpp index 899e0431e7c29634dd37c8e7ddd7c759151b8eca..8584885bc974e842e63d916ead326abf9e76db4d 100644 --- a/indra/newview/llchatitemscontainerctrl.cpp +++ b/indra/newview/llchatitemscontainerctrl.cpp @@ -213,17 +213,6 @@ void LLNearbyChatToastPanel::init(LLSD& notification) { LLStyle::Params style_params_name; - std::string href; - - if (mSourceType == CHAT_SOURCE_AGENT) - { - href = LLSLURL("agent", mFromID, "about").getSLURLString(); - } - else - { - href = LLSLURL("object", mFromID, "inspect").getSLURLString(); - } - LLColor4 user_name_color = LLUIColorTable::instance().getColor("HTMLLinkColor"); style_params_name.color(user_name_color); @@ -232,7 +221,7 @@ void LLNearbyChatToastPanel::init(LLSD& notification) style_params_name.font.name(font_name); style_params_name.font.size(font_style_size); - style_params_name.link_href = href; + style_params_name.link_href = notification["sender_slurl"].asString(); style_params_name.is_link = true; msg_text->appendText(str_sender, FALSE, style_params_name); diff --git a/indra/newview/llexternaleditor.cpp b/indra/newview/llexternaleditor.cpp index 54968841ab1521461002482ad0631f39aecfa46f..ed1d7e860a0cfa672fe78857a6b8861059c5169f 100644 --- a/indra/newview/llexternaleditor.cpp +++ b/indra/newview/llexternaleditor.cpp @@ -27,6 +27,7 @@ #include "llviewerprecompiledheaders.h" #include "llexternaleditor.h" +#include "lltrans.h" #include "llui.h" // static @@ -35,13 +36,13 @@ const std::string LLExternalEditor::sFilenameMarker = "%s"; // static const std::string LLExternalEditor::sSetting = "ExternalEditor"; -bool LLExternalEditor::setCommand(const std::string& env_var, const std::string& override) +LLExternalEditor::EErrorCode LLExternalEditor::setCommand(const std::string& env_var, const std::string& override) { std::string cmd = findCommand(env_var, override); if (cmd.empty()) { - llwarns << "Empty editor command" << llendl; - return false; + llwarns << "Editor command is empty or not set" << llendl; + return EC_NOT_SPECIFIED; } // Add the filename marker if missing. @@ -55,7 +56,7 @@ bool LLExternalEditor::setCommand(const std::string& env_var, const std::string& if (tokenize(tokens, cmd) < 2) // 2 = bin + at least one arg (%s) { llwarns << "Error parsing editor command" << llendl; - return false; + return EC_PARSE_ERROR; } // Check executable for existence. @@ -63,7 +64,7 @@ bool LLExternalEditor::setCommand(const std::string& env_var, const std::string& if (!LLFile::isfile(bin_path)) { llwarns << "Editor binary [" << bin_path << "] not found" << llendl; - return false; + return EC_BINARY_NOT_FOUND; } // Save command. @@ -76,16 +77,16 @@ bool LLExternalEditor::setCommand(const std::string& env_var, const std::string& } llinfos << "Setting command [" << bin_path << " " << mArgs << "]" << llendl; - return true; + return EC_SUCCESS; } -bool LLExternalEditor::run(const std::string& file_path) +LLExternalEditor::EErrorCode LLExternalEditor::run(const std::string& file_path) { std::string args = mArgs; if (mProcess.getExecutable().empty() || args.empty()) { llwarns << "Editor command not set" << llendl; - return false; + return EC_NOT_SPECIFIED; } // Substitute the filename marker in the command with the actual passed file name. @@ -111,7 +112,22 @@ bool LLExternalEditor::run(const std::string& file_path) mProcess.orphan(); } - return result == 0; + return result == 0 ? EC_SUCCESS : EC_FAILED_TO_RUN; +} + +// static +std::string LLExternalEditor::getErrorMessage(EErrorCode code) +{ + switch (code) + { + case EC_SUCCESS: return LLTrans::getString("ok"); + case EC_NOT_SPECIFIED: return LLTrans::getString("ExternalEditorNotSet"); + case EC_PARSE_ERROR: return LLTrans::getString("ExternalEditorCommandParseError"); + case EC_BINARY_NOT_FOUND: return LLTrans::getString("ExternalEditorNotFound"); + case EC_FAILED_TO_RUN: return LLTrans::getString("ExternalEditorFailedToRun"); + } + + return LLTrans::getString("Unknown"); } // static diff --git a/indra/newview/llexternaleditor.h b/indra/newview/llexternaleditor.h index 6ea210d5e222d69dfc81ed3d4d9ab23758ad520b..ef5db56c6ee056e6ed1ee560c20ae2e1abe51e92 100644 --- a/indra/newview/llexternaleditor.h +++ b/indra/newview/llexternaleditor.h @@ -42,6 +42,14 @@ class LLExternalEditor public: + typedef enum e_error_code { + EC_SUCCESS, /// No error. + EC_NOT_SPECIFIED, /// Editor path not specified. + EC_PARSE_ERROR, /// Editor command parsing error. + EC_BINARY_NOT_FOUND, /// Could find the editor binary (missing or not quoted). + EC_FAILED_TO_RUN, /// Could not execute the editor binary. + } EErrorCode; + /** * Set editor command. * @@ -51,19 +59,25 @@ public: * First tries the override, then a predefined setting (sSetting), * then the environment variable. * - * @return Command if found, empty string otherwise. + * @return EC_SUCCESS if command is valid and refers to an existing executable, + * EC_NOT_SPECIFIED or EC_FAILED_TO_RUNan on error. * * @see sSetting */ - bool setCommand(const std::string& env_var, const std::string& override = LLStringUtil::null); + EErrorCode setCommand(const std::string& env_var, const std::string& override = LLStringUtil::null); /** * Run the editor with the given file. * * @param file_path File to edit. - * @return true on success, false on error. + * @return EC_SUCCESS on success, error code on error. + */ + EErrorCode run(const std::string& file_path); + + /** + * Get a meaningful error message for the given status code. */ - bool run(const std::string& file_path); + static std::string getErrorMessage(EErrorCode code); private: diff --git a/indra/newview/llfloatertopobjects.cpp b/indra/newview/llfloatertopobjects.cpp index 2aaf403d5f76348bcf4fcf37af4a2013c14e4a66..19f6038b56b6f434bd0d33765d0ada3ed7955e83 100644 --- a/indra/newview/llfloatertopobjects.cpp +++ b/indra/newview/llfloatertopobjects.cpp @@ -185,7 +185,7 @@ void LLFloaterTopObjects::handleReply(LLMessageSystem *msg, void** data) have_extended_data = true; msg->getU32("DataExtended", "TimeStamp", time_stamp, block); msg->getF32("DataExtended", "MonoScore", mono_score, block); - msg->getS32(_PREHASH_ReportData,"PublicURLs",public_urls,block); + msg->getS32("DataExtended", "PublicURLs", public_urls, block); } LLSD element; diff --git a/indra/newview/llfloateruipreview.cpp b/indra/newview/llfloateruipreview.cpp index 11b3379814a52d3de44e343675abd7196417e5e9..0d8601410a1413677a645d24a3143315722f41d0 100644 --- a/indra/newview/llfloateruipreview.cpp +++ b/indra/newview/llfloateruipreview.cpp @@ -1037,18 +1037,29 @@ void LLFloaterUIPreview::onClickEditFloater() cmd_override = bin + " " + args; } } - if (!mExternalEditor.setCommand("LL_XUI_EDITOR", cmd_override)) + + LLExternalEditor::EErrorCode status = mExternalEditor.setCommand("LL_XUI_EDITOR", cmd_override); + if (status != LLExternalEditor::EC_SUCCESS) { - std::string warning = "Select an editor by setting the environment variable LL_XUI_EDITOR " - "or the ExternalEditor setting or specifying its path in the \"Editor Path\" field."; + std::string warning; + + if (status == LLExternalEditor::EC_NOT_SPECIFIED) // Use custom message for this error. + { + warning = getString("ExternalEditorNotSet"); + } + else + { + warning = LLExternalEditor::getErrorMessage(status); + } + popupAndPrintWarning(warning); return; } // Run the editor. - if (!mExternalEditor.run(file_path)) + if (mExternalEditor.run(file_path) != LLExternalEditor::EC_SUCCESS) { - popupAndPrintWarning("Failed to run editor"); + popupAndPrintWarning(LLExternalEditor::getErrorMessage(status)); return; } } diff --git a/indra/newview/llnearbychathandler.cpp b/indra/newview/llnearbychathandler.cpp index de5439e4e03e5a88002a454a74e790cd503548db..0d9daeb44ead9302fbb14c5b818ec880ab4ee8ae 100644 --- a/indra/newview/llnearbychathandler.cpp +++ b/indra/newview/llnearbychathandler.cpp @@ -558,6 +558,7 @@ void LLNearbyChatHandler::processChat(const LLChat& chat_msg, const LLSD &args) } */ + // Add a nearby chat toast. LLUUID id; id.generate(); @@ -583,6 +584,10 @@ void LLNearbyChatHandler::processChat(const LLChat& chat_msg, const LLSD &args) notification["text_color"] = r_color_name; notification["color_alpha"] = r_color_alpha; notification["font_size"] = (S32)LLViewerChat::getChatFontSize() ; + + // Pass sender info so that it can be rendered properly (STORM-1021). + notification["sender_slurl"] = LLViewerChat::getSenderSLURL(chat_msg, args); + channel->addNotification(notification); } diff --git a/indra/newview/llpreviewscript.cpp b/indra/newview/llpreviewscript.cpp index 22ff362b5a66d5c2c3869e78a7614ff7d1ed45e2..b19bf5d234c36544e12aee92ac14709ccc038add 100644 --- a/indra/newview/llpreviewscript.cpp +++ b/indra/newview/llpreviewscript.cpp @@ -956,16 +956,31 @@ void LLScriptEdCore::openInExternalEditor() // Open it in external editor. { LLExternalEditor ed; + LLExternalEditor::EErrorCode status; + std::string msg; - if (!ed.setCommand("LL_SCRIPT_EDITOR")) + status = ed.setCommand("LL_SCRIPT_EDITOR"); + if (status != LLExternalEditor::EC_SUCCESS) { - std::string msg = "Select an editor by setting the environment variable LL_SCRIPT_EDITOR " - "or the ExternalEditor setting"; // *TODO: localize + if (status == LLExternalEditor::EC_NOT_SPECIFIED) // Use custom message for this error. + { + msg = getString("external_editor_not_set"); + } + else + { + msg = LLExternalEditor::getErrorMessage(status); + } + LLNotificationsUtil::add("GenericAlert", LLSD().with("MESSAGE", msg)); return; } - ed.run(filename); + status = ed.run(filename); + if (status != LLExternalEditor::EC_SUCCESS) + { + msg = LLExternalEditor::getErrorMessage(status); + LLNotificationsUtil::add("GenericAlert", LLSD().with("MESSAGE", msg)); + } } } diff --git a/indra/newview/llviewerchat.cpp b/indra/newview/llviewerchat.cpp index 0af850a46b015b2de2e60d9c2cb4d7328e0a101a..286b16bab2ede0749a22b2ffbc91f679fd0c5856 100644 --- a/indra/newview/llviewerchat.cpp +++ b/indra/newview/llviewerchat.cpp @@ -31,6 +31,8 @@ #include "llagent.h" // gAgent #include "lluicolortable.h" #include "llviewercontrol.h" // gSavedSettings +#include "llviewerregion.h" +#include "llworld.h" #include "llinstantmessage.h" //SYSTEM_FROM // LLViewerChat @@ -214,3 +216,43 @@ void LLViewerChat::formatChatMsg(const LLChat& chat, std::string& formated_msg) } +//static +std::string LLViewerChat::getSenderSLURL(const LLChat& chat, const LLSD& args) +{ + switch (chat.mSourceType) + { + case CHAT_SOURCE_AGENT: + return LLSLURL("agent", chat.mFromID, "about").getSLURLString(); + + case CHAT_SOURCE_OBJECT: + return getObjectImSLURL(chat, args); + + default: + llwarns << "Getting SLURL for an unsupported sender type: " << chat.mSourceType << llendl; + } + + return LLStringUtil::null; +} + +//static +std::string LLViewerChat::getObjectImSLURL(const LLChat& chat, const LLSD& args) +{ + std::string url = LLSLURL("objectim", chat.mFromID, "").getSLURLString(); + url += "?name=" + chat.mFromName; + url += "&owner=" + chat.mOwnerID.asString(); + + std::string slurl = args["slurl"].asString(); + if (slurl.empty()) + { + LLViewerRegion *region = LLWorld::getInstance()->getRegionFromPosAgent(chat.mPosAgent); + if(region) + { + LLSLURL region_slurl(region->getName(), chat.mPosAgent); + slurl = region_slurl.getLocationString(); + } + } + + url += "&slurl=" + LLURI::escape(slurl); + + return url; +} diff --git a/indra/newview/llviewerchat.h b/indra/newview/llviewerchat.h index a9f9a98960f06b60cc7c07d7ae390bbca65b83d4..0f15d29f04ec3a0a8f884d328d4b9cd78b3193dc 100644 --- a/indra/newview/llviewerchat.h +++ b/indra/newview/llviewerchat.h @@ -40,6 +40,10 @@ public: static LLFontGL* getChatFont(); static S32 getChatFontSize(); static void formatChatMsg(const LLChat& chat, std::string& formated_msg); + static std::string getSenderSLURL(const LLChat& chat, const LLSD& args); + +private: + static std::string getObjectImSLURL(const LLChat& chat, const LLSD& args); }; diff --git a/indra/newview/skins/default/xui/en/floater_ui_preview.xml b/indra/newview/skins/default/xui/en/floater_ui_preview.xml index 12c45617530885b9677f4c40f7920e35f816b5db..3921cfcd2c92ffff9e226d134457e9a36840df25 100644 --- a/indra/newview/skins/default/xui/en/floater_ui_preview.xml +++ b/indra/newview/skins/default/xui/en/floater_ui_preview.xml @@ -12,6 +12,10 @@ title="XUI PREVIEW TOOL" translate="false" width="750"> + <string name="ExternalEditorNotSet"> +Select an editor by setting the environment variable LL_XUI_EDITOR +or the ExternalEditor setting +or specifying its path in the "Editor Path" field.</string> <panel bottom="640" follows="left|top|right|bottom" diff --git a/indra/newview/skins/default/xui/en/menu_attachment_self.xml b/indra/newview/skins/default/xui/en/menu_attachment_self.xml index 84e81397beb465b0df1b180f7cd845ab60decc93..b8128da358631e2885fae37b4ebd0d72ba49eb66 100644 --- a/indra/newview/skins/default/xui/en/menu_attachment_self.xml +++ b/indra/newview/skins/default/xui/en/menu_attachment_self.xml @@ -68,7 +68,7 @@ name="Stand Up"> function="Self.EnableStandUp" /> </menu_item_call> <menu_item_call - label="Change Outfit" + label="My Appearance" name="Change Outfit"> <menu_item_call.on_click function="CustomizeAvatar" /> diff --git a/indra/newview/skins/default/xui/en/menu_avatar_self.xml b/indra/newview/skins/default/xui/en/menu_avatar_self.xml index 2afa29ec100e4fcc500d3500feef858c2d16ac17..d727294cc8ebf23ff96af095c4d55c65d982936e 100644 --- a/indra/newview/skins/default/xui/en/menu_avatar_self.xml +++ b/indra/newview/skins/default/xui/en/menu_avatar_self.xml @@ -193,7 +193,7 @@ </menu_item_call> </context_menu> <menu_item_call - label="Change Outfit" + label="My Appearance" layout="topleft" name="Chenge Outfit"> <menu_item_call.on_click diff --git a/indra/newview/skins/default/xui/en/menu_viewer.xml b/indra/newview/skins/default/xui/en/menu_viewer.xml index 3ab21914c02a27868af492bad8b5202b2800d363..934cae93db0f83e8f75b2bca8a93ec67d865dcb6 100644 --- a/indra/newview/skins/default/xui/en/menu_viewer.xml +++ b/indra/newview/skins/default/xui/en/menu_viewer.xml @@ -41,7 +41,7 @@ parameter="agent" /> </menu_item_call> <menu_item_call - label="Change Outfit" + label="My Appearance" name="ChangeOutfit"> <menu_item_call.on_click function="CustomizeAvatar" /> diff --git a/indra/newview/skins/default/xui/en/notifications.xml b/indra/newview/skins/default/xui/en/notifications.xml index 6ecaef1bf3050927b370d0d81cf9f9d136cc7bfb..ba13479860e1910d1bfdd0ffaacb006118dd8317 100644 --- a/indra/newview/skins/default/xui/en/notifications.xml +++ b/indra/newview/skins/default/xui/en/notifications.xml @@ -819,22 +819,6 @@ You need to enter either the Username or both the First and Last name of your av </notification> - <notification - icon="alertmodal.tga" - name="AddClassified" - type="alertmodal"> -Classified ads appear in the 'Classified' section of the Search directory and on [http://secondlife.com/community/classifieds secondlife.com] for one week. -Fill out your ad, then click 'Publish...' to add it to the directory. -You'll be asked for a price to pay when clicking Publish. -Paying more makes your ad appear higher in the list, and also appear higher when people search for keywords. - <tag>confirm</tag> - <usetemplate - ignoretext="How to create a new Classified ad" - name="okcancelignore" - notext="Cancel" - yestext="OK"/> - </notification> - <notification icon="alertmodal.tga" name="DeleteClassified" diff --git a/indra/newview/skins/default/xui/en/panel_script_ed.xml b/indra/newview/skins/default/xui/en/panel_script_ed.xml index 627b12cfe17a71f088ff2293474425d03207f7ca..8d420243864c56e4cda3fa1d0f53e2b7ad2e00d1 100644 --- a/indra/newview/skins/default/xui/en/panel_script_ed.xml +++ b/indra/newview/skins/default/xui/en/panel_script_ed.xml @@ -28,6 +28,10 @@ name="Title"> Script: [NAME] </panel.string> + <panel.string + name="external_editor_not_set"> + Select an editor by setting the environment variable LL_SCRIPT_EDITOR or the ExternalEditor setting. + </panel.string> <menu_bar bg_visible="false" follows="left|top" diff --git a/indra/newview/skins/default/xui/en/strings.xml b/indra/newview/skins/default/xui/en/strings.xml index d0625d975579978820c61aeb1de426520b41314f..14ea43a8f80b5a85c39320ce07a299ac058aec24 100644 --- a/indra/newview/skins/default/xui/en/strings.xml +++ b/indra/newview/skins/default/xui/en/strings.xml @@ -3310,6 +3310,14 @@ Abuse Report</string> <string name="DeleteItem">Delete selected item?</string> <string name="EmptyOutfitText">There are no items in this outfit</string> + + <!-- External editor status codes --> + <string name="ExternalEditorNotSet">Select an editor using the ExternalEditor setting.</string> + <string name="ExternalEditorNotFound">Cannot find the external editor you specified. +Try enclosing path to the editor with double quotes. +(e.g. "/path to my/editor" "%s")</string> + <string name="ExternalEditorCommandParseError">Error parsing the external editor command.</string> + <string name="ExternalEditorFailedToRun">External editor failed to run.</string> <!-- Key names begin --> <string name="Esc">Esc</string> diff --git a/indra/newview/skins/minimal/xui/en/floater_help_browser.xml b/indra/newview/skins/minimal/xui/en/floater_help_browser.xml index eddfe41c25627ff94e3e1431731e5fd13dfb6398..cc551f7d58448b75f4a0ce56a6d5604a9c273628 100644 --- a/indra/newview/skins/minimal/xui/en/floater_help_browser.xml +++ b/indra/newview/skins/minimal/xui/en/floater_help_browser.xml @@ -8,12 +8,12 @@ min_height="360" left="645" top="10" - min_width="300" + min_width="345" name="floater_help_browser" save_rect="true" single_instance="true" title="HOW TO" - width="300"> + width="335"> <floater.string name="loading_text"> Loading... @@ -29,14 +29,14 @@ orientation="vertical" name="stack1" top="20" - width="290"> + width="325"> <layout_panel layout="topleft" left_delta="0" top_delta="0" name="external_controls" user_resize="false" - width="280"> + width="325"> <web_browser trusted_content="true" bottom="-5" @@ -46,7 +46,7 @@ name="browser" top="0" height="300" - width="280" /> + width="325" /> </layout_panel> </layout_stack> </floater>