summaryrefslogtreecommitdiff
path: root/src/gui/chatwindow.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/gui/chatwindow.h')
-rw-r--r--src/gui/chatwindow.h319
1 files changed, 319 insertions, 0 deletions
diff --git a/src/gui/chatwindow.h b/src/gui/chatwindow.h
new file mode 100644
index 000000000..97f586442
--- /dev/null
+++ b/src/gui/chatwindow.h
@@ -0,0 +1,319 @@
+/*
+ * The ManaPlus Client
+ * Copyright (C) 2004-2009 The Mana World Development Team
+ * Copyright (C) 2009-2010 The Mana Developers
+ * Copyright (C) 2011 The ManaPlus Developers
+ *
+ * This file is part of The ManaPlus 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 CHATWINDOW_H
+#define CHATWINDOW_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