summaryrefslogtreecommitdiff
path: root/indra/llui/llchatentry.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'indra/llui/llchatentry.cpp')
-rw-r--r--indra/llui/llchatentry.cpp502
1 files changed, 251 insertions, 251 deletions
diff --git a/indra/llui/llchatentry.cpp b/indra/llui/llchatentry.cpp
index 3aa65355e5..da5afd0386 100644
--- a/indra/llui/llchatentry.cpp
+++ b/indra/llui/llchatentry.cpp
@@ -1,251 +1,251 @@
-/**
- * @file llchatentry.cpp
- * @brief LLChatEntry implementation
- *
- * $LicenseInfo:firstyear=2001&license=viewerlgpl$
- * Second Life Viewer Source Code
- * Copyright (C) 2012, Linden Research, Inc.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation;
- * version 2.1 of the License only.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
- * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
- * $/LicenseInfo$
- */
-
-#include "linden_common.h"
-#include "llscrollcontainer.h"
-
-#include "llchatentry.h"
-
-static LLDefaultChildRegistry::Register<LLChatEntry> r("chat_editor");
-
-LLChatEntry::Params::Params()
-: has_history("has_history", true),
- is_expandable("is_expandable", false),
- expand_lines_count("expand_lines_count", 1)
-{}
-
-LLChatEntry::LLChatEntry(const Params& p)
-: LLTextEditor(p),
- mTextExpandedSignal(NULL),
- mHasHistory(p.has_history),
- mIsExpandable(p.is_expandable),
- mExpandLinesCount(p.expand_lines_count),
- mPrevLinesCount(0),
- mSingleLineMode(false),
- mPrevExpandedLineCount(S32_MAX)
-{
- // Initialize current history line iterator
- mCurrentHistoryLine = mLineHistory.begin();
-
- mAutoIndent = false;
- keepSelectionOnReturn(true);
-}
-
-LLChatEntry::~LLChatEntry()
-{
- delete mTextExpandedSignal;
-}
-
-void LLChatEntry::draw()
-{
- if(mIsExpandable)
- {
- reflow();
- expandText();
- }
- LLTextEditor::draw();
-}
-
-void LLChatEntry::onCommit()
-{
- updateHistory();
- LLTextEditor::onCommit();
-}
-
-boost::signals2::connection LLChatEntry::setTextExpandedCallback(const commit_signal_t::slot_type& cb)
-{
- if (!mTextExpandedSignal)
- {
- mTextExpandedSignal = new commit_signal_t();
- }
- return mTextExpandedSignal->connect(cb);
-}
-
-void LLChatEntry::expandText()
-{
- S32 line_count = mSingleLineMode ? 1 : mExpandLinesCount;
-
- int visible_lines_count = llabs(getVisibleLines(true).first - getVisibleLines(true).second);
- bool can_changed = getLineCount() <= line_count || line_count < mPrevExpandedLineCount ;
- mPrevExpandedLineCount = line_count;
-
- // true if pasted text has more lines than expand height limit and expand limit is not reached yet
- bool text_pasted = (getLineCount() > line_count) && (visible_lines_count < line_count);
-
- if (mIsExpandable && (can_changed || text_pasted || mSingleLineMode) && getLineCount() != mPrevLinesCount)
- {
- int lines_height = 0;
- if (text_pasted)
- {
- // text is pasted and now mLineInfoList.size() > mExpandLineCounts and mLineInfoList is not empty,
- // so lines_height is the sum of the last 'expanded_line_count' lines height
- lines_height = (mLineInfoList.end() - line_count)->mRect.mTop - mLineInfoList.back().mRect.mBottom;
- }
- else
- {
- lines_height = mLineInfoList.begin()->mRect.mTop - mLineInfoList.back().mRect.mBottom;
- }
-
- int height = mVPad * 2 + lines_height;
-
- LLRect doc_rect = getRect();
- doc_rect.setOriginAndSize(doc_rect.mLeft, doc_rect.mBottom, doc_rect.getWidth(), height);
- setShape(doc_rect);
-
- mPrevLinesCount = getLineCount();
-
- if (mTextExpandedSignal)
- {
- (*mTextExpandedSignal)(this, LLSD() );
- }
-
- needsReflow();
- }
-}
-
-// line history support
-void LLChatEntry::updateHistory()
-{
- // On history enabled, remember committed line and
- // reset current history line number.
- // Be sure only to remember lines that are not empty and that are
- // different from the last on the list.
- if (mHasHistory && getLength())
- {
- // Add text to history, ignoring duplicates
- if (mLineHistory.empty() || getText() != mLineHistory.back())
- {
- mLineHistory.push_back(getText());
- }
-
- mCurrentHistoryLine = mLineHistory.end();
- }
-}
-
-void LLChatEntry::beforeValueChange()
-{
- if(this->getLength() == 0 && !mLabel.empty())
- {
- this->clearSegments();
- }
-}
-
-void LLChatEntry::onValueChange(S32 start, S32 end)
-{
- //Internally resetLabel() must meet a condition before it can reset the label
- resetLabel();
-}
-
-bool LLChatEntry::useLabel() const
-{
- return !getLength() && !mLabel.empty();
-}
-
-void LLChatEntry::onFocusReceived()
-{
- LLUICtrl::onFocusReceived();
- updateAllowingLanguageInput();
-}
-
-void LLChatEntry::onFocusLost()
-{
- LLTextEditor::focusLostHelper();
- LLUICtrl::onFocusLost();
-}
-
-bool LLChatEntry::handleSpecialKey(const KEY key, const MASK mask)
-{
- bool handled = false;
-
- LLTextEditor::handleSpecialKey(key, mask);
-
- switch(key)
- {
- case KEY_RETURN:
- if (MASK_NONE == mask)
- {
- needsReflow();
- }
- break;
-
- case KEY_UP:
- if (mHasHistory && MASK_CONTROL == mask)
- {
- if (!mLineHistory.empty() && mCurrentHistoryLine > mLineHistory.begin())
- {
- setText(*(--mCurrentHistoryLine));
- endOfDoc();
- }
- else
- {
- LLUI::getInstance()->reportBadKeystroke();
- }
- handled = true;
- }
- break;
-
- case KEY_DOWN:
- if (mHasHistory && MASK_CONTROL == mask)
- {
- if (!mLineHistory.empty() && mCurrentHistoryLine < (mLineHistory.end() - 1) )
- {
- setText(*(++mCurrentHistoryLine));
- endOfDoc();
- }
- else if (!mLineHistory.empty() && mCurrentHistoryLine == (mLineHistory.end() - 1) )
- {
- mCurrentHistoryLine++;
- std::string empty("");
- setText(empty);
- needsReflow();
- endOfDoc();
- }
- else
- {
- LLUI::getInstance()->reportBadKeystroke();
- }
- handled = true;
- }
- break;
-
- default:
- break;
- }
-
- return handled;
-}
-
-void LLChatEntry::enableSingleLineMode(bool single_line_mode)
-{
- if (mScroller)
- {
- mScroller->setSize(single_line_mode ? 0 : -1);
- }
-
- mSingleLineMode = single_line_mode;
- mPrevLinesCount = -1;
- setWordWrap(!single_line_mode);
-}
+/**
+ * @file llchatentry.cpp
+ * @brief LLChatEntry implementation
+ *
+ * $LicenseInfo:firstyear=2001&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2012, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+#include "linden_common.h"
+#include "llscrollcontainer.h"
+
+#include "llchatentry.h"
+
+static LLDefaultChildRegistry::Register<LLChatEntry> r("chat_editor");
+
+LLChatEntry::Params::Params()
+: has_history("has_history", true),
+ is_expandable("is_expandable", false),
+ expand_lines_count("expand_lines_count", 1)
+{}
+
+LLChatEntry::LLChatEntry(const Params& p)
+: LLTextEditor(p),
+ mTextExpandedSignal(NULL),
+ mHasHistory(p.has_history),
+ mIsExpandable(p.is_expandable),
+ mExpandLinesCount(p.expand_lines_count),
+ mPrevLinesCount(0),
+ mSingleLineMode(false),
+ mPrevExpandedLineCount(S32_MAX)
+{
+ // Initialize current history line iterator
+ mCurrentHistoryLine = mLineHistory.begin();
+
+ mAutoIndent = false;
+ keepSelectionOnReturn(true);
+}
+
+LLChatEntry::~LLChatEntry()
+{
+ delete mTextExpandedSignal;
+}
+
+void LLChatEntry::draw()
+{
+ if(mIsExpandable)
+ {
+ reflow();
+ expandText();
+ }
+ LLTextEditor::draw();
+}
+
+void LLChatEntry::onCommit()
+{
+ updateHistory();
+ LLTextEditor::onCommit();
+}
+
+boost::signals2::connection LLChatEntry::setTextExpandedCallback(const commit_signal_t::slot_type& cb)
+{
+ if (!mTextExpandedSignal)
+ {
+ mTextExpandedSignal = new commit_signal_t();
+ }
+ return mTextExpandedSignal->connect(cb);
+}
+
+void LLChatEntry::expandText()
+{
+ S32 line_count = mSingleLineMode ? 1 : mExpandLinesCount;
+
+ int visible_lines_count = llabs(getVisibleLines(true).first - getVisibleLines(true).second);
+ bool can_changed = getLineCount() <= line_count || line_count < mPrevExpandedLineCount ;
+ mPrevExpandedLineCount = line_count;
+
+ // true if pasted text has more lines than expand height limit and expand limit is not reached yet
+ bool text_pasted = (getLineCount() > line_count) && (visible_lines_count < line_count);
+
+ if (mIsExpandable && (can_changed || text_pasted || mSingleLineMode) && getLineCount() != mPrevLinesCount)
+ {
+ int lines_height = 0;
+ if (text_pasted)
+ {
+ // text is pasted and now mLineInfoList.size() > mExpandLineCounts and mLineInfoList is not empty,
+ // so lines_height is the sum of the last 'expanded_line_count' lines height
+ lines_height = (mLineInfoList.end() - line_count)->mRect.mTop - mLineInfoList.back().mRect.mBottom;
+ }
+ else
+ {
+ lines_height = mLineInfoList.begin()->mRect.mTop - mLineInfoList.back().mRect.mBottom;
+ }
+
+ int height = mVPad * 2 + lines_height;
+
+ LLRect doc_rect = getRect();
+ doc_rect.setOriginAndSize(doc_rect.mLeft, doc_rect.mBottom, doc_rect.getWidth(), height);
+ setShape(doc_rect);
+
+ mPrevLinesCount = getLineCount();
+
+ if (mTextExpandedSignal)
+ {
+ (*mTextExpandedSignal)(this, LLSD() );
+ }
+
+ needsReflow();
+ }
+}
+
+// line history support
+void LLChatEntry::updateHistory()
+{
+ // On history enabled, remember committed line and
+ // reset current history line number.
+ // Be sure only to remember lines that are not empty and that are
+ // different from the last on the list.
+ if (mHasHistory && getLength())
+ {
+ // Add text to history, ignoring duplicates
+ if (mLineHistory.empty() || getText() != mLineHistory.back())
+ {
+ mLineHistory.push_back(getText());
+ }
+
+ mCurrentHistoryLine = mLineHistory.end();
+ }
+}
+
+void LLChatEntry::beforeValueChange()
+{
+ if(this->getLength() == 0 && !mLabel.empty())
+ {
+ this->clearSegments();
+ }
+}
+
+void LLChatEntry::onValueChange(S32 start, S32 end)
+{
+ //Internally resetLabel() must meet a condition before it can reset the label
+ resetLabel();
+}
+
+bool LLChatEntry::useLabel() const
+{
+ return !getLength() && !mLabel.empty();
+}
+
+void LLChatEntry::onFocusReceived()
+{
+ LLUICtrl::onFocusReceived();
+ updateAllowingLanguageInput();
+}
+
+void LLChatEntry::onFocusLost()
+{
+ LLTextEditor::focusLostHelper();
+ LLUICtrl::onFocusLost();
+}
+
+bool LLChatEntry::handleSpecialKey(const KEY key, const MASK mask)
+{
+ bool handled = false;
+
+ LLTextEditor::handleSpecialKey(key, mask);
+
+ switch(key)
+ {
+ case KEY_RETURN:
+ if (MASK_NONE == mask)
+ {
+ needsReflow();
+ }
+ break;
+
+ case KEY_UP:
+ if (mHasHistory && MASK_CONTROL == mask)
+ {
+ if (!mLineHistory.empty() && mCurrentHistoryLine > mLineHistory.begin())
+ {
+ setText(*(--mCurrentHistoryLine));
+ endOfDoc();
+ }
+ else
+ {
+ LLUI::getInstance()->reportBadKeystroke();
+ }
+ handled = true;
+ }
+ break;
+
+ case KEY_DOWN:
+ if (mHasHistory && MASK_CONTROL == mask)
+ {
+ if (!mLineHistory.empty() && mCurrentHistoryLine < (mLineHistory.end() - 1) )
+ {
+ setText(*(++mCurrentHistoryLine));
+ endOfDoc();
+ }
+ else if (!mLineHistory.empty() && mCurrentHistoryLine == (mLineHistory.end() - 1) )
+ {
+ mCurrentHistoryLine++;
+ std::string empty("");
+ setText(empty);
+ needsReflow();
+ endOfDoc();
+ }
+ else
+ {
+ LLUI::getInstance()->reportBadKeystroke();
+ }
+ handled = true;
+ }
+ break;
+
+ default:
+ break;
+ }
+
+ return handled;
+}
+
+void LLChatEntry::enableSingleLineMode(bool single_line_mode)
+{
+ if (mScroller)
+ {
+ mScroller->setSize(single_line_mode ? 0 : -1);
+ }
+
+ mSingleLineMode = single_line_mode;
+ mPrevLinesCount = -1;
+ setWordWrap(!single_line_mode);
+}