No reason to drop requests of already downloading clients if the upload queue is...
[amule.git] / src / MuleTrayIcon.cpp
blob5a5239ee2facfff2f9be3ca8d4b42738158c8415
1 //
2 // This file is part of the aMule Project.
3 //
4 // Copyright (c) 2004-2008 Angel Vidal ( kry@amule.org )
5 // Copyright (c) 2003-2008 Patrizio Bassi ( hetfield@amule.org )
6 // Copyright (c) 2003-2008 aMule Team ( admin@amule.org / http://www.amule.org )
7 //
8 // Any parts of this program derived from the xMule, lMule or eMule project,
9 // or contributed by third-party developers are copyrighted by their
10 // respective authors.
12 // This program is free software; you can redistribute it and/or modify
13 // it under the terms of the GNU General Public License as published by
14 // the Free Software Foundation; either version 2 of the License, or
15 // (at your option) any later version.
17 // This program is distributed in the hope that it will be useful,
18 // but WITHOUT ANY WARRANTY; without even the implied warranty of
19 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
20 // GNU General Public License for more details.
21 //
22 // You should have received a copy of the GNU General Public License
23 // along with this program; if not, write to the Free Software
24 // Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
27 #include <wx/app.h>
29 #include "MuleTrayIcon.h"
31 #include <common/ClientVersion.h>
32 #include <common/Constants.h>
34 #include "pixmaps/mule_TrayIcon_big.ico.xpm"
35 #include "pixmaps/mule_Tr_yellow_big.ico.xpm"
36 #include "pixmaps/mule_Tr_grey_big.ico.xpm"
38 #include <wx/menu.h>
40 #include "amule.h" // Needed for theApp
41 #include "amuleDlg.h" // Needed for IsShown
42 #include "Preferences.h" // Needed for thePrefs
43 #include "ServerConnect.h" // Needed for CServerConnect
44 #include "Server.h" // Needed for CServer
45 #include "StatisticsDlg.h" // Needed for CStatisticsDlg::getColors()
46 #include "Statistics.h" // Needed for theStats
47 #include <common/Format.h> // Needed for CFormat
48 #include "Logger.h"
51 // Pop-up menu clickable entries
52 enum {
53 TRAY_MENU_INFO = 0,
54 TRAY_MENU_CLIENTINFO=0,
55 TRAY_MENU_CLIENTINFO_ITEM = 13007,
56 TRAY_MENU_DISCONNECT,
57 TRAY_MENU_CONNECT,
58 TRAY_MENU_HIDE,
59 TRAY_MENU_SHOW,
60 TRAY_MENU_EXIT,
61 UPLOAD_ITEM1=12340,
62 UPLOAD_ITEM2=12341,
63 UPLOAD_ITEM3=12342,
64 UPLOAD_ITEM4=12343,
65 UPLOAD_ITEM5=12344,
66 UPLOAD_ITEM6=12345,
67 DOWNLOAD_ITEM1=54320,
68 DOWNLOAD_ITEM2=54321,
69 DOWNLOAD_ITEM3=54322,
70 DOWNLOAD_ITEM4=54323,
71 DOWNLOAD_ITEM5=54324,
72 DOWNLOAD_ITEM6=54325
75 /****************************************************/
76 /******************* Event Table ********************/
77 /****************************************************/
79 BEGIN_EVENT_TABLE(CMuleTrayIcon, wxTaskBarIcon)
80 EVT_TASKBAR_LEFT_DCLICK(CMuleTrayIcon::SwitchShow)
81 EVT_MENU( TRAY_MENU_EXIT, CMuleTrayIcon::Close)
82 EVT_MENU( TRAY_MENU_CONNECT, CMuleTrayIcon::ServerConnection)
83 EVT_MENU( TRAY_MENU_DISCONNECT, CMuleTrayIcon::ServerConnection)
84 EVT_MENU( TRAY_MENU_HIDE, CMuleTrayIcon::ShowHide)
85 EVT_MENU( TRAY_MENU_SHOW, CMuleTrayIcon::ShowHide)
86 EVT_MENU( UPLOAD_ITEM1, CMuleTrayIcon::SetUploadSpeed)
87 EVT_MENU( UPLOAD_ITEM2, CMuleTrayIcon::SetUploadSpeed)
88 EVT_MENU( UPLOAD_ITEM3, CMuleTrayIcon::SetUploadSpeed)
89 EVT_MENU( UPLOAD_ITEM4, CMuleTrayIcon::SetUploadSpeed)
90 EVT_MENU( UPLOAD_ITEM5, CMuleTrayIcon::SetUploadSpeed)
91 EVT_MENU( UPLOAD_ITEM6, CMuleTrayIcon::SetUploadSpeed)
92 EVT_MENU( DOWNLOAD_ITEM1, CMuleTrayIcon::SetDownloadSpeed)
93 EVT_MENU( DOWNLOAD_ITEM2, CMuleTrayIcon::SetDownloadSpeed)
94 EVT_MENU( DOWNLOAD_ITEM3, CMuleTrayIcon::SetDownloadSpeed)
95 EVT_MENU( DOWNLOAD_ITEM4, CMuleTrayIcon::SetDownloadSpeed)
96 EVT_MENU( DOWNLOAD_ITEM5, CMuleTrayIcon::SetDownloadSpeed)
97 EVT_MENU( DOWNLOAD_ITEM6, CMuleTrayIcon::SetDownloadSpeed)
98 END_EVENT_TABLE()
100 /****************************************************/
101 /************ Constructor / Destructor **************/
102 /****************************************************/
104 long GetSpeedFromString(wxString label){
105 long temp;
106 label.Replace(_("kB/s"),wxT(""),TRUE);
107 label.Trim(FALSE);
108 label.Trim(TRUE);
109 label.ToLong(&temp);
110 return temp;
113 void CMuleTrayIcon::SetUploadSpeed(wxCommandEvent& event){
115 wxObject* obj=event.GetEventObject();
116 if (obj!=NULL) {
117 wxMenu *menu = dynamic_cast<wxMenu *>(obj);
118 if (menu) {
119 wxMenuItem* item=menu->FindItem(event.GetId());
120 if (item!=NULL) {
121 long temp;
122 if (item->GetItemLabelText()==(_("Unlimited"))) {
123 temp=UNLIMITED;
125 else {
126 temp=GetSpeedFromString(item->GetItemLabelText());
128 thePrefs::SetMaxUpload(temp);
130 #ifdef CLIENT_GUI
131 // Send preferences to core.
132 theApp->glob_prefs->SendToRemote();
133 #endif
139 void CMuleTrayIcon::SetDownloadSpeed(wxCommandEvent& event){
141 wxObject* obj=event.GetEventObject();
142 if (obj!=NULL) {
143 wxMenu *menu = dynamic_cast<wxMenu *>(obj);
144 if (menu) {
145 wxMenuItem* item=menu->FindItem(event.GetId());
146 if (item!=NULL) {
147 long temp;
148 if (item->GetItemLabelText()==(_("Unlimited"))) {
149 temp=UNLIMITED;
151 else {
152 temp=GetSpeedFromString(item->GetItemLabelText());
154 thePrefs::SetMaxDownload(temp);
156 #ifdef CLIENT_GUI
157 // Send preferences to core.
158 theApp->glob_prefs->SendToRemote();
159 #endif
166 void CMuleTrayIcon::ServerConnection(wxCommandEvent& WXUNUSED(event))
168 wxCommandEvent evt;
169 theApp->amuledlg->OnBnConnect(evt);
173 void CMuleTrayIcon::ShowHide(wxCommandEvent& WXUNUSED(event))
175 theApp->amuledlg->DoIconize(theApp->amuledlg->IsShown());
179 void CMuleTrayIcon::Close(wxCommandEvent& WXUNUSED(event))
181 if (theApp->amuledlg->IsEnabled()) {
182 theApp->amuledlg->Close();
187 CMuleTrayIcon::CMuleTrayIcon()
189 Old_Icon = -1;
190 Old_SpeedSize = 0xFFFF; // must be > any possible one.
192 // Create the background icons (speed improvement)
193 HighId_Icon_size = wxIcon(mule_TrayIcon_big_ico_xpm).GetHeight();
194 LowId_Icon_size = wxIcon(mule_Tr_yellow_big_ico_xpm).GetHeight();
195 Disconnected_Icon_size = wxIcon(mule_Tr_grey_big_ico_xpm).GetHeight();
198 CMuleTrayIcon::~CMuleTrayIcon()
202 /****************************************************/
203 /***************** Public Functions *****************/
204 /****************************************************/
206 void CMuleTrayIcon::SetTrayIcon(int Icon, uint32 percent)
208 int Bar_ySize = 0;
210 switch (Icon) {
211 case TRAY_ICON_HIGHID:
212 // Most likely case, test first
213 Bar_ySize = HighId_Icon_size;
214 break;
215 case TRAY_ICON_LOWID:
216 Bar_ySize = LowId_Icon_size;
217 break;
218 case TRAY_ICON_DISCONNECTED:
219 Bar_ySize = Disconnected_Icon_size;
220 break;
221 default:
222 wxFAIL;
225 // Lookup this values for speed improvement: don't draw if not needed
226 int NewSize = (Bar_ySize * percent) / 100;
228 if ((Old_Icon != Icon) || (Old_SpeedSize != NewSize)) {
230 if ((Old_SpeedSize > NewSize) || (Old_Icon != Icon)) {
231 // We have to rebuild the icon, because bar is lower now.
232 switch (Icon) {
233 case TRAY_ICON_HIGHID:
234 // Most likely case, test first
235 CurrentIcon = wxIcon(mule_TrayIcon_big_ico_xpm);
236 break;
237 case TRAY_ICON_LOWID:
238 CurrentIcon = wxIcon(mule_Tr_yellow_big_ico_xpm);
239 break;
240 case TRAY_ICON_DISCONNECTED:
241 CurrentIcon = wxIcon(mule_Tr_grey_big_ico_xpm);
242 break;
243 default:
244 wxFAIL;
248 Old_Icon = Icon;
249 Old_SpeedSize = NewSize;
251 // Do whatever to the icon before drawing it (percent)
253 wxBitmap TempBMP;
254 TempBMP.CopyFromIcon(CurrentIcon);
256 TempBMP.SetMask(NULL);
258 IconWithSpeed.SelectObject(TempBMP);
261 // Speed bar is: centered, taking 80% of the icon heigh, and
262 // right-justified taking a 10% of the icon width.
264 // X
265 int Bar_xSize = 4;
266 int Bar_xPos = CurrentIcon.GetWidth() - 5;
268 IconWithSpeed.SetBrush(*(wxTheBrushList->FindOrCreateBrush(CStatisticsDlg::getColors(11))));
269 IconWithSpeed.SetPen(*wxTRANSPARENT_PEN);
271 IconWithSpeed.DrawRectangle(Bar_xPos + 1, Bar_ySize - NewSize, Bar_xSize -2 , NewSize);
273 // Unselect the icon.
274 IconWithSpeed.SelectObject(wxNullBitmap);
276 // Do transparency
278 // Set a new mask with transparency set to red.
279 wxMask* new_mask = new wxMask(TempBMP, wxColour(0xFF, 0x00, 0x00));
281 TempBMP.SetMask(new_mask);
282 CurrentIcon.CopyFromBitmap(TempBMP);
284 UpdateTray();
288 void CMuleTrayIcon::SetTrayToolTip(const wxString& Tip)
290 CurrentTip = Tip;
291 UpdateTray();
294 /****************************************************/
295 /**************** Private Functions *****************/
296 /****************************************************/
298 void CMuleTrayIcon::UpdateTray()
300 // Icon update and Tip update
301 #ifndef __WXCOCOA__
302 if (IsOk())
303 #endif
305 SetIcon(CurrentIcon, CurrentTip);
310 wxMenu* CMuleTrayIcon::CreatePopupMenu()
312 // Creates dinamically the menu to show the user.
313 wxMenu *traymenu = new wxMenu();
314 traymenu->SetTitle(_("aMule Tray Menu"));
316 // Build the Top string name
317 wxString label = MOD_VERSION_LONG;
318 traymenu->Append(TRAY_MENU_INFO, label);
319 traymenu->AppendSeparator();
320 label = wxString(_("Speed limits:")) + wxT(" ");
322 // Check for upload limits
323 unsigned int max_upload = thePrefs::GetMaxUpload();
324 if ( max_upload == UNLIMITED ) {
325 label += _("UL: None");
327 else {
328 label += CFormat(_("UL: %u")) % max_upload;
330 label += wxT(", ");
332 // Check for download limits
333 unsigned int max_download = thePrefs::GetMaxDownload();
334 if ( max_download == UNLIMITED ) {
335 label += _("DL: None");
337 else {
338 label += CFormat(_("DL: %u")) % max_download;
341 traymenu->Append(TRAY_MENU_INFO, label);
342 label = CFormat(_("Download speed: %.1f")) % (theStats::GetDownloadRate() / 1024.0);
343 traymenu->Append(TRAY_MENU_INFO, label);
344 label = CFormat(_("Upload speed: %.1f")) % (theStats::GetUploadRate() / 1024.0);
345 traymenu->Append(TRAY_MENU_INFO, label);
346 traymenu->AppendSeparator();
348 // Client Info
349 wxMenu* ClientInfoMenu = new wxMenu();
350 ClientInfoMenu->SetTitle(_("Client Information"));
352 // User nick-name
354 wxString temp = CFormat(_("Nickname: %s")) % ( thePrefs::GetUserNick().IsEmpty() ? wxString(_("No Nickname Selected!")) : thePrefs::GetUserNick() );
356 ClientInfoMenu->Append(TRAY_MENU_CLIENTINFO_ITEM,temp);
359 // Client ID
361 wxString temp = _("ClientID: ");
363 if (theApp->IsConnectedED2K()) {
364 temp += CFormat(wxT("%u")) % theApp->GetED2KID();
365 } else {
366 temp += _("Not connected");
368 ClientInfoMenu->Append(TRAY_MENU_CLIENTINFO_ITEM,temp);
371 // Current Server and Server IP
373 wxString temp_name = _("ServerName: ");
374 wxString temp_ip = _("ServerIP: ");
376 if ( theApp->serverconnect->GetCurrentServer() ) {
377 temp_name += theApp->serverconnect->GetCurrentServer()->GetListName();
378 temp_ip += theApp->serverconnect->GetCurrentServer()->GetFullIP();
379 } else {
380 temp_name += _("Not connected");
381 temp_ip += _("Not Connected");
383 ClientInfoMenu->Append(TRAY_MENU_CLIENTINFO_ITEM,temp_name);
384 ClientInfoMenu->Append(TRAY_MENU_CLIENTINFO_ITEM,temp_ip);
387 // IP Address
389 wxString temp = CFormat(_("IP: %s")) % ( (theApp->GetPublicIP()) ? Uint32toStringIP(theApp->GetPublicIP()) : wxString(_("Unknown")) );
391 ClientInfoMenu->Append(TRAY_MENU_CLIENTINFO_ITEM,temp);
394 // TCP PORT
396 wxString temp;
397 if (thePrefs::GetPort()) {
398 temp = CFormat(_("TCP port: %d")) % thePrefs::GetPort();
399 } else {
400 temp=_("TCP port: Not ready");
402 ClientInfoMenu->Append(TRAY_MENU_CLIENTINFO_ITEM,temp);
405 // UDP PORT
407 wxString temp;
408 if (thePrefs::GetEffectiveUDPPort()) {
409 temp = CFormat(_("UDP port: %d")) % thePrefs::GetEffectiveUDPPort();
410 } else {
411 temp=_("UDP port: Not ready");
413 ClientInfoMenu->Append(TRAY_MENU_CLIENTINFO_ITEM,temp);
416 // Online Signature
418 wxString temp;
419 if (thePrefs::IsOnlineSignatureEnabled()) {
420 temp=_("Online Signature: Enabled");
422 else {
423 temp=_("Online Signature: Disabled");
425 ClientInfoMenu->Append(TRAY_MENU_CLIENTINFO_ITEM,temp);
428 // Uptime
430 wxString temp = CFormat(_("Uptime: %s")) % CastSecondsToHM(theStats::GetUptimeSeconds());
431 ClientInfoMenu->Append(TRAY_MENU_CLIENTINFO_ITEM,temp);
434 // Number of shared files
436 wxString temp = CFormat(_("Shared files: %d")) % theStats::GetSharedFileCount();
437 ClientInfoMenu->Append(TRAY_MENU_CLIENTINFO_ITEM,temp);
440 // Number of queued clients
442 wxString temp = CFormat(_("Queued clients: %d")) % theStats::GetWaitingUserCount();
443 ClientInfoMenu->Append(TRAY_MENU_CLIENTINFO_ITEM,temp);
446 // Total Downloaded
448 wxString temp = CastItoXBytes( theStats::GetSessionReceivedBytes() + thePrefs::GetTotalDownloaded() );
449 temp = CFormat(_("Total DL: %s")) % temp;
450 ClientInfoMenu->Append(TRAY_MENU_CLIENTINFO_ITEM,temp);
453 // Total Uploaded
455 wxString temp = CastItoXBytes( theStats::GetSessionSentBytes() + thePrefs::GetTotalUploaded() );
456 temp = CFormat(_("Total UL: %s")) % temp;
457 ClientInfoMenu->Append(TRAY_MENU_CLIENTINFO_ITEM,temp);
460 traymenu->Append(TRAY_MENU_CLIENTINFO,ClientInfoMenu->GetTitle(),ClientInfoMenu);
462 // Separator
463 traymenu->AppendSeparator();
465 // Upload Speed sub-menu
466 wxMenu* UploadSpeedMenu = new wxMenu();
467 UploadSpeedMenu->SetTitle(_("Upload limit"));
469 // Download Speed sub-menu
470 wxMenu* DownloadSpeedMenu = new wxMenu();
471 DownloadSpeedMenu->SetTitle(_("Download limit"));
473 // Upload Speed sub-menu
475 UploadSpeedMenu->Append(UPLOAD_ITEM1, _("Unlimited"));
477 uint32 max_ul_speed = thePrefs::GetMaxGraphUploadRate();
479 if ( max_ul_speed == UNLIMITED ) {
480 max_ul_speed = 100;
482 else if ( max_ul_speed < 10 ) {
483 max_ul_speed = 10;
486 for ( int i = 0; i < 5; i++ ) {
487 unsigned int tempspeed = (unsigned int)((double)max_ul_speed / 5) * (5 - i);
488 wxString temp = CFormat(wxT("%u %s")) % tempspeed % _("kB/s");
489 UploadSpeedMenu->Append((int)UPLOAD_ITEM1+i+1,temp);
492 traymenu->Append(0,UploadSpeedMenu->GetTitle(),UploadSpeedMenu);
494 // Download Speed sub-menu
496 DownloadSpeedMenu->Append(DOWNLOAD_ITEM1, _("Unlimited"));
498 uint32 max_dl_speed = thePrefs::GetMaxGraphDownloadRate();
500 if ( max_dl_speed == UNLIMITED ) {
501 max_dl_speed = 100;
503 else if ( max_dl_speed < 10 ) {
504 max_dl_speed = 10;
507 for ( int i = 0; i < 5; i++ ) {
508 unsigned int tempspeed = (unsigned int)((double)max_dl_speed / 5) * (5 - i);
509 wxString temp = CFormat(wxT("%d %s")) % tempspeed % _("kB/s");
510 DownloadSpeedMenu->Append((int)DOWNLOAD_ITEM1+i+1,temp);
514 traymenu->Append(0,DownloadSpeedMenu->GetTitle(),DownloadSpeedMenu);
515 // Separator
516 traymenu->AppendSeparator();
518 if (theApp->IsConnected()) {
519 //Disconnection Speed item
520 traymenu->Append(TRAY_MENU_DISCONNECT, _("Disconnect"));
521 } else {
522 //Connect item
523 traymenu->Append(TRAY_MENU_CONNECT, _("Connect"));
526 // Separator
527 traymenu->AppendSeparator();
529 if (theApp->amuledlg->IsShown()) {
530 //hide item
531 traymenu->Append(TRAY_MENU_HIDE, _("Hide aMule"));
532 } else {
533 //show item
534 traymenu->Append(TRAY_MENU_SHOW, _("Show aMule"));
537 // Separator
538 traymenu->AppendSeparator();
540 // Exit item
541 traymenu->Append(TRAY_MENU_EXIT, _("Exit"));
543 return traymenu;
546 void CMuleTrayIcon::SwitchShow(wxTaskBarIconEvent&)
548 theApp->amuledlg->DoIconize(theApp->amuledlg->IsShown());
550 // File_checked_for_headers