summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--indra/llcommon/llmemory.h2
-rw-r--r--indra/llmath/tests/alignment_test.cpp4
-rw-r--r--indra/newview/app_settings/settings.xml11
-rw-r--r--indra/newview/llfloaterconversationpreview.cpp95
-rw-r--r--indra/newview/llfloaterconversationpreview.h7
-rw-r--r--indra/newview/llimview.cpp2
-rw-r--r--indra/newview/lllogchat.cpp6
-rw-r--r--indra/newview/lllogchat.h4
-rw-r--r--indra/newview/llnearbychat.cpp2
-rw-r--r--indra/newview/lltoastimpanel.cpp4
-rw-r--r--indra/newview/lltoastimpanel.h2
-rw-r--r--indra/newview/skins/default/xui/en/floater_conversation_preview.xml12
12 files changed, 102 insertions, 49 deletions
diff --git a/indra/llcommon/llmemory.h b/indra/llcommon/llmemory.h
index 9dd776ff57..08e2a2caa6 100644
--- a/indra/llcommon/llmemory.h
+++ b/indra/llcommon/llmemory.h
@@ -65,6 +65,8 @@ inline void* ll_aligned_realloc_16(void* ptr, size_t size) // returned hunk MUST
#elif defined(LL_DARWIN)
return realloc(ptr,size); // default osx malloc is 16 byte aligned.
#else
+ // The realloc alignment test is skipped on Linux because the ll_aligned_realloc_16()
+ // function is not implemented to ensure alignment (see alignment_test.cpp)
return realloc(ptr,size); // FIXME not guaranteed to be aligned.
#endif
}
diff --git a/indra/llmath/tests/alignment_test.cpp b/indra/llmath/tests/alignment_test.cpp
index ac0c45ae6f..49c668d737 100644
--- a/indra/llmath/tests/alignment_test.cpp
+++ b/indra/llmath/tests/alignment_test.cpp
@@ -78,8 +78,12 @@ void alignment_test_object_t::test<1>()
align_ptr = ll_aligned_malloc_16(sizeof(MyVector4a));
ensure("ll_aligned_malloc_16 failed", is_aligned(align_ptr,16));
+#if !LL_LINUX
+ // Skipping realloc alignment test on Linux because the ll_aligned_realloc_16()
+ // function is not implemented to ensure alignment on Linux (see llmemory.h)
align_ptr = ll_aligned_realloc_16(align_ptr,2*sizeof(MyVector4a));
ensure("ll_aligned_realloc_16 failed", is_aligned(align_ptr,16));
+#endif // LL_LINUX
ll_aligned_free_16(align_ptr);
diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml
index 61bc58b1df..ab1ea6bdbc 100644
--- a/indra/newview/app_settings/settings.xml
+++ b/indra/newview/app_settings/settings.xml
@@ -1639,6 +1639,17 @@
<key>Value</key>
<string />
</map>
+ <key>ConversationHistoryPageSize</key>
+ <map>
+ <key>Comment</key>
+ <string>Chat history of conversation opened from call log is displayed by pages. So this is number of entries per page.</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>S32</string>
+ <key>Value</key>
+ <integer>100</integer>
+ </map>
<key>NearbyChatIsNotTornOff</key>
<map>
<key>Comment</key>
diff --git a/indra/newview/llfloaterconversationpreview.cpp b/indra/newview/llfloaterconversationpreview.cpp
index e8554bb066..ae6f1441eb 100644
--- a/indra/newview/llfloaterconversationpreview.cpp
+++ b/indra/newview/llfloaterconversationpreview.cpp
@@ -33,12 +33,15 @@
LLFloaterConversationPreview::LLFloaterConversationPreview(const LLSD& session_id)
: LLFloater(session_id),
mChatHistory(NULL),
- mSessionID(session_id.asUUID())
+ mSessionID(session_id.asUUID()),
+ mCurrentPage(0),
+ mPageSize(gSavedSettings.getS32("ConversationHistoryPageSize"))
{}
BOOL LLFloaterConversationPreview::postBuild()
{
mChatHistory = getChild<LLChatHistory>("chat_history");
+ getChild<LLUICtrl>("more_history")->setCommitCallback(boost::bind(&LLFloaterConversationPreview::onMoreHistoryBtnClick, this));
const LLConversation* conv = LLConversationLog::instance().getConversation(mSessionID);
if (conv)
@@ -52,6 +55,11 @@ BOOL LLFloaterConversationPreview::postBuild()
getChild<LLLineEditor>("description")->setValue(name);
}
+ std::string file = conv->getHistoryFileName();
+ LLLogChat::loadChatHistory(file, mMessages, true);
+
+ mCurrentPage = mMessages.size() / mPageSize;
+
return LLFloater::postBuild();
}
@@ -62,51 +70,64 @@ void LLFloaterConversationPreview::draw()
void LLFloaterConversationPreview::onOpen(const LLSD& session_id)
{
- const LLConversation* conv = LLConversationLog::instance().getConversation(session_id);
- if (!conv)
+ showHistory();
+}
+
+void LLFloaterConversationPreview::showHistory()
+{
+ if (!mMessages.size())
{
return;
}
- std::list<LLSD> messages;
- std::string file = conv->getHistoryFileName();
- LLLogChat::loadAllHistory(file, messages);
- if (messages.size())
+ mChatHistory->clear();
+
+ std::ostringstream message;
+ std::list<LLSD>::const_iterator iter = mMessages.begin();
+
+ int delta = 0;
+ if (mCurrentPage)
{
- std::ostringstream message;
- std::list<LLSD>::const_iterator iter = messages.begin();
- for (; iter != messages.end(); ++iter)
- {
- LLSD msg = *iter;
-
- std::string time = msg["time"].asString();
- LLUUID from_id = msg["from_id"].asUUID();
- std::string from = msg["from"].asString();
- std::string message = msg["message"].asString();
- bool is_history = msg["is_history"].asBoolean();
-
- LLChat chat;
- chat.mFromID = from_id;
- chat.mSessionID = session_id;
- chat.mFromName = from;
- chat.mTimeStr = time;
- chat.mChatStyle = is_history ? CHAT_STYLE_HISTORY : chat.mChatStyle;
- chat.mText = message;
-
- appendMessage(chat);
- }
+ // stinson 08/28/2012 : This operation could be simplified using integer math with the mod (%) operator.
+ // e.g. The following code should give the same output.
+ // int remainder = mMessages.size() % mPageSize;
+ // delta = (remainder == 0) ? 0 : (mPageSize - remainder);
+ // Though without examining further, the remainder might be a more appropriate value.
+ double num_of_pages = static_cast<double>(mMessages.size()) / static_cast<double>(mPageSize);
+ delta = static_cast<int>((ceil(num_of_pages) - num_of_pages) * static_cast<double>(mPageSize));
}
-}
-void LLFloaterConversationPreview::appendMessage(const LLChat& chat)
-{
- if (!chat.mMuted)
+ std::advance(iter, (mCurrentPage * mPageSize) - delta);
+
+ for (int msg_num = 0; (iter != mMessages.end() && msg_num < mPageSize); ++iter, ++msg_num)
{
- LLSD args;
- args["use_plain_text_chat_history"] = true;
- args["show_time"] = true;
- args["show_names_for_p2p_conv"] = true;
+ LLSD msg = *iter;
+
+ std::string time = msg["time"].asString();
+ LLUUID from_id = msg["from_id"].asUUID();
+ std::string from = msg["from"].asString();
+ std::string message = msg["message"].asString();
+ bool is_history = msg["is_history"].asBoolean();
+
+ LLChat chat;
+ chat.mFromID = from_id;
+ chat.mSessionID = mSessionID;
+ chat.mFromName = from;
+ chat.mTimeStr = time;
+ chat.mChatStyle = is_history ? CHAT_STYLE_HISTORY : chat.mChatStyle;
+ chat.mText = message;
mChatHistory->appendMessage(chat);
}
+
+}
+
+void LLFloaterConversationPreview::onMoreHistoryBtnClick()
+{
+ if (--mCurrentPage < 0)
+ {
+ return;
+ }
+
+ showHistory();
}
diff --git a/indra/newview/llfloaterconversationpreview.h b/indra/newview/llfloaterconversationpreview.h
index cfc7c34485..5105ef3702 100644
--- a/indra/newview/llfloaterconversationpreview.h
+++ b/indra/newview/llfloaterconversationpreview.h
@@ -42,10 +42,15 @@ public:
virtual void onOpen(const LLSD& session_id);
private:
- void appendMessage(const LLChat& chat);
+ void onMoreHistoryBtnClick();
+ void showHistory();
LLChatHistory* mChatHistory;
LLUUID mSessionID;
+ int mCurrentPage;
+ int mPageSize;
+
+ std::list<LLSD> mMessages;
};
#endif /* LLFLOATERCONVERSATIONPREVIEW_H_ */
diff --git a/indra/newview/llimview.cpp b/indra/newview/llimview.cpp
index 216db15c94..effcc9a826 100644
--- a/indra/newview/llimview.cpp
+++ b/indra/newview/llimview.cpp
@@ -263,7 +263,7 @@ LLIMModel::LLIMSession::LLIMSession(const LLUUID& session_id, const std::string&
std::list<LLSD> chat_history;
//involves parsing of a chat history
- LLLogChat::loadAllHistory(mHistoryFileName, chat_history);
+ LLLogChat::loadChatHistory(mHistoryFileName, chat_history);
addMessagesFromHistory(chat_history);
}
diff --git a/indra/newview/lllogchat.cpp b/indra/newview/lllogchat.cpp
index ebb5912ace..073f5f00c5 100644
--- a/indra/newview/lllogchat.cpp
+++ b/indra/newview/lllogchat.cpp
@@ -387,7 +387,7 @@ void append_to_last_message(std::list<LLSD>& messages, const std::string& line)
}
// static
-void LLLogChat::loadAllHistory(const std::string& file_name, std::list<LLSD>& messages)
+void LLLogChat::loadChatHistory(const std::string& file_name, std::list<LLSD>& messages, bool load_all_history/*= false*/)
{
if (file_name.empty())
{
@@ -412,8 +412,8 @@ void LLLogChat::loadAllHistory(const std::string& file_name, std::list<LLSD>& me
S32 len;
bool firstline = TRUE;
- if (fseek(fptr, (LOG_RECALL_SIZE - 1) * -1 , SEEK_END))
- { //File is smaller than recall size. Get it all.
+ if (load_all_history || fseek(fptr, (LOG_RECALL_SIZE - 1) * -1 , SEEK_END))
+ { //We need to load the whole historyFile or it's smaller than recall size, so get it all.
firstline = FALSE;
if (fseek(fptr, 0, SEEK_SET))
{
diff --git a/indra/newview/lllogchat.h b/indra/newview/lllogchat.h
index 27752452c9..95f83e64e5 100644
--- a/indra/newview/lllogchat.h
+++ b/indra/newview/lllogchat.h
@@ -50,12 +50,12 @@ public:
const LLUUID& from_id,
const std::string& line);
- /** @deprecated @see loadAllHistory() */
+ /** @deprecated @see loadChatHistory() */
static void loadHistory(const std::string& filename,
void (*callback)(ELogLineType, const LLSD&, void*),
void* userdata);
- static void loadAllHistory(const std::string& file_name, std::list<LLSD>& messages);
+ static void loadChatHistory(const std::string& file_name, std::list<LLSD>& messages, bool load_all_history = false);
private:
static std::string cleanFileName(std::string filename);
};
diff --git a/indra/newview/llnearbychat.cpp b/indra/newview/llnearbychat.cpp
index a723748094..f1518fe825 100644
--- a/indra/newview/llnearbychat.cpp
+++ b/indra/newview/llnearbychat.cpp
@@ -262,7 +262,7 @@ void LLNearbyChat::loadHistory()
do_not_log["do_not_log"] = true;
std::list<LLSD> history;
- LLLogChat::loadAllHistory("chat", history);
+ LLLogChat::loadChatHistory("chat", history);
std::list<LLSD>::const_iterator it = history.begin();
while (it != history.end())
diff --git a/indra/newview/lltoastimpanel.cpp b/indra/newview/lltoastimpanel.cpp
index e0cb200ef5..75e6e3d13a 100644
--- a/indra/newview/lltoastimpanel.cpp
+++ b/indra/newview/lltoastimpanel.cpp
@@ -104,9 +104,9 @@ LLToastIMPanel::~LLToastIMPanel()
}
//virtual
-BOOL LLToastIMPanel::handleMouseDown(S32 x, S32 y, MASK mask)
+BOOL LLToastIMPanel::handleMouseUp(S32 x, S32 y, MASK mask)
{
- if (LLPanel::handleMouseDown(x,y,mask) == FALSE)
+ if (LLPanel::handleMouseUp(x,y,mask) == FALSE)
{
mNotification->respond(mNotification->getResponseTemplate());
}
diff --git a/indra/newview/lltoastimpanel.h b/indra/newview/lltoastimpanel.h
index 279dd69bc7..3eb11fb3bc 100644
--- a/indra/newview/lltoastimpanel.h
+++ b/indra/newview/lltoastimpanel.h
@@ -52,7 +52,7 @@ public:
LLToastIMPanel(LLToastIMPanel::Params &p);
virtual ~LLToastIMPanel();
- /*virtual*/ BOOL handleMouseDown(S32 x, S32 y, MASK mask);
+ /*virtual*/ BOOL handleMouseUp(S32 x, S32 y, MASK mask);
/*virtual*/ BOOL handleToolTip(S32 x, S32 y, MASK mask);
private:
void showInspector();
diff --git a/indra/newview/skins/default/xui/en/floater_conversation_preview.xml b/indra/newview/skins/default/xui/en/floater_conversation_preview.xml
index 27b744aefb..c837a0ee57 100644
--- a/indra/newview/skins/default/xui/en/floater_conversation_preview.xml
+++ b/indra/newview/skins/default/xui/en/floater_conversation_preview.xml
@@ -3,7 +3,7 @@
legacy_header_height="18"
can_resize="true"
default_tab_group="1"
- height="361"
+ height="391"
layout="topleft"
min_height="243"
min_width="234"
@@ -50,4 +50,14 @@
left="5"
width="390">
</chat_history>
+ <button
+ follows="bottom|right"
+ height="22"
+ layout="topleft"
+ name="more_history"
+ label="More history..."
+ right="-15"
+ top_pad="5"
+ width="100">
+ </button>
</floater>