2006-10-20 15:00:14 +00:00
// Berkeley Open Infrastructure for Network Computing
// http://boinc.berkeley.edu
// Copyright (C) 2005 University of California
//
// This is free software; you can redistribute it and/or
// modify it under the terms of the GNU Lesser General Public
// License as published by the Free Software Foundation;
// either version 2.1 of the License, or (at your option) any later version.
//
// This software 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 Lesser General Public License for more details.
//
// To view the GNU Lesser General Public License visit
// http://www.gnu.org/copyleft/lesser.html
// or write to the Free Software Foundation, Inc.,
// 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
# if defined(__GNUG__) && !defined(__APPLE__)
# pragma implementation "sg_StatImageLoader.h"
# endif
2006-07-05 21:36:56 +00:00
# include "stdwx.h"
2006-10-20 15:00:14 +00:00
# include "diagnostics.h"
# include "util.h"
# include "mfile.h"
# include "miofile.h"
# include "parse.h"
# include "error_numbers.h"
2006-07-05 21:36:56 +00:00
# include "BOINCGUIApp.h"
2006-10-20 15:00:14 +00:00
# include "SkinManager.h"
# include "MainDocument.h"
2006-07-10 13:41:10 +00:00
# include "BOINCBaseFrame.h"
2006-10-20 15:00:14 +00:00
# include "sg_StatImageLoader.h"
2006-07-24 22:10:28 +00:00
# include "sg_ProjectsComponent.h"
2006-08-26 04:17:56 +00:00
# include "app_ipc.h"
2006-07-20 17:57:23 +00:00
2006-07-10 13:41:10 +00:00
enum {
WEBSITE_URL_MENU_ID = 34500 ,
2006-07-10 17:47:21 +00:00
WEBSITE_URL_MENU_ID_REMOVE_PROJECT = 34550 ,
2006-09-26 21:53:00 +00:00
WEBSITE_URL_MENU_ID_HOMEPAGE = 34551 ,
2006-07-10 13:41:10 +00:00
} ;
2006-07-05 21:36:56 +00:00
BEGIN_EVENT_TABLE ( StatImageLoader , wxWindow )
EVT_PAINT ( StatImageLoader : : OnPaint )
EVT_LEFT_DOWN ( StatImageLoader : : PopUpMenu )
2006-07-10 13:41:10 +00:00
EVT_MENU ( WEBSITE_URL_MENU_ID , StatImageLoader : : OnMenuLinkClicked )
2006-07-10 17:47:21 +00:00
EVT_MENU ( WEBSITE_URL_MENU_ID_REMOVE_PROJECT , StatImageLoader : : OnMenuLinkClicked )
2006-07-05 21:36:56 +00:00
END_EVENT_TABLE ( )
2006-08-07 15:33:03 +00:00
StatImageLoader : : StatImageLoader ( wxWindow * parent , std : : string url ) : wxWindow ( parent , wxID_ANY , wxDefaultPosition , wxSize ( 40 , 40 ) , wxNO_BORDER )
2006-07-10 13:41:10 +00:00
{
2006-07-11 23:19:53 +00:00
m_prjUrl = url ;
2006-10-16 20:46:57 +00:00
project_files_downloaded_time = 1 ;
project_last_rpc_time = 1 ;
BuildUserStatToolTip ( ) ;
statPopUpMenu = new wxMenu ( wxSIMPLE_BORDER ) ;
AddMenuItems ( ) ;
2006-07-05 21:36:56 +00:00
}
2006-10-10 02:53:25 +00:00
StatImageLoader : : ~ StatImageLoader ( ) {
2006-10-12 02:18:08 +00:00
delete statPopUpMenu ;
2006-10-10 02:53:25 +00:00
}
2006-07-21 08:23:26 +00:00
void StatImageLoader : : PopUpMenu ( wxMouseEvent & WXUNUSED ( event ) )
2006-07-05 21:36:56 +00:00
{
// pop up menu
2006-09-15 16:47:04 +00:00
PopupMenu ( statPopUpMenu ) ;
2006-07-05 21:36:56 +00:00
}
2006-09-08 21:48:06 +00:00
void StatImageLoader : : RebuildMenu ( ) {
2006-10-16 20:46:57 +00:00
for ( int i = ( int ) statPopUpMenu - > GetMenuItemCount ( ) - 1 ; i > = 0 ; i - - ) {
wxMenuItem * item = statPopUpMenu - > FindItemByPosition ( i ) ;
statPopUpMenu - > Delete ( item ) ;
}
AddMenuItems ( ) ;
2006-09-08 21:48:06 +00:00
}
2006-10-16 20:46:57 +00:00
void StatImageLoader : : BuildUserStatToolTip ( ) {
CMainDocument * pDoc = wxGetApp ( ) . GetDocument ( ) ;
PROJECT * project = pDoc - > state . lookup_project ( m_prjUrl ) ;
//user credit text
wxString userCredit ;
userCredit . Printf ( wxT ( " %0.2f " ) , project - > user_total_credit ) ;
wxString toolTipTxt = wxString ( project - > project_name . c_str ( ) , wxConvUTF8 ) + wxT ( " . User " ) + wxString ( project - > user_name . c_str ( ) , wxConvUTF8 ) + wxT ( " has " ) + userCredit + wxT ( " points. " ) ;
wxToolTip * userStatToolTip = new wxToolTip ( toolTipTxt ) ;
SetToolTip ( userStatToolTip ) ;
}
void StatImageLoader : : AddMenuItems ( )
2006-07-05 21:36:56 +00:00
{
2006-07-10 13:41:10 +00:00
CMainDocument * pDoc = wxGetApp ( ) . GetDocument ( ) ;
2006-07-05 21:36:56 +00:00
wxASSERT ( pDoc ) ;
2006-07-20 17:57:23 +00:00
appSkin = SkinClass : : Instance ( ) ;
2006-07-11 23:19:53 +00:00
PROJECT * project = pDoc - > state . lookup_project ( m_prjUrl ) ;
2006-09-08 21:48:06 +00:00
urlCount = project - > gui_urls . size ( ) ;
2006-07-05 21:36:56 +00:00
2006-09-26 21:53:00 +00:00
// Add the home page link
wxMenuItem * urlItem = new wxMenuItem ( statPopUpMenu , WEBSITE_URL_MENU_ID_HOMEPAGE , wxString ( project - > project_name . c_str ( ) , wxConvUTF8 ) ) ;
# ifdef __WXMSW__
urlItem - > SetBackgroundColour ( appSkin - > GetAppBgCol ( ) ) ;
# endif
Connect ( WEBSITE_URL_MENU_ID_HOMEPAGE , wxEVT_COMMAND_MENU_SELECTED , wxCommandEventHandler ( StatImageLoader : : OnMenuLinkClicked ) ) ;
statPopUpMenu - > Append ( urlItem ) ;
// Add any GUI urls
2006-08-26 04:17:56 +00:00
for ( unsigned int i = 0 ; i < urlCount ; i + + ) {
2006-09-26 21:53:00 +00:00
urlItem = new wxMenuItem ( statPopUpMenu , WEBSITE_URL_MENU_ID + i , wxString ( project - > gui_urls [ i ] . name . c_str ( ) , wxConvUTF8 ) ) ;
2006-07-05 21:36:56 +00:00
# ifdef __WXMSW__
urlItem - > SetBackgroundColour ( appSkin - > GetAppBgCol ( ) ) ;
# endif
2006-07-10 13:41:10 +00:00
Connect ( WEBSITE_URL_MENU_ID + i , wxEVT_COMMAND_MENU_SELECTED , wxCommandEventHandler ( StatImageLoader : : OnMenuLinkClicked ) ) ;
2006-07-05 21:36:56 +00:00
statPopUpMenu - > Append ( urlItem ) ;
}
2006-07-10 17:47:21 +00:00
2006-09-26 21:53:00 +00:00
// Add the 'remove project' option
2006-07-10 17:47:21 +00:00
statPopUpMenu - > AppendSeparator ( ) ;
wxMenuItemList menuList = statPopUpMenu - > GetMenuItems ( ) ;
# ifdef __WXMSW__
menuList [ statPopUpMenu - > GetMenuItemCount ( ) - 1 ] - > SetBackgroundColour ( wxColour ( " RED " ) ) ;
# endif
2006-09-26 21:53:00 +00:00
urlItem = new wxMenuItem ( statPopUpMenu , WEBSITE_URL_MENU_ID_REMOVE_PROJECT , wxT ( " Remove Project " ) ) ;
2006-07-10 17:47:21 +00:00
# ifdef __WXMSW__
urlItem - > SetBackgroundColour ( appSkin - > GetAppBgCol ( ) ) ;
# endif
Connect ( WEBSITE_URL_MENU_ID_REMOVE_PROJECT , wxEVT_COMMAND_MENU_SELECTED , wxCommandEventHandler ( StatImageLoader : : OnMenuLinkClicked ) ) ;
statPopUpMenu - > Append ( urlItem ) ;
2006-09-08 21:48:06 +00:00
2006-07-05 21:36:56 +00:00
}
2006-07-10 13:41:10 +00:00
void StatImageLoader : : OnMenuLinkClicked ( wxCommandEvent & event )
{
CMainDocument * pDoc = wxGetApp ( ) . GetDocument ( ) ;
wxASSERT ( pDoc ) ;
2006-07-10 17:47:21 +00:00
int menuIDevt = event . GetId ( ) ;
2006-07-10 13:41:10 +00:00
2006-07-10 17:47:21 +00:00
if ( menuIDevt = = WEBSITE_URL_MENU_ID_REMOVE_PROJECT ) {
2006-07-20 17:57:23 +00:00
//call detach project function
OnProjectDetach ( ) ;
2006-09-26 21:53:00 +00:00
} else if ( menuIDevt = = WEBSITE_URL_MENU_ID_HOMEPAGE ) {
CBOINCBaseFrame * pFrame = wxDynamicCast ( m_parent - > GetParent ( ) , CBOINCBaseFrame ) ;
wxASSERT ( pFrame ) ;
wxASSERT ( wxDynamicCast ( pFrame , CBOINCBaseFrame ) ) ;
pFrame - > ExecuteBrowserLink ( m_prjUrl . c_str ( ) ) ;
} else {
2006-07-10 17:47:21 +00:00
int menuId = menuIDevt - WEBSITE_URL_MENU_ID ;
2006-07-11 23:19:53 +00:00
PROJECT * project = pDoc - > state . lookup_project ( m_prjUrl ) ;
2006-07-10 17:47:21 +00:00
project - > gui_urls [ menuId ] . name . c_str ( ) ;
2006-07-10 13:41:10 +00:00
2006-07-10 17:47:21 +00:00
CBOINCBaseFrame * pFrame = wxDynamicCast ( m_parent - > GetParent ( ) , CBOINCBaseFrame ) ;
wxASSERT ( pFrame ) ;
wxASSERT ( wxDynamicCast ( pFrame , CBOINCBaseFrame ) ) ;
pFrame - > ExecuteBrowserLink ( project - > gui_urls [ menuId ] . url . c_str ( ) ) ;
}
2006-07-10 13:41:10 +00:00
}
2006-07-20 17:57:23 +00:00
void StatImageLoader : : OnProjectDetach ( ) {
wxInt32 iAnswer = 0 ;
std : : string strProjectName ;
wxString strMessage = wxEmptyString ;
CMainDocument * pDoc = wxGetApp ( ) . GetDocument ( ) ;
2006-07-24 22:10:28 +00:00
CProjectsComponent * pComp = wxDynamicCast ( GetParent ( ) , CProjectsComponent ) ;
2006-07-20 17:57:23 +00:00
wxASSERT ( pDoc ) ;
wxASSERT ( wxDynamicCast ( pDoc , CMainDocument ) ) ;
2006-07-24 22:10:28 +00:00
wxASSERT ( pComp ) ;
2006-07-20 17:57:23 +00:00
if ( ! pDoc - > IsUserAuthorized ( ) )
return ;
2006-07-31 13:59:21 +00:00
int indexOfProj = - 1 ;
int prjCount = pDoc - > GetProjectCount ( ) ;
for ( int m = 0 ; m < prjCount ; m + + ) {
PROJECT * project = pDoc - > project ( m ) ;
project - > get_name ( strProjectName ) ;
if ( project - > master_url = = m_prjUrl ) {
indexOfProj = m ;
break ;
}
}
2006-07-20 17:57:23 +00:00
strMessage . Printf (
_ ( " Are you sure you want to detach from project '%s'? " ) ,
strProjectName . c_str ( )
) ;
iAnswer = : : wxMessageBox (
strMessage ,
_ ( " Detach from Project " ) ,
wxYES_NO | wxICON_QUESTION ,
this
) ;
if ( wxYES = = iAnswer ) {
2006-07-31 13:59:21 +00:00
pDoc - > ProjectDetach ( indexOfProj ) ;
2006-07-24 22:10:28 +00:00
pComp - > RemoveProject ( m_prjUrl ) ;
2006-07-20 17:57:23 +00:00
}
}
2006-09-15 16:47:04 +00:00
void StatImageLoader : : LoadStatIcon ( wxBitmap & image ) {
2006-07-05 21:36:56 +00:00
int width = image . GetWidth ( ) ;
int height = image . GetHeight ( ) ;
2006-09-15 16:47:04 +00:00
Bitmap = image ;
2006-07-05 21:36:56 +00:00
SetSize ( width , height ) ;
2006-08-26 04:17:56 +00:00
}
2006-09-15 16:47:04 +00:00
void StatImageLoader : : LoadImage ( std : : string project_icon , wxBitmap * defaultImage )
2006-08-26 04:17:56 +00:00
{
char defaultIcnPath [ 256 ] ;
bool defaultUsed = true ;
if ( boinc_resolve_filename ( project_icon . c_str ( ) , defaultIcnPath , sizeof ( defaultIcnPath ) ) = = 0 ) {
2006-09-15 16:47:04 +00:00
wxBitmap * btmpStatIcn = new wxBitmap ( ) ;
if ( btmpStatIcn - > LoadFile ( defaultIcnPath , wxBITMAP_TYPE_ANY ) ) {
LoadStatIcon ( * btmpStatIcn ) ;
2006-08-26 04:17:56 +00:00
defaultUsed = false ;
} else {
2006-09-15 16:47:04 +00:00
LoadStatIcon ( * defaultImage ) ;
2006-08-26 04:17:56 +00:00
}
} else {
2006-09-15 16:47:04 +00:00
LoadStatIcon ( * defaultImage ) ;
2006-08-26 04:17:56 +00:00
}
2006-10-16 20:46:57 +00:00
projectIcon = project_icon ;
2006-07-05 21:36:56 +00:00
}
2006-10-16 20:46:57 +00:00
void StatImageLoader : : ReloadProjectSpecificIcon ( ) {
2006-08-26 04:17:56 +00:00
char defaultIcnPath [ 256 ] ;
2006-10-16 20:46:57 +00:00
// Only update if it is project specific is found
2006-08-26 04:17:56 +00:00
if ( boinc_resolve_filename ( projectIcon . c_str ( ) , defaultIcnPath , sizeof ( defaultIcnPath ) ) = = 0 ) {
2006-09-15 16:47:04 +00:00
wxBitmap * btmpStatIcn = new wxBitmap ( ) ;
if ( btmpStatIcn - > LoadFile ( defaultIcnPath , wxBITMAP_TYPE_ANY ) ) {
LoadStatIcon ( * btmpStatIcn ) ;
2006-10-16 20:46:57 +00:00
RebuildMenu ( ) ;
2006-08-26 04:17:56 +00:00
Refresh ( ) ;
Update ( ) ;
}
}
2006-10-16 20:46:57 +00:00
}
2006-09-08 21:48:06 +00:00
2006-10-16 20:46:57 +00:00
void StatImageLoader : : UpdateInterface ( ) {
2006-09-08 21:48:06 +00:00
CMainDocument * pDoc = wxGetApp ( ) . GetDocument ( ) ;
PROJECT * project = pDoc - > state . lookup_project ( m_prjUrl ) ;
2006-10-16 20:46:57 +00:00
// Check to see if we need to reload the stat icon
if ( project > NULL & & project - > project_files_downloaded_time > project_files_downloaded_time ) {
ReloadProjectSpecificIcon ( ) ;
project_files_downloaded_time = project - > project_files_downloaded_time ;
2006-08-26 04:17:56 +00:00
}
2006-10-16 20:46:57 +00:00
// Check to see if we need to rebuild the hoover and menu
if ( project > NULL & & project - > last_rpc_time > project_last_rpc_time ) {
RebuildMenu ( ) ;
BuildUserStatToolTip ( ) ;
project_last_rpc_time = project - > last_rpc_time ;
}
2006-09-08 21:48:06 +00:00
}
2006-07-21 08:23:26 +00:00
void StatImageLoader : : OnPaint ( wxPaintEvent & WXUNUSED ( event ) )
2006-07-05 21:36:56 +00:00
{
wxPaintDC dc ( this ) ;
if ( Bitmap . Ok ( ) )
{
dc . DrawBitmap ( Bitmap , 0 , 0 ) ;
}
}