From db8b740bfa402c929247efd954096fac7b72b2a3 Mon Sep 17 00:00:00 2001
From: Philipp Sehmisch <tmw@crushnet.org>
Date: Fri, 26 Oct 2007 00:22:12 +0000
Subject: Added possibility of length limitation to browserbox and used it for
 the chatlog (length set by the config option "ChatLogLength").

---
 ChangeLog              |  3 +++
 src/gui/browserbox.cpp | 23 ++++++++++++++++-------
 src/gui/browserbox.h   |  8 +++++++-
 src/gui/chat.cpp       |  2 ++
 src/main.cpp           |  1 +
 5 files changed, 29 insertions(+), 8 deletions(-)

diff --git a/ChangeLog b/ChangeLog
index 6cff0a18..e526e6df 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -2,6 +2,9 @@
 
 	* src/gui/item_ammount.cpp: Item amount dialog is now skipped
 	when there is only one item on the stack.
+	* src/browserbox.cpp, src/browserbox.h, src/chat.h, src/main.cpp:
+	Added possibility of length limitation to browserbox and used it
+	for the chatlog (length set by the config option "ChatLogLength").
 
 2007-10-24  Philipp Sehmisch  <tmw@crushnet.org>
 
diff --git a/src/gui/browserbox.cpp b/src/gui/browserbox.cpp
index 21609434..185777d0 100644
--- a/src/gui/browserbox.cpp
+++ b/src/gui/browserbox.cpp
@@ -42,7 +42,9 @@ BrowserBox::BrowserBox(unsigned int mode):
     gcn::Widget(),
     mMode(mode), mHighMode(UNDERLINE | BACKGROUND),
     mOpaque(true),
-    mUseLinksAndUserColors(true), mSelectedLink(-1)
+    mUseLinksAndUserColors(true),
+    mSelectedLink(-1),
+    mMaxRows(0)
 {
     setFocusable(true);
     addMouseListener(this);
@@ -154,6 +156,12 @@ void BrowserBox::addRow(const std::string &row)
 
     mTextRows.push_back(newRow);
 
+    //discard older rows when a row limit has been set
+    if (mMaxRows > 0)
+    {
+        while (mTextRows.size() > mMaxRows) mTextRows.pop_front();
+    }
+
     // Auto size mode
     if (mMode == AUTO_SIZE)
     {
@@ -169,14 +177,15 @@ void BrowserBox::addRow(const std::string &row)
 
     if (mMode == AUTO_WRAP)
     {
-        unsigned int i, j, y = 0;
+        unsigned int j, y = 0;
         unsigned int nextChar;
         char hyphen = '~';
         int hyphenWidth = font->getWidth(hyphen);
         int x = 0;
-        for (i = 0; i < mTextRows.size(); i++)
+
+        for (TextRowIterator i = mTextRows.begin(); i != mTextRows.end(); i++)
         {
-            std::string row = mTextRows[i];
+            std::string row = *i;
             for (j = 0; j < row.size(); j++)
             {
                 x += font->getWidth(row.at(j));
@@ -290,17 +299,17 @@ BrowserBox::draw(gcn::Graphics *graphics)
         }
     }
 
-    unsigned int i, j;
+    unsigned int j;
     int x = 0, y = 0;
     int wrappedLines = 0;
     gcn::ImageFont *font = dynamic_cast<gcn::ImageFont*>(getFont());
 
     graphics->setColor(BLACK);
-    for (i = 0; i < mTextRows.size(); i++)
+    for (TextRowIterator i = mTextRows.begin(); i != mTextRows.end(); i++)
     {
         int selColor = BLACK;
         int prevColor = selColor;
-        std::string row = mTextRows[i];
+        std::string row = *(i);
         x = 0;
 
         for (j = 0; j < row.size(); j++)
diff --git a/src/gui/browserbox.h b/src/gui/browserbox.h
index 666a7754..9c0e8ef1 100644
--- a/src/gui/browserbox.h
+++ b/src/gui/browserbox.h
@@ -73,6 +73,11 @@ class BrowserBox : public gcn::Widget, public gcn::MouseListener
          */
         void setHighlightMode(unsigned int highMode);
 
+        /**
+         * Sets the maximum numbers of rows in the browser box. 0 = no limit.
+         */
+        void setMaxRow(int max) {mMaxRows = max; };
+
         /**
          * Disable links & user defined colors to be used in chat input.
          */
@@ -144,7 +149,7 @@ class BrowserBox : public gcn::Widget, public gcn::MouseListener
         };
 
     private:
-        typedef std::vector<std::string> TextRows;
+        typedef std::list<std::string> TextRows;
         typedef TextRows::iterator TextRowIterator;
         TextRows mTextRows;
 
@@ -158,6 +163,7 @@ class BrowserBox : public gcn::Widget, public gcn::MouseListener
         bool mOpaque;
         bool mUseLinksAndUserColors;
         int mSelectedLink;
+        unsigned int mMaxRows;
 
 #ifdef USE_OPENGL
         static int instances;      /**< Number of Window instances */
diff --git a/src/gui/chat.cpp b/src/gui/chat.cpp
index 48c84b96..10fc1577 100644
--- a/src/gui/chat.cpp
+++ b/src/gui/chat.cpp
@@ -33,6 +33,7 @@
 #include "scrollarea.h"
 #include "windowcontainer.h"
 
+#include "../configuration.h"
 #include "../game.h"
 #include "../localplayer.h"
 
@@ -61,6 +62,7 @@ ChatWindow::ChatWindow(Network *network):
     mTextOutput = new BrowserBox(BrowserBox::AUTO_WRAP);
     mTextOutput->setOpaque(false);
     mTextOutput->disableLinksAndUserColors();
+    mTextOutput->setMaxRow((int) config.getValue("ChatLogLength", 0));
     mScrollArea = new ScrollArea(mTextOutput);
     mScrollArea->setPosition(
             mScrollArea->getBorderSize(), mScrollArea->getBorderSize());
diff --git a/src/main.cpp b/src/main.cpp
index 066041a4..9c8b6f4e 100644
--- a/src/main.cpp
+++ b/src/main.cpp
@@ -234,6 +234,7 @@ void init_engine(const Options &options)
     config.setValue("fpslimit", 60);
     config.setValue("updatehost", "http://updates.themanaworld.org");
     config.setValue("customcursor", 1);
+    config.setValue("ChatLogLength", 64);
 
     // Checking if the configuration file exists... otherwise creates it with
     // default options !
-- 
cgit v1.2.3-70-g09d2