summaryrefslogtreecommitdiff
path: root/indra
diff options
context:
space:
mode:
Diffstat (limited to 'indra')
-rw-r--r--indra/cmake/Copy3rdPartyLibs.cmake2
-rw-r--r--indra/llcommon/llclickaction.h5
-rw-r--r--indra/llcommon/llsys.cpp129
-rw-r--r--indra/llcommon/llthread.cpp18
-rw-r--r--indra/llcommon/llthread.h5
-rw-r--r--indra/llmessage/llcachename.cpp36
-rw-r--r--indra/llmessage/llcachename.h4
-rw-r--r--indra/llui/llflatlistview.cpp241
-rw-r--r--indra/llui/llflatlistview.h25
-rw-r--r--indra/llui/llfloater.cpp8
-rw-r--r--indra/llui/llfloater.h1
-rw-r--r--indra/llui/lltextbase.cpp7
-rw-r--r--indra/llwindow/llwindowmacosx.cpp3
-rw-r--r--indra/lscript/lscript_compile/indra.l1
-rw-r--r--indra/newview/CMakeLists.txt6
-rw-r--r--indra/newview/app_settings/keywords.ini1
-rw-r--r--indra/newview/app_settings/settings.xml15
-rw-r--r--indra/newview/llagent.cpp6
-rw-r--r--indra/newview/llappviewer.cpp57
-rw-r--r--indra/newview/llavataractions.cpp2
-rw-r--r--indra/newview/llchathistory.cpp121
-rw-r--r--indra/newview/llchathistory.h7
-rw-r--r--indra/newview/llchiclet.cpp50
-rw-r--r--indra/newview/llchiclet.h40
-rw-r--r--indra/newview/lldateutil.cpp86
-rw-r--r--indra/newview/llfloateravatarpicker.cpp34
-rw-r--r--indra/newview/llfloaterpreference.cpp45
-rw-r--r--indra/newview/llfloaterpreference.h9
-rw-r--r--indra/newview/llfloatertools.cpp22
-rw-r--r--indra/newview/llimfloater.cpp91
-rw-r--r--indra/newview/llimfloater.h8
-rw-r--r--indra/newview/llimfloatercontainer.cpp96
-rw-r--r--indra/newview/llimfloatercontainer.h61
-rw-r--r--indra/newview/llinspectavatar.cpp3
-rw-r--r--indra/newview/lllocationinputctrl.cpp1
-rwxr-xr-xindra/newview/llmediadataclient.cpp3
-rw-r--r--indra/newview/llnavigationbar.cpp27
-rw-r--r--indra/newview/llnavigationbar.h6
-rw-r--r--indra/newview/llnearbychat.cpp4
-rw-r--r--indra/newview/llnotificationscripthandler.cpp59
-rw-r--r--indra/newview/llpanelavatar.cpp38
-rw-r--r--indra/newview/llpanelavatar.h4
-rw-r--r--indra/newview/llpanellandmarks.cpp84
-rw-r--r--indra/newview/llpanellandmarks.h18
-rw-r--r--indra/newview/llpanellogin.cpp6
-rw-r--r--indra/newview/llpanelobjectinventory.cpp13
-rw-r--r--indra/newview/llpanelpeople.cpp7
-rw-r--r--indra/newview/llpanelpermissions.cpp71
-rw-r--r--indra/newview/llpanelprimmediacontrols.cpp75
-rw-r--r--indra/newview/llpanelprimmediacontrols.h8
-rw-r--r--indra/newview/llpanelteleporthistory.cpp7
-rw-r--r--indra/newview/llpanelteleporthistory.h1
-rw-r--r--indra/newview/llparticipantlist.cpp3
-rw-r--r--indra/newview/llscreenchannel.cpp28
-rw-r--r--indra/newview/llscriptfloater.cpp335
-rw-r--r--indra/newview/llscriptfloater.h164
-rw-r--r--indra/newview/llstartup.cpp2
-rw-r--r--indra/newview/lltexturefetch.cpp8
-rw-r--r--indra/newview/lltoast.cpp2
-rw-r--r--indra/newview/lltoolpie.cpp32
-rw-r--r--indra/newview/llviewerfloaterreg.cpp4
-rw-r--r--indra/newview/llviewermedia.cpp108
-rw-r--r--indra/newview/llviewermedia.h2
-rw-r--r--indra/newview/llviewermediafocus.cpp28
-rw-r--r--indra/newview/llviewermenu.cpp26
-rw-r--r--indra/newview/llviewermessage.cpp12
-rw-r--r--indra/newview/llviewerparcelmedia.cpp5
-rw-r--r--indra/newview/llviewerwindow.cpp27
-rw-r--r--indra/newview/llviewerwindow.h1
-rw-r--r--indra/newview/llvoiceclient.cpp2
-rw-r--r--indra/newview/llvovolume.cpp14
-rw-r--r--indra/newview/skins/default/textures/textures.xml2
-rw-r--r--indra/newview/skins/default/xui/de/floater_media_browser.xml4
-rw-r--r--indra/newview/skins/default/xui/de/menu_viewer.xml6
-rw-r--r--indra/newview/skins/default/xui/de/notifications.xml17
-rw-r--r--indra/newview/skins/default/xui/de/panel_login.xml2
-rw-r--r--indra/newview/skins/default/xui/de/panel_profile.xml6
-rw-r--r--indra/newview/skins/default/xui/de/strings.xml11
-rw-r--r--indra/newview/skins/default/xui/en/floater_avatar_picker.xml10
-rw-r--r--indra/newview/skins/default/xui/en/floater_buy_contents.xml4
-rw-r--r--indra/newview/skins/default/xui/en/floater_im_container.xml36
-rw-r--r--indra/newview/skins/default/xui/en/floater_im_session.xml17
-rw-r--r--indra/newview/skins/default/xui/en/floater_region_info.xml4
-rw-r--r--indra/newview/skins/default/xui/en/floater_report_abuse.xml2
-rw-r--r--indra/newview/skins/default/xui/en/floater_script.xml19
-rw-r--r--indra/newview/skins/default/xui/en/floater_tools.xml12
-rw-r--r--indra/newview/skins/default/xui/en/menu_viewer.xml11
-rw-r--r--indra/newview/skins/default/xui/en/notifications.xml38
-rw-r--r--indra/newview/skins/default/xui/en/panel_adhoc_control_panel.xml6
-rw-r--r--indra/newview/skins/default/xui/en/panel_chat_header.xml4
-rw-r--r--indra/newview/skins/default/xui/en/panel_group_control_panel.xml7
-rw-r--r--indra/newview/skins/default/xui/en/panel_group_general.xml22
-rw-r--r--indra/newview/skins/default/xui/en/panel_group_info_sidetray.xml76
-rw-r--r--indra/newview/skins/default/xui/en/panel_group_land_money.xml136
-rw-r--r--indra/newview/skins/default/xui/en/panel_group_notices.xml54
-rw-r--r--indra/newview/skins/default/xui/en/panel_group_notify.xml18
-rw-r--r--indra/newview/skins/default/xui/en/panel_group_roles.xml261
-rw-r--r--indra/newview/skins/default/xui/en/panel_my_profile.xml1
-rw-r--r--indra/newview/skins/default/xui/en/panel_preferences_chat.xml9
-rw-r--r--indra/newview/skins/default/xui/en/panel_preferences_privacy.xml11
-rw-r--r--indra/newview/skins/default/xui/en/panel_prim_media_controls.xml56
-rw-r--r--indra/newview/skins/default/xui/en/panel_profile.xml3
-rw-r--r--indra/newview/skins/default/xui/en/panel_region_estate.xml104
-rw-r--r--indra/newview/skins/default/xui/en/strings.xml245
-rw-r--r--indra/newview/skins/default/xui/en/widgets/chiclet_script.xml9
-rw-r--r--indra/newview/skins/default/xui/es/floater_media_browser.xml6
-rw-r--r--indra/newview/skins/default/xui/es/menu_viewer.xml6
-rw-r--r--indra/newview/skins/default/xui/es/notifications.xml27
-rw-r--r--indra/newview/skins/default/xui/es/panel_login.xml14
-rw-r--r--indra/newview/skins/default/xui/es/panel_profile.xml14
-rw-r--r--indra/newview/skins/default/xui/es/strings.xml1
-rw-r--r--indra/newview/skins/default/xui/fr/floater_media_browser.xml4
-rw-r--r--indra/newview/skins/default/xui/fr/menu_viewer.xml6
-rw-r--r--indra/newview/skins/default/xui/fr/notifications.xml21
-rw-r--r--indra/newview/skins/default/xui/fr/panel_login.xml4
-rw-r--r--indra/newview/skins/default/xui/fr/panel_pick_info.xml16
-rw-r--r--indra/newview/skins/default/xui/fr/panel_profile.xml10
-rw-r--r--indra/newview/skins/default/xui/fr/strings.xml11
-rw-r--r--indra/newview/skins/default/xui/it/floater_media_browser.xml6
-rw-r--r--indra/newview/skins/default/xui/it/menu_viewer.xml6
-rw-r--r--indra/newview/skins/default/xui/it/notifications.xml29
-rw-r--r--indra/newview/skins/default/xui/it/panel_login.xml14
-rw-r--r--indra/newview/skins/default/xui/it/panel_profile.xml14
-rw-r--r--indra/newview/skins/default/xui/it/strings.xml1
-rw-r--r--indra/newview/skins/default/xui/ja/menu_viewer.xml6
-rw-r--r--indra/newview/skins/default/xui/ja/notifications.xml12
-rw-r--r--indra/newview/skins/default/xui/ja/panel_login.xml2
-rw-r--r--indra/newview/skins/default/xui/ja/panel_profile.xml10
-rw-r--r--indra/newview/skins/default/xui/ja/strings.xml11
-rw-r--r--indra/newview/skins/default/xui/nl/notifications.xml5
-rw-r--r--indra/newview/skins/default/xui/nl/panel_login.xml14
-rw-r--r--indra/newview/skins/default/xui/nl/strings.xml1
-rw-r--r--indra/newview/skins/default/xui/pt/floater_media_browser.xml6
-rw-r--r--indra/newview/skins/default/xui/pt/menu_viewer.xml6
-rw-r--r--indra/newview/skins/default/xui/pt/notifications.xml29
-rw-r--r--indra/newview/skins/default/xui/pt/panel_login.xml8
-rw-r--r--indra/newview/skins/default/xui/pt/panel_profile.xml14
-rw-r--r--indra/newview/skins/default/xui/pt/strings.xml1
-rw-r--r--indra/newview/tests/lldateutil_test.cpp26
139 files changed, 3070 insertions, 994 deletions
diff --git a/indra/cmake/Copy3rdPartyLibs.cmake b/indra/cmake/Copy3rdPartyLibs.cmake
index af407d52de..bbf31f9297 100644
--- a/indra/cmake/Copy3rdPartyLibs.cmake
+++ b/indra/cmake/Copy3rdPartyLibs.cmake
@@ -209,7 +209,7 @@ elseif(LINUX)
libapr-1.so.0
libaprutil-1.so.0
libatk-1.0.so
- libcrypto.so
+ libcrypto.so.0.9.7
libdb-4.2.so
libexpat.so
libgmock_main.so
diff --git a/indra/llcommon/llclickaction.h b/indra/llcommon/llclickaction.h
index 8048724575..d4ffbf8634 100644
--- a/indra/llcommon/llclickaction.h
+++ b/indra/llcommon/llclickaction.h
@@ -33,7 +33,7 @@
#ifndef LL_LLCLICKACTION_H
#define LL_LLCLICKACTION_H
-
+// DO NOT CHANGE THE SEQUENCE OF THIS LIST!!
const U8 CLICK_ACTION_NONE = 0;
const U8 CLICK_ACTION_TOUCH = 0;
const U8 CLICK_ACTION_SIT = 1;
@@ -42,5 +42,6 @@ const U8 CLICK_ACTION_PAY = 3;
const U8 CLICK_ACTION_OPEN = 4;
const U8 CLICK_ACTION_PLAY = 5;
const U8 CLICK_ACTION_OPEN_MEDIA = 6;
-
+const U8 CLICK_ACTION_ZOOM = 7;
+// DO NOT CHANGE THE SEQUENCE OF THIS LIST!!
#endif
diff --git a/indra/llcommon/llsys.cpp b/indra/llcommon/llsys.cpp
index 3652eeba72..cba8cf85b0 100644
--- a/indra/llcommon/llsys.cpp
+++ b/indra/llcommon/llsys.cpp
@@ -76,6 +76,75 @@ extern int errno;
static const S32 CPUINFO_BUFFER_SIZE = 16383;
LLCPUInfo gSysCPU;
+#if LL_WINDOWS
+#ifndef DLLVERSIONINFO
+typedef struct _DllVersionInfo
+{
+ DWORD cbSize;
+ DWORD dwMajorVersion;
+ DWORD dwMinorVersion;
+ DWORD dwBuildNumber;
+ DWORD dwPlatformID;
+}DLLVERSIONINFO;
+#endif
+
+#ifndef DLLGETVERSIONPROC
+typedef int (FAR WINAPI *DLLGETVERSIONPROC) (DLLVERSIONINFO *);
+#endif
+
+bool get_shell32_dll_version(DWORD& major, DWORD& minor, DWORD& build_number)
+{
+ bool result = false;
+ const U32 BUFF_SIZE = 32767;
+ WCHAR tempBuf[BUFF_SIZE];
+ if(GetSystemDirectory((LPWSTR)&tempBuf, BUFF_SIZE))
+ {
+
+ std::basic_string<WCHAR> shell32_path(tempBuf);
+
+ // Shell32.dll contains the DLLGetVersion function.
+ // according to msdn its not part of the API
+ // so you have to go in and get it.
+ // http://msdn.microsoft.com/en-us/library/bb776404(VS.85).aspx
+ shell32_path += TEXT("\\shell32.dll");
+
+ HMODULE hDllInst = LoadLibrary(shell32_path.c_str()); //load the DLL
+ if(hDllInst)
+ { // Could successfully load the DLL
+ DLLGETVERSIONPROC pDllGetVersion;
+ /*
+ You must get this function explicitly because earlier versions of the DLL
+ don't implement this function. That makes the lack of implementation of the
+ function a version marker in itself.
+ */
+ pDllGetVersion = (DLLGETVERSIONPROC) GetProcAddress(hDllInst,
+ "DllGetVersion");
+
+ if(pDllGetVersion)
+ {
+ // DLL supports version retrieval function
+ DLLVERSIONINFO dvi;
+
+ ZeroMemory(&dvi, sizeof(dvi));
+ dvi.cbSize = sizeof(dvi);
+ HRESULT hr = (*pDllGetVersion)(&dvi);
+
+ if(SUCCEEDED(hr))
+ { // Finally, the version is at our hands
+ major = dvi.dwMajorVersion;
+ minor = dvi.dwMinorVersion;
+ build_number = dvi.dwBuildNumber;
+ result = true;
+ }
+ }
+
+ FreeLibrary(hDllInst); // Release DLL
+ }
+ }
+ return result;
+}
+#endif // LL_WINDOWS
+
LLOSInfo::LLOSInfo() :
mMajorVer(0), mMinorVer(0), mBuild(0)
{
@@ -98,6 +167,11 @@ LLOSInfo::LLOSInfo() :
mMinorVer = osvi.dwMinorVersion;
mBuild = osvi.dwBuildNumber;
+ DWORD shell32_major, shell32_minor, shell32_build;
+ bool got_shell32_version = get_shell32_dll_version(shell32_major,
+ shell32_minor,
+ shell32_build);
+
switch(osvi.dwPlatformId)
{
case VER_PLATFORM_WIN32_NT:
@@ -122,8 +196,22 @@ LLOSInfo::LLOSInfo() :
else
mOSStringSimple = "Microsoft Windows Server 2003 ";
}
- else if(osvi.dwMajorVersion == 6 && osvi.dwMinorVersion == 0)
+ else if(osvi.dwMajorVersion == 6 && osvi.dwMinorVersion <= 1)
{
+ if(osvi.dwMinorVersion == 0)
+ {
+ mOSStringSimple = "Microsoft Windows Vista ";
+ }
+ else if(osvi.dwMinorVersion == 1)
+ {
+ mOSStringSimple = "Microsoft Windows 7 ";
+ }
+
+ if(osvi.wProductType != VER_NT_WORKSTATION)
+ {
+ mOSStringSimple += "Server ";
+ }
+
///get native system info if available..
typedef void (WINAPI *PGNSI)(LPSYSTEM_INFO); ///function pointer for loading GetNativeSystemInfo
SYSTEM_INFO si; //System Info object file contains architecture info
@@ -141,32 +229,13 @@ LLOSInfo::LLOSInfo() :
//of windows than this code does (in case it is needed for the future)
if ( si.wProcessorArchitecture==PROCESSOR_ARCHITECTURE_AMD64 ) //check for 64 bit
{
- if(osvi.wProductType == VER_NT_WORKSTATION)
- mOSStringSimple = "Microsoft Windows Vista 64-bit ";
- else
- mOSStringSimple = "Microsoft Windows Vista Server 64-bit ";
+ mOSStringSimple += "64-bit ";
}
else if (si.wProcessorArchitecture==PROCESSOR_ARCHITECTURE_INTEL )
{
- if(osvi.wProductType == VER_NT_WORKSTATION)
- mOSStringSimple = "Microsoft Windows Vista 32-bit ";
- else
- mOSStringSimple = "Microsoft Windows Vista Server 32-bit ";
- }
- else // PROCESSOR_ARCHITECTURE_IA64 || PROCESSOR_ARCHITECTURE_UNKNOWN not checked
- {
- if(osvi.wProductType == VER_NT_WORKSTATION)
- mOSStringSimple = "Microsoft Windows Vista ";
- else
- mOSStringSimple = "Microsoft Windows Vista Server ";
+ mOSStringSimple += "32-bit ";
}
}
- else if(osvi.dwMajorVersion == 6 && osvi.dwMinorVersion == 1)
- {
- if(osvi.wProductType == VER_NT_WORKSTATION)
- mOSStringSimple = "Microsoft Windows 7 ";
- else mOSStringSimple = "Microsoft Windows 7 Server ";
- }
else // Use the registry on early versions of Windows NT.
{
mOSStringSimple = "Microsoft Windows (unrecognized) ";
@@ -211,6 +280,7 @@ LLOSInfo::LLOSInfo() :
csdversion.c_str(),
(osvi.dwBuildNumber & 0xffff));
}
+
mOSString = mOSStringSimple + tmpstr;
}
break;
@@ -240,6 +310,21 @@ LLOSInfo::LLOSInfo() :
mOSString = mOSStringSimple;
break;
}
+
+ std::string compatibility_mode;
+ if(got_shell32_version)
+ {
+ if(osvi.dwMajorVersion != shell32_major
+ || osvi.dwMinorVersion != shell32_minor)
+ {
+ compatibility_mode = llformat(" compatibility mode. real ver: %d.%d (Build %d)",
+ shell32_major,
+ shell32_minor,
+ shell32_build);
+ }
+ }
+ mOSString += compatibility_mode;
+
#else
struct utsname un;
if(uname(&un) != -1)
diff --git a/indra/llcommon/llthread.cpp b/indra/llcommon/llthread.cpp
index 920d8c0977..37370e44e7 100644
--- a/indra/llcommon/llthread.cpp
+++ b/indra/llcommon/llthread.cpp
@@ -291,8 +291,8 @@ LLMutex::LLMutex(apr_pool_t *poolp) :
LLMutex::~LLMutex()
{
-#if _DEBUG
- llassert(!isLocked()); // better not be locked!
+#if MUTEX_DEBUG
+ llassert_always(!isLocked()); // better not be locked!
#endif
apr_thread_mutex_destroy(mAPRMutexp);
mAPRMutexp = NULL;
@@ -306,10 +306,24 @@ LLMutex::~LLMutex()
void LLMutex::lock()
{
apr_thread_mutex_lock(mAPRMutexp);
+#if MUTEX_DEBUG
+ // Have to have the lock before we can access the debug info
+ U32 id = LLThread::currentID();
+ if (mIsLocked[id] != FALSE)
+ llerrs << "Already locked in Thread: " << id << llendl;
+ mIsLocked[id] = TRUE;
+#endif
}
void LLMutex::unlock()
{
+#if MUTEX_DEBUG
+ // Access the debug info while we have the lock
+ U32 id = LLThread::currentID();
+ if (mIsLocked[id] != TRUE)
+ llerrs << "Not locked in Thread: " << id << llendl;
+ mIsLocked[id] = FALSE;
+#endif
apr_thread_mutex_unlock(mAPRMutexp);
}
diff --git a/indra/llcommon/llthread.h b/indra/llcommon/llthread.h
index 932d96d940..d8aa90de2e 100644
--- a/indra/llcommon/llthread.h
+++ b/indra/llcommon/llthread.h
@@ -128,6 +128,8 @@ protected:
//============================================================================
+#define MUTEX_DEBUG (LL_DEBUG || LL_RELEASE_WITH_DEBUG_INFO)
+
class LL_COMMON_API LLMutex
{
public:
@@ -142,6 +144,9 @@ protected:
apr_thread_mutex_t *mAPRMutexp;
apr_pool_t *mAPRPoolp;
BOOL mIsLocalPool;
+#if MUTEX_DEBUG
+ std::map<U32, BOOL> mIsLocked;
+#endif
};
// Actually a condition/mutex pair (since each condition needs to be associated with a mutex).
diff --git a/indra/llmessage/llcachename.cpp b/indra/llmessage/llcachename.cpp
index a403c44b71..3078d80552 100644
--- a/indra/llmessage/llcachename.cpp
+++ b/indra/llmessage/llcachename.cpp
@@ -189,6 +189,7 @@ typedef std::set<LLUUID> AskQueue;
typedef std::list<PendingReply*> ReplyQueue;
typedef std::map<LLUUID,U32> PendingQueue;
typedef std::map<LLUUID, LLCacheNameEntry*> Cache;
+typedef std::map<std::string, LLUUID> ReverseCache;
class LLCacheName::Impl
{
@@ -198,7 +199,9 @@ public:
Cache mCache;
// the map of UUIDs to names
-
+ ReverseCache mReverseCache;
+ // map of names to UUIDs
+
AskQueue mAskNameQueue;
AskQueue mAskGroupQueue;
// UUIDs to ask our upstream host about
@@ -371,7 +374,9 @@ void LLCacheName::importFile(LLFILE* fp)
entry->mFirstName = firstname;
entry->mLastName = lastname;
impl.mCache[id] = entry;
-
+ std::string fullname = entry->mFirstName + " " + entry->mLastName;
+ impl.mReverseCache[fullname] = id;
+
count++;
}
@@ -407,6 +412,8 @@ bool LLCacheName::importFile(std::istream& istr)
entry->mFirstName = agent[FIRST].asString();
entry->mLastName = agent[LAST].asString();
impl.mCache[id] = entry;
+ std::string fullname = entry->mFirstName + " " + entry->mLastName;
+ impl.mReverseCache[fullname] = id;
++count;
}
@@ -428,6 +435,7 @@ bool LLCacheName::importFile(std::istream& istr)
entry->mCreateTime = ctime;
entry->mGroupName = group[NAME].asString();
impl.mCache[id] = entry;
+ impl.mReverseCache[entry->mGroupName] = id;
++count;
}
llinfos << "LLCacheName loaded " << count << " group names" << llendl;
@@ -548,6 +556,27 @@ BOOL LLCacheName::getGroupName(const LLUUID& id, std::string& group)
return FALSE;
}
}
+
+BOOL LLCacheName::getUUID(const std::string& first, const std::string& last, LLUUID& id)
+{
+ std::string fullname = first + " " + last;
+ return getUUID(fullname, id);
+}
+
+BOOL LLCacheName::getUUID(const std::string& fullname, LLUUID& id)
+{
+ ReverseCache::iterator iter = impl.mReverseCache.find(fullname);
+ if (iter != impl.mReverseCache.end())
+ {
+ id = iter->second;
+ return TRUE;
+ }
+ else
+ {
+ return FALSE;
+ }
+}
+
// This is a little bit kludgy. LLCacheNameCallback is a slot instead of a function pointer.
// The reason it is a slot is so that the legacy get() function below can bind an old callback
// and pass it as a slot. The reason it isn't a boost::function is so that trackable behavior
@@ -897,10 +926,13 @@ void LLCacheName::Impl::processUUIDReply(LLMessageSystem* msg, bool isGroup)
if (!isGroup)
{
mSignal(id, entry->mFirstName, entry->mLastName, FALSE);
+ std::string fullname = entry->mFirstName + " " + entry->mLastName;
+ mReverseCache[fullname] = id;
}
else
{
mSignal(id, entry->mGroupName, "", TRUE);
+ mReverseCache[entry->mGroupName] = id;
}
}
}
diff --git a/indra/llmessage/llcachename.h b/indra/llmessage/llcachename.h
index 8641437d86..111cc8b650 100644
--- a/indra/llmessage/llcachename.h
+++ b/indra/llmessage/llcachename.h
@@ -86,6 +86,10 @@ public:
BOOL getName(const LLUUID& id, std::string& first, std::string& last);
BOOL getFullName(const LLUUID& id, std::string& fullname);
+ // Reverse lookup of UUID from name
+ BOOL getUUID(const std::string& first, const std::string& last, LLUUID& id);
+ BOOL getUUID(const std::string& fullname, LLUUID& id);
+
// If available, this method copies the group name into the string
// provided. The caller must allocate at least
// DB_GROUP_NAME_BUF_SIZE characters. If not available, this
diff --git a/indra/llui/llflatlistview.cpp b/indra/llui/llflatlistview.cpp
index 19f203b80c..8de3a8a96f 100644
--- a/indra/llui/llflatlistview.cpp
+++ b/indra/llui/llflatlistview.cpp
@@ -94,6 +94,9 @@ bool LLFlatListView::addItem(LLPanel * item, const LLSD& value /*= LLUUID::null*
item->setMouseDownCallback(boost::bind(&LLFlatListView::onItemMouseClick, this, new_pair, _4));
item->setRightMouseDownCallback(boost::bind(&LLFlatListView::onItemRightMouseClick, this, new_pair, _4));
+ // Children don't accept the focus
+ item->setTabStop(false);
+
rearrangeItems();
notifyParentItemsRectChanged();
return true;
@@ -282,6 +285,9 @@ void LLFlatListView::resetSelection(bool no_commit_on_deselection /*= false*/)
{
onCommit();
}
+
+ // Stretch selected items rect to ensure it won't be clipped
+ mSelectedItemsBorder->setRect(getSelectedItemsRect().stretch(-1));
}
void LLFlatListView::setNoItemsCommentText(const std::string& comment_text)
@@ -381,8 +387,34 @@ LLFlatListView::LLFlatListView(const LLFlatListView::Params& p)
//we don't need to stretch in vertical direction on reshaping by a parent
//no bottom following!
mItemsPanel->setFollows(FOLLOWS_LEFT | FOLLOWS_RIGHT | FOLLOWS_TOP);
+
+ LLViewBorder::Params params;
+ params.name("scroll border");
+ params.rect(getSelectedItemsRect());
+ params.visible(false);
+ params.bevel_style(LLViewBorder::BEVEL_IN);
+ mSelectedItemsBorder = LLUICtrlFactory::create<LLViewBorder> (params);
+ mItemsPanel->addChild( mSelectedItemsBorder );
};
+// virtual
+void LLFlatListView::draw()
+{
+ // Highlight border if a child of this container has keyboard focus
+ if( mSelectedItemsBorder->getVisible() )
+ {
+ mSelectedItemsBorder->setKeyboardFocusHighlight( hasFocus() );
+ }
+ LLScrollContainer::draw();
+}
+
+// virtual
+BOOL LLFlatListView::postBuild()
+{
+ setTabStop(true);
+ return LLScrollContainer::postBuild();
+}
+
void LLFlatListView::rearrangeItems()
{
static LLUICachedControl<S32> scrollbar_size ("UIScrollbarSize", 0);
@@ -444,6 +476,9 @@ void LLFlatListView::rearrangeItems()
// move top for next item in list
item_new_top -= (rc.getHeight() + mItemPad);
}
+
+ // Stretch selected items rect to ensure it won't be clipped
+ mSelectedItemsBorder->setRect(getSelectedItemsRect().stretch(-1));
}
void LLFlatListView::onItemMouseClick(item_pair_t* item_pair, MASK mask)
@@ -473,6 +508,64 @@ void LLFlatListView::onItemRightMouseClick(item_pair_t* item_pair, MASK mask)
onItemMouseClick(item_pair, mask);
}
+BOOL LLFlatListView::handleKeyHere(KEY key, MASK mask)
+{
+ BOOL reset_selection = (mask != MASK_SHIFT);
+ BOOL handled = FALSE;
+ switch (key)
+ {
+ case KEY_RETURN:
+ {
+ if (mSelectedItemPairs.size() && mask == MASK_NONE)
+ {
+ mOnReturnSignal(this, getValue());
+ handled = TRUE;
+ }
+ break;
+ }
+ case KEY_UP:
+ {
+ if ( !selectNextItemPair(true, reset_selection) && reset_selection)
+ {
+ // If case we are in accordion tab notify parent to go to the previous accordion
+ notifyParent(LLSD().insert("action","select_prev"));
+ }
+ break;
+ }
+ case KEY_DOWN:
+ {
+ if ( !selectNextItemPair(false, reset_selection) && reset_selection)
+ {
+ // If case we are in accordion tab notify parent to go to the next accordion
+ notifyParent(LLSD().insert("action","select_next"));
+ }
+ break;
+ }
+ case 'A':
+ {
+ if(MASK_CONTROL & mask)
+ {
+ selectAll();
+ handled = TRUE;
+ }
+ break;
+ }
+ default:
+ break;
+ }
+
+ if ( key == KEY_UP || key == KEY_DOWN )
+ {
+ LLRect selcted_rect = getLastSelectedItemRect().stretch(1);
+ LLRect visible_rect = getVisibleContentRect();
+ if ( !visible_rect.contains (selcted_rect) )
+ scrollToShowRect(selcted_rect);
+ handled = TRUE;
+ }
+
+ return handled ? handled : LLScrollContainer::handleKeyHere(key, mask);
+}
+
LLFlatListView::item_pair_t* LLFlatListView::getItemPair(LLPanel* item) const
{
llassert(item);
@@ -552,6 +645,143 @@ bool LLFlatListView::selectItemPair(item_pair_t* item_pair, bool select)
onCommit();
}
+ setFocus(TRUE);
+
+ // Stretch selected items rect to ensure it won't be clipped
+ mSelectedItemsBorder->setRect(getSelectedItemsRect().stretch(-1));
+
+ return true;
+}
+
+LLRect LLFlatListView::getLastSelectedItemRect()
+{
+ if (!mSelectedItemPairs.size())
+ {
+ return LLRect::null;
+ }
+
+ return mSelectedItemPairs.back()->first->getRect();
+}
+
+LLRect LLFlatListView::getSelectedItemsRect()
+{
+ if (!mSelectedItemPairs.size())
+ {
+ return LLRect::null;
+ }
+ LLRect rc = getLastSelectedItemRect();
+ for ( pairs_const_iterator_t
+ it = mSelectedItemPairs.begin(),
+ it_end = mSelectedItemPairs.end();
+ it != it_end; ++it )
+ {
+ rc.unionWith((*it)->first->getRect());
+ }
+ return rc;
+}
+
+// virtual
+bool LLFlatListView::selectNextItemPair(bool is_up_direction, bool reset_selection)
+{
+ // No items - no actions!
+ if ( !mItemPairs.size() )
+ return false;
+
+ item_pair_t* cur_sel_pair = NULL;
+ item_pair_t* to_sel_pair = NULL;
+
+ if ( mSelectedItemPairs.size() )
+ {
+ // Take the last selected pair
+ cur_sel_pair = mSelectedItemPairs.back();
+ }
+ else
+ {
+ // If there weren't selected items then choose the first one bases on given direction
+ cur_sel_pair = (is_up_direction) ? mItemPairs.back() : mItemPairs.front();
+ // Force selection to first item
+ to_sel_pair = cur_sel_pair;
+ }
+
+ // Bases on given direction choose next item to select
+ if ( is_up_direction )
+ {
+ // Find current selected item position in mItemPairs list
+ pairs_list_t::reverse_iterator sel_it = std::find(mItemPairs.rbegin(), mItemPairs.rend(), cur_sel_pair);
+
+ for (;++sel_it != mItemPairs.rend();)
+ {
+ // skip invisible items
+ if ( (*sel_it)->first->getVisible() )
+ {
+ to_sel_pair = *sel_it;
+ break;
+ }
+ }
+ }
+ else
+ {
+ // Find current selected item position in mItemPairs list
+ pairs_list_t::iterator sel_it = std::find(mItemPairs.begin(), mItemPairs.end(), cur_sel_pair);
+
+ for (;++sel_it != mItemPairs.end();)
+ {
+ // skip invisible items
+ if ( (*sel_it)->first->getVisible() )
+ {
+ to_sel_pair = *sel_it;
+ break;
+ }
+ }
+ }
+
+ if ( to_sel_pair )
+ {
+ bool select = true;
+
+ if ( reset_selection )
+ {
+ // Reset current selection if we were asked about it
+ resetSelection();
+ }
+ else
+ {
+ // If item already selected and no reset request than we should deselect last selected item.
+ select = (mSelectedItemPairs.end() == std::find(mSelectedItemPairs.begin(), mSelectedItemPairs.end(), to_sel_pair));
+ }
+
+ // Select/Deselect next item
+ selectItemPair(select ? to_sel_pair : cur_sel_pair, select);
+
+ return true;
+ }
+ return false;
+}
+
+bool LLFlatListView::selectAll()
+{
+ if (!mAllowSelection)
+ return false;
+
+ mSelectedItemPairs.clear();
+
+ for (pairs_const_iterator_t it= mItemPairs.begin(); it != mItemPairs.end(); ++it)
+ {
+ item_pair_t* item_pair = *it;
+ mSelectedItemPairs.push_back(item_pair);
+ //a way of notifying panel of selection state changes
+ LLPanel* item = item_pair->first;
+ item->setValue(SELECTED_EVENT);
+ }
+
+ if (mCommitOnSelectionChange)
+ {
+ onCommit();
+ }
+
+ // Stretch selected items rect to ensure it won't be clipped
+ mSelectedItemsBorder->setRect(getSelectedItemsRect().stretch(-1));
+
return true;
}
@@ -670,4 +900,15 @@ void LLFlatListView::getValues(std::vector<LLSD>& values) const
}
}
+// virtual
+void LLFlatListView::onFocusReceived()
+{
+ mSelectedItemsBorder->setVisible(TRUE);
+}
+// virtual
+void LLFlatListView::onFocusLost()
+{
+ mSelectedItemsBorder->setVisible(FALSE);
+}
+
//EOF
diff --git a/indra/llui/llflatlistview.h b/indra/llui/llflatlistview.h
index 8a357a49d0..3867e910c0 100644
--- a/indra/llui/llflatlistview.h
+++ b/indra/llui/llflatlistview.h
@@ -113,6 +113,10 @@ public:
virtual ~LLFlatListView() { clear(); };
+ /**
+ * Connects callback to signal called when Return key is pressed.
+ */
+ boost::signals2::connection setReturnCallback( const commit_signal_t::slot_type& cb ) { return mOnReturnSignal.connect(cb); }
/** Overridden LLPanel's reshape, height is ignored, the list sets its height to accommodate all items */
virtual void reshape(S32 width, S32 height, BOOL called_from_parent = TRUE);
@@ -318,6 +322,10 @@ protected:
virtual bool selectItemPair(item_pair_t* item_pair, bool select);
+ virtual bool selectNextItemPair(bool is_up_direction, bool reset_selection);
+
+ virtual bool selectAll();
+
virtual bool isSelected(item_pair_t* item_pair) const;
virtual bool removeItemPair(item_pair_t* item_pair);
@@ -331,6 +339,19 @@ protected:
*/
void notifyParentItemsRectChanged();
+ virtual BOOL handleKeyHere(KEY key, MASK mask);
+
+ virtual BOOL postBuild();
+
+ virtual void onFocusReceived();
+
+ virtual void onFocusLost();
+
+ virtual void draw();
+
+ LLRect getLastSelectedItemRect();
+
+ LLRect getSelectedItemsRect();
private:
@@ -381,6 +402,10 @@ private:
LLRect mPrevNotifyParentRect;
LLTextBox* mNoItemsCommentTextbox;
+
+ LLViewBorder* mSelectedItemsBorder;
+
+ commit_signal_t mOnReturnSignal;
};
#endif
diff --git a/indra/llui/llfloater.cpp b/indra/llui/llfloater.cpp
index 2a0dcaf333..bf965e8e28 100644
--- a/indra/llui/llfloater.cpp
+++ b/indra/llui/llfloater.cpp
@@ -2526,8 +2526,12 @@ void LLFloaterView::pushVisibleAll(BOOL visible, const skip_list_t& skip_list)
void LLFloaterView::popVisibleAll(const skip_list_t& skip_list)
{
- for (child_list_const_iter_t child_iter = getChildList()->begin();
- child_iter != getChildList()->end(); ++child_iter)
+ // make a copy of the list since some floaters change their
+ // order in the childList when changing visibility.
+ child_list_t child_list_copy = *getChildList();
+
+ for (child_list_const_iter_t child_iter = child_list_copy.begin();
+ child_iter != child_list_copy.end(); ++child_iter)
{
LLView *view = *child_iter;
if (skip_list.find(view) == skip_list.end())
diff --git a/indra/llui/llfloater.h b/indra/llui/llfloater.h
index 95c8dd84f6..1b98dddddc 100644
--- a/indra/llui/llfloater.h
+++ b/indra/llui/llfloater.h
@@ -195,6 +195,7 @@ public:
/// 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 isFirstLook() { return mFirstLook; } // EXT-2653: This function is necessary to prevent overlapping for secondary showed toasts
BOOL isFrontmost();
BOOL isDependent() { return !mDependeeHandle.isDead(); }
void setCanMinimize(BOOL can_minimize);
diff --git a/indra/llui/lltextbase.cpp b/indra/llui/lltextbase.cpp
index cd795282f9..ab1006ffd7 100644
--- a/indra/llui/lltextbase.cpp
+++ b/indra/llui/lltextbase.cpp
@@ -1505,6 +1505,7 @@ void LLTextBase::appendText(const std::string &new_text, bool prepend_newline, c
LLStyle::Params link_params = style_params;
link_params.color = match.getColor();
+ link_params.readonly_color = match.getColor();
// apply font name from requested style_params
std::string font_name = LLFontGL::nameFromFont(style_params.font());
std::string font_size = LLFontGL::sizeFromFont(style_params.font());
@@ -2059,16 +2060,16 @@ void LLTextBase::updateRects()
mContentsRect.unionWith(line_iter->mRect);
}
- mContentsRect.mLeft = 0;
+ S32 delta_pos_x = -mContentsRect.mLeft;
mContentsRect.mTop += mVPad;
S32 delta_pos = -mContentsRect.mBottom;
// move line segments to fit new document rect
for (line_list_t::iterator it = mLineInfoList.begin(); it != mLineInfoList.end(); ++it)
{
- it->mRect.translate(0, delta_pos);
+ it->mRect.translate(delta_pos_x, delta_pos);
}
- mContentsRect.translate(0, delta_pos);
+ mContentsRect.translate(delta_pos_x, delta_pos);
}
// update document container dimensions according to text contents
diff --git a/indra/llwindow/llwindowmacosx.cpp b/indra/llwindow/llwindowmacosx.cpp
index 96e5a1b7ca..af9a30cb25 100644
--- a/indra/llwindow/llwindowmacosx.cpp
+++ b/indra/llwindow/llwindowmacosx.cpp
@@ -522,7 +522,6 @@ BOOL LLWindowMacOSX::createContext(int x, int y, int width, int height, int bits
if (mTSMDocument)
{
ActivateTSMDocument(mTSMDocument);
- UseInputWindow(mTSMDocument, FALSE);
allowLanguageTextInput(NULL, FALSE);
}
}
@@ -3317,6 +3316,8 @@ void LLWindowMacOSX::allowLanguageTextInput(LLPreeditor *preeditor, BOOL b)
return;
}
+ UseInputWindow(mTSMDocument, !b);
+
// Take care of old and new preeditors.
if (preeditor != mPreeditor || !b)
{
diff --git a/indra/lscript/lscript_compile/indra.l b/indra/lscript/lscript_compile/indra.l
index 8c891b3e8f..8fe9f5ed29 100644
--- a/indra/lscript/lscript_compile/indra.l
+++ b/indra/lscript/lscript_compile/indra.l
@@ -613,6 +613,7 @@ extern "C" { int yyerror(const char *fmt, ...); }
"CLICK_ACTION_OPEN" { count(); yylval.ival = CLICK_ACTION_OPEN; return(INTEGER_CONSTANT); }
"CLICK_ACTION_PLAY" { count(); yylval.ival = CLICK_ACTION_PLAY; return(INTEGER_CONSTANT); }
"CLICK_ACTION_OPEN_MEDIA" { count(); yylval.ival = CLICK_ACTION_OPEN_MEDIA; return(INTEGER_CONSTANT); }
+"CLICK_ACTION_ZOOM" { count(); yylval.ival = CLICK_ACTION_ZOOM; return(INTEGER_CONSTANT); }
"TEXTURE_BLANK" { yylval.sval = new char[UUID_STR_LENGTH]; strcpy(yylval.sval, "5748decc-f629-461c-9a36-a35a221fe21f"); return(STRING_CONSTANT); }
"TEXTURE_DEFAULT" { yylval.sval = new char[UUID_STR_LENGTH]; strcpy(yylval.sval, "89556747-24cb-43ed-920b-47caed15465f"); return(STRING_CONSTANT); }
diff --git a/indra/newview/CMakeLists.txt b/indra/newview/CMakeLists.txt
index 3681f3eb93..e632cbaaf2 100644
--- a/indra/newview/CMakeLists.txt
+++ b/indra/newview/CMakeLists.txt
@@ -239,6 +239,7 @@ set(viewer_SOURCE_FILES
llhudtext.cpp
llhudview.cpp
llimfloater.cpp
+ llimfloatercontainer.cpp
llimhandler.cpp
llimpanel.cpp
llimview.cpp
@@ -364,6 +365,7 @@ set(viewer_SOURCE_FILES
llremoteparcelrequest.cpp
llsavedsettingsglue.cpp
llscreenchannel.cpp
+ llscriptfloater.cpp
llscrollingpanelparam.cpp
llsearchcombobox.cpp
llsearchhistory.cpp
@@ -737,6 +739,7 @@ set(viewer_HEADER_FILES
llhudtext.h
llhudview.h
llimfloater.h
+ llimfloatercontainer.h
llimpanel.h
llimview.h
llinspect.h
@@ -860,6 +863,7 @@ set(viewer_HEADER_FILES
llrootview.h
llsavedsettingsglue.h
llscreenchannel.h
+ llscriptfloater.h
llscrollingpanelparam.h
llsearchcombobox.h
llsearchhistory.h
@@ -1376,7 +1380,7 @@ if (WINDOWS)
# sets the 'working directory' for debugging from visual studio.
if (NOT UNATTENDED)
add_custom_command(
- TARGET ${VIEWER_BINARY_NAME} PRE_BUILD
+ TARGET ${VIEWER_BINARY_NAME} POST_BUILD
COMMAND ${CMAKE_SOURCE_DIR}/tools/vstool/vstool.exe
ARGS
--solution
diff --git a/indra/newview/app_settings/keywords.ini b/indra/newview/app_settings/keywords.ini
index 5f6fd6e4a7..14025c8061 100644
--- a/indra/newview/app_settings/keywords.ini
+++ b/indra/newview/app_settings/keywords.ini
@@ -510,6 +510,7 @@ CLICK_ACTION_PAY Used with llSetClickAction to set pay as the default act
CLICK_ACTION_OPEN Used with llSetClickAction to set open as the default action when object is clicked
CLICK_ACTION_PLAY Used with llSetClickAction to set play as the default action when object is clicked
CLICK_ACTION_OPEN_MEDIA Used with llSetClickAction to set open-media as the default action when object is clicked
+CLICK_ACTION_ZOOM Used with llSetClickAction to set zoom in as the default action when object is clicked
TOUCH_INVALID_TEXCOORD Value returned by llDetectedTouchUV() and llDetectedTouchST() when the touch position is not valid.
TOUCH_INVALID_VECTOR Value returned by llDetectedTouchPos(), llDetectedTouchNormal(), and llDetectedTouchBinormal() when the touch position is not valid.
diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml
index c7279a2e33..994e546bd0 100644
--- a/indra/newview/app_settings/settings.xml
+++ b/indra/newview/app_settings/settings.xml
@@ -3585,7 +3585,7 @@
<key>Type</key>
<string>String</string>
<key>Value</key>
- <string>http://docs.lindenlab.com/help/helpfloater.php?topic=[TOPIC]&amp;channel=[CHANNEL]&amp;version=[VERSION]&amp;os=[OS]&amp;language=[LANGUAGE]&amp;version_major=[VERSION_MAJOR]&amp;version_minor=[VERSION_MINOR]&amp;version_patch=[VERSION_PATCH]&amp;version_build=[VERSION_BUILD]</string>
+ <string>http://viewer-help.secondlife.com/[LANGUAGE]/[CHANNEL]/[VERSION]/[TOPIC]</string>
</map>
<key>HighResSnapshot</key>
<map>
@@ -5371,6 +5371,19 @@
<key>Value</key>
<real>1.0</real>
</map>
+
+ <key>PlainTextChatHistory</key>
+ <map>
+ <key>Comment</key>
+ <string>Enable/Disable plain text chat history style</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
+
<key>PluginInstancesLow</key>
<map>
<key>Comment</key>
diff --git a/indra/newview/llagent.cpp b/indra/newview/llagent.cpp
index fb2ecb3bed..4dd569e2fa 100644
--- a/indra/newview/llagent.cpp
+++ b/indra/newview/llagent.cpp
@@ -2810,7 +2810,11 @@ void LLAgent::endAnimationUpdateUI()
LLFloaterReg::restoreVisibleInstances();
#else // Use this for now
LLFloaterView::skip_list_t skip_list;
- skip_list.insert(LLFloaterReg::findInstance("mini_map"));
+ if (LLFloaterReg::findInstance("mini_map"))
+ {
+ skip_list.insert(LLFloaterReg::findInstance("mini_map"));
+ }
+
gFloaterView->popVisibleAll(skip_list);
#endif
mViewsPushed = FALSE;
diff --git a/indra/newview/llappviewer.cpp b/indra/newview/llappviewer.cpp
index a5ca06ce30..fa0ea557ba 100644
--- a/indra/newview/llappviewer.cpp
+++ b/indra/newview/llappviewer.cpp
@@ -985,7 +985,8 @@ bool LLAppViewer::mainLoop()
#endif
//memory leaking simulation
- LLFloaterMemLeak* mem_leak_instance = LLFloaterReg::getTypedInstance<LLFloaterMemLeak>("mem_leaking");
+ LLFloaterMemLeak* mem_leak_instance =
+ LLFloaterReg::findTypedInstance<LLFloaterMemLeak>("mem_leaking");
if(mem_leak_instance)
{
mem_leak_instance->idle() ;
@@ -1171,7 +1172,8 @@ bool LLAppViewer::mainLoop()
catch(std::bad_alloc)
{
//stop memory leaking simulation
- LLFloaterMemLeak* mem_leak_instance = LLFloaterReg::getTypedInstance<LLFloaterMemLeak>("mem_leaking");
+ LLFloaterMemLeak* mem_leak_instance =
+ LLFloaterReg::findTypedInstance<LLFloaterMemLeak>("mem_leaking");
if(mem_leak_instance)
{
mem_leak_instance->stop() ;
@@ -1199,7 +1201,8 @@ bool LLAppViewer::mainLoop()
llwarns << "Bad memory allocation when saveFinalSnapshot() is called!" << llendl ;
//stop memory leaking simulation
- LLFloaterMemLeak* mem_leak_instance = LLFloaterReg::getTypedInstance<LLFloaterMemLeak>("mem_leaking");
+ LLFloaterMemLeak* mem_leak_instance =
+ LLFloaterReg::findTypedInstance<LLFloaterMemLeak>("mem_leaking");
if(mem_leak_instance)
{
mem_leak_instance->stop() ;
@@ -1357,19 +1360,25 @@ bool LLAppViewer::cleanup()
llinfos << "Waiting for pending IO to finish: " << pending << llendflush;
ms_sleep(100);
}
- llinfos << "Shutting down." << llendflush;
+ llinfos << "Shutting down Views" << llendflush;
// Destroy the UI
if( gViewerWindow)
gViewerWindow->shutdownViews();
+
+ llinfos << "Cleaning up Inevntory" << llendflush;
// Cleanup Inventory after the UI since it will delete any remaining observers
// (Deleted observers should have already removed themselves)
gInventory.cleanupInventory();
+
+ llinfos << "Cleaning up Selections" << llendflush;
// Clean up selection managers after UI is destroyed, as UI may be observing them.
// Clean up before GL is shut down because we might be holding on to objects with texture references
LLSelectMgr::cleanupGlobals();
+
+ llinfos << "Shutting down OpenGL" << llendflush;
// Shut down OpenGL
if( gViewerWindow)
@@ -1383,11 +1392,18 @@ bool LLAppViewer::cleanup()
gViewerWindow = NULL;
llinfos << "ViewerWindow deleted" << llendflush;
}
+
+ llinfos << "Cleaning up Keyboard & Joystick" << llendflush;
// viewer UI relies on keyboard so keep it aound until viewer UI isa gone
delete gKeyboard;
gKeyboard = NULL;
+ // Turn off Space Navigator and similar devices
+ LLViewerJoystick::getInstance()->terminate();
+
+ llinfos << "Cleaning up Objects" << llendflush;
+
LLViewerObject::cleanupVOClasses();
LLWaterParamManager::cleanupClass();
@@ -1410,6 +1426,8 @@ bool LLAppViewer::cleanup()
}
LLPrimitive::cleanupVolumeManager();
+ llinfos << "Additional Cleanup..." << llendflush;
+
LLViewerParcelMgr::cleanupGlobals();
// *Note: this is where gViewerStats used to be deleted.
@@ -1429,9 +1447,11 @@ bool LLAppViewer::cleanup()
// Also after shutting down the messaging system since it has VFS dependencies
//
+ llinfos << "Cleaning up VFS" << llendflush;
LLVFile::cleanupClass();
- llinfos << "VFS cleaned up" << llendflush;
+ llinfos << "Saving Data" << llendflush;
+
// Quitting with "Remember Password" turned off should always stomp your
// saved password, whether or not you successfully logged in. JC
if (!gSavedSettings.getBOOL("RememberPassword"))
@@ -1473,13 +1493,16 @@ bool LLAppViewer::cleanup()
gDirUtilp->deleteFilesInDir(gDirUtilp->getExpandedFilename(LL_PATH_CACHE,""),mask);
}
- // Turn off Space Navigator and similar devices
- LLViewerJoystick::getInstance()->terminate();
-
removeMarkerFile(); // Any crashes from here on we'll just have to ignore
writeDebugInfo();
+ LLLocationHistory::getInstance()->save();
+
+ LLAvatarIconIDCache::getInstance()->save();
+
+ llinfos << "Shutting down Threads" << llendflush;
+
// Let threads finish
LLTimer idleTimer;
idleTimer.reset();
@@ -1512,14 +1535,9 @@ bool LLAppViewer::cleanup()
sTextureFetch = NULL;
delete sImageDecodeThread;
sImageDecodeThread = NULL;
-
- LLLocationHistory::getInstance()->save();
-
- LLAvatarIconIDCache::getInstance()->save();
-
delete mFastTimerLogThread;
mFastTimerLogThread = NULL;
-
+
if (LLFastTimerView::sAnalyzePerformance)
{
llinfos << "Analyzing performance" << llendl;
@@ -1541,6 +1559,8 @@ bool LLAppViewer::cleanup()
}
LLMetricPerformanceTester::cleanClass() ;
+ llinfos << "Cleaning up Media and Textures" << llendflush;
+
//Note:
//LLViewerMedia::cleanupClass() has to be put before gTextureList.shutdown()
//because some new image might be generated during cleaning up media. --bao
@@ -1554,13 +1574,13 @@ bool LLAppViewer::cleanup()
LLVFSThread::cleanupClass();
LLLFSThread::cleanupClass();
- llinfos << "VFS Thread finished" << llendflush;
-
#ifndef LL_RELEASE_FOR_DOWNLOAD
llinfos << "Auditing VFS" << llendl;
gVFS->audit();
#endif
+ llinfos << "Misc Cleanup" << llendflush;
+
// For safety, the LLVFS has to be deleted *after* LLVFSThread. This should be cleaned up.
// (LLVFS doesn't know about LLVFSThread so can't kill pending requests) -Steve
delete gStaticVFS;
@@ -1574,12 +1594,11 @@ bool LLAppViewer::cleanup()
LLWatchdog::getInstance()->cleanup();
+ llinfos << "Shutting down message system" << llendflush;
end_messaging_system();
- llinfos << "Message system deleted." << llendflush;
// *NOTE:Mani - The following call is not thread safe.
LLCurl::cleanupClass();
- llinfos << "LLCurl cleaned up." << llendflush;
// If we're exiting to launch an URL, do that here so the screen
// is at the right resolution before we launch IE.
@@ -1600,7 +1619,7 @@ bool LLAppViewer::cleanup()
ll_close_fail_log();
- llinfos << "Goodbye" << llendflush;
+ llinfos << "Goodbye!" << llendflush;
// return 0;
return true;
diff --git a/indra/newview/llavataractions.cpp b/indra/newview/llavataractions.cpp
index 130f729df0..839a84f2d2 100644
--- a/indra/newview/llavataractions.cpp
+++ b/indra/newview/llavataractions.cpp
@@ -347,9 +347,9 @@ void LLAvatarActions::inviteToGroup(const LLUUID& id)
LLFloaterGroupPicker* widget = LLFloaterReg::showTypedInstance<LLFloaterGroupPicker>("group_picker", LLSD(id));
if (widget)
{
- widget->removeNoneOption();
widget->center();
widget->setPowersMask(GP_MEMBER_INVITE);
+ widget->removeNoneOption();
widget->setSelectGroupCallback(boost::bind(callback_invite_to_group, _1, id));
}
}
diff --git a/indra/newview/llchathistory.cpp b/indra/newview/llchathistory.cpp
index 4ce3b50ed5..533940943e 100644
--- a/indra/newview/llchathistory.cpp
+++ b/indra/newview/llchathistory.cpp
@@ -202,10 +202,8 @@ public:
userName->setValue(SL);
}
+ setTimeField(chat.mTimeStr);
- LLTextBox* timeBox = getChild<LLTextBox>("time_box");
- timeBox->setValue(chat.mTimeStr);
-
LLAvatarIconCtrl* icon = getChild<LLAvatarIconCtrl>("avatar_icon");
if(mSourceType != CHAT_SOURCE_AGENT)
@@ -271,7 +269,28 @@ protected:
}
}
-
+private:
+ void setTimeField(const std::string& time_value)
+ {
+ LLTextBox* time_box = getChild<LLTextBox>("time_box");
+
+ LLRect rect_before = time_box->getRect();
+ time_box->setValue(time_value);
+
+ // set necessary textbox width to fit all text
+ time_box->reshapeToFitText();
+ LLRect rect_after = time_box->getRect();
+
+ // move rect to the left to correct position...
+ S32 delta_pos_x = rect_before.getWidth() - rect_after.getWidth();
+ S32 delta_pos_y = rect_before.getHeight() - rect_after.getHeight();
+ time_box->translate(delta_pos_x, delta_pos_y);
+
+ //... & change width of the name control
+ LLTextBox* user_name = getChild<LLTextBox>("user_name");
+ const LLRect& user_rect = user_name->getRect();
+ user_name->reshape(user_rect.getWidth() + delta_pos_x, user_rect.getHeight());
+ }
protected:
LLHandle<LLView> mPopupMenuHandleAvatar;
@@ -334,20 +353,14 @@ LLView* LLChatHistory::getHeader(const LLChat& chat,const LLStyle::Params& style
return header;
}
-void LLChatHistory::appendWidgetMessage(const LLChat& chat, const LLStyle::Params& input_append_params)
+void LLChatHistory::clear()
{
- LLView* view = NULL;
- std::string view_text = "\n[" + chat.mTimeStr + "] ";
- if (utf8str_trim(chat.mFromName).size() != 0 && chat.mFromName != SYSTEM_FROM)
- view_text += chat.mFromName + ": ";
-
-
- LLInlineViewSegment::Params p;
- p.force_newline = true;
- p.left_pad = mLeftWidgetPad;
- p.right_pad = mRightWidgetPad;
+ mLastFromName.clear();
+ LLTextEditor::clear();
+}
-
+void LLChatHistory::appendMessage(const LLChat& chat, const bool use_plain_text_chat_history, const LLStyle::Params& input_append_params)
+{
LLColor4 txt_color = LLUIColorTable::instance().getColor("White");
LLViewerChat::getChatColor(chat,txt_color);
LLFontGL* fontp = LLViewerChat::getChatFont();
@@ -360,39 +373,63 @@ void LLChatHistory::appendWidgetMessage(const LLChat& chat, const LLStyle::Param
style_params.font.size(font_size);
style_params.font.style(input_append_params.font.style);
-
+ std::string header_text = "[" + chat.mTimeStr + "] ";
+ if (utf8str_trim(chat.mFromName).size() != 0 && chat.mFromName != SYSTEM_FROM)
+ header_text += chat.mFromName + ": ";
- if (mLastFromName == chat.mFromName)
+ if (use_plain_text_chat_history)
{
- view = getSeparator();
- p.top_pad = mTopSeparatorPad;
- p.bottom_pad = mBottomSeparatorPad;
+ appendText(header_text, getText().size() != 0, style_params);
}
else
{
- view = getHeader(chat,style_params);
- if (getText().size() == 0)
- p.top_pad = 0;
+ LLView* view = NULL;
+ LLInlineViewSegment::Params p;
+ p.force_newline = true;
+ p.left_pad = mLeftWidgetPad;
+ p.right_pad = mRightWidgetPad;
+
+ if (mLastFromName == chat.mFromName)
+ {
+ view = getSeparator();
+ p.top_pad = mTopSeparatorPad;
+ p.bottom_pad = mBottomSeparatorPad;
+ }
else
- p.top_pad = mTopHeaderPad;
- p.bottom_pad = mBottomHeaderPad;
-
+ {
+ view = getHeader(chat, style_params);
+ if (getText().size() == 0)
+ p.top_pad = 0;
+ else
+ p.top_pad = mTopHeaderPad;
+ p.bottom_pad = mBottomHeaderPad;
+
+ }
+ p.view = view;
+
+ //Prepare the rect for the view
+ LLRect target_rect = getDocumentView()->getRect();
+ // squeeze down the widget by subtracting padding off left and right
+ target_rect.mLeft += mLeftWidgetPad + mHPad;
+ target_rect.mRight -= mRightWidgetPad;
+ view->reshape(target_rect.getWidth(), view->getRect().getHeight());
+ view->setOrigin(target_rect.mLeft, view->getRect().mBottom);
+
+ appendWidget(p, header_text, false);
+ mLastFromName = chat.mFromName;
}
- p.view = view;
-
- //Prepare the rect for the view
- LLRect target_rect = getDocumentView()->getRect();
- // squeeze down the widget by subtracting padding off left and right
- target_rect.mLeft += mLeftWidgetPad + mHPad;
- target_rect.mRight -= mRightWidgetPad;
- view->reshape(target_rect.getWidth(), view->getRect().getHeight());
- view->setOrigin(target_rect.mLeft, view->getRect().mBottom);
-
- appendWidget(p, view_text, false);
-
- //Append the text message
- appendText(chat.mText, FALSE, style_params);
+ //Handle IRC styled /me messages.
+ std::string prefix = chat.mText.substr(0, 4);
+ if (prefix == "/me " || prefix == "/me'")
+ {
+ style_params.font.style = "ITALIC";
- mLastFromName = chat.mFromName;
+ if (chat.mFromName.size() > 0)
+ appendText(chat.mFromName + " ", TRUE, style_params);
+ appendText(chat.mText.substr(4), FALSE, style_params);
+ }
+ else
+ appendText(chat.mText, FALSE, style_params);
blockUndo();
}
+
diff --git a/indra/newview/llchathistory.h b/indra/newview/llchathistory.h
index c89d4b4ec6..ef5839ff2f 100644
--- a/indra/newview/llchathistory.h
+++ b/indra/newview/llchathistory.h
@@ -106,10 +106,11 @@ class LLChatHistory : public LLTextEditor
* If last user appended message, concurs with current user,
* separator is added before the message, otherwise header is added.
* @param chat - base chat message.
- * @param time time of a message.
- * @param message message itself.
+ * @param use_plain_text_chat_history - whether to add message as plain text.
+ * @param input_append_params - font style.
*/
- void appendWidgetMessage(const LLChat& chat, const LLStyle::Params& input_append_params = LLStyle::Params());
+ void appendMessage(const LLChat& chat, const bool use_plain_text_chat_history = false, const LLStyle::Params& input_append_params = LLStyle::Params());
+ /*virtual*/ void clear();
private:
std::string mLastFromName;
diff --git a/indra/newview/llchiclet.cpp b/indra/newview/llchiclet.cpp
index 6a5877f673..433f70700c 100644
--- a/indra/newview/llchiclet.cpp
+++ b/indra/newview/llchiclet.cpp
@@ -43,6 +43,7 @@
#include "lllocalcliprect.h"
#include "llmenugl.h"
#include "lloutputmonitorctrl.h"
+#include "llscriptfloater.h"
#include "lltextbox.h"
#include "llvoiceclient.h"
#include "llvoicecontrolpanel.h"
@@ -55,6 +56,7 @@ static LLDefaultChildRegistry::Register<LLNotificationChiclet> t2("chiclet_notif
static LLDefaultChildRegistry::Register<LLIMP2PChiclet> t3("chiclet_im_p2p");
static LLDefaultChildRegistry::Register<LLIMGroupChiclet> t4("chiclet_im_group");
static LLDefaultChildRegistry::Register<LLAdHocChiclet> t5("chiclet_im_adhoc");
+static LLDefaultChildRegistry::Register<LLScriptChiclet> t6("chiclet_script");
static const LLRect CHICLET_RECT(0, 25, 25, 0);
static const LLRect CHICLET_ICON_RECT(0, 22, 22, 0);
@@ -1411,3 +1413,51 @@ LLChicletSpeakerCtrl::LLChicletSpeakerCtrl(const Params&p)
: LLOutputMonitorCtrl(p)
{
}
+
+//////////////////////////////////////////////////////////////////////////
+//////////////////////////////////////////////////////////////////////////
+//////////////////////////////////////////////////////////////////////////
+
+LLScriptChiclet::Params::Params()
+ : icon("icon")
+{
+ // *TODO Vadim: Get rid of hardcoded values.
+ rect(CHICLET_RECT);
+ icon.rect(CHICLET_ICON_RECT);
+}
+
+LLScriptChiclet::LLScriptChiclet(const Params&p)
+ : LLIMChiclet(p)
+ , mChicletIconCtrl(NULL)
+{
+ LLIconCtrl::Params icon_params = p.icon;
+ mChicletIconCtrl = LLUICtrlFactory::create<LLIconCtrl>(icon_params);
+ // Let "new message" icon be on top, else it will be hidden behind chiclet icon.
+ addChildInBack(mChicletIconCtrl);
+}
+
+void LLScriptChiclet::setSessionId(const LLUUID& session_id)
+{
+ setShowNewMessagesIcon( getSessionId() != session_id );
+
+ LLIMChiclet::setSessionId(session_id);
+ LLUUID notification_id = LLScriptFloaterManager::getInstance()->findNotificationId(session_id);
+ LLNotificationPtr notification = LLNotifications::getInstance()->find(notification_id);
+ if(notification)
+ {
+ setToolTip(notification->getSubstitutions()["TITLE"].asString());
+ }
+}
+
+void LLScriptChiclet::onMouseDown()
+{
+ LLScriptFloaterManager::getInstance()->toggleScriptFloater(getSessionId());
+}
+
+BOOL LLScriptChiclet::handleMouseDown(S32 x, S32 y, MASK mask)
+{
+ onMouseDown();
+ return LLChiclet::handleMouseDown(x, y, mask);
+}
+
+// EOF
diff --git a/indra/newview/llchiclet.h b/indra/newview/llchiclet.h
index 03935d21a6..1ea141e6c4 100644
--- a/indra/newview/llchiclet.h
+++ b/indra/newview/llchiclet.h
@@ -534,6 +534,46 @@ private:
};
/**
+ * Chiclet for script floaters.
+ */
+class LLScriptChiclet : public LLIMChiclet
+{
+public:
+
+ struct Params : public LLInitParam::Block<Params, LLIMChiclet::Params>
+ {
+ Optional<LLIconCtrl::Params> icon;
+
+ Params();
+ };
+
+ /*virtual*/ void setSessionId(const LLUUID& session_id);
+
+ /*virtual*/ void setCounter(S32 counter){}
+
+ /*virtual*/ S32 getCounter() { return 0; }
+
+ /**
+ * Toggle script floater
+ */
+ /*virtual*/ void onMouseDown();
+
+ /**
+ * Override default handler
+ */
+ /*virtual*/ BOOL handleMouseDown(S32 x, S32 y, MASK mask);
+
+protected:
+
+ LLScriptChiclet(const Params&);
+ friend class LLUICtrlFactory;
+
+private:
+
+ LLIconCtrl* mChicletIconCtrl;
+};
+
+/**
* Implements Group chat chiclet.
*/
class LLIMGroupChiclet : public LLIMChiclet, public LLGroupMgrObserver
diff --git a/indra/newview/lldateutil.cpp b/indra/newview/lldateutil.cpp
index 040fad3c4a..10b7935caf 100644
--- a/indra/newview/lldateutil.cpp
+++ b/indra/newview/lldateutil.cpp
@@ -37,52 +37,70 @@
#include "lltrans.h"
#include "llui.h"
-static S32 age_days_from_date(const std::string& date_string,
- const LLDate& now)
-{
- // Convert string date to malleable representation
- S32 month, day, year;
- S32 matched = sscanf(date_string.c_str(), "%d/%d/%d", &month, &day, &year);
- if (matched != 3) return S32_MIN;
-
- // Create ISO-8601 date string
- std::string iso8601_date_string =
- llformat("%04d-%02d-%02dT00:00:00Z", year, month, day);
- LLDate date(iso8601_date_string);
-
- // Correct for the fact that account creation dates are in Pacific time,
- // == UTC - 8
- F64 date_secs_since_epoch = date.secondsSinceEpoch();
- date_secs_since_epoch += 8.0 * 60.0 * 60.0;
+static S32 DAYS_PER_MONTH_NOLEAP[] =
+ { 31, 28, 21, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
+static S32 DAYS_PER_MONTH_LEAP[] =
+ { 31, 29, 21, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
- // Convert seconds from epoch to seconds from now
- F64 now_secs_since_epoch = now.secondsSinceEpoch();
- F64 age_secs = now_secs_since_epoch - date_secs_since_epoch;
-
- // We don't care about sub-day times
- const F64 SEC_PER_DAY = 24.0 * 60.0 * 60.0;
- S32 age_days = lltrunc(age_secs / SEC_PER_DAY);
-
- return age_days;
+static S32 days_from_month(S32 year, S32 month)
+{
+ if (year % 4 == 0
+ && year % 100 != 0)
+ {
+ // leap year
+ return DAYS_PER_MONTH_LEAP[month];
+ }
+ else
+ {
+ return DAYS_PER_MONTH_NOLEAP[month];
+ }
}
std::string LLDateUtil::ageFromDate(const std::string& date_string,
const LLDate& now)
{
- S32 age_days = age_days_from_date(date_string, now);
- if (age_days == S32_MIN) return "???";
+ S32 born_month, born_day, born_year;
+ S32 matched = sscanf(date_string.c_str(), "%d/%d/%d", &born_month, &born_day, &born_year);
+ if (matched != 3) return "???";
+ LLDate born_date;
+ born_date.fromYMDHMS(born_year, born_month, born_day);
+ F64 born_date_secs_since_epoch = born_date.secondsSinceEpoch();
+ // Correct for the fact that account creation dates are in Pacific time,
+ // == UTC - 8
+ born_date_secs_since_epoch += 8.0 * 60.0 * 60.0;
+ born_date.secondsSinceEpoch(born_date_secs_since_epoch);
+ // explode out to month/day/year again
+ born_date.split(&born_year, &born_month, &born_day);
+
+ S32 now_year, now_month, now_day;
+ now.split(&now_year, &now_month, &now_day);
+
+ // Do grade-school subtraction, from right-to-left, borrowing from the left
+ // when things go negative
+ S32 age_days = (now_day - born_day);
+ if (age_days < 0)
+ {
+ now_month -= 1;
+ if (now_month == 0)
+ {
+ now_year -= 1;
+ now_month = 12;
+ }
+ age_days += days_from_month(now_year, now_month);
+ }
+ S32 age_months = (now_month - born_month);
+ if (age_months < 0)
+ {
+ now_year -= 1;
+ age_months += 12;
+ }
+ S32 age_years = (now_year - born_year);
// Noun pluralization depends on language
std::string lang = LLUI::getLanguage();
// Try for age in round number of years
LLStringUtil::format_map_t args;
- S32 age_years = age_days / 365;
- age_days = age_days % 365;
- // *NOTE: This is wrong. Not all months have 30 days, but we don't have a library
- // for relative date arithmetic. :-( JC
- S32 age_months = age_days / 30;
- age_days = age_days % 30;
if (age_months > 0 || age_years > 0)
{
diff --git a/indra/newview/llfloateravatarpicker.cpp b/indra/newview/llfloateravatarpicker.cpp
index 8ac7f3fd7e..07bb6f832b 100644
--- a/indra/newview/llfloateravatarpicker.cpp
+++ b/indra/newview/llfloateravatarpicker.cpp
@@ -42,6 +42,7 @@
#include "llworld.h"
// Linden libraries
+#include "llbutton.h"
#include "lllineeditor.h"
#include "llscrolllistctrl.h"
#include "llscrolllistitem.h"
@@ -56,7 +57,8 @@ LLFloaterAvatarPicker* LLFloaterAvatarPicker::show(callback_t callback,
BOOL closeOnSelect)
{
// *TODO: Use a key to allow this not to be an effective singleton
- LLFloaterAvatarPicker* floater = LLFloaterReg::showTypedInstance<LLFloaterAvatarPicker>("avatar_picker");
+ LLFloaterAvatarPicker* floater =
+ LLFloaterReg::showTypedInstance<LLFloaterAvatarPicker>("avatar_picker");
floater->mCallback = callback;
floater->mCallbackUserdata = userdata;
@@ -64,6 +66,15 @@ LLFloaterAvatarPicker* LLFloaterAvatarPicker::show(callback_t callback,
floater->mNearMeListComplete = FALSE;
floater->mCloseOnSelect = closeOnSelect;
+ if (!closeOnSelect)
+ {
+ // Use Select/Close
+ std::string select_string = floater->getString("Select");
+ std::string close_string = floater->getString("Close");
+ floater->getChild<LLButton>("ok_btn")->setLabel(select_string);
+ floater->getChild<LLButton>("cancel_btn")->setLabel(close_string);
+ }
+
return floater;
}
@@ -102,10 +113,9 @@ BOOL LLFloaterAvatarPicker::postBuild()
friends->setDoubleClickCallback(onBtnSelect, this);
childSetCommitCallback("Friends", onList, this);
- childSetAction("Select", onBtnSelect, this);
- childDisable("Select");
-
- childSetAction("Cancel", onBtnClose, this);
+ childSetAction("ok_btn", onBtnSelect, this);
+ childDisable("ok_btn");
+ childSetAction("cancel_btn", onBtnClose, this);
childSetFocus("Edit");
@@ -132,7 +142,7 @@ BOOL LLFloaterAvatarPicker::postBuild()
void LLFloaterAvatarPicker::onTabChanged()
{
- childSetEnabled("Select", visibleItemsSelected());
+ childSetEnabled("ok_btn", visibleItemsSelected());
}
// Destroys the object
@@ -234,7 +244,7 @@ void LLFloaterAvatarPicker::onList(LLUICtrl* ctrl, void* userdata)
LLFloaterAvatarPicker* self = (LLFloaterAvatarPicker*)userdata;
if (self)
{
- self->childSetEnabled("Select", self->visibleItemsSelected());
+ self->childSetEnabled("ok_btn", self->visibleItemsSelected());
}
}
@@ -270,13 +280,13 @@ void LLFloaterAvatarPicker::populateNearMe()
if (empty)
{
childDisable("NearMe");
- childDisable("Select");
+ childDisable("ok_btn");
near_me_scroller->setCommentText(getString("no_one_near"));
}
else
{
childEnable("NearMe");
- childEnable("Select");
+ childEnable("ok_btn");
near_me_scroller->selectFirstItem();
onList(near_me_scroller, this);
near_me_scroller->setFocus(TRUE);
@@ -357,7 +367,7 @@ void LLFloaterAvatarPicker::find()
getChild<LLScrollListCtrl>("SearchResults")->deleteAllItems();
getChild<LLScrollListCtrl>("SearchResults")->setCommentText(getString("searching"));
- childSetEnabled("Select", FALSE);
+ childSetEnabled("ok_btn", FALSE);
mNumResultsReturned = 0;
}
@@ -414,7 +424,7 @@ void LLFloaterAvatarPicker::processAvatarPickerReply(LLMessageSystem* msg, void*
map["[TEXT]"] = floater->childGetText("Edit");
avatar_name = floater->getString("not_found", map);
search_results->setEnabled(FALSE);
- floater->childDisable("Select");
+ floater->childDisable("ok_btn");
}
else
{
@@ -430,7 +440,7 @@ void LLFloaterAvatarPicker::processAvatarPickerReply(LLMessageSystem* msg, void*
if (found_one)
{
- floater->childEnable("Select");
+ floater->childEnable("ok_btn");
search_results->selectFirstItem();
floater->onList(search_results, floater);
search_results->setFocus(TRUE);
diff --git a/indra/newview/llfloaterpreference.cpp b/indra/newview/llfloaterpreference.cpp
index 7fc207d395..e20249a737 100644
--- a/indra/newview/llfloaterpreference.cpp
+++ b/indra/newview/llfloaterpreference.cpp
@@ -56,6 +56,7 @@
#include "llfloaterabout.h"
#include "llfloaterhardwaresettings.h"
#include "llfloatervoicedevicesettings.h"
+#include "llimfloater.h"
#include "llkeyboard.h"
#include "llmodaldialog.h"
#include "llnavigationbar.h"
@@ -164,7 +165,6 @@ BOOL LLVoiceSetKeyDialog::handleKeyHere(KEY key, MASK mask)
{
mParent->setKey(key);
}
-
closeFloater();
return result;
}
@@ -310,7 +310,8 @@ F32 LLFloaterPreference::sAspectRatio = 0.0;
LLFloaterPreference::LLFloaterPreference(const LLSD& key)
: LLFloater(key),
mGotPersonalInfo(false),
- mOriginalIMViaEmail(false)
+ mOriginalIMViaEmail(false),
+ mCancelOnClose(true)
{
//Build Floater is now Called from LLFloaterReg::add("preferences", "floater_preferences.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterPreference>);
@@ -357,6 +358,8 @@ LLFloaterPreference::LLFloaterPreference(const LLSD& key)
BOOL LLFloaterPreference::postBuild()
{
+ gSavedSettings.getControl("PlainTextChatHistory")->getSignal()->connect(boost::bind(&LLIMFloater::processChatHistoryStyleUpdate, _2));
+
LLTabContainer* tabcontainer = getChild<LLTabContainer>("pref core");
if (!tabcontainer->selectTab(gSavedSettings.getS32("LastPrefTab")))
tabcontainer->selectFirstTab();
@@ -390,6 +393,20 @@ void LLFloaterPreference::draw()
LLFloater::draw();
}
+void LLFloaterPreference::saveSettings()
+{
+ LLTabContainer* tabcontainer = getChild<LLTabContainer>("pref core");
+ child_list_t::const_iterator iter = tabcontainer->getChildList()->begin();
+ child_list_t::const_iterator end = tabcontainer->getChildList()->end();
+ for ( ; iter != end; ++iter)
+ {
+ LLView* view = *iter;
+ LLPanelPreference* panel = dynamic_cast<LLPanelPreference*>(view);
+ if (panel)
+ panel->saveSettings();
+ }
+}
+
void LLFloaterPreference::apply()
{
LLTabContainer* tabcontainer = getChild<LLTabContainer>("pref core");
@@ -444,6 +461,8 @@ void LLFloaterPreference::apply()
// LLWString busy_response = utf8str_to_wstring(getChild<LLUICtrl>("busy_response")->getValue().asString());
// LLWStringUtil::replaceTabsWithSpaces(busy_response, 4);
+
+ gSavedSettings.setBOOL("PlainTextChatHistory", childGetValue("plain_text_chat_history").asBoolean());
if(mGotPersonalInfo)
{
@@ -551,6 +570,11 @@ void LLFloaterPreference::onOpen(const LLSD& key)
LLPanelLogin::setAlwaysRefresh(true);
refresh();
+
+ // Make sure the current state of prefs are saved away when
+ // when the floater is opened. That will make cancel do its
+ // job
+ saveSettings();
}
void LLFloaterPreference::onVertexShaderEnable()
@@ -569,7 +593,7 @@ void LLFloaterPreference::onClose(bool app_quitting)
{
gSavedSettings.setS32("LastPrefTab", getChild<LLTabContainer>("pref core")->getCurrentPanelIndex());
LLPanelLogin::setAlwaysRefresh(false);
- cancel(); // will be a no-op if OK or apply was performed just prior.
+ if (mCancelOnClose) cancel();
}
void LLFloaterPreference::onOpenHardwareSettings()
@@ -592,7 +616,11 @@ void LLFloaterPreference::onBtnOK()
if (canClose())
{
apply();
+ // Here we do not want to cancel on close, so we do this funny thing
+ // that prevents cancel from undoing our changes when we hit OK
+ mCancelOnClose = false;
closeFloater(false);
+ mCancelOnClose = true;
gSavedSettings.saveToFile( gSavedSettings.getString("ClientSettingsFile"), TRUE );
LLUIColorTable::instance().saveUserSettings();
std::string crash_settings_filename = gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS, CRASH_SETTINGS_FILE);
@@ -620,6 +648,7 @@ void LLFloaterPreference::onBtnApply( )
}
}
apply();
+ saveSettings();
LLPanelLogin::refreshLocation( false );
}
@@ -636,7 +665,8 @@ void LLFloaterPreference::onBtnCancel()
}
refresh();
}
- closeFloater(); // side effect will also cancel any unsaved changes.
+ cancel();
+ closeFloater();
}
// static
@@ -1161,6 +1191,8 @@ void LLFloaterPreference::setPersonalInfo(const std::string& visibility, bool im
childSetLabelArg("online_visibility", "[DIR_VIS]", mDirectoryVisibility);
childEnable("send_im_to_email");
childSetValue("send_im_to_email", im_via_email);
+ childEnable("plain_text_chat_history");
+ childSetValue("plain_text_chat_history", gSavedSettings.getBOOL("PlainTextChatHistory"));
childEnable("log_instant_messages");
// childEnable("log_chat");
// childEnable("busy_response");
@@ -1493,6 +1525,11 @@ BOOL LLPanelPreference::postBuild()
void LLPanelPreference::apply()
{
+ // no-op
+}
+
+void LLPanelPreference::saveSettings()
+{
// Save the value of all controls in the hierarchy
mSavedValues.clear();
std::list<LLView*> view_stack;
diff --git a/indra/newview/llfloaterpreference.h b/indra/newview/llfloaterpreference.h
index 41c8bb7124..a30422564a 100644
--- a/indra/newview/llfloaterpreference.h
+++ b/indra/newview/llfloaterpreference.h
@@ -97,6 +97,10 @@ protected:
// callback for when client turns on shaders
void onVertexShaderEnable();
+ // This function squirrels away the current values of the controls so that
+ // cancel() can restore them.
+ void saveSettings();
+
public:
@@ -145,6 +149,7 @@ private:
static std::string sSkin;
bool mGotPersonalInfo;
bool mOriginalIMViaEmail;
+ bool mCancelOnClose;
bool mOriginalHideOnlineStatus;
std::string mDirectoryVisibility;
@@ -161,6 +166,10 @@ public:
virtual void cancel();
void setControlFalse(const LLSD& user_data);
+ // This function squirrels away the current values of the controls so that
+ // cancel() can restore them.
+ virtual void saveSettings();
+
private:
typedef std::map<LLControlVariable*, LLSD> control_values_map_t;
control_values_map_t mSavedValues;
diff --git a/indra/newview/llfloatertools.cpp b/indra/newview/llfloatertools.cpp
index 9854d2594b..88a98c3350 100644
--- a/indra/newview/llfloatertools.cpp
+++ b/indra/newview/llfloatertools.cpp
@@ -43,6 +43,7 @@
#include "llcheckboxctrl.h"
#include "llcombobox.h"
#include "lldraghandle.h"
+#include "llerror.h"
#include "llfloaterbuildoptions.h"
#include "llfloatermediasettings.h"
#include "llfloateropenobject.h"
@@ -1103,7 +1104,8 @@ void LLFloaterTools::getMediaState()
childSetEnabled("edit_media", FALSE);
childSetEnabled("media_info", FALSE);
media_info->setEnabled(FALSE);
- media_info->clear();*/
+ media_info->clear();*/
+ LL_WARNS("LLFloaterTools: media") << "Media not enabled (no capability) in this region!" << LL_ENDL;
clearMediaSettings();
return;
}
@@ -1122,11 +1124,27 @@ void LLFloaterTools::getMediaState()
LLVOVolume* object = dynamic_cast<LLVOVolume*>(node->getObject());
if (NULL != object)
{
- if (!object->permModify() || object->isMediaDataBeingFetched())
+ if (!object->permModify())
{
+ LL_INFOS("LLFloaterTools: media")
+ << "Selection not editable due to lack of modify permissions on object id "
+ << object->getID() << LL_ENDL;
+
editable = false;
break;
}
+ // XXX DISABLE this for now, because when the fetch finally
+ // does come in, the state of this floater doesn't properly
+ // update. This needs more thought.
+// if (object->isMediaDataBeingFetched())
+// {
+// LL_INFOS("LLFloaterTools: media")
+// << "Selection not editable due to media data being fetched for object id "
+// << object->getID() << LL_ENDL;
+//
+// editable = false;
+// break;
+// }
}
}
}
diff --git a/indra/newview/llimfloater.cpp b/indra/newview/llimfloater.cpp
index 4a487bd5a7..ee93a9349a 100644
--- a/indra/newview/llimfloater.cpp
+++ b/indra/newview/llimfloater.cpp
@@ -53,6 +53,10 @@
#include "lltransientfloatermgr.h"
#include "llinventorymodel.h"
+#ifdef USE_IM_CONTAINER
+ #include "llimfloatercontainer.h" // to replace separate IM Floaters with multifloater container
+#endif
+
LLIMFloater::LLIMFloater(const LLUUID& session_id)
@@ -257,7 +261,11 @@ BOOL LLIMFloater::postBuild()
//*TODO if session is not initialized yet, add some sort of a warning message like "starting session...blablabla"
//see LLFloaterIMPanel for how it is done (IB)
+#ifdef USE_IM_CONTAINER
+ return LLFloater::postBuild();
+#else
return LLDockableFloater::postBuild();
+#endif
}
// virtual
@@ -318,6 +326,11 @@ void LLIMFloater::onSlide()
//static
LLIMFloater* LLIMFloater::show(const LLUUID& session_id)
{
+#ifdef USE_IM_CONTAINER
+ LLIMFloater* target_floater = findInstance(session_id);
+ bool not_existed = NULL == target_floater;
+
+#else
//hide all
LLFloaterReg::const_instance_list_t& inst_list = LLFloaterReg::getFloaterList("impanel");
for (LLFloaterReg::const_instance_list_t::const_iterator iter = inst_list.begin();
@@ -329,12 +342,25 @@ LLIMFloater* LLIMFloater::show(const LLUUID& session_id)
floater->setVisible(false);
}
}
+#endif
LLIMFloater* floater = LLFloaterReg::showTypedInstance<LLIMFloater>("impanel", session_id);
floater->updateMessages();
floater->mInputEditor->setFocus(TRUE);
+#ifdef USE_IM_CONTAINER
+ // do not add existed floaters to avoid adding torn off instances
+ if (not_existed)
+ {
+ // LLTabContainer::eInsertionPoint i_pt = user_initiated ? LLTabContainer::RIGHT_OF_CURRENT : LLTabContainer::END;
+ // TODO: mantipov: use LLTabContainer::RIGHT_OF_CURRENT if it exists
+ LLTabContainer::eInsertionPoint i_pt = LLTabContainer::END;
+
+ LLIMFloaterContainer* floater_container = LLFloaterReg::showTypedInstance<LLIMFloaterContainer>("im_container");
+ floater_container->addFloater(floater, TRUE, i_pt);
+ }
+#else
if (floater->getDockControl() == NULL)
{
LLChiclet* chiclet =
@@ -352,13 +378,14 @@ LLIMFloater* LLIMFloater::show(const LLUUID& session_id)
floater->setDockControl(new LLDockControl(chiclet, floater, floater->getDockTongue(),
LLDockControl::TOP, boost::bind(&LLIMFloater::getAllowedRect, floater, _1)));
}
+#endif
return floater;
}
void LLIMFloater::getAllowedRect(LLRect& rect)
{
- rect = gViewerWindow->getWorldViewRectScaled();
+ rect = gViewerWindow->getWorldViewRectRaw();
}
void LLIMFloater::setDocked(bool docked, bool pop_on_undock)
@@ -368,7 +395,9 @@ void LLIMFloater::setDocked(bool docked, bool pop_on_undock)
(LLNotificationsUI::LLChannelManager::getInstance()->
findChannelByID(LLUUID(gSavedSettings.getString("NotificationChannelUUID"))));
+#ifndef USE_IM_CONTAINER
LLTransientDockableFloater::setDocked(docked, pop_on_undock);
+#endif
// update notification channel state
if(channel)
@@ -394,6 +423,7 @@ void LLIMFloater::setVisible(BOOL visible)
//static
bool LLIMFloater::toggle(const LLUUID& session_id)
{
+#ifndef USE_IM_CONTAINER
LLIMFloater* floater = LLFloaterReg::findTypedInstance<LLIMFloater>("impanel", session_id);
if (floater && floater->getVisible() && floater->isDocked())
{
@@ -409,6 +439,7 @@ bool LLIMFloater::toggle(const LLUUID& session_id)
return true;
}
else
+#endif
{
// ensure the list of messages is updated when floater is made visible
show(session_id);
@@ -451,6 +482,8 @@ void LLIMFloater::sessionInitReplyReceived(const LLUUID& im_session_id)
void LLIMFloater::updateMessages()
{
+ bool use_plain_text_chat_history = gSavedSettings.getBOOL("PlainTextChatHistory");
+
std::list<LLSD> messages;
LLIMModel::instance().getMessages(mSessionID, messages, mLastMessageIndex+1);
@@ -476,39 +509,7 @@ void LLIMFloater::updateMessages()
chat.mText = message;
chat.mTimeStr = time;
- //Handle IRC styled /me messages.
- std::string prefix = message.substr(0, 4);
- if (prefix == "/me " || prefix == "/me'")
- {
-
- LLColor4 txt_color = LLUIColorTable::instance().getColor("White");
- LLViewerChat::getChatColor(chat,txt_color);
- LLFontGL* fontp = LLViewerChat::getChatFont();
- std::string font_name = LLFontGL::nameFromFont(fontp);
- std::string font_size = LLFontGL::sizeFromFont(fontp);
- LLStyle::Params append_style_params;
- append_style_params.color(txt_color);
- append_style_params.readonly_color(txt_color);
- append_style_params.font.name(font_name);
- append_style_params.font.size(font_size);
-
- if (from.size() > 0)
- {
- append_style_params.font.style = "ITALIC";
- chat.mText = from;
- mChatHistory->appendWidgetMessage(chat, append_style_params);
- }
-
- message = message.substr(3);
- append_style_params.font.style = "ITALIC";
- mChatHistory->appendText(message, FALSE, append_style_params);
- }
- else
- {
- chat.mText = message;
- mChatHistory->appendWidgetMessage(chat);
- }
-
+ mChatHistory->appendMessage(chat, use_plain_text_chat_history);
mLastMessageIndex = msg["index"].asInteger();
}
}
@@ -639,6 +640,28 @@ void LLIMFloater::processAgentListUpdates(const LLSD& body)
}
}
+void LLIMFloater::updateChatHistoryStyle()
+{
+ mChatHistory->clear();
+ mLastMessageIndex = -1;
+ updateMessages();
+}
+
+void LLIMFloater::processChatHistoryStyleUpdate(const LLSD& newvalue)
+{
+ LLFloaterReg::const_instance_list_t& inst_list = LLFloaterReg::getFloaterList("impanel");
+ for (LLFloaterReg::const_instance_list_t::const_iterator iter = inst_list.begin();
+ iter != inst_list.end(); ++iter)
+ {
+ LLIMFloater* floater = dynamic_cast<LLIMFloater*>(*iter);
+ if (floater)
+ {
+ floater->updateChatHistoryStyle();
+ }
+ }
+
+}
+
void LLIMFloater::processSessionUpdate(const LLSD& session_update)
{
// *TODO : verify following code when moderated mode will be implemented
diff --git a/indra/newview/llimfloater.h b/indra/newview/llimfloater.h
index e2d500d821..9e1330ff49 100644
--- a/indra/newview/llimfloater.h
+++ b/indra/newview/llimfloater.h
@@ -33,6 +33,11 @@
#ifndef LL_IMFLOATER_H
#define LL_IMFLOATER_H
+// This variable is used to show floaters related to chiclets in a Multi Floater Container
+// So, this functionality does not require to have IM Floaters as Dockable & Transient
+// See EXT-2640.
+#define USE_IM_CONTAINER
+
#include "lltransientdockablefloater.h"
#include "lllogchat.h"
#include "lltooldraganddrop.h"
@@ -92,6 +97,9 @@ public:
void processAgentListUpdates(const LLSD& body);
void processSessionUpdate(const LLSD& session_update);
+ void updateChatHistoryStyle();
+ static void processChatHistoryStyleUpdate(const LLSD& newvalue);
+
BOOL handleDragAndDrop(S32 x, S32 y, MASK mask,
BOOL drop, EDragAndDropType cargo_type,
void *cargo_data, EAcceptance *accept,
diff --git a/indra/newview/llimfloatercontainer.cpp b/indra/newview/llimfloatercontainer.cpp
new file mode 100644
index 0000000000..6e4b3ae214
--- /dev/null
+++ b/indra/newview/llimfloatercontainer.cpp
@@ -0,0 +1,96 @@
+/**
+ * @file llimfloatercontainer.cpp
+ * @brief Multifloater containing active IM sessions in separate tab container tabs
+ *
+ * $LicenseInfo:firstyear=2009&license=viewergpl$
+ *
+ * Copyright (c) 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"
+
+#include "llimfloatercontainer.h"
+
+//
+// LLIMFloaterContainer
+//
+LLIMFloaterContainer::LLIMFloaterContainer(const LLSD& seed)
+: LLMultiFloater(seed),
+ mActiveVoiceFloater(NULL)
+{
+ mAutoResize = FALSE;
+}
+
+LLIMFloaterContainer::~LLIMFloaterContainer()
+{
+}
+
+BOOL LLIMFloaterContainer::postBuild()
+{
+ // Do not call base postBuild to not connect to mCloseSignal to not close all floaters via Close button
+ // mTabContainer will be initialized in LLMultiFloater::addChild()
+ return TRUE;
+}
+
+void LLIMFloaterContainer::onOpen(const LLSD& key)
+{
+ LLMultiFloater::onOpen(key);
+/*
+ if (key.isDefined())
+ {
+ LLIMFloater* im_floater = LLIMFloater::findInstance(key.asUUID());
+ if (im_floater)
+ {
+ im_floater->openFloater();
+ }
+ }
+*/
+}
+
+void LLIMFloaterContainer::addFloater(LLFloater* floaterp,
+ BOOL select_added_floater,
+ LLTabContainer::eInsertionPoint insertion_point)
+{
+ if(!floaterp) return;
+
+ // already here
+ if (floaterp->getHost() == this)
+ {
+ openFloater(floaterp->getKey());
+ return;
+ }
+
+ LLMultiFloater::addFloater(floaterp, select_added_floater, insertion_point);
+
+ // make sure active voice icon shows up for new tab
+ if (floaterp == mActiveVoiceFloater)
+ {
+ mTabContainer->setTabImage(floaterp, "active_voice_tab.tga");
+ }
+}
+
+// EOF
diff --git a/indra/newview/llimfloatercontainer.h b/indra/newview/llimfloatercontainer.h
new file mode 100644
index 0000000000..10cde56c6e
--- /dev/null
+++ b/indra/newview/llimfloatercontainer.h
@@ -0,0 +1,61 @@
+/**
+ * @file llimfloatercontainer.h
+ * @brief Multifloater containing active IM sessions in separate tab container tabs
+ *
+ * $LicenseInfo:firstyear=2009&license=viewergpl$
+ *
+ * Copyright (c) 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_LLIMFLOATERCONTAINER_H
+#define LL_LLIMFLOATERCONTAINER_H
+
+#include "llfloater.h"
+#include "llmultifloater.h"
+
+class LLTabContainer;
+
+class LLIMFloaterContainer : public LLMultiFloater
+{
+public:
+ LLIMFloaterContainer(const LLSD& seed);
+ virtual ~LLIMFloaterContainer();
+
+ /*virtual*/ BOOL postBuild();
+ /*virtual*/ void onOpen(const LLSD& key);
+
+ /*virtual*/ void addFloater(LLFloater* floaterp,
+ BOOL select_added_floater,
+ LLTabContainer::eInsertionPoint insertion_point = LLTabContainer::END);
+
+ static LLFloater* getCurrentVoiceFloater();
+
+protected:
+
+ LLFloater* mActiveVoiceFloater;
+};
+
+#endif // LL_LLIMFLOATERCONTAINER_H
diff --git a/indra/newview/llinspectavatar.cpp b/indra/newview/llinspectavatar.cpp
index baddd90d46..866669f326 100644
--- a/indra/newview/llinspectavatar.cpp
+++ b/indra/newview/llinspectavatar.cpp
@@ -39,6 +39,7 @@
#include "llavataractions.h"
#include "llavatarpropertiesprocessor.h"
#include "llcallingcard.h"
+#include "lldateutil.h"
#include "llfloaterreporter.h"
#include "llfloaterworldmap.h"
#include "llinspect.h"
@@ -351,7 +352,7 @@ void LLInspectAvatar::processAvatarData(LLAvatarData* data)
{
LLStringUtil::format_map_t args;
args["[BORN_ON]"] = data->born_on;
- args["[AGE]"] = data->born_on;
+ args["[AGE]"] = LLDateUtil::ageFromDate(data->born_on, LLDate::now());
args["[SL_PROFILE]"] = data->about_text;
args["[RW_PROFILE"] = data->fl_about_text;
args["[ACCTTYPE]"] = LLAvatarPropertiesProcessor::accountType(data);
diff --git a/indra/newview/lllocationinputctrl.cpp b/indra/newview/lllocationinputctrl.cpp
index 7e35cfa04c..9aefbcbbb0 100644
--- a/indra/newview/lllocationinputctrl.cpp
+++ b/indra/newview/lllocationinputctrl.cpp
@@ -188,7 +188,6 @@ LLLocationInputCtrl::LLLocationInputCtrl(const LLLocationInputCtrl::Params& p)
params.rect(text_entry_rect);
params.default_text(LLStringUtil::null);
params.max_length_bytes(p.max_chars);
- params.commit_callback.function(boost::bind(&LLComboBox::onTextCommit, this, _2));
params.keystroke_callback(boost::bind(&LLComboBox::onTextEntry, this, _1));
params.handle_edit_keys_directly(true);
params.commit_on_focus_lost(false);
diff --git a/indra/newview/llmediadataclient.cpp b/indra/newview/llmediadataclient.cpp
index 6666a03ee4..badef4c7ae 100755
--- a/indra/newview/llmediadataclient.cpp
+++ b/indra/newview/llmediadataclient.cpp
@@ -637,6 +637,9 @@ void LLObjectMediaNavigateClient::navigate(LLMediaDataClientObject *object, U8 t
sd_payload[LLTextureEntry::OBJECT_ID_KEY] = object->getID();
sd_payload[LLMediaEntry::CURRENT_URL_KEY] = url;
sd_payload[LLTextureEntry::TEXTURE_INDEX_KEY] = (LLSD::Integer)texture_index;
+
+ LL_INFOS("LLMediaDataClient") << "navigate() initiated: " << ll_print_sd(sd_payload) << LL_ENDL;
+
request(object, sd_payload);
}
diff --git a/indra/newview/llnavigationbar.cpp b/indra/newview/llnavigationbar.cpp
index 114d26af8a..c032d01d2f 100644
--- a/indra/newview/llnavigationbar.cpp
+++ b/indra/newview/llnavigationbar.cpp
@@ -172,7 +172,8 @@ LLNavigationBar::LLNavigationBar()
mBtnHome(NULL),
mCmbLocation(NULL),
mSearchComboBox(NULL),
- mPurgeTPHistoryItems(false)
+ mPurgeTPHistoryItems(false),
+ mSaveToLocationHistory(false)
{
LLUICtrlFactory::getInstance()->buildPanel(this, "panel_navigation_bar.xml");
@@ -186,6 +187,7 @@ LLNavigationBar::LLNavigationBar()
LLNavigationBar::~LLNavigationBar()
{
mTeleportFinishConnection.disconnect();
+ mTeleportFailedConnection.disconnect();
}
BOOL LLNavigationBar::postBuild()
@@ -220,6 +222,12 @@ BOOL LLNavigationBar::postBuild()
mSearchComboBox->setCommitCallback(boost::bind(&LLNavigationBar::onSearchCommit, this));
+ mTeleportFinishConnection = LLViewerParcelMgr::getInstance()->
+ setTeleportFinishedCallback(boost::bind(&LLNavigationBar::onTeleportFinished, this, _1));
+
+ mTeleportFailedConnection = LLViewerParcelMgr::getInstance()->
+ setTeleportFailedCallback(boost::bind(&LLNavigationBar::onTeleportFailed, this));
+
mDefaultNbRect = getRect();
mDefaultFpRect = getChild<LLFavoritesBarCtrl>("favorite")->getRect();
@@ -395,15 +403,19 @@ void LLNavigationBar::onLocationSelection()
LLWorldMapMessage::url_callback_t cb = boost::bind(
&LLNavigationBar::onRegionNameResponse, this,
typed_location, region_name, local_coords, _1, _2, _3, _4);
- // connect the callback each time, when user enter new location to get real location of agent after teleport
- mTeleportFinishConnection = LLViewerParcelMgr::getInstance()->
- setTeleportFinishedCallback(boost::bind(&LLNavigationBar::onTeleportFinished, this, _1,typed_location));
+ mSaveToLocationHistory = true;
LLWorldMapMessage::getInstance()->sendNamedRegionRequest(region_name, cb, std::string("unused"), false);
}
-void LLNavigationBar::onTeleportFinished(const LLVector3d& global_agent_pos, const std::string& typed_location)
+void LLNavigationBar::onTeleportFailed()
{
- // Location is valid. Add it to the typed locations history.
+ mSaveToLocationHistory = false;
+}
+
+void LLNavigationBar::onTeleportFinished(const LLVector3d& global_agent_pos)
+{
+ if (!mSaveToLocationHistory)
+ return;
LLLocationHistory* lh = LLLocationHistory::getInstance();
//TODO*: do we need convert surl into readable format?
@@ -426,8 +438,7 @@ void LLNavigationBar::onTeleportFinished(const LLVector3d& global_agent_pos, con
lh->save();
- if(mTeleportFinishConnection.connected())
- mTeleportFinishConnection.disconnect();
+ mSaveToLocationHistory = false;
}
diff --git a/indra/newview/llnavigationbar.h b/indra/newview/llnavigationbar.h
index 52f5a827e4..cd3ba08db3 100644
--- a/indra/newview/llnavigationbar.h
+++ b/indra/newview/llnavigationbar.h
@@ -81,7 +81,8 @@ private:
void onLocationSelection();
void onLocationPrearrange(const LLSD& data);
void onSearchCommit();
- void onTeleportFinished(const LLVector3d& global_agent_pos, const std::string& typed_location);
+ void onTeleportFinished(const LLVector3d& global_agent_pos);
+ void onTeleportFailed();
void onRegionNameResponse(
std::string typed_location,
std::string region_name,
@@ -99,8 +100,11 @@ private:
LLLocationInputCtrl* mCmbLocation;
LLRect mDefaultNbRect;
LLRect mDefaultFpRect;
+ boost::signals2::connection mTeleportFailedConnection;
boost::signals2::connection mTeleportFinishConnection;
bool mPurgeTPHistoryItems;
+ // if true, save location to location history when teleport finishes
+ bool mSaveToLocationHistory;
};
#endif
diff --git a/indra/newview/llnearbychat.cpp b/indra/newview/llnearbychat.cpp
index 09fd9b2949..80a6cc343f 100644
--- a/indra/newview/llnearbychat.cpp
+++ b/indra/newview/llnearbychat.cpp
@@ -173,7 +173,7 @@ void LLNearbyChat::addMessage(const LLChat& chat)
append_style_params.font.style = "ITALIC";
LLChat add_chat=chat;
add_chat.mText = chat.mFromName + " ";
- mChatHistory->appendWidgetMessage(add_chat, append_style_params);
+ mChatHistory->appendMessage(add_chat, false, append_style_params);
}
message = message.substr(3);
@@ -182,7 +182,7 @@ void LLNearbyChat::addMessage(const LLChat& chat)
}
else
{
- mChatHistory->appendWidgetMessage(chat);
+ mChatHistory->appendMessage(chat);
}
}
}
diff --git a/indra/newview/llnotificationscripthandler.cpp b/indra/newview/llnotificationscripthandler.cpp
index 4be98201d1..f01f2e4441 100644
--- a/indra/newview/llnotificationscripthandler.cpp
+++ b/indra/newview/llnotificationscripthandler.cpp
@@ -38,9 +38,13 @@
#include "llviewercontrol.h"
#include "llviewerwindow.h"
#include "llnotificationmanager.h"
+#include "llscriptfloater.h"
using namespace LLNotificationsUI;
+static const std::string SCRIPT_DIALOG ("ScriptDialog");
+static const std::string SCRIPT_DIALOG_GROUP ("ScriptDialogGroup");
+
//--------------------------------------------------------------------------
LLScriptHandler::LLScriptHandler(e_notification_type type, const LLSD& id)
{
@@ -90,25 +94,40 @@ bool LLScriptHandler::processNotification(const LLSD& notify)
if(notify["sigtype"].asString() == "add" || notify["sigtype"].asString() == "change")
{
- LLToastNotifyPanel* notify_box = new LLToastNotifyPanel(notification);
-
- LLToast::Params p;
- p.notif_id = notification->getID();
- p.notification = notification;
- p.panel = notify_box;
- p.on_delete_toast = boost::bind(&LLScriptHandler::onDeleteToast, this, _1);
-
- LLScreenChannel* channel = dynamic_cast<LLScreenChannel*>(mChannel);
- if(channel)
- channel->addToast(p);
-
- // send a signal to the counter manager
- mNewNotificationSignal();
-
+ if(SCRIPT_DIALOG == notification->getName() || SCRIPT_DIALOG_GROUP == notification->getName())
+ {
+ LLScriptFloaterManager::getInstance()->onAddNotification(notification->getID());
+ }
+ else
+ {
+ LLToastNotifyPanel* notify_box = new LLToastNotifyPanel(notification);
+
+ LLToast::Params p;
+ p.notif_id = notification->getID();
+ p.notification = notification;
+ p.panel = notify_box;
+ p.on_delete_toast = boost::bind(&LLScriptHandler::onDeleteToast, this, _1);
+
+ LLScreenChannel* channel = dynamic_cast<LLScreenChannel*>(mChannel);
+ if(channel)
+ {
+ channel->addToast(p);
+ }
+
+ // send a signal to the counter manager
+ mNewNotificationSignal();
+ }
}
else if (notify["sigtype"].asString() == "delete")
{
- mChannel->killToastByNotificationID(notification->getID());
+ if(SCRIPT_DIALOG == notification->getName() || SCRIPT_DIALOG_GROUP == notification->getName())
+ {
+ LLScriptFloaterManager::getInstance()->onRemoveNotification(notification->getID());
+ }
+ else
+ {
+ mChannel->killToastByNotificationID(notification->getID());
+ }
}
return true;
}
@@ -123,6 +142,14 @@ void LLScriptHandler::onDeleteToast(LLToast* toast)
// send a signal to a listener to let him perform some action
// in this case listener is a SysWellWindow and it will remove a corresponding item from its list
mNotificationIDSignal(toast->getNotificationID());
+
+ LLNotificationPtr notification = LLNotifications::getInstance()->find(toast->getNotificationID());
+
+ if( notification &&
+ (SCRIPT_DIALOG == notification->getName() || SCRIPT_DIALOG_GROUP == notification->getName()) )
+ {
+ LLScriptFloaterManager::getInstance()->onRemoveNotification(notification->getID());
+ }
}
//--------------------------------------------------------------------------
diff --git a/indra/newview/llpanelavatar.cpp b/indra/newview/llpanelavatar.cpp
index 146be0df7f..2c27808f03 100644
--- a/indra/newview/llpanelavatar.cpp
+++ b/indra/newview/llpanelavatar.cpp
@@ -38,6 +38,7 @@
#include "llavatarconstants.h" // AVATAR_ONLINE
#include "llcallingcard.h"
#include "llcombobox.h"
+#include "lldateutil.h" // ageFromDate()
#include "llimview.h"
#include "lltexteditor.h"
#include "lltexturectrl.h"
@@ -358,7 +359,7 @@ void LLPanelAvatarProfile::onOpen(const LLSD& key)
{
LLPanelProfileTab::onOpen(key);
- mGroups.erase();
+ mGroups.clear();
//Disable "Add Friend" button for friends.
childSetEnabled("add_friend", !LLAvatarActions::isFriend(getAvatarId()));
@@ -390,7 +391,7 @@ void LLPanelAvatarProfile::resetControls()
void LLPanelAvatarProfile::resetData()
{
- mGroups.erase();
+ mGroups.clear();
childSetValue("2nd_life_pic",LLUUID::null);
childSetValue("real_world_pic",LLUUID::null);
childSetValue("online_status",LLStringUtil::null);
@@ -442,23 +443,29 @@ void LLPanelAvatarProfile::processGroupProperties(const LLAvatarGroups* avatar_g
// Group properties may arrive in two callbacks, we need to save them across
// different calls. We can't do that in textbox as textbox may change the text.
- std::string groups = mGroups;
LLAvatarGroups::group_list_t::const_iterator it = avatar_groups->group_list.begin();
const LLAvatarGroups::group_list_t::const_iterator it_end = avatar_groups->group_list.end();
- if(groups.empty() && it_end != it)
- {
- groups = (*it).group_name;
- ++it;
- }
for(; it_end != it; ++it)
{
LLAvatarGroups::LLGroupData group_data = *it;
- groups += ", ";
- groups += group_data.group_name;
+
+ // Check if there is no duplicates for this group
+ if (std::find(mGroups.begin(), mGroups.end(), group_data.group_name) == mGroups.end())
+ mGroups.push_back(group_data.group_name);
+ }
+
+ // Creating string, containing group list
+ std::string groups = "";
+ for (group_list_t::const_iterator it = mGroups.begin(); it != mGroups.end(); ++it)
+ {
+ if (it != mGroups.begin())
+ groups += ", ";
+
+ groups += *it;
}
- mGroups = groups;
- childSetValue("sl_groups",mGroups);
+
+ childSetValue("sl_groups", groups);
}
void LLPanelAvatarProfile::fillCommonData(const LLAvatarData* avatar_data)
@@ -466,8 +473,11 @@ void LLPanelAvatarProfile::fillCommonData(const LLAvatarData* avatar_data)
//remove avatar id from cache to get fresh info
LLAvatarIconIDCache::getInstance()->remove(avatar_data->avatar_id);
-
- childSetValue("register_date", avatar_data->born_on );
+ LLStringUtil::format_map_t args;
+ args["[REG_DATE]"] = avatar_data->born_on;
+ args["[AGE]"] = LLDateUtil::ageFromDate( avatar_data->born_on, LLDate::now());
+ std::string register_date = getString("RegisterDateFormat", args);
+ childSetValue("register_date", register_date );
childSetValue("sl_description_edit", avatar_data->about_text);
childSetValue("fl_description_edit",avatar_data->fl_about_text);
childSetValue("2nd_life_pic", avatar_data->image_id);
diff --git a/indra/newview/llpanelavatar.h b/indra/newview/llpanelavatar.h
index f2a744dde0..716bb29d45 100644
--- a/indra/newview/llpanelavatar.h
+++ b/indra/newview/llpanelavatar.h
@@ -183,7 +183,9 @@ protected:
private:
- std::string mGroups;
+ typedef std::list<std::string> group_list_t;
+ group_list_t mGroups;
+
LLToggleableMenu* mProfileMenu;
};
diff --git a/indra/newview/llpanellandmarks.cpp b/indra/newview/llpanellandmarks.cpp
index 10b419dfdb..e24fa14e1e 100644
--- a/indra/newview/llpanellandmarks.cpp
+++ b/indra/newview/llpanellandmarks.cpp
@@ -67,6 +67,27 @@ static const std::string TRASH_BUTTON_NAME = "trash_btn";
// helper functions
static void filter_list(LLInventorySubTreePanel* inventory_list, const std::string& string);
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+// Class LLLandmarksPanelObserver
+//
+// Bridge to support knowing when the inventory has changed to update
+// landmarks accordions visibility.
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+class LLLandmarksPanelObserver : public LLInventoryObserver
+{
+public:
+ LLLandmarksPanelObserver(LLLandmarksPanel* lp) : mLP(lp) {}
+ virtual ~LLLandmarksPanelObserver() {}
+ /*virtual*/ void changed(U32 mask);
+
+private:
+ LLLandmarksPanel* mLP;
+};
+
+void LLLandmarksPanelObserver::changed(U32 mask)
+{
+ mLP->updateFilteredAccordions();
+}
LLLandmarksPanel::LLLandmarksPanel()
: LLPanelPlacesTab()
@@ -80,11 +101,16 @@ LLLandmarksPanel::LLLandmarksPanel()
, mGearLandmarkMenu(NULL)
, mDirtyFilter(false)
{
+ mInventoryObserver = new LLLandmarksPanelObserver(this);
+ gInventory.addObserver(mInventoryObserver);
+
LLUICtrlFactory::getInstance()->buildPanel(this, "panel_landmarks.xml");
}
LLLandmarksPanel::~LLLandmarksPanel()
{
+ if (gInventory.containsObserver(mInventoryObserver))
+ gInventory.removeObserver(mInventoryObserver);
}
BOOL LLLandmarksPanel::postBuild()
@@ -135,8 +161,14 @@ void LLLandmarksPanel::onSearchEdit(const std::string& string)
LLAccordionCtrlTab* tab = *iter;
tab->setVisible(true);
- // expand accordion to see matched items in all ones. See EXT-2014.
+ // expand accordion to see matched items in each one. See EXT-2014.
tab->changeOpenClose(false);
+
+ // refresh all accordions to display their contents in case of less restrictive filter
+ LLInventorySubTreePanel* inventory_list = dynamic_cast<LLInventorySubTreePanel*>(tab->getAccordionView());
+ if (NULL == inventory_list) continue;
+ LLFolderView* fv = inventory_list->getRootFolder();
+ fv->refresh();
}
}
@@ -223,6 +255,31 @@ void LLLandmarksPanel::onSelectorButtonClicked()
}
}
+void LLLandmarksPanel::updateFilteredAccordions()
+{
+ LLInventoryPanel* inventory_list = NULL;
+ LLAccordionCtrlTab* accordion_tab = NULL;
+ for (accordion_tabs_t::const_iterator iter = mAccordionTabs.begin(); iter != mAccordionTabs.end(); ++iter)
+ {
+ accordion_tab = *iter;
+ inventory_list = dynamic_cast<LLInventorySubTreePanel*> (accordion_tab->getAccordionView());
+ if (NULL == inventory_list) continue;
+ LLFolderView* fv = inventory_list->getRootFolder();
+
+ bool has_descendants = fv->hasFilteredDescendants();
+
+ accordion_tab->setVisible(has_descendants);
+ }
+
+ // we have to arrange accordion tabs for cases when filter string is less restrictive but
+ // all items are still filtered.
+ static LLAccordionCtrl* accordion = getChild<LLAccordionCtrl>("landmarks_accordion");
+ accordion->arrange();
+
+ // now filter state is applied to accordion tabs
+ mDirtyFilter = false;
+}
+
//////////////////////////////////////////////////////////////////////////
// PROTECTED METHODS
//////////////////////////////////////////////////////////////////////////
@@ -833,31 +890,6 @@ void LLLandmarksPanel::doIdle(void* landmarks_panel)
}
-void LLLandmarksPanel::updateFilteredAccordions()
-{
- LLInventoryPanel* inventory_list = NULL;
- LLAccordionCtrlTab* accordion_tab = NULL;
- for (accordion_tabs_t::const_iterator iter = mAccordionTabs.begin(); iter != mAccordionTabs.end(); ++iter)
- {
- accordion_tab = *iter;
- inventory_list = dynamic_cast<LLInventorySubTreePanel*> (accordion_tab->getAccordionView());
- if (NULL == inventory_list) continue;
- LLFolderView* fv = inventory_list->getRootFolder();
-
- bool has_visible_children = fv->hasVisibleChildren();
-
- accordion_tab->setVisible(has_visible_children);
- }
-
- // we have to arrange accordion tabs for cases when filter string is less restrictive but
- // all items are still filtered.
- static LLAccordionCtrl* accordion = getChild<LLAccordionCtrl>("landmarks_accordion");
- accordion->arrange();
-
- // now filter state is applied to accordion tabs
- mDirtyFilter = false;
-}
-
void LLLandmarksPanel::doShowOnMap(LLLandmark* landmark)
{
LLVector3d landmark_global_pos;
diff --git a/indra/newview/llpanellandmarks.h b/indra/newview/llpanellandmarks.h
index 777ee562d2..c65abc178b 100644
--- a/indra/newview/llpanellandmarks.h
+++ b/indra/newview/llpanellandmarks.h
@@ -46,6 +46,7 @@ class LLAccordionCtrlTab;
class LLFolderViewItem;
class LLMenuGL;
class LLInventoryPanel;
+class LLInventoryObserver;
class LLInventorySubTreePanel;
class LLLandmarksPanel : public LLPanelPlacesTab, LLRemoteParcelInfoObserver
@@ -62,7 +63,14 @@ public:
void onSelectionChange(LLInventorySubTreePanel* inventory_list, const std::deque<LLFolderViewItem*> &items, BOOL user_action);
void onSelectorButtonClicked();
-
+
+ /**
+ * Updates accordions according to filtered items in lists.
+ *
+ * It hides accordion for empty lists
+ */
+ void updateFilteredAccordions();
+
protected:
/**
* @return true - if current selected panel is not null and selected item is a landmark
@@ -122,13 +130,6 @@ private:
static void doIdle(void* landmarks_panel);
/**
- * Updates accordions according to filtered items in lists.
- *
- * It hides accordion for empty lists
- */
- void updateFilteredAccordions();
-
- /**
* Landmark actions callbacks. Fire when a landmark is loaded from the list.
*/
void doShowOnMap(LLLandmark* landmark);
@@ -147,6 +148,7 @@ private:
LLMenuGL* mGearFolderMenu;
LLMenuGL* mMenuAdd;
LLInventorySubTreePanel* mCurrentSelectedList;
+ LLInventoryObserver* mInventoryObserver;
LLPanel* mListCommands;
bool mSortByDate;
diff --git a/indra/newview/llpanellogin.cpp b/indra/newview/llpanellogin.cpp
index 78f3469f0e..ec0f8e303c 100644
--- a/indra/newview/llpanellogin.cpp
+++ b/indra/newview/llpanellogin.cpp
@@ -391,6 +391,10 @@ LLPanelLogin::~LLPanelLogin()
//// We know we're done with the image, so be rid of it.
//gTextureList.deleteImage( mLogoImage );
+
+ // Controls having keyboard focus by default
+ // must reset it on destroy. (EXT-2748)
+ gFocusMgr.setDefaultKeyboardFocus(NULL);
}
// virtual
@@ -682,8 +686,6 @@ void LLPanelLogin::closePanel()
if (sInstance)
{
gViewerWindow->getRootView()->removeChild( LLPanelLogin::sInstance );
-
- gFocusMgr.setDefaultKeyboardFocus(NULL);
delete sInstance;
sInstance = NULL;
diff --git a/indra/newview/llpanelobjectinventory.cpp b/indra/newview/llpanelobjectinventory.cpp
index b1fbf789c6..dbe0ec3b86 100644
--- a/indra/newview/llpanelobjectinventory.cpp
+++ b/indra/newview/llpanelobjectinventory.cpp
@@ -1158,10 +1158,17 @@ void LLTaskLSLBridge::openItem()
{
return;
}
- LLLiveLSLEditor* preview = LLFloaterReg::showTypedInstance<LLLiveLSLEditor>("preview_scriptedit", LLSD(mUUID), TAKE_FOCUS_YES);
- if (preview && (object->permModify() || gAgent.isGodlike()))
+ if (object->permModify() || gAgent.isGodlike())
{
- preview->setObjectID(mPanel->getTaskUUID());
+ LLLiveLSLEditor* preview = LLFloaterReg::showTypedInstance<LLLiveLSLEditor>("preview_scriptedit", LLSD(mUUID), TAKE_FOCUS_YES);
+ if (preview)
+ {
+ preview->setObjectID(mPanel->getTaskUUID());
+ }
+ }
+ else
+ {
+ LLNotifications::instance().add("CannotOpenScriptObjectNoMod");
}
}
diff --git a/indra/newview/llpanelpeople.cpp b/indra/newview/llpanelpeople.cpp
index 2ccd10a065..9dee83a7a1 100644
--- a/indra/newview/llpanelpeople.cpp
+++ b/indra/newview/llpanelpeople.cpp
@@ -538,8 +538,15 @@ BOOL LLPanelPeople::postBuild()
mNearbyList->setCommitCallback(boost::bind(&LLPanelPeople::onAvatarListCommitted, this, mNearbyList));
mRecentList->setCommitCallback(boost::bind(&LLPanelPeople::onAvatarListCommitted, this, mRecentList));
+ // Set openning IM as default on return action for avatar lists
+ mOnlineFriendList->setReturnCallback(boost::bind(&LLPanelPeople::onImButtonClicked, this));
+ mAllFriendList->setReturnCallback(boost::bind(&LLPanelPeople::onImButtonClicked, this));
+ mNearbyList->setReturnCallback(boost::bind(&LLPanelPeople::onImButtonClicked, this));
+ mRecentList->setReturnCallback(boost::bind(&LLPanelPeople::onImButtonClicked, this));
+
mGroupList->setDoubleClickCallback(boost::bind(&LLPanelPeople::onChatButtonClicked, this));
mGroupList->setCommitCallback(boost::bind(&LLPanelPeople::updateButtons, this));
+ mGroupList->setReturnCallback(boost::bind(&LLPanelPeople::onChatButtonClicked, this));
LLAccordionCtrlTab* accordion_tab = getChild<LLAccordionCtrlTab>("tab_all");
accordion_tab->setDropDownStateChangedCallback(
diff --git a/indra/newview/llpanelpermissions.cpp b/indra/newview/llpanelpermissions.cpp
index 0dc010e2e7..d8e0d91d88 100644
--- a/indra/newview/llpanelpermissions.cpp
+++ b/indra/newview/llpanelpermissions.cpp
@@ -66,6 +66,65 @@
#include "roles_constants.h"
#include "llgroupactions.h"
+
+U8 string_value_to_click_action(std::string p_value);
+std::string click_action_to_string_value( U8 action);
+
+U8 string_value_to_click_action(std::string p_value)
+{
+ if(p_value == "Touch")
+ {
+ return CLICK_ACTION_TOUCH;
+ }
+ if(p_value == "Sit")
+ {
+ return CLICK_ACTION_SIT;
+ }
+ if(p_value == "Buy")
+ {
+ return CLICK_ACTION_BUY;
+ }
+ if(p_value == "Pay")
+ {
+ return CLICK_ACTION_PAY;
+ }
+ if(p_value == "Open")
+ {
+ return CLICK_ACTION_OPEN;
+ }
+ if(p_value == "Zoom")
+ {
+ return CLICK_ACTION_ZOOM;
+ }
+ return CLICK_ACTION_TOUCH;
+}
+
+std::string click_action_to_string_value( U8 action)
+{
+ switch (action)
+ {
+ case CLICK_ACTION_TOUCH:
+ default:
+ return "Touch";
+ break;
+ case CLICK_ACTION_SIT:
+ return "Sit";
+ break;
+ case CLICK_ACTION_BUY:
+ return "Buy";
+ break;
+ case CLICK_ACTION_PAY:
+ return "Pay";
+ break;
+ case CLICK_ACTION_OPEN:
+ return "Open";
+ break;
+ case CLICK_ACTION_ZOOM:
+ return "Zoom";
+ break;
+ }
+}
+
///----------------------------------------------------------------------------
/// Class llpanelpermissions
///----------------------------------------------------------------------------
@@ -774,7 +833,8 @@ void LLPanelPermissions::refresh()
LLComboBox* ComboClickAction = getChild<LLComboBox>("clickaction");
if(ComboClickAction)
{
- ComboClickAction->setCurrentByIndex((S32)click_action);
+ std::string combo_value = click_action_to_string_value(click_action);
+ ComboClickAction->setValue(LLSD(combo_value));
}
}
childSetEnabled("label click action",is_perm_modify && all_volume);
@@ -1015,8 +1075,9 @@ void LLPanelPermissions::onCommitClickAction(LLUICtrl* ctrl, void*)
{
LLComboBox* box = (LLComboBox*)ctrl;
if (!box) return;
-
- U8 click_action = (U8)box->getCurrentIndex();
+ std::string value = box->getValue().asString();
+ U8 click_action = string_value_to_click_action(value);
+
if (click_action == CLICK_ACTION_BUY)
{
LLSaleInfo sale_info;
@@ -1028,8 +1089,8 @@ void LLPanelPermissions::onCommitClickAction(LLUICtrl* ctrl, void*)
// Set click action back to its old value
U8 click_action = 0;
LLSelectMgr::getInstance()->selectionGetClickAction(&click_action);
- box->setCurrentByIndex((S32)click_action);
-
+ std::string item_value = click_action_to_string_value(click_action);
+ box->setValue(LLSD(item_value));
return;
}
}
diff --git a/indra/newview/llpanelprimmediacontrols.cpp b/indra/newview/llpanelprimmediacontrols.cpp
index 12ad070efd..529912929d 100644
--- a/indra/newview/llpanelprimmediacontrols.cpp
+++ b/indra/newview/llpanelprimmediacontrols.cpp
@@ -54,6 +54,7 @@
#include "llpanelprimmediacontrols.h"
#include "llpluginclassmedia.h"
#include "llprogressbar.h"
+#include "llstring.h"
#include "llviewercontrol.h"
#include "llviewerparcelmgr.h"
#include "llviewermedia.h"
@@ -92,6 +93,7 @@ LLPanelPrimMediaControls::LLPanelPrimMediaControls() :
mCommitCallbackRegistrar.add("MediaCtrl.Forward", boost::bind(&LLPanelPrimMediaControls::onClickForward, this));
mCommitCallbackRegistrar.add("MediaCtrl.Home", boost::bind(&LLPanelPrimMediaControls::onClickHome, this));
mCommitCallbackRegistrar.add("MediaCtrl.Stop", boost::bind(&LLPanelPrimMediaControls::onClickStop, this));
+ mCommitCallbackRegistrar.add("MediaCtrl.MediaStop", boost::bind(&LLPanelPrimMediaControls::onClickMediaStop, this));
mCommitCallbackRegistrar.add("MediaCtrl.Reload", boost::bind(&LLPanelPrimMediaControls::onClickReload, this));
mCommitCallbackRegistrar.add("MediaCtrl.Play", boost::bind(&LLPanelPrimMediaControls::onClickPlay, this));
mCommitCallbackRegistrar.add("MediaCtrl.Pause", boost::bind(&LLPanelPrimMediaControls::onClickPause, this));
@@ -102,6 +104,8 @@ LLPanelPrimMediaControls::LLPanelPrimMediaControls() :
mCommitCallbackRegistrar.add("MediaCtrl.CommitVolumeUp", boost::bind(&LLPanelPrimMediaControls::onCommitVolumeUp, this));
mCommitCallbackRegistrar.add("MediaCtrl.CommitVolumeDown", boost::bind(&LLPanelPrimMediaControls::onCommitVolumeDown, this));
mCommitCallbackRegistrar.add("MediaCtrl.ToggleMute", boost::bind(&LLPanelPrimMediaControls::onToggleMute, this));
+ mCommitCallbackRegistrar.add("MediaCtrl.SkipBack", boost::bind(&LLPanelPrimMediaControls::onClickSkipBack, this));
+ mCommitCallbackRegistrar.add("MediaCtrl.SkipForward", boost::bind(&LLPanelPrimMediaControls::onClickSkipForward, this));
LLUICtrlFactory::getInstance()->buildPanel(this, "panel_prim_media_controls.xml");
mInactivityTimer.reset();
@@ -135,6 +139,8 @@ BOOL LLPanelPrimMediaControls::postBuild()
mMediaAddress = getChild<LLUICtrl>("media_address_url");
mMediaPlaySliderPanel = getChild<LLUICtrl>("media_play_position");
mMediaPlaySliderCtrl = getChild<LLUICtrl>("media_play_slider");
+ mSkipFwdCtrl = getChild<LLUICtrl>("skip_forward");
+ mSkipBackCtrl = getChild<LLUICtrl>("skip_back");
mVolumeCtrl = getChild<LLUICtrl>("media_volume");
mVolumeBtn = getChild<LLButton>("media_volume_button");
mVolumeUpCtrl = getChild<LLUICtrl>("volume_up");
@@ -145,6 +151,7 @@ BOOL LLPanelPrimMediaControls::postBuild()
mLeftBookend = getChild<LLUICtrl>("left_bookend");
mRightBookend = getChild<LLUICtrl>("right_bookend");
mBackgroundImage = LLUI::getUIImage(getString("control_background_image_name"));
+ LLStringUtil::convertToF32(getString("skip_step"), mSkipStep);
// These are currently removed...but getChild creates a "dummy" widget.
// This class handles them missing.
@@ -329,12 +336,17 @@ void LLPanelPrimMediaControls::updateShape()
mReloadCtrl->setVisible(FALSE);
mMediaStopCtrl->setVisible(has_focus);
mHomeCtrl->setVisible(FALSE);
- mBackCtrl->setEnabled(has_focus);
- mFwdCtrl->setEnabled(has_focus);
+ // No nav controls
+ mBackCtrl->setVisible(FALSE);
+ mFwdCtrl->setEnabled(FALSE);
mMediaAddressCtrl->setVisible(false);
mMediaAddressCtrl->setEnabled(false);
mMediaPlaySliderPanel->setVisible(has_focus && !mini_controls);
mMediaPlaySliderPanel->setEnabled(has_focus && !mini_controls);
+ mSkipFwdCtrl->setVisible(has_focus && !mini_controls);
+ mSkipFwdCtrl->setEnabled(has_focus && !mini_controls);
+ mSkipBackCtrl->setVisible(has_focus && !mini_controls);
+ mSkipBackCtrl->setEnabled(has_focus && !mini_controls);
mVolumeCtrl->setVisible(has_focus);
mVolumeUpCtrl->setVisible(has_focus);
@@ -435,6 +447,10 @@ void LLPanelPrimMediaControls::updateShape()
mMediaAddressCtrl->setEnabled(has_focus && !mini_controls);
mMediaPlaySliderPanel->setVisible(FALSE);
mMediaPlaySliderPanel->setEnabled(FALSE);
+ mSkipFwdCtrl->setVisible(FALSE);
+ mSkipFwdCtrl->setEnabled(FALSE);
+ mSkipBackCtrl->setVisible(FALSE);
+ mSkipBackCtrl->setEnabled(FALSE);
mVolumeCtrl->setVisible(FALSE);
mVolumeUpCtrl->setVisible(FALSE);
@@ -766,8 +782,8 @@ void LLPanelPrimMediaControls::onClickClose()
void LLPanelPrimMediaControls::close()
{
+ resetZoomLevel(true);
LLViewerMediaFocus::getInstance()->clearFocus();
- resetZoomLevel();
setVisible(FALSE);
}
@@ -789,7 +805,7 @@ void LLPanelPrimMediaControls::onClickForward()
focusOnTarget();
LLViewerMediaImpl* impl = getTargetMediaImpl();
-
+
if (impl)
{
impl->navigateForward();
@@ -862,16 +878,56 @@ void LLPanelPrimMediaControls::onClickStop()
if(impl)
{
+ impl->navigateStop();
+ }
+}
+
+void LLPanelPrimMediaControls::onClickMediaStop()
+{
+ focusOnTarget();
+
+ LLViewerMediaImpl* impl = getTargetMediaImpl();
+
+ if(impl)
+ {
impl->stop();
}
}
-void LLPanelPrimMediaControls::onClickZoom()
+void LLPanelPrimMediaControls::onClickSkipBack()
{
focusOnTarget();
- nextZoomLevel();
+ LLViewerMediaImpl* impl =getTargetMediaImpl();
+
+ if (impl)
+ {
+ impl->skipBack(mSkipStep);
+ }
}
+
+void LLPanelPrimMediaControls::onClickSkipForward()
+{
+ focusOnTarget();
+
+ LLViewerMediaImpl* impl = getTargetMediaImpl();
+
+ if (impl)
+ {
+ impl->skipForward(mSkipStep);
+ }
+}
+
+void LLPanelPrimMediaControls::onClickZoom()
+{
+ focusOnTarget();
+
+ if(mCurrentZoom == ZOOM_NONE)
+ {
+ nextZoomLevel();
+ }
+}
+
void LLPanelPrimMediaControls::nextZoomLevel()
{
int index = 0;
@@ -888,12 +944,15 @@ void LLPanelPrimMediaControls::nextZoomLevel()
updateZoom();
}
-void LLPanelPrimMediaControls::resetZoomLevel()
+void LLPanelPrimMediaControls::resetZoomLevel(bool reset_camera)
{
if(mCurrentZoom != ZOOM_NONE)
{
mCurrentZoom = ZOOM_NONE;
- updateZoom();
+ if(reset_camera)
+ {
+ updateZoom();
+ }
}
}
diff --git a/indra/newview/llpanelprimmediacontrols.h b/indra/newview/llpanelprimmediacontrols.h
index 124fa9cce4..accfb72a04 100644
--- a/indra/newview/llpanelprimmediacontrols.h
+++ b/indra/newview/llpanelprimmediacontrols.h
@@ -58,7 +58,7 @@ public:
void updateShape();
bool isMouseOver();
void nextZoomLevel();
- void resetZoomLevel();
+ void resetZoomLevel(bool reset_camera = true);
void close();
LLHandle<LLPanelPrimMediaControls> getHandle() const { return mPanelHandle; }
@@ -95,6 +95,9 @@ private:
void onClickPause();
void onClickStop();
void onClickZoom();
+ void onClickSkipBack();
+ void onClickSkipForward();
+ void onClickMediaStop();
void onCommitURL();
void updateZoom();
@@ -137,6 +140,8 @@ private:
LLUICtrl *mHomeCtrl;
LLUICtrl *mUnzoomCtrl;
LLUICtrl *mOpenCtrl;
+ LLUICtrl *mSkipBackCtrl;
+ LLUICtrl *mSkipFwdCtrl;
LLUICtrl *mZoomCtrl;
LLPanel *mMediaProgressPanel;
LLProgressBar *mMediaProgressBar;
@@ -154,6 +159,7 @@ private:
LLUICtrl *mLeftBookend;
LLUICtrl *mRightBookend;
LLUIImage* mBackgroundImage;
+ F32 mSkipStep;
LLUICtrl *mMediaPanelScroll;
LLButton *mScrollUpCtrl;
diff --git a/indra/newview/llpanelteleporthistory.cpp b/indra/newview/llpanelteleporthistory.cpp
index 057cdde6f0..67d0e13786 100644
--- a/indra/newview/llpanelteleporthistory.cpp
+++ b/indra/newview/llpanelteleporthistory.cpp
@@ -262,6 +262,7 @@ BOOL LLTeleportHistoryPanel::postBuild()
fl->setCommitOnSelectionChange(true);
fl->setDoubleClickCallback(boost::bind(&LLTeleportHistoryPanel::onDoubleClickItem, this));
fl->setCommitCallback(boost::bind(&LLTeleportHistoryPanel::handleItemSelect, this, fl));
+ fl->setReturnCallback(boost::bind(&LLTeleportHistoryPanel::onReturnKeyPressed, this));
}
}
}
@@ -636,6 +637,12 @@ void LLTeleportHistoryPanel::handleItemSelect(LLFlatListView* selected)
updateVerbs();
}
+void LLTeleportHistoryPanel::onReturnKeyPressed()
+{
+ // Teleport to selected region as default action on return key pressed
+ onTeleport();
+}
+
void LLTeleportHistoryPanel::onDoubleClickItem()
{
// If item got doubleclick, then that item is already selected
diff --git a/indra/newview/llpanelteleporthistory.h b/indra/newview/llpanelteleporthistory.h
index b34d9e876c..a31ff34cb6 100644
--- a/indra/newview/llpanelteleporthistory.h
+++ b/indra/newview/llpanelteleporthistory.h
@@ -80,6 +80,7 @@ public:
private:
void onDoubleClickItem();
+ void onReturnKeyPressed();
void onAccordionTabRightClick(LLView *view, S32 x, S32 y, MASK mask);
void onAccordionTabOpen(LLAccordionCtrlTab *tab);
void onAccordionTabClose(LLAccordionCtrlTab *tab);
diff --git a/indra/newview/llparticipantlist.cpp b/indra/newview/llparticipantlist.cpp
index 13bd059d45..4ee9cba69c 100644
--- a/indra/newview/llparticipantlist.cpp
+++ b/indra/newview/llparticipantlist.cpp
@@ -65,6 +65,8 @@ LLParticipantList::LLParticipantList(LLSpeakerMgr* data_source, LLAvatarList* av
mAvatarList->setNoItemsCommentText(LLTrans::getString("LoadingData"));
mAvatarList->setDoubleClickCallback(boost::bind(&LLParticipantList::onAvatarListDoubleClicked, this, mAvatarList));
mAvatarList->setRefreshCompleteCallback(boost::bind(&LLParticipantList::onAvatarListRefreshed, this, _1, _2));
+ // Set onAvatarListDoubleClicked as default on_return action.
+ mAvatarList->setReturnCallback(boost::bind(&LLParticipantList::onAvatarListDoubleClicked, this, mAvatarList));
mParticipantListMenu = new LLParticipantListMenu(*this);
mAvatarList->setContextMenu(mParticipantListMenu);
@@ -99,6 +101,7 @@ void LLParticipantList::setSpeakingIndicatorsVisible(BOOL visible)
void LLParticipantList::onAvatarListDoubleClicked(LLAvatarList* list)
{
+ // NOTE(EM): Should we check if there is multiple selection and start conference if it is so?
LLUUID clicked_id = list->getSelectedUUID();
if (clicked_id.isNull() || clicked_id == gAgent.getID())
diff --git a/indra/newview/llscreenchannel.cpp b/indra/newview/llscreenchannel.cpp
index 24505f6bd6..24ba288c49 100644
--- a/indra/newview/llscreenchannel.cpp
+++ b/indra/newview/llscreenchannel.cpp
@@ -46,6 +46,7 @@
#include "lldockablefloater.h"
#include "llsyswellwindow.h"
#include "llimfloater.h"
+#include "llscriptfloater.h"
#include <algorithm>
@@ -114,7 +115,9 @@ void LLScreenChannelBase::init(S32 channel_left, S32 channel_right)
// LLScreenChannel
//////////////////////
//--------------------------------------------------------------------------
-LLScreenChannel::LLScreenChannel(LLUUID& id): LLScreenChannelBase(id)
+LLScreenChannel::LLScreenChannel(LLUUID& id):
+LLScreenChannelBase(id)
+,mStartUpToastPanel(NULL)
{
}
@@ -357,8 +360,6 @@ void LLScreenChannel::redrawToasts()
if(mToastList.size() == 0 || isHovering())
return;
- hideToastsFromScreen();
-
switch(mToastAlignment)
{
case NA_TOP :
@@ -382,6 +383,8 @@ void LLScreenChannel::showToastsBottom()
S32 toast_margin = 0;
std::vector<ToastElem>::reverse_iterator it;
+ closeOverflowToastPanel();
+
for(it = mToastList.rbegin(); it != mToastList.rend(); ++it)
{
if(it != mToastList.rbegin())
@@ -407,7 +410,20 @@ void LLScreenChannel::showToastsBottom()
if(stop_showing_toasts)
break;
- (*it).toast->setVisible(TRUE);
+ if( !(*it).toast->getVisible() )
+ {
+ if((*it).toast->isFirstLook())
+ {
+ (*it).toast->setVisible(TRUE);
+ }
+ else
+ {
+ // HACK
+ // EXT-2653: it is necessary to prevent overlapping for secondary showed toasts
+ (*it).toast->setVisible(TRUE);
+ gFloaterView->sendChildToBack((*it).toast);
+ }
+ }
}
if(it != mToastList.rend() && !mOverflowToastHidden)
@@ -416,6 +432,7 @@ void LLScreenChannel::showToastsBottom()
for(; it != mToastList.rend(); it++)
{
(*it).toast->stopTimer();
+ (*it).toast->setVisible(FALSE);
mHiddenToastsNum++;
}
createOverflowToast(bottom, gSavedSettings.getS32("NotificationTipToastLifeTime"));
@@ -686,7 +703,8 @@ void LLScreenChannel::updateShowToastsState()
}
// for IM floaters showed in a docked state - prohibit showing of ani toast
- if(dynamic_cast<LLIMFloater*>(floater))
+ if(dynamic_cast<LLIMFloater*>(floater)
+ || dynamic_cast<LLScriptFloater*>(floater) )
{
setShowToasts(!(floater->getVisible() && floater->isDocked()));
if (!getShowToasts())
diff --git a/indra/newview/llscriptfloater.cpp b/indra/newview/llscriptfloater.cpp
new file mode 100644
index 0000000000..bdea6ff459
--- /dev/null
+++ b/indra/newview/llscriptfloater.cpp
@@ -0,0 +1,335 @@
+/**
+ * @file llscriptfloater.cpp
+ * @brief LLScriptFloater class definition
+ *
+ * $LicenseInfo:firstyear=2009&license=viewergpl$
+ *
+ * Copyright (c) 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"
+#include "llscriptfloater.h"
+
+#include "llbottomtray.h"
+#include "llchannelmanager.h"
+#include "llchiclet.h"
+#include "llfloaterreg.h"
+#include "llscreenchannel.h"
+#include "lltoastnotifypanel.h"
+#include "llviewerwindow.h"
+
+//////////////////////////////////////////////////////////////////////////
+//////////////////////////////////////////////////////////////////////////
+//////////////////////////////////////////////////////////////////////////
+
+LLUUID notification_id_to_object_id(const LLUUID& notification_id)
+{
+ LLNotificationPtr notification = LLNotifications::getInstance()->find(notification_id);
+ if(notification)
+ {
+ return notification->getPayload()["object_id"].asUUID();
+ }
+ return LLUUID::null;
+}
+
+//////////////////////////////////////////////////////////////////////////
+//////////////////////////////////////////////////////////////////////////
+//////////////////////////////////////////////////////////////////////////
+
+LLScriptFloater::LLScriptFloater(const LLSD& key)
+: LLTransientDockableFloater(NULL, true, key)
+, mScriptForm(NULL)
+, mObjectId(key.asUUID())
+{
+}
+
+bool LLScriptFloater::toggle(const LLUUID& object_id)
+{
+ LLScriptFloater* floater = LLFloaterReg::findTypedInstance<LLScriptFloater>("script_floater", object_id);
+
+ // show existing floater
+ if(floater)
+ {
+ if(floater->getVisible())
+ {
+ floater->setVisible(false);
+ return false;
+ }
+ else
+ {
+ floater->setVisible(TRUE);
+ floater->setFocus(TRUE);
+ return true;
+ }
+ }
+ // create and show new floater
+ else
+ {
+ show(object_id);
+ return true;
+ }
+}
+
+LLScriptFloater* LLScriptFloater::show(const LLUUID& object_id)
+{
+ LLScriptFloater* floater = LLFloaterReg::showTypedInstance<LLScriptFloater>("script_floater", object_id);
+ floater->createForm(object_id);
+
+ if (floater->getDockControl() == NULL)
+ {
+ LLChiclet* chiclet = LLBottomTray::getInstance()->getChicletPanel()->findChiclet<LLChiclet>(object_id);
+ if (chiclet == NULL)
+ {
+ llerror("Dock chiclet for LLScriptFloater doesn't exist", 0);
+ }
+ else
+ {
+ LLBottomTray::getInstance()->getChicletPanel()->scrollToChiclet(chiclet);
+ }
+
+ floater->setDockControl(new LLDockControl(chiclet, floater, floater->getDockTongue(),
+ LLDockControl::TOP, boost::bind(&LLScriptFloater::getAllowedRect, floater, _1)));
+ }
+
+ return floater;
+}
+
+void LLScriptFloater::getAllowedRect(LLRect& rect)
+{
+ rect = gViewerWindow->getWorldViewRectRaw();
+}
+
+void LLScriptFloater::createForm(const LLUUID& object_id)
+{
+ // delete old form
+ if(mScriptForm)
+ {
+ removeChild(mScriptForm);
+ mScriptForm->die();
+ }
+
+ LLNotificationPtr notification = LLNotifications::getInstance()->find(
+ LLScriptFloaterManager::getInstance()->findNotificationId(object_id));
+ if(NULL == notification)
+ {
+ return;
+ }
+
+ // create new form
+ mScriptForm = new LLToastNotifyPanel(notification);
+ addChild(mScriptForm);
+
+ // position form on floater
+ mScriptForm->setOrigin(0, 0);
+
+ // make floater size fit form size
+ LLRect toast_rect = getRect();
+ LLRect panel_rect = mScriptForm->getRect();
+ toast_rect.setLeftTopAndSize(toast_rect.mLeft, toast_rect.mTop, panel_rect.getWidth(), panel_rect.getHeight() + getHeaderHeight());
+ setShape(toast_rect);
+}
+
+void LLScriptFloater::onClose(bool app_quitting)
+{
+ LLScriptFloaterManager::getInstance()->removeNotificationByObjectId(getObjectId());
+}
+
+void LLScriptFloater::setDocked(bool docked, bool pop_on_undock /* = true */)
+{
+ LLTransientDockableFloater::setDocked(docked, pop_on_undock);
+
+ hideToastsIfNeeded();
+}
+
+void LLScriptFloater::setVisible(BOOL visible)
+{
+ LLTransientDockableFloater::setVisible(visible);
+
+ hideToastsIfNeeded();
+}
+
+void LLScriptFloater::hideToastsIfNeeded()
+{
+ using namespace LLNotificationsUI;
+
+ // find channel
+ LLScreenChannel* channel = dynamic_cast<LLScreenChannel*>(LLChannelManager::getInstance()->findChannelByID(
+ LLUUID(gSavedSettings.getString("NotificationChannelUUID"))));
+ // update notification channel state
+ if(channel)
+ {
+ channel->updateShowToastsState();
+ }
+}
+
+//////////////////////////////////////////////////////////////////////////
+//////////////////////////////////////////////////////////////////////////
+//////////////////////////////////////////////////////////////////////////
+
+void LLScriptFloaterManager::onAddNotification(const LLUUID& notification_id)
+{
+ // get scripted Object's ID
+ LLUUID object_id = notification_id_to_object_id(notification_id);
+ if(object_id.isNull())
+ {
+ llwarns << "Invalid notification, no object id" << llendl;
+ return;
+ }
+
+ // If an Object spawns more-than-one floater, only the newest one is shown.
+ // The previous is automatically closed.
+ script_notification_map_t::iterator it = mNotifications.find(object_id);
+ if(it != mNotifications.end())
+ {
+ onRemoveNotification(notification_id);
+ }
+
+ LLNotificationData nd = {notification_id};
+ mNotifications.insert(std::make_pair(object_id, nd));
+
+ LLBottomTray::getInstance()->getChicletPanel()->createChiclet<LLScriptChiclet>(object_id);
+}
+
+void LLScriptFloaterManager::onRemoveNotification(const LLUUID& notification_id)
+{
+ LLUUID object_id = notification_id_to_object_id(notification_id);
+ if(object_id.isNull())
+ {
+ llwarns << "Invalid notification, no object id" << llendl;
+ return;
+ }
+
+ using namespace LLNotificationsUI;
+
+ // remove related toast
+ LLUUID channel_id(gSavedSettings.getString("NotificationChannelUUID"));
+ LLScreenChannel* channel = dynamic_cast<LLScreenChannel*>
+ (LLChannelManager::getInstance()->findChannelByID(channel_id));
+ if(channel)
+ {
+ channel->killToastByNotificationID(findNotificationToastId(object_id));
+ }
+
+ mNotifications.erase(object_id);
+
+ // remove related chiclet
+ LLBottomTray::getInstance()->getChicletPanel()->removeChiclet(object_id);
+
+ // close floater
+ LLScriptFloater* floater = LLFloaterReg::findTypedInstance<LLScriptFloater>("script_floater", object_id);
+ if(floater)
+ {
+ floater->closeFloater();
+ }
+}
+
+void LLScriptFloaterManager::removeNotificationByObjectId(const LLUUID& object_id)
+{
+ // Check we have not removed notification yet
+ LLNotificationPtr notification = LLNotifications::getInstance()->find(
+ findNotificationId(object_id));
+ if(notification)
+ {
+ onRemoveNotification(notification->getID());
+ }
+}
+
+void LLScriptFloaterManager::toggleScriptFloater(const LLUUID& object_id)
+{
+ // hide "new message" icon from chiclet
+ LLIMChiclet* chiclet = LLBottomTray::getInstance()->getChicletPanel()->findChiclet<LLIMChiclet>(object_id);
+ if(chiclet)
+ {
+ chiclet->setShowNewMessagesIcon(false);
+ }
+
+ // kill toast
+ using namespace LLNotificationsUI;
+ LLScreenChannel* channel = dynamic_cast<LLScreenChannel*>(LLChannelManager::getInstance()->findChannelByID(
+ LLUUID(gSavedSettings.getString("NotificationChannelUUID"))));
+ if(channel)
+ {
+ channel->killToastByNotificationID(findNotificationToastId(object_id));
+ }
+
+ // toggle floater
+ LLScriptFloater::toggle(object_id);
+}
+
+void LLScriptFloaterManager::setNotificationToastId(const LLUUID& object_id, const LLUUID& notification_id)
+{
+ script_notification_map_t::iterator it = mNotifications.find(object_id);
+ if(mNotifications.end() != it)
+ {
+ it->second.toast_notification_id = notification_id;
+ }
+}
+
+LLUUID LLScriptFloaterManager::findNotificationId(const LLUUID& object_id)
+{
+ script_notification_map_t::const_iterator it = mNotifications.find(object_id);
+ if(mNotifications.end() != it)
+ {
+ return it->second.notification_id;
+ }
+ return LLUUID::null;
+}
+
+LLUUID LLScriptFloaterManager::findNotificationToastId(const LLUUID& object_id)
+{
+ script_notification_map_t::const_iterator it = mNotifications.find(object_id);
+ if(mNotifications.end() != it)
+ {
+ return it->second.toast_notification_id;
+ }
+ return LLUUID::null;
+}
+
+//static
+void LLScriptFloaterManager::onToastButtonClick(const LLSD&notification, const LLSD&response)
+{
+ S32 option = LLNotification::getSelectedOption(notification, response);
+ LLUUID object_id = notification["payload"]["object_id"].asUUID();
+
+ switch(option)
+ {
+ case 0: // "Open"
+ LLScriptFloaterManager::getInstance()->toggleScriptFloater(object_id);
+ break;
+ case 1: // "Ignore"
+ LLScriptFloaterManager::getInstance()->removeNotificationByObjectId(object_id);
+ break;
+ case 2: // "Block"
+ LLMuteList::getInstance()->add(LLMute(object_id, notification["substitutions"]["TITLE"], LLMute::OBJECT));
+ LLScriptFloaterManager::getInstance()->removeNotificationByObjectId(object_id);
+ break;
+ default:
+ llwarns << "Unexpected value" << llendl;
+ break;
+ }
+}
+
+// EOF
diff --git a/indra/newview/llscriptfloater.h b/indra/newview/llscriptfloater.h
new file mode 100644
index 0000000000..0e1a7f36b7
--- /dev/null
+++ b/indra/newview/llscriptfloater.h
@@ -0,0 +1,164 @@
+/**
+ * @file llscriptfloater.h
+ * @brief LLScriptFloater class definition
+ *
+ * $LicenseInfo:firstyear=2009&license=viewergpl$
+ *
+ * Copyright (c) 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_SCRIPTFLOATER_H
+#define LL_SCRIPTFLOATER_H
+
+#include "lltransientdockablefloater.h"
+
+class LLToastNotifyPanel;
+
+/**
+ * Handles script notifications ("ScriptDialog" and "ScriptDialogGroup")
+ * and manages Script Floaters.
+ */
+class LLScriptFloaterManager : public LLSingleton<LLScriptFloaterManager>
+{
+public:
+
+ /**
+ * Handles new notifications.
+ * Saves notification and object ids, removes old notification if needed, creates script chiclet
+ * Note that one object can spawn one script floater.
+ */
+ void onAddNotification(const LLUUID& notification_id);
+
+ /**
+ * Handles notification removal.
+ * Removes script notification toast, removes script chiclet, closes script floater
+ */
+ void onRemoveNotification(const LLUUID& notification_id);
+
+ /**
+ * Wrapper for onRemoveNotification, removes notification by object id.
+ */
+ void removeNotificationByObjectId(const LLUUID& object_id);
+
+ /**
+ * Toggles script floater.
+ * Removes "new message" icon from chiclet and removes notification toast.
+ */
+ void toggleScriptFloater(const LLUUID& object_id);
+
+ LLUUID findNotificationId(const LLUUID& object_id);
+
+ LLUUID findNotificationToastId(const LLUUID& object_id);
+
+ /**
+ * Associate notification toast id with object id.
+ */
+ void setNotificationToastId(const LLUUID& object_id, const LLUUID& notification_id);
+
+ /**
+ * Callback for notification toast buttons.
+ */
+ static void onToastButtonClick(const LLSD&notification, const LLSD&response);
+
+private:
+
+ struct LLNotificationData
+ {
+ LLUUID notification_id;
+ LLUUID toast_notification_id;
+ };
+
+ // <object_id, notification_data>
+ typedef std::map<LLUUID, LLNotificationData> script_notification_map_t;
+
+ script_notification_map_t mNotifications;
+};
+
+/**
+ * Floater script forms.
+ * LLScriptFloater will create script form based on notification data and
+ * will auto fit the form.
+ */
+class LLScriptFloater : public LLTransientDockableFloater
+{
+public:
+
+ /**
+ * key - UUID of scripted Object
+ */
+ LLScriptFloater(const LLSD& key);
+
+ virtual ~LLScriptFloater(){};
+
+ /**
+ * Toggle existing floater or create and show a new one.
+ */
+ static bool toggle(const LLUUID& object_id);
+
+ /**
+ * Creates and shows floater
+ */
+ static LLScriptFloater* show(const LLUUID& object_id);
+
+ const LLUUID& getObjectId() { return mObjectId; }
+
+ /**
+ * Close notification if script floater is closed.
+ */
+ /*virtual*/ void onClose(bool app_quitting);
+
+ /**
+ * Hide all notification toasts when we show dockable floater
+ */
+ /*virtual*/ void setDocked(bool docked, bool pop_on_undock = true);
+
+ /**
+ * Hide all notification toasts when we show dockable floater
+ */
+ /*virtual*/ void setVisible(BOOL visible);
+
+protected:
+
+ /**
+ * Creates script form, will delete old form if floater is shown for same object.
+ */
+ void createForm(const LLUUID& object_id);
+
+ /*virtual*/ void getAllowedRect(LLRect& rect);
+
+ /**
+ * Hide all notification toasts.
+ */
+ static void hideToastsIfNeeded();
+
+ void setObjectId(const LLUUID& id) { mObjectId = id; }
+
+private:
+ LLToastNotifyPanel* mScriptForm;
+ LLUUID mObjectId;
+};
+
+#endif //LL_SCRIPTFLOATER_H
diff --git a/indra/newview/llstartup.cpp b/indra/newview/llstartup.cpp
index d36ff1605e..736be67710 100644
--- a/indra/newview/llstartup.cpp
+++ b/indra/newview/llstartup.cpp
@@ -2153,7 +2153,7 @@ void login_callback(S32 option, void *userdata)
LLStartUp::setStartupState( STATE_LOGIN_CLEANUP );
return;
}
- else if (QUIT_OPTION == option)
+ else if (QUIT_OPTION == option) // *TODO: THIS CODE SEEMS TO BE UNREACHABLE!!!!! login_callback is never called with option equal to QUIT_OPTION
{
// Make sure we don't save the password if the user is trying to clear it.
std::string first, last, password;
diff --git a/indra/newview/lltexturefetch.cpp b/indra/newview/lltexturefetch.cpp
index 6f3dabe5a7..9bb2a4ad0a 100644
--- a/indra/newview/lltexturefetch.cpp
+++ b/indra/newview/lltexturefetch.cpp
@@ -931,6 +931,14 @@ bool LLTextureFetchWorker::doWork(S32 param)
if (mState == DECODE_IMAGE)
{
+ if (mDesiredDiscard < 0)
+ {
+ // We aborted, don't decode
+ mState = DONE;
+ setPriority(LLWorkerThread::PRIORITY_LOW | mWorkPriority);
+ return true;
+ }
+
if (mFormattedImage->getDataSize() <= 0)
{
llerrs << "Decode entered with invalid mFormattedImage. ID = " << mID << llendl;
diff --git a/indra/newview/lltoast.cpp b/indra/newview/lltoast.cpp
index ed2cedbd10..f9cbdc20d6 100644
--- a/indra/newview/lltoast.cpp
+++ b/indra/newview/lltoast.cpp
@@ -227,7 +227,7 @@ void LLToast::setVisible(BOOL show)
}
LLModalDialog::setFrontmost(FALSE);
}
- LLPanel::setVisible(show);
+ LLFloater::setVisible(show);
if(mPanel)
{
if(!mPanel->isDead())
diff --git a/indra/newview/lltoolpie.cpp b/indra/newview/lltoolpie.cpp
index 9c8fca3552..5ed8dc5fb9 100644
--- a/indra/newview/lltoolpie.cpp
+++ b/indra/newview/lltoolpie.cpp
@@ -209,6 +209,7 @@ BOOL LLToolPie::pickLeftMouseDownCallback()
// touch behavior down below...
break;
case CLICK_ACTION_SIT:
+
if ((gAgent.getAvatarObject() != NULL) && (!gAgent.getAvatarObject()->isSitting())) // agent not already sitting
{
handle_object_sit_or_stand();
@@ -252,7 +253,7 @@ BOOL LLToolPie::pickLeftMouseDownCallback()
selectionPropertiesReceived();
}
}
- return TRUE;
+ return TRUE;
case CLICK_ACTION_PLAY:
handle_click_action_play();
return TRUE;
@@ -260,6 +261,29 @@ BOOL LLToolPie::pickLeftMouseDownCallback()
// mClickActionObject = object;
handle_click_action_open_media(object);
return TRUE;
+ case CLICK_ACTION_ZOOM:
+ {
+ const F32 PADDING_FACTOR = 2.f;
+ LLViewerObject* object = gObjectList.findObject(mPick.mObjectID);
+
+ if (object)
+ {
+ gAgent.setFocusOnAvatar(FALSE, ANIMATE);
+
+ LLBBox bbox = object->getBoundingBoxAgent() ;
+ F32 angle_of_view = llmax(0.1f, LLViewerCamera::getInstance()->getAspect() > 1.f ? LLViewerCamera::getInstance()->getView() * LLViewerCamera::getInstance()->getAspect() : LLViewerCamera::getInstance()->getView());
+ F32 distance = bbox.getExtentLocal().magVec() * PADDING_FACTOR / atan(angle_of_view);
+
+ LLVector3 obj_to_cam = LLViewerCamera::getInstance()->getOrigin() - bbox.getCenterAgent();
+ obj_to_cam.normVec();
+
+ LLVector3d object_center_global = gAgent.getPosGlobalFromAgent(bbox.getCenterAgent());
+ gAgent.setCameraPosAndFocusGlobal(object_center_global + LLVector3d(obj_to_cam * distance),
+ object_center_global,
+ mPick.mObjectID );
+ }
+ }
+ return TRUE;
default:
// nothing
break;
@@ -413,6 +437,9 @@ ECursorType cursor_from_object(LLViewerObject* object)
cursor = UI_CURSOR_HAND;
}
break;
+ case CLICK_ACTION_ZOOM:
+ cursor = UI_CURSOR_TOOLZOOMIN;
+ break;
case CLICK_ACTION_PLAY:
case CLICK_ACTION_OPEN_MEDIA:
cursor = cursor_from_parcel_media(click_action);
@@ -551,6 +578,9 @@ BOOL LLToolPie::handleMouseUp(S32 x, S32 y, MASK mask)
case CLICK_ACTION_BUY:
case CLICK_ACTION_PAY:
case CLICK_ACTION_OPEN:
+ case CLICK_ACTION_ZOOM:
+ case CLICK_ACTION_PLAY:
+ case CLICK_ACTION_OPEN_MEDIA:
// Because these actions open UI dialogs, we won't change
// the cursor again until the next hover and GL pick over
// the world. Keep the cursor an arrow, assuming that
diff --git a/indra/newview/llviewerfloaterreg.cpp b/indra/newview/llviewerfloaterreg.cpp
index 7772f613f0..642df92379 100644
--- a/indra/newview/llviewerfloaterreg.cpp
+++ b/indra/newview/llviewerfloaterreg.cpp
@@ -109,6 +109,7 @@
#include "llfloaterwhitelistentry.h"
#include "llfloaterwindlight.h"
#include "llfloaterworldmap.h"
+#include "llimfloatercontainer.h"
#include "llinspectavatar.h"
#include "llinspectgroup.h"
#include "llinspectobject.h"
@@ -124,6 +125,7 @@
#include "llpreviewsound.h"
#include "llpreviewtexture.h"
#include "llsyswellwindow.h"
+#include "llscriptfloater.h"
// *NOTE: Please add files in alphabetical order to keep merges easy.
@@ -171,6 +173,8 @@ void LLViewerFloaterReg::registerFloaters()
LLFloaterReg::add("hud", "floater_hud.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterHUD>);
LLFloaterReg::add("impanel", "floater_im_session.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLIMFloater>);
+ LLFloaterReg::add("im_container", "floater_im_container.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLIMFloaterContainer>);
+ LLFloaterReg::add("script_floater", "floater_script.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLScriptFloater>);
LLFloaterReg::add("incoming_call", "floater_incoming_call.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLIncomingCallDialog>);
LLFloaterReg::add("inventory", "floater_inventory.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterInventory>);
LLFloaterReg::add("inspect", "floater_inspect.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterInspect>);
diff --git a/indra/newview/llviewermedia.cpp b/indra/newview/llviewermedia.cpp
index 3a7c54479b..8c41133a3a 100644
--- a/indra/newview/llviewermedia.cpp
+++ b/indra/newview/llviewermedia.cpp
@@ -278,7 +278,7 @@ viewer_media_t LLViewerMedia::newMediaImpl(
}
else
{
- media_impl->stop();
+ media_impl->unload();
media_impl->mTextureId = texture_id;
media_impl->mMediaWidth = media_width;
media_impl->mMediaHeight = media_height;
@@ -293,7 +293,12 @@ viewer_media_t LLViewerMedia::updateMediaImpl(LLMediaEntry* media_entry, const s
{
// Try to find media with the same media ID
viewer_media_t media_impl = getMediaImplFromTextureID(media_entry->getMediaID());
-
+
+ lldebugs << "called, current URL is \"" << media_entry->getCurrentURL()
+ << "\", previous URL is \"" << previous_url
+ << "\", update_from_self is " << (update_from_self?"true":"false")
+ << llendl;
+
bool was_loaded = false;
bool needs_navigate = false;
@@ -314,21 +319,32 @@ viewer_media_t LLViewerMedia::updateMediaImpl(LLMediaEntry* media_entry, const s
media_impl->mMediaSource->setSize(media_entry->getWidthPixels(), media_entry->getHeightPixels());
}
+ bool url_changed = (media_entry->getCurrentURL() != previous_url);
if(media_entry->getCurrentURL().empty())
{
- // The current media URL is now empty. Unload the media source.
- media_impl->unload();
+ if(url_changed)
+ {
+ // The current media URL is now empty. Unload the media source.
+ media_impl->unload();
+
+ lldebugs << "Unloading media instance (new current URL is empty)." << llendl;
+ }
}
else
{
// The current media URL is not empty.
// If (the media was already loaded OR the media was set to autoplay) AND this update didn't come from this agent,
// do a navigate.
+ bool auto_play = (media_entry->getAutoPlay() && gSavedSettings.getBOOL(AUTO_PLAY_MEDIA_SETTING));
- if((was_loaded || (media_entry->getAutoPlay() && gSavedSettings.getBOOL(AUTO_PLAY_MEDIA_SETTING))) && !update_from_self)
+ if((was_loaded || auto_play) && !update_from_self)
{
- needs_navigate = (media_entry->getCurrentURL() != previous_url);
+ needs_navigate = url_changed;
}
+
+ lldebugs << "was_loaded is " << (was_loaded?"true":"false")
+ << ", auto_play is " << (auto_play?"true":"false")
+ << ", needs_navigate is " << (needs_navigate?"true":"false") << llendl;
}
}
else
@@ -354,6 +370,7 @@ viewer_media_t LLViewerMedia::updateMediaImpl(LLMediaEntry* media_entry, const s
if(needs_navigate)
{
media_impl->navigateTo(url, "", true, true);
+ lldebugs << "navigating to URL " << url << llendl;
}
else if(!media_impl->mMediaURL.empty() && (media_impl->mMediaURL != url))
{
@@ -362,6 +379,8 @@ viewer_media_t LLViewerMedia::updateMediaImpl(LLMediaEntry* media_entry, const s
// If this causes a navigate at some point (such as after a reload), it should be considered server-driven so it isn't broadcast.
media_impl->mNavigateServerRequest = true;
+
+ lldebugs << "updating URL in the media impl to " << url << llendl;
}
}
@@ -1092,15 +1111,7 @@ void LLViewerMediaImpl::stop()
{
if(mMediaSource)
{
- if(mMediaSource->pluginSupportsMediaBrowser())
- {
- mMediaSource->browse_stop();
- }
- else
- {
- mMediaSource->stop();
- }
-
+ mMediaSource->stop();
// destroyMediaSource();
}
}
@@ -1133,6 +1144,40 @@ void LLViewerMediaImpl::seek(F32 time)
}
//////////////////////////////////////////////////////////////////////////////////////////
+void LLViewerMediaImpl::skipBack(F32 step_scale)
+{
+ if(mMediaSource)
+ {
+ if(mMediaSource->pluginSupportsMediaTime())
+ {
+ F64 back_step = mMediaSource->getCurrentTime() - (mMediaSource->getDuration()*step_scale);
+ if(back_step < 0.0)
+ {
+ back_step = 0.0;
+ }
+ mMediaSource->seek(back_step);
+ }
+ }
+}
+
+//////////////////////////////////////////////////////////////////////////////////////////
+void LLViewerMediaImpl::skipForward(F32 step_scale)
+{
+ if(mMediaSource)
+ {
+ if(mMediaSource->pluginSupportsMediaTime())
+ {
+ F64 forward_step = mMediaSource->getCurrentTime() + (mMediaSource->getDuration()*step_scale);
+ if(forward_step > mMediaSource->getDuration())
+ {
+ forward_step = mMediaSource->getDuration();
+ }
+ mMediaSource->seek(forward_step);
+ }
+ }
+}
+
+//////////////////////////////////////////////////////////////////////////////////////////
void LLViewerMediaImpl::setVolume(F32 volume)
{
mRequestedVolume = volume;
@@ -1339,21 +1384,7 @@ void LLViewerMediaImpl::navigateBack()
{
if (mMediaSource)
{
- if(mMediaSource->pluginSupportsMediaTime())
- {
- F64 step_scale = 0.02; // temp , can be changed
- F64 back_step = mMediaSource->getCurrentTime() - (mMediaSource->getDuration()*step_scale);
- if(back_step < 0.0)
- {
- back_step = 0.0;
- }
- mMediaSource->seek(back_step);
- //mMediaSource->start(-2.0);
- }
- else
- {
- mMediaSource->browse_back();
- }
+ mMediaSource->browse_back();
}
}
@@ -1362,21 +1393,7 @@ void LLViewerMediaImpl::navigateForward()
{
if (mMediaSource)
{
- if(mMediaSource->pluginSupportsMediaTime())
- {
- F64 step_scale = 0.02; // temp , can be changed
- F64 forward_step = mMediaSource->getCurrentTime() + (mMediaSource->getDuration()*step_scale);
- if(forward_step > mMediaSource->getDuration())
- {
- forward_step = mMediaSource->getDuration();
- }
- mMediaSource->seek(forward_step);
- //mMediaSource->start(2.0);
- }
- else
- {
- mMediaSource->browse_forward();
- }
+ mMediaSource->browse_forward();
}
}
@@ -1525,7 +1542,6 @@ void LLViewerMediaImpl::navigateStop()
{
mMediaSource->browse_stop();
}
-
}
//////////////////////////////////////////////////////////////////////////////////////////
diff --git a/indra/newview/llviewermedia.h b/indra/newview/llviewermedia.h
index f4afce6c4c..ac12112ed4 100644
--- a/indra/newview/llviewermedia.h
+++ b/indra/newview/llviewermedia.h
@@ -149,6 +149,8 @@ public:
void pause();
void start();
void seek(F32 time);
+ void skipBack(F32 step_scale);
+ void skipForward(F32 step_scale);
void setVolume(F32 volume);
void updateVolume();
F32 getVolume();
diff --git a/indra/newview/llviewermediafocus.cpp b/indra/newview/llviewermediafocus.cpp
index 70a7d835a3..fd74c9c2fc 100644
--- a/indra/newview/llviewermediafocus.cpp
+++ b/indra/newview/llviewermediafocus.cpp
@@ -120,10 +120,20 @@ void LLViewerMediaFocus::setFocusFace(LLPointer<LLViewerObject> objectp, S32 fac
// We must do this before processing the media HUD zoom, or it may zoom to the wrong face.
update();
- if(mMediaControls.get() && face_auto_zoom && ! parcel->getMediaPreventCameraZoom())
+ if(mMediaControls.get())
{
- mMediaControls.get()->resetZoomLevel();
- mMediaControls.get()->nextZoomLevel();
+ if(face_auto_zoom && ! parcel->getMediaPreventCameraZoom())
+ {
+ // Zoom in on this face
+ mMediaControls.get()->resetZoomLevel();
+ mMediaControls.get()->nextZoomLevel();
+ }
+ else
+ {
+ // Reset the controls' zoom level without moving the camera.
+ // This fixes the case where clicking focus between two non-autozoom faces doesn't change the zoom-out button back to a zoom-in button.
+ mMediaControls.get()->resetZoomLevel(false);
+ }
}
}
else
@@ -132,7 +142,8 @@ void LLViewerMediaFocus::setFocusFace(LLPointer<LLViewerObject> objectp, S32 fac
{
if(mMediaControls.get())
{
- mMediaControls.get()->resetZoomLevel();
+ // Don't reset camera zoom by default, just tell the controls they're no longer controlling zoom.
+ mMediaControls.get()->resetZoomLevel(false);
}
}
@@ -292,6 +303,15 @@ BOOL LLViewerMediaFocus::handleKey(KEY key, MASK mask, BOOL called_from_parent)
if (key == KEY_ESCAPE)
{
+ // Reset camera zoom in this case.
+ if(mFocusedImplID.notNull())
+ {
+ if(mMediaControls.get())
+ {
+ mMediaControls.get()->resetZoomLevel(true);
+ }
+ }
+
clearFocus();
}
}
diff --git a/indra/newview/llviewermenu.cpp b/indra/newview/llviewermenu.cpp
index 6a6aa1061d..625b816125 100644
--- a/indra/newview/llviewermenu.cpp
+++ b/indra/newview/llviewermenu.cpp
@@ -2733,15 +2733,26 @@ bool enable_object_edit()
// there. Eventually this needs to be replaced with code that only
// lets you edit objects if you have permission to do so (edit perms,
// group edit, god). See also lltoolbar.cpp. JC
- bool enable = true;
+ bool enable = false;
if (gAgent.inPrelude())
{
enable = LLViewerParcelMgr::getInstance()->agentCanBuild()
|| LLSelectMgr::getInstance()->getSelection()->isAttachment();
+ }
+ else if (LLSelectMgr::getInstance()->selectGetModify())
+ {
+ enable = true;
}
+
return enable;
}
+// mutually exclusive - show either edit option or build in menu
+bool enable_object_build()
+{
+ return !enable_object_edit();
+}
+
class LLSelfRemoveAllAttachments : public view_listener_t
{
bool handleEvent(const LLSD& userdata)
@@ -5667,6 +5678,16 @@ class LLFloaterVisible : public view_listener_t
}
};
+class LLShowSidetrayPanel : public view_listener_t
+{
+ bool handleEvent(const LLSD& userdata)
+ {
+ std::string panel_name = userdata.asString();
+ LLSideTray::getInstance()->showPanel(panel_name, LLSD());
+ return true;
+ }
+};
+
bool callback_show_url(const LLSD& notification, const LLSD& response)
{
S32 option = LLNotification::getSelectedOption(notification, response);
@@ -8023,9 +8044,12 @@ void initialize_menus()
visible.add("VisiblePayObject", boost::bind(&enable_pay_object));
enable.add("EnablePayAvatar", boost::bind(&enable_pay_avatar));
enable.add("EnableEdit", boost::bind(&enable_object_edit));
+ visible.add("VisibleBuild", boost::bind(&enable_object_build));
+ visible.add("VisibleEdit", boost::bind(&enable_object_edit));
visible.add("Object.VisibleEdit", boost::bind(&enable_object_edit));
view_listener_t::addMenu(new LLFloaterVisible(), "FloaterVisible");
+ view_listener_t::addMenu(new LLShowSidetrayPanel(), "ShowSidetrayPanel");
view_listener_t::addMenu(new LLSomethingSelected(), "SomethingSelected");
view_listener_t::addMenu(new LLSomethingSelectedNoHUD(), "SomethingSelectedNoHUD");
view_listener_t::addMenu(new LLEditableSelected(), "EditableSelected");
diff --git a/indra/newview/llviewermessage.cpp b/indra/newview/llviewermessage.cpp
index 8db6d5917a..4d7d3ee8ac 100644
--- a/indra/newview/llviewermessage.cpp
+++ b/indra/newview/llviewermessage.cpp
@@ -101,6 +101,7 @@
#include "llpanelgrouplandmoney.h"
#include "llpanelplaces.h"
#include "llrecentpeople.h"
+#include "llscriptfloater.h"
#include "llselectmgr.h"
#include "llsidetray.h"
#include "llstartup.h"
@@ -5380,6 +5381,17 @@ void process_script_dialog(LLMessageSystem* msg, void**)
notification = LLNotifications::instance().add(
LLNotification::Params("ScriptDialogGroup").substitutions(args).payload(payload).form_elements(form.asLLSD()));
}
+
+ // "ScriptDialog" and "ScriptDialogGroup" are handles by LLScriptFloaterManager.
+ // We want to inform user that there is a script floater, lets add "ScriptToast"
+ LLNotification::Params p("ScriptToast");
+ p.substitutions(args).payload(payload).functor.function(boost::bind(
+ LLScriptFloaterManager::onToastButtonClick, _1, _2));
+
+ notification = LLNotifications::instance().add(p);
+
+ LLScriptFloaterManager::getInstance()->setNotificationToastId(
+ object_id, notification->getID());
}
//---------------------------------------------------------------------------
diff --git a/indra/newview/llviewerparcelmedia.cpp b/indra/newview/llviewerparcelmedia.cpp
index 7559fd8e72..f61dbb1b39 100644
--- a/indra/newview/llviewerparcelmedia.cpp
+++ b/indra/newview/llviewerparcelmedia.cpp
@@ -218,7 +218,7 @@ void LLViewerParcelMedia::play(LLParcel* parcel)
LL_DEBUGS("Media") << "new media impl with mime type " << mime_type << ", url " << media_url << LL_ENDL;
// Delete the old one first so they don't fight over the texture.
- sMediaImpl->stop();
+ sMediaImpl = NULL;
sMediaImpl = LLViewerMedia::newMediaImpl(
placeholder_texture_id,
@@ -261,8 +261,7 @@ void LLViewerParcelMedia::stop()
// We need to remove the media HUD if it is up.
LLViewerMediaFocus::getInstance()->clearFocus();
- // This will kill the media instance.
- sMediaImpl->stop();
+ // This will unload & kill the media instance.
sMediaImpl = NULL;
}
diff --git a/indra/newview/llviewerwindow.cpp b/indra/newview/llviewerwindow.cpp
index db66faef81..3840f337d4 100644
--- a/indra/newview/llviewerwindow.cpp
+++ b/indra/newview/llviewerwindow.cpp
@@ -1347,6 +1347,7 @@ LLViewerWindow::LLViewerWindow(
mDebugText = new LLDebugText(this);
+ mWorldViewRectScaled = calcScaledRect(mWorldViewRectRaw, mDisplayScale);
}
void LLViewerWindow::initGLDefaults()
@@ -2867,19 +2868,17 @@ void LLViewerWindow::updateWorldViewRect(bool use_full_window)
if (mWorldViewRectRaw != new_world_rect)
{
- // sending a signal with a new WorldView rect
- mOnWorldViewRectUpdated(mWorldViewRectRaw, new_world_rect);
-
+ LLRect old_world_rect = mWorldViewRectRaw;
mWorldViewRectRaw = new_world_rect;
gResizeScreenTexture = TRUE;
LLViewerCamera::getInstance()->setViewHeightInPixels( mWorldViewRectRaw.getHeight() );
LLViewerCamera::getInstance()->setAspect( getWorldViewAspectRatio() );
- mWorldViewRectScaled = mWorldViewRectRaw;
- mWorldViewRectScaled.mLeft = llround((F32)mWorldViewRectScaled.mLeft / mDisplayScale.mV[VX]);
- mWorldViewRectScaled.mRight = llround((F32)mWorldViewRectScaled.mRight / mDisplayScale.mV[VX]);
- mWorldViewRectScaled.mBottom = llround((F32)mWorldViewRectScaled.mBottom / mDisplayScale.mV[VY]);
- mWorldViewRectScaled.mTop = llround((F32)mWorldViewRectScaled.mTop / mDisplayScale.mV[VY]);
+ mWorldViewRectScaled = calcScaledRect(mWorldViewRectRaw, mDisplayScale);
+
+ // sending a signal with a new WorldView rect
+ old_world_rect = calcScaledRect(old_world_rect, mDisplayScale);
+ mOnWorldViewRectUpdated(old_world_rect, mWorldViewRectScaled);
}
}
@@ -4794,6 +4793,18 @@ void LLViewerWindow::calcDisplayScale()
}
}
+//static
+LLRect LLViewerWindow::calcScaledRect(const LLRect & rect, const LLVector2& display_scale)
+{
+ LLRect res = rect;
+ res.mLeft = llround((F32)res.mLeft / display_scale.mV[VX]);
+ res.mRight = llround((F32)res.mRight / display_scale.mV[VX]);
+ res.mBottom = llround((F32)res.mBottom / display_scale.mV[VY]);
+ res.mTop = llround((F32)res.mTop / display_scale.mV[VY]);
+
+ return res;
+}
+
S32 LLViewerWindow::getChatConsoleBottomPad()
{
S32 offset = 0;
diff --git a/indra/newview/llviewerwindow.h b/indra/newview/llviewerwindow.h
index 517993182b..747fd3b253 100644
--- a/indra/newview/llviewerwindow.h
+++ b/indra/newview/llviewerwindow.h
@@ -391,6 +391,7 @@ public:
F32 getWorldViewAspectRatio() const;
const LLVector2& getDisplayScale() const { return mDisplayScale; }
void calcDisplayScale();
+ static LLRect calcScaledRect(const LLRect & rect, const LLVector2& display_scale);
private:
bool shouldShowToolTipFor(LLMouseHandler *mh);
diff --git a/indra/newview/llvoiceclient.cpp b/indra/newview/llvoiceclient.cpp
index 5fedfc943b..479cf5a04d 100644
--- a/indra/newview/llvoiceclient.cpp
+++ b/indra/newview/llvoiceclient.cpp
@@ -1867,7 +1867,7 @@ void LLVoiceClient::stateMachine()
}
else
{
- LL_WARNS("Voice") << "region doesn't have ProvisionVoiceAccountRequest capability!" << LL_ENDL;
+ LL_WARNS_ONCE("Voice") << "region doesn't have ProvisionVoiceAccountRequest capability!" << LL_ENDL;
}
}
}
diff --git a/indra/newview/llvovolume.cpp b/indra/newview/llvovolume.cpp
index 5a67e64bbd..428af5380c 100644
--- a/indra/newview/llvovolume.cpp
+++ b/indra/newview/llvovolume.cpp
@@ -1734,9 +1734,9 @@ void LLVOVolume::syncMediaData(S32 texture_index, const LLSD &media_data, bool m
}
LLTextureEntry *te = getTE(texture_index);
- //llinfos << "BEFORE: texture_index = " << texture_index
- // << " hasMedia = " << te->hasMedia() << " : "
- // << ((NULL == te->getMediaData()) ? "NULL MEDIA DATA" : ll_pretty_print_sd(te->getMediaData()->asLLSD())) << llendl;
+ LL_DEBUGS("MediaOnAPrim") << "BEFORE: texture_index = " << texture_index
+ << " hasMedia = " << te->hasMedia() << " : "
+ << ((NULL == te->getMediaData()) ? "NULL MEDIA DATA" : ll_pretty_print_sd(te->getMediaData()->asLLSD())) << llendl;
std::string previous_url;
LLMediaEntry* mep = te->getMediaData();
@@ -1776,9 +1776,9 @@ void LLVOVolume::syncMediaData(S32 texture_index, const LLSD &media_data, bool m
removeMediaImpl(texture_index);
}
- //llinfos << "AFTER: texture_index = " << texture_index
- // << " hasMedia = " << te->hasMedia() << " : "
- // << ((NULL == te->getMediaData()) ? "NULL MEDIA DATA" : ll_pretty_print_sd(te->getMediaData()->asLLSD())) << llendl;
+ LL_DEBUGS("MediaOnAPrim") << "AFTER: texture_index = " << texture_index
+ << " hasMedia = " << te->hasMedia() << " : "
+ << ((NULL == te->getMediaData()) ? "NULL MEDIA DATA" : ll_pretty_print_sd(te->getMediaData()->asLLSD())) << llendl;
}
void LLVOVolume::mediaNavigateBounceBack(U8 texture_index)
@@ -1801,7 +1801,7 @@ void LLVOVolume::mediaNavigateBounceBack(U8 texture_index)
}
if (! url.empty())
{
- LL_INFOS("LLMediaDataClient") << "bouncing back to URL: " << url << LL_ENDL;
+ LL_INFOS("MediaOnAPrim") << "bouncing back to URL: " << url << LL_ENDL;
impl->navigateTo(url, "", false, true);
}
}
diff --git a/indra/newview/skins/default/textures/textures.xml b/indra/newview/skins/default/textures/textures.xml
index f4a239be62..6678918db8 100644
--- a/indra/newview/skins/default/textures/textures.xml
+++ b/indra/newview/skins/default/textures/textures.xml
@@ -161,7 +161,7 @@ with the same filename but different name
<texture name="Generic_Group" file_name="icons/Generic_Group.png" preload="false" />
<texture name="Generic_Group_Large" file_name="icons/Generic_Group_Large.png" preload="false" />
<texture name="Generic_Object_Medium" file_name="icons/Generic_Object_Medium.png" preload="false" />
- <texture name="Generic_Object_Small" file_name="icons/ Generic_Object_Small.png" preload="false" />
+ <texture name="Generic_Object_Small" file_name="icons/Generic_Object_Small.png" preload="false" />
<texture name="Generic_Object_Large" file_name="icons/Generic_Object_Large.png" preload="false" />
<texture name="Generic_Person" file_name="icons/Generic_Person.png" preload="false" />
<texture name="Generic_Person_Large" file_name="icons/Generic_Person_Large.png" preload="false" />
diff --git a/indra/newview/skins/default/xui/de/floater_media_browser.xml b/indra/newview/skins/default/xui/de/floater_media_browser.xml
index 1c580aa916..89cce0f6dc 100644
--- a/indra/newview/skins/default/xui/de/floater_media_browser.xml
+++ b/indra/newview/skins/default/xui/de/floater_media_browser.xml
@@ -1,10 +1,10 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="floater_about" title="MEDIENBROWSER">
<floater.string name="home_page_url">
- http://www.secondlife.com
+ http://de.secondlife.com
</floater.string>
<floater.string name="support_page_url">
- http://support.secondlife.com
+ http://de.secondlife.com/support
</floater.string>
<layout_stack name="stack1">
<layout_panel name="nav_controls">
diff --git a/indra/newview/skins/default/xui/de/menu_viewer.xml b/indra/newview/skins/default/xui/de/menu_viewer.xml
index 62cd982875..317b525062 100644
--- a/indra/newview/skins/default/xui/de/menu_viewer.xml
+++ b/indra/newview/skins/default/xui/de/menu_viewer.xml
@@ -1,5 +1,11 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<menu_bar name="Main Menu">
+ <menu name="Me">
+ <menu_item_call label="Einstellungen" name="Preferences"/>
+ <menu_item_call name="Manage My Account">
+ <menu_item_call.on_click name="ManageMyAccount_url" parameter="WebLaunchJoinNow,http://secondlife.com/account/index.php?lang=de" />
+ </menu_item_call>
+ </menu>
<menu label="Datei" name="File">
<tearoff_menu label="~~~~~~~~~~~" name="~~~~~~~~~~~"/>
<menu label="Hochladen" name="upload">
diff --git a/indra/newview/skins/default/xui/de/notifications.xml b/indra/newview/skins/default/xui/de/notifications.xml
index 7e3a6aaa93..8b8a0afa89 100644
--- a/indra/newview/skins/default/xui/de/notifications.xml
+++ b/indra/newview/skins/default/xui/de/notifications.xml
@@ -317,7 +317,7 @@ Gebühren werden nicht rückerstattet.
<notification name="PromptGoToEventsPage">
Zur [SECOND_LIFE] Events-Webseite?
<url name="url">
- http://de.secondlife.com/events/
+ http://secondlife.com/events/?lang=de-DE
</url>
<usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/>
</notification>
@@ -498,7 +498,7 @@ Verschieben Sie alle betreffenden Objekte in dieselbe Region.
[_URL] für Informationen zum Kauf von L$ öffnen?
<url name="url">
- http://de.secondlife.com/app/currency/
+ http://secondlife.com/app/currency/?lang=de-DE
</url>
<usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/>
</notification>
@@ -1055,7 +1055,7 @@ Sie können [SECOND_LIFE] normal verwenden. Andere Benutzer können Sie korrekt
Die Installation von [APP_NAME] ist abgeschlossen.
Wenn Sie [SECOND_LIFE] das erste Mal verwenden, müssen Sie ein Konto anlegen, bevor Sie sich anmelden können.
-Möchten Sie auf www.secondlife.com ein Konto erstellen?
+Möchten Sie auf [https://join.secondlife.com/index.php?lang=de-DE secondlife.com] ein Konto erstellen?
<usetemplate name="okcancelbuttons" notext="Weiter" yestext="Neues Konto..."/>
</notification>
<notification name="LoginPacketNeverReceived">
@@ -1452,7 +1452,7 @@ Bitte vergewissern Sie sich, dass Sie den aktuellsten Viewer installiert haben u
Möchten Sie unsere Knowledgebase besuchen, um mehr Informationen über Altereinstufung zu erhalten?
<url name="url">
- http://wiki.secondlife.com/wiki/Alterseinstufung:_Ein_%C3%9Cberblick_(KB)
+ http://wiki.secondlife.com/wiki/Linden_Lab_Official:Maturity_ratings:_an_overview/de
</url>
<usetemplate ignoretext="Ich kann diese Region aufgrund der Alterseinstufung nicht betreten" name="okcancelignore" notext="Schließen" yestext="Zur Knowledgbase"/>
</notification>
@@ -1480,7 +1480,7 @@ Bitte vergewissern Sie sich, dass Sie den aktuellsten Viewer installiert haben u
Möchten Sie unsere Knowledgebase besuchen, um mehr Informationen über Altereinstufung zu erhalten?
<url name="url">
- http://wiki.secondlife.com/wiki/Alterseinstufung:_Ein_%C3%9Cberblick_(KB)
+ http://wiki.secondlife.com/wiki/Linden_Lab_Official:Maturity_ratings:_an_overview/de
</url>
<usetemplate ignoretext="Ich habe aufgrund der Alterseinstufung keinen Anspruch auf dieses Land" name="okcancelignore" notext="Schließen" yestext="Zur Knowledgbase"/>
</notification>
@@ -1504,7 +1504,7 @@ Bitte vergewissern Sie sich, dass Sie den aktuellsten Viewer installiert haben u
Möchten Sie unsere Knowledgebase besuchen, um mehr Informationen über Altereinstufung zu erhalten?
<url name="url">
- http://wiki.secondlife.com/wiki/Alterseinstufung:_Ein_%C3%9Cberblick_(KB)
+ http://wiki.secondlife.com/wiki/Linden_Lab_Official:Maturity_ratings:_an_overview/de
</url>
<usetemplate ignoretext="Ich kann aufgrund der Alterseinstufung dieses Land nicht kaufen" name="okcancelignore" notext="Schließen" yestext="Zur Knowledgbase"/>
</notification>
@@ -1690,10 +1690,7 @@ Inventarobjekt(e) verschieben?
<usetemplate ignoretext="Bestätigen, bevor Sitzung beendet wird" name="okcancelignore" notext="Nicht beenden" yestext="Beenden"/>
</notification>
<notification name="HelpReportAbuseEmailLL">
- Verwenden Sie dieses Tool, um Verletzungen der Servicebedingungen und Community-Standards zu melden. Siehe:
-
-http://secondlife.com/corporate/tos.php
-http://secondlife.com/corporate/cs.php
+ Verwenden Sie dieses Tool, um Verletzungen der [http://secondlife.com/corporate/tos.php?lang=de-DE Servicebedingungen] und [http://secondlife.com/corporate/cs.php?lang=de-DE Community-Standards] zu melden.
Alle gemeldeten Verletzungen der Servicebedingungen und Community-Standards werden geprüft und geklärt Sie können den Prozess im Incident Report (Vorfallsbericht) verfolgen:
diff --git a/indra/newview/skins/default/xui/de/panel_login.xml b/indra/newview/skins/default/xui/de/panel_login.xml
index 9a15795cbe..534bcfc82b 100644
--- a/indra/newview/skins/default/xui/de/panel_login.xml
+++ b/indra/newview/skins/default/xui/de/panel_login.xml
@@ -4,7 +4,7 @@
http://de.secondlife.com/registration/
</panel.string>
<panel.string name="forgot_password_url">
- http://secondlife.com/account/request.php
+ http://secondlife.com/account/request.php?lang=de
</panel.string>
<panel name="login_widgets">
<line_editor name="first_name_edit" tool_tip="[SECOND_LIFE] Vorname"/>
diff --git a/indra/newview/skins/default/xui/de/panel_profile.xml b/indra/newview/skins/default/xui/de/panel_profile.xml
index b5fb2329c5..c3274acaae 100644
--- a/indra/newview/skins/default/xui/de/panel_profile.xml
+++ b/indra/newview/skins/default/xui/de/panel_profile.xml
@@ -1,11 +1,15 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel label="Profil" name="panel_profile">
<string name="CaptionTextAcctInfo">
- [ACCTTYPE] [PAYMENTINFO] [AGEVERIFICATION]
+ [ACCTTYPE]
+[PAYMENTINFO] [AGEVERIFICATION]
</string>
<string name="payment_update_link_url">
http://www.secondlife.com/account/billing.php?lang=de-DE
</string>
+ <string name="partner_edit_link_url">
+ http://www.secondlife.com/account/partners.php?lang=de
+ </string>
<string name="my_account_link_url" value="http://secondlife.com/my/account/index.php?lang=de-DE"/>
<string name="no_partner_text" value="Keiner"/>
<scroll_container name="profile_scroll">
diff --git a/indra/newview/skins/default/xui/de/strings.xml b/indra/newview/skins/default/xui/de/strings.xml
index 9a0f5021d8..86eb8b1479 100644
--- a/indra/newview/skins/default/xui/de/strings.xml
+++ b/indra/newview/skins/default/xui/de/strings.xml
@@ -4,6 +4,7 @@
For example, the strings used in avatar chat bubbles, and strings
that are returned from one component and may appear in many places-->
<strings>
+ <string name="create_account_url">http://join.secondlife.com/index.php?lang=de-DE</string>
<string name="SECOND_LIFE">
Second Life
</string>
@@ -158,7 +159,7 @@
Anklicken, um Befehl secondlife:// auszuführen
</string>
<string name="BUTTON_CLOSE_DARWIN">
- Schließen (⌘-W)
+ Schließen (&#8984;W)
</string>
<string name="BUTTON_CLOSE_WIN">
Schließen (Strg+W)
@@ -1311,16 +1312,16 @@ Gültige Formate: .wav, .tga, .bmp, .jpg, .jpeg oder .bvh
Landmarke bearbeiten...
</string>
<string name="accel-mac-control">
- ⌃
+ &#8963;
</string>
<string name="accel-mac-command">
- ⌘
+ &#8984;
</string>
<string name="accel-mac-option">
- ⌥
+ &#8997;
</string>
<string name="accel-mac-shift">
- ⇧
+ &#8679;
</string>
<string name="accel-win-control">
Strg+
diff --git a/indra/newview/skins/default/xui/en/floater_avatar_picker.xml b/indra/newview/skins/default/xui/en/floater_avatar_picker.xml
index 3a1499eaaa..953bd08dd4 100644
--- a/indra/newview/skins/default/xui/en/floater_avatar_picker.xml
+++ b/indra/newview/skins/default/xui/en/floater_avatar_picker.xml
@@ -26,6 +26,12 @@
name="searching">
Searching...
</floater.string>
+ <!-- For multiple person selection, use "Select" and "Close"
+ instead of "OK" and "Cancel" because "Cancel" still keeps the ones
+ you have already selected. The code will show the appropriate
+ set of buttons. -->
+ <string name="Select">Select</string>
+ <string name="Close">Close</string>
<tab_container
follows="all"
height="300"
@@ -205,7 +211,7 @@
height="23"
label="OK"
label_selected="OK"
- name="Select"
+ name="ok_btn"
top_pad="3"
left="46"
width="100" />
@@ -214,7 +220,7 @@
height="23"
label="Cancel"
label_selected="Cancel"
- name="Cancel"
+ name="cancel_btn"
width="100"
left_pad="5" />
</floater>
diff --git a/indra/newview/skins/default/xui/en/floater_buy_contents.xml b/indra/newview/skins/default/xui/en/floater_buy_contents.xml
index 833e8beb8d..77a0e9b91b 100644
--- a/indra/newview/skins/default/xui/en/floater_buy_contents.xml
+++ b/indra/newview/skins/default/xui/en/floater_buy_contents.xml
@@ -56,7 +56,7 @@
<text
type="string"
length="1"
- follows="left|top"
+ follows="left|bottom"
font="SansSerif"
height="16"
layout="topleft"
@@ -68,7 +68,7 @@
Buy for L$[AMOUNT] from [NAME]?
</text>
<check_box
- follows="left|top"
+ follows="left|bottom"
height="16"
label="Wear clothing now"
layout="topleft"
diff --git a/indra/newview/skins/default/xui/en/floater_im_container.xml b/indra/newview/skins/default/xui/en/floater_im_container.xml
new file mode 100644
index 0000000000..cf6a4e45bd
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/floater_im_container.xml
@@ -0,0 +1,36 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<multi_floater
+background_visible="true"
+bg_color="yellow"
+ can_resize="true"
+ height="390"
+ layout="topleft"
+ name="floater_im_box"
+ help_topic="floater_im_box"
+ save_rect="true"
+ save_visibility="true"
+ single_instance="true"
+ title="Instant Messages"
+ width="392">
+ <tab_container
+ follows="left|right|top|bottom"
+ height="390"
+ layout="topleft"
+ left="1"
+ name="im_box_tab_container"
+ tab_position="bottom"
+ tab_width="80"
+ top="0"
+ width="390" />
+ <icon
+ color="DefaultShadowLight"
+ enabled="false"
+ follows="left|right|bottom"
+ height="17"
+ image_name="tabarea.tga"
+ layout="bottomleft"
+ left="1"
+ name="im_box_tab_container_icon"
+ bottom="10"
+ width="390" />
+</multi_floater>
diff --git a/indra/newview/skins/default/xui/en/floater_im_session.xml b/indra/newview/skins/default/xui/en/floater_im_session.xml
index 01713cc003..645c2973d8 100644
--- a/indra/newview/skins/default/xui/en/floater_im_session.xml
+++ b/indra/newview/skins/default/xui/en/floater_im_session.xml
@@ -9,7 +9,7 @@
name="panel_im"
top="0"
can_close="true"
- can_dock="true"
+ can_dock="false"
can_minimize="false"
visible="true"
width="300"
@@ -18,7 +18,7 @@
min_height="350">
<layout_stack
follows="all"
- height="350"
+ height="320"
width="300"
layout="topleft"
orientation="horizontal"
@@ -35,7 +35,8 @@
<layout_panel
left="0"
top="0"
- width="180"
+ height="200"
+ width="185"
user_resize="false">
<button
height="20"
@@ -55,10 +56,9 @@
width="25"
name="slide_right_btn" />
<chat_history
- length="1"
font="SansSerifSmall"
- follows="left|right|top"
- height="280"
+ follows="left|right|top|bottom"
+ height="150"
name="chat_history"
parse_highlights="true"
allow_html="true"
@@ -66,12 +66,13 @@
width="180">
</chat_history>
<line_editor
- follows="left|right|top"
+ bottom="0"
+ follows="left|right|bottom"
font="SansSerifSmall"
height="20"
label="To"
+ layout="bottomleft"
name="chat_editor"
- top_pad="1"
width="180">
</line_editor>
</layout_panel>
diff --git a/indra/newview/skins/default/xui/en/floater_region_info.xml b/indra/newview/skins/default/xui/en/floater_region_info.xml
index 9bb30f8e86..262bcd07a0 100644
--- a/indra/newview/skins/default/xui/en/floater_region_info.xml
+++ b/indra/newview/skins/default/xui/en/floater_region_info.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<floater
legacy_header_height="18"
- height="512"
+ height="555"
help_topic="regioninfo"
layout="topleft"
name="regioninfo"
@@ -9,7 +9,7 @@
title="REGION/ESTATE"
width="480">
<tab_container
- bottom="512"
+ bottom="555"
follows="left|right|top|bottom"
layout="topleft"
left="1"
diff --git a/indra/newview/skins/default/xui/en/floater_report_abuse.xml b/indra/newview/skins/default/xui/en/floater_report_abuse.xml
index 696233676c..91ca3ef27a 100644
--- a/indra/newview/skins/default/xui/en/floater_report_abuse.xml
+++ b/indra/newview/skins/default/xui/en/floater_report_abuse.xml
@@ -18,7 +18,7 @@
height="150"
layout="topleft"
left="60"
- name=""
+ name="screenshot"
top="15"
width="220" />
<check_box
diff --git a/indra/newview/skins/default/xui/en/floater_script.xml b/indra/newview/skins/default/xui/en/floater_script.xml
new file mode 100644
index 0000000000..f44ba6d873
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/floater_script.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<floater
+ legacy_header_height="18"
+ background_visible="true"
+ follows="left|top|right|bottom"
+ height="369"
+ layout="topleft"
+ left="0"
+ name="script_floater"
+ help_topic="script_floater"
+ top="0"
+ can_dock="true"
+ can_minimize="true"
+ visible="true"
+ width="520"
+ can_resize="true"
+ min_width="350"
+ min_height="369">
+</floater>
diff --git a/indra/newview/skins/default/xui/en/floater_tools.xml b/indra/newview/skins/default/xui/en/floater_tools.xml
index a626e1b353..8b6f0f03fe 100644
--- a/indra/newview/skins/default/xui/en/floater_tools.xml
+++ b/indra/newview/skins/default/xui/en/floater_tools.xml
@@ -968,23 +968,27 @@
<combo_box.item
label="Touch (default)"
name="Touch/grab(default)"
- value="Touch/grab (default)" />
+ value="Touch" />
<combo_box.item
label="Sit on object"
name="Sitonobject"
- value="Sit on object" />
+ value="Sit" />
<combo_box.item
label="Buy object"
name="Buyobject"
- value="Buy object" />
+ value="Buy" />
<combo_box.item
label="Pay object"
name="Payobject"
- value="Pay object" />
+ value="Pay" />
<combo_box.item
label="Open"
name="Open"
value="Open" />
+ <combo_box.item
+ label="Zoom"
+ name="Zoom"
+ value="Zoom" />
</combo_box>
<check_box
height="16"
diff --git a/indra/newview/skins/default/xui/en/menu_viewer.xml b/indra/newview/skins/default/xui/en/menu_viewer.xml
index 8ab5fb1659..e19e11a1b8 100644
--- a/indra/newview/skins/default/xui/en/menu_viewer.xml
+++ b/indra/newview/skins/default/xui/en/menu_viewer.xml
@@ -59,7 +59,7 @@
label="My Inventory"
layout="topleft"
name="Inventory"
- shortcut="control|I">
+ shortcut="control|shift|I">
<menu_item_check.on_check
function="Floater.Visible"
parameter="inventory" />
@@ -68,6 +68,15 @@
parameter="inventory" />
</menu_item_check>
<menu_item_call
+ label="Show Sidetray Inventory"
+ name="ShowSidetrayInventory"
+ shortcut="control|I"
+ visible="false">
+ <menu_item_call.on_click
+ function="ShowSidetrayPanel"
+ parameter="sidepanel_inventory" />
+ </menu_item_call>
+ <menu_item_call
label="My Gestures"
layout="topleft"
name="Gestures"
diff --git a/indra/newview/skins/default/xui/en/notifications.xml b/indra/newview/skins/default/xui/en/notifications.xml
index f1bca887a4..9d1bcb8f60 100644
--- a/indra/newview/skins/default/xui/en/notifications.xml
+++ b/indra/newview/skins/default/xui/en/notifications.xml
@@ -722,7 +722,7 @@ You need an account to enter [SECOND_LIFE]. Would you like to create one now?
icon="alertmodal.tga"
name="AddClassified"
type="alertmodal">
-Classified ads appear in the &apos;Classified&apos; section of the Search directory and on [http://www.secondlife.com secondlife.com] for one week.
+Classified ads appear in the &apos;Classified&apos; section of the Search directory and on [http://secondlife.com/community/classifieds secondlife.com] for one week.
Fill out your ad, then click &apos;Publish...&apos; to add it to the directory.
You&apos;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.
@@ -1436,6 +1436,13 @@ Select objects with scripts that you have permission to modify.
<notification
icon="alertmodal.tga"
+ name="CannotOpenScriptObjectNoMod"
+ type="alertmodal">
+ Unable to open script in object without modify permissions.
+ </notification>
+
+ <notification
+ icon="alertmodal.tga"
name="CannotSetRunningSelectObjectsNoScripts"
type="alertmodal">
Not able to set any scripts to &apos;running&apos;.
@@ -3261,7 +3268,7 @@ You are not allowed in that region due to your maturity Rating.
Go to the Knowledge Base for more information about maturity Ratings?
<url option="0" name="url">
- https://support.secondlife.com/ics/support/default.asp?deptID=4417&amp;task=knowledge&amp;questionID=6010
+ http://wiki.secondlife.com/wiki/Linden_Lab_Official:Maturity_ratings:_an_overview
</url>
<usetemplate
name="okcancelignore"
@@ -3318,7 +3325,7 @@ You cannot claim this land due to your maturity Rating.
Go to the Knowledge Base for more information about maturity Ratings?
<url option="0" name="url">
- https://support.secondlife.com/ics/support/default.asp?deptID=4417&amp;task=knowledge&amp;questionID=6010
+ http://wiki.secondlife.com/wiki/Linden_Lab_Official:Maturity_ratings:_an_overview
</url>
<usetemplate
name="okcancelignore"
@@ -3368,7 +3375,7 @@ You cannot buy this land due to your maturity Rating.
Go to the Knowledge Base for more information about maturity Ratings?
<url option="0" name="url">
- https://support.secondlife.com/ics/support/default.asp?deptID=4417&amp;task=knowledge&amp;questionID=6010
+ http://wiki.secondlife.com/wiki/Linden_Lab_Official:Maturity_ratings:_an_overview
</url>
<usetemplate
name="okcancelignore"
@@ -3765,7 +3772,7 @@ There are no items in this object that you are allowed to copy.
icon="alertmodal.tga"
name="WebLaunchAccountHistory"
type="alertmodal">
-Go to your [http://secondlife.com/account/ Dashboard] to see your account history?
+Go to your [http://secondlife.com/account/ Dashboard] to see your account history?
<usetemplate
ignoretext="Launch my browser to see my account history"
name="okcancelignore"
@@ -5300,6 +5307,27 @@ Grant this request?
<notification
icon="notify.tga"
+ name="ScriptToast"
+ type="notify">
+ [FIRST] [LAST]&apos;s &apos;[TITLE]&apos; is requesting user input.
+ <form name="form">
+ <button
+ index="0"
+ name="Open"
+ text="Open Dialog"/>
+ <button
+ index="1"
+ name="Ignore"
+ text="Ignore"/>
+ <button
+ index="2"
+ name="Block"
+ text="Block"/>
+ </form>
+ </notification>
+
+ <notification
+ icon="notify.tga"
name="FirstBalanceIncrease"
type="notify">
You just received L$[AMOUNT].
diff --git a/indra/newview/skins/default/xui/en/panel_adhoc_control_panel.xml b/indra/newview/skins/default/xui/en/panel_adhoc_control_panel.xml
index a283cff5b3..368ab17689 100644
--- a/indra/newview/skins/default/xui/en/panel_adhoc_control_panel.xml
+++ b/indra/newview/skins/default/xui/en/panel_adhoc_control_panel.xml
@@ -1,6 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<panel
border="false"
+ follows="all"
height="215"
name="panel_im_control_panel"
width="180">
@@ -23,7 +24,7 @@
bg_alpha_color="DkGray2"
border="false"
bottom="1"
- follows="left|bottom"
+ follows="left|right|bottom"
height="70"
left="0"
left_pad="0"
@@ -32,6 +33,7 @@
width="180">
<button
bottom="10"
+ follows="all"
height="20"
label="Call"
left_delta="40"
@@ -39,6 +41,7 @@
width="100" />
<button
bottom="40"
+ follows="all"
height="20"
label="Leave Call"
name="end_call_btn"
@@ -46,6 +49,7 @@
width="100" />
<button
enabled="false"
+ follows="all"
bottom="10"
height="20"
label="Voice Controls"
diff --git a/indra/newview/skins/default/xui/en/panel_chat_header.xml b/indra/newview/skins/default/xui/en/panel_chat_header.xml
index 7a3eae35a9..96e5b4d413 100644
--- a/indra/newview/skins/default/xui/en/panel_chat_header.xml
+++ b/indra/newview/skins/default/xui/en/panel_chat_header.xml
@@ -25,7 +25,7 @@
height="12"
layout="topleft"
left_pad="5"
- right="-50"
+ right="-60"
name="user_name"
text_color="white"
top="8"
@@ -39,7 +39,7 @@
layout="topleft"
left_pad="5"
name="time_box"
- right="-10"
+ right="-5"
top="8"
value="23:30"
width="50" />
diff --git a/indra/newview/skins/default/xui/en/panel_group_control_panel.xml b/indra/newview/skins/default/xui/en/panel_group_control_panel.xml
index 2fee2033f6..41b210557e 100644
--- a/indra/newview/skins/default/xui/en/panel_group_control_panel.xml
+++ b/indra/newview/skins/default/xui/en/panel_group_control_panel.xml
@@ -1,6 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<panel
border="false"
+ follows="left|top|right|bottom"
height="238"
name="panel_im_control_panel"
width="180">
@@ -22,6 +23,7 @@
<button
bottom_pad="0"
+ follows="left|right|bottom"
height="20"
label="Group Info"
left_delta="28"
@@ -32,7 +34,7 @@
background_visible="true"
bg_alpha_color="0.2 0.2 0.2 1"
border="false"
- follows="left|bottom"
+ follows="left|right|bottom"
height="70"
left="0"
left_pad="0"
@@ -42,6 +44,7 @@
<button
bottom="10"
+ follows="all"
height="20"
label="Call Group"
left_delta="28"
@@ -50,6 +53,7 @@
<button
bottom="40"
+ follows="all"
height="20"
label="Leave Call"
name="end_call_btn"
@@ -59,6 +63,7 @@
<button
enabled="false"
bottom="10"
+ follows="all"
height="20"
label="Open Voice Controls"
name="voice_ctrls_btn"
diff --git a/indra/newview/skins/default/xui/en/panel_group_general.xml b/indra/newview/skins/default/xui/en/panel_group_general.xml
index 58a78a0ab8..4c30db4034 100644
--- a/indra/newview/skins/default/xui/en/panel_group_general.xml
+++ b/indra/newview/skins/default/xui/en/panel_group_general.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<panel
follows="all"
- height="380"
+ height="378"
label="General"
class="panel_group_general"
layout="topleft"
@@ -40,13 +40,13 @@ Hover your mouse over the options for more help.
column_padding="0"
draw_heading="true"
follows="left|top"
- heading_height="16"
+ heading_height="20"
height="130"
layout="topleft"
- left="5"
+ left="0"
name="visible_members"
top_pad="2"
- width="305">
+ width="310">
<name_list.columns
label="Member"
name="name"
@@ -59,9 +59,9 @@ Hover your mouse over the options for more help.
<text
follows="left|top"
type="string"
- height="14"
+ height="12"
layout="topleft"
- left_delta="0"
+ left="5"
name="active_title_label"
top_pad="5"
width="300">
@@ -75,7 +75,7 @@ Hover your mouse over the options for more help.
name="active_title"
tool_tip="Sets the title that appears in your avatar&apos;s name tag when this group is active."
top_pad="2"
- width="305" />
+ width="300" />
<check_box
height="16"
font="SansSerifSmall"
@@ -101,12 +101,12 @@ Hover your mouse over the options for more help.
border="true"
bg_alpha_color="FloaterUnfocusBorderColor"
follows="left|top"
- height="93"
+ height="90"
layout="topleft"
left="5"
name="preferences_container"
top_pad="5"
- width="305">
+ width="300">
<check_box
follows="right|top"
height="16"
@@ -140,7 +140,7 @@ Hover your mouse over the options for more help.
left_pad="2"
name="spin_enrollment_fee"
tool_tip="New members must pay this fee to join the group when Enrollment Fee is checked."
- width="105" />
+ width="100" />
<check_box
height="16"
initial_value="true"
@@ -157,7 +157,7 @@ Hover your mouse over the options for more help.
left_delta="0"
name="group_mature_check"
tool_tip="Sets whether your group information is considered mature"
- top_pad="5"
+ top_pad="2"
width="190">
<combo_box.item
label="PG Content"
diff --git a/indra/newview/skins/default/xui/en/panel_group_info_sidetray.xml b/indra/newview/skins/default/xui/en/panel_group_info_sidetray.xml
index 0082128ca4..c0db734f8c 100644
--- a/indra/newview/skins/default/xui/en/panel_group_info_sidetray.xml
+++ b/indra/newview/skins/default/xui/en/panel_group_info_sidetray.xml
@@ -2,10 +2,10 @@
<panel
background_visible="true"
follows="all"
- height="570"
+ height="635"
label="Group Info"
layout="topleft"
- min_height="425"
+ min_height="460"
left="0"
top="20"
name="GroupInfo"
@@ -116,44 +116,43 @@ background_visible="true"
visible="true"
width="120" />
<accordion
+ single_expansion="true"
follows="all"
- height="405"
+ height="478"
layout="topleft"
left="0"
name="groups_accordion"
- top_pad="15"
+ top_pad="10"
width="323">
<accordion_tab
- expanded="true"
- layout="topleft"
- name="group_general_tab"
- title="General">
+ expanded="false"
+ layout="topleft"
+ name="group_general_tab"
+ title="General">
<panel
- border="false"
- class="panel_group_general"
+ border="false"
+ class="panel_group_general"
filename="panel_group_general.xml"
layout="topleft"
left="0"
help_topic="group_general_tab"
name="group_general_tab_panel"
- top="0"
- width="300" />
+ top="0" />
</accordion_tab>
<accordion_tab
- expanded="false"
- layout="topleft"
- name="group_roles_tab"
- title="Roles">
- <panel
- border="false"
- class="panel_group_roles"
- filename="panel_group_roles.xml"
- layout="topleft"
- left="0"
- help_topic="group_roles_tab"
- name="group_roles_tab_panel"
- top="0"
- width="303" />
+ expanded="true"
+ layout="topleft"
+ name="group_roles_tab"
+ title="Roles">
+ <panel
+ border="false"
+ class="panel_group_roles"
+ filename="panel_group_roles.xml"
+ layout="topleft"
+ left="0"
+ help_topic="group_roles_tab"
+ name="group_roles_tab_panel"
+ top="0" />
</accordion_tab>
<accordion_tab
expanded="false"
@@ -168,8 +167,7 @@ background_visible="true"
left="0"
help_topic="group_notices_tab"
name="group_notices_tab_panel"
- top="0"
- width="303" />
+ top="0" />
</accordion_tab>
<accordion_tab
expanded="false"
@@ -184,21 +182,25 @@ background_visible="true"
left="0"
help_topic="group_land_money_tab"
name="group_land_tab_panel"
- top="0"
- width="300" />
+ top="0" />
</accordion_tab>
</accordion>
+ <panel
+ name="button_row"
+ height="23"
+ follows="bottom|left"
+ top_pad="-1"
+ width="323">
<button
follows="top|left"
height="22"
image_overlay="Refresh_Off"
layout="topleft"
- left="5"
+ left="10"
name="btn_refresh"
- top_pad="-15"
width="23" />
- <button
- height="20"
+ <button
+ height="22"
label="Create"
label_selected="New group"
name="btn_create"
@@ -214,12 +216,12 @@ background_visible="true"
visible="false"
width="65" />-->
<button
- height="20"
- font="SansSerifSmall"
+ height="22"
label="Save"
label_selected="Save"
name="btn_apply"
left_pad="10"
right="-10"
- width="65" />
+ width="100" />
+ </panel>
</panel> \ No newline at end of file
diff --git a/indra/newview/skins/default/xui/en/panel_group_land_money.xml b/indra/newview/skins/default/xui/en/panel_group_land_money.xml
index 2c649642c3..2075d7e05b 100644
--- a/indra/newview/skins/default/xui/en/panel_group_land_money.xml
+++ b/indra/newview/skins/default/xui/en/panel_group_land_money.xml
@@ -2,7 +2,7 @@
<panel
border="false"
follows="all"
- height="510"
+ height="380"
label="Land &amp; L$"
layout="topleft"
left="0"
@@ -11,7 +11,7 @@
width="310">
<panel.string
name="help_text">
- Parcels owned by a group are listed along with contribution details. A warning appears until the Total Land in Use is less than or = to the Total Contribution.
+ A warning appears until the Total Land in Use is less than or = to the Total Contribution.
</panel.string>
<panel.string
name="cant_view_group_land_text">
@@ -43,14 +43,14 @@
</text> -->
<scroll_list
draw_heading="true"
- follows="top"
+ follows="top|left|right"
heading_height="20"
- height="150"
+ height="130"
layout="topleft"
- left="2"
+ left="0"
+ top="0"
name="group_parcel_list"
- top_pad="0"
- width="305">
+ width="310">
<scroll_list.columns
label="Parcel"
name="name"
@@ -72,34 +72,22 @@
name="hidden"
width="-1" />
</scroll_list>
- <button
- follows="top"
- height="23"
- label="Map"
- label_selected="Map"
- layout="topleft"
- name="map_button"
- right="-5"
- top_pad="5"
- width="95"
- enabled="false" />
<text
type="string"
follows="left|top"
halign="right"
- height="16"
+ height="15"
layout="topleft"
- left="5"
+ left="0"
name="total_contributed_land_label"
- top_pad="0"
width="130">
- Total Contribution:
+ Total contribution:
</text>
<text
text_color="EmphasisColor"
type="string"
follows="left|top"
- height="16"
+ height="15"
layout="topleft"
left_pad="5"
name="total_contributed_land_value"
@@ -107,23 +95,34 @@
width="120">
[AREA] m²
</text>
+ <button
+ follows="top"
+ height="20"
+ label="Map"
+ label_selected="Map"
+ layout="topleft"
+ name="map_button"
+ right="-5"
+ left_pad="0"
+ width="95"
+ enabled="false" />
<text
type="string"
follows="left|top"
halign="right"
- height="16"
+ height="15"
layout="topleft"
- left="5"
+ left="0"
name="total_land_in_use_label"
top_pad="0"
width="130">
- Total Land In Use:
+ Total land in use:
</text>
<text
text_color="EmphasisColor"
type="string"
follows="left|top"
- height="16"
+ height="15"
layout="topleft"
left_pad="5"
name="total_land_in_use_value"
@@ -135,19 +134,19 @@
type="string"
follows="left|top"
halign="right"
- height="16"
+ height="15"
layout="topleft"
- left="5"
+ left="0"
name="land_available_label"
top_pad="0"
width="130">
- Land Available:
+ Land available:
</text>
<text
text_color="EmphasisColor"
type="string"
follows="left|top"
- height="16"
+ height="15"
layout="topleft"
left_pad="5"
name="land_available_value"
@@ -159,17 +158,15 @@
type="string"
follows="left|top"
halign="right"
- height="16"
+ height="15"
layout="topleft"
- left="5"
+ left="0"
name="your_contribution_label"
top_pad="0"
width="130">
- Your Contribution:
+ Your contribution:
</text>
<line_editor
- border_style="line"
- border_thickness="1"
follows="left|top"
height="19"
layout="topleft"
@@ -177,7 +174,7 @@
max_length="10"
name="your_contribution_line_editor"
top_delta="0"
- width="95" />
+ width="80" />
<text
type="string"
follows="left|top"
@@ -194,7 +191,7 @@
type="string"
follows="left|top"
halign="right"
- height="16"
+ height="12"
layout="topleft"
left="140"
name="your_contribution_max_value"
@@ -203,27 +200,27 @@
([AMOUNT] max)
</text>
<icon
- height="16"
- image_name="notify_next"
+ height="18"
+ image_name="BuyArrow_Over"
layout="topleft"
- left="9"
+ left="75"
name="group_over_limit_icon"
top_pad="0"
- visible="false"
- width="16" />
+ visible="true"
+ width="18" />
<text
follows="left|top"
type="string"
word_wrap="true"
font="SansSerifSmall"
- height="35"
+ height="20"
layout="topleft"
- left_pad="5"
+ left_pad="2"
name="group_over_limit_text"
text_color="EmphasisColor"
top_delta="0"
- width="260">
- Group members must contribute more land credits to support land in use
+ width="213">
+ More land credits are needed to support land in use
</text>
<text
type="string"
@@ -231,29 +228,29 @@
font="SansSerifBig"
height="16"
layout="topleft"
- left="10"
+ left="0"
name="group_money_heading"
text_color="EmphasisColor"
- top_pad="0"
- width="150">
+ top_pad="-15"
+ width="100">
Group L$
</text>
<tab_container
follows="all"
- height="200"
+ height="173"
halign="center"
layout="topleft"
- left="5"
+ left="0"
name="group_money_tab_container"
tab_position="top"
tab_height="20"
top_pad="2"
- tab_min_width="70"
- width="300">
+ tab_min_width="75"
+ width="310">
<panel
border="false"
follows="all"
- height="180"
+ height="173"
label="PLANNING"
layout="topleft"
left="0"
@@ -264,7 +261,6 @@
<text_editor
type="string"
follows="all"
- font="SansSerif"
height="140"
layout="topleft"
left="0"
@@ -279,13 +275,13 @@
<panel
border="false"
follows="all"
- height="180"
+ height="173"
label="DETAILS"
layout="topleft"
left="0"
help_topic="group_money_details_tab"
name="group_money_details_tab"
- top="5"
+ top="0"
width="300">
<text_editor
type="string"
@@ -302,34 +298,34 @@
</text_editor>
<button
follows="left|top"
- height="23"
+ height="18"
image_overlay="Arrow_Left_Off"
layout="topleft"
name="earlier_details_button"
tool_tip="Back"
- top_pad="5"
right="-45"
- width="31" />
+ bottom="0"
+ width="25" />
<button
follows="left|top"
- height="23"
+ height="18"
image_overlay="Arrow_Right_Off"
layout="topleft"
left_pad="10"
name="later_details_button"
tool_tip="Next"
- width="31" />
+ width="25" />
</panel>
<panel
border="false"
follows="all"
- height="180"
+ height="173"
label="SALES"
layout="topleft"
left_delta="0"
help_topic="group_money_sales_tab"
name="group_money_sales_tab"
- top="5"
+ top="0"
width="300">
<text_editor
type="string"
@@ -345,24 +341,24 @@
Loading...
</text_editor>
<button
+ bottom="0"
follows="left|top"
- height="23"
+ height="18"
image_overlay="Arrow_Left_Off"
layout="topleft"
name="earlier_sales_button"
tool_tip="Back"
- top_pad="5"
right="-45"
- width="31" />
+ width="25" />
<button
follows="left|top"
- height="23"
+ height="18"
image_overlay="Arrow_Right_Off"
layout="topleft"
left_pad="10"
name="later_sales_button"
tool_tip="Next"
- width="31" />
+ width="25" />
</panel>
</tab_container>
</panel>
diff --git a/indra/newview/skins/default/xui/en/panel_group_notices.xml b/indra/newview/skins/default/xui/en/panel_group_notices.xml
index e56db6414f..0dea81eefe 100644
--- a/indra/newview/skins/default/xui/en/panel_group_notices.xml
+++ b/indra/newview/skins/default/xui/en/panel_group_notices.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<panel
follows="all"
- height="485"
+ height="463"
label="Notices"
layout="topleft"
left="0"
@@ -10,11 +10,10 @@
width="310">
<panel.string
name="help_text">
- Notices are a quick way to communicate across a
-group by broadcasting a message and delivering
+ Notices let you send a message and
an optionally attached item. Notices only go to
-group members in Roles granted the ability to
-receive Notices. You can turn off Notices on
+group members in Roles with the ability to
+receive Notices. You can turn off Notices on
the General tab.
</panel.string>
<panel.string
@@ -25,14 +24,15 @@ the General tab.
follows="left|top"
type="string"
word_wrap="true"
- height="30"
+ height="24"
+ halign="right"
layout="topleft"
left="5"
name="lbl2"
top="5"
width="300">
Notices are kept for 14 days
-Groups are limited to 200 notices/group daily
+Maximum 200 per group daily
</text>
<scroll_list
follows="left|top"
@@ -44,7 +44,7 @@ Groups are limited to 200 notices/group daily
left="2"
name="notice_list"
top_pad="0"
- width="305">
+ width="300">
<scroll_list.columns
label=""
name="icon"
@@ -52,15 +52,15 @@ Groups are limited to 200 notices/group daily
<scroll_list.columns
label="Subject"
name="subject"
- width="125" />
+ width="110" />
<scroll_list.columns
label="From"
name="from"
- width="90" />
+ width="100" />
<scroll_list.columns
label="Date"
name="date"
- width="30" />
+ width="60" />
<scroll_list.columns
name="sort"
width="-1" />
@@ -84,7 +84,7 @@ Groups are limited to 200 notices/group daily
left="5"
name="create_new_notice"
tool_tip="Create a new notice"
- top_delta="0"
+ top_delta="-3"
width="18" />
<button
follows="top|left"
@@ -97,14 +97,14 @@ Groups are limited to 200 notices/group daily
width="23" />
<panel
follows="left|top"
- height="300"
+ height="280"
label="Create New Notice"
layout="topleft"
left="0"
- top_pad="10"
- visible="false"
+ top_pad="0"
+ visible="true"
name="panel_create_new_notice"
- width="303">
+ width="300">
<text
follows="left|top"
type="string"
@@ -216,31 +216,31 @@ Groups are limited to 200 notices/group daily
follows="left|top"
height="23"
label="Send"
- label_selected="Send Notice"
+ label_selected="Send"
layout="topleft"
right="-10"
top_pad="10"
name="send_notice"
width="100" />
<group_drop_target
- height="466"
- top="0"
- left="0"
+ height="95"
+ top="160"
+ left="10"
layout="topleft"
name="drop_target"
tool_tip="Drag an inventory item onto the message box to send it with the notice. You must have permission to copy and transfer the object to send it with the notice."
- width="295" />
- </panel>
+ width="280" />
+ </panel>
<panel
follows="left|top"
- height="300"
+ height="280"
label="View Past Notice"
layout="topleft"
left="0"
- visible="true"
+ visible="false"
name="panel_view_past_notice"
top="180"
- width="303">
+ width="300">
<text
type="string"
font="SansSerifBig"
@@ -303,7 +303,7 @@ Groups are limited to 200 notices/group daily
</text>
<text_editor
enabled="false"
- height="205"
+ height="160"
layout="topleft"
left="10"
max_length="511"
@@ -319,7 +319,7 @@ Groups are limited to 200 notices/group daily
max_length="63"
mouse_opaque="false"
name="view_inventory_name"
- top_pad="10"
+ top_pad="8"
width="285" />
<icon
height="16"
diff --git a/indra/newview/skins/default/xui/en/panel_group_notify.xml b/indra/newview/skins/default/xui/en/panel_group_notify.xml
index 2e4df92da4..9b0b81cd0a 100644
--- a/indra/newview/skins/default/xui/en/panel_group_notify.xml
+++ b/indra/newview/skins/default/xui/en/panel_group_notify.xml
@@ -1,8 +1,6 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<panel
background_visible="true"
- bevel_style="in"
- bg_alpha_color="0 0 0 0"
height="90"
label="instant_message"
layout="topleft"
@@ -21,8 +19,6 @@
value="SANSSERIF" />
<panel
background_visible="true"
- bevel_style="in"
- bg_alpha_color="black"
follows="top"
height="30"
label="header"
@@ -32,7 +28,7 @@
top="0"
width="305">
<icon
- follows="left|top|right|bottom"
+ follows="all"
height="20"
layout="topleft"
left="5"
@@ -41,8 +37,8 @@
top="5"
width="20" />
<text
- follows="left|top|right|bottom"
- font="SansSerifBigBold"
+ follows="all"
+ font="SansSerifBig"
height="20"
layout="topleft"
left_pad="10"
@@ -56,7 +52,7 @@
<text_editor
allow_html="true"
enabled="true"
- follows="left|top|bottom|right"
+ follows="all"
height="0"
layout="topleft"
left="25"
@@ -69,7 +65,7 @@
type="string"
use_ellipses="true"
value="message"
- width="270"
+ width="270"
word_wrap="true" >
</text_editor>
<icon
@@ -97,9 +93,9 @@
bottom="85"
follows="bottom"
height="20"
- label="OK"
+ label="Ok"
layout="topleft"
- left="25"
+ right="-10"
name="btn_ok"
width="70" />
</panel>
diff --git a/indra/newview/skins/default/xui/en/panel_group_roles.xml b/indra/newview/skins/default/xui/en/panel_group_roles.xml
index 604fb81c8e..5bae5c2711 100644
--- a/indra/newview/skins/default/xui/en/panel_group_roles.xml
+++ b/indra/newview/skins/default/xui/en/panel_group_roles.xml
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<panel
- border="false"
+ follows="all"
height="552"
label="Members &amp; Roles"
layout="topleft"
@@ -14,26 +14,27 @@
</panel.string>
<panel.string
name="want_apply_text">
- Do you want to save these changes?
+ Do you want to save your changes?
</panel.string>
<panel.string
name="help_text" />
<tab_container
border="false"
follows="left|top"
- height="245"
+ height="552"
halign="center"
layout="topleft"
- left="5"
+ left="0"
name="roles_tab_container"
tab_position="top"
tab_height="20"
tab_min_width="75"
- top="3"
- width="300">
+ top="0"
+ width="310">
<panel
border="false"
- height="220"
+ follows="all"
+ height="303"
label="MEMBERS"
layout="topleft"
left="0"
@@ -41,7 +42,7 @@
name="members_sub_tab"
tool_tip="Members"
class="panel_group_members_subtab"
- width="300">
+ width="310">
<panel.string
name="help_text">
You can add or remove Roles assigned to Members.
@@ -50,11 +51,11 @@ clicking on their names.
</panel.string>
<filter_editor
layout="topleft"
- top="10"
+ top="5"
left="5"
width="280"
height="20"
- follows="left|top|right"
+ follows="top"
max_length="250"
label="Filter Members"
name="filter_input" />
@@ -62,7 +63,7 @@ clicking on their names.
column_padding="0"
draw_heading="true"
heading_height="20"
- height="160"
+ height="240"
follows="left|top"
layout="topleft"
left="0"
@@ -73,30 +74,26 @@ clicking on their names.
<name_list.columns
label="Member"
name="name"
- relative_width="0.45" />
+ relative_width="0.44" />
<name_list.columns
- label="Donations"
+ label="Donation"
name="donated"
- relative_width="0.3" />
+ relative_width="0.25" />
<name_list.columns
- label="Online"
+ label="Status"
name="online"
- relative_width="0.2" />
+ relative_width="0.15" />
</name_list>
<button
height="20"
- font="SansSerifSmall"
+ follows="bottom|left"
label="Invite"
- layout="topleft"
left="5"
name="member_invite"
- top_pad="3"
width="100" />
<button
height="20"
- font="SansSerifSmall"
label="Eject"
- layout="topleft"
left_pad="5"
right="-5"
name="member_eject"
@@ -104,14 +101,23 @@ clicking on their names.
</panel>
<panel
border="false"
- height="220"
+ height="230"
label="ROLES"
layout="topleft"
left="0"
help_topic="roles_roles_tab"
name="roles_sub_tab"
class="panel_group_roles_subtab"
- width="300">
+ width="310">
+ <!-- <button
+ enabled="false"
+ height="20"
+ label="Show All"
+ layout="topleft"
+ top="-65"
+ right="-5"
+ name="show_all_button"
+ width="100" />-->
<panel.string
name="help_text">
Roles have a title and an allowed list of Abilities
@@ -121,7 +127,7 @@ including the Everyone and Owner Roles.
</panel.string>
<panel.string
name="cant_delete_role">
- The &apos;Everyone&apos; and &apos;Owners&apos; Roles are special and cannot be deleted.
+ The &apos;Everyone&apos; and &apos;Owners&apos; Roles are special and can't be deleted.
</panel.string>
<panel.string
name="power_folder_icon">
@@ -129,15 +135,15 @@ including the Everyone and Owner Roles.
</panel.string>
<panel.string
name="power_all_have_icon">
- checkbox_enabled_true.tga
+ Checkbox_On
</panel.string>
<panel.string
name="power_partial_icon">
- checkbox_enabled_false.tga
+ Checkbox_Off
</panel.string>
<filter_editor
layout="topleft"
- top="10"
+ top="5"
left="5"
width="280"
height="20"
@@ -145,61 +151,48 @@ including the Everyone and Owner Roles.
max_length="250"
label="Filter Roles"
name="filter_input" />
- <!--
- <button
- enabled="false"
- height="20"
- label="Show All"
- layout="topleft"
- left_pad="0"
- name="show_all_button"
- top_delta="0"
- width="80" /> -->
<scroll_list
column_padding="0"
draw_heading="true"
draw_stripes="false"
follows="left|top"
heading_height="20"
- height="160"
+ height="170"
layout="topleft"
search_column="1"
left="0"
name="role_list"
top_pad="2"
- width="300">
+ width="310">
<scroll_list.columns
label="Role"
name="name"
- width="80" />
+ relative_width="0.45" />
<scroll_list.columns
label="Title"
name="title"
- width="90" />
+ relative_width="0.45" />
<scroll_list.columns
- label="Members"
+ label="#"
name="members"
- width="95" />
+ relative_width="0.15" />
</scroll_list>
<button
+ follows="bottom|left"
height="20"
- font="SansSerifSmall"
- label="Add Role"
+ label="New Role"
layout="topleft"
left="5"
name="role_create"
- top_pad="6"
- width="125" />
+ width="100" />
<button
height="20"
- font="SansSerifSmall"
label="Delete Role"
layout="topleft"
left_pad="5"
right="-5"
name="role_delete"
- top_delta="0"
- width="125" />
+ width="100" />
</panel>
<panel
border="false"
@@ -211,7 +204,7 @@ including the Everyone and Owner Roles.
name="actions_sub_tab"
class="panel_group_actions_subtab"
tool_tip="You can view an Ability&apos;s Description and which Roles and Members can execute the Ability."
- width="300">
+ width="310">
<panel.string
name="help_text">
Abilities allow Members in Roles to do specific
@@ -219,7 +212,7 @@ things in this group. There&apos;s a broad variety of Abilities.
</panel.string>
<filter_editor
layout="topleft"
- top="10"
+ top="5"
left="5"
width="280"
height="20"
@@ -231,74 +224,63 @@ things in this group. There&apos;s a broad variety of Abilities.
column_padding="0"
draw_stripes="false"
follows="left|top"
- height="160"
+ height="200"
layout="topleft"
left="0"
multi_select="true"
name="action_list"
search_column="1"
tool_tip="Select an Ability to view more details"
- top_pad="2"
+ top_pad="5"
width="300">
<scroll_list.columns
- label=""
- name="icon"
- width="16" />
- <scroll_list.columns
- label="Action"
name="action"
- width="247" />
+ width="300" />
</scroll_list>
- <icon
- height="16"
- image_name="Inv_FolderClosed"
- layout="topleft"
- name="power_folder_icon"
- visible="false"
- width="16" />
</panel>
</tab_container>
<panel
height="252"
layout="topleft"
follows="left|top"
- left="10"
+ left="0"
+ mouse_opaque="false"
name="members_footer"
- top="245"
- top_delta="0"
- width="290">
+ top="300"
+ visible="false"
+ width="310">
<text
type="string"
- height="16"
+ height="14"
layout="topleft"
follows="left|top"
left="0"
name="static"
top_pad="5"
- width="285">
+ width="300">
Assigned Roles
</text>
<scroll_list
- draw_stripes="false"
+ draw_stripes="true"
follows="left|top"
- height="80"
+ height="90"
layout="topleft"
left="0"
name="member_assigned_roles"
top_pad="0"
- width="285">
+ width="300">
<scroll_list.columns
label=""
name="checkbox"
- width="30" />
+ width="20" />
<scroll_list.columns
label=""
name="role"
- width="255" />
+ width="270" />
</scroll_list>
<text
type="string"
- height="16"
+ height="14"
layout="topleft"
follows="left|top"
left="0"
@@ -308,48 +290,42 @@ things in this group. There&apos;s a broad variety of Abilities.
Allowed Abilities
</text>
<scroll_list
- draw_stripes="false"
- height="80"
+ draw_stripes="true"
+ height="90"
layout="topleft"
left="0"
name="member_allowed_actions"
search_column="2"
tool_tip="For details of each allowed ability see the abilities tab"
top_pad="0"
- width="285">
- <scroll_list.columns
- label=""
- name="icon"
- width="20" />
+ width="300">
<scroll_list.columns
label=""
name="action"
- width="265" />
+ width="300" />
</scroll_list>
</panel>
<panel
height="297"
layout="topleft"
- left="10"
+ left="0"
name="roles_footer"
top_delta="0"
- top="245"
+ top="220"
visible="false"
- width="290">
+ width="310">
<text
type="string"
- height="16"
+ height="14"
layout="topleft"
left="0"
name="static"
top="0"
- width="140">
- Name
+ width="300">
+ Role Name
</text>
<line_editor
type="string"
- border_style="line"
- border_thickness="1"
follows="left|top"
height="20"
layout="topleft"
@@ -357,106 +333,97 @@ things in this group. There&apos;s a broad variety of Abilities.
max_length="295"
name="role_name"
top_pad="0"
- width="290">
- Employees
+ width="300">
</line_editor>
<text
type="string"
- height="16"
+ height="14"
layout="topleft"
name="static3"
top_pad="5"
- width="290">
- Title
+ width="300">
+ Role Title
</text>
<line_editor
type="string"
- border_style="line"
- border_thickness="1"
follows="left|top"
height="20"
layout="topleft"
max_length="295"
name="role_title"
top_pad="0"
- width="290">
- (waiting)
+ width="300">
</line_editor>
<text
type="string"
- height="16"
+ height="14"
layout="topleft"
left="0"
name="static2"
top_pad="5"
- width="100">
+ width="200">
Description
</text>
<text_editor
type="string"
halign="left"
- height="35"
+ height="50"
layout="topleft"
left="0"
max_length="295"
name="role_description"
top_pad="0"
- width="295"
+ width="300"
word_wrap="true">
- (waiting)
</text_editor>
<text
type="string"
- height="16"
+ height="14"
layout="topleft"
follows="left|top"
left="0"
name="static4"
top_pad="5"
- width="290">
- Assigned Roles
+ width="300">
+ Assigned Members
</text>
<name_list
- draw_stripes="false"
- height="50"
+ draw_stripes="true"
+ height="60"
layout="topleft"
left="0"
name="role_assigned_members"
top_pad="0"
- width="290" />
+ width="300" />
<check_box
height="15"
label="Reveal members"
layout="topleft"
name="role_visible_in_list"
tool_tip="Sets whether members of this role are visible in the General tab to people outside of the group."
- top_pad="3"
- width="290" />
+ top_pad="4"
+ width="300" />
<text
type="string"
- height="16"
+ height="13"
layout="topleft"
follows="left|top"
left="0"
name="static5"
top_pad="5"
- width="290">
+ width="300">
Allowed Abilities
</text>
<scroll_list
- draw_stripes="false"
- height="50"
+ draw_stripes="true"
+ height="60"
layout="topleft"
left="0"
name="role_allowed_actions"
search_column="2"
tool_tip="For details of each allowed ability see the abilities tab"
top_pad="0"
- width="295">
- <scroll_list.columns
- label=""
- name="icon"
- width="20" />
+ width="300">
<scroll_list.columns
label=""
name="checkbox"
@@ -464,33 +431,27 @@ things in this group. There&apos;s a broad variety of Abilities.
<scroll_list.columns
label=""
name="action"
- width="250" />
+ width="270" />
</scroll_list>
</panel>
<panel
height="303"
layout="topleft"
- left="10"
+ left="0"
name="actions_footer"
top_delta="0"
- top="245"
+ top="255"
visible="false"
- width="290">
- <text
- type="string"
- height="16"
- layout="topleft"
- name="static"
- width="200">
- Ability description
- </text>
+ width="310">
<text_editor
+ bg_readonly_color="Transparent"
+ text_readonly_color="EmphasisColor"
+ font="SansSerifSmall"
type="string"
enabled="false"
halign="left"
- height="80"
+ height="90"
layout="topleft"
- left_delta="0"
max_length="512"
name="action_description"
top_pad="0"
@@ -500,28 +461,28 @@ things in this group. There&apos;s a broad variety of Abilities.
</text_editor>
<text
type="string"
- height="16"
+ height="14"
layout="topleft"
- left_delta="0"
+ left="5"
name="static2"
top_pad="5"
- width="295">
+ width="300">
Roles with this ability
</text>
<scroll_list
- height="60"
+ height="65"
layout="topleft"
- left="0"
+ left="5"
name="action_roles"
top_pad="0"
- width="295" />
- <text
+ width="300" />
+ <text
type="string"
- height="16"
+ height="14"
layout="topleft"
name="static3"
top_pad="5"
- width="290">
+ width="300">
Members with this ability
</text>
<name_list
@@ -529,6 +490,6 @@ things in this group. There&apos;s a broad variety of Abilities.
layout="topleft"
name="action_members"
top_pad="0"
- width="290" />
+ width="300" />
</panel>
</panel>
diff --git a/indra/newview/skins/default/xui/en/panel_my_profile.xml b/indra/newview/skins/default/xui/en/panel_my_profile.xml
index e04eda9464..d259623c0b 100644
--- a/indra/newview/skins/default/xui/en/panel_my_profile.xml
+++ b/indra/newview/skins/default/xui/en/panel_my_profile.xml
@@ -27,6 +27,7 @@
<string
name="no_partner_text"
value="None" />
+ <string name="RegisterDateFormat">[REG_DATE] ([AGE])</string>
<scroll_container
color="DkGray2"
follows="all"
diff --git a/indra/newview/skins/default/xui/en/panel_preferences_chat.xml b/indra/newview/skins/default/xui/en/panel_preferences_chat.xml
index 5a4b0a3892..fac0d5c60f 100644
--- a/indra/newview/skins/default/xui/en/panel_preferences_chat.xml
+++ b/indra/newview/skins/default/xui/en/panel_preferences_chat.xml
@@ -309,4 +309,13 @@
name="send_im_to_email"
top_pad="5"
width="400" />
+ <check_box
+ enabled="false"
+ height="16"
+ label="Enable plain text chat history"
+ layout="topleft"
+ left_delta="0"
+ name="plain_text_chat_history"
+ top_pad="5"
+ width="400" />
</panel>
diff --git a/indra/newview/skins/default/xui/en/panel_preferences_privacy.xml b/indra/newview/skins/default/xui/en/panel_preferences_privacy.xml
index 1b9a99f90b..23832ba120 100644
--- a/indra/newview/skins/default/xui/en/panel_preferences_privacy.xml
+++ b/indra/newview/skins/default/xui/en/panel_preferences_privacy.xml
@@ -86,7 +86,16 @@
name="autoplay_enabled"
top_pad="10"
width="350" />
- <text
+ <check_box
+ control_name="ParcelMediaAutoPlayEnable"
+ height="16"
+ label="Automatically Play Parcel Media"
+ layout="topleft"
+ left="30"
+ name="parcel_autoplay_enabled"
+ top_pad="10"
+ width="350" />
+ <text
type="string"
length="1"
follows="left|top"
diff --git a/indra/newview/skins/default/xui/en/panel_prim_media_controls.xml b/indra/newview/skins/default/xui/en/panel_prim_media_controls.xml
index 98025e28db..88049fe7d1 100644
--- a/indra/newview/skins/default/xui/en/panel_prim_media_controls.xml
+++ b/indra/newview/skins/default/xui/en/panel_prim_media_controls.xml
@@ -8,6 +8,7 @@
mouse_opaque="false"
width="800">
<string name="control_background_image_name">Inspector_Background</string>
+ <string name="skip_step">0.2</string>
<panel
name="media_region"
bottom="125"
@@ -86,7 +87,7 @@
auto_resize="false"
height="22"
layout="topleft"
- tool_tip="Step back"
+ tool_tip="Navigate back"
width="22"
left="0"
top_delta="4">
@@ -111,7 +112,7 @@
hover_glow_amount="0.15"
height="22"
layout="topleft"
- tool_tip="Step forward"
+ tool_tip="Navigate forward"
top_delta="0"
min_width="22"
width="22">
@@ -165,7 +166,7 @@
min_width="22"
width="22">
<button.commit_callback
- function="MediaCtrl.Stop" />
+ function="MediaCtrl.MediaStop" />
</button>
</layout_panel>
<layout_panel
@@ -360,6 +361,55 @@ function="MediaCtrl.CommitURL" />
</slider_bar>
</layout_panel>
<layout_panel
+ name="skip_back"
+ auto_resize="false"
+ user_resize="false"
+ layout="topleft"
+ min_width="22"
+ width="22">
+ <button
+ image_overlay="SkipBackward_Off"
+ image_disabled="PushButton_Disabled"
+ image_disabled_selected="PushButton_Disabled"
+ image_selected="PushButton_Selected"
+ image_unselected="PushButton_Off"
+ hover_glow_amount="0.15"
+ auto_resize="false"
+ height="22"
+ layout="topleft"
+ tool_tip="Step back"
+ top="-14"
+ width="22"
+ left="0">
+ <button.commit_callback
+ function="MediaCtrl.SkipBack" />
+ </button>
+ </layout_panel>
+ <layout_panel
+ name="skip_forward"
+ auto_resize="false"
+ user_resize="false"
+ layout="topleft"
+ min_width="22"
+ width="22">
+ <button
+ image_overlay="SkipForward_Off"
+ image_disabled="PushButton_Disabled"
+ image_disabled_selected="PushButton_Disabled"
+ image_selected="PushButton_Selected"
+ image_unselected="PushButton_Off"
+ hover_glow_amount="0.15"
+ height="22"
+ layout="topleft"
+ tool_tip="Step forward"
+ top="-14"
+ min_width="22"
+ width="22">
+ <button.commit_callback
+ function="MediaCtrl.SkipForward" />
+ </button>
+ </layout_panel>
+ <layout_panel
name="media_volume"
auto_resize="false"
user_resize="false"
diff --git a/indra/newview/skins/default/xui/en/panel_profile.xml b/indra/newview/skins/default/xui/en/panel_profile.xml
index 5110b6b2ef..bf1d46451b 100644
--- a/indra/newview/skins/default/xui/en/panel_profile.xml
+++ b/indra/newview/skins/default/xui/en/panel_profile.xml
@@ -27,7 +27,8 @@
<string
name="no_partner_text"
value="None" />
- <scroll_container
+ <string name="RegisterDateFormat">[REG_DATE] ([AGE])</string>
+ <scroll_container
color="DkGray2"
follows="all"
height="485"
diff --git a/indra/newview/skins/default/xui/en/panel_region_estate.xml b/indra/newview/skins/default/xui/en/panel_region_estate.xml
index add1476179..e25ff0d548 100644
--- a/indra/newview/skins/default/xui/en/panel_region_estate.xml
+++ b/indra/newview/skins/default/xui/en/panel_region_estate.xml
@@ -81,7 +81,7 @@ regions in the estate.
<view_border
bevel_style="in"
follows="top|left"
- height="290"
+ height="310"
layout="topleft"
left_delta="-4"
top_pad="5"
@@ -185,48 +185,48 @@ regions in the estate.
follows="left|top"
height="20"
layout="topleft"
- left="10"
+ left="15"
name="abuse_email_text"
- top_pad="5"
+ top_pad="10"
width="180">
Abuse email address:
</text>
<line_editor
follows="top|left"
- height="19"
+ height="23"
layout="topleft"
left="15"
name="abuse_email_address"
- top_pad="5"
- width="205" />
+ top_pad="-5"
+ width="230" />
<button
enabled="false"
follows="left|top"
- height="20"
+ height="23"
label="Apply"
layout="topleft"
name="apply_btn"
- right="250"
- top_pad="4"
- width="90" />
+ top_pad="10"
+ left="78"
+ width="97" />
<button
follows="left|top"
- height="20"
+ height="23"
label="Send Message To Estate..."
layout="topleft"
- left="8"
+ left="50"
name="message_estate_btn"
- top_pad="5"
- width="250" />
+ top_pad="20"
+ width="160" />
<button
follows="left|top"
- height="20"
+ height="23"
label="Kick User from Estate..."
layout="topleft"
- left="8"
+ left="50"
name="kick_user_from_estate_btn"
top_pad="5"
- width="250" />
+ width="160" />
<text
type="string"
@@ -243,14 +243,14 @@ regions in the estate.
<view_border
bevel_style="none"
follows="top|left"
- height="60"
+ height="71"
layout="topleft"
right="470"
- top_pad="5"
+ top_pad="-5"
width="200" />
<name_list
follows="left|top"
- height="60"
+ height="71"
layout="topleft"
left_delta="0"
multi_select="true"
@@ -259,22 +259,22 @@ regions in the estate.
width="200" />
<button
follows="left|top"
- height="20"
+ height="23"
label="Remove..."
layout="topleft"
name="remove_estate_manager_btn"
right="470"
top_pad="5"
- width="90" />
+ width="97" />
<button
follows="left|top"
- height="20"
+ height="23"
label="Add..."
layout="topleft"
- left_delta="-110"
+ left_delta="-103"
name="add_estate_manager_btn"
top_delta="0"
- width="90" />
+ width="97" />
<text
type="string"
length="1"
@@ -283,21 +283,21 @@ regions in the estate.
layout="topleft"
left_delta="0"
name="allow_resident_label"
- top_pad="5"
+ top_pad="10"
width="200">
Allowed Residents:
</text>
<view_border
bevel_style="none"
follows="top|left"
- height="60"
+ height="71"
layout="topleft"
right="470"
- top_pad="5"
+ top_pad="-5"
width="200" />
<name_list
follows="left|top"
- height="60"
+ height="71"
layout="topleft"
left_delta="0"
multi_select="true"
@@ -306,22 +306,22 @@ regions in the estate.
width="200" />
<button
follows="left|top"
- height="20"
+ height="23"
label="Remove..."
layout="topleft"
name="remove_allowed_avatar_btn"
right="470"
top_pad="5"
- width="90" />
+ width="97" />
<button
follows="left|top"
- height="20"
+ height="23"
label="Add..."
layout="topleft"
- left_delta="-110"
+ left_delta="-103"
name="add_allowed_avatar_btn"
top_delta="0"
- width="90" />
+ width="97" />
<text
type="string"
length="1"
@@ -330,21 +330,21 @@ regions in the estate.
layout="topleft"
left_delta="0"
name="allow_group_label"
- top_pad="5"
+ top_pad="10"
width="200">
Allowed Groups:
</text>
<view_border
bevel_style="none"
follows="top|left"
- height="60"
+ height="71"
layout="topleft"
right="470"
- top_pad="5"
+ top_pad="-5"
width="200" />
<name_list
follows="left|top"
- height="60"
+ height="71"
layout="topleft"
left_delta="0"
multi_select="true"
@@ -353,22 +353,22 @@ regions in the estate.
width="200" />
<button
follows="left|top"
- height="20"
+ height="23"
label="Remove..."
layout="topleft"
name="remove_allowed_group_btn"
right="470"
top_pad="5"
- width="90" />
+ width="97" />
<button
follows="left|top"
- height="20"
+ height="23"
label="Add..."
layout="topleft"
- left_delta="-110"
+ left_delta="-103"
name="add_allowed_group_btn"
top_delta="0"
- width="90" />
+ width="97" />
<text
type="string"
length="1"
@@ -377,21 +377,21 @@ regions in the estate.
layout="topleft"
left_delta="0"
name="ban_resident_label"
- top_pad="5"
+ top_pad="10"
width="200">
Banned Residents:
</text>
<view_border
bevel_style="none"
follows="top|left"
- height="60"
+ height="71"
layout="topleft"
right="470"
- top_pad="5"
+ top_pad="-5"
width="200" />
<name_list
follows="left|top"
- height="60"
+ height="71"
layout="topleft"
left_delta="0"
multi_select="true"
@@ -400,20 +400,20 @@ regions in the estate.
width="200" />
<button
follows="left|top"
- height="20"
+ height="23"
label="Remove..."
layout="topleft"
name="remove_banned_avatar_btn"
right="470"
top_pad="5"
- width="90" />
+ width="97" />
<button
follows="left|top"
- height="20"
+ height="23"
label="Add..."
layout="topleft"
- left_delta="-110"
+ left_delta="-103"
name="add_banned_avatar_btn"
top_delta="0"
- width="90" />
+ width="97" />
</panel>
diff --git a/indra/newview/skins/default/xui/en/strings.xml b/indra/newview/skins/default/xui/en/strings.xml
index b3728cb425..90fb3a6bf9 100644
--- a/indra/newview/skins/default/xui/en/strings.xml
+++ b/indra/newview/skins/default/xui/en/strings.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<!-- This file contains strings that used to be hardcoded in the source.
It is only for those strings which do not belong in a floater.
- For example, the strings used in avatar chat bubbles, and strings
+ For example, the strings used in avatar chat bubbles, and strings
that are returned from one component and may appear in many places-->
<strings>
@@ -44,8 +44,8 @@
<!-- Disconnection -->
<string name="AgentLostConnection">This region may be experiencing trouble. Please check your connection to the Internet.</string>
-
-
+
+
<!-- Tooltip, lltooltipview.cpp -->
<string name="TooltipPerson">Person</string><!-- Object under mouse pointer is an avatar -->
<string name="TooltipNoName">(no name)</string> <!-- No name on an object -->
@@ -80,11 +80,11 @@
<!-- text for SLURL labels -->
<string name="SLurlLabelTeleport">Teleport to</string>
<string name="SLurlLabelShowOnMap">Show Map for</string>
-
+
<!-- ButtonToolTips, llfloater.cpp -->
<string name="BUTTON_CLOSE_DARWIN">Close (&#8984;W)</string>
<string name="BUTTON_CLOSE_WIN">Close (Ctrl+W)</string>
- <string name="BUTTON_RESTORE">Restore</string>
+ <string name="BUTTON_RESTORE">Restore</string>
<string name="BUTTON_MINIMIZE">Minimize</string>
<string name="BUTTON_TEAR_OFF">Tear Off</string>
<string name="BUTTON_DOCK">Dock</string>
@@ -103,24 +103,24 @@
<!-- Indicates something is being loaded. Maybe should be merged with RetrievingData -->
<string name="LoadingData">Loading...</string>
-
-
+
+
<!-- namecache -->
<!-- Avatar name: text shown for LLUUID::null -->
<string name="AvatarNameNobody">(nobody)</string>
-
+
<!-- Avatar name: text shown while fetching name -->
<string name="AvatarNameWaiting">(waiting)</string>
<!-- Avatar name: More than one avatar is selected/used here -->
<string name="AvatarNameMultiple">(multiple)</string>
-
+
<!-- Avatar name: text shown as an alternative to AvatarNameFetching, easter egg. -->
<string name="AvatarNameHippos">(hippos)</string>
-
+
<!-- Group name: text shown for LLUUID::null -->
<string name="GroupNameNone">(none)</string>
-
+
<!-- Asset errors. Used in llassetstorage.cpp, translation from error code to error message. -->
<string name="AssetErrorNone">No error</string>
<string name="AssetErrorRequestFailed">Asset request: failed</string>
@@ -133,7 +133,7 @@
<string name="AssetErrorCircuitGone">Circuit gone</string>
<string name="AssetErrorPriceMismatch">Viewer and server do not agree on price</string>
<string name="AssetErrorUnknownStatus">Unknown status</string>
-
+
<!-- Asset Type human readable names: these will replace variable [TYPE] in notification FailedToFindWearable* -->
<string name="texture">texture</string>
<string name="sound">sound</string>
@@ -159,7 +159,7 @@
<string name="simstate">simstate</string>
<string name="favorite">favorite</string>
<string name="symbolic link">link</string>
-
+
<!-- llvoavatar. Displayed in the avatar chat bubble -->
<string name="AvatarEditingAppearance">(Editing Appearance)</string>
<string name="AvatarAway">Away</string>
@@ -236,17 +236,17 @@
<string name="anim_express_worry">Worry</string>
<string name="anim_yes_happy">Yes (Happy)</string>
<string name="anim_yes_head">Yes</string>
-
+
<!-- world map -->
<string name="texture_loading">Loading...</string>
<string name="worldmap_offline">Offline</string>
<string name="worldmap_results_none_found">None found.</string>
-
+
<!-- animations uploading status codes -->
<string name="Ok">OK</string>
<string name="Premature end of file">Premature end of file</string>
<string name="ST_NO_JOINT">Can't find ROOT or JOINT.</string>
-
+
<!-- Chat -->
<string name="whisper">whispers:</string>
<string name="shout">shouts:</string>
@@ -274,7 +274,7 @@
<string name="SIM_ACCESS_ADULT">Adult</string>
<string name="SIM_ACCESS_DOWN">Offline</string>
<string name="SIM_ACCESS_MIN">Unknown</string>
-
+
<!-- For use when we do not have land type back from the server -->
<string name="land_type_unknown">(unknown)</string>
@@ -294,14 +294,14 @@
<string name="compressed_image_files">Compressed Images</string>
<string name="load_files">Load Files</string>
<string name="choose_the_directory">Choose Directory</string>
-
+
<!-- LSL Usage Hover Tips -->
<!-- NOTE: For now these are set as translate="false", until DEV-40761 is implemented (to internationalize the rest of tooltips in the same window).
This has no effect on viewer code, but prevents Linden Lab internal localization tool from scraping these strings. -->
<string name="LSLTipSleepTime" translate="false">
Sleeps script for [SLEEP_TIME] seconds.
</string>
-
+
<string name="LSLTipText_llSin" translate="false">
float llSin(float theta)
Returns the sine of theta (theta in radians)
@@ -1732,7 +1732,7 @@ Returns the value for header for request_id
</string>
<string name="LSLTipText_llSetPrimMediaParams" translate="false">
llSetPrimMediaParams(integer face, list params)
-Sets the media params for a particular face on an object. If media is not already on this object, add it.
+Sets the media params for a particular face on an object. If media is not already on this object, add it.
List is a set of name/value pairs in no particular order. Params not specified are unchanged, or if new media is added then set to the default specified.
The possible names are below, along with the types of values and what they mean.
</string>
@@ -1751,7 +1751,7 @@ Clears (deletes) the media and all params from the given face.
<string name="AvatarSetAway">Away</string>
<string name="AvatarSetNotBusy">Not Busy</string>
<string name="AvatarSetBusy">Busy</string>
-
+
<!-- Wearable Types -->
<string name="shape">Shape</string>
<string name="skin">Skin</string>
@@ -1769,7 +1769,7 @@ Clears (deletes) the media and all params from the given face.
<string name="alpha">Alpha</string>
<string name="tattoo">Tattoo</string>
<string name="invalid">invalid</string>
-
+
<!-- notify -->
<string name="next">Next</string>
<string name="ok">OK</string>
@@ -1785,8 +1785,8 @@ Clears (deletes) the media and all params from the given face.
<string name="StartUpNotifications">New notifications arrived while you were away.</string>
<!-- overflow toast's string-->
<string name="OverflowInfoChannelString">You have %d more notification</string>
-
-
+
+
<!-- body parts -->
<string name="BodyPartsRightArm">Right Arm</string>
<string name="BodyPartsHead">Head</string>
@@ -1799,10 +1799,10 @@ Clears (deletes) the media and all params from the given face.
<string name="GraphicsQualityLow">Low</string>
<string name="GraphicsQualityMid">Mid</string>
<string name="GraphicsQualityHigh">High</string>
-
+
<!-- mouselook -->
<string name="LeaveMouselook">Press ESC to return to World View</string>
-
+
<!-- inventory -->
<string name="InventoryNoMatchingItems">No matching items found in inventory.</string>
<string name="InventoryNoTexture">
@@ -1830,7 +1830,7 @@ this texture in your inventory
<string name="Wave" value=" Wave " />
<string name="HelloAvatar" value=" Hello, avatar! " />
<string name="ViewAllGestures" value=" View All &gt;&gt;" />
-
+
<!-- inventory filter -->
<!-- use value="" because they have preceding spaces -->
<string name="Animations" value=" Animations," />
@@ -1880,21 +1880,21 @@ this texture in your inventory
<!-- inventory FVBridge -->
<string name="Buy">Buy</string>
<string name="BuyforL$">Buy for L$</string>
-
+
<string name="Stone">Stone</string>
<string name="Metal">Metal</string>
<string name="Glass">Glass</string>
<string name="Wood">Wood</string>
<string name="Flesh">Flesh</string>
<string name="Plastic">Plastic</string>
- <string name="Rubber">Rubber</string>
+ <string name="Rubber">Rubber</string>
<string name="Light">Light</string>
-
+
<!-- keyboard -->
<string name="KBShift">Shift</string>
<string name="KBCtrl">Ctrl</string>
- <!-- Avatar Skeleton -->
+ <!-- Avatar Skeleton -->
<string name="Chest">Chest</string>
<string name="Skull">Skull</string>
<string name="Left Shoulder">Left Shoulder</string>
@@ -1924,7 +1924,7 @@ this texture in your inventory
<string name="L Lower Leg">L Lower Leg</string>
<string name="Stomach">Stomach</string>
<string name="Left Pec">Left Pec</string>
- <string name="Right Pec">Right Pec</string>
+ <string name="Right Pec">Right Pec</string>
<!-- Avatar age computation, see LLDateUtil::ageFromDate -->
<string name="YearsMonthsOld">[AGEYEARS] [AGEMONTHS] old</string>
@@ -1933,7 +1933,7 @@ this texture in your inventory
<string name="WeeksOld">[AGEWEEKS] old</string>
<string name="DaysOld">[AGEDAYS] old</string>
<string name="TodayOld">Joined today</string>
-
+
<!-- AgeYearsA = singular,
AgeYearsB = plural,
AgeYearsC = plural for non-English languages like Russian
@@ -1966,16 +1966,16 @@ this texture in your inventory
<string name="NoPaymentInfoOnFile">No Payment Info On File</string>
<string name="AgeVerified">Age-verified</string>
<string name="NotAgeVerified">Not Age-verified</string>
-
- <!-- HUD Position -->
- <string name="Center 2">Center 2</string>
- <string name="Top Right">Top Right</string>
- <string name="Top">Top</string>
- <string name="Top Left">Top Left</string>
- <string name="Center">Center</string>
- <string name="Bottom Left">Bottom Left</string>
- <string name="Bottom">Bottom</string>
- <string name="Bottom Right">Bottom Right</string>
+
+ <!-- HUD Position -->
+ <string name="Center 2">Center 2</string>
+ <string name="Top Right">Top Right</string>
+ <string name="Top">Top</string>
+ <string name="Top Left">Top Left</string>
+ <string name="Center">Center</string>
+ <string name="Bottom Left">Bottom Left</string>
+ <string name="Bottom">Bottom</string>
+ <string name="Bottom Right">Bottom Right</string>
<!-- compile queue-->
<string name="CompileQueueDownloadedCompiling">Downloaded, now compiling</string>
@@ -1997,11 +1997,11 @@ this texture in your inventory
<string name="CompileSuccessful">Compile successful!</string>
<string name="CompileSuccessfulSaving">Compile successful, saving...</string>
<string name="SaveComplete">Save complete.</string>
- <string name="ObjectOutOfRange">Script (object out of range)</string>
-
+ <string name="ObjectOutOfRange">Script (object out of range)</string>
+
<!-- god tools -->
<string name="GodToolsObjectOwnedBy">Object [OBJECT] owned by [OWNER]</string>
-
+
<!-- groups -->
<string name="GroupsNone">none</string>
<string name="Group" value=" (group)" />
@@ -2012,14 +2012,14 @@ this texture in your inventory
<string name="Balance">Balance</string>
<string name="Credits">Credits</string>
<string name="Debits">Debits</string>
- <string name="Total">Total</string>
- <string name="NoGroupDataFound">No group data found for group </string>
-
+ <string name="Total">Total</string>
+ <string name="NoGroupDataFound">No group data found for group </string>
+
<!-- floater IM -->
<string name="IMParentEstate">parent estate</string>
<string name="IMMainland">mainland</string>
<string name="IMTeen">teen</string>
-
+
<!-- floater region info -->
<!-- The following will replace variable [ALL_ESTATES] in notifications EstateAllowed*, EstateBanned*, EstateManager* -->
<string name="RegionInfoError">error</string>
@@ -2035,45 +2035,37 @@ this texture in your inventory
<!-- script editor -->
<string name="CursorPos">Line [LINE], Column [COLUMN]</string>
-
+
<!-- panel dir browser -->
<string name="PanelDirCountFound">[COUNT] found</string>
<string name="PanelDirTimeStr">[hour12,datetime,slt]:[min,datetime,slt] [ampm,datetime,slt]</string>
<!-- panel dir events -->
<string name="PanelDirEventsDateText">[mthnum,datetime,slt]/[day,datetime,slt]</string>
-
+
<!-- panel contents -->
<string name="PanelContentsNewScript">New Script</string>
-
+
<!-- Mute -->
<string name="MuteByName">(by name)</string>
<string name="MuteAgent">(resident)</string>
<string name="MuteObject">(object)</string>
<string name="MuteGroup">(group)</string>
-
+
<!-- Region/Estate Covenant -->
<string name="RegionNoCovenant">There is no Covenant provided for this Estate.</string>
<string name="RegionNoCovenantOtherOwner">There is no Covenant provided for this Estate. The land on this estate is being sold by the Estate owner, not Linden Lab. Please contact the Estate Owner for sales details.</string>
<string name="covenant_last_modified">Last Modified:</string>
<string name="none_text" value=" (none) " />
<string name="never_text" value=" (never) " />
-
+
<!--Region Details-->
<string name="GroupOwned">Group Owned</string>
<string name="Public">Public</string>
-
+
<!-- panel classified -->
<string name="ClassifiedClicksTxt">Clicks: [TELEPORT] teleport, [MAP] map, [PROFILE] profile</string>
<string name="ClassifiedUpdateAfterPublish">(will update after publish)</string>
-
- <!-- group voting dialog -->
- <string name="GroupVoteYes">Yes</string>
- <string name="GroupVoteNo">No</string>
- <string name="GroupVoteNoActiveProposals">There are currently no active proposals</string>
- <string name="GroupVoteNoArchivedProposals">There are currently no archived proposals</string>
- <string name="GroupVoteRetrievingArchivedProposals">Retrieving archived proposals</string>
- <string name="GroupVoteRetrievingActiveProposals">Retrieving active proposals</string>
<!-- Multi Preview Floater -->
<string name="MultiPreviewTitle">Preview</string>
@@ -2088,7 +2080,7 @@ this texture in your inventory
<string name="InvOfferGaveYou">gave you</string>
<string name="InvOfferYouDecline">You decline</string>
<string name="InvOfferFrom">from</string>
-
+
<!-- group money -->
<string name="GroupMoneyTotal">Total</string>
<string name="GroupMoneyBought">bought</string>
@@ -2100,21 +2092,21 @@ this texture in your inventory
<string name="GroupMoneyBalance">Balance</string>
<string name="GroupMoneyCredits">Credits</string>
<string name="GroupMoneyDebits">Debits</string>
-
+
<!-- viewer object -->
<string name="ViewerObjectContents">Contents</string>
-
+
<!-- Viewer menu -->
<string name="AcquiredItems">Acquired Items</string>
- <string name="Cancel">Cancel</string>
- <string name="UploadingCosts">Uploading %s costs</string>
+ <string name="Cancel">Cancel</string>
+ <string name="UploadingCosts">Uploading %s costs</string>
<string name="UnknownFileExtension">
Unknown file extension .%s
Expected .wav, .tga, .bmp, .jpg, .jpeg, or .bvh
- </string>
- <string name="AddLandmarkNavBarMenu">Add Landmark...</string>
+ </string>
+ <string name="AddLandmarkNavBarMenu">Add Landmark...</string>
<string name="EditLandmarkNavBarMenu">Edit Landmark...</string>
-
+
<!-- menu accelerators -->
<string name="accel-mac-control">&#8963;</string>
<string name="accel-mac-command">&#8984;</string>
@@ -2125,72 +2117,72 @@ Expected .wav, .tga, .bmp, .jpg, .jpeg, or .bvh
<string name="accel-win-shift">Shift+</string>
<!-- Previews -->
- <string name="FileSaved">File Saved</string>
- <string name="Receiving">Receiving</string>
-
+ <string name="FileSaved">File Saved</string>
+ <string name="Receiving">Receiving</string>
+
<!-- status bar , Time -->
- <string name="AM">AM</string>
- <string name="PM">PM</string>
- <string name="PST">PST</string>
- <string name="PDT">PDT</string>
+ <string name="AM">AM</string>
+ <string name="PM">PM</string>
+ <string name="PST">PST</string>
+ <string name="PDT">PDT</string>
<!-- Directions, HUD -->
- <string name="Forward">Forward</string>
- <string name="Left">Left</string>
- <string name="Right">Right</string>
- <string name="Back">Back</string>
- <string name="North">North</string>
- <string name="South">South</string>
- <string name="West">West</string>
- <string name="East">East</string>
- <string name="Up">Up</string>
- <string name="Down">Down</string>
+ <string name="Forward">Forward</string>
+ <string name="Left">Left</string>
+ <string name="Right">Right</string>
+ <string name="Back">Back</string>
+ <string name="North">North</string>
+ <string name="South">South</string>
+ <string name="West">West</string>
+ <string name="East">East</string>
+ <string name="Up">Up</string>
+ <string name="Down">Down</string>
<!-- Search Category Strings -->
- <string name="Any Category">Any Category</string>
- <string name="Shopping">Shopping</string>
- <string name="Land Rental">Land Rental</string>
- <string name="Property Rental">Property Rental</string>
- <string name="Special Attraction">Special Attraction</string>
- <string name="New Products">New Products</string>
- <string name="Employment">Employment</string>
- <string name="Wanted">Wanted</string>
- <string name="Service">Service</string>
- <string name="Personal">Personal</string>
+ <string name="Any Category">Any Category</string>
+ <string name="Shopping">Shopping</string>
+ <string name="Land Rental">Land Rental</string>
+ <string name="Property Rental">Property Rental</string>
+ <string name="Special Attraction">Special Attraction</string>
+ <string name="New Products">New Products</string>
+ <string name="Employment">Employment</string>
+ <string name="Wanted">Wanted</string>
+ <string name="Service">Service</string>
+ <string name="Personal">Personal</string>
<!-- PARCEL_CATEGORY_UI_STRING -->
- <string name="None">None</string>
- <string name="Linden Location">Linden Location</string>
- <string name="Adult">Adult</string>
- <string name="Arts&amp;Culture">Arts &amp; Culture</string>
- <string name="Business">Business</string>
- <string name="Educational">Educational</string>
- <string name="Gaming">Gaming</string>
- <string name="Hangout">Hangout</string>
- <string name="Newcomer Friendly">Newcomer Friendly</string>
+ <string name="None">None</string>
+ <string name="Linden Location">Linden Location</string>
+ <string name="Adult">Adult</string>
+ <string name="Arts&amp;Culture">Arts &amp; Culture</string>
+ <string name="Business">Business</string>
+ <string name="Educational">Educational</string>
+ <string name="Gaming">Gaming</string>
+ <string name="Hangout">Hangout</string>
+ <string name="Newcomer Friendly">Newcomer Friendly</string>
<string name="Parks&amp;Nature">Parks &amp; Nature</string>
- <string name="Residential">Residential</string>
+ <string name="Residential">Residential</string>
<!--<string name="Shopping">Shopping</string> -->
- <string name="Stage">Stage</string>
- <string name="Other">Other</string>
- <string name="Any">Any</string>
- <string name="You">You</string>
-
+ <string name="Stage">Stage</string>
+ <string name="Other">Other</string>
+ <string name="Any">Any</string>
+ <string name="You">You</string>
+
<!-- punctuations -->
- <string name=":">:</string>
- <string name=",">,</string>
- <string name="...">...</string>
- <string name="***">***</string>
- <string name="(">(</string>
+ <string name=":">:</string>
+ <string name=",">,</string>
+ <string name="...">...</string>
+ <string name="***">***</string>
+ <string name="(">(</string>
<string name=")">)</string>
- <string name=".">.</string>
- <string name="'">'</string>
- <string name="---">---</string>
+ <string name=".">.</string>
+ <string name="'">'</string>
+ <string name="---">---</string>
<!-- media -->
<string name="Multiple Media">Multiple Media</string>
<string name="Play Media">Play/Pause Media</string>
-
+
<!-- OSMessageBox messages -->
<string name="MBCmdLineError">
An error was found parsing the command line.
@@ -2799,13 +2791,13 @@ If you continue to receive this message, contact the [SUPPORT_SITE].
<string name="Wide Lips">Wide Lips</string>
<string name="Wild">Wild</string>
<string name="Wrinkles">Wrinkles</string>
-
+
<!-- Favorites Bar -->
<string name="LocationCtrlAddLandmarkTooltip">Add to My Landmarks</string>
<string name="LocationCtrlEditLandmarkTooltip">Edit My Landmark</string>
<string name="LocationCtrlInfoBtnTooltip">See more info about the current location</string>
<string name="LocationCtrlComboBtnTooltip">My location history</string>
-
+
<!-- Strings used by the (currently Linux) auto-updater app -->
<string name="UpdaterWindowTitle">
[APP_NAME] Update
@@ -2867,9 +2859,6 @@ If you continue to receive this message, contact the [SUPPORT_SITE].
<string name="inventory_item_offered-im">
Inventory item offered
</string>
- <string name="share_alert">
- Drag items from inventory here
- </string>
<string name="only_user_message">
You are the only user in this session.
diff --git a/indra/newview/skins/default/xui/en/widgets/chiclet_script.xml b/indra/newview/skins/default/xui/en/widgets/chiclet_script.xml
new file mode 100644
index 0000000000..5011bf6a61
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/widgets/chiclet_script.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<chiclet_script
+ name="script_chiclet">
+ <icon
+ name="chiclet_icon"
+ follows="all"
+ mouse_opaque="false"
+ image_name="Generic_Object_Small" />
+</expandable_text> \ No newline at end of file
diff --git a/indra/newview/skins/default/xui/es/floater_media_browser.xml b/indra/newview/skins/default/xui/es/floater_media_browser.xml
index ff50b56a32..cdc7ae49ff 100644
--- a/indra/newview/skins/default/xui/es/floater_media_browser.xml
+++ b/indra/newview/skins/default/xui/es/floater_media_browser.xml
@@ -1,5 +1,11 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="floater_about" title="NAVEGADOR">
+ <floater.string name="home_page_url">
+ http://es.secondlife.com
+ </floater.string>
+ <floater.string name="support_page_url">
+ http://es.secondlife.com/support
+ </floater.string>
<layout_stack name="stack1">
<layout_panel name="nav_controls">
<button label="Atrás" name="back" width="75"/>
diff --git a/indra/newview/skins/default/xui/es/menu_viewer.xml b/indra/newview/skins/default/xui/es/menu_viewer.xml
index 33754f3935..fdb6a92084 100644
--- a/indra/newview/skins/default/xui/es/menu_viewer.xml
+++ b/indra/newview/skins/default/xui/es/menu_viewer.xml
@@ -1,5 +1,11 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<menu_bar name="Main Menu">
+ <menu name="Me">
+ <menu_item_call label="Preferencias" name="Preferences"/>
+ <menu_item_call name="Manage My Account">
+ <menu_item_call.on_click name="ManageMyAccount_url" parameter="WebLaunchJoinNow,http://secondlife.com/account/index.php?lang=es" />
+ </menu_item_call>
+ </menu>
<menu label="Archivo" name="File">
<tearoff_menu label="~~~~~~~~~~~" name="~~~~~~~~~~~"/>
<menu label="Subir" name="upload">
diff --git a/indra/newview/skins/default/xui/es/notifications.xml b/indra/newview/skins/default/xui/es/notifications.xml
index 86f3f1f125..6b58bbea47 100644
--- a/indra/newview/skins/default/xui/es/notifications.xml
+++ b/indra/newview/skins/default/xui/es/notifications.xml
@@ -374,10 +374,13 @@ La carpeta del vestuario contiene partes del cuerpo, u objetos a anexar o que no
Debe escribir tanto el nombre como el apellido de su avatar, los dos.
Necesita una cuenta para entrar en [SECOND_LIFE]. ¿Quiere crear una ahora?
+ <url name="url">
+ https://join.secondlife.com/index.php?lang=es-ES
+ </url>
<usetemplate name="okcancelbuttons" notext="Volver a intentarlo" yestext="Crear una cuenta nueva"/>
</notification>
<notification name="AddClassified">
- Los anuncios clasificados aparecen durante una semana en la sección &apos;Clasificados&apos; del directorio Buscar y en www.secondlife.com.
+ Los anuncios clasificados aparecen durante una semana en la sección &apos;Clasificados&apos; del directorio Buscar y en [http://secondlife.com/community/classifieds/?lang=es-ES secondlife.com].
Rellene su anuncio y pulse &apos;Publicar...&apos; para añadirlo al directorio.
Cuando pulse Publicar, se le preguntará por un precio a pagar.
El pagar más hará que su anuncio aparezca más arriba en la lista, y que también aparezca más arriba cuando la gente busque por palabras clave.
@@ -398,6 +401,9 @@ No se reembolsan las cuotas pagadas.
</notification>
<notification name="PromptGoToEventsPage">
¿Ir a la web de eventos de [SECOND_LIFE]?
+ <url name="url">
+ http://secondlife.com/events/?lang=es-ES
+ </url>
<usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
</notification>
<notification name="SelectProposalToView">
@@ -575,6 +581,9 @@ misma región.
[EXTRA]
¿Ir a [_URL] para informarse sobre la compra de L$?
+ <url name="url">
+ http://secondlife.com/app/currency/?lang=es-ES
+ </url>
<usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
</notification>
<notification name="UnableToLinkObjects">
@@ -1140,13 +1149,16 @@ Puede usar normalmente [SECOND_LIFE], los demás residentes le verán correctame
Se ha completado la instalación de [APP_NAME].
Si esta es la primera vez que usa [SECOND_LIFE], deberá crear una cuenta antes de que pueda iniciar una sesión.
-¿Volver a www.secondlife.com para crear una cuenta nueva?
+¿Volver a [https://join.secondlife.com/index.php?lang=es-ES secondlife.com] para crear una cuenta nueva?
<usetemplate name="okcancelbuttons" notext="Continuar" yestext="Cuenta nueva..."/>
</notification>
<notification name="LoginPacketNeverReceived">
Tenemos problemas de conexión. Puede deberse a un problema de su conexión a internet o de los servidores de [SECOND_LIFE].
Puede revisar su conexión a internet y volver a intentarlo en unos minutos. Pulse Ayuda para conectarse a nuestro sitio de Sporte, o pulse Teleportar para intentar teleportarse a su Base.
+ <url name="url">
+ http://es.secondlife.com/support/
+ </url>
<form name="form">
<button name="OK" text="OK"/>
<button name="Help" text="Ayuda"/>
@@ -1520,7 +1532,7 @@ Por favor, compruebe que tiene instalado el último visor, y vaya a la Base de C
¿Quiere ir a la Base de Conocimientos para aprender más sobre el nivel de calificación?
<url name="url">
- https://support.secondlife.com/ics/support/default.asp?deptID=4417&amp;task=knowledge&amp;questionID=6010
+ http://wiki.secondlife.com/wiki/Linden_Lab_Official:Maturity_ratings:_an_overview/es
</url>
<usetemplate
name="okcancelignore"
@@ -1559,7 +1571,7 @@ Por favor, compruebe que tiene instalado el último visor, y vaya a la Base de C
¿Quiere ir a la Base de Conocimientos para más información sobre el nivel de calificación?
<url name="url">
- https://support.secondlife.com/ics/support/default.asp?deptID=4417&amp;task=knowledge&amp;questionID=6010
+ http://wiki.secondlife.com/wiki/Linden_Lab_Official:Maturity_ratings:_an_overview/es
</url>
<usetemplate
name="okcancelignore"
@@ -1593,7 +1605,7 @@ Por favor, compruebe que tiene instalado el último visor, y vaya a la Base de C
¿Quiere ir a la Base de Conocimientos para más información sobre el nivel de calificación?
<url name="url">
- https://support.secondlife.com/ics/support/default.asp?deptID=4417&amp;task=knowledge&amp;questionID=6010
+ http://wiki.secondlife.com/wiki/Linden_Lab_Official:Maturity_ratings:_an_overview/es
</url>
<usetemplate
name="okcancelignore"
@@ -2014,10 +2026,7 @@ Dado que estos objetos tienen scripts, moverlos a su inventario puede provocar u
<usetemplate ignoretext="Cuando esté saliendo de [APP_NAME]." name="okcancelignore" notext="Continuar" yestext="Salir"/>
</notification>
<notification name="HelpReportAbuseEmailLL">
- Use esta herramienta para denunciar violaciones de las Normas de la Comunidad y las Condiciones del Servicio. Vea:
-
-http://secondlife.com/corporate/tos.php
-http://secondlife.com/corporate/cs.php
+ Use esta herramienta para denunciar violaciones de las [http://secondlife.com/corporate/tos.php?lang=es-ES Condiciones del Servicio] y las [http://secondlife.com/corporate/cs.php?lang=es-ES Normas de la Comunidad].
Se investigan y resuelven todas las infracciones denunciadas de las Normas de la Comunidad y las Condiciones del Servicio. Puede ver la resolución tomada en el Informe de Incidentes, en:
diff --git a/indra/newview/skins/default/xui/es/panel_login.xml b/indra/newview/skins/default/xui/es/panel_login.xml
index 6505424b35..52c3855d6a 100644
--- a/indra/newview/skins/default/xui/es/panel_login.xml
+++ b/indra/newview/skins/default/xui/es/panel_login.xml
@@ -1,11 +1,12 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="panel_login">
- <string name="real_url">
- http://secondlife.com/app/login/
- </string>
- <string name="forgot_password_url">
- http://secondlife.com/account/request.php
- </string>
+ <panel.string name="create_account_url">
+ http://join.secondlife.com/index.php?lang=es-ES
+ </panel.string>
+ <panel.string name="forgot_password_url">
+ http://secondlife.com/account/request.php?lang=es
+ </panel.string>
+<panel name="login_widgets">
<text name="first_name_text">
Nombre:
</text>
@@ -35,3 +36,4 @@
[VERSION]
</text>
</panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/es/panel_profile.xml b/indra/newview/skins/default/xui/es/panel_profile.xml
new file mode 100644
index 0000000000..218e03dcce
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/panel_profile.xml
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="panel_profile">
+ <string name="CaptionTextAcctInfo">
+ [ACCTTYPE]
+[PAYMENTINFO] [AGEVERIFICATION]
+ </string>
+ <string name="payment_update_link_url">
+ http://www.secondlife.com/account/billing.php?lang=es-ES
+ </string>
+ <string name="partner_edit_link_url">
+ http://www.secondlife.com/account/partners.php?lang=es
+ </string>
+ <string name="my_account_link_url" value="http://secondlife.com/my/account/index.php?lang=es-ES"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/es/strings.xml b/indra/newview/skins/default/xui/es/strings.xml
index 294e407278..dc508f7c37 100644
--- a/indra/newview/skins/default/xui/es/strings.xml
+++ b/indra/newview/skins/default/xui/es/strings.xml
@@ -4,6 +4,7 @@
For example, the strings used in avatar chat bubbles, and strings
that are returned from one component and may appear in many places-->
<strings>
+ <string name="create_account_url">http://join.secondlife.com/index.php?lang=es-ES</string>
<string name="LoginInProgress">
Iniciando la sesión. [APP_NAME] debe de aparecer congelado. Por favor, espere.
</string>
diff --git a/indra/newview/skins/default/xui/fr/floater_media_browser.xml b/indra/newview/skins/default/xui/fr/floater_media_browser.xml
index 44ab075271..986deaabc9 100644
--- a/indra/newview/skins/default/xui/fr/floater_media_browser.xml
+++ b/indra/newview/skins/default/xui/fr/floater_media_browser.xml
@@ -1,10 +1,10 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="floater_about" title="NAVIGATEUR">
<floater.string name="home_page_url">
- http://www.secondlife.com
+ http://fr.secondlife.com
</floater.string>
<floater.string name="support_page_url">
- http://support.secondlife.com
+ http://fr.secondlife.com/support
</floater.string>
<layout_stack name="stack1">
<layout_panel name="nav_controls">
diff --git a/indra/newview/skins/default/xui/fr/menu_viewer.xml b/indra/newview/skins/default/xui/fr/menu_viewer.xml
index ea28b82d7e..532714531b 100644
--- a/indra/newview/skins/default/xui/fr/menu_viewer.xml
+++ b/indra/newview/skins/default/xui/fr/menu_viewer.xml
@@ -1,5 +1,11 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<menu_bar name="Main Menu">
+ <menu name="Me">
+ <menu_item_call label="Préférences" name="Preferences"/>
+ <menu_item_call name="Manage My Account">
+ <menu_item_call.on_click name="ManageMyAccount_url" parameter="WebLaunchJoinNow,http://secondlife.com/account/index.php?lang=fr" />
+ </menu_item_call>
+ </menu>
<menu label="Fichier" name="File">
<tearoff_menu label="~~~~~~~~~~~" name="~~~~~~~~~~~"/>
<menu label="Importer" name="upload">
diff --git a/indra/newview/skins/default/xui/fr/notifications.xml b/indra/newview/skins/default/xui/fr/notifications.xml
index 7f6960c8fb..558b04d68e 100644
--- a/indra/newview/skins/default/xui/fr/notifications.xml
+++ b/indra/newview/skins/default/xui/fr/notifications.xml
@@ -285,7 +285,7 @@ Vous devez saisir le nom et le prénom de votre avatar.
Pour entrer dans [SECOND_LIFE], vous devez avoir un compte. Voulez-vous en créer un maintenant ?
<url name="url">
- http://join.secondlife.com/
+ https://join.secondlife.com/index.php?lang=fr-FR
</url>
<usetemplate name="okcancelbuttons" notext="Réessayer" yestext="Créer un compte"/>
</notification>
@@ -312,7 +312,7 @@ Une fois payés, les frais ne sont pas remboursables.
<notification name="PromptGoToEventsPage">
Aller à la page web de [SECOND_LIFE] réservée aux événements ?
<url name="url">
- http://secondlife.com/events/
+ http://secondlife.com/events/?lang=fr-FR
</url>
<usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/>
</notification>
@@ -493,7 +493,7 @@ Veuillez mettre tous les objets que vous souhaitez acquérir dans la même régi
Aller sur [_URL] pour obtenir des informations sur l&apos;achat de L$ ?
<url name="url">
- http://secondlife.com/app/currency/
+ http://secondlife.com/app/currency/?lang=fr-FR
</url>
<usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/>
</notification>
@@ -1038,7 +1038,7 @@ Vous pouvez utiliser [SECOND_LIFE] normalement, les autres résidents vous voien
L&apos;installation de [APP_NAME] est terminée.
S&apos;il s&apos;agit de la première fois que vous utilisez [SECOND_LIFE], vous devrez créer un compte avant de pouvoir vous connecter.
-Retourner sur www.secondlife.com pour créer un nouveau compte ?
+Retourner sur [https://join.secondlife.com/index.php?lang=fr-FR secondlife.com] pour créer un nouveau compte ?
<usetemplate name="okcancelbuttons" notext="Continuer" yestext="Nouveau compte..."/>
</notification>
<notification name="LoginPacketNeverReceived">
@@ -1046,7 +1046,7 @@ Retourner sur www.secondlife.com pour créer un nouveau compte ?
Vérifiez votre connextion Internet et réessayez dans quelques minutes, cliquez sur Aide pour consulter la page [SUPPORT_SITE] ou bien sur Téléporter pour essayer d&apos;aller chez vous.
<url name="url">
- http://secondlife.com/support/
+ http://fr.secondlife.com/support/
</url>
<form name="form">
<button name="OK" text="OK"/>
@@ -1436,7 +1436,7 @@ Vérifiez que vous avez la toute dernière version du client et consultez les pa
Souhaitez-vous en savoir plus sur les différentes catégories d&apos;accès ?
<url name="url">
- http://wiki.secondlife.com/wiki/Pr%C3%A9sentation_des_cat%C3%A9gories_de_contenu_(KB)
+ http://wiki.secondlife.com/wiki/Linden_Lab_Official:Maturity_ratings:_an_overview/fr
</url>
<usetemplate ignoretext="Je ne peux pas pénétrer dans cette région car je n&apos;ai pas accès à cette catégorie de contenu" name="okcancelignore" notext="Fermer" yestext="Consulter les pages d&apos;aide"/>
</notification>
@@ -1464,7 +1464,7 @@ Vérifiez que vous avez la toute dernière version du client et consultez les pa
Souhaitez-vous en savoir plus sur les différentes catégories d&apos;accès ?
<url name="url">
- http://wiki.secondlife.com/wiki/Pr%C3%A9sentation_des_cat%C3%A9gories_de_contenu_(KB)
+ http://wiki.secondlife.com/wiki/Linden_Lab_Official:Maturity_ratings:_an_overview/fr
</url>
<usetemplate ignoretext="Je ne peux pas réclamer cette région car je n&apos;ai pas accès à cette catégorie de contenu" name="okcancelignore" notext="Fermer" yestext="Consulter les pages d&apos;aide"/>
</notification>
@@ -1488,7 +1488,7 @@ Vérifiez que vous avez la toute dernière version du client et consultez les pa
Souhaitez-vous en savoir plus sur les différentes catégories d&apos;accès ?
<url name="url">
- http://wiki.secondlife.com/wiki/Pr%C3%A9sentation_des_cat%C3%A9gories_de_contenu_(KB)
+ http://wiki.secondlife.com/wiki/Linden_Lab_Official:Maturity_ratings:_an_overview/fr
</url>
<usetemplate ignoretext="Je ne peux pas acheter ce terrain car je n&apos;ai pas accès à cette catégorie de contenu" name="okcancelignore" notext="Fermer" yestext="Consulter les pages d&apos;aide"/>
</notification>
@@ -1672,10 +1672,7 @@ Déplacer les objets de l&apos;inventaire ?
<usetemplate ignoretext="Confirmer avant de quitter" name="okcancelignore" notext="Ne pas quitter" yestext="Quitter"/>
</notification>
<notification name="HelpReportAbuseEmailLL">
- Utilisez cet outil pour signaler des infractions aux Conditions d&apos;utilisation et aux Règles de la communauté. Voir :
-
-http://secondlife.com/corporate/tos.php
-http://secondlife.com/corporate/cs.php
+ Utilisez cet outil pour signaler des infractions aux [http://secondlife.com/corporate/tos.php?lang=fr-FR Conditions d&apos;utilisation] et aux [http://secondlife.com/corporate/cs.php?lang=fr-FR Règles de la communauté].
Lorsqu&apos;elles sont signalées, toutes les infractions aux Conditions d&apos;utilisation et aux Règles de la communauté font l&apos;objet d&apos;une enquête et sont résolues. Pour accéder aux détails de la résolution d&apos;un incident, allez sur :
diff --git a/indra/newview/skins/default/xui/fr/panel_login.xml b/indra/newview/skins/default/xui/fr/panel_login.xml
index 284590cd5d..f7ab2891e8 100644
--- a/indra/newview/skins/default/xui/fr/panel_login.xml
+++ b/indra/newview/skins/default/xui/fr/panel_login.xml
@@ -1,10 +1,10 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="panel_login">
<panel.string name="create_account_url">
- http://secondlife.com/registration/
+ http://fr.secondlife.com/registration/
</panel.string>
<panel.string name="forgot_password_url">
- http://secondlife.com/account/request.php
+ http://secondlife.com/account/request.php?lang=fr
</panel.string>
<panel name="login_widgets">
<line_editor name="first_name_edit" tool_tip="Prénom sur [SECOND_LIFE]"/>
diff --git a/indra/newview/skins/default/xui/fr/panel_pick_info.xml b/indra/newview/skins/default/xui/fr/panel_pick_info.xml
new file mode 100644
index 0000000000..642e31a2c3
--- /dev/null
+++ b/indra/newview/skins/default/xui/fr/panel_pick_info.xml
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="panel_pick_info">
+ <text name="title" value="Infos"/>
+ <scroll_container name="profile_scroll">
+ <panel name="scroll_content_panel">
+ <text name="pick_name" value="[name]"/>
+ <text name="pick_location" value="[chargement...]"/>
+ <text name="pick_desc" value="[description]"/>
+ </panel>
+ </scroll_container>
+ <panel name="buttons">
+ <button label="Téléporter" name="teleport_btn"/>
+ <button label="Carte" name="show_on_map_btn"/>
+ <button label="Éditer" name="edit_btn"/>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/fr/panel_profile.xml b/indra/newview/skins/default/xui/fr/panel_profile.xml
index e13de7a5d1..dc28547cb4 100644
--- a/indra/newview/skins/default/xui/fr/panel_profile.xml
+++ b/indra/newview/skins/default/xui/fr/panel_profile.xml
@@ -1,12 +1,16 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel label="Profil" name="panel_profile">
<string name="CaptionTextAcctInfo">
- [ACCTTYPE] [PAYMENTINFO] [AGEVERIFICATION]
+ [ACCTTYPE]
+[PAYMENTINFO] [AGEVERIFICATION]
</string>
<string name="payment_update_link_url">
- http://www.secondlife.com/account/billing.php?lang=en
+ http://www.secondlife.com/account/billing.php?lang=fr-FR
</string>
- <string name="my_account_link_url" value="http://secondlife.com/account"/>
+ <string name="partner_edit_link_url">
+ http://www.secondlife.com/account/partners.php?lang=fr
+ </string>
+ <string name="my_account_link_url" value="http://secondlife.com/my/account/index.php?lang=fr-FR"/>
<string name="no_partner_text" value="Aucun"/>
<scroll_container name="profile_scroll">
<panel name="scroll_content_panel">
diff --git a/indra/newview/skins/default/xui/fr/strings.xml b/indra/newview/skins/default/xui/fr/strings.xml
index 2d0df66f18..c59e359d6e 100644
--- a/indra/newview/skins/default/xui/fr/strings.xml
+++ b/indra/newview/skins/default/xui/fr/strings.xml
@@ -4,6 +4,7 @@
For example, the strings used in avatar chat bubbles, and strings
that are returned from one component and may appear in many places-->
<strings>
+ <string name="create_account_url">http://join.secondlife.com/index.php?lang=fr-FR</string>
<string name="SECOND_LIFE">
Second Life
</string>
@@ -158,7 +159,7 @@
Cliquez pour exécuter la commande secondlife:// command
</string>
<string name="BUTTON_CLOSE_DARWIN">
- Fermer (⌘-W)
+ Fermer (&#8984;W)
</string>
<string name="BUTTON_CLOSE_WIN">
Fermer (Ctrl+W)
@@ -1311,16 +1312,16 @@
Modifier le repère...
</string>
<string name="accel-mac-control">
- ⌃
+ &#8963;
</string>
<string name="accel-mac-command">
- ⌘
+ &#8984;
</string>
<string name="accel-mac-option">
- ⌥
+ &#8997;
</string>
<string name="accel-mac-shift">
- ⇧
+ &#8679;
</string>
<string name="accel-win-control">
Ctrl+
diff --git a/indra/newview/skins/default/xui/it/floater_media_browser.xml b/indra/newview/skins/default/xui/it/floater_media_browser.xml
index 7a5f9c9fcb..0e25cef60b 100644
--- a/indra/newview/skins/default/xui/it/floater_media_browser.xml
+++ b/indra/newview/skins/default/xui/it/floater_media_browser.xml
@@ -1,5 +1,11 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="floater_about" title="BROWSER MULTIMEDIALE">
+ <floater.string name="home_page_url">
+ http://it.secondlife.com
+ </floater.string>
+ <floater.string name="support_page_url">
+ http://it.secondlife.com/support
+ </floater.string>
<layout_stack name="stack1">
<layout_panel name="nav_controls">
<button label="Indietro" name="back" width="75"/>
diff --git a/indra/newview/skins/default/xui/it/menu_viewer.xml b/indra/newview/skins/default/xui/it/menu_viewer.xml
index 0010f42a12..b1eb80149e 100644
--- a/indra/newview/skins/default/xui/it/menu_viewer.xml
+++ b/indra/newview/skins/default/xui/it/menu_viewer.xml
@@ -1,5 +1,11 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<menu_bar name="Main Menu">
+ <menu name="Me">
+ <menu_item_call label="Preferenze" name="Preferences"/>
+ <menu_item_call name="Manage My Account">
+ <menu_item_call.on_click name="ManageMyAccount_url" parameter="WebLaunchJoinNow,http://secondlife.com/account/index.php?lang=it" />
+ </menu_item_call>
+ </menu>
<menu label="File" name="File">
<tearoff_menu label="~~~~~~~~~~~" name="~~~~~~~~~~~"/>
<menu label="Carica" name="upload">
diff --git a/indra/newview/skins/default/xui/it/notifications.xml b/indra/newview/skins/default/xui/it/notifications.xml
index 8f8a969ace..26a64a49d3 100644
--- a/indra/newview/skins/default/xui/it/notifications.xml
+++ b/indra/newview/skins/default/xui/it/notifications.xml
@@ -379,10 +379,13 @@ La cartella equipaggiamento non contiene abbigliamento, parti del corpo o attach
Devi inserire sia il nome che il cognome del tuo avatar.
Hai bisogno di un account per entrare in [SECOND_LIFE]. Ne vuoi creare uno adesso?
+ <url name="url">
+ https://join.secondlife.com/index.php?lang=it-IT
+ </url>
<usetemplate name="okcancelbuttons" notext="Riprova" yestext="Crea un nuovo account"/>
</notification>
<notification name="AddClassified">
- Gli annunci appaiono nella sezione &apos;Annunci&apos; della ricerca nel database e su www.secondlife.com per una settimana.
+ Gli annunci appaiono nella sezione &apos;Annunci&apos; della ricerca nel database e su [http://secondlife.com/community/classifieds/?lang=it-IT secondlife.com] per una settimana.
Compila il tuo annuncio e clicca &apos;Pubblica...&apos; per aggiungerlo al database.
Ti verrà chiesto un prezzo da pagare quando clicchi su Pubblica.
Pagare un prezzo più alto fa sì che il tuo annuncio compaia più in alto nella lista, e che sia più facile da trovare quando la gente ricerca per parole chiavi.
@@ -403,6 +406,9 @@ Non ci sono rimborsi per la tariffa pagata.
</notification>
<notification name="PromptGoToEventsPage">
Vai alla pagina degli eventi di [SECOND_LIFE]?
+ <url name="url">
+ http://secondlife.com/events/?lang=it-IT
+ </url>
<usetemplate name="okcancelbuttons" notext="Annulla" yestext="OK"/>
</notification>
<notification name="SelectProposalToView">
@@ -575,6 +581,9 @@ Sposta tutti gli oggetti che vuoi acquisire su una sola regione.
[EXTRA]
Vuoi andare su [_URL] per maggiori informazioni su come acquistare L$?
+ <url name="url">
+ http://secondlife.com/app/currency/?lang=it-IT
+ </url>
<usetemplate name="okcancelbuttons" notext="Annulla" yestext="OK"/>
</notification>
<notification name="UnableToLinkObjects">
@@ -1128,13 +1137,16 @@ Puoi usare [SECOND_LIFE] normalmente e gli altri utenti ti vedranno correttament
L&apos;installazione di [APP_NAME] è completata.
Se questa è la prima volta che usi [SECOND_LIFE], avari bisogno di creare un account prima di poterti collegare.
-Vai su www.secondlife.com per creare un nuovo account?
+Vai su [https://join.secondlife.com/index.php?lang=it-IT secondlife.com] per creare un nuovo account?
<usetemplate name="okcancelbuttons" notext="Continua" yestext="Nuovo Account..."/>
</notification>
<notification name="LoginPacketNeverReceived">
Ci sono stati problemi durante la connessione. Potrebbero esserci problemi con la tua connessione ad internet oppure con i server di [SECOND_LIFE].
Puoi controllare la tua connessione internet e riprovare fra qualche minuto, oppure cliccare su Aiuto per collegarti al nostro sito di supporto, oppure cliccare teleporta per cercare di teleportarti a casa.
+ <url name="url">
+ http://it.secondlife.com/support/
+ </url>
<form name="form">
<button name="OK" text="OK"/>
<button name="Help" text="Aiuto"/>
@@ -1510,7 +1522,7 @@ Verifica di avere installato l&apos;ultima versione del programma e vai alla Kno
Vuoi andare alla Knowledge Base per ulteriori informazioni sulle categorie di accesso?
<url name="url">
- https://support.secondlife.com/ics/support/default.asp?deptID=4417&amp;task=knowledge&amp;questionID=6010
+ http://wiki.secondlife.com/wiki/Linden_Lab_Official:Maturity_ratings:_an_overview/it
</url>
<usetemplate
name="okcancelignore"
@@ -1549,7 +1561,7 @@ Verifica di avere installato l&apos;ultima versione del programma e vai alla Kno
Vuoi andare alla Knowledge Base per maggiori informazioni sulle categorie di accesso?
<url name="url">
- https://support.secondlife.com/ics/support/default.asp?deptID=4417&amp;task=knowledge&amp;questionID=6010
+ http://wiki.secondlife.com/wiki/Linden_Lab_Official:Maturity_ratings:_an_overview/it
</url>
<usetemplate
name="okcancelignore"
@@ -1583,7 +1595,7 @@ Verifica di avere installato l&apos;ultima versione del programma e vai alla Kno
Vuoi andare alla Knowledge Base per maggiori informazioni sulle categorie di accesso?
<url name="url">
- https://support.secondlife.com/ics/support/default.asp?deptID=4417&amp;task=knowledge&amp;questionID=6010
+ http://wiki.secondlife.com/wiki/Linden_Lab_Official:Maturity_ratings:_an_overview/it
</url>
<usetemplate
name="okcancelignore"
@@ -2008,10 +2020,7 @@ Trasferisci gli elementi nell&apos;inventario?
<usetemplate ignoretext="Quando esci da [APP_NAME]." name="okcancelignore" notext="Continua" yestext="Esci"/>
</notification>
<notification name="HelpReportAbuseEmailLL">
- Usa questo strumento per segnalare violazioni ai Termini di Servizio e agli standard della Comunità. Vedi:
-
-http://secondlife.com/corporate/tos.php
-http://secondlife.com/corporate/cs.php
+ Usa questo strumento per segnalare violazioni ai [http://secondlife.com/corporate/tos.php?lang=it-IT Termini di Servizio] e agli [http://secondlife.com/corporate/cs.php?lang=it-IT standard della Comunità].
Tutte gli abusi ai Termini di Servizio e agli Standard della Comunità segnalati, sono indagati e risolti. Puoi controllare la risoluzione degli abusi visitando la pagina delle Risoluzioni degli Incidenti:
@@ -2366,7 +2375,7 @@ Vuoi visitare il sito di [SECOND_LIFE] per verificare la tua eta?
[_URL]
<url name="url" option="0">
- https://secondlife.com/account/verification.php
+ https://secondlife.com/account/verification.php?lang=it
</url>
<usetemplate ignoretext="Quando hai un avviso per mancanza della verifica dell&apos;età." name="okcancelignore" notext="No" yestext="Si"/>
</notification>
diff --git a/indra/newview/skins/default/xui/it/panel_login.xml b/indra/newview/skins/default/xui/it/panel_login.xml
index 1782089039..e3cb7473fc 100644
--- a/indra/newview/skins/default/xui/it/panel_login.xml
+++ b/indra/newview/skins/default/xui/it/panel_login.xml
@@ -1,11 +1,12 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="panel_login">
- <string name="real_url">
- http://secondlife.com/app/login/
- </string>
- <string name="forgot_password_url">
- http://secondlife.com/account/request.php
- </string>
+ <panel.string name="create_account_url">
+ http://join.secondlife.com/index.php?lang=it-IT
+ </panel.string>
+ <panel.string name="forgot_password_url">
+ http://secondlife.com/account/request.php?lang=it
+ </panel.string>
+<panel name="login_widgets">
<text name="first_name_text" left="20">
Nome:
</text>
@@ -37,3 +38,4 @@
[VERSION]
</text>
</panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/it/panel_profile.xml b/indra/newview/skins/default/xui/it/panel_profile.xml
new file mode 100644
index 0000000000..2aa8b7d0e4
--- /dev/null
+++ b/indra/newview/skins/default/xui/it/panel_profile.xml
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="panel_profile">
+ <string name="CaptionTextAcctInfo">
+ [ACCTTYPE]
+[PAYMENTINFO] [AGEVERIFICATION]
+ </string>
+ <string name="payment_update_link_url">
+ http://www.secondlife.com/account/billing.php?lang=it-IT
+ </string>
+ <string name="partner_edit_link_url">
+ http://www.secondlife.com/account/partners.php?lang=it
+ </string>
+ <string name="my_account_link_url" value="http://secondlife.com/my/account/index.php?lang=it-IT"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/it/strings.xml b/indra/newview/skins/default/xui/it/strings.xml
index bc3cc38a40..6e3301fdd9 100644
--- a/indra/newview/skins/default/xui/it/strings.xml
+++ b/indra/newview/skins/default/xui/it/strings.xml
@@ -4,6 +4,7 @@
For example, the strings used in avatar chat bubbles, and strings
that are returned from one component and may appear in many places-->
<strings>
+ <string name="create_account_url">http://join.secondlife.com/index.php?lang=it-IT</string>
<string name="LoginInProgress">
In connessione. [APP_NAME] può sembrare rallentata. Attendi.
</string>
diff --git a/indra/newview/skins/default/xui/ja/menu_viewer.xml b/indra/newview/skins/default/xui/ja/menu_viewer.xml
index bb33a14be4..77aeeefe02 100644
--- a/indra/newview/skins/default/xui/ja/menu_viewer.xml
+++ b/indra/newview/skins/default/xui/ja/menu_viewer.xml
@@ -1,5 +1,11 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<menu_bar name="Main Menu">
+ <menu name="Me">
+ <menu_item_call label="環境設定" name="Preferences"/>
+ <menu_item_call name="Manage My Account">
+ <menu_item_call.on_click name="ManageMyAccount_url" parameter="WebLaunchJoinNow,http://secondlife.com/account/index.php?lang=ja" />
+ </menu_item_call>
+ </menu>
<menu label="ファイル" name="File">
<tearoff_menu label="~~~~~~~~~~~" name="~~~~~~~~~~~"/>
<menu label="アップロード" name="upload">
diff --git a/indra/newview/skins/default/xui/ja/notifications.xml b/indra/newview/skins/default/xui/ja/notifications.xml
index 9962bedaf2..fca7c89183 100644
--- a/indra/newview/skins/default/xui/ja/notifications.xml
+++ b/indra/newview/skins/default/xui/ja/notifications.xml
@@ -340,7 +340,7 @@ L$が不足しているのでこのグループに参加することができま
<notification name="PromptGoToEventsPage">
[SECOND_LIFE]イベント・ウェブ・ページに移動しますか?
<url name="url">
- http://jp.secondlife.com/events/
+ http://secondlife.com/events/?lang=ja-JP
</url>
<usetemplate name="okcancelbuttons" notext="取り消し" yestext="OK"/>
</notification>
@@ -530,7 +530,7 @@ L$が不足しているのでこのグループに参加することができま
[_URL] でリンデンドル購入に関する情報を確認しますか?
<url name="url">
- http://jp.secondlife.com/currency/
+ http://secondlife.com/app/currency/?lang=ja-JP
</url>
<usetemplate name="okcancelbuttons" notext="取り消し" yestext="OK"/>
</notification>
@@ -1113,7 +1113,7 @@ L$は返金されません。
[SECOND_LIFE] の使用が初めての方は、
ログイン前にアカウントの作成が必要です。
-www.secondlife.comに移動し、新規アカウントの作成を行いますか?
+[https://join.secondlife.com/index.php?lang=ja-JP secondlife.com]に移動し、新規アカウントの作成を行いますか?
<usetemplate name="okcancelbuttons" notext="続行" yestext="新規アカウント..."/>
</notification>
<notification name="LoginPacketNeverReceived">
@@ -1524,7 +1524,7 @@ F1キーを押してください。
ナレッジベースを開きレーティング区分について学びますか?
<url name="url">
- http://wiki.secondlife.com/wiki/レーティング区分概要_(KB)
+ http://wiki.secondlife.com/wiki/Linden_Lab_Official:Maturity_ratings:_an_overview/ja
</url>
<usetemplate ignoretext="レーティング区分の制限のため、このリージョンに入ることができません" name="okcancelignore" notext="閉じる" yestext="ナレッジベースを開く"/>
</notification>
@@ -1553,7 +1553,7 @@ F1キーを押してください。
ナレッジベースを開きレーティング区分について学びますか?
<url name="url">
- http://wiki.secondlife.com/wiki/レーティング区分概要_(KB)
+ http://wiki.secondlife.com/wiki/Linden_Lab_Official:Maturity_ratings:_an_overview/ja
</url>
<usetemplate ignoretext="レーティング区分の制限のため、この土地を取得できません" name="okcancelignore" notext="閉じる" yestext="ナレッジベースを開く"/>
</notification>
@@ -1578,7 +1578,7 @@ F1キーを押してください。
ナレッジベースを開きレーティング区分について学びますか?
<url name="url">
- http://wiki.secondlife.com/wiki/レーティング区分概要_(KB)
+ http://wiki.secondlife.com/wiki/Linden_Lab_Official:Maturity_ratings:_an_overview/ja
</url>
<usetemplate ignoretext="レーティング区分の制限のため、この土地を購入できません" name="okcancelignore" notext="閉じる" yestext="ナレッジベースを開く"/>
</notification>
diff --git a/indra/newview/skins/default/xui/ja/panel_login.xml b/indra/newview/skins/default/xui/ja/panel_login.xml
index 00b9d5aa47..27eed48d82 100644
--- a/indra/newview/skins/default/xui/ja/panel_login.xml
+++ b/indra/newview/skins/default/xui/ja/panel_login.xml
@@ -4,7 +4,7 @@
http://jp.secondlife.com/registration/
</panel.string>
<panel.string name="forgot_password_url">
- http://secondlife.com/account/request.php
+ http://secondlife.com/account/request.php?lang=ja
</panel.string>
<panel name="login_widgets">
<line_editor name="first_name_edit" tool_tip="[SECOND_LIFE] ファーストネーム"/>
diff --git a/indra/newview/skins/default/xui/ja/panel_profile.xml b/indra/newview/skins/default/xui/ja/panel_profile.xml
index 8c94833a54..a449c10e10 100644
--- a/indra/newview/skins/default/xui/ja/panel_profile.xml
+++ b/indra/newview/skins/default/xui/ja/panel_profile.xml
@@ -1,12 +1,16 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel label="プロフィール" name="panel_profile">
<string name="CaptionTextAcctInfo">
- [ACCTTYPE] [PAYMENTINFO] [AGEVERIFICATION]
+ [ACCTTYPE]
+[PAYMENTINFO] [AGEVERIFICATION]
</string>
<string name="payment_update_link_url">
- http://www.secondlife.com/account/billing.php?lang=ja
+ http://www.secondlife.com/account/billing.php?lang=ja-JP
</string>
- <string name="my_account_link_url" value="http://secondlife.com/account"/>
+ <string name="partner_edit_link_url">
+ http://www.secondlife.com/account/partners.php?lang=ja
+ </string>
+ <string name="my_account_link_url" value="http://secondlife.com/my/account/index.php?lang=ja-JP"/>
<string name="no_partner_text" value="なし"/>
<scroll_container name="profile_scroll">
<panel name="scroll_content_panel">
diff --git a/indra/newview/skins/default/xui/ja/strings.xml b/indra/newview/skins/default/xui/ja/strings.xml
index d6d41aecc0..fc9e4b67b7 100644
--- a/indra/newview/skins/default/xui/ja/strings.xml
+++ b/indra/newview/skins/default/xui/ja/strings.xml
@@ -4,6 +4,7 @@
For example, the strings used in avatar chat bubbles, and strings
that are returned from one component and may appear in many places-->
<strings>
+ <string name="create_account_url">http://join.secondlife.com/index.php?lang=ja-JP</string>
<string name="SECOND_LIFE">
Second Life
</string>
@@ -158,7 +159,7 @@
クリックして secondlife:// コマンドを出す
</string>
<string name="BUTTON_CLOSE_DARWIN">
- 閉じる (⌘-W)
+ 閉じる (&#8984;W)
</string>
<string name="BUTTON_CLOSE_WIN">
閉じる (Ctrl+W)
@@ -1311,16 +1312,16 @@
ランドマークを編集...
</string>
<string name="accel-mac-control">
- ⌃
+ &#8963;
</string>
<string name="accel-mac-command">
- ⌘
+ &#8984;
</string>
<string name="accel-mac-option">
- ⌥
+ &#8997;
</string>
<string name="accel-mac-shift">
- ⇧
+ &#8679;
</string>
<string name="accel-win-control">
Ctrl+
diff --git a/indra/newview/skins/default/xui/nl/notifications.xml b/indra/newview/skins/default/xui/nl/notifications.xml
index 9a83eaea61..a282c267a1 100644
--- a/indra/newview/skins/default/xui/nl/notifications.xml
+++ b/indra/newview/skins/default/xui/nl/notifications.xml
@@ -380,6 +380,9 @@ De outfit folder bevat geen kleding, lichaamsdelen of externe bevestigingen.
U moet zowel de voornaam als de achternaam van uw avatar opgeven.
U heeft een account nodig om [SECOND_LIFE] binnen te gaan. Wilt u er nu een maken?
+ <url name="url">
+ https://join.secondlife.com/index.php?lang=nl-NL
+ </url>
<usetemplate name="okcancelbuttons" notext="Probeer het opnieuw" yestext="Maak een nieuw account"/>
</notification>
<notification name="AddClassified">
@@ -1131,7 +1134,7 @@ U kunt [SECOND_LIFE] normaal gebruiken en anderen zullen u correct zien.
[APP_NAME] installatie compleet.
Als dit de eerste keer is dat u [SECOND_LIFE] gebruikt, zult u een account aan moeten maken voordat u in kan loggen.
-Terugkeren naar www.secondlife.com om een nieuw account aan te maken?
+Terugkeren naar [https://join.secondlife.com/index.php?lang=nl-NL secondlife.com] om een nieuw account aan te maken?
<usetemplate name="okcancelbuttons" notext="Doorgaan" yestext="Nieuw Account..."/>
</notification>
<notification name="LoginPacketNeverReceived">
diff --git a/indra/newview/skins/default/xui/nl/panel_login.xml b/indra/newview/skins/default/xui/nl/panel_login.xml
index 5bfb9dd235..235e15e7fb 100644
--- a/indra/newview/skins/default/xui/nl/panel_login.xml
+++ b/indra/newview/skins/default/xui/nl/panel_login.xml
@@ -1,11 +1,12 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="panel_login">
- <string name="real_url">
- http://secondlife.com/app/login/
- </string>
- <string name="forgot_password_url">
- http://secondlife.com/account/request.php
- </string>
+ <panel.string name="create_account_url">
+ http://join.secondlife.com/index.php?lang=nl-NL
+ </panel.string>
+ <panel.string name="forgot_password_url">
+ http://secondlife.com/account/request.php?lang=nl-NL
+ </panel.string>
+<panel name="login_widgets">
<text name="first_name_text">
Voornaam:
</text>
@@ -35,3 +36,4 @@
[VERSION]
</text>
</panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/nl/strings.xml b/indra/newview/skins/default/xui/nl/strings.xml
index 49ebcd319c..0be5ec9e86 100644
--- a/indra/newview/skins/default/xui/nl/strings.xml
+++ b/indra/newview/skins/default/xui/nl/strings.xml
@@ -4,6 +4,7 @@
For example, the strings used in avatar chat bubbles, and strings
that are returned from one component and may appear in many places-->
<strings>
+ <string name="create_account_url">http://join.secondlife.com/index.php?lang=nl-NL</string>
<string name="LoginInProgress">
Inloggen. Het kan lijken dat [APP_NAME] is vastgelopen. Wacht u alstublieft... .
</string>
diff --git a/indra/newview/skins/default/xui/pt/floater_media_browser.xml b/indra/newview/skins/default/xui/pt/floater_media_browser.xml
index 3437dfcdba..1cd6d5662c 100644
--- a/indra/newview/skins/default/xui/pt/floater_media_browser.xml
+++ b/indra/newview/skins/default/xui/pt/floater_media_browser.xml
@@ -1,5 +1,11 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater min_width="477" name="floater_about" title="NAVEGADOR DE MÍDIA" width="570">
+ <floater.string name="home_page_url">
+ http://br.secondlife.com
+ </floater.string>
+ <floater.string name="support_page_url">
+ http://br.secondlife.com/support
+ </floater.string>
<layout_stack name="stack1" width="550">
<layout_panel name="nav_controls">
<button label="Para trás" name="back" width="75"/>
diff --git a/indra/newview/skins/default/xui/pt/menu_viewer.xml b/indra/newview/skins/default/xui/pt/menu_viewer.xml
index c476ef0bbc..2c887fa50c 100644
--- a/indra/newview/skins/default/xui/pt/menu_viewer.xml
+++ b/indra/newview/skins/default/xui/pt/menu_viewer.xml
@@ -1,5 +1,11 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<menu_bar name="Main Menu">
+ <menu name="Me">
+ <menu_item_call label="Preferências" name="Preferences"/>
+ <menu_item_call name="Manage My Account">
+ <menu_item_call.on_click name="ManageMyAccount_url" parameter="WebLaunchJoinNow,http://secondlife.com/account/index.php?lang=pt" />
+ </menu_item_call>
+ </menu>
<menu label="Arquivo" name="File">
<tearoff_menu label="~~~~~~~~~~~" name="~~~~~~~~~~~"/>
<menu label="Upload" name="upload">
diff --git a/indra/newview/skins/default/xui/pt/notifications.xml b/indra/newview/skins/default/xui/pt/notifications.xml
index 0ee2c5cb84..c3ce53861f 100644
--- a/indra/newview/skins/default/xui/pt/notifications.xml
+++ b/indra/newview/skins/default/xui/pt/notifications.xml
@@ -377,10 +377,13 @@ Scripts devem ser permitidos para fazer as armas funcionarem.
Você precisa entrar com ambos os Nome e Sobrenome do seu avatar.
Você precisa de uma conta para entrar no [SECOND_LIFE]. Você gostaria de criar uma conta agora?
+ <url name="url">
+ https://join.secondlife.com/index.php?lang=pt-BR
+ </url>
<usetemplate name="okcancelbuttons" notext="Tentar novamente" yestext="Criar uma nova conta"/>
</notification>
<notification name="AddClassified">
- Anúncios classificados aparecem na seção &apos;Classificados&apos; do diretório de Busca e no www.secondlife.com por uma semana.
+ Anúncios classificados aparecem na seção &apos;Classificados&apos; do diretório de Busca e no [http://secondlife.com/community/classifieds/?lang=pt-BR secondlife.com] por uma semana.
Preencha seu anúncio e então clique &apos;Publicar...&apos; para adicioná-lo ao diretório.
Será solicitado a você um preço a ser pago, quando você clicar Publicar.
Pagando mais, faz com que seu anúncio apareça em posição mais alta na lista e também em posição mais alta, quando as pessoas buscarem por palavras-chave.
@@ -401,6 +404,9 @@ Não há reembolso por taxas já pagas.
</notification>
<notification name="PromptGoToEventsPage">
Ir até a página web de enventos [SECOND_LIFE] ?
+ <url name="url">
+ http://secondlife.com/events/?lang=pt-BR
+ </url>
<usetemplate name="okcancelbuttons" notext="Cancelar" yestext="Ir à página"/>
</notification>
<notification name="SelectProposalToView">
@@ -492,7 +498,7 @@ O objeto pode estar fora de alcance ou ter sido deletado.
MINSPECS
Você deseja visitar [_URL] para maiores informações?
<url name="url" option="0">
- http://www.secondlife.com/corporate/sysreqs.php
+ http://secondlife.com/support/sysreqs.php?lang=pt
</url>
<usetemplate ignoretext="Ao detectar hardware não suportado" name="okcancelignore" notext="Não" yestext="Sim"/>
</notification>
@@ -571,6 +577,9 @@ Por favor, mova todos os objetos a serem adquiridos para uma mesma região.
[EXTRA]
Vá para [_URL] para informação sobre compra de L$.
+ <url name="url">
+ http://secondlife.com/app/currency/?lang=pt-BR
+ </url>
<usetemplate name="okcancelbuttons" notext="Cancelar" yestext="Ir até a página"/>
</notification>
<notification name="UnableToLinkObjects">
@@ -1115,13 +1124,16 @@ Você pode usar o [SECOND_LIFE] normalmente e os outros o visualizarão corretam
A instalação do [APP_NAME] está completa.
Se esta é a primeira vez usando o[SECOND_LIFE], será necessário que você crie uma conta antes de poder se logar.
-Retornar a www.secondlife.com para criar uma nova conta?
+Retornar a [https://join.secondlife.com/index.php?lang=pt-BR secondlife.com] para criar uma nova conta?
<usetemplate name="okcancelbuttons" notext="Continuar" yestext="Nova conta.."/>
</notification>
<notification name="LoginPacketNeverReceived">
Estamos com problemas de conexão. Pode ser problema com a conexão de sua internet ou com os servidores do [SECOND_LIFE].
Voce tanto pode checar a conexão de sua internet e tentar novamente em alguns minutos, ou clicar em Teletransporte para tentar teletransportar-se para sua casa.
+ <url name="url">
+ http://br.secondlife.com/support/
+ </url>
<form name="form">
<button name="OK" text="OK"/>
<button name="Help" text="Ajuda"/>
@@ -1492,7 +1504,7 @@ Por favor, verifique se você está com o último Visualizador instalado e vá a
Ir para o Banco de Conhecimento para maiores informações sobre Classificações de maturidade?
<url name="url">
- https://support.secondlife.com/ics/support/default.asp?deptID=4417&amp;task=knowledge&amp;questionID=6010
+ http://wiki.secondlife.com/wiki/Linden_Lab_Official:Maturity_ratings:_an_overview/pt
</url>
<usetemplate
name="okcancelignore"
@@ -1531,7 +1543,7 @@ Por favor, verifique se você tem o último Visualizador instalado e vá para o
Ir para a o Banco de Conhecimento para maiores informações sobre Classificações de maturidade?
<url name="url">
- https://support.secondlife.com/ics/support/default.asp?deptID=4417&amp;task=knowledge&amp;questionID=6010
+ http://wiki.secondlife.com/wiki/Linden_Lab_Official:Maturity_ratings:_an_overview/pt
</url>
<usetemplate
name="okcancelignore"
@@ -1565,7 +1577,7 @@ Por favor, verifique se você tem o último Visualizador instalado e vá para o
Ir para o Banco de Conhecimento para maiores informações sobre Classificações de Maturidade?
<url name="url">
- https://support.secondlife.com/ics/support/default.asp?deptID=4417&amp;task=knowledge&amp;questionID=6010
+ http://wiki.secondlife.com/wiki/Linden_Lab_Official:Maturity_ratings:_an_overview/pt
</url>
<usetemplate
name="okcancelignore"
@@ -1975,10 +1987,7 @@ Mover para o inventário o(s) item(s)?
<usetemplate ignoretext="Quando Saindo do [APP_NAME]." name="okcancelignore" notext="Continuar" yestext="Sair"/>
</notification>
<notification name="HelpReportAbuseEmailLL">
- Use esta ferramenta para reportar violações aos Termos de Serviço e aos Padrões da Comunidade. Veja:
-
-http://secondlife.com/corporate/tos.php
-http://secondlife.com/corporate/cs.php
+ Use esta ferramenta para reportar violações aos [http://secondlife.com/corporate/tos.php?lang=pt-BR Termos de Serviço] e aos [http://secondlife.com/corporate/cs.php?lang=pt-BR Padrões da Comunidade].
Todos os abusos aos Termos de Serviço e aos Padrões da Comunidade reportados, são investigados e resolvidos. Você pode ver a resolução do incidente na Reportagem de Incidentes em:
diff --git a/indra/newview/skins/default/xui/pt/panel_login.xml b/indra/newview/skins/default/xui/pt/panel_login.xml
index c6f1433440..d7ff3f29df 100644
--- a/indra/newview/skins/default/xui/pt/panel_login.xml
+++ b/indra/newview/skins/default/xui/pt/panel_login.xml
@@ -1,5 +1,12 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="panel_login">
+ <panel.string name="create_account_url">
+ http://join.secondlife.com/index.php?lang=pt-BR
+ </panel.string>
+ <panel.string name="forgot_password_url">
+ http://secondlife.com/account/request.php?lang=pt
+ </panel.string>
+<panel name="login_widgets">
<text name="first_name_text">
Primeiro nome:
</text>
@@ -29,3 +36,4 @@
[VERSION]
</text>
</panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/pt/panel_profile.xml b/indra/newview/skins/default/xui/pt/panel_profile.xml
new file mode 100644
index 0000000000..ff53aa6a41
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/panel_profile.xml
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="panel_profile">
+ <string name="CaptionTextAcctInfo">
+ [ACCTTYPE]
+[PAYMENTINFO] [AGEVERIFICATION]
+ </string>
+ <string name="payment_update_link_url">
+ http://www.secondlife.com/account/billing.php?lang=pt-BR
+ </string>
+ <string name="partner_edit_link_url">
+ http://www.secondlife.com/account/partners.php?lang=pt
+ </string>
+ <string name="my_account_link_url" value="http://secondlife.com/my/account/index.php?lang=pt-BR"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/pt/strings.xml b/indra/newview/skins/default/xui/pt/strings.xml
index 2d3514e5fe..9acfce99dd 100644
--- a/indra/newview/skins/default/xui/pt/strings.xml
+++ b/indra/newview/skins/default/xui/pt/strings.xml
@@ -4,6 +4,7 @@
For example, the strings used in avatar chat bubbles, and strings
that are returned from one component and may appear in many places-->
<strings>
+ <string name="create_account_url">http://join.secondlife.com/index.php?lang=pt-BR</string>
<string name="LoginInProgress">
Fazendo Login. [APP_NAME] pode parecer congelado. Por favor, aguarde.
</string>
diff --git a/indra/newview/tests/lldateutil_test.cpp b/indra/newview/tests/lldateutil_test.cpp
index ed753b6ff7..142a5eb5e6 100644
--- a/indra/newview/tests/lldateutil_test.cpp
+++ b/indra/newview/tests/lldateutil_test.cpp
@@ -60,6 +60,11 @@ std::string LLTrans::getString(const std::string &xml_desc, const LLStringUtil::
std::string LLTrans::getCountString(const std::string& language, const std::string& xml_desc, S32 count)
{
+ count_string_t key(xml_desc, count);
+ if (gCountString.find(key) == gCountString.end())
+ {
+ return std::string("Couldn't find ") + xml_desc;
+ }
return gCountString[ count_string_t(xml_desc, count) ];
}
@@ -91,8 +96,11 @@ namespace tut
gCountString[ count_string_t("AgeYears", 2) ] = "2 years";
gCountString[ count_string_t("AgeMonths", 1) ] = "1 month";
gCountString[ count_string_t("AgeMonths", 2) ] = "2 months";
+ gCountString[ count_string_t("AgeMonths", 11) ]= "11 months";
gCountString[ count_string_t("AgeWeeks", 1) ] = "1 week";
gCountString[ count_string_t("AgeWeeks", 2) ] = "2 weeks";
+ gCountString[ count_string_t("AgeWeeks", 3) ] = "3 weeks";
+ gCountString[ count_string_t("AgeWeeks", 4) ] = "4 weeks";
gCountString[ count_string_t("AgeDays", 1) ] = "1 day";
gCountString[ count_string_t("AgeDays", 2) ] = "2 days";
}
@@ -113,12 +121,18 @@ namespace tut
ensure_equals("years",
LLDateUtil::ageFromDate("12/31/2007", mNow),
"2 years old" );
- ensure_equals("single year",
- LLDateUtil::ageFromDate("12/31/2008", mNow),
- "1 year old" );
+ ensure_equals("years",
+ LLDateUtil::ageFromDate("1/1/2008", mNow),
+ "1 year 11 months old" );
+ ensure_equals("single year + one month",
+ LLDateUtil::ageFromDate("11/30/2008", mNow),
+ "1 year 1 month old" );
ensure_equals("single year + a bit",
LLDateUtil::ageFromDate("12/12/2008", mNow),
"1 year old" );
+ ensure_equals("single year",
+ LLDateUtil::ageFromDate("12/31/2008", mNow),
+ "1 year old" );
}
template<> template<>
@@ -128,6 +142,9 @@ namespace tut
ensure_equals("months",
LLDateUtil::ageFromDate("10/30/2009", mNow),
"2 months old" );
+ ensure_equals("months 2",
+ LLDateUtil::ageFromDate("10/31/2009", mNow),
+ "2 months old" );
ensure_equals("single month",
LLDateUtil::ageFromDate("11/30/2009", mNow),
"1 month old" );
@@ -137,6 +154,9 @@ namespace tut
void dateutil_object_t::test<3>()
{
set_test_name("Weeks");
+ ensure_equals("4 weeks",
+ LLDateUtil::ageFromDate("12/1/2009", mNow),
+ "4 weeks old" );
ensure_equals("weeks",
LLDateUtil::ageFromDate("12/17/2009", mNow),
"2 weeks old" );