Continuing the implementation of wishlist item #169427
[konversation:konversation.git] / src / irc / channel.h
1 /*
2   This program is free software; you can redistribute it and/or modify
3   it under the terms of the GNU General Public License as published by
4   the Free Software Foundation; either version 2 of the License, or
5   (at your option) any later version.
6 */
7
8 /*
9   Copyright (C) 2002 Dario Abatianni <eisfuchs@tigress.com>
10   Copyright (C) 2004-2006, 2009 Peter Simonsson <peter.simonsson@gmail.com>
11   Copyright (C) 2006-2008 Eike Hein <hein@kde.org>
12 */
13
14 #ifndef CHANNEL_H
15 #define CHANNEL_H
16
17 #include <config-konversation.h>
18
19 #include "server.h"
20 #include "chatwindow.h"
21 #include "channelnick.h"
22
23 #ifdef HAVE_QCA2
24 #include "cipher.h"
25 #endif
26
27 #include <QTimer>
28 #include <QString>
29
30
31 class QLabel;
32 class QTimer;
33 class QTreeWidgetItem;
34 class QStringList;
35 class QSplitter;
36 class QToolButton;
37
38 class KLineEdit;
39 class KVBox;
40 class KHBox;
41 class KComboBox;
42
43 class NickListView;
44 class Nick;
45 class QuickButton;
46 class ModeButton;
47 class IRCInput;
48 class NickChangeDialog;
49
50 namespace Konversation
51 {
52     class TopicLabel;
53     class ChannelOptionsDialog;
54 }
55
56 class NickList : public QList<Nick*>
57 {
58     public:
59         NickList();
60
61         QString completeNick(const QString& pattern, bool& complete, QStringList& found,
62                              bool skipNonAlfaNum, bool caseSensitive);
63
64         bool containsNick(const QString& nickname);
65
66 };
67
68 class Channel : public ChatWindow
69 {
70     Q_OBJECT
71
72     friend class Nick;
73
74     public:
75         explicit Channel(QWidget* parent, QString name);
76         ~Channel();
77 //META
78         virtual bool canBeFrontView();
79         virtual bool searchView();
80
81         virtual void append(const QString& nickname,const QString& message);
82         virtual void appendAction(const QString& nickname,const QString& message);
83         void nickActive(const QString& nickname);
84         #ifdef HAVE_QCA2
85         Konversation::Cipher* getCipher();
86         #endif
87 //General administrative stuff
88     public:
89         void setName(const QString& newName);
90         QString getPassword();
91
92         const Konversation::ChannelSettings channelSettings();
93
94         QString getPassword() const;
95
96         virtual void setServer(Server* newServer);
97
98         void setEncryptedOutput(bool);
99
100         bool joined() { return m_joined; }
101         bool rejoinable();
102 //Unsure of future placement and/or continued existence of these members
103         int numberOfNicks() const { return nicks; }
104         int numberOfOps() const { return ops; }
105         virtual void setChannelEncoding(const QString& encoding);
106         virtual QString getChannelEncoding();
107         virtual QString getChannelEncodingDefaultDesc();
108         virtual bool isInsertSupported() { return true; }
109
110     protected:
111         // use with caution! does not check for duplicates
112         void fastAddNickname(ChannelNickPtr channelnick, Nick *nick=0);
113         void setActive(bool active);
114         void repositionNick(Nick *nick);
115
116     public slots:
117         void setNickname(const QString& newNickname);
118         void scheduleAutoWho();
119         void setAutoUserhost(bool state);
120         void rejoin();
121
122     protected slots:
123         void autoUserhost();
124         void autoWho();
125         void fadeActivity();
126         virtual void serverOnline(bool online);
127         void delayedSortNickList();
128
129
130 //Nicklist
131     public:
132         void flushPendingNicks();
133
134         ChannelNickPtr getOwnChannelNick();
135         ChannelNickPtr getChannelNick(const QString &ircnick);
136
137         void joinNickname(ChannelNickPtr channelNick);
138         void removeNick(ChannelNickPtr channelNick, const QString &reason, bool quit);
139         void kickNick(ChannelNickPtr channelNick, const QString &kicker, const QString &reason);
140         void addNickname(ChannelNickPtr channelNick);
141         void nickRenamed(const QString &oldNick, const NickInfo& channelnick);
142         void resetNickList();
143         void addPendingNickList(const QStringList& pendingChannelNickList);
144         Nick *getNickByName(const QString& lookname);
145         NickList getNickList() { return nicknameList; }
146
147         void adjustNicks(int value);
148         void adjustOps(int value);
149         virtual void emitUpdateInfo();
150
151     protected slots:
152         void purgeNicks();
153         void processPendingNicks();
154
155         void updateNickInfos();
156         void updateChannelNicks(const QString& channel);
157 //Topic
158     public:
159         /** Get the current channel topic.
160          *
161          * The topic may or may not have the author that set it at the start of the string,
162          * like:  "<author> topic"
163          *
164          * The internal variable topicAuthorUnknown stores whether the "<author>" bit is there or not.
165          *
166          * */
167         QString getTopic();
168         /** Get the channel topic history sorted in reverse chronological order.
169          *
170          * Each topic may or may not have the author that set it at the start of the string,
171          * like:  "<author> topic"
172          *
173          * @return a list of topics this channel used to have, current at the top.
174          */
175         QStringList getTopicHistory();
176
177         void setTopic(const QString& topic);
178         void setTopic(const QString& nickname, const QString& topic);
179         void setTopicAuthor(const QString& author, QDateTime t);
180
181     signals:
182         void topicHistoryChanged();
183         void joined(Channel* channel);
184
185
186 //Modes
187 //TODO: the only representation of the channel limit is held in the GUI
188
189     public:
190         /// Internal - Empty the modelist
191         void clearModeList();
192         /// Get the list of modes that this channel has - e.g. {+l,+s,-m}
193         //TODO: does this method return a list of all modes, all modes that have been changed, or all modes that are +?
194         QStringList getModeList() const { return m_modeList; }
195
196         /** Outputs a message on the channel, and modifies the mode for a ChannelNick.
197          *  @param sourceNick The server or the nick of the person that made the mode change.
198          *  @param mode The mode that is changing one of v,h,o,a for voice halfop op admin
199          *  @param plus True if the mode is being granted, false if it's being taken away.
200          *  @param parameter This depends on what the mode change is.  In most cases it is the nickname of the person that is being given voice/op/admin etc.  See the code.
201          */
202         void updateMode(const QString& sourceNick, char mode, bool plus, const QString &parameter);
203
204     signals:
205         void modesChanged();
206
207 //Bans
208     public:
209
210         void addBan(const QString& ban);
211         void removeBan(const QString& ban);
212
213         void clearBanList();
214         QStringList getBanList() const { return m_BanList; }
215
216     signals:
217         void banAdded(const QString& newban);
218         void banRemoved(const QString& newban);
219         void banListCleared();
220
221 //Generic GUI
222     public:
223         virtual bool eventFilter(QObject* watched, QEvent* e);
224
225 //Specific GUI
226     public:
227         void updateModeWidgets(char mode, bool plus, const QString &parameter);
228         void updateQuickButtons(const QStringList &newButtonList);
229
230         /// Get the contents of the input line.
231         virtual QString getTextInLine();
232         /// Sounds suspiciously like a destructor..
233         virtual bool closeYourself(bool askForConfirmation=true);
234
235         bool autoJoin();
236
237         ChannelNickList getSelectedChannelNicks();
238         ///TODO: this looks like a half-arsed overload.
239         QStringList getSelectedNickList();
240
241         NickListView* getNickListView() const { return nicknameListView; }
242
243         Konversation::ChannelSettings channelSettings() const;
244
245     signals:
246         void sendFile();
247
248     public slots:
249         void updateAppearance();
250         void channelTextEntered();
251         void channelPassthroughCommand();
252         void sendChannelText(const QString& line);
253         void showOptionsDialog();
254         void showQuickButtons(bool show);
255         void showModeButtons(bool show);
256
257         void appendInputText(const QString& s, bool fromCursor);
258         virtual void indicateAway(bool show);
259         void showTopic(bool show);
260         void showNicknameBox(bool show);
261         void showNicknameList(bool show);
262
263         void setAutoJoin(bool autojoin);
264
265         void connectionStateChanged(Server*, Konversation::ConnectionState);
266
267     protected slots:
268         void completeNick(); ///< I guess this is a GUI function, might be nice to have at DCOP level though --argonel
269         void endCompleteNick();
270         void quickButtonClicked(const QString& definition);
271         void modeButtonClicked(int id,bool on);
272         void channelLimitChanged();
273
274         void popupChannelCommand(int id);         ///< Connected to IRCView::popupCommand()
275         void popupCommand(int id);                ///< Connected to NickListView::popupCommand()
276         void doubleClickCommand(QTreeWidgetItem *item,int column);  ///< Connected to NickListView::itemDoubleClicked()
277         // Dialogs
278         void changeNickname(const QString& newNickname);
279
280         void textPasted(const QString& text); ///< connected to IRCInput::textPasted() - used to handle large/multiline pastings
281
282         void sendFileMenu(); ///< connected to IRCInput::sendFile()
283         void nicknameComboboxChanged();
284         /// Enable/disable the mode buttons depending on whether you are op or not.
285         void refreshModeButtons();
286
287 //only the GUI cares about sorted nicklists
288         ///Request a delayed nicklist sorting
289         void requestNickListSort();
290         ///Sort the nicklist
291         void sortNickList(bool delayed=false);
292
293         void nicknameListViewTextChanged(int textChangedFlags);
294         void pasteNickname(const QString &nickname);
295     protected:
296         void showEvent(QShowEvent* event);
297         void syncSplitters();
298         /// Called from ChatWindow adjustFocus
299         virtual void childAdjustFocus();
300         /// Close the channel then come back in
301         void cycleChannel(); ///< TODO this is definately implemented and hooked incorrectly.
302
303         bool channelCommand;///< True if nick context menu is executed from IRCView
304
305         // to take care of redraw problem if hidden
306         bool quickButtonsChanged;
307         bool quickButtonsState;
308         bool modeButtonsChanged;
309         bool modeButtonsState;
310         bool awayChanged;
311         bool awayState;
312         bool splittersInitialized;
313         bool topicSplitterHidden;
314         bool channelSplitterHidden;
315
316         int completionPosition;
317
318         QSplitter* m_horizSplitter;
319         QSplitter* m_vertSplitter;
320         QWidget* topicWidget;
321         QToolButton* m_topicButton;
322         Konversation::TopicLabel* topicLine;
323
324         //TODO: abstract these
325         KHBox* modeBox;
326         ModeButton* modeT;
327         ModeButton* modeN;
328         ModeButton* modeS;
329         ModeButton* modeI;
330         ModeButton* modeP;
331         ModeButton* modeM;
332         ModeButton* modeK;
333         ModeButton* modeL;
334
335         KLineEdit* limit; //TODO: this GUI element is the only storage for the mode
336
337         NickListView* nicknameListView;
338         KHBox* commandLineBox;
339         KVBox* nickListButtons;
340         QWidget* m_buttonsGrid;
341         KComboBox* nicknameCombobox;
342         QString oldNick; ///< GUI
343         QLabel* awayLabel;
344         QLabel* cipherLabel;
345         IRCInput* channelInput;
346
347         NickChangeDialog* nickChangeDialog;
348         QList<QuickButton*> buttonList;
349
350 //Members from here to end are not GUI
351         bool m_joined;
352         NickList nicknameList;
353         QTimer userhostTimer;
354         int m_nicknameListViewTextChanged;
355
356         QStringList m_topicHistory;
357         QStringList m_BanList;
358         bool topicAuthorUnknown; ///< Stores whether the "<author>" bit is there or not.
359
360         bool m_firstAutoWhoDone;
361         QTimer m_whoTimer; ///< For continuous auto /WHO
362         QTimer m_fadeActivityTimer; ///< For the smoothing function used in activity sorting
363
364         QList<QStringList> m_pendingChannelNickLists;
365         int m_opsToAdd;
366         int m_currentIndex;
367
368         QTimer* m_processingTimer;
369
370         QTimer* m_delayedSortTimer;
371         int m_delayedSortTrigger;
372
373         QStringList m_modeList;
374         ChannelNickPtr m_ownChannelNick;
375
376         bool pendingNicks; ///< are there still nicks to be added by /names reply?
377         int nicks; ///< How many nicks on the channel
378         int ops; ///< How many ops on the channel
379
380         Konversation::ChannelOptionsDialog *m_optionsDialog;
381         #ifdef HAVE_QCA2
382         Konversation::Cipher *m_cipher;
383         #endif
384 };
385 #endif