1 /*
2  * Copyright © 2004-2010 Jens Oknelid, paskharen@gmail.com
3  *
4  * This program is free software; you can redistribute it and/or modify
5  * it under the terms of the GNU General Public License as published by
6  * the Free Software Foundation; either version 2 of the License, or
7  * (at your option) any later version.
8  *
9  * This program is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12  * GNU General Public License for more details.
13  *
14  * You should have received a copy of the GNU General Public License
15  * along with this program; if not, write to the Free Software
16  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
17  *
18  * In addition, as a special exception, compiling, linking, and/or
19  * using OpenSSL with this program is allowed.
20  */
21 
22 #pragma once
23 
24 #include <dcpp/stdinc.h>
25 #include <dcpp/ConnectionManager.h>
26 #include <dcpp/DownloadManager.h>
27 #include <dcpp/LogManager.h>
28 #include <dcpp/QueueManager.h>
29 #include <dcpp/TimerManager.h>
30 #include <dcpp/UploadManager.h>
31 #include <dcpp/FavoriteManager.h>
32 #include "entry.hh"
33 #include "treeview.hh"
34 #include "transfers.hh"
35 #include "message.hh"
36 #include "notify.hh"
37 
38 class BookEntry;
39 class Search;
40 
41 class MainWindow:
42     public Entry,
43     public dcpp::LogManagerListener,
44     public dcpp::QueueManagerListener,
45     public dcpp::TimerManagerListener
46 {
47     public:
48         MainWindow();
49         ~MainWindow();
50 
51         // Inherited from Entry
52         GtkWidget *getContainer();
53 
54         // GUI functions
55         void show();
56         void setTitle(const std::string& text);
57         void setUrgent_gui();
58         bool isActive_gui();
59         void removeBookEntry_gui(BookEntry *entry);
60         GtkWidget *currentPage_gui();
61         void raisePage_gui(GtkWidget *page);
62         static bool getUserCommandLines_gui(const std::string &command, dcpp::StringMap &ucParams);
63         void propertiesMagnetDialog_gui(std::string magnet);
64         void showMessageDialog_gui(const std::string primaryText, const std::string secondaryText);
65         void showDownloadQueue_gui();
66         void showFavoriteHubs_gui();
67         void showFavoriteUsers_gui();
68         void showFinishedDownloads_gui();
69         void showFinishedUploads_gui();
70         void showHub_gui(std::string address, std::string encoding = "");
71         void showSearchSpy_gui();
72         void showSearchADL_gui();
73         void showCmdDebug_gui();
74         void showUploadQueue_gui();
75         void addPrivateMessage_gui(Msg::TypeMsg typemsg, std::string cid, std::string hubUrl = "", std::string message = "", bool useSetting = FALSE);
76         void addPrivateStatusMessage_gui(Msg::TypeMsg typemsg, std::string cid, std::string message = "");
77         void showPublicHubs_gui();
78         void showShareBrowser_gui(dcpp::UserPtr user, std::string file, std::string dir, bool useSetting);
79         Search *addSearch_gui();
80         void addSearch_gui(std::string magnet);
81         void actionMagnet_gui(std::string magnet);
82         void setMainStatus_gui(std::string text, time_t t = time(NULL));
83         void showNotification_gui(std::string head, std::string body, Notify::TypeNotify notify);
84         GtkWidget* getChooserDialog_gui();
85         void fileToDownload_gui(std::string magnet, std::string path);
86         void parsePartial_gui(dcpp::HintedUser aUser, std::string txt);
87 
88         // Client functions
89         void openOwnList_client(bool useSetting);
90         void matchAllList_client();
91         void updateFavoriteHubMenu_client(const dcpp::FavoriteHubEntryList &fh);
92 
93     private:
94         typedef std::pair<std::string, std::string> ParamPair;
95         typedef std::vector<ParamPair> ListParamPair;
96 
97         // GUI functions
98         void loadIcons_gui();
99         void showTransfersPane_gui();
100         void autoOpen_gui();
101         void addTabMenuItem_gui(GtkWidget* menuItem, GtkWidget* page);
102         void removeTabMenuItem_gui(GtkWidget *menuItem);
103         void addBookEntry_gui(BookEntry *entry);
104         void previousTab_gui();
105         void nextTab_gui();
106         void onSwitchOnPage_gui(int pageNum);
107         BookEntry *findBookEntry(const EntryType type, const std::string &id = "");
108         void createStatusIcon_gui();
109         void updateStatusIconTooltip_gui(std::string download, std::string upload);
110         void setStats_gui(std::string hubs, std::string downloadSpeed,
111             std::string downloaded, std::string uploadSpeed, std::string uploaded);
112         void setToolbarButton_gui();
113         void setTabPosition_gui(int position);
114         void setToolbarStyle_gui(int style);
115         void removeTimerSource_gui();
116         void setChooseMagnetDialog_gui();
117         void showMagnetDialog_gui(const std::string &magnet, const std::string &name, const int64_t size,
118             const std::string &tth);
119         void showPortsError(const std::string& port);
120         void setToolbarMenu_gui(const std::string &item_key, const std::string &button_key, const std::string &key);
121         void updateFavoriteHubMenu_gui(ListParamPair list);
122         void checkToolbarMenu_gui();
123         void updateFreespaceBar_gui(std::string freespace, float freepercent);
124 
125         // GUI Callbacks
126         static gboolean onWindowState_gui(GtkWidget *widget, GdkEventWindowState *event, gpointer data);
127         static gboolean onFocusIn_gui(GtkWidget *widget, GdkEventFocus *event, gpointer data);
128         static gboolean onCloseWindow_gui(GtkWidget *widget, GdkEvent *event, gpointer data);
129         static gboolean onKeyPressed_gui(GtkWidget *widget, GdkEventKey *event, gpointer data);
130         static gboolean onButtonReleasePage_gui(GtkWidget *widget, GdkEventButton *event, gpointer data);
131         static gboolean animationStatusIcon_gui(gpointer data);
132         static void onRaisePage_gui(GtkMenuItem *item, gpointer data);
133         static void onPageSwitched_gui(GtkNotebook *notebook, GtkNotebook *page, guint num, gpointer data);
134         static void onPaneRealized_gui(GtkWidget *pane, gpointer data);
135         static void onConnectClicked_gui(GtkWidget *widget, gpointer data);
136         static void onFavoriteHubsClicked_gui(GtkWidget *widget, gpointer data);
137         static void onFavoriteUsersClicked_gui(GtkWidget *widget, gpointer data);
138         static void onPublicHubsClicked_gui(GtkWidget *widget, gpointer data);
139         static void onPreferencesClicked_gui(GtkWidget *widget, gpointer data);
140         static void onHashClicked_gui(GtkWidget *widget, gpointer data);
141         static void onSearchClicked_gui(GtkWidget *widget, gpointer data);
142         static void onSearchADLClicked_gui(GtkWidget *widget, gpointer data);
143         static void onSearchSpyClicked_gui(GtkWidget *widget, gpointer data);
144         static void onDownloadQueueClicked_gui(GtkWidget *widget, gpointer data);
145         static void onFinishedDownloadsClicked_gui(GtkWidget *widget, gpointer data);
146         static void onFinishedUploadsClicked_gui(GtkWidget *widget, gpointer data);
147         static void onQuitClicked_gui(GtkWidget *widget, gpointer data);
148         static void onOpenFileListClicked_gui(GtkWidget *widget, gpointer data);
149         static void onOpenOwnListClicked_gui(GtkWidget *widget, gpointer data);
150         static void onMatchAllList_gui(GtkWidget *widget, gpointer data);
151         static void onRefreshFileListClicked_gui(GtkWidget *widget, gpointer data);
152         static void onReconnectClicked_gui(GtkWidget *widget, gpointer data);
153         static void onCloseClicked_gui(GtkWidget *widget, gpointer data);
154         static void onPreviousTabClicked_gui(GtkWidget* widget, gpointer data);
155         static void onNextTabClicked_gui(GtkWidget* widget, gpointer data);
156         static void onAboutClicked_gui(GtkWidget *widget, gpointer data);
157         //static void onAboutDialogActivateLink_gui(GtkAboutDialog *dialog, const gchar *link, gpointer data);
158         static void onCloseBookEntry_gui(GtkWidget *widget, gpointer data);
159         static void onStatusIconActivated_gui(GtkStatusIcon *statusIcon, gpointer data);
160         static void onStatusIconPopupMenu_gui(GtkStatusIcon *statusIcon, guint button, guint time, gpointer data);
161         static void onStatusIconBlinkUseToggled_gui(GtkWidget *widget, gpointer data);
162         static void onShowInterfaceToggled_gui(GtkCheckMenuItem *item, gpointer data);
163         static void onLinkClicked_gui(GtkWidget *widget, gpointer data);
164         static void onTransferToggled_gui(GtkWidget *widget, gpointer data);
165         static void onBrowseMagnetButton_gui(GtkWidget *widget, gpointer data);
166         static void onDowloadQueueToggled_gui(GtkWidget *widget, gpointer data);
167         static void onSearchMagnetToggled_gui(GtkWidget *widget, gpointer data);
168         static void onSetMagnetChoiceDialog_gui(GtkWidget *widget, gpointer data);
169         static void onResponseMagnetDialog_gui(GtkWidget *dialog, gint response, gpointer data);
170         static gboolean onDeleteEventMagnetDialog_gui(GtkWidget *dialog, GdkEvent *event, gpointer data);
171         static gboolean onMenuButtonClicked_gui(GtkWidget *widget, gpointer data);
172         static gboolean onAddButtonClicked_gui(GtkWidget *widget, gpointer data);
173         static void menuPosition_gui(GtkMenu *menu, gint *x, gint *y, gboolean *push, gpointer data);
174         static void onToolToggled_gui(GtkWidget *widget, gpointer data);
175         static void onTopToolbarToggled_gui(GtkWidget *widget, gpointer data);
176         static void onLeftToolbarToggled_gui(GtkWidget *widget, gpointer data);
177         static void onHideToolbarToggled_gui(GtkWidget *widget, gpointer data);
178         static void onSizeToolbarToggled_gui(GtkWidget *widget, gpointer data);
179         static void onHubClicked_gui(GtkWidget *widget, gpointer data);
180         static void onTTHFileDialog_gui(GtkWidget *widget, gpointer data);
181         static void onTTHFileButton_gui(GtkWidget *widget, gpointer data);
182         static void onDebugCMD(GtkWidget *widget, gpointer data);
183         static void onFreeSpaceBar(GtkWidget *widget, gpointer data);
184         static void onUploadQueueClicked_gui(GtkWidget *widget, gpointer data);
185         /**/
186         static void onCloseAllHub_gui(GtkWidget *widget, gpointer data);
187         static void onCloseAllPM_gui(GtkWidget *widget, gpointer data);
188         static void onCloseAllSearch_gui(GtkWidget *widget, gpointer data);
189         static void onCloseAlloffPM_gui(GtkWidget *widget, gpointer data);
190         static void onReconectAllHub_gui(GtkWidget *widget, gpointer data);
191 
192         // Client functions
193         void autoConnect_client();
194         void startSocket_client(bool changed);
195         void refreshFileList_client();
196         void addFileDownloadQueue_client(std::string name, int64_t size, std::string tth);
197 
198         // Client callbacks
199         virtual void on(dcpp::LogManagerListener::Message, time_t t, const std::string &m) noexcept;
200         virtual void on(dcpp::QueueManagerListener::Finished, dcpp::QueueItem *item, const std::string& dir, int64_t avSpeed) noexcept;
201         virtual void on(dcpp::TimerManagerListener::Second, uint64_t ticks) noexcept;
202         virtual void on(dcpp::QueueManagerListener::PartialList, const dcpp::HintedUser& aUser, const std::string& text) noexcept;
203 
204         GtkWindow *window;
205         Transfers* transfers;
206         GtkStatusIcon *statusIcon;
207         int64_t lastUpdate, lastUp, lastDown;
208         bool minimized;
209         dcpp::StringList EntryList;
210         guint timer;
211         int statusFrame;
212         bool useStatusIconBlink;
213         bool onQuit;
214         int ToolbarStyle;
215 };
216