From 3eeae12c498d1a4dbe969462d2ba841f77ee3ccb Mon Sep 17 00:00:00 2001
From: Andrei Karas <akaras@inbox.ru>
Date: Sun, 2 Jan 2011 01:48:38 +0200
Subject: Initial commit.

This code based on mana client http://www.gitorious.org/mana/mana
and my private repository.
---
 src/gui/chat.h | 318 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 318 insertions(+)
 create mode 100644 src/gui/chat.h

(limited to 'src/gui/chat.h')

diff --git a/src/gui/chat.h b/src/gui/chat.h
new file mode 100644
index 000000000..444057b57
--- /dev/null
+++ b/src/gui/chat.h
@@ -0,0 +1,318 @@
+/*
+ *  The Mana Client
+ *  Copyright (C) 2004-2009  The Mana World Development Team
+ *  Copyright (C) 2009-2010  The Mana Developers
+ *
+ *  This file is part of The Mana Client.
+ *
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; either version 2 of the License, or
+ *  any later version.
+ *
+ *  This program 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 General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef CHAT_H
+#define CHAT_H
+
+#include "listener.h"
+
+#include "gui/widgets/window.h"
+
+#include <guichan/actionlistener.hpp>
+#include <guichan/keylistener.hpp>
+#include <guichan/widget.hpp>
+#include <guichan/widgetlistener.hpp>
+
+#include <list>
+#include <string>
+#include <map>
+#include <vector>
+#include <set>
+
+#ifdef __GNUC__
+#define _UNUSED_  __attribute__ ((unused))
+#else
+#define _UNUSED_
+#endif
+
+class BrowserBox;
+class ChatTab;
+class Channel;
+class ChatInput;
+class ColorListModel;
+class ScrollArea;
+class TabbedArea;
+class ItemLinkHandler;
+class Tab;
+class WhisperTab;
+
+#define DEFAULT_CHAT_WINDOW_SCROLL 7 // 1 means `1/8th of the window size'.
+
+enum Own
+{
+    BY_GM = 0,
+    BY_PLAYER,
+    BY_OTHER,
+    BY_SERVER,
+    BY_CHANNEL,
+    ACT_WHISPER,      // getting whispered at
+    ACT_IS,           // equivalent to "/me" on IRC
+    BY_LOGGER,
+    BY_UNKNOWN = -1
+};
+
+/** One item in the chat log */
+struct CHATLOG
+{
+    std::string nick;
+    std::string text;
+    Own own;
+};
+
+/**
+ * The chat window.
+ *
+ * \ingroup Interface
+ */
+class ChatWindow : public Window,
+                   public gcn::ActionListener,
+                   public gcn::KeyListener,
+                   public Mana::Listener
+{
+    public:
+        /**
+         * Constructor.
+         */
+        ChatWindow();
+
+        /**
+         * Destructor: used to write back values to the config file
+         */
+        ~ChatWindow();
+
+        /**
+         * Reset the chat window to default positions.
+         */
+        void resetToDefaultSize();
+
+        /**
+         * Gets the focused tab.
+         */
+        ChatTab *getFocused() const;
+
+        /**
+         * Clear the given tab.
+         */
+        void clearTab(ChatTab *tab);
+
+        /**
+         * Clear the current tab.
+         */
+        void clearTab();
+
+        /**
+         * Switch to the previous tab in order
+         */
+        void prevTab();
+
+        /**
+         * Switch to the next tab in order
+         */
+        void nextTab();
+
+        /**
+         * Switch to the default tab
+         */
+        void defaultTab();
+
+        /**
+         * Performs action.
+         */
+        void action(const gcn::ActionEvent &event);
+
+        /**
+         * Request focus for typing chat message.
+         *
+         * \returns true if the input was shown
+         *          false otherwise
+         */
+        bool requestChatFocus();
+
+        /**
+         * Checks whether ChatWindow is Focused or not.
+         */
+        bool isInputFocused() const;
+
+        /**
+         * Passes the text to the current tab as input
+         *
+         * @param msg  The message text which is to be sent.
+         */
+        void chatInput(const std::string &msg);
+
+        /**
+         * Passes the text to the local chat tab as input
+         *
+         * @param msg  The message text which is to be sent.
+         */
+        void localChatInput(const std::string &msg);
+
+        /** Called when key is pressed */
+        void keyPressed(gcn::KeyEvent &event);
+
+        /** Set the chat input as the given text. */
+        void setInputText(const std::string &text);
+
+        /** Add the given text to the chat input. */
+        void addInputText(const std::string &text, bool space = true);
+
+        /** Called to add item to chat */
+        void addItemText(const std::string &item);
+
+        /** Override to reset mTmpVisible */
+        void setVisible(bool visible);
+
+        /**
+         * Handles mouse when dragged.
+         */
+        void mouseDragged(gcn::MouseEvent &event);
+
+        /**
+         * Handles mouse when pressed.
+         */
+        void mousePressed(gcn::MouseEvent &event);
+
+        void event(Channels channel, const Mana::Event &event);
+
+        /**
+         * Scrolls the chat window
+         *
+         * @param amount direction and amount to scroll.  Negative numbers scroll
+         * up, positive numbers scroll down.  The absolute amount indicates the
+         * amount of 1/8ths of chat window real estate that should be scrolled.
+         */
+        void scroll(int amount);
+
+        /**
+         * Sets the file being recorded to
+         *
+         * @param msg The file to write out to. If null, then stop recording.
+         */
+        void setRecordingFile(const std::string &msg);
+
+        bool getReturnTogglesChat() const
+        { return mReturnToggles; }
+
+        void setReturnTogglesChat(bool toggles)
+        { mReturnToggles = toggles; }
+
+        void doPresent();
+
+        void whisper(const std::string &nick, const std::string &mes,
+                     Own own = BY_OTHER);
+
+        ChatTab *addWhisperTab(const std::string &nick, bool switchTo = false);
+
+        ChatTab *getWhisperTab(const std::string &nick) const;
+
+        void removeAllWhispers();
+
+        void ignoreAllWhispers();
+
+        void resortChatLog(std::string line, Own own = BY_UNKNOWN,
+                           bool ignoreRecord = false,
+                           bool tryRemoveColors = true);
+
+        void battleChatLog(std::string line, Own own = BY_UNKNOWN,
+                           bool ignoreRecord = false,
+                           bool tryRemoveColors = true);
+
+        void updateOnline(std::set<std::string> &onlinePlayers);
+
+        void loadState();
+
+        void saveState();
+
+        std::string doReplace(const std::string &msg);
+
+    protected:
+        friend class ChatTab;
+        friend class WhisperTab;
+        friend class PopupMenu;
+
+        /** Remove the given tab from the window */
+        void removeTab(ChatTab *tab);
+
+        /** Add the tab to the window */
+        void addTab(ChatTab *tab);
+
+        void removeWhisper(const std::string &nick);
+
+        void adjustTabSize();
+
+        void autoComplete();
+
+        std::string addColors(std::string &msg);
+
+        std::string autoCompleteHistory(std::string partName);
+
+        std::string autoCompleteCommands(std::string partName);
+
+        std::string autoComplete(std::vector<std::string> &names,
+                                 std::string partName) const;
+
+        /** Used for showing item popup on clicking links **/
+        ItemLinkHandler *mItemLinkHandler;
+
+        /** Input box for typing chat messages. */
+        ChatInput *mChatInput;
+
+        void widgetResized(const gcn::Event &event);
+
+        void initTradeFilter();
+
+        int mRainbowColor;
+
+    private:
+        void fillCommands();
+
+        bool mTmpVisible;
+
+        /** Tabbed area for holding each channel. */
+        TabbedArea *mChatTabs;
+
+        typedef std::map<const std::string, ChatTab*> TabMap;
+        /** Manage whisper tabs */
+        TabMap mWhispers;
+
+        typedef std::list<std::string> History;
+        typedef History::iterator HistoryIterator;
+        History mHistory;           /**< Command history. */
+        HistoryIterator mCurHist;   /**< History iterator. */
+
+        typedef std::list<std::string> Commands;
+        typedef Commands::iterator CommandsIterator;
+        History mCommands;           /**< Command list. */
+
+        bool mReturnToggles; /**< Marks whether <Return> toggles the chat log
+                                or not */
+
+        std::list<std::string> mTradeFilter;
+
+        gcn::DropDown *mColorPicker;
+        ColorListModel *mColorListModel;
+        int mChatColor;
+        unsigned int mChatHistoryIndex;
+};
+
+extern ChatWindow *chatWindow;
+
+#endif
-- 
cgit v1.2.3-70-g09d2