1 /*************************************************************************** 2 * * 3 * This program is free software; you can redistribute it and/or modify * 4 * it under the terms of the GNU General Public License as published by * 5 * the Free Software Foundation; either version 3 of the License, or * 6 * (at your option) any later version. * 7 * * 8 ***************************************************************************/ 9 10 #pragma once 11 12 #include <QWidget> 13 #include <QEvent> 14 #include <QKeyEvent> 15 #include <QShowEvent> 16 #include <QHideEvent> 17 #include <QMap> 18 #include <QMenu> 19 #include <QAction> 20 #include <QHash> 21 #include <QSortFilterProxyModel> 22 #include <QCompleter> 23 #include <QMetaType> 24 #include <QTextBlockUserData> 25 26 #include "ui_HubFrame.h" 27 28 #include "dcpp/stdinc.h" 29 #include "dcpp/FastAlloc.h" 30 #include "dcpp/ClientListener.h" 31 #include "dcpp/ClientManager.h" 32 #include "dcpp/ClientManagerListener.h" 33 #include "dcpp/TaskQueue.h" 34 #include "dcpp/User.h" 35 #include "dcpp/Client.h" 36 #include "dcpp/FavoriteManagerListener.h" 37 38 #include "ArenaWidget.h" 39 #include "WulforUtil.h" 40 41 class ShellCommandRunner; 42 class PMWindow; 43 class HubFramePrivate; 44 45 using namespace dcpp; 46 47 class UserListUserData : public QTextBlockUserData 48 { 49 public: UserListUserData(const QString & nick)50 UserListUserData(const QString& nick) : data(nick) { } 51 QString data; 52 }; 53 54 class HubFrame : 55 public QWidget, 56 private Ui::UIHubFrame, 57 private dcpp::ClientListener, 58 private FavoriteManagerListener, 59 public ArenaWidget 60 { 61 Q_OBJECT Q_INTERFACES(ArenaWidget)62 Q_INTERFACES(ArenaWidget) 63 64 class Menu{ 65 66 public: 67 68 enum Action{ 69 /** Actions for userlist */ 70 CopyText=0, 71 SearchText, 72 CopyNick, 73 FindInList, 74 BrowseFilelist, 75 MatchQueue, 76 PrivateMessage, 77 FavoriteAdd, 78 FavoriteRem, 79 GrantSlot, 80 RemoveQueue, 81 UserCommands, 82 83 /** Additional actions for chat */ 84 ClearChat, 85 FindInChat, 86 DisableChat, 87 SelectAllChat, 88 ZoomInChat, 89 ZoomOutChat, 90 91 None, 92 93 /** Additional actions for userlist */ 94 CopyIP, 95 CopyShare, 96 CopyTag, 97 98 /** Additional actions for AntiSpam */ 99 AntiSpamWhite, 100 AntiSpamBlack 101 }; 102 103 Menu(); 104 virtual ~Menu(); 105 106 static void newInstance(); 107 static void deleteInstance(); 108 static Menu *getInstance(); 109 110 Action execUserMenu(Client*, const QString&); 111 Action execChatMenu(Client*, const QString&, bool pmw); 112 113 QString getLastUserCmd() const; 114 115 private: 116 QMenu *menu; 117 QList<QAction*> actions; // actions list for menu 118 QList<QAction*> pm_actions; // actions list for menu in PMWindow 119 QList<QAction*> ul_actions; // actions list for menu in user list 120 QList<QAction*> chat_actions; // chat actions list for menu 121 QList<QAction*> pm_chat_actions; // chat actions list for menu in PMWindow 122 QMap<QAction*, Action> chat_actions_map; //chat menu has separators and because of it all actions are mapped 123 QString last_user_cmd; 124 static Menu *instance; 125 static unsigned counter; 126 }; 127 128 public: 129 class LinkParser{ 130 public: 131 static QString parseForLinks(QString, bool); 132 static void parseForMagnetAlias(QString &output);//find and replace <magnet ...></magnet> sections 133 }; 134 135 typedef QMap<QString, PMWindow*> PMMap; 136 typedef QMap<QString, QVariant> VarMap; 137 typedef QList<ShellCommandRunner*> ShellList; 138 139 HubFrame(QWidget *parent, QString, QString); 140 ~HubFrame(); 141 142 bool parseForCmd(QString, QWidget *); 143 144 void createPMWindow(const QString&); 145 void createPMWindow(const dcpp::CID&); 146 147 bool hasCID(const dcpp::CID &, const QString &); 148 reconnect()149 inline void reconnect() { slotReconnect(); } 150 151 // PM functions 152 void addPM(QString, QString, bool keepfocus = true); 153 154 // Arena Widget interface 155 QWidget *getWidget(); 156 QString getArenaTitle(); 157 QString getArenaShortTitle(); 158 QMenu *getMenu(); 159 const QPixmap &getPixmap(); requestFilter()160 void requestFilter() { slotHideFindFrame(); } requestFocus()161 void requestFocus() { plainTextEdit_INPUT->setFocus(); } role()162 ArenaWidget::Role role() const { return ArenaWidget::Hub; } 163 164 QString getCIDforNick(QString nick); 165 166 Q_SIGNALS: 167 void coreConnecting(QString); 168 void coreConnected(QString); 169 void coreUserUpdated(const dcpp::UserPtr &user, const dcpp::Identity &id); 170 void coreUserRemoved(const dcpp::UserPtr &user, const dcpp::Identity &id); 171 void coreStatusMsg(QString); 172 void coreFollow(QString); 173 void coreFailed(); 174 void corePassword(); 175 void coreMessage(const VarMap&); 176 void corePrivateMsg(const VarMap&); 177 void coreHubUpdated(); 178 void coreFavoriteUserAdded(QString); 179 void coreFavoriteUserRemoved(QString); 180 void closeRequest(); 181 void highlighted(const VarMap&); 182 void new_msg(const VarMap&); 183 184 public Q_SLOTS: 185 void disableChat(); 186 void clearChat(); 187 void addStatus(QString); 188 QString getHubUrl(); 189 QString getHubName(); 190 QString getMyNick(); 191 void sendMsg(const QString&); 192 void disablePrivateMessages(bool disable);//disconnect corePrivateMsg from this 193 194 void reloadSomeSettings(); 195 void slotHideFindFrame(); 196 void slotActivate(); 197 void nextMsg(); 198 void prevMsg(); 199 200 void getStatistic(quint64 &users, quint64 &share) const; 201 bool isConnected() const; 202 bool isOP(const QString &nick); 203 204 void browseUserFiles(const QString&, bool=false); 205 206 protected: 207 virtual bool eventFilter(QObject *, QEvent *); 208 virtual void closeEvent(QCloseEvent*); 209 virtual void showEvent(QShowEvent *); 210 virtual void hideEvent(QHideEvent *); 211 212 virtual void sendChat(QString, bool, bool); 213 virtual void save(); 214 virtual void load(); 215 216 private Q_SLOTS: 217 void slotUsersUpdated(); 218 void slotReconnect(); 219 void slotMapOnArena(); 220 void slotClose(); 221 void slotPMClosed(QString); 222 void slotUserListMenu(const QPoint&); 223 void slotChatMenu(const QPoint&); 224 void slotHeaderMenu(const QPoint&); 225 void slotShowWnd(); 226 void slotShellFinished(bool, QString); 227 void slotFilterTextChanged(); slotFindForward()228 void slotFindForward() { findText(0); } slotFindBackward()229 void slotFindBackward(){ findText(QTextDocument::FindBackward); } 230 void slotFindTextEdited(const QString & text); 231 void slotInputTextChanged(); 232 void slotInputContextMenu(); 233 void slotFindAll(); 234 void slotStatusLinkOpen(const QString &url); 235 void slotHubMenu(QAction*); 236 void slotSmile(); 237 void slotSmileClicked(); 238 void slotSmileContextMenu(); 239 void slotSettingsChanged(const QString &, const QString &); 240 void slotBoolSettingsChanged(const QString&, int); 241 void slotCopyHubURL(); 242 void slotCopyHubTitle(); 243 void slotCopyHubIP(); 244 245 void grantSlot(const QString&); 246 void addUserToFav(const QString&); 247 void delUserFromFav(const QString&); 248 void changeFavStatus(const QString&); 249 void delUserFromQueue(const QString&); 250 void addAsFavorite(); 251 252 void userUpdated(const dcpp::UserPtr&, const dcpp::Identity&); 253 void userRemoved(const dcpp::UserPtr&, const dcpp::Identity&); 254 void follow(QString); 255 void clearUsers(); 256 void getPassword(); 257 void newMsg(const VarMap&); 258 void newPm(const VarMap&); 259 260 private: 261 // Chat functions 262 void addOutput(QString); 263 264 // GUI setup functions 265 void init(); 266 void initMenu(); 267 268 QString getUserInfo(UserListItem *item); 269 270 void pmUserOffline(QString); 271 void pmUserEvent(QString, QString); 272 273 void findText(QTextDocument::FindFlags ); 274 275 void updateStyles(); 276 277 /** Extracts data from user identity */ 278 void getParams(VarMap &, const Identity &); 279 280 // FavoriteManagerListener 281 virtual void on(FavoriteManagerListener::UserAdded, const FavoriteUser& /*aUser*/) noexcept; 282 virtual void on(FavoriteManagerListener::UserRemoved, const FavoriteUser& /*aUser*/) noexcept; 283 284 // ClientListener interface 285 virtual void on(ClientListener::Connecting, Client*) noexcept; 286 virtual void on(ClientListener::Connected, Client*) noexcept; 287 virtual void on(ClientListener::UserUpdated, Client*, const OnlineUser&) noexcept; 288 virtual void on(ClientListener::UsersUpdated, Client*, const OnlineUserList&) noexcept; 289 virtual void on(ClientListener::UserRemoved, Client*, const OnlineUser&) noexcept; 290 virtual void on(ClientListener::Redirect, Client*, const string&) noexcept; 291 virtual void on(ClientListener::Failed, Client*, const string&) noexcept; 292 virtual void on(ClientListener::GetPassword, Client*) noexcept; 293 virtual void on(ClientListener::HubUpdated, Client*) noexcept; 294 virtual void on(ClientListener::Message, Client*, const ChatMessage&) noexcept; 295 virtual void on(ClientListener::StatusMessage, Client*, const string&, int = ClientListener::FLAG_NORMAL) noexcept; 296 virtual void on(ClientListener::NickTaken, Client*) noexcept; 297 virtual void on(ClientListener::SearchFlood, Client*, const string&) noexcept; 298 299 Q_DECLARE_PRIVATE(HubFrame); 300 301 HubFramePrivate *d_ptr; 302 }; 303 304 Q_DECLARE_METATYPE(HubFrame*) 305