From bb5886f5351a148b5443adaee0a64ca6e81ee0b9 Mon Sep 17 00:00:00 2001 From: Eric Scrivner Date: Sun, 13 Mar 2005 21:57:24 +0000 Subject: Added line wrapping on a per-word basis --- src/gui/chat.cpp | 40 ++++++++++++++++++++++++++++++++++------ src/gui/chat.h | 10 ++++++++++ 2 files changed, 44 insertions(+), 6 deletions(-) diff --git a/src/gui/chat.cpp b/src/gui/chat.cpp index 95f29dbd..253fb3f4 100644 --- a/src/gui/chat.cpp +++ b/src/gui/chat.cpp @@ -96,10 +96,9 @@ void ChatWindow::chat_log(std::string line, int own) if (line.length() > maxLength) { + tempText = line; if (line.length() > maxLength) - tempText = line.substr(0, maxLength); - else - tempText = line; + line = cut_string(tempText, maxLength); tmp.text = tempText; @@ -107,9 +106,6 @@ void ChatWindow::chat_log(std::string line, int own) //chatlog_file.flush(); chatlog.push_front(tmp); - - if (line.length() > maxLength) - line = line.substr(maxLength, line.length() - maxLength); } else // Normal message { @@ -312,3 +308,35 @@ std::string ChatWindow::const_msg(CHATSKILL action) return msg; } + +std::string ChatWindow::cut_string(std::string& value, unsigned int maximumLength) +{ + // If the string exceeds the maximum length + if(value.length() > maximumLength) + { + unsigned int index = 0; + unsigned int lastSpace = 0; + std::string cutOff = ""; + + for(index = 0; index < maximumLength; index++) { + if(value.at(index) == ' ') { + lastSpace = index; + } + } + + // If the last space is at the beginning of the string + if(lastSpace == 0) { + // Just cut it right off from the end + cutOff = value.substr(maximumLength); + value = value.substr(0, maximumLength); + } else { + // Cut it off from the last space forward + cutOff = value.substr(lastSpace + 1); + value = value.substr(0, lastSpace); + } + + return cutOff; + } + + return std::string(""); +} \ No newline at end of file diff --git a/src/gui/chat.h b/src/gui/chat.h index 3102e3bc..db2d9843 100644 --- a/src/gui/chat.h +++ b/src/gui/chat.h @@ -181,6 +181,16 @@ class ChatWindow : public Window, public gcn::ActionListener { /** Constructs failed messages for actions */ std::string const_msg(CHATSKILL); + /** + * Cuts a string into two on a per word basis + * @param value The string to be cut, it may be modified + * in the function. + * @param maximumLength The length after which the string + * should be cut. + * @return The cut off section of the string + */ + std::string cut_string(std::string& value, unsigned int maximumLength); + /** Input box for chat messages */ gcn::TextField *chatInput; }; -- cgit v1.2.3-70-g09d2