Add new Simple GUI

svn path=/trunk/boinc/; revision=22948
This commit is contained in:
Charlie Fenton 2011-01-27 14:36:49 +00:00
parent c9f77c4db2
commit bf789a23db
29 changed files with 4556 additions and 20 deletions

View File

@ -278,3 +278,29 @@ Charlie 27 Jan 2011
mac_build/
Mac_SA_Insecure.sh
Charlie 27 Jan 2011
Add new Simple GUI.
clientgui/
AdvancedFrame.cpp, .h
BOINCGUIApp.cpp, .h
Events.h
MacBitmapComboBox.cpp, .h (new)
sg_BoincSimpleFrame.cpp, .h (new)
sg_CustomControls.cpp, .h
sg_TaskPanel.cpp, .h (new)
sg_PanelBase.cpp, .h (new)
sg_ProjectCommandPopup.cpp, .h (new)
sg_ProjectPanel.cpp, .h (new)
sg_ProjectWebSitesPopup.cpp, .h (new)
sg_TaskCommandPopup.cpp, .h (new)
SkinManager.cpp
res/
RedDot16.xpm (new)
YellowDot16.xpm (new)
GreenDot16.xpm (new)
mac_build/
boinc.xcodeproj/
project.pbxproj

View File

@ -154,6 +154,7 @@ void CStatusBar::OnSize(wxSizeEvent& event) {
wxLogTrace(wxT("Function Start/End"), wxT("CStatusBar::OnSize - Function End"));
}
#define ID_NEWSG 6120 /* CAF */
IMPLEMENT_DYNAMIC_CLASS(CAdvancedFrame, CBOINCBaseFrame)
@ -161,6 +162,7 @@ BEGIN_EVENT_TABLE (CAdvancedFrame, CBOINCBaseFrame)
// View
EVT_MENU_RANGE(ID_ADVNOTICESVIEW, ID_ADVRESOURCEUSAGEVIEW, CAdvancedFrame::OnChangeView)
EVT_MENU(ID_CHANGEGUI, CAdvancedFrame::OnChangeGUI)
EVT_MENU(ID_NEWSG, CAdvancedFrame::OnNewSG) /* CAF */
// Tools
EVT_MENU(ID_WIZARDATTACH, CAdvancedFrame::OnWizardAttach)
EVT_MENU(ID_WIZARDUPDATE, CAdvancedFrame::OnWizardUpdate)
@ -407,6 +409,12 @@ bool CAdvancedFrame::CreateMenu() {
if (wxGetApp().IsAccessibilityEnabled()) {
menuView->Enable(ID_CHANGEGUI, false);
}
menuView->Append(
ID_NEWSG,
_("New Simple View..."),
_("Display the new simple graphical interface.")
);
// Tools menu
@ -1074,6 +1082,15 @@ void CAdvancedFrame::OnChangeGUI(wxCommandEvent& WXUNUSED(event)) {
}
void CAdvancedFrame::OnNewSG(wxCommandEvent& WXUNUSED(event)) {
wxLogTrace(wxT("Function Start/End"), wxT("CAdvancedFrame::OnNewSG - Function Begin"));
wxGetApp().SetActiveGUI(BOINC_NEWSIMPLEGUI, true);
wxLogTrace(wxT("Function Start/End"), wxT("CAdvancedFrame::OnNewSG - Function End"));
}
void CAdvancedFrame::OnWizardAttach( wxCommandEvent& WXUNUSED(event) ) {
wxLogTrace(wxT("Function Start/End"), wxT("CAdvancedFrame::OnWizardAttach - Function Begin"));

View File

@ -60,6 +60,7 @@ public:
void OnChangeView( wxCommandEvent& event );
void OnChangeGUI( wxCommandEvent& event );
void OnNewSG( wxCommandEvent& event ); /* CAF */
void OnWizardAttach( wxCommandEvent& event );
void OnWizardUpdate( wxCommandEvent& event );

View File

@ -40,7 +40,6 @@
#include "Events.h"
#include "common/wxFlatNotebook.h"
#include "BOINCInternetFSHandler.h"
//#include "BOINCMemoryFSHandler.h"
#include "LogBOINC.h"
#include "BOINCGUIApp.h"
#include "SkinManager.h"
@ -49,12 +48,11 @@
#include "BOINCTaskBar.h"
#include "BOINCBaseFrame.h"
#include "AdvancedFrame.h"
#include "sg_ImageLoader.h"
#include "sg_StatImageLoader.h"
#include "sg_BoincSimpleGUI.h"
#include "DlgExitMessage.h"
#include "DlgEventLog.h"
#include "procinfo.h"
#include "sg_BoincSimpleFrame.h"
DEFINE_EVENT_TYPE(wxEVT_RPC_FINISHED)
@ -999,6 +997,16 @@ bool CBOINCGUIApp::SetActiveGUI(int iGUISelection, bool bShowWindow) {
wxPoint(iLeft, iTop),
wxSize(iWidth, iHeight)
);
} else if (BOINC_NEWSIMPLEGUI == iGUISelection){
// Initialize the simple gui window
pNewFrame = new CNewSimpleFrame(
m_pSkinManager->GetAdvanced()->GetApplicationName(),
m_pSkinManager->GetAdvanced()->GetApplicationIcon(),
m_pSkinManager->GetAdvanced()->GetApplicationIcon32(),
wxPoint(iLeft, iTop),
wxSize(iWidth, iHeight)
);
} else {
// Initialize the simple gui window
pNewFrame = new CSimpleFrame(

View File

@ -37,6 +37,7 @@
///
#define BOINC_ADVANCEDGUI 1
#define BOINC_SIMPLEGUI 2
#define BOINC_NEWSIMPLEGUI 3
class wxLogBOINC;

View File

@ -156,6 +156,20 @@
#define ID_SIMPLE_RESUME 6605
#define ID_SIMPLE_PREFERENCES 6606
#define ID_SIMPLE_MESSAGESVIEW 6607
#define ID_SIMPLE_PROGRESSPULSETIMER 6608
//
// New Simple GUI
//
#define ID_SGTASKSELECTOR 12001
#define ID_TASKSCOMMANDBUTTON 12002
#define ID_ADDROJECTBUTTON 12101
#define ID_SGPROJECTSELECTOR 12102
#define ID_PROJECTWEBSITESBUTTON 12103
#define ID_PROJECTCOMMANDBUTTON 12104
#define ID_SGNOTICESBUTTON 12201
#define ID_SGPAUSERESUMEBUTTON 12202
#define ID_SGOPTIONS 12301
//
// Taskbar/System Tray

View File

@ -0,0 +1,294 @@
// This file is part of BOINC.
// http://boinc.berkeley.edu
// Copyright (C) 2008 University of California
//
// BOINC 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 3 of the License, or (at your option) any later version.
//
// BOINC 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.
//
// You should have received a copy of the GNU Lesser General Public License
// along with BOINC. If not, see <http://www.gnu.org/licenses/>.
#include "stdwx.h"
#include <wx/mac/carbon/private.h>
#include "MacBitmapComboBox.h"
#define POPUPBUTTONCONTROLHEIGHT 20
// wxChoice uses CreatePopupButtonControl
const wxChar CBOINCBitmapChoiceNameStr[] = wxT("popup");
const wxChar CBOINCBitmapComboBoxNameStr[] = wxT("combo");
IMPLEMENT_DYNAMIC_CLASS(CBOINCBitmapChoice, wxChoice)
CBOINCBitmapChoice::CBOINCBitmapChoice() {}
CBOINCBitmapChoice::CBOINCBitmapChoice(wxWindow *parent, wxWindowID id,
const wxString& value,
const wxPoint& pos,
const wxSize& size,
int n, const wxString choices[],
long style,
const wxValidator& validator,
const wxString& name)
{
Create(parent, id, pos, size, n, choices, style, validator, name);
if (! value.IsEmpty()) {
SetStringSelection(value);
}
}
CBOINCBitmapChoice::~CBOINCBitmapChoice() {
}
void CBOINCBitmapChoice::SetItemBitmap(unsigned int n, const wxBitmap& bitmap) {
MenuHandle mhandle = (MenuHandle) m_macPopUpMenuHandle;
unsigned int index = n + 1;
if ( mhandle == NULL || index == 0)
return ;
if ( bitmap.Ok() )
{
CGImageRef imageRef = (CGImageRef)( bitmap.CGImageCreate() ) ;
SetMenuItemIconHandle( mhandle , index ,
kMenuCGImageRefType , (Handle) imageRef ) ;
#if 0// wxUSE_BMPBUTTON
ControlButtonContentInfo info ;
wxMacCreateBitmapButton( &info , bitmap ) ;
if ( info.contentType != kControlNoContent )
{
if ( info.contentType == kControlContentIconRef )
SetMenuItemIconHandle( mhandle , index ,
kMenuIconRefType , (Handle) info.u.iconRef ) ;
else if ( info.contentType == kControlContentCGImageRef )
SetMenuItemIconHandle( mhandle , index ,
kMenuCGImageRefType , (Handle) info.u.imageRef ) ;
}
wxMacReleaseBitmapButton( &info ) ;
#endif
}
}
IMPLEMENT_DYNAMIC_CLASS(CBOINCBitmapComboBox, wxPanel)
BEGIN_EVENT_TABLE(CBOINCBitmapComboBox, wxPanel)
// EVT_ERASE_BACKGROUND(CBOINCBitmapComboBox::OnEraseBackground)
EVT_PAINT(CBOINCBitmapComboBox::OnPaint)
// EVT_CHOICE(CBOINCBitmapComboBox::OnSelection)
END_EVENT_TABLE()
CBOINCBitmapComboBox::CBOINCBitmapComboBox() {}
CBOINCBitmapComboBox::CBOINCBitmapComboBox(wxWindow *parent, wxWindowID id,
const wxString& value,
const wxPoint& pos,
const wxSize& size,
int n, const wxString choices[],
long style,
const wxValidator& validator,
const wxString& name) :
wxPanel( parent, id, pos, size, wxCLIP_CHILDREN | wxBORDER_NONE )
{
int i;
m_ChoiceControl = new CBOINCBitmapChoice(this, id, value, wxDefaultPosition, wxSize(size.x, POPUPBUTTONCONTROLHEIGHT), n, choices, style, validator);
m_bHaveLargeBitmaps = (size.y > 0);
wxBoxSizer* bSizer1;
bSizer1 = new wxBoxSizer( wxVERTICAL );
int margin = m_bHaveLargeBitmaps ? (size.y - POPUPBUTTONCONTROLHEIGHT)/2 : 0;
bSizer1->Add( m_ChoiceControl, 1, wxTOP | wxBOTTOM | wxEXPAND, margin);
this->SetSizer( bSizer1 );
Layout();
if (m_bHaveLargeBitmaps) {
for (i=0; i<n; ++i) {
m_BitmapCache.push_back(wxNullBitmap);
}
}
Connect(id, wxEVT_COMMAND_CHOICE_SELECTED,
(wxObjectEventFunction) (wxEventFunction) (wxCommandEventFunction) &CBOINCBitmapComboBox::OnSelection
);
}
CBOINCBitmapComboBox::~CBOINCBitmapComboBox() {
Clear();
}
void CBOINCBitmapComboBox::SetItemBitmap(unsigned int n, const wxBitmap& bitmap) {
unsigned int cacheSize, i;
if (m_bHaveLargeBitmaps) {
cacheSize = m_BitmapCache.size();
for (i=cacheSize; i<n; ++i) {
m_BitmapCache.push_back(wxNullBitmap);
}
#if 0
if (m_BitmapCache.at(n) != NULL) {
delete m_BitmapCache.at(n);
m_BitmapCache.at(n) = NULL;
}
#endif
wxBitmap* bm = new wxBitmap(bitmap);
m_BitmapCache.at(n) = *bm;
delete bm;
}
m_ChoiceControl->SetItemBitmap(n, bitmap);
if (n == (unsigned int)m_ChoiceControl->GetSelection()) {
Refresh();
}
}
void CBOINCBitmapComboBox::SetStringSelection(const wxString& text) {
m_ChoiceControl->SetStringSelection(text);
Refresh();
}
void CBOINCBitmapComboBox::SetSelection(int sel) {
m_ChoiceControl->SetSelection(sel);
Refresh();
}
int CBOINCBitmapComboBox::Append(const wxString& text) {
if (m_bHaveLargeBitmaps) {
m_BitmapCache.push_back(wxNullBitmap);
}
return m_ChoiceControl->Append(text);
}
int CBOINCBitmapComboBox::Append(const wxString& text, void *clientData) {
if (m_bHaveLargeBitmaps) {
m_BitmapCache.push_back(wxNullBitmap);
}
return m_ChoiceControl->Append(text, clientData);
}
int CBOINCBitmapComboBox::Append(const wxString& text, const wxBitmap& bitmap, void *clientData) {
if (m_bHaveLargeBitmaps) {
m_BitmapCache.push_back(bitmap);
}
int n = m_ChoiceControl->Append(text, clientData);
SetItemBitmap(n, bitmap);
return n;
}
void CBOINCBitmapComboBox::Insert(const wxString& item, unsigned int pos) {
if (m_bHaveLargeBitmaps) {
std::vector<wxBitmap>::iterator insertionPoint = m_BitmapCache.begin();
m_BitmapCache.insert(insertionPoint + pos, wxNullBitmap);
}
m_ChoiceControl->Insert(item, pos);
}
void CBOINCBitmapComboBox::Insert(const wxString& item, const wxBitmap& bitmap, unsigned int pos) {
if (m_bHaveLargeBitmaps) {
std::vector<wxBitmap>::iterator insertionPoint = m_BitmapCache.begin();
wxBitmap* bm = new wxBitmap(bitmap);
m_BitmapCache.insert(insertionPoint + pos, *bm);
delete bm;
}
m_ChoiceControl->Insert(item, pos);
}
void CBOINCBitmapComboBox::Delete(unsigned int n) {
if (n < m_ChoiceControl->GetCount()) {
if (m_bHaveLargeBitmaps) {
std::vector<wxBitmap>::iterator deletionPoint = m_BitmapCache.begin();
m_BitmapCache.erase(deletionPoint + n);
}
m_ChoiceControl->Delete(n);
Refresh();
}
}
void CBOINCBitmapComboBox::Clear() {
m_BitmapCache.clear();
m_ChoiceControl->Clear();
}
void CBOINCBitmapComboBox::OnSelection(wxCommandEvent& event) {
Refresh(); // To draw the bitmap
event.Skip();
}
void CBOINCBitmapComboBox::OnPaint(wxPaintEvent& event) {
int x, y;
wxPaintDC myDC(this);
unsigned int i = GetSelection();
if (m_BitmapCache.size() <= i) {
return;
}
wxPen oldPen = myDC.GetPen();
wxBrush oldBrush = myDC.GetBrush();
int oldMode = myDC.GetBackgroundMode();
myDC.SetPen(*wxMEDIUM_GREY_PEN);
myDC.SetBrush(*wxTRANSPARENT_BRUSH);
myDC.SetBackgroundMode(wxSOLID);
GetSize(&x, &y);
if ((m_BitmapCache.at(i)).Ok()) {
myDC.DrawBitmap(m_BitmapCache.at(i), 9, 1, false);
myDC.DrawRectangle(8, 0, y, y);
}
// Restore Mode, Pen and Brush
myDC.SetBackgroundMode(oldMode);
myDC.SetPen(oldPen);
myDC.SetBrush(oldBrush);
}
void CBOINCBitmapComboBox::EmptyBitmapCache() {
#if 0
unsigned int i, cacheSize;
cacheSize = m_BitmapCache.size();
for (i=0; i<cacheSize; i++) {
if (m_BitmapCache.at(i) != NULL) {
delete m_BitmapCache.at(i);
m_BitmapCache.at(i) = NULL;
}
}
#endif
m_BitmapCache.clear();
}
void CBOINCBitmapComboBox::SetToolTip(wxString& s) {
m_ChoiceControl->SetToolTip(s);
}
void CBOINCBitmapComboBox::SetToolTip(wxToolTip* tip) {
m_ChoiceControl->SetToolTip(tip);
}

View File

@ -0,0 +1,98 @@
// This file is part of BOINC.
// http://boinc.berkeley.edu
// Copyright (C) 2008 University of California
//
// BOINC 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 3 of the License, or (at your option) any later version.
//
// BOINC 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.
//
// You should have received a copy of the GNU Lesser General Public License
// along with BOINC. If not, see <http://www.gnu.org/licenses/>.
#ifndef __MACBITMAPCOMBOBOX__
#define __MACBITMAPCOMBOBOX__
#include <wx/choice.h>
WXDLLEXPORT_DATA(extern const wxChar) CBOINCBitmapChoiceNameStr[];
WXDLLEXPORT_DATA(extern const wxChar) CBOINCBitmapComboBoxNameStr[];
#define EVT_BOINCBITMAPCOMBOBOX EVT_CHOICE
class CBOINCBitmapChoice : public wxChoice
{
DECLARE_DYNAMIC_CLASS(CBOINCBitmapChoice )
public:
CBOINCBitmapChoice() ;
virtual ~CBOINCBitmapChoice();
CBOINCBitmapChoice(wxWindow *parent, wxWindowID id,
const wxString& value = "",
const wxPoint& pos = wxDefaultPosition,
const wxSize& size = wxDefaultSize,
int n = 0, const wxString choices[] = NULL,
long style = 0,
const wxValidator& validator = wxDefaultValidator,
const wxString& name = CBOINCBitmapChoiceNameStr);
void SetItemBitmap(unsigned int n, const wxBitmap& bitmap);
};
class CBOINCBitmapComboBox : public wxPanel
{
DECLARE_DYNAMIC_CLASS( CBOINCBitmapComboBox )
DECLARE_EVENT_TABLE()
public:
CBOINCBitmapComboBox() ;
virtual ~CBOINCBitmapComboBox();
CBOINCBitmapComboBox(wxWindow *parent, wxWindowID id,
const wxString& value = "",
const wxPoint& pos = wxDefaultPosition,
const wxSize& size = wxDefaultSize,
int n = 0, const wxString choices[] = NULL,
long style = 0,
const wxValidator& validator = wxDefaultValidator,
const wxString& name = CBOINCBitmapComboBoxNameStr);
void SetItemBitmap(unsigned int n, const wxBitmap& bitmap);
void SetStringSelection(const wxString& text);
void SetSelection(int sel);
int GetCount() { return m_ChoiceControl->GetCount(); }
void * GetClientData(unsigned int n) const { return m_ChoiceControl->GetClientData(n); }
void SetClientData(unsigned int n, void *data) { m_ChoiceControl->SetClientData(n, data); }
int GetSelection() { return m_ChoiceControl->GetCurrentSelection(); }
wxString GetValue() { return m_ChoiceControl->GetStringSelection(); }
wxString GetStringSelection() { return m_ChoiceControl->GetStringSelection(); }
int Append(const wxString& text);
int Append(const wxString& text, void *clientData);
int Append(const wxString& text, const wxBitmap& bitmap, void *clientData);
void Insert(const wxString& item, unsigned int pos);
void Insert(const wxString& item, const wxBitmap& bitmap, unsigned int pos);
void Delete(unsigned int n);
void Clear();
void SetToolTip(wxString& s);
void SetToolTip(wxToolTip* tip);
private:
void OnPaint(wxPaintEvent& event);
void OnSelection(wxCommandEvent& event);
void EmptyBitmapCache();
CBOINCBitmapChoice *m_ChoiceControl;
bool m_bHaveLargeBitmaps;
std::vector<wxBitmap> m_BitmapCache;
};
#endif //__MACBITMAPCOMBOBOX__

View File

@ -718,6 +718,7 @@ int CSkinSimple::Parse(MIOFILE& in) {
bool CSkinSimple::InitializeDelayedValidation() {
m_BackgroundImage.SetDefaults(
// wxT("background"), (const char**)background_image_xpm, wxT("133:181:178")
wxT("background"), (const char**)background_image_xpm, wxT("0:0:0")
);
m_SpacerImage.SetDefaults(wxT("spacer"), (const char**)spacer_image_xpm);
@ -725,7 +726,7 @@ bool CSkinSimple::InitializeDelayedValidation() {
if (show_error_msgs) {
fprintf(stderr, "Skin Manager: Failed to parse static line color. Using default.\n");
}
m_StaticLineColor = ParseColor(wxString(wxT("5:5:5")));
m_StaticLineColor = ParseColor(wxString(wxT("204:102:51")));
wxASSERT(m_StaticLineColor.Ok());
}
m_StateIndicatorBackgroundImage.SetDefaults(
@ -738,19 +739,19 @@ bool CSkinSimple::InitializeDelayedValidation() {
wxT("error indicator"), (const char**)error_indicator_image_xpm
);
m_WorkunitActiveTab.SetDefaults(
wxT("active"), (const char**)workunit_active_image_xpm, wxT("102:102:102"), wxT("102:102:102"), wxT("179:179:179")
wxT("active"), (const char**)workunit_active_image_xpm, wxString(wxT("20:82:82")), wxString(wxT("134:179:176")), wxString(wxT("51:102:102"))
);
m_WorkunitSuspendedTab.SetDefaults(
wxT("suspended"), (const char**)workunit_suspended_image_xpm, wxT("80:80:80"), wxT("50:50:50"), wxT("50:50:50")
wxT("suspended"), (const char**)workunit_suspended_image_xpm, wxString(wxT("102:153:153")), wxString(wxT("134:179:176")), wxString(wxT("84:175:175"))
);
m_WorkunitTabAreaBackgroundImage.SetDefaults(
wxT("workunit tab area background"), (const char**)workunit_tab_area_background_image_xpm
);
m_WorkunitAreaBackgroundImage.SetDefaults(
wxT("workunit area background"), (const char**)workunit_area_background_image_xpm, wxT("0:0:0")
wxT("workunit area background"), (const char**)workunit_area_background_image_xpm
);
m_WorkunitAnimationBackgroundImage.SetDefaults(
wxT("workunit animation background"), (const char**)workunit_animation_background_image_xpm, wxT("0:0:0")
wxT("workunit animation background"), (const char**)workunit_animation_background_image_xpm
);
m_WorkunitAnimationImage.SetDefaults(
wxT("workunit animation"), (const char**)workunit_animation_image_xpm
@ -1264,8 +1265,8 @@ bool CSkinManager::ReloadSkin(wxLocale* pLocale, wxString strSkin) {
m_strSelectedSkin = strSkin;
// Check to see if the skin we want to change to is the default skin
if (GetDefaultSkinName() == m_strSelectedSkin || GetDefaultBOINCSkinName() == m_strSelectedSkin) {
m_strSelectedSkin = GetDefaultSkinName();
if (GetDefaultSkinName() == m_strSelectedSkin) {
m_strSelectedSkin = GetDefaultBOINCSkinName();
}
// First we try the users canonical locale resources.

View File

@ -0,0 +1,89 @@
/* XPM */
static char *GreenDot16_xpm[] = {
/* width height ncolors chars_per_pixel */
"16 16 67 2",
/* colors */
"AA c #FFFFFFFFFFFF",
"BA c #F0F0E0E0F8F8",
"CA c #E8E8F8F8F0F0",
"DA c #E8E8E0E0F8F8",
"EA c #E0E0F8F8E8E8",
"FA c #E0E0F8F8D8D8",
"GA c #E0E0E8E8E8E8",
"HA c #D8D8F8F8E8E8",
"IA c #D8D8F8F8D8D8",
"JA c #D8D8F8F8C8C8",
"KA c #C0C0F8F8C0C0",
"LA c #C0C0F8F8B8B8",
"MA c #B8B8F8F8B0B0",
"NA c #B8B8F0F0C0C0",
"OA c #B8B8E8E8B8B8",
"PA c #B0B0F0F0A0A0",
"AB c #B0B0E8E8A8A8",
"BB c #A8A8E8E8A0A0",
"CB c #A0A0E0E09898",
"DB c #9898F8F89898",
"EB c #9898E0E0A0A0",
"FB c #9898D0D0A0A0",
"GB c #8888D0D09090",
"HB c #8888C8C88080",
"IB c #8080F8F88888",
"JB c #8080D0D07070",
"KB c #7878F8F87878",
"LB c #7878C8C87070",
"MB c #7878B8B87070",
"NB c #7070C0C06868",
"OB c #6868B8B86060",
"PB c #6868A8A85858",
"AC c #6060E8E86868",
"BC c #6060B0B05858",
"CC c #5858B0B05050",
"DC c #5858B0B04848",
"EC c #5858A8A85050",
"FC c #4848D0D04848",
"GC c #4848B0B04848",
"HC c #4848A0A04040",
"IC c #4040E0E04848",
"JC c #4040A0A03838",
"KC c #3838A0A03838",
"LC c #383898983838",
"MC c #3030D8D84040",
"NC c #3030D0D03030",
"OC c #303098982828",
"PC c #2828B0B03030",
"AD c #2828B0B02020",
"BD c #282898982828",
"CD c #282890901818",
"DD c #282888882828",
"ED c #2020C0C01818",
"FD c #2020A0A02828",
"GD c #202088881818",
"HD c #1818A0A01818",
"ID c #181890901010",
"JD c #181888881818",
"KD c #101088880808",
"LD c #0808B0B00808",
"MD c #0808A8A81818",
"ND c #0808A8A80808",
"OD c #080898981818",
"PD c #080898980808",
"AE c #080888881010",
"BE c #080888880808",
"CE c #000078780000",
/* pixels */
"AABAGAAAIAABCBBCPBCBLAFAAACADAAA",
"GAAAEANAHBDCJCGDOCOCDCMBMAEACAAA",
"KAFACBCCBDKDHDNDNDPDBELCOBBBKAIA",
"JAPACCGDPDNDLDLDLDNDHDHDBDDCCBJA",
"MANBJCFDCDMDNDNDLDNDNDHDJDLCJBMA",
"CBKCBDFDHDMDNDNDNDNDMDODIDIDCCIB",
"IBFDPDODNDMDNDNDNDNDNDMDODODPCAC",
"MCPDPDNDNDNDNDNDNDNDNDNDNDNDHDIC",
"NCPDLDNDNDLDNDNDPDNDNDNDNDNDEDNC",
"KBHDPDPDPDNDNDNDNDNDNDNDPDMDADFC",
"DBHCAEFDMDHDNDNDLDPDODMDJDJDGCIB",
"MANBLCKCBEMDNDNDNDMDLDIDJDBDLBKA",
"IAPABCKCBEPDNDLDLDNDNDAEBDOBABIA",
"FAIACBBCBDIDPDPDPDPDBEDDBCOAFAFA",
"AAAAIAOAHBECHCCELCKCECLBOAEAAAAA",
"DAAACAHACAFBEBLBLBGBNACACACADAAA"};

View File

@ -0,0 +1,86 @@
/* XPM */
static char *RedDot16_xpm[] = {
/* width height ncolors chars_per_pixel */
"16 16 64 2",
/* colors */
"AA c #FFFFFFFFFFFF",
"BA c #F8F8F8F8E8E8",
"CA c #F8F8E8E8F0F0",
"DA c #F8F8E8E8E8E8",
"EA c #F8F8E8E8D0D0",
"FA c #F8F8D0D0C0C0",
"GA c #F8F8C8C8B8B8",
"HA c #F8F8C8C8A8A8",
"IA c #F8F8B8B8A8A8",
"JA c #F8F8A8A89898",
"KA c #F8F8A0A0A8A8",
"LA c #F8F89898A0A0",
"MA c #F8F888889898",
"NA c #F8F878787070",
"OA c #F8F870706060",
"PA c #F8F840404848",
"AB c #F8F838384040",
"BB c #F8F820202020",
"CB c #F8F818181818",
"DB c #F8F818180808",
"EB c #F8F810102828",
"FB c #F8F808081818",
"GB c #F8F808080808",
"HB c #F0F098989898",
"IB c #F0F070708080",
"JB c #F0F060605050",
"KB c #E8E8F8F8F8F8",
"LB c #E8E898989898",
"MB c #E8E880808888",
"NB c #E8E870707878",
"OB c #E8E818181010",
"PB c #E8E810102020",
"AC c #E8E810100000",
"BC c #E8E808081010",
"CC c #E8E808080808",
"DC c #E0E058584848",
"EC c #D8D8E8E8E8E8",
"FC c #D8D828283838",
"GC c #D8D810101818",
"HC c #D8D810100808",
"IC c #D8D808082020",
"JC c #D8D800000808",
"KC c #D0D030304040",
"LC c #D0D020202020",
"MC c #C8C8D0D0D0D0",
"NC c #C8C828284040",
"OC c #C8C828283030",
"PC c #C8C820202020",
"AD c #C8C810101010",
"BD c #C8C808081818",
"CD c #C8C808080000",
"DD c #C0C0E0E0E0E0",
"ED c #C0C0D8D8E0E0",
"FD c #C0C048484848",
"GD c #C0C038383838",
"HD c #C0C010100808",
"ID c #B8B820202020",
"JD c #B8B818181818",
"KD c #B8B810100808",
"LD c #B0B048483030",
"MD c #B0B008080808",
"ND c #A8A840403030",
"OD c #A8A818180808",
"PD c #A0A038383030",
/* pixels */
"KBDDAABAIAGADCKDKDJBGAGABAAADDKB",
"EDAAAAKAGDADHDOBACCDMDGDLACAAAEC",
"AADANBFCPBFBGBCCGBFBFBPBFCIBAABA",
"EAHBOCBCGBFBGBGBCBDBGBFBBDFCHBEA",
"HAPDLCBCCCGBGBDBDBCCGBCCCCPCNDGA",
"IAODGCOBFBBBACACJCCCEBGBOBGCKDIA",
"PAJCBBCCCCCCCCCCDBCCGBCCFBOBHCAB",
"GBFBGBCCCBGBGBGBGBGBGBGBGBGBEBGB",
"GBEBGBGBFBCCGBGBGBGBGBCBCCGBFBGB",
"ABCCJCGBGBGBGBGBGBCCCCGBGBGBCCBC",
"JAJDOBCBGBGBGBCCGBGBGBGBFBJCADNA",
"HALDADCCCCGBGBCCCCGBGBGBEBADFDKA",
"EAJAIDCDFBGBGBGBGBGBFBFBCDFCKAEA",
"AABAMBKCBCJCACGBCCJCFBICNCMAAAAA",
"ECAADALBFDJDGCHDACHDMDGDHBAACAMC",
"KBEDAAAAFAIAOAGCMDOAHAFADADABAKB"};

View File

@ -0,0 +1,48 @@
/* XPM */
static char *YellowDot16_xpm[] = {
/* width height ncolors chars_per_pixel */
"16 16 26 1",
/* colors */
"A c #FFFFFFFFFFFF",
"B c #F8F8F8F8E8E8",
"C c #F8F8F8F8D8D8",
"D c #F8F8F8F8C0C0",
"E c #F8F8F8F89898",
"F c #F8F8F8F88888",
"G c #F8F8F0F0B0B0",
"H c #F8F8F0F06868",
"I c #F8F8F0F05858",
"J c #F8F8E8E8A0A0",
"K c #F8F8E8E88888",
"L c #F8F8E8E85858",
"M c #F8F8E8E84040",
"N c #F8F8E0E00808",
"O c #F8F8D8D81818",
"P c #F8F8D8D80808",
"Q c #F8F8C8C81818",
"R c #F0F0E8E82020",
"S c #F0F0E0E01010",
"T c #F0F0D0D02828",
"U c #E8E8E0E05050",
"V c #E8E8E0E01818",
"W c #E8E8D8D83838",
"X c #E8E8D8D80808",
"Y c #E8E8D0D02020",
"Z c #E8E8D0D01818",
/* pixels */
"AAAAACJKKJCAAAAA",
"AAAGHRSSSSRHJAAA",
"ACEMOPNNNNPPLECA",
"BGMQPTSPNOOOPMGB",
"DFZPPPPPNNPPPOKD",
"EUZPPPNNNPPPPYME",
"HTSNPPNPNNPPNZWH",
"ITNNPPNPPNPPNNTI",
"HTNNNPNPXPNPNNTI",
"HMZNPPNPPNPNNZMH",
"FUZNPPPNNNPPNZUE",
"GFZPPPNNPNPPPZFG",
"AEMPOOOPPSOQPMGA",
"ABELPPPNNPPOMEBA",
"AAAEHRVNNVRIGAAA",
"AAAAACEKEECAAAAA"};

914
clientgui/sg_BoincSimpleFrame.cpp Executable file
View File

@ -0,0 +1,914 @@
// This file is part of BOINC.
// http://boinc.berkeley.edu
// Copyright (C) 2008 University of California
//
// BOINC 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 3 of the License, or (at your option) any later version.
//
// BOINC 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.
//
// You should have received a copy of the GNU Lesser General Public License
// along with BOINC. If not, see <http://www.gnu.org/licenses/>.
#if defined(__GNUG__) && !defined(__APPLE__)
#pragma implementation "sg_BoincSimpleFrame.h"
#endif
#include "stdwx.h"
#ifdef __WXMAC__
#include "MacAccessiblity.h"
#endif
#include "diagnostics.h"
#include "str_util.h"
#include "mfile.h"
#include "miofile.h"
#include "parse.h"
#include "error_numbers.h"
#include "BOINCGUIApp.h"
#include "SkinManager.h"
#include "MainDocument.h"
#include "Events.h"
#include "BOINCBaseFrame.h"
#include "wizardex.h"
#include "BOINCBaseWizard.h"
#include "WizardAttach.h"
#include "error_numbers.h"
#include "version.h"
#include "sg_BoincSimpleFrame.h"
#include "sg_TaskPanel.h"
#include "sg_ProjectPanel.h"
#include "sg_DlgMessages.h"
#include "sg_DlgPreferences.h"
#include "DlgEventLog.h"
#include "DlgAbout.h"
#define ID_OLDSG 6121 /* CAF TEMPORARY */
IMPLEMENT_DYNAMIC_CLASS(CNewSimpleFrame, CBOINCBaseFrame)
BEGIN_EVENT_TABLE(CNewSimpleFrame, CBOINCBaseFrame)
EVT_SIZE(CNewSimpleFrame::OnSize)
EVT_MENU(ID_CHANGEGUI, CNewSimpleFrame::OnChangeGUI)
EVT_MENU(ID_OLDSG, CNewSimpleFrame::OnOldSG) /* CAF TEMPORARY */
EVT_HELP(wxID_ANY, CNewSimpleFrame::OnHelp)
EVT_FRAME_CONNECT(CNewSimpleFrame::OnConnect)
EVT_FRAME_RELOADSKIN(CNewSimpleFrame::OnReloadSkin)
EVT_FRAME_NOTIFICATION(CNewSimpleFrame::OnNotification)
EVT_MENU(ID_PREFERENCES, CNewSimpleFrame::OnPreferences)
EVT_MENU(ID_SGOPTIONS, CNewSimpleFrame::OnOptions)
EVT_MENU(ID_HELPBOINC, CNewSimpleFrame::OnHelpBOINC)
EVT_MENU(ID_HELPBOINCMANAGER, CNewSimpleFrame::OnHelpBOINC)
EVT_MENU(ID_HELPBOINCWEBSITE, CNewSimpleFrame::OnHelpBOINC)
EVT_MENU(wxID_ABOUT, CNewSimpleFrame::OnHelpAbout)
END_EVENT_TABLE()
CNewSimpleFrame::CNewSimpleFrame() {
wxLogTrace(wxT("Function Start/End"), wxT("CNewSimpleFrame::CNewSimpleFrame - Default Constructor Function Begin"));
wxLogTrace(wxT("Function Start/End"), wxT("CNewSimpleFrame::CNewSimpleFrame - Default Constructor Function End"));
}
CNewSimpleFrame::CNewSimpleFrame(wxString title, wxIcon* icon, wxIcon* icon32, wxPoint position, wxSize size) :
CBOINCBaseFrame((wxFrame *)NULL, ID_SIMPLEFRAME, title, position, size,
wxMINIMIZE_BOX | wxSYSTEM_MENU | wxCAPTION | wxCLOSE_BOX | wxCLIP_CHILDREN)
{
wxLogTrace(wxT("Function Start/End"), wxT("CNewSimpleFrame::CNewSimpleFrame - Overloaded Constructor Function Begin"));
// Initialize Application
wxIconBundle icons;
icons.AddIcon(*icon);
icons.AddIcon(*icon32);
SetIcons(icons);
CSkinAdvanced* pSkinAdvanced = wxGetApp().GetSkinManager()->GetAdvanced();
wxString strMenuName;
wxString strMenuDescription;
wxASSERT(wxDynamicCast(pSkinAdvanced, CSkinAdvanced));
// File menu
wxMenu *menuFile = new wxMenu;
// %s is the application name
// i.e. 'BOINC Manager', 'GridRepublic Manager'
strMenuDescription.Printf(
_("Close the %s window"),
pSkinAdvanced->GetApplicationName().c_str()
);
strMenuName = _("&Close Window");
strMenuName += wxT("\tCtrl+W");
menuFile->Append(
ID_CLOSEWINDOW,
strMenuName,
strMenuDescription
);
// View menu
wxMenu *menuTools = new wxMenu;
menuTools->Append(
ID_CHANGEGUI,
_("Advanced View...\tCtrl+Shift+A"),
_("Display the advanced (accessible) graphical interface.")
);
menuTools->Append( /* CAF TEMPORARY */
ID_OLDSG,
_("Old Simple View..."),
_("Display the old simple graphical interface.")
);
menuTools->Append(
ID_PREFERENCES,
_("Computing &preferences..."),
_("Configure computing preferences")
);
menuTools->Append(
ID_SGOPTIONS,
_("Manager Settings..."),
_("Configure display options and proxy settings")
);
// Help menu
wxMenu *menuHelp = new wxMenu;
// %s is the project name
// i.e. 'BOINC Manager', 'GridRepublic'
strMenuName.Printf(
_("%s &help"),
pSkinAdvanced->GetApplicationShortName().c_str()
);
// %s is the project name
// i.e. 'BOINC', 'GridRepublic'
strMenuDescription.Printf(
_("Show information about %s"),
pSkinAdvanced->GetApplicationShortName().c_str()
);
menuHelp->Append(
ID_HELPBOINC,
strMenuName,
strMenuDescription
);
// %s is the application name
// i.e. 'BOINC Manager', 'GridRepublic Manager'
strMenuName.Printf(
_("&%s"),
pSkinAdvanced->GetApplicationName().c_str()
);
// %s is the application name
// i.e. 'BOINC Manager', 'GridRepublic Manager'
strMenuDescription.Printf(
_("Show information about the %s"),
pSkinAdvanced->GetApplicationName().c_str()
);
menuHelp->Append(
ID_HELPBOINCMANAGER,
strMenuName,
strMenuDescription
);
// %s is the project name
// i.e. 'BOINC', 'GridRepublic'
strMenuName.Printf(
_("%s &website"),
pSkinAdvanced->GetApplicationShortName().c_str()
);
// %s is the application name
// i.e. 'BOINC Manager', 'GridRepublic Manager'
strMenuDescription.Printf(
_("Show information about BOINC and %s"),
pSkinAdvanced->GetApplicationName().c_str()
);
menuHelp->Append(
ID_HELPBOINCWEBSITE,
strMenuName,
strMenuDescription
);
// %s is the project name
// i.e. 'BOINC Manager', 'GridRepublic Manager'
strMenuName.Printf(
_("&About %s..."),
pSkinAdvanced->GetApplicationName().c_str()
);
menuHelp->Append(
wxID_ABOUT,
strMenuName,
_("Licensing and copyright information.")
);
// construct menu
m_pMenubar = new wxMenuBar;
m_pMenubar->Append(
menuFile,
_("&File")
);
m_pMenubar->Append(
menuTools,
_("&Tools")
);
m_pMenubar->Append(
menuHelp,
_("&Help")
);
wxMenuBar* m_pOldMenubar = GetMenuBar();
SetMenuBar(m_pMenubar);
if (m_pOldMenubar) {
delete m_pOldMenubar;
}
#ifdef __WXMAC__
m_pMenubar->MacInstallMenuBar();
// Enable Mac OS X's standard Preferences menu item (handled in MacSysMenu.cpp)
EnableMenuCommand(NULL, kHICommandPreferences);
#endif
m_Shortcuts[0].Set(wxACCEL_NORMAL, WXK_HELP, ID_HELPBOINCMANAGER);
m_pAccelTable = new wxAcceleratorTable(2, m_Shortcuts);
SetAcceleratorTable(*m_pAccelTable);
dlgMsgsPtr = NULL;
m_pBackgroundPanel = new CSimpleGUIPanel(this);
RestoreState();
}
CNewSimpleFrame::~CNewSimpleFrame() {
wxLogTrace(wxT("Function Start/End"), wxT("CNewSimpleFrame::CNewSimpleFrame - Destructor Function Begin"));
SaveState();
if (m_pAccelTable)
delete m_pAccelTable;
wxLogTrace(wxT("Function Start/End"), wxT("CNewSimpleFrame::CNewSimpleFrame - Destructor Function End"));
}
bool CNewSimpleFrame::SaveState() {
CBOINCBaseFrame::SaveState();
wxConfigBase* pConfig = wxConfigBase::Get(FALSE);
wxString strBaseConfigLocation = wxString(wxT("/Simple"));
wxASSERT(pConfig);
// An odd case happens every once and awhile where wxWidgets looses
// the pointer to the config object, or it is cleaned up before
// the window has finished it's cleanup duty. If we detect a NULL
// pointer, return false.
if (!pConfig) return false;
//
// Save Frame State
//
pConfig->SetPath(strBaseConfigLocation);
pConfig->Write(wxT("XPos"), GetPosition().x);
pConfig->Write(wxT("YPos"), GetPosition().y);
return true;
}
bool CNewSimpleFrame::RestoreState() {
CBOINCBaseFrame::RestoreState();
return true;
}
int CNewSimpleFrame::_GetCurrentViewPage() {
if (isMessagesDlgOpen()) {
return VW_SGUI | VW_SMSG;
} else {
return VW_SGUI;
}
return 0; // Should never happen.
}
void CNewSimpleFrame::OnChangeGUI(wxCommandEvent& WXUNUSED(event)) {
wxLogTrace(wxT("Function Start/End"), wxT("CNewSimpleFrame::OnChangeGUI - Function Begin"));
wxGetApp().SetActiveGUI(BOINC_ADVANCEDGUI, true);
wxLogTrace(wxT("Function Start/End"), wxT("CNewSimpleFrame::OnChangeGUI - Function End"));
}
/* CAF TEMPORARY */
void CNewSimpleFrame::OnOldSG(wxCommandEvent& WXUNUSED(event)) {
wxLogTrace(wxT("Function Start/End"), wxT("CNewSimpleFrame::OnNewSG - Function Begin"));
wxGetApp().SetActiveGUI(BOINC_SIMPLEGUI, true);
wxLogTrace(wxT("Function Start/End"), wxT("CNewSimpleFrame::OnNewSG - Function End"));
}
void CNewSimpleFrame::OnPreferences(wxCommandEvent& WXUNUSED(event)) {
wxLogTrace(wxT("Function Start/End"), wxT("CNewSimpleFrame::OnPreferences - Function Begin"));
m_pBackgroundPanel->SetDlgOpen(true);
CDlgPreferences dlg(GetParent());
dlg.ShowModal();
m_pBackgroundPanel->SetDlgOpen(false);
wxLogTrace(wxT("Function Start/End"), wxT("CNewSimpleFrame::OnPreferences - Function End"));
}
void CNewSimpleFrame::OnOptions(wxCommandEvent& WXUNUSED(event)) {
wxLogTrace(wxT("Function Start/End"), wxT("CNewSimpleFrame::OnOptions - Function Begin"));
m_pBackgroundPanel->SetDlgOpen(true);
// TODO: Get code from CAdvancedFrame::OnOptions() or create simple language selection dialog
m_pBackgroundPanel->SetDlgOpen(false);
wxLogTrace(wxT("Function Start/End"), wxT("CNewSimpleFrame::OnOptions - Function End"));
}
// TODO: Create ID_HELPBOINCMANAGER web page for each organization for new BOINC version
void CNewSimpleFrame::OnHelpBOINC(wxCommandEvent& event) {
wxLogTrace(wxT("Function Start/End"), wxT("CNewSimpleFrame::OnHelpBOINC - Function Begin"));
if (IsShown()) {
wxString strURL = wxGetApp().GetSkinManager()->GetAdvanced()->GetOrganizationHelpUrl();
wxString wxurl;
wxurl.Printf(
wxT("%s?target=simple&version=%s&controlid=%d"),
strURL.c_str(),
wxString(BOINC_VERSION_STRING, wxConvUTF8).c_str(),
event.GetId()
);
wxLaunchDefaultBrowser(wxurl);
}
wxLogTrace(wxT("Function Start/End"), wxT("CNewSimpleFrame::OnHelpBOINC - Function End"));
}
void CNewSimpleFrame::OnHelpAbout(wxCommandEvent& /*event*/) {
wxLogTrace(wxT("Function Start/End"), wxT("CNewSimpleFrame::OnHelpAbout - Function Begin"));
m_pBackgroundPanel->SetDlgOpen(true);
CDlgAbout dlg(this);
dlg.ShowModal();
m_pBackgroundPanel->SetDlgOpen(false);
wxLogTrace(wxT("Function Start/End"), wxT("CNewSimpleFrame::OnHelpAbout - Function End"));
}
void CNewSimpleFrame::OnHelp(wxHelpEvent& event) {
wxLogTrace(wxT("Function Start/End"), wxT("CNewSimpleFrame::OnHelp - Function Begin"));
if (IsShown()) {
wxString strURL = wxGetApp().GetSkinManager()->GetAdvanced()->GetOrganizationHelpUrl();
wxString wxurl;
wxurl.Printf(
wxT("%s?target=simple&version=%s&controlid=%d"),
strURL.c_str(),
wxString(BOINC_VERSION_STRING, wxConvUTF8).c_str(),
event.GetId()
);
wxLaunchDefaultBrowser(wxurl);
}
wxLogTrace(wxT("Function Start/End"), wxT("CNewSimpleFrame::OnHelp - Function End"));
}
void CNewSimpleFrame::OnReloadSkin(CFrameEvent& WXUNUSED(event)) {
wxLogTrace(wxT("Function Start/End"), wxT("CNewSimpleFrame::OnReloadSkin - Function Start"));
m_pBackgroundPanel->ReskinInterface();
wxLogTrace(wxT("Function Start/End"), wxT("CNewSimpleFrame::OnReloadSkin - Function End"));
}
void CNewSimpleFrame::OnNotification(CFrameEvent& WXUNUSED(event)) {
wxLogTrace(wxT("Function Start/End"), wxT("CNewSimpleFrame::OnNotification - Function Begin"));
CDlgMessages dlg(GetParent());
m_pBackgroundPanel->SetDlgOpen(true);
SetMsgsDlgOpen(&dlg);
m_pBackgroundPanel->NoticesViewed();
dlg.ShowModal();
m_pBackgroundPanel->SetDlgOpen(false);
SetMsgsDlgOpen(NULL);
wxLogTrace(wxT("Function Start/End"), wxT("CNewSimpleFrame::OnNotification - Function End"));
}
void CNewSimpleFrame::OnRefreshView(CFrameEvent& WXUNUSED(event)) {
wxLogTrace(wxT("Function Start/End"), wxT("CNewSimpleFrame::OnRefreshView - Function Start"));
static bool bAlreadyRunning = false;
if (bAlreadyRunning) return;
bAlreadyRunning = true;
m_pBackgroundPanel->OnFrameRender();
if (dlgMsgsPtr) {
dlgMsgsPtr->OnRefresh();
}
bAlreadyRunning = false;
wxLogTrace(wxT("Function Start/End"), wxT("CNewSimpleFrame::OnRefreshView - Function End"));
}
void CNewSimpleFrame::OnProjectsAttachToProject() {
wxLogTrace(wxT("Function Start/End"), wxT("CNewSimpleFrame::OnProjectsAttachToProject - Function Begin"));
CMainDocument* pDoc = wxGetApp().GetDocument();
wxASSERT(pDoc);
wxASSERT(wxDynamicCast(pDoc, CMainDocument));
if (!pDoc->IsUserAuthorized())
return;
if (pDoc->IsConnected()) {
CWizardAttach* pWizard = new CWizardAttach(this);
wxString strName = wxEmptyString;
wxString strURL = wxEmptyString;
wxString strTeamName = wxEmptyString;
pWizard->Run( strName, strURL, strTeamName, false );
if (pWizard)
pWizard->Destroy();
} else {
ShowNotCurrentlyConnectedAlert();
}
wxLogTrace(wxT("Function Start/End"), wxT("CNewSimpleFrame::OnProjectsAttachToProject - Function End"));
}
void CNewSimpleFrame::OnConnect(CFrameEvent& WXUNUSED(event)) {
wxLogTrace(wxT("Function Start/End"), wxT("CNewSimpleFrame::OnConnect - Function Begin"));
CMainDocument* pDoc = wxGetApp().GetDocument();
CWizardAttach* pWizard = NULL;
wxString strComputer = wxEmptyString;
wxString strName = wxEmptyString;
wxString strURL = wxEmptyString;
wxString strTeamName = wxEmptyString;
bool bCachedCredentials = false;
ACCT_MGR_INFO ami;
PROJECT_INIT_STATUS pis;
CC_STATUS status;
wxASSERT(pDoc);
wxASSERT(wxDynamicCast(pDoc, CMainDocument));
pDoc->ForceCacheUpdate();
pDoc->GetCoreClientStatus(status, true);
#ifdef __WXMAC__
wxGetApp().GetMacSystemMenu()->BuildMenu();
#endif
// If we are connected to the localhost, run a really quick screensaver
// test to trigger a firewall popup.
pDoc->GetConnectedComputerName(strComputer);
if (pDoc->IsComputerNameLocal(strComputer)) {
wxGetApp().StartBOINCScreensaverTest();
wxGetApp().StartBOINCDefaultScreensaverTest();
}
pDoc->rpc.get_project_init_status(pis);
pDoc->rpc.acct_mgr_info(ami);
if (ami.acct_mgr_url.size() && !ami.have_credentials) {
if (!IsShown()) {
Show();
}
pWizard = new CWizardAttach(this);
if (pWizard->SyncToAccountManager()) {
// If successful, hide the main window
Hide();
}
} else if ((pis.url.size() || (0 >= pDoc->GetSimpleProjectCount())) && !status.disallow_attach) {
if (!IsShown()) {
Show();
}
strName = wxString(pis.name.c_str(), wxConvUTF8);
strURL = wxString(pis.url.c_str(), wxConvUTF8);
strTeamName = wxString(pis.team_name.c_str(), wxConvUTF8);
bCachedCredentials = pis.url.length() && pis.has_account_key;
pWizard = new CWizardAttach(this);
pWizard->Run(strName, strURL, strTeamName, bCachedCredentials);
}
if (pWizard) {
pWizard->Destroy();
m_pBackgroundPanel->UpdateProjectView();
}
wxLogTrace(wxT("Function Start/End"), wxT("CNewSimpleFrame::OnConnect - Function End"));
}
IMPLEMENT_DYNAMIC_CLASS(CSimpleGUIPanel, wxPanel)
BEGIN_EVENT_TABLE(CSimpleGUIPanel, wxPanel)
EVT_SIZE(CSimpleGUIPanel::OnSize)
EVT_ERASE_BACKGROUND(CSimpleGUIPanel::OnEraseBackground)
EVT_BUTTON(ID_SGNOTICESBUTTON,CSimpleGUIPanel::OnShowNotices)
EVT_BUTTON(ID_SGPAUSERESUMEBUTTON,CSimpleGUIPanel::OnPauseResume)
EVT_BUTTON(wxID_HELP,CSimpleGUIPanel::OnHelp)
EVT_TIMER(ID_SIMPLEMESSAGECHECKTIMER, CSimpleGUIPanel::OnCheckForNewNotices)
EVT_PAINT(CSimpleGUIPanel::OnPaint)
END_EVENT_TABLE()
CSimpleGUIPanel::CSimpleGUIPanel() {
wxLogTrace(wxT("Function Start/End"), wxT("CSimpleGUIPanel::CSimpleGUIPanel - Default Constructor Function Begin"));
wxLogTrace(wxT("Function Start/End"), wxT("CSimpleGUIPanel::CSimpleGUIPanel - Default Constructor Function End"));
}
CSimpleGUIPanel::CSimpleGUIPanel(wxWindow* parent) :
wxPanel(parent, -1, wxDefaultPosition, wxDefaultSize, wxCLIP_CHILDREN | wxBORDER_NONE)
{
wxLogTrace(wxT("Function Start/End"), wxT("CSimpleGUIPanel::CSimpleGUIPanel - Overloaded Constructor Function Begin"));
m_taskPanel = NULL;
m_projPanel = NULL;
m_oldWorkCount = 0;
m_bNewNoticeAlert = false;
m_bNoticesButtonIsRed = false;
m_bisPaused = false;
checkForNewNoticesTimer = new wxTimer(this, ID_SIMPLEMESSAGECHECKTIMER);
checkForNewNoticesTimer->Start(5000);
dlgOpen = false;
m_sPauseString = _("Pause");
m_sResumeString = _("Resume");
m_sPauseButtonToolTip = _("Stop all activity");
m_sResumeButtonToolTip = _("Resume activity");
m_taskPanel = new CSimpleTaskPanel(this);
m_projPanel = new CSimpleProjectPanel(this);
// Box Sizer
mainSizer = new wxBoxSizer(wxVERTICAL);
mainSizer->AddSpacer(68);
mainSizer->Add(m_taskPanel, 1, wxLEFT | wxRIGHT | wxEXPAND | wxALIGN_CENTER, SIDEMARGINS);
mainSizer->AddSpacer(8);
mainSizer->Add(m_projPanel, 0, wxLEFT | wxRIGHT | wxEXPAND | wxALIGN_CENTER, SIDEMARGINS);
mainSizer->AddSpacer(8);
wxBoxSizer* buttonsSizer;
buttonsSizer = new wxBoxSizer( wxHORIZONTAL );
m_NoticesButton = new wxButton( this, ID_SGNOTICESBUTTON, _("Notices"), wxDefaultPosition, wxDefaultSize, 0 );
m_NoticesButton->SetToolTip( _("Open a window to view notices from projects or BOINC"));
buttonsSizer->Add( m_NoticesButton, 0, wxEXPAND | wxALIGN_LEFT, 0 );
buttonsSizer->AddStretchSpacer();
int pauseWidth, resumeWidth, y;
GetTextExtent(m_sPauseString, &pauseWidth, &y);
GetTextExtent(m_sResumeString, &resumeWidth, &y);
m_PauseResumeButton = new wxButton( this, ID_SGPAUSERESUMEBUTTON,
(pauseWidth > resumeWidth) ? m_sPauseString : m_sResumeString,
wxDefaultPosition, wxDefaultSize, 0 );
buttonsSizer->Add( m_PauseResumeButton, 0, wxEXPAND | wxALIGN_RIGHT, 0 );
buttonsSizer->AddStretchSpacer();
m_HelpButton = new wxButton( this, wxID_HELP, _("Help"), wxDefaultPosition, wxDefaultSize, 0 );
buttonsSizer->Add( m_HelpButton, 0, wxEXPAND | wxALIGN_RIGHT, 0 );
m_HelpButton->SetToolTip( _("Get help with BOINC"));
mainSizer->Add( buttonsSizer, 0, wxLEFT | wxRIGHT | wxEXPAND, 2 * SIDEMARGINS );
mainSizer->AddSpacer(10);
SetSizer(mainSizer);
Layout();
mainSizer->Fit(GetParent());
m_PauseResumeButton->SetLabel(m_sPauseString);
m_PauseResumeButton->SetToolTip(m_sPauseButtonToolTip);
SetBackgroundBitmap();
#ifdef __WXMAC__
// Tell accessibility aids to ignore this panel (but not its contents)
HIObjectSetAccessibilityIgnored((HIObjectRef)GetHandle(), true);
#endif
m_projPanel->Hide();
m_PauseResumeButton->Disable();
OnFrameRender();
wxLogTrace(wxT("Function Start/End"), wxT("CSimpleGUIPanel::CSimpleGUIPanel - Overloaded Constructor Function End"));
}
CSimpleGUIPanel::~CSimpleGUIPanel()
{
wxLogTrace(wxT("Function Start/End"), wxT("CSimpleGUIPanel::CSimpleGUIPanel - Destructor Function Begin"));
#ifdef __WXMAC__
// RemoveMacAccessibilitySupport(); /* CAF */
#endif
checkForNewNoticesTimer->Stop();
delete checkForNewNoticesTimer;
m_bmpBg = wxNullBitmap; // Deletes old bitmap via reference counting
wxLogTrace(wxT("Function Start/End"), wxT("CSimpleGUIPanel::CSimpleGUIPanel - Destructor Function End"));
}
void CSimpleGUIPanel::SetBackgroundBitmap() {
wxLogTrace(wxT("Function Start/End"), wxT("CSimpleGUIPanel::SetBackgroundBitmap - Function Start"));
CSkinSimple* pSkinSimple = wxGetApp().GetSkinManager()->GetSimple();
wxASSERT(pSkinSimple);
wxASSERT(wxDynamicCast(pSkinSimple, CSkinSimple));
wxColour bgColor(*pSkinSimple->GetBackgroundImage()->GetBackgroundColor());
SetBackgroundColour(bgColor);
wxRect panelRect = GetRect();
m_bmpBg = wxBitmap(panelRect.width, panelRect.height);
wxMemoryDC dc(m_bmpBg);
wxBrush bgBrush(bgColor);
dc.SetBackground(bgBrush);
dc.Clear();
dc.DrawBitmap(*pSkinSimple->GetBackgroundImage()->GetBitmap(), 0, 0, false);
wxLogTrace(wxT("Function Start/End"), wxT("CSimpleGUIPanel::SetBackgroundBitmap - Function End"));
}
void CSimpleGUIPanel::ReskinInterface() {
wxLogTrace(wxT("Function Start/End"), wxT("CSimpleGUIPanel::ReskinInterface - Function Start"));
Freeze();
//bg color
m_bmpBg = wxNullBitmap; // Deletes old bitmap via reference counting
SetBackgroundBitmap();
m_taskPanel->ReskinInterface();
m_projPanel->ReskinInterface();
Thaw();
Refresh();
wxLogTrace(wxT("Function Start/End"), wxT("CSimpleGUIPanel::ReskinInterface - Function End"));
}
void CSimpleGUIPanel::OnProjectsAttachToProject() {
wxLogTrace(wxT("Function Start/End"), wxT("CSimpleGUIPanel::OnProjectsAttachToProject - Function Begin"));
CNewSimpleFrame* pFrame = wxDynamicCast(GetParent(), CNewSimpleFrame);
wxASSERT(pFrame);
pFrame->OnProjectsAttachToProject();
wxLogTrace(wxT("Function Start/End"), wxT("CNewSimpleFrame::OnProjectsAttachToProject - Function End"));
}
// called from CNewSimpleFrame::OnRefreshView()
void CSimpleGUIPanel::OnFrameRender() {
CMainDocument* pDoc = wxGetApp().GetDocument();
wxASSERT(pDoc);
int workCount = pDoc->GetSimpleGUIWorkCount();
CC_STATUS status;
// OnFrameRender() may be called while SimpleGUI initialization is
// in progress due to completion of a periodic get_messages RPC,
// causing unintended recursion in CMainDocument::RequestRPC().
// Check for that situation here.
if (pDoc->WaitingForRPC()) return;
if (workCount != m_oldWorkCount) {
if (workCount <= 0) {
m_projPanel->Hide();
} else if (m_oldWorkCount == 0) {
m_projPanel->Show();
}
}
if (IsShown()) {
if ( pDoc->IsConnected() ) {
// Show resume or pause as appropriate
pDoc->GetCoreClientStatus(status);
m_bisPaused = (RUN_MODE_NEVER == status.task_mode);
m_PauseResumeButton->SetLabel(m_bisPaused ? m_sResumeString : m_sPauseString);
m_PauseResumeButton->SetToolTip(m_bisPaused ? m_sResumeButtonToolTip : m_sPauseButtonToolTip);
m_PauseResumeButton->Enable();
UpdateProjectView();
} else {
m_PauseResumeButton->SetToolTip(wxEmptyString);
m_PauseResumeButton->Disable();
}
if (m_bNewNoticeAlert) {
wxRect r = m_NoticesButton->GetRect();
r.Inflate(4, 4);
RefreshRect(r, m_bNoticesButtonIsRed);
m_bNoticesButtonIsRed = !m_bNoticesButtonIsRed;
}
// State changes can cause the BSG to crash if a dialogue is open.
// Defer state change until after the dialogue is closed
if ( dlgOpen ) {
return;
}
m_oldWorkCount = workCount;
m_taskPanel->Update();
#ifdef __WXMAC__
//Accessibility
// Hide all but top level view from accessibility support so that
// the screen reader will tell user to switch to advanced view.
// if (oldSimpleGUIWorkCount != workCount) { /* CAF */
// oldSimpleGUIWorkCount = workCount;
// HIViewRef simple = (HIViewRef)GetHandle();
// AccessibilityIgnoreAllChildren(simple, 1);
// }
#endif
}
}
void CSimpleGUIPanel::UpdateProjectView()
{
//update Project Panel
m_projPanel->UpdateInterface();
}
void CSimpleGUIPanel::OnCheckForNewNotices(wxTimerEvent& WXUNUSED(event)) {
CMainDocument* pDoc = wxGetApp().GetDocument();
if ( pDoc->GetUnreadNoticeCount() ) {
m_bNewNoticeAlert = true;
checkForNewNoticesTimer->Stop();
}
}
void CSimpleGUIPanel::NoticesViewed() {
CMainDocument* pDoc = wxGetApp().GetDocument();
wxASSERT(pDoc);
m_bNewNoticeAlert = false;
m_bNoticesButtonIsRed = false;
wxRect r = m_NoticesButton->GetRect();
r.Inflate(4, 4);
RefreshRect(r, true);
m_bNoticesButtonIsRed = !m_bNoticesButtonIsRed;
pDoc->UpdateUnreadNoticeState();
checkForNewNoticesTimer->Start();
}
void CSimpleGUIPanel::OnShowNotices(wxCommandEvent& /*event*/) {
NoticesViewed();
CDlgMessages dlg(GetParent());
SetDlgOpen(true);
((CNewSimpleFrame*)GetParent())->SetMsgsDlgOpen(&dlg);
dlg.ShowModal();
SetDlgOpen(false);
((CNewSimpleFrame*)GetParent())->SetMsgsDlgOpen(NULL);
}
void CSimpleGUIPanel::OnPauseResume(wxCommandEvent& /*event*/) {
CMainDocument* pDoc = wxGetApp().GetDocument();
CC_STATUS ccs;
wxASSERT(pDoc);
wxASSERT(wxDynamicCast(pDoc, CMainDocument));
if (m_bisPaused) {
pDoc->GetCoreClientStatus(ccs);
if ((RUN_MODE_NEVER == ccs.task_mode) && (0 >= ccs.task_mode_delay)) {
pDoc->SetActivityRunMode(RUN_MODE_AUTO, 0);
} else {
pDoc->SetActivityRunMode(RUN_MODE_RESTORE, 0);
}
} else {
pDoc->SetActivityRunMode(RUN_MODE_NEVER, 3600);
}
m_PauseResumeButton->SetLabel(m_bisPaused ? m_sResumeString : m_sPauseString);
m_PauseResumeButton->SetToolTip(m_bisPaused ? m_sResumeButtonToolTip : m_sPauseButtonToolTip);
}
// TODO: Create ID_SIMPLE_HELP web page for each organization for new BOINC version
void CSimpleGUIPanel::OnHelp(wxCommandEvent& WXUNUSED(event)) {
wxLogTrace(wxT("Function Start/End"), wxT("CSimpleGUIPanel::OnHelp - Function Begin"));
wxString strURL = wxGetApp().GetSkinManager()->GetAdvanced()->GetOrganizationHelpUrl();
wxString wxurl;
wxurl.Printf(
wxT("%s?target=simple&version=%s&controlid=%d"),
strURL.c_str(),
wxString(BOINC_VERSION_STRING, wxConvUTF8).c_str(),
ID_SIMPLE_HELP
);
wxLaunchDefaultBrowser(wxurl);
wxLogTrace(wxT("Function Start/End"), wxT("CSimpleGUIPanel::OnHelp - Function End"));
}
void CSimpleGUIPanel::OnPaint(wxPaintEvent& event) {
wxPaintDC myDC(this);
if (m_bNewNoticeAlert) {
wxRect r = m_NoticesButton->GetRect();
r.Inflate(3, 3);
if (m_bNoticesButtonIsRed) {
wxPen oldPen = myDC.GetPen();
wxBrush oldBrush = myDC.GetBrush();
int oldMode = myDC.GetBackgroundMode();
wxPen bgPen(*wxRED, 3);
myDC.SetBackgroundMode(wxSOLID);
myDC.SetPen(bgPen);
myDC.SetBrush(*wxTRANSPARENT_BRUSH);
#ifdef __WXMAC__
myDC.DrawRoundedRectangle(r.x, r.y, r.width, r.height, 12);
#else
myDC.DrawRectangle(r.x, r.y, r.width, r.height);
#endif
// Restore Mode, Pen and Brush
myDC.SetBackgroundMode(oldMode);
myDC.SetPen(oldPen);
myDC.SetBrush(oldBrush);
}
}
}
void CSimpleGUIPanel::OnEraseBackground(wxEraseEvent& event) {
wxDC *dc = event.GetDC();
dc->DrawBitmap(m_bmpBg, 0, 0);
}

View File

@ -0,0 +1,147 @@
// This file is part of BOINC.
// http://boinc.berkeley.edu
// Copyright (C) 2008 University of California
//
// BOINC 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 3 of the License, or (at your option) any later version.
//
// BOINC 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.
//
// You should have received a copy of the GNU Lesser General Public License
// along with BOINC. If not, see <http://www.gnu.org/licenses/>.
#ifndef _BOINCSIMPLEFRAME_H_
#define _BOINCSIMPLEFRAME_H_
#include "BOINCBaseFrame.h"
#if defined(__GNUG__) && !defined(__APPLE__)
#pragma interface "sg_BoincSimpleFrame.cpp"
#endif
class CSimpleTaskPanel;
class CSimpleProjectPanel;
class CSimpleTaskPanel;
class CDlgMessages;
class CSimpleGUIPanel : public wxPanel
{
DECLARE_DYNAMIC_CLASS(CSimpleGUIPanel)
public:
CSimpleGUIPanel();
CSimpleGUIPanel(wxWindow* parent);
~CSimpleGUIPanel();
//
// My tasks panel (shown when there are active tasks)
CSimpleTaskPanel *m_taskPanel;
// My projects panel
CSimpleProjectPanel *m_projPanel;
////////////////////////////;
void SetBackgroundBitmap();
void ReskinInterface();
void UpdateProjectView();
void OnFrameRender();
void OnProjectsAttachToProject();
void OnShowNotices(wxCommandEvent& event);
void OnPauseResume(wxCommandEvent& event);
void OnHelp( wxCommandEvent& event );
void SetDlgOpen(bool newDlgState) { dlgOpen = newDlgState; }
bool GetDlgOpen() { return dlgOpen; }
wxBitmap *GetBackgroundBitMap() { return &m_bmpBg; }
void OnCheckForNewNotices(wxTimerEvent& WXUNUSED(event));
void NoticesViewed();
//////////
wxBoxSizer *mainSizer;
//////////
bool m_bNewNoticeAlert;
bool m_bNoticesButtonIsRed;
DECLARE_EVENT_TABLE()
protected:
void OnPaint(wxPaintEvent& event);
void OnEraseBackground(wxEraseEvent& event);
#ifdef __WXMAC__
// void SetupMacAccessibilitySupport();
// void RemoveMacAccessibilitySupport();
// EventHandlerRef m_pSGAccessibilityEventHandlerRef;
#endif
wxBitmap m_bmpBg;
wxButton *m_NoticesButton;
wxButton *m_PauseResumeButton;
wxButton *m_HelpButton;
wxString m_sPauseString;
wxString m_sResumeString;
int m_oldWorkCount;
bool m_bisPaused;
private:
bool dlgOpen;
wxTimer* checkForNewNoticesTimer;
wxString m_sPauseButtonToolTip;
wxString m_sResumeButtonToolTip;
};
// Define a new frame
class CNewSimpleFrame : public CBOINCBaseFrame
{
DECLARE_DYNAMIC_CLASS(CNewSimpleFrame)
public:
CNewSimpleFrame();
CNewSimpleFrame(wxString title, wxIcon* icon, wxIcon* icon32, wxPoint position, wxSize size);
~CNewSimpleFrame();
void OnChangeGUI( wxCommandEvent& event );
void OnPreferences( wxCommandEvent& event );
void OnOptions( wxCommandEvent& event );
void OnOldSG( wxCommandEvent& event );
void OnHelp( wxHelpEvent& event );
void OnHelpBOINC( wxCommandEvent& event );
void OnHelpAbout( wxCommandEvent& event );
void OnProjectsAttachToProject();
void OnConnect(CFrameEvent& event );
void OnReloadSkin( CFrameEvent& event );
void OnRefreshView( CFrameEvent& event );
void OnNotification( CFrameEvent& event );
void SetMsgsDlgOpen(CDlgMessages* newDlgPtr) { dlgMsgsPtr = newDlgPtr; }
bool isMessagesDlgOpen() { return (dlgMsgsPtr != NULL); }
bool SaveState();
bool RestoreState();
protected:
virtual int _GetCurrentViewPage();
wxMenuBar* m_pMenubar;
wxAcceleratorEntry m_Shortcuts[1];
wxAcceleratorTable* m_pAccelTable;
CSimpleGUIPanel* m_pBackgroundPanel;
private:
CDlgMessages* dlgMsgsPtr;
DECLARE_EVENT_TABLE()
};
#endif // _BOINCSIMPLEFRAME_H_

View File

@ -69,7 +69,8 @@ END_EVENT_TABLE()
CTransparentStaticText::CTransparentStaticText() {}
CTransparentStaticText::CTransparentStaticText(wxWindow* parent, wxWindowID id, const wxString& label, const wxPoint& pos, const wxSize& size, long style, const wxString& name ) {
Create(parent, id, label, pos, size, style, name);
// Set name same as label for accessibility on Windows
Create(parent, id, label, pos, size, style, label);
}
@ -84,6 +85,14 @@ bool CTransparentStaticText::Create(wxWindow* parent, wxWindowID id, const wxStr
}
#ifndef __WXMAC__
void CTransparentStaticText::SetLabel(const wxString& label) {
wxStaticText::SetLabel(label);
GetParent()->RefreshRect(GetRect());
}
#endif
void CTransparentStaticText::OnPaint(wxPaintEvent& /*event*/) {
wxPaintDC dc(this);
dc.SetFont(GetFont());

View File

@ -91,6 +91,8 @@ public:
#ifdef __WXMAC__
virtual void OnEraseBackground(wxEraseEvent& /*event*/) {};
#else
virtual void SetLabel(const wxString& label);
#endif
virtual void OnPaint(wxPaintEvent& event);

145
clientgui/sg_PanelBase.cpp Executable file
View File

@ -0,0 +1,145 @@
// This file is part of BOINC.
// http://boinc.berkeley.edu
// Copyright (C) 2008 University of California
//
// BOINC 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 3 of the License, or (at your option) any later version.
//
// BOINC 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.
//
// You should have received a copy of the GNU Lesser General Public License
// along with BOINC. If not, see <http://www.gnu.org/licenses/>.
#include "stdwx.h"
#include "sg_PanelBase.h"
IMPLEMENT_DYNAMIC_CLASS(CSimplePanelBase, wxPanel)
BEGIN_EVENT_TABLE(CSimplePanelBase, wxPanel)
EVT_ERASE_BACKGROUND(CSimplePanelBase::OnEraseBackground)
END_EVENT_TABLE()
CSimplePanelBase::CSimplePanelBase() {
}
CSimplePanelBase::CSimplePanelBase( wxWindow* parent ) :
wxPanel( parent, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxCLIP_CHILDREN | wxBORDER_NONE )
{
#ifdef __WXMSW__
SetDoubleBuffered(true);
#endif
#ifdef __WXMAC__
// Tell accessibility aids to ignore this panel (but not its contents)
HIObjectSetAccessibilityIgnored((HIObjectRef)GetHandle(), true);
#endif
}
CSimplePanelBase::~CSimplePanelBase()
{
}
void CSimplePanelBase::ReskinInterface() {
m_GotBGBitMap = false;
}
// Create a background bitmap simulating partial transparency
void CSimplePanelBase::MakeBGBitMap() {
wxRect r;
wxBitmap rawBmp;
wxBitmap whiteBmp;
wxImage bgImage;
wxImage whiteImage;
register unsigned char *bgImagePixels;
register unsigned char *whitePixels;
register int i, j, k;
wxPen bgPen(*wxWHITE, 1, wxTRANSPARENT);
wxBrush bgBrush(*wxWHITE);
GetPosition(&r.x, &r.y);
GetSize(&r.width, &r.height);
wxBitmap *bgBmp(((CSimpleGUIPanel*)GetParent())->GetBackgroundBitMap());
wxRect bgRect(0, 0, bgBmp->GetWidth(), bgBmp->GetHeight());
if (bgRect.Contains(r)) {
rawBmp = bgBmp->GetSubBitmap(r);
} else {
fprintf(stderr, "SimpleGUI background image is too small\n");
rawBmp = wxBitmap(r.width, r.height);
wxMemoryDC dc(rawBmp);
wxPen rawPen(*wxBLACK, 1, wxTRANSPARENT);
wxBrush rawBrush(*wxBLACK);
dc.SetBackgroundMode(wxSOLID);
dc.SetPen(rawPen);
dc.SetBrush(rawBrush);
dc.DrawRectangle(0, 0, r.width, r.height);
}
whiteBmp = wxBitmap(r.width, r.height);
wxMemoryDC dc(whiteBmp);
dc.SetBackgroundMode(wxSOLID);
dc.SetPen(bgPen);
dc.SetBrush(bgBrush);
dc.DrawRoundedRectangle(0, 0, r.width, r.height, 10.0);
bgImage = rawBmp.ConvertToImage();
bgImagePixels = bgImage.GetData(); // RGBRGBRGB...
whiteImage = whiteBmp.ConvertToImage();
whitePixels = whiteImage.GetData(); // RGBRGBRGB...
for (i=0; i<r.width; ++i) {
for (j=0; j<r.height; ++j) {
if (*whitePixels) {
k = (((unsigned int)*bgImagePixels * 55) + ((unsigned int)*whitePixels++ * 45));
*bgImagePixels++ = k / 100;
k = (((unsigned int)*bgImagePixels * 55) + ((unsigned int)*whitePixels++ * 45));
*bgImagePixels++ = k / 100;
k = (((unsigned int)*bgImagePixels * 55) + ((unsigned int)*whitePixels++ * 45));
*bgImagePixels++ = k / 100;
} else {
bgImagePixels += 3;
whitePixels += 3;
}
}
}
m_TaskPanelBGBitMap = wxBitmap(bgImage);
m_GotBGBitMap = true;
}
void CSimplePanelBase::OnEraseBackground(wxEraseEvent& event) {
wxDC* dc = event.GetDC();
if (!m_GotBGBitMap) {
MakeBGBitMap();
}
dc->DrawBitmap(m_TaskPanelBGBitMap, 0, 0);
wxPen oldPen= dc->GetPen();
wxBrush oldBrush = dc->GetBrush();
int oldMode = dc->GetBackgroundMode();
wxCoord w, h;
wxPen bgPen(*wxBLUE, 3);
wxBrush bgBrush(*wxBLUE, wxTRANSPARENT);
dc->SetBackgroundMode(wxSOLID);
dc->SetPen(bgPen);
dc->SetBrush(bgBrush);
dc->GetSize(&w, &h);
dc->DrawRoundedRectangle(0, 0, w, h, 10.0);
// Restore Mode, Pen and Brush
dc->SetBackgroundMode(oldMode);
dc->SetPen(oldPen);
dc->SetBrush(oldBrush);
}

89
clientgui/sg_PanelBase.h Executable file
View File

@ -0,0 +1,89 @@
// This file is part of BOINC.
// http://boinc.berkeley.edu
// Copyright (C) 2008 University of California
//
// BOINC 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 3 of the License, or (at your option) any later version.
//
// BOINC 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.
//
// You should have received a copy of the GNU Lesser General Public License
// along with BOINC. If not, see <http://www.gnu.org/licenses/>.
#ifndef __sg_PanelBase__
#define __sg_PanelBase__
#include "sg_BoincSimpleFrame.h"
// TODO: Move these to events.h
enum{
ID_CHANGE_SLIDE_TIMER = 14000,
WEBSITE_URL_MENU_ID = 34500,
WEBSITE_URL_MENU_ID_REMOVE_PROJECT = 34550,
WEBSITE_URL_MENU_ID_HOMEPAGE = 34551,
};
///////////////////////////////////////////////////////////////////////////
#ifdef __WXMAC__
#define SMALL_FONT 12
#define MEDIUM_FONT 16
#define LARGE_FONT 20
#else
#define SMALL_FONT 9
#define MEDIUM_FONT 12
#define LARGE_FONT 16
#endif
#define SIDEMARGINS 30
///////////////////////////////////////////////////////////////////////////////
/// Class CSimplePanelBase
///////////////////////////////////////////////////////////////////////////////
#ifdef __WXMAC__
#include "MacBitmapComboBox.h"
#else
// TODO: Subclass CBOINCBitmapComboBox to be accessible on Windows. Either:
// Add WxBitmapComboBoxAccessible class (like CNoticeListCtrlAccessible for CNoticeListCtrl)
// or simulate bitmap combo box using accessible standard Windows controls (as done for
// CBOINCBitmapComboBox on Mac)
// TODO: Add wx/bmpcbox.h to stdwx.h
#include <wx/bmpcbox.h>
#define CBOINCBitmapComboBox wxBitmapComboBox
#define EVT_BOINCBITMAPCOMBOBOX EVT_COMBOBOX
#endif
class CSimplePanelBase : public wxPanel
{
DECLARE_DYNAMIC_CLASS( CSimplePanelBase )
DECLARE_EVENT_TABLE()
private:
void MakeBGBitMap();
void OnEraseBackground(wxEraseEvent& event);
protected:
wxBitmap m_TaskPanelBGBitMap;
bool m_GotBGBitMap;
public:
CSimplePanelBase();
CSimplePanelBase( wxWindow* parent);
~CSimplePanelBase();
void ReskinInterface();
virtual wxRect GetProgressRect() { return wxRect(0, 0, 0, 0); }
};
#endif //__sg_PanelBase__

View File

@ -0,0 +1,298 @@
// This file is part of BOINC.
// http://boinc.berkeley.edu
// Copyright (C) 2008 University of California
//
// BOINC 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 3 of the License, or (at your option) any later version.
//
// BOINC 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.
//
// You should have received a copy of the GNU Lesser General Public License
// along with BOINC. If not, see <http://www.gnu.org/licenses/>.
#include "stdwx.h"
#include "Events.h"
#include "BOINCGUIApp.h"
#include "MainDocument.h"
#include "DlgItemProperties.h"
#include "sg_ProjectPanel.h"
#include "sg_ProjectCommandPopup.h"
IMPLEMENT_DYNAMIC_CLASS(CSimpleProjectCommandPopupButton, wxButton)
BEGIN_EVENT_TABLE(CSimpleProjectCommandPopupButton, wxButton)
EVT_LEFT_DOWN(CSimpleProjectCommandPopupButton::OnProjectCommandsButton)
EVT_MENU(ID_TASK_PROJECT_UPDATE, CSimpleProjectCommandPopupButton::OnProjectUpdate)
EVT_MENU(ID_TASK_PROJECT_SUSPEND, CSimpleProjectCommandPopupButton::OnProjectSuspendResume)
EVT_MENU(ID_TASK_PROJECT_NONEWWORK, CSimpleProjectCommandPopupButton::OnProjectNoNewWork)
EVT_MENU(ID_TASK_PROJECT_RESET, CSimpleProjectCommandPopupButton::OnResetProject)
EVT_MENU(ID_TASK_PROJECT_DETACH, CSimpleProjectCommandPopupButton::OnProjectDetach)
EVT_MENU(ID_TASK_PROJECT_SHOW_PROPERTIES, CSimpleProjectCommandPopupButton::OnProjectShowProperties)
END_EVENT_TABLE()
CSimpleProjectCommandPopupButton::CSimpleProjectCommandPopupButton() {
}
CSimpleProjectCommandPopupButton::CSimpleProjectCommandPopupButton(wxWindow* parent, wxWindowID id,
const wxString& label, const wxPoint& pos, const wxSize& size,
long style, const wxValidator& validator, const wxString& name) :
wxButton(parent, id, label, pos, size, style, validator, name)
{
m_ProjectCommandsPopUpMenu = new wxMenu();
AddMenuItems();
}
CSimpleProjectCommandPopupButton::~CSimpleProjectCommandPopupButton() {
delete m_ProjectCommandsPopUpMenu;
}
void CSimpleProjectCommandPopupButton::AddMenuItems() {
m_UpdateProjectMenuItem = m_ProjectCommandsPopUpMenu->Append(
ID_TASK_PROJECT_UPDATE,
_("Update"),
_("Report all completed tasks, get latest credit, get latest preferences, and possibly get more tasks.")
);
m_SuspendResumeMenuItem = m_ProjectCommandsPopUpMenu->Append(
ID_TASK_PROJECT_SUSPEND,
_("Suspend"),
_("Suspend tasks for this project.")
);
m_NoNewTasksMenuItem = m_ProjectCommandsPopUpMenu->Append(
ID_TASK_PROJECT_NONEWWORK,
_("No new tasks"),
_("Don't get new tasks for this project.")
);
m_ResetProjectMenuItem = m_ProjectCommandsPopUpMenu->Append(
ID_TASK_PROJECT_RESET,
_("Reset project"),
_("Delete all files and tasks associated with this project, and get new tasks. You can update the project first to report any completed tasks.")
);
m_RemoveProjectMenuItem = m_ProjectCommandsPopUpMenu->Append(
ID_TASK_PROJECT_DETACH,
_("Remove"),
_("Remove this project. Tasks in progress will be lost (use 'Update' first to report any completed tasks).")
);
m_ShowPropertiesMenuItem = m_ProjectCommandsPopUpMenu->Append(
ID_TASK_PROJECT_SHOW_PROPERTIES,
_("Properties"),
_("Show project details.")
);
}
void CSimpleProjectCommandPopupButton::OnProjectCommandsButton(wxMouseEvent& /*event*/) {
CMainDocument* pDoc = wxGetApp().GetDocument();
wxASSERT(pDoc);
wxASSERT(wxDynamicCast(pDoc, CMainDocument));
ProjectSelectionData* selData = ((CSimpleProjectPanel*)GetParent())->GetProjectSelectionData();
if (selData == NULL) return;
char* ctrl_url = selData->project_url;
PROJECT* project = pDoc->state.lookup_project(ctrl_url);
if (!project) return;
if (project->suspended_via_gui) {
m_SuspendResumeMenuItem->SetItemLabel(_("Resume"));
m_SuspendResumeMenuItem->SetHelp(_("Resume tasks for this project."));
} else {
m_SuspendResumeMenuItem->SetItemLabel(_("Suspend"));
m_SuspendResumeMenuItem->SetHelp(_("Suspend tasks for this project."));
}
if (project->dont_request_more_work) {
m_NoNewTasksMenuItem->SetItemLabel(_("Allow new tasks"));
m_NoNewTasksMenuItem->SetHelp(_("Allow fetching new tasks for this project."));
} else {
m_NoNewTasksMenuItem->SetItemLabel(_("No new tasks"));
m_NoNewTasksMenuItem->SetHelp(_("Don't fetch new tasks for this project."));
}
m_RemoveProjectMenuItem->Enable(!project->attached_via_acct_mgr);
PopupMenu(m_ProjectCommandsPopUpMenu);
}
void CSimpleProjectCommandPopupButton::OnProjectUpdate( wxCommandEvent& WXUNUSED(event) ) {
int projectIndex;
CMainDocument* pDoc = wxGetApp().GetDocument();
wxASSERT(pDoc);
wxASSERT(wxDynamicCast(pDoc, CMainDocument));
ProjectSelectionData* selData = ((CSimpleProjectPanel*)GetParent())->GetProjectSelectionData();
if (selData == NULL) return;
char* ctrl_url = selData->project_url;
PROJECT* project = FindProjectIndexFromURL(ctrl_url, &projectIndex);
if (!project) return;
pDoc->ProjectUpdate(projectIndex);
}
void CSimpleProjectCommandPopupButton::OnProjectSuspendResume(wxCommandEvent& WXUNUSED(event)) {
int projectIndex;
CMainDocument* pDoc = wxGetApp().GetDocument();
wxASSERT(pDoc);
wxASSERT(wxDynamicCast(pDoc, CMainDocument));
ProjectSelectionData* selData = ((CSimpleProjectPanel*)GetParent())->GetProjectSelectionData();
if (selData == NULL) return;
char* ctrl_url = selData->project_url;
PROJECT* project = FindProjectIndexFromURL(ctrl_url, &projectIndex);
if (!project) return;
if (project->suspended_via_gui) {
pDoc->ProjectResume(projectIndex);
} else {
pDoc->ProjectSuspend(projectIndex);
}
}
void CSimpleProjectCommandPopupButton::OnProjectNoNewWork(wxCommandEvent& WXUNUSED(event)) {
int projectIndex;
CMainDocument* pDoc = wxGetApp().GetDocument();
wxASSERT(pDoc);
wxASSERT(wxDynamicCast(pDoc, CMainDocument));
ProjectSelectionData* selData = ((CSimpleProjectPanel*)GetParent())->GetProjectSelectionData();
if (selData == NULL) return;
char* ctrl_url = selData->project_url;
PROJECT* project = FindProjectIndexFromURL(ctrl_url, &projectIndex);
if (!project) return;
if (project->dont_request_more_work) {
pDoc->ProjectAllowMoreWork(projectIndex);
} else {
pDoc->ProjectNoMoreWork(projectIndex);
}
}
void CSimpleProjectCommandPopupButton::OnResetProject(wxCommandEvent& WXUNUSED(event)) {
int projectIndex;
wxInt32 iAnswer = 0;
wxString strMessage = wxEmptyString;
CMainDocument* pDoc = wxGetApp().GetDocument();
wxASSERT(pDoc);
wxASSERT(wxDynamicCast(pDoc, CMainDocument));
if (!pDoc->IsUserAuthorized())
return;
ProjectSelectionData* selData = ((CSimpleProjectPanel*)GetParent())->GetProjectSelectionData();
if (selData == NULL) return;
char* ctrl_url = selData->project_url;
PROJECT* project = FindProjectIndexFromURL(ctrl_url, &projectIndex);
if (!project) return;
wxString projname(project->project_name.c_str(), wxConvUTF8);
strMessage.Printf(
_("Are you sure you want to reset project '%s'?"),
projname.c_str()
);
iAnswer = wxGetApp().SafeMessageBox(
strMessage,
_("Reset Project"),
wxYES_NO | wxICON_QUESTION,
this
);
if (wxYES == iAnswer) {
pDoc->ProjectReset(projectIndex);
}
}
void CSimpleProjectCommandPopupButton::OnProjectDetach(wxCommandEvent& WXUNUSED(event)) {
int projectIndex;
wxInt32 iAnswer = 0;
wxString strMessage = wxEmptyString;
CMainDocument* pDoc = wxGetApp().GetDocument();
wxASSERT(pDoc);
wxASSERT(wxDynamicCast(pDoc, CMainDocument));
if (!pDoc->IsUserAuthorized())
return;
ProjectSelectionData* selData = ((CSimpleProjectPanel*)GetParent())->GetProjectSelectionData();
if (selData == NULL) return;
char* ctrl_url = selData->project_url;
PROJECT* project = FindProjectIndexFromURL(ctrl_url, &projectIndex);
if (!project) return;
wxString projname(project->project_name.c_str(), wxConvUTF8);
strMessage.Printf(
_("Are you sure you want to remove project '%s'?"),
projname.c_str()
);
iAnswer = wxGetApp().SafeMessageBox(
strMessage,
_("Remove Project"),
wxYES_NO | wxICON_QUESTION,
this
);
if (wxYES == iAnswer) {
pDoc->ProjectDetach(projectIndex);
}
}
void CSimpleProjectCommandPopupButton::OnProjectShowProperties(wxCommandEvent& WXUNUSED(event)) {
CMainDocument* pDoc = wxGetApp().GetDocument();
wxASSERT(pDoc);
wxASSERT(wxDynamicCast(pDoc, CMainDocument));
ProjectSelectionData* selData = ((CSimpleProjectPanel*)GetParent())->GetProjectSelectionData();
if (selData == NULL) return;
char* ctrl_url = selData->project_url;
PROJECT* project = pDoc->state.lookup_project(ctrl_url);
if (!project) return;
CDlgItemProperties dlg(this);
dlg.renderInfos(project);
dlg.ShowModal();
}
PROJECT* CSimpleProjectCommandPopupButton::FindProjectIndexFromURL(char *project_url, int *index) {
CMainDocument* pDoc = wxGetApp().GetDocument();
wxASSERT(pDoc);
wxASSERT(wxDynamicCast(pDoc, CMainDocument));
int prjCount = pDoc->GetSimpleProjectCount();
for(int i = 0; i < prjCount; i++){
PROJECT* project = pDoc->project(i);
if(!strcmp(project->master_url, project_url)){
*index = i;
return project;
}
}
*index = -1;
return NULL;
}

View File

@ -0,0 +1,60 @@
// This file is part of BOINC.
// http://boinc.berkeley.edu
// Copyright (C) 2008 University of California
//
// BOINC 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 3 of the License, or (at your option) any later version.
//
// BOINC 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.
//
// You should have received a copy of the GNU Lesser General Public License
// along with BOINC. If not, see <http://www.gnu.org/licenses/>.
#ifndef __sg_ProjectCommandPopup__
#define __sg_ProjectCommandPopup__
class CSimpleProjectCommandPopupButton : public wxButton
{
DECLARE_DYNAMIC_CLASS( CSimpleProjectCommandPopupButton )
DECLARE_EVENT_TABLE()
public:
CSimpleProjectCommandPopupButton();
CSimpleProjectCommandPopupButton(wxWindow* parent, wxWindowID id,
const wxString& label = wxEmptyString,
const wxPoint& pos = wxDefaultPosition,
const wxSize& size = wxDefaultSize,
long style = 0,
const wxValidator& validator = wxDefaultValidator,
const wxString& name = wxT("ProjectCommandsPopupMenu"));
~CSimpleProjectCommandPopupButton();
private:
void AddMenuItems();
void OnProjectCommandsButton(wxMouseEvent& event);
void OnProjectUpdate(wxCommandEvent& event);
void OnProjectSuspendResume(wxCommandEvent& event);
void OnProjectNoNewWork(wxCommandEvent& event);
void OnResetProject(wxCommandEvent& event);
void OnProjectDetach(wxCommandEvent& event);
void OnProjectShowProperties(wxCommandEvent& event);
PROJECT* FindProjectIndexFromURL(char *project_url, int *index);
protected:
wxMenu* m_ProjectCommandsPopUpMenu;
wxMenuItem* m_UpdateProjectMenuItem;
wxMenuItem* m_SuspendResumeMenuItem;
wxMenuItem* m_NoNewTasksMenuItem;
wxMenuItem* m_ResetProjectMenuItem;
wxMenuItem* m_RemoveProjectMenuItem;
wxMenuItem* m_ShowPropertiesMenuItem;
};
#endif // __sg_ProjectCommandPopup__

463
clientgui/sg_ProjectPanel.cpp Executable file
View File

@ -0,0 +1,463 @@
// This file is part of BOINC.
// http://boinc.berkeley.edu
// Copyright (C) 2008 University of California
//
// BOINC 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 3 of the License, or (at your option) any later version.
//
// BOINC 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.
//
// You should have received a copy of the GNU Lesser General Public License
// along with BOINC. If not, see <http://www.gnu.org/licenses/>.
#define TESTBIGICONPOPUP 0
#include "stdwx.h"
#include "Events.h"
#include "app_ipc.h"
#include "BOINCGUIApp.h"
#include "MainDocument.h"
#include "SkinManager.h"
#include "wizardex.h"
#include "BOINCBaseWizard.h"
#include "WizardAttach.h"
#include "sg_ProjectPanel.h"
#if TESTBIGICONPOPUP
#include "test/sah_40.xpm"
#include "test/einstein_icon.xpm"
#endif
IMPLEMENT_DYNAMIC_CLASS(CSimpleProjectPanel, CSimplePanelBase)
BEGIN_EVENT_TABLE(CSimpleProjectPanel, CSimplePanelBase)
EVT_BOINCBITMAPCOMBOBOX(ID_SGPROJECTSELECTOR, CSimpleProjectPanel::OnProjectSelection)
EVT_BUTTON(ID_ADDROJECTBUTTON, CSimpleProjectPanel::OnAddProject)
#if TESTBIGICONPOPUP
EVT_BUTTON(ID_PROJECTWEBSITESBUTTON, CSimpleProjectPanel::OnProjectWebSiteButton)
EVT_BUTTON(ID_PROJECTCOMMANDBUTTON, CSimpleProjectPanel::OnProjectCommandButton)
#endif
END_EVENT_TABLE()
#if TESTBIGICONPOPUP
static wxString tempArray[] = {_T("String1"), _T("String2"), _T("String3"), _T("String4") };
static wxBitmap bmArray[3];
#endif
#define SIDEMARGINS 30
CSimpleProjectPanel::CSimpleProjectPanel() {
}
CSimpleProjectPanel::CSimpleProjectPanel( wxWindow* parent ) :
CSimplePanelBase( parent )
{
wxSize sz;
wxString str = wxEmptyString;
wxWindowDC dc(this);
m_UsingAccountManager = -1; // Force action the first time
m_CurrentSelectedProjectURL[0] = '\0';
m_sAddProjectString = _("Add Project");
m_sSynchronizeString = _("Synchronize");
m_sTotalWorkDoneString = _("My total work done this Project");
m_sAddProjectToolTip = _("Volunteer for any or all of 30+ projects in many areas of science");
m_sSynchronizeToolTip = _("Synchronize projects with account manager system");
m_GotBGBitMap = false; // Can't be made until parent has been laid out.
SetFont(wxFont(SMALL_FONT,wxSWISS,wxNORMAL,wxNORMAL,false,wxT("Arial")));
wxBoxSizer* bSizer1;
bSizer1 = new wxBoxSizer( wxVERTICAL );
wxBoxSizer* bSizer2;
bSizer2 = new wxBoxSizer( wxHORIZONTAL );
bSizer1->AddSpacer(5);
m_myProjectsLabel = new CTransparentStaticText( this, wxID_ANY, _("My Projects:"), wxDefaultPosition, wxDefaultSize, 0 );
m_myProjectsLabel->Wrap( -1 );
// m_myProjectsLabel->SetFont(wxFont(MEDIUM_FONT,wxSWISS,wxNORMAL,wxBOLD,false,wxT("Arial")));
m_myProjectsLabel->Enable( false );
bSizer2->Add( m_myProjectsLabel, 0, wxRIGHT, 5 );
bSizer2->AddStretchSpacer();
int addProjectWidth, synchronizeWidth, y;
GetTextExtent(m_sAddProjectString, &addProjectWidth, &y);
GetTextExtent(m_sSynchronizeString, &synchronizeWidth, &y);
m_TaskAddProjectButton = new wxButton( this, ID_ADDROJECTBUTTON,
(addProjectWidth > synchronizeWidth) ? m_sAddProjectString : m_sSynchronizeString,
wxDefaultPosition, wxDefaultSize, 0 );
bSizer2->Add( m_TaskAddProjectButton, 0, wxRIGHT | wxEXPAND | wxALIGN_RIGHT, SIDEMARGINS );
bSizer1->Add( bSizer2, 0, wxEXPAND | wxTOP | wxLEFT, 10 );
#ifdef __WXMSW__
bSizer1->AddSpacer(5);
#endif
#if TESTBIGICONPOPUP
m_ProjectSelectionCtrl = new CBOINCBitmapComboBox( this, ID_SGPROJECTSELECTOR, wxT(""), wxDefaultPosition, wxSize(-1, 42), 4, tempArray, wxCB_READONLY );
CSkinSimple* pSkinSimple = wxGetApp().GetSkinManager()->GetSimple();
bmArray[0] = *pSkinSimple->GetProjectImage()->GetBitmap();
m_ProjectSelectionCtrl->SetItemBitmap(0, bmArray[0]);
bmArray[1] = wxBitmap((const char**)sah_40_xpm);
m_ProjectSelectionCtrl->SetItemBitmap(1, bmArray[1]);
bmArray[2] = wxBitmap((const char**)einstein_icon_xpm);
m_ProjectSelectionCtrl->SetItemBitmap(3, bmArray[2]);
// m_ProjectSelectionCtrl->SetStringSelection(tempArray[1]);
m_ProjectSelectionCtrl->SetSelection(1);
#else
m_ProjectSelectionCtrl = new CBOINCBitmapComboBox( this, ID_SGPROJECTSELECTOR, wxT(""), wxDefaultPosition, wxSize(-1, 42), 0, NULL, wxCB_READONLY );
#endif
// TODO: Might want better wording for Project Selection Combo Box tooltip
str = _("Select a project to access with the controls below");
m_ProjectSelectionCtrl->SetToolTip(str);
bSizer1->Add( m_ProjectSelectionCtrl, 0, wxLEFT | wxRIGHT | wxEXPAND, SIDEMARGINS );
#ifdef __WXMSW__
bSizer1->AddSpacer(8);
#endif
// Make sure m_TotalCreditValue string is large enough
str.Printf(_("%s: %0.2f"), m_sTotalWorkDoneString.c_str(), 9999999999.99);
m_TotalCreditValue = new CTransparentStaticText( this, wxID_ANY, str, wxDefaultPosition, wxDefaultSize, wxST_NO_AUTORESIZE );
m_TotalCreditValue->Wrap( -1 );
m_TotalCreditValue->Enable( false );
bSizer1->Add( m_TotalCreditValue, 0, wxLEFT | wxRIGHT | wxEXPAND, SIDEMARGINS );
bSizer1->AddSpacer(5);
wxBoxSizer* bSizer3;
bSizer3 = new wxBoxSizer( wxHORIZONTAL );
m_ProjectWebSitesButton = new CSimpleProjectWebSitesPopupButton( this, ID_PROJECTWEBSITESBUTTON, _("Project Web Sites"), wxDefaultPosition, wxDefaultSize, 0 );
bSizer3->Add( m_ProjectWebSitesButton, 0, wxEXPAND | wxALIGN_LEFT, 0 );
bSizer3->AddStretchSpacer();
m_ProjectCommandsButton = new CSimpleProjectCommandPopupButton( this, ID_PROJECTCOMMANDBUTTON, _("Project Commands"), wxDefaultPosition, wxDefaultSize, 0 );
bSizer3->Add( m_ProjectCommandsButton, 0, wxEXPAND | wxALIGN_RIGHT, 0 );
bSizer1->Add( bSizer3, 0, wxLEFT | wxRIGHT | wxEXPAND, SIDEMARGINS );
bSizer1->AddSpacer(10);
this->SetSizer( bSizer1 );
this->Layout();
m_TaskAddProjectButton->SetLabel(m_sAddProjectString);
m_TaskAddProjectButton->Disable();
}
CSimpleProjectPanel::~CSimpleProjectPanel()
{
}
ProjectSelectionData* CSimpleProjectPanel::GetProjectSelectionData() {
int count = m_ProjectSelectionCtrl->GetCount();
if (count <= 0) {
return NULL;
}
int n = m_ProjectSelectionCtrl->GetSelection();
return (ProjectSelectionData*)m_ProjectSelectionCtrl->GetClientData(n);
}
void CSimpleProjectPanel::UpdateInterface() {
int n, count;
bool b_needMenuRebuild = false;
wxString str = wxEmptyString;
wxString projName = wxEmptyString;
CMainDocument* pDoc = wxGetApp().GetDocument();
wxASSERT(pDoc);
// Should we display the synchronize button instead of the
// attach to project button?
if ( pDoc->IsConnected() ) {
CC_STATUS status;
int is_acct_mgr_detected = 0;
pDoc->GetCoreClientStatus(status);
if (pDoc->m_iAcct_mgr_info_rpc_result == 0) {
// We use an integer rather than a bool to force action the first time
is_acct_mgr_detected = pDoc->ami.acct_mgr_url.size() ? 1 : 0;
if (m_UsingAccountManager != is_acct_mgr_detected) {
m_UsingAccountManager = is_acct_mgr_detected;
if (is_acct_mgr_detected) {
m_TaskAddProjectButton->SetLabel(m_sSynchronizeString);
m_TaskAddProjectButton->Enable();
m_TaskAddProjectButton->Show();
m_TaskAddProjectButton->SetToolTip(m_sAddProjectToolTip);
} else {
m_TaskAddProjectButton->SetLabel(m_sAddProjectString);
if (!status.disallow_attach) {
m_TaskAddProjectButton->Enable();
m_TaskAddProjectButton->Show();
m_TaskAddProjectButton->SetToolTip(m_sSynchronizeToolTip);
}
}
}
} else {
m_TaskAddProjectButton->Hide();
}
UpdateProjectList();
count = m_ProjectSelectionCtrl->GetCount();
if (count > 0) {
n = m_ProjectSelectionCtrl->GetSelection();
if ((n < 0) || (n > count -1)) {
m_ProjectSelectionCtrl->SetSelection(0);
n = 0;
}
// Check to see if we need to rebuild the menu
char* ctrl_url = ((ProjectSelectionData*)m_ProjectSelectionCtrl->GetClientData(n))->project_url;
if (strcmp(m_CurrentSelectedProjectURL, ctrl_url)) {
b_needMenuRebuild = true;
strncpy(m_CurrentSelectedProjectURL, ctrl_url, sizeof(m_CurrentSelectedProjectURL));
}
PROJECT* project = pDoc->state.lookup_project(ctrl_url);
if ( project != NULL && project->last_rpc_time > m_Project_last_rpc_time ) {
b_needMenuRebuild = true;
m_Project_last_rpc_time = project->last_rpc_time;
}
if (b_needMenuRebuild) {
m_ProjectWebSitesButton->RebuildMenu();
}
m_ProjectWebSitesButton->Enable();
str.Printf(_("%s: %0.2f"), m_sTotalWorkDoneString.c_str(), project->user_total_credit);
m_TotalCreditValue->SetLabel(str);
m_TotalCreditValue->SetName(str); // For accessibility on Windows
projName = m_ProjectSelectionCtrl->GetStringSelection();
str.Printf(_("Pop up a menu of websites for project %s"), projName.c_str());
m_ProjectWebSitesButton->SetToolTip(str);
str.Printf(_("Pop up a menu of commands to apply to project %s"), projName.c_str());
m_ProjectCommandsButton->SetToolTip(str);
} else {
m_ProjectWebSitesButton->Disable();
m_CurrentSelectedProjectURL[0] = '\0';
m_TotalCreditValue->SetLabel(wxEmptyString);
m_TotalCreditValue->SetName(wxEmptyString); // For accessibility on Windows
m_ProjectWebSitesButton->SetToolTip(wxEmptyString);
m_ProjectCommandsButton->SetToolTip(wxEmptyString);
}
}
}
void CSimpleProjectPanel::OnAddProject(wxCommandEvent& /*event*/) {
if (m_UsingAccountManager) {
OnWizardUpdate();
} else {
OnWizardAttach();
}
}
void CSimpleProjectPanel::OnWizardAttach() {
wxLogTrace(wxT("Function Start/End"), wxT("CProjectsComponent::OnWizardAttach - Function Begin"));
CMainDocument* pDoc = wxGetApp().GetDocument();
CSimpleGUIPanel* pPanel = wxDynamicCast(GetParent(), CSimpleGUIPanel);
wxASSERT(pDoc);
wxASSERT(pPanel);
wxASSERT(wxDynamicCast(pDoc, CMainDocument));
if (!pDoc->IsUserAuthorized()) return;
if (!pDoc->IsConnected()) return;
pPanel->SetDlgOpen(true);
pPanel->OnProjectsAttachToProject();
// btnAddProj->Refresh();
pPanel->SetDlgOpen(false);
wxLogTrace(wxT("Function Start/End"), wxT("CProjectsComponent::OnWizardAttach - Function End"));
}
void CSimpleProjectPanel::OnWizardUpdate() {
wxLogTrace(wxT("Function Start/End"), wxT("CProjectsComponent::OnWizardUpdate - Function Begin"));
CMainDocument* pDoc = wxGetApp().GetDocument();
CSimpleGUIPanel* pPanel = wxDynamicCast(GetParent(), CSimpleGUIPanel);
wxASSERT(pDoc);
wxASSERT(pPanel);
wxASSERT(wxDynamicCast(pDoc, CMainDocument));
if (!pDoc->IsUserAuthorized()) return;
if (!pDoc->IsConnected()) return;
pPanel->SetDlgOpen(true);
CWizardAttach* pWizard = new CWizardAttach(this);
pWizard->SyncToAccountManager();
if (pWizard)
pWizard->Destroy();
// btnSynchronize->Refresh();
pPanel->SetDlgOpen(false);
wxLogTrace(wxT("Function Start/End"), wxT("CProjectsComponent::OnWizardUpdate - Function End"));
}
#if TESTBIGICONPOPUP
void CSimpleProjectPanel::OnProjectWebSiteButton(wxCommandEvent& /*event*/) {
m_ProjectSelectionCtrl->Delete(0); /*** CAF *** FOR TESTING ONLY ***/
}
void CSimpleProjectPanel::OnProjectCommandButton(wxCommandEvent& /*event*/) {
/*** CAF *** FOR TESTING ONLY ***/
static int i = 1;
wxString s;
if (++i > 8) i = 0;
int sel = i % 3;
// m_ProjectSelectionCtrl->SetStringSelection(tempArray[sel]);
m_ProjectSelectionCtrl->SetSelection(sel);
#if 0 //TESTBIGICONPOPUP
wxRect r;
wxWindowDC dc(this);
r = m_ProjectSelectionCtrl->GetRect();
dc.DrawBitmap(bmArray[sel], r.x + 9, r.y, false);
#endif
}
#endif
void CSimpleProjectPanel::OnProjectSelection(wxCommandEvent& /*event*/) {
UpdateInterface();
// const int sel = m_ProjectSelectionCtrl->GetSelection();
#if 0 //TESTBIGICONPOPUP
wxRect r;
wxWindowDC dc(this);
r = m_ProjectSelectionCtrl->GetRect();
dc.DrawBitmap(bmArray[sel], r.x + 9, r.y - 10, false);
#endif
}
void CSimpleProjectPanel::UpdateProjectList() {
CMainDocument* pDoc = wxGetApp().GetDocument();
ProjectSelectionData* selData;
PROJECT* project;
char* ctrl_url;
int i, j;
if ( pDoc->IsConnected() ) {
int projCnt = pDoc->GetSimpleProjectCount();
int ctrlCount = m_ProjectSelectionCtrl->GetCount();
// If a new project has been added, figure out which one and then add it;
while ( projCnt > ctrlCount ) {
for(i=0; i<projCnt; i++) {
project = pDoc->state.projects[i];
bool found = false;
for(j=0; j<ctrlCount; j++) {
ctrl_url = ((ProjectSelectionData*)m_ProjectSelectionCtrl->GetClientData(j))->project_url;
if (!strcmp(project->master_url, ctrl_url)) {
found = true;
break;
}
}
if ( !found ) {
selData = new ProjectSelectionData;
strncpy(selData->project_url, project->master_url, sizeof(selData->project_url));
wxBitmap* projectBM = GetProjectSpecificBitmap(selData->project_url);
wxString projname(project->project_name.c_str(), wxConvUTF8);
m_ProjectSelectionCtrl->Append(projname, *projectBM, (void*)selData);
ctrlCount = m_ProjectSelectionCtrl->GetCount();
}
}
}
if ( projCnt < ctrlCount ) {
project = NULL;
// Check items in descending order so deletion won't change indexes of items yet to be checked
for(j=ctrlCount-1; j>=0; --j) {
char* ctrl_url = ((ProjectSelectionData*)m_ProjectSelectionCtrl->GetClientData(j))->project_url;
project = pDoc->state.lookup_project(ctrl_url);
if ( project == NULL ) {
selData = (ProjectSelectionData*)m_ProjectSelectionCtrl->GetClientData(j);
delete selData;
m_ProjectSelectionCtrl->Delete(j);
}
}
}
// Check to see if we need to reload the project icon
ctrlCount = m_ProjectSelectionCtrl->GetCount();
for(j=0; j<ctrlCount; j++) {
ctrl_url = ((ProjectSelectionData*)m_ProjectSelectionCtrl->GetClientData(j))->project_url;
project = pDoc->state.lookup_project(ctrl_url);
if ( project->project_files_downloaded_time > m_Project_files_downloaded_time ) {
wxBitmap* projectBM = GetProjectSpecificBitmap(ctrl_url);
m_Project_files_downloaded_time = project->project_files_downloaded_time;
m_ProjectSelectionCtrl->SetItemBitmap(j, *projectBM);
}
}
}
}
std::string CSimpleProjectPanel::GetProjectIconLoc(char* project_url) {
char urlDirectory[256];
CMainDocument* pDoc = wxGetApp().GetDocument();
PROJECT* project = pDoc->state.lookup_project(project_url);
url_to_project_dir(project->master_url, urlDirectory);
return (std::string)urlDirectory + "/stat_icon";
}
wxBitmap* CSimpleProjectPanel::GetProjectSpecificBitmap(char* project_url) {
char defaultIcnPath[256];
CSkinSimple* pSkinSimple = wxGetApp().GetSkinManager()->GetSimple();
wxASSERT(pSkinSimple);
// Only update if it is project specific is found
if(boinc_resolve_filename(GetProjectIconLoc(project_url).c_str(), defaultIcnPath, sizeof(defaultIcnPath)) == 0) {
wxBitmap* projectBM = new wxBitmap();
if ( projectBM->LoadFile(wxString(defaultIcnPath,wxConvUTF8), wxBITMAP_TYPE_ANY) ) {
return projectBM;
}
}
return pSkinSimple->GetProjectImage()->GetBitmap();
}

87
clientgui/sg_ProjectPanel.h Executable file
View File

@ -0,0 +1,87 @@
// This file is part of BOINC.
// http://boinc.berkeley.edu
// Copyright (C) 2008 University of California
//
// BOINC 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 3 of the License, or (at your option) any later version.
//
// BOINC 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.
//
// You should have received a copy of the GNU Lesser General Public License
// along with BOINC. If not, see <http://www.gnu.org/licenses/>.
#ifndef __sg_ProjectPanel__
#define __sg_ProjectPanel__
#include "sg_CustomControls.h"
#include "sg_PanelBase.h"
#include "sg_ProjectWebSitesPopup.h"
#include "sg_ProjectCommandPopup.h"
typedef struct {
char project_url[256];
} ProjectSelectionData;
///////////////////////////////////////////////////////////////////////////////
/// Class CSimpleProjectPanel
///////////////////////////////////////////////////////////////////////////////
#if 0
#ifdef __WXMAC__
#include "MacBitmapComboBox.h"
#else
#define CBOINCBitmapComboBox wxBitmapComboBox
#define EVT_BOINCBITMAPCOMBOBOX EVT_COMBOBOX
#endif
#endif
class CSimpleProjectPanel : public CSimplePanelBase
{
DECLARE_DYNAMIC_CLASS( CSimpleProjectPanel )
DECLARE_EVENT_TABLE()
public:
CSimpleProjectPanel();
CSimpleProjectPanel( wxWindow* parent);
~CSimpleProjectPanel();
ProjectSelectionData* GetProjectSelectionData();
void UpdateInterface();
private:
void OnProjectSelection(wxCommandEvent &event);
void OnProjectCommandButton(wxCommandEvent& /*event*/);
void OnAddProject(wxCommandEvent& /*event*/);
void OnWizardAttach();
void OnWizardUpdate();
void OnProjectWebSiteButton(wxCommandEvent& /*event*/);
void UpdateProjectList();
std::string CSimpleProjectPanel::GetProjectIconLoc(char* project_url);
wxBitmap* CSimpleProjectPanel::GetProjectSpecificBitmap(char* project_url);
protected:
CTransparentStaticText* m_myProjectsLabel;
CBOINCBitmapComboBox* m_ProjectSelectionCtrl;
wxButton* m_TaskAddProjectButton;
CTransparentStaticText* m_TotalCreditValue;
CSimpleProjectWebSitesPopupButton* m_ProjectWebSitesButton;
CSimpleProjectCommandPopupButton* m_ProjectCommandsButton;
wxString m_sAddProjectString;
wxString m_sSynchronizeString;
wxString m_sTotalWorkDoneString;
int m_UsingAccountManager;
char m_CurrentSelectedProjectURL[256];
double m_Project_files_downloaded_time;
double m_Project_last_rpc_time;
wxString m_sAddProjectToolTip;
wxString m_sSynchronizeToolTip;
};
#endif //__sg_ProjectPanel__

View File

@ -0,0 +1,115 @@
// This file is part of BOINC.
// http://boinc.berkeley.edu
// Copyright (C) 2008 University of California
//
// BOINC 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 3 of the License, or (at your option) any later version.
//
// BOINC 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.
//
// You should have received a copy of the GNU Lesser General Public License
// along with BOINC. If not, see <http://www.gnu.org/licenses/>.
#include "stdwx.h"
#include "Events.h"
#include "BOINCGUIApp.h"
#include "MainDocument.h"
#include "sg_ProjectPanel.h"
#include "sg_ProjectWebSitesPopup.h"
IMPLEMENT_DYNAMIC_CLASS(CSimpleProjectWebSitesPopupButton, wxButton)
BEGIN_EVENT_TABLE(CSimpleProjectWebSitesPopupButton, wxButton)
EVT_LEFT_DOWN(CSimpleProjectWebSitesPopupButton::OnProjectWebSiteButton)
EVT_MENU(WEBSITE_URL_MENU_ID,CSimpleProjectWebSitesPopupButton::OnMenuLinkClicked)
EVT_MENU(WEBSITE_URL_MENU_ID_REMOVE_PROJECT,CSimpleProjectWebSitesPopupButton::OnMenuLinkClicked)
END_EVENT_TABLE()
CSimpleProjectWebSitesPopupButton::CSimpleProjectWebSitesPopupButton() {
}
CSimpleProjectWebSitesPopupButton::CSimpleProjectWebSitesPopupButton(wxWindow* parent, wxWindowID id,
const wxString& label, const wxPoint& pos, const wxSize& size,
long style, const wxValidator& validator, const wxString& name) :
wxButton(parent, id, label, pos, size, style, validator, name)
{
m_ProjectWebSitesPopUpMenu = new wxMenu();
}
CSimpleProjectWebSitesPopupButton::~CSimpleProjectWebSitesPopupButton() {
delete m_ProjectWebSitesPopUpMenu;
}
void CSimpleProjectWebSitesPopupButton::AddMenuItems()
{
CMainDocument* pDoc = wxGetApp().GetDocument();
wxASSERT(pDoc);
wxASSERT(wxDynamicCast(pDoc, CMainDocument));
ProjectSelectionData* selData = ((CSimpleProjectPanel*)GetParent())->GetProjectSelectionData();
if (selData == NULL) return;
char* ctrl_url = selData->project_url;
PROJECT* project = pDoc->state.lookup_project(ctrl_url);
if (!project) return;
size_t urlCount = project->gui_urls.size();
// Add the home page link
wxMenuItem *urlItem = new wxMenuItem(m_ProjectWebSitesPopUpMenu, WEBSITE_URL_MENU_ID_HOMEPAGE,wxString(project->project_name.c_str(), wxConvUTF8));
Connect( WEBSITE_URL_MENU_ID_HOMEPAGE, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler(CSimpleProjectWebSitesPopupButton::OnMenuLinkClicked) );
m_ProjectWebSitesPopUpMenu->Append(urlItem);
// Add any GUI urls
for(unsigned int i = 0; i < urlCount; i++){
urlItem = new wxMenuItem(m_ProjectWebSitesPopUpMenu, WEBSITE_URL_MENU_ID + i, wxGetTranslation(wxString(project->gui_urls[i].name.c_str(), wxConvUTF8)));
Connect( WEBSITE_URL_MENU_ID + i, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler(CSimpleProjectWebSitesPopupButton::OnMenuLinkClicked) );
m_ProjectWebSitesPopUpMenu->Append(urlItem);
}
}
void CSimpleProjectWebSitesPopupButton::RebuildMenu() {
for(int i=(int) m_ProjectWebSitesPopUpMenu->GetMenuItemCount()-1; i>=0; --i){
wxMenuItem* item = m_ProjectWebSitesPopUpMenu->FindItemByPosition(i);
m_ProjectWebSitesPopUpMenu->Delete(item);
}
AddMenuItems();
}
void CSimpleProjectWebSitesPopupButton::OnProjectWebSiteButton(wxMouseEvent& WXUNUSED(event)) {
PopupMenu(m_ProjectWebSitesPopUpMenu);
}
void CSimpleProjectWebSitesPopupButton::OnMenuLinkClicked(wxCommandEvent& event) {
CMainDocument* pDoc = wxGetApp().GetDocument();
wxASSERT(pDoc);
int menuIDevt = event.GetId();
ProjectSelectionData* selData = ((CSimpleProjectPanel*)GetParent())->GetProjectSelectionData();
if (selData == NULL) return;
char* ctrl_url = selData->project_url;
if (menuIDevt == WEBSITE_URL_MENU_ID_HOMEPAGE ) {
wxLaunchDefaultBrowser(wxString(ctrl_url, wxConvUTF8));
} else{
int menuId = menuIDevt - WEBSITE_URL_MENU_ID;
PROJECT* project = pDoc->state.lookup_project(ctrl_url);
project->gui_urls[menuId].name.c_str();
wxLaunchDefaultBrowser(wxString(project->gui_urls[menuId].url.c_str(),wxConvUTF8));
}
}

View File

@ -0,0 +1,51 @@
// This file is part of BOINC.
// http://boinc.berkeley.edu
// Copyright (C) 2008 University of California
//
// BOINC 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 3 of the License, or (at your option) any later version.
//
// BOINC 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.
//
// You should have received a copy of the GNU Lesser General Public License
// along with BOINC. If not, see <http://www.gnu.org/licenses/>.
#ifndef __sg_ProjectWebsitesPopup__
#define __sg_ProjectWebsitesPopup__
class CSimpleProjectWebSitesPopupButton : public wxButton
{
DECLARE_DYNAMIC_CLASS( CSimpleProjectWebSitesPopupButton )
DECLARE_EVENT_TABLE()
public:
CSimpleProjectWebSitesPopupButton();
CSimpleProjectWebSitesPopupButton(wxWindow* parent, wxWindowID id,
const wxString& label = wxEmptyString,
const wxPoint& pos = wxDefaultPosition,
const wxSize& size = wxDefaultSize,
long style = 0,
const wxValidator& validator = wxDefaultValidator,
const wxString& name = wxT("ProjectWebsitesPopupMenu"));
~CSimpleProjectWebSitesPopupButton();
void RebuildMenu();
private:
void AddMenuItems();
void OnProjectWebSiteButton(wxMouseEvent& event);
void OnMenuLinkClicked(wxCommandEvent& event);
protected:
wxMenu* m_ProjectWebSitesPopUpMenu;
};
#endif // __sg_ProjectWebsitesPopup__

View File

@ -0,0 +1,269 @@
// This file is part of BOINC.
// http://boinc.berkeley.edu
// Copyright (C) 2008 University of California
//
// BOINC 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 3 of the License, or (at your option) any later version.
//
// BOINC 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.
//
// You should have received a copy of the GNU Lesser General Public License
// along with BOINC. If not, see <http://www.gnu.org/licenses/>.
#include "stdwx.h"
#include "Events.h"
#include "BOINCGUIApp.h"
#include "MainDocument.h"
#include "DlgItemProperties.h"
#include "sg_TaskPanel.h"
#include "sg_TaskCommandPopup.h"
IMPLEMENT_DYNAMIC_CLASS(CSimpleTaskPopupButton, wxButton)
BEGIN_EVENT_TABLE(CSimpleTaskPopupButton, wxButton)
EVT_LEFT_DOWN(CSimpleTaskPopupButton::OnTasksCommandButton)
EVT_MENU(ID_TASK_WORK_SHOWGRAPHICS, CSimpleTaskPopupButton::OnTaskShowGraphics)
EVT_MENU(ID_TASK_WORK_SUSPEND, CSimpleTaskPopupButton::OnTaskSuspendResume)
EVT_MENU(ID_TASK_WORK_ABORT, CSimpleTaskPopupButton::OnTaskAbort)
EVT_MENU(ID_TASK_SHOW_PROPERTIES, CSimpleTaskPopupButton::OnTaskShowProperties)
END_EVENT_TABLE()
CSimpleTaskPopupButton::CSimpleTaskPopupButton() {
}
CSimpleTaskPopupButton::CSimpleTaskPopupButton(wxWindow* parent, wxWindowID id,
const wxString& label, const wxPoint& pos, const wxSize& size,
long style, const wxValidator& validator, const wxString& name) :
wxButton(parent, id, label, pos, size, style, validator, name)
{
m_TaskSuspendedViaGUI = false;
m_TaskCommandPopUpMenu = new wxMenu();
AddMenuItems();
}
CSimpleTaskPopupButton::~CSimpleTaskPopupButton() {
delete m_TaskCommandPopUpMenu;
}
void CSimpleTaskPopupButton::AddMenuItems() {
m_ShowGraphicsMenuItem = m_TaskCommandPopUpMenu->Append(
ID_TASK_WORK_SHOWGRAPHICS,
_("Show graphics"),
_("Show application graphics in a window.")
);
m_SuspendResumeMenuItem = m_TaskCommandPopUpMenu->Append(
ID_TASK_WORK_SUSPEND,
_("Suspend"),
_("Suspend work for this result.")
);
m_AbortMenuItem = m_TaskCommandPopUpMenu->Append(
ID_TASK_WORK_ABORT,
_("Abort"),
_("Abandon work on the result. You will get no credit for it.")
);
m_ShowPropertiesMenuItem = m_TaskCommandPopUpMenu->Append(
ID_TASK_SHOW_PROPERTIES,
_("Properties"),
_("Show task details.")
);
}
void CSimpleTaskPopupButton::OnTasksCommandButton(wxMouseEvent& /*event*/) {
CMainDocument* pDoc = wxGetApp().GetDocument();
bool enableShowGraphics = true;
bool enableAbort = true;
wxASSERT(pDoc);
TaskSelectionData* selData = ((CSimpleTaskPanel*)GetParent())->GetTaskSelectionData();
if (selData == NULL) return;
RESULT* result = pDoc->state.lookup_result(selData->project_url, selData->result_name);
if (!result) return;
if (result->suspended_via_gui) {
m_TaskSuspendedViaGUI = true;
m_SuspendResumeMenuItem->SetItemLabel(_("Resume"));
m_SuspendResumeMenuItem->SetHelp(_("Resume work for this task."));
} else {
m_TaskSuspendedViaGUI = false;
m_SuspendResumeMenuItem->SetItemLabel(_("Suspend"));
m_SuspendResumeMenuItem->SetHelp(_("Suspend work for this task."));
}
// Disable Show Graphics button if any selected task can't display graphics
if (((!result->supports_graphics) || pDoc->GetState()->executing_as_daemon)
&& !strlen(result->graphics_exec_path)
) {
enableShowGraphics = false;
}
if (result->suspended_via_gui ||
result->project_suspended_via_gui ||
(result->scheduler_state != CPU_SCHED_SCHEDULED)
) {
enableShowGraphics = false;
}
m_ShowGraphicsMenuItem->Enable(enableShowGraphics);
// Disable Abort button if any selected task already aborted
if (
result->active_task_state == PROCESS_ABORT_PENDING ||
result->active_task_state == PROCESS_ABORTED ||
result->state == RESULT_ABORTED
) {
enableAbort = false;
}
m_AbortMenuItem->Enable(enableAbort);
PopupMenu(m_TaskCommandPopUpMenu);
#if TESTBIGICONPOPUP
/*** CAF *** FOR TESTING ONLY ***/
static int i;
wxString s;
if (i > 9) i = 0;
if ( i < 5) {
s = (wxT("This is a very very very and extremely long label."));
} else {
s = (wxT("short."));
}
switch (i++) {
case 0:
case 5:
UpdateStaticText(&m_TaskProjectName, s);
break;
case 1:
case 6:
UpdateStaticText(&m_TaskApplicationName, s);
break;
case 2:
case 7:
UpdateStaticText(&m_ElapsedTimeValue, s);
break;
case 3:
case 8:
UpdateStaticText(&m_TimeRemainingValue, s);
break;
case 4:
case 9:
UpdateStaticText(&m_StatusValueText, s);
break;
}
m_ProgressBar->SetValue( i * 10 );
int sel = i % 3;
// m_TaskSelectionCtrl->SetStringSelection(tempArray[sel]);
m_TaskSelectionCtrl->SetSelection(sel);
#endif
}
void CSimpleTaskPopupButton::OnTaskShowGraphics(wxCommandEvent& WXUNUSED(event)) {
CMainDocument* pDoc = wxGetApp().GetDocument();
wxASSERT(pDoc);
wxASSERT(wxDynamicCast(pDoc, CMainDocument));
TaskSelectionData* selData = ((CSimpleTaskPanel*)GetParent())->GetTaskSelectionData();
if (selData == NULL) return;
RESULT* result = pDoc->state.lookup_result(selData->project_url, selData->result_name);
if (result) {
pDoc->WorkShowGraphics(result);
}
}
void CSimpleTaskPopupButton::OnTaskSuspendResume(wxCommandEvent& WXUNUSED(event)) {
CMainDocument* pDoc = wxGetApp().GetDocument();
wxASSERT(pDoc);
wxASSERT(wxDynamicCast(pDoc, CMainDocument));
TaskSelectionData* selData = ((CSimpleTaskPanel*)GetParent())->GetTaskSelectionData();
if (selData == NULL) return;
if (m_TaskSuspendedViaGUI) {
pDoc->WorkResume(selData->project_url, selData->result_name);
} else {
pDoc->WorkSuspend(selData->project_url, selData->result_name);
}
}
void CSimpleTaskPopupButton::OnTaskAbort(wxCommandEvent& WXUNUSED(event)) {
wxInt32 iAnswer = 0;
wxString strMessage = wxEmptyString;
CMainDocument* pDoc = wxGetApp().GetDocument();
wxASSERT(pDoc);
wxASSERT(wxDynamicCast(pDoc, CMainDocument));
if (!pDoc->IsUserAuthorized()) // Probably no longer relevant
return;
TaskSelectionData* selData = ((CSimpleTaskPanel*)GetParent())->GetTaskSelectionData();
if (selData == NULL) return;
RESULT* result = pDoc->state.lookup_result(selData->project_url, selData->result_name);
if (result) {
#if SELECTBYRESULTNAME
wxString name = wxString(selData->result_name, wxConvUTF8, strlen(selData->result_name));
#else
wxString name = ((CSimpleTaskPanel*)GetParent())->GetSelectedTaskString();
#endif
strMessage.Printf(
_("Are you sure you want to abort this task '%s'?\n(Progress: %.1lf%%, Status: %s)"),
name.c_str(), result->fraction_done * 100.0, result_description(result, false).c_str());
iAnswer = wxGetApp().SafeMessageBox(
strMessage,
_("Abort task"),
wxYES_NO | wxICON_QUESTION,
this
);
if (wxYES != iAnswer) {
return;
}
pDoc->WorkAbort(result->project_url, result->name);
}
}
void CSimpleTaskPopupButton::OnTaskShowProperties(wxCommandEvent& WXUNUSED(event)) {
CMainDocument* pDoc = wxGetApp().GetDocument();
wxASSERT(pDoc);
wxASSERT(wxDynamicCast(pDoc, CMainDocument));
TaskSelectionData* selData = ((CSimpleTaskPanel*)GetParent())->GetTaskSelectionData();
if (selData == NULL) return;
RESULT* result = pDoc->state.lookup_result(selData->project_url, selData->result_name);
if (result) {
CDlgItemProperties dlg(this);
dlg.renderInfos(result);
dlg.ShowModal();
}
}

View File

@ -0,0 +1,57 @@
// This file is part of BOINC.
// http://boinc.berkeley.edu
// Copyright (C) 2008 University of California
//
// BOINC 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 3 of the License, or (at your option) any later version.
//
// BOINC 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.
//
// You should have received a copy of the GNU Lesser General Public License
// along with BOINC. If not, see <http://www.gnu.org/licenses/>.
#ifndef __sg_TaskCommandPopup__
#define __sg_TaskCommandPopup__
class CSimpleTaskPopupButton : public wxButton
{
DECLARE_DYNAMIC_CLASS( CSimpleTaskPopupButton )
DECLARE_EVENT_TABLE()
public:
CSimpleTaskPopupButton();
CSimpleTaskPopupButton(wxWindow* parent, wxWindowID id,
const wxString& label = wxEmptyString,
const wxPoint& pos = wxDefaultPosition,
const wxSize& size = wxDefaultSize,
long style = 0,
const wxValidator& validator = wxDefaultValidator,
const wxString& name = wxT("TaskCommandsPopupMenu"));
~CSimpleTaskPopupButton();
private:
void AddMenuItems();
void OnTasksCommandButton(wxMouseEvent& event);
void OnTaskShowGraphics(wxCommandEvent& event);
void OnTaskSuspendResume(wxCommandEvent& event);
void OnTaskAbort(wxCommandEvent& event);
void OnTaskShowProperties(wxCommandEvent& event);
protected:
wxMenu* m_TaskCommandPopUpMenu;
wxMenuItem* m_ShowGraphicsMenuItem;
wxMenuItem* m_SuspendResumeMenuItem;
wxMenuItem* m_AbortMenuItem;
wxMenuItem* m_ShowPropertiesMenuItem;
bool m_TaskSuspendedViaGUI;
};
#endif // __sg_TaskCommandPopup__

933
clientgui/sg_TaskPanel.cpp Executable file
View File

@ -0,0 +1,933 @@
// This file is part of BOINC.
// http://boinc.berkeley.edu
// Copyright (C) 2008 University of California
//
// BOINC 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 3 of the License, or (at your option) any later version.
//
// BOINC 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.
//
// You should have received a copy of the GNU Lesser General Public License
// along with BOINC. If not, see <http://www.gnu.org/licenses/>.
#define TESTBIGICONPOPUP 0
#include "stdwx.h"
#include "miofile.h"
#include "Events.h"
#include "BOINCGUIApp.h"
#include "SkinManager.h"
#include "MainDocument.h"
#include "sg_TaskCommandPopup.h"
#include "sg_TaskPanel.h"
#include "boinc_api.h"
#include "filesys.h"
#include "res/GreenDot16.xpm"
#include "res/YellowDot16.xpm"
#include "res/RedDot16.xpm"
enum { redDot, yellowDot, greenDot };
IMPLEMENT_DYNAMIC_CLASS(CSlideShowPanel, wxPanel)
BEGIN_EVENT_TABLE(CSlideShowPanel, wxPanel)
// EVT_ERASE_BACKGROUND(CSlideShowPanel::OnEraseBackground)
EVT_TIMER(ID_CHANGE_SLIDE_TIMER, CSlideShowPanel::OnSlideShowTimer)
EVT_PAINT(CSlideShowPanel::OnPaint)
END_EVENT_TABLE()
#define SLIDESHOWBORDER 3
CSlideShowPanel::CSlideShowPanel() {
}
CSlideShowPanel::CSlideShowPanel( wxWindow* parent ) :
wxPanel( parent, wxID_ANY, wxDefaultPosition, wxSize(290+(2*SLIDESHOWBORDER), 126+(2*SLIDESHOWBORDER)), wxSTATIC_BORDER )
{
SetBackgroundColour(*wxBLACK);
m_ChangeSlideTimer = new wxTimer(this, ID_CHANGE_SLIDE_TIMER);
m_ChangeSlideTimer->Start(10000);
m_SlideBitmap = wxNullBitmap;
m_bCurrentSlideIsDefault = false;
#ifdef __WXMAC__
// Tell accessibility aids to ignore this panel (but not its contents)
HIObjectSetAccessibilityIgnored((HIObjectRef)GetHandle(), true);
#endif
}
CSlideShowPanel::~CSlideShowPanel()
{
if ( m_ChangeSlideTimer->IsRunning() ) {
m_ChangeSlideTimer->Stop();
}
delete m_ChangeSlideTimer;
}
void CSlideShowPanel::OnSlideShowTimer(wxTimerEvent& WXUNUSED(event)) {
AdvanceSlideShow(true);
}
void CSlideShowPanel::AdvanceSlideShow(bool changeSlide) {
char fileName[1024], resolvedFileName[1024];
double xRatio, yRatio, ratio;
TaskSelectionData* selData = ((CSimpleTaskPanel*)GetParent())->GetTaskSelectionData();
if (selData == NULL) return;
if ((selData->numSlides <= 0) && m_bCurrentSlideIsDefault) return;
if (selData->numSlides <= 0) {
CSkinSimple* pSkinSimple = wxGetApp().GetSkinManager()->GetSimple();
wxASSERT(pSkinSimple);
wxASSERT(wxDynamicCast(pSkinSimple, CSkinSimple));
m_SlideBitmap = *pSkinSimple->GetWorkunitAnimationImage()->GetBitmap();
if (m_SlideBitmap.Ok()) {
m_bCurrentSlideIsDefault = true;
}
} else {
// TODO: Should we allow slide show to advance if task is not running?
if (selData->dotColor == greenDot) { // Advance only if running
if (changeSlide) {
if (++(selData->lastSlideShown) >= selData->numSlides) {
selData->lastSlideShown = 0;
}
}
}
if (selData->lastSlideShown < 0) {
selData->lastSlideShown = 0;
}
sprintf(fileName, "%s%02d", selData->slide_show_filename_prefix, selData->lastSlideShown);
if (boinc_resolve_filename(fileName, resolvedFileName, sizeof(resolvedFileName)) == 0) {
wxBitmap *bm = new wxBitmap();
bm->LoadFile(wxString(resolvedFileName,wxConvUTF8), wxBITMAP_TYPE_ANY);
m_SlideBitmap = *bm;
delete bm;
}
if (m_SlideBitmap.Ok()) {
m_bCurrentSlideIsDefault = false;
}
}
if (m_SlideBitmap.Ok()) {
// Check to see if they need to be rescaled to fit in the window
ratio = 1.0;
xRatio = ((double) GetSize().GetWidth() - (2*SLIDESHOWBORDER))/((double) m_SlideBitmap.GetWidth());
yRatio = ((double) GetSize().GetHeight() - (2*SLIDESHOWBORDER))/((double) m_SlideBitmap.GetHeight());
if ( xRatio < ratio ) {
ratio = xRatio;
}
if ( yRatio < ratio ) {
ratio = yRatio;
}
if ( ratio < 1.0 ) {
wxImage img = m_SlideBitmap.ConvertToImage();
img.Rescale((int) (m_SlideBitmap.GetWidth()*ratio), (int) (m_SlideBitmap.GetHeight()*ratio));
wxBitmap *bm = new wxBitmap(img);
m_SlideBitmap = *bm;
delete bm;
}
Refresh();
}
}
void CSlideShowPanel::OnPaint(wxPaintEvent& WXUNUSED(event))
{
wxPaintDC dc(this);
int w, h;
wxPen oldPen = dc.GetPen();
wxBrush oldBrush = dc.GetBrush();
int oldMode = dc.GetBackgroundMode();
wxPen bgPen(*wxBLUE, 3);
dc.SetBackgroundMode(wxSOLID);
dc.SetPen(bgPen);
dc.SetBrush(*wxBLACK_BRUSH);
GetSize(&w, &h);
dc.DrawRectangle(0, 0, w, h);
// Restore Mode, Pen and Brush
dc.SetBackgroundMode(oldMode);
dc.SetPen(oldPen);
dc.SetBrush(oldBrush);
if(m_SlideBitmap.Ok())
{
dc.DrawBitmap(m_SlideBitmap,
(w - m_SlideBitmap.GetWidth())/2,
(h - m_SlideBitmap.GetHeight())/2
);
}
}
IMPLEMENT_DYNAMIC_CLASS(CSimpleTaskPanel, CSimplePanelBase)
BEGIN_EVENT_TABLE(CSimpleTaskPanel, CSimplePanelBase)
EVT_BOINCBITMAPCOMBOBOX(ID_SGTASKSELECTOR, CSimpleTaskPanel::OnTaskSelection)
// EVT_BUTTON(ID_TASKSCOMMANDBUTTON, CSimpleTaskPanel::OnTasksCommand)
// EVT_LEFT_DOWN(CSimpleTaskPanel::OnTasksCommand)
EVT_TIMER(ID_SIMPLE_PROGRESSPULSETIMER, CSimpleTaskPanel::OnPulseProgressIndicator)
END_EVENT_TABLE()
#if TESTBIGICONPOPUP
static wxString tempArray[] = {_T("String1"), _T("String2"), _T("String3") };
#endif
CSimpleTaskPanel::CSimpleTaskPanel() {
}
CSimpleTaskPanel::CSimpleTaskPanel( wxWindow* parent ) :
CSimplePanelBase( parent )
{
wxSize sz;
int w, h;
wxString str = wxEmptyString;
m_pulseTimer = new wxTimer(this, ID_SIMPLE_PROGRESSPULSETIMER);
m_oldWorkCount = -1;
error_time = 0;
m_GreenDot = wxBitmap((const char**)GreenDot16_xpm);
m_YellowDot = wxBitmap((const char**)YellowDot16_xpm);
m_RedDot = wxBitmap((const char**)RedDot16_xpm);
m_GotBGBitMap = false; // Can't be made until parent has been laid out.
m_bStableTaskInfoChanged = false;
m_CurrentTaskSelection = -1;
m_sNoProjectsString = _("You don't have any projects. Please Add a Project.");
m_sNotAvailableString = _("Not available");
SetFont(wxFont(SMALL_FONT,wxSWISS,wxNORMAL,wxNORMAL,false,wxT("Arial")));
wxBoxSizer* bSizer1;
bSizer1 = new wxBoxSizer( wxVERTICAL );
wxBoxSizer* bSizer2;
bSizer2 = new wxBoxSizer( wxHORIZONTAL );
m_myTasksLabel = new CTransparentStaticText( this, wxID_ANY, _("My Tasks:"), wxDefaultPosition, wxDefaultSize, 0 );
m_myTasksLabel->Wrap( -1 );
// m_myTasksLabel->SetFont(wxFont(MEDIUM_FONT,wxSWISS,wxNORMAL,wxBOLD,false,wxT("Arial")));
m_myTasksLabel->Enable( false );
bSizer2->Add( m_myTasksLabel, 0, wxRIGHT, 5 );
#if TESTBIGICONPOPUP
m_TaskSelectionCtrl = new CBOINCBitmapComboBox( this, ID_SGTASKSELECTOR, wxT(""), wxDefaultPosition, wxDefaultSize, 3, tempArray, wxCB_READONLY );
m_TaskSelectionCtrl->SetItemBitmap(0, m_RedDot);
m_TaskSelectionCtrl->SetItemBitmap(1, m_GreenDot);
m_TaskSelectionCtrl->SetItemBitmap(2, m_YellowDot);
// m_TaskSelectionCtrl->SetStringSelection(tempArray[1]);
m_TaskSelectionCtrl->SetSelection(1);
#else
m_TaskSelectionCtrl = new CBOINCBitmapComboBox( this, ID_SGTASKSELECTOR, wxT(""), wxDefaultPosition, wxDefaultSize, 0, NULL, wxCB_READONLY );
#endif
// TODO: Might want better wording for Task Selection Combo Box tooltip
str = _("Select a task to access");
m_TaskSelectionCtrl->SetToolTip(str);
bSizer2->Add( m_TaskSelectionCtrl, 1, wxRIGHT | wxEXPAND, SIDEMARGINS );
bSizer1->Add( bSizer2, 0, wxEXPAND | wxTOP | wxLEFT, 10 );
bSizer1->AddSpacer(5);
wxBoxSizer* bSizer3;
bSizer3 = new wxBoxSizer( wxHORIZONTAL );
m_TaskProjectLabel = new CTransparentStaticText( this, wxID_ANY, _("From Project:"), wxDefaultPosition, wxDefaultSize, 0 );
m_TaskProjectLabel->Wrap( -1 );
m_TaskProjectLabel->Enable( false );
bSizer3->Add( m_TaskProjectLabel, 0, wxRIGHT, 5 );
m_TaskProjectName = new CTransparentStaticText( this, wxID_ANY, wxT("SETI@home"), wxDefaultPosition, wxDefaultSize, wxST_NO_AUTORESIZE );
m_TaskProjectName->Wrap( -1 );
m_TaskProjectName->SetFont(wxFont(LARGE_FONT,wxSWISS,wxNORMAL,wxNORMAL,false,wxT("Arial")));
m_TaskProjectName->Enable( false );
bSizer3->Add( m_TaskProjectName, 1, 0, 0 );
bSizer1->Add( bSizer3, 0, wxLEFT | wxRIGHT | wxEXPAND, SIDEMARGINS );
#if SELECTBYRESULTNAME
m_TaskApplicationName = new CTransparentStaticText( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxST_NO_AUTORESIZE );
m_TaskApplicationName->Wrap( -1 );
m_TaskApplicationName->Enable( false );
bSizer1->Add( m_TaskApplicationName, 0, wxLEFT | wxRIGHT | wxEXPAND, SIDEMARGINS );
#endif
bSizer1->AddSpacer(10);
m_SlideShowArea = new CSlideShowPanel(this);
m_SlideShowArea->SetMinSize(wxSize(290+(2*SLIDESHOWBORDER), 126+(2*SLIDESHOWBORDER)));
m_SlideShowArea->Enable( false );
bSizer1->Add( m_SlideShowArea, 0, wxLEFT | wxRIGHT | wxEXPAND, SIDEMARGINS );
bSizer1->AddSpacer(10);
m_ElapsedTimeValue = new CTransparentStaticText( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxST_NO_AUTORESIZE );
m_ElapsedTimeValue->Wrap( -1 );
m_ElapsedTimeValue->Enable( false );
bSizer1->Add( m_ElapsedTimeValue, 0, wxLEFT | wxRIGHT | wxEXPAND, SIDEMARGINS );
bSizer1->AddSpacer(7);
m_TimeRemainingValue = new CTransparentStaticText( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxST_NO_AUTORESIZE );
m_TimeRemainingValue->Wrap( -1 );
m_TimeRemainingValue->Enable( false );
bSizer1->Add( m_TimeRemainingValue, 0, wxLEFT | wxRIGHT | wxEXPAND, SIDEMARGINS );
bSizer1->AddSpacer(7);
wxBoxSizer* bSizer4;
bSizer4 = new wxBoxSizer( wxHORIZONTAL );
// TODO: Standard Mac progress indicator's animation uses lots of CPU
// time, and also triggers unnecessary Erase events. Should we use a
// non-standard progress indicator on Mac? See also workarounds in
// CSimplePanelBase::OnEraseBackground(), CSimpleGUIPanel::OnEraseBackground().
m_ProgressBar = new wxGauge( this, wxID_ANY, 100, wxDefaultPosition, wxDefaultSize, wxGA_HORIZONTAL );
m_ProgressBar->SetValue( 50 );
GetTextExtent(wxT("0"), &w, &h);
m_ProgressBar->SetMinSize(wxSize(245, h));
m_ProgressBar->SetToolTip(_("This task's progress"));
bSizer4->Add( m_ProgressBar, 0, wxRIGHT, 5 );
m_ProgressValueText = new CTransparentStaticText( this, wxID_ANY, wxT("100.0%"), wxDefaultPosition, wxDefaultSize, wxALIGN_RIGHT | wxST_NO_AUTORESIZE );
m_ProgressValueText->Wrap( -1 );
m_ProgressValueText->Enable( false );
bSizer4->Add( m_ProgressValueText, 0, wxALIGN_RIGHT, 0 );
bSizer1->Add( bSizer4, 0, wxLEFT | wxRIGHT | wxEXPAND, SIDEMARGINS );
bSizer1->AddSpacer(7);
// TODO: Can we determine the longest status string and initialize with it?
m_StatusValueText = new CTransparentStaticText( this, wxID_ANY, m_sNoProjectsString, wxDefaultPosition, wxDefaultSize, wxST_NO_AUTORESIZE );
// m_StatusValueText = new CTransparentStaticText( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxST_NO_AUTORESIZE );
m_StatusValueText->Wrap( -1 );
m_StatusValueText->Enable( false );
bSizer1->Add( m_StatusValueText, 0, wxLEFT | wxRIGHT | wxEXPAND, SIDEMARGINS );
bSizer1->AddSpacer(7);
m_TaskCommandsButton = new CSimpleTaskPopupButton( this, ID_TASKSCOMMANDBUTTON, _("Task Commands"), wxDefaultPosition, wxDefaultSize, 0 );
m_TaskCommandsButton->SetToolTip(_("Pop up a menu of commands to apply to this task"));
bSizer1->Add( m_TaskCommandsButton, 0, wxLEFT | wxRIGHT | wxEXPAND | wxALIGN_CENTER_HORIZONTAL, SIDEMARGINS );
bSizer1->AddSpacer(10);
this->SetSizer( bSizer1 );
this->Layout();
m_ProgressRect = m_ProgressBar->GetRect();
m_ProgressRect.Inflate(1, 0);
}
CSimpleTaskPanel::~CSimpleTaskPanel()
{
TaskSelectionData *selData;
int count = m_TaskSelectionCtrl->GetCount();
for(int j = count-1; j >=0; --j) {
selData = (TaskSelectionData*)m_TaskSelectionCtrl->GetClientData(j);
delete selData;
m_TaskSelectionCtrl->SetClientData(j, NULL);
}
m_TaskSelectionCtrl->Clear();
m_pulseTimer->Stop();
delete m_pulseTimer;
}
void CSimpleTaskPanel::OnTaskSelection(wxCommandEvent& /*event*/)
{
int sel = m_TaskSelectionCtrl->GetSelection();
if (sel != m_CurrentTaskSelection) {
m_CurrentTaskSelection = sel;
m_bStableTaskInfoChanged = true;
Update();
}
}
void CSimpleTaskPanel::Update() {
wxString s = wxEmptyString;
wxString projName = wxEmptyString;
TaskSelectionData *selData;
CMainDocument* pDoc = wxGetApp().GetDocument();
wxASSERT(pDoc);
int workCount = pDoc->GetSimpleGUIWorkCount();
#ifndef __WXMAC__
Freeze();
#endif
if (workCount <= 0) {
if (workCount != m_oldWorkCount) {
m_myTasksLabel->Hide();
m_TaskSelectionCtrl->Hide();
m_TaskProjectLabel->Hide();
m_TaskProjectName->Hide();
#if SELECTBYRESULTNAME
m_TaskApplicationName->Hide();
#endif
m_SlideShowArea->Hide();
m_ElapsedTimeValue->Hide();
m_TimeRemainingValue->Hide();
m_ProgressValueText->Hide();
m_TaskCommandsButton->Hide();
m_ProgressBar->Pulse();
m_pulseTimer->Start(100);
}
DisplayIdleState();
} else {
if (m_oldWorkCount == 0) {
m_myTasksLabel->Show();
m_TaskSelectionCtrl->Show();
m_TaskProjectLabel->Show();
m_TaskProjectName->Show();
#if SELECTBYRESULTNAME
m_TaskApplicationName->Show();
#endif
m_SlideShowArea->Show();
m_ElapsedTimeValue->Show();
m_TimeRemainingValue->Show();
m_ProgressValueText->Show();
m_TaskCommandsButton->Show();
}
UpdateTaskSelectionList();
// We now have valid result pointers, so extract our data
int count = m_TaskSelectionCtrl->GetCount();
if (count <= 0) {
m_CurrentTaskSelection = -1;
} else {
if ((m_CurrentTaskSelection < 0) || (m_CurrentTaskSelection > count -1)) {
m_TaskSelectionCtrl->SetSelection(0);
m_CurrentTaskSelection = 0;
m_bStableTaskInfoChanged = true;
}
selData = (TaskSelectionData*)m_TaskSelectionCtrl->GetClientData(m_CurrentTaskSelection);
RESULT* result = selData->result;
if (result) {
if (m_bStableTaskInfoChanged) {
#if SELECTBYRESULTNAME
wxString str = wxEmptyString;
GetApplicationAndProjectNames(result, &s, &projName);
str.Printf(_("Application: %s"), s.c_str());
UpdateStaticText(&m_TaskApplicationName, str);
UpdateStaticText(&m_TaskProjectName, projName);
#else
GetApplicationAndProjectNames(result, NULL, &projName);
#endif
UpdateStaticText(&m_TaskProjectName, projName);
m_SlideShowArea->AdvanceSlideShow(false);
m_bStableTaskInfoChanged = false;
}
float f = result->elapsed_time;
if (f == 0.) f = result->current_cpu_time;
// f = result->final_elapsed_time;
UpdateStaticText(&m_ElapsedTimeValue, GetElapsedTimeString(f));
UpdateStaticText(&m_TimeRemainingValue, GetTimeRemainingString(result->estimated_cpu_time_remaining));
float percNum = result->fraction_done * 100.0;
m_ProgressBar->SetValue(percNum);
m_pulseTimer->Stop();
s.Printf(_("%.1lf%%"), percNum);
UpdateStaticText(&m_ProgressValueText, s);
UpdateStaticText(&m_StatusValueText, GetStatusString(result));
} else {
UpdateStaticText(&m_TaskProjectName, m_sNotAvailableString);
#if SELECTBYRESULTNAME
UpdateStaticText(&m_TaskApplicationName, _("Application: Not available") );
#endif
UpdateStaticText(&m_ElapsedTimeValue, GetElapsedTimeString(-1.0));
UpdateStaticText(&m_TimeRemainingValue, GetTimeRemainingString(-1.0));
m_ProgressBar->Pulse();
m_pulseTimer->Start(100);
UpdateStaticText(&m_ProgressValueText, wxEmptyString);
UpdateStaticText(&m_StatusValueText, GetStatusString(NULL));
}
}
}
m_oldWorkCount = workCount;
#ifndef __WXMAC__
Thaw();
#endif
}
void CSimpleTaskPanel::ReskinInterface() {
CSimplePanelBase::ReskinInterface();
m_SlideShowArea->AdvanceSlideShow(false);
}
void CSimpleTaskPanel::OnPulseProgressIndicator(wxTimerEvent& /*event*/) {
m_ProgressBar->Pulse();
}
TaskSelectionData* CSimpleTaskPanel::GetTaskSelectionData() {
int count = m_TaskSelectionCtrl->GetCount();
if (count <= 0) {
return NULL;
}
int n = m_TaskSelectionCtrl->GetSelection();
return (TaskSelectionData*)m_TaskSelectionCtrl->GetClientData(n);
}
// Either appName argument or projName argument may be NULL
void CSimpleTaskPanel::GetApplicationAndProjectNames(RESULT* result, wxString* appName, wxString* projName) {
CMainDocument* pDoc = wxGetApp().GetDocument();
RESULT* state_result = NULL;
wxString strAppBuffer = wxEmptyString;
wxString strClassBuffer = wxEmptyString;
wxASSERT(pDoc);
wxASSERT(wxDynamicCast(pDoc, CMainDocument));
state_result = pDoc->state.lookup_result(result->project_url, result->name);
if (!state_result) {
pDoc->ForceCacheUpdate();
state_result = pDoc->state.lookup_result(result->project_url, result->name);
}
if (!state_result) return;
if (appName != NULL) {
WORKUNIT* wup = state_result->wup;
if (!wup) return;
APP* app = wup->app;
if (!app) return;
APP_VERSION* avp = state_result->avp;
if (!avp) return;
if (strlen(app->user_friendly_name)) {
strAppBuffer = wxString(state_result->app->user_friendly_name, wxConvUTF8);
} else {
strAppBuffer = wxString(state_result->avp->app_name, wxConvUTF8);
}
if (strlen(avp->plan_class)) {
strClassBuffer.Printf(
wxT(" (%s)"),
wxString(avp->plan_class, wxConvUTF8).c_str()
);
}
#if SELECTBYRESULTNAME
appName->Printf(
wxT("%d: %s%s %d.%02d %s"),
state_result->slot,
state_result->project->anonymous_platform?_("Local: "):wxT(""),
strAppBuffer.c_str(),
state_result->avp->version_num / 100,
state_result->avp->version_num % 100,
strClassBuffer.c_str()
);
#else
appName->Printf(wxT("%s%s %d.%02d %s (in slot %d)"),
state_result->project->anonymous_platform?_("Local: "):wxT(""),
strAppBuffer.c_str(),
state_result->avp->version_num / 100,
state_result->avp->version_num % 100,
strClassBuffer.c_str(),
state_result->slot
);
#endif
}
if (projName != NULL) {
*projName = wxString(state_result->project->project_name.c_str(), wxConvUTF8 );
if (projName->IsEmpty()) {
*projName = _("Not Available");
}
}
}
wxString CSimpleTaskPanel::GetElapsedTimeString(double f) {
wxString s = wxEmptyString;
wxString str = wxEmptyString;
if (f < 0) {
s = m_sNotAvailableString;
} else {
s = FormatTime(f);
}
str.Printf(_("Elapsed Time: %s"), s.c_str());
return str;
}
wxString CSimpleTaskPanel::GetTimeRemainingString(double f) {
wxString s = wxEmptyString;
wxString str = wxEmptyString;
if (f < 0) {
s = m_sNotAvailableString;
} else {
s = FormatTime(f);
}
str.Printf(_("Time Remaining: %s"), s.c_str());
return str;
}
wxString CSimpleTaskPanel::GetStatusString(RESULT* result) {
wxString s = wxEmptyString;
wxString str = wxEmptyString;
if (result == NULL) {
s = m_sNotAvailableString;
} else {
s = result_description(result, false);
}
str.Printf(_("Status: %s"), s.c_str());
return str;
}
wxString CSimpleTaskPanel::FormatTime(float fBuffer) {
wxInt32 iHour = 0;
wxInt32 iMin = 0;
wxInt32 iSec = 0;
wxTimeSpan ts;
wxString strBuffer= wxEmptyString;
if (0 >= fBuffer) {
strBuffer = wxT("---");
} else {
iHour = (wxInt32)(fBuffer / (60 * 60));
iMin = (wxInt32)(fBuffer / 60) % 60;
iSec = (wxInt32)(fBuffer) % 60;
ts = wxTimeSpan(iHour, iMin, iSec);
strBuffer = ts.Format();
}
return strBuffer;
}
void CSimpleTaskPanel::UpdateTaskSelectionList() {
int i, j, count, numSlides, newColor;
TaskSelectionData *selData;
RESULT* result;
RESULT* ctrlResult;
RESULT* state_result;
std::vector<bool>is_alive;
char urlDirectory[1024];
char fileName[1024];
char resolvedFileName[1024];
CMainDocument* pDoc = wxGetApp().GetDocument();
wxASSERT(pDoc);
count = m_TaskSelectionCtrl->GetCount();
// Mark all inactive (this lets us loop only once)
for (i=0; i<count; ++i) {
is_alive.push_back(false);
}
// First update existing entries and add new ones
for(int i = 0; i < (int) pDoc->results.results.size(); i++) {
bool found = false;
result = pDoc->result(i);
// only check tasks that are active
if ( result == NULL || !result->active_task ) {
continue;
}
// loop through the items already in Task Selection Control to find this result
for(j = 0; j < count; ++j) {
selData = (TaskSelectionData*)m_TaskSelectionCtrl->GetClientData(j);
if (!strcmp(result->name, selData->result_name) &&
!strcmp(result->project_url, selData->project_url)
) {
selData->result = result;
found = true;
is_alive.at(j) = true;
break; // skip out of this loop
}
}
// if it isn't currently one of the tabs then we have a new one! lets add it
if ( !found ) {
#if SELECTBYRESULTNAME
wxString resname(result->name, wxConvUTF8);
#else
wxString resname = wxEmptyString;
GetApplicationAndProjectNames(result, &resname, NULL);
#endif
selData = new TaskSelectionData;
selData->result = result;
strncpy(selData->result_name, result->name, sizeof(selData->result_name));
strncpy(selData->project_url, result->project_url, sizeof(selData->project_url));
selData->dotColor = -1;
selData->slide_show_filename_prefix[0] = '\0';
numSlides = 0;
state_result = pDoc->state.lookup_result(result->project_url, result->name);
if (!state_result) {
pDoc->ForceCacheUpdate();
state_result = pDoc->state.lookup_result(result->project_url, result->name);
}
if (state_result) {
url_to_project_dir(state_result->project->master_url, urlDirectory);
for(j=0; j<99; ++j) {
sprintf(fileName, "%s/slideshow_%s_%02d", urlDirectory, state_result->app->name, j);
if(boinc_resolve_filename(fileName, resolvedFileName, sizeof(resolvedFileName)) == 0) {
if (boinc_file_exists(resolvedFileName)) {
numSlides = j+1;
} else {
break;
}
}
}
if (numSlides > 0) {
sprintf(selData->slide_show_filename_prefix, "%s/slideshow_%s_", urlDirectory, state_result->app->name);
} else {
for(j=0; j<99; ++j) {
sprintf(fileName, "%s/slideshow_%02d", urlDirectory, j);
if(boinc_resolve_filename(fileName, resolvedFileName, sizeof(resolvedFileName)) == 0) {
if (boinc_file_exists(resolvedFileName)) {
numSlides = j+1;
} else {
break;
}
}
}
if (numSlides > 0) {
sprintf(selData->slide_show_filename_prefix, "%s/slideshow_", urlDirectory);
}
}
}
selData->numSlides = numSlides;
selData->lastSlideShown = -1;
m_TaskSelectionCtrl->Append(resname, wxNullBitmap, (void*)selData);
}
}
// Check items in descending order so deletion won't change indexes of items yet to be checked
for(j = count-1; j >=0; --j) {
if(! is_alive.at(j)) {
selData = (TaskSelectionData*)m_TaskSelectionCtrl->GetClientData(j);
delete selData;
m_TaskSelectionCtrl->Delete(j);
if (j == m_CurrentTaskSelection) {
m_bStableTaskInfoChanged = true;
}
}
}
count = m_TaskSelectionCtrl->GetCount();
for(j = 0; j < count; ++j) {
selData = (TaskSelectionData*)m_TaskSelectionCtrl->GetClientData(j);
ctrlResult = selData->result;
if (Suspended() || (ctrlResult->suspended_via_gui)) {
newColor = redDot;
} else if (isRunning(ctrlResult)) {
newColor = greenDot;
} else if (ctrlResult->scheduler_state == CPU_SCHED_PREEMPTED) {
newColor = yellowDot;
} else {
newColor = redDot;
}
if (newColor != selData->dotColor) {
switch (newColor) {
case greenDot:
m_TaskSelectionCtrl->SetItemBitmap(j, m_GreenDot);
break;
case yellowDot:
m_TaskSelectionCtrl->SetItemBitmap(j, m_YellowDot);
break;
case redDot:
m_TaskSelectionCtrl->SetItemBitmap(j, m_RedDot);
break;
}
selData->dotColor = newColor;
m_TaskSelectionCtrl->Refresh();
}
}
}
bool CSimpleTaskPanel::isRunning(RESULT* result) {
bool outcome = false;
// It must be scheduled to be running
if ( result->scheduler_state == CPU_SCHED_SCHEDULED ) {
// If either the project or task have been suspended, then it cannot be running
if ( !result->suspended_via_gui && !result->project_suspended_via_gui ) {
CC_STATUS status;
CMainDocument* pDoc = wxGetApp().GetDocument();
wxASSERT(pDoc);
pDoc->GetCoreClientStatus(status);
// Make sure that the core client isn't global suspended for some reason
if ( status.task_suspend_reason == 0 || status.task_suspend_reason == SUSPEND_REASON_CPU_THROTTLE ) {
outcome = true;
}
}
}
return outcome;
}
bool CSimpleTaskPanel::DownloadingResults() {
bool return_value = false;
CMainDocument* pDoc = wxGetApp().GetDocument();
wxASSERT(pDoc);
if ( pDoc->results.results.size() > 0 ) {
RESULT* result;
for(unsigned int i=0; !return_value && i < pDoc->results.results.size(); i++ ) {
result = pDoc->result(i);
if ( result != NULL && result->state == RESULT_FILES_DOWNLOADING ) {
return_value = true;
}
}
}
return return_value;
}
bool CSimpleTaskPanel::Suspended() {
CC_STATUS status;
CMainDocument* pDoc = wxGetApp().GetDocument();
wxASSERT(pDoc);
bool result = false;
pDoc->GetCoreClientStatus(status);
if ( pDoc->IsConnected() && status.task_suspend_reason > 0 && status.task_suspend_reason != SUSPEND_REASON_DISK_SIZE && status.task_suspend_reason != SUSPEND_REASON_CPU_THROTTLE ) {
result = true;
}
return result;
}
// Check to see if a project update is scheduled or in progress
bool CSimpleTaskPanel::ProjectUpdateScheduled() {
PROJECT* project;
CMainDocument* pDoc = wxGetApp().GetDocument();
wxASSERT(pDoc);
int prjCount = pDoc->GetSimpleProjectCount();
for(int i=0; i<prjCount; i++) {
project = pDoc->state.projects[i];
if ( project->sched_rpc_pending || project->master_url_fetch_pending || project->scheduler_rpc_in_progress ) {
return true;
}
}
return false;
}
void CSimpleTaskPanel::DisplayIdleState() {
CMainDocument* pDoc = wxGetApp().GetDocument();
wxASSERT(pDoc);
if ( pDoc->IsReconnecting() ) {
error_time = 0;
UpdateStaticText(&m_StatusValueText, _("Retrieving current status."));
} else if ( pDoc->IsConnected() && pDoc->state.projects.size() == 0) {
error_time = 0;
UpdateStaticText(&m_StatusValueText, m_sNoProjectsString);
} else if ( DownloadingResults() ) {
error_time = 0;
UpdateStaticText(&m_StatusValueText, _("Downloading work from the server."));
} else if ( Suspended() ) {
CC_STATUS status;
pDoc->GetCoreClientStatus(status);
if ( status.task_suspend_reason & SUSPEND_REASON_BATTERIES ) {
UpdateStaticText(&m_StatusValueText, _("Processing Suspended: Running On Batteries."));
} else if ( status.task_suspend_reason & SUSPEND_REASON_USER_ACTIVE ) {
UpdateStaticText(&m_StatusValueText, _("Processing Suspended: User Active."));
} else if ( status.task_suspend_reason & SUSPEND_REASON_USER_REQ ) {
UpdateStaticText(&m_StatusValueText, _("Processing Suspended: User paused processing."));
} else if ( status.task_suspend_reason & SUSPEND_REASON_TIME_OF_DAY ) {
UpdateStaticText(&m_StatusValueText, _("Processing Suspended: Time of Day."));
} else if ( status.task_suspend_reason & SUSPEND_REASON_BENCHMARKS ) {
UpdateStaticText(&m_StatusValueText, _("Processing Suspended: Benchmarks Running."));
} else {
UpdateStaticText(&m_StatusValueText, _("Processing Suspended."));
}
} else if ( ProjectUpdateScheduled() ) {
error_time = 0;
UpdateStaticText(&m_StatusValueText, _("Waiting to contact project servers."));
} else {
if ( error_time == 0 ) {
error_time = time(NULL) + 10;
UpdateStaticText(&m_StatusValueText, _("Retrieving current status"));
} else if ( error_time < time(NULL) ) {
// TODO: should we display "ERROR" like old Simple GUI?
if ( pDoc->IsConnected() ) {
UpdateStaticText(&m_StatusValueText, _("No work available to process"));
} else {
UpdateStaticText(&m_StatusValueText, _("Unable to connect to the core client"));
}
} else {
UpdateStaticText(&m_StatusValueText, _("Retrieving current status"));
}
}
}
void CSimpleTaskPanel::UpdateStaticText(CTransparentStaticText **whichText, wxString s) {
EllipseStringIfNeeded(s, *whichText);
if ((*whichText)->GetLabel() != s) {
(*whichText)->SetLabel(s);
(*whichText)->SetName(s); // For accessibility on Windows
}
}
void CSimpleTaskPanel::EllipseStringIfNeeded(wxString& s, wxWindow *win) {
int x, y;
int w, h;
wxSize sz = GetSize();
win->GetPosition(&x, &y);
int maxWidth = sz.GetWidth() - x - SIDEMARGINS;
win->GetTextExtent(s, &w, &h);
// Adapted from ellipis code in wxRendererGeneric::DrawHeaderButtonContents()
if (w > maxWidth) {
int ellipsisWidth;
win->GetTextExtent( wxT("..."), &ellipsisWidth, NULL);
if (ellipsisWidth > maxWidth) {
s.Clear();
w = 0;
} else {
do {
s.Truncate( s.length() - 1 );
win->GetTextExtent( s, &w, &h);
} while (((w + ellipsisWidth) > maxWidth) && s.length() );
s.append( wxT("...") );
w += ellipsisWidth;
}
}
}

138
clientgui/sg_TaskPanel.h Executable file
View File

@ -0,0 +1,138 @@
// This file is part of BOINC.
// http://boinc.berkeley.edu
// Copyright (C) 2008 University of California
//
// BOINC 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 3 of the License, or (at your option) any later version.
//
// BOINC 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.
//
// You should have received a copy of the GNU Lesser General Public License
// along with BOINC. If not, see <http://www.gnu.org/licenses/>.
#ifndef __sg_TaskPanel__
#define __sg_TaskPanel__
#define SELECTBYRESULTNAME 0
#include "sg_CustomControls.h"
#include "sg_PanelBase.h"
typedef struct {
RESULT * result;
char result_name[256];
char project_url[256];
int dotColor;
char slide_show_filename_prefix[1024];
int numSlides;
int lastSlideShown;
} TaskSelectionData;
///////////////////////////////////////////////////////////////////////////
class CSlideShowPanel : public wxPanel
{
DECLARE_DYNAMIC_CLASS( CSlideShowPanel )
DECLARE_EVENT_TABLE()
public:
CSlideShowPanel();
CSlideShowPanel( wxWindow* parent);
~CSlideShowPanel();
void OnSlideShowTimer(wxTimerEvent& WXUNUSED(event));
void AdvanceSlideShow(bool changeSlide);
void OnPaint(wxPaintEvent& WXUNUSED(event));
private:
wxTimer* m_ChangeSlideTimer;
wxBitmap m_SlideBitmap;
bool m_bCurrentSlideIsDefault;
};
///////////////////////////////////////////////////////////////////////////////
/// Class CSimpleTaskPanel
///////////////////////////////////////////////////////////////////////////////
#if 0
#ifdef __WXMAC__
#include "MacBitmapComboBox.h"
#else
#define CBOINCBitmapComboBox wxBitmapComboBox
#define EVT_BOINCBITMAPCOMBOBOX EVT_COMBOBOX
#endif
#endif
class CSimpleTaskPanel : public CSimplePanelBase
{
DECLARE_DYNAMIC_CLASS( CSimpleTaskPanel )
DECLARE_EVENT_TABLE()
public:
CSimpleTaskPanel();
CSimpleTaskPanel( wxWindow* parent);
~CSimpleTaskPanel();
TaskSelectionData* GetTaskSelectionData();
wxString GetSelectedTaskString() { return m_TaskSelectionCtrl->GetValue(); }
void Update();
wxRect GetProgressRect() { return m_ProgressRect; }
void ReskinInterface();
void EllipseStringIfNeeded(wxString& s, wxWindow *win);
private:
void OnTaskSelection(wxCommandEvent &event);
void GetApplicationAndProjectNames(RESULT* result, wxString* appName, wxString* projName);
wxString GetElapsedTimeString(double f);
wxString GetTimeRemainingString(double f);
wxString GetStatusString(RESULT* result);
wxString FormatTime(float fBuffer);
void UpdateTaskSelectionList();
bool isRunning(RESULT* result);
bool DownloadingResults();
bool Suspended();
bool ProjectUpdateScheduled();
void DisplayIdleState();
void UpdateStaticText(CTransparentStaticText **whichText, wxString s);
void OnPulseProgressIndicator(wxTimerEvent& event);
protected:
CTransparentStaticText* m_myTasksLabel;
CBOINCBitmapComboBox* m_TaskSelectionCtrl;
CTransparentStaticText* m_TaskProjectLabel;
CTransparentStaticText* m_TaskProjectName;
#if SELECTBYRESULTNAME
CTransparentStaticText* m_TaskApplicationName;
#endif
CSlideShowPanel* m_SlideShowArea;
CTransparentStaticText* m_ElapsedTimeValue;
CTransparentStaticText* m_TimeRemainingValue;
wxGauge* m_ProgressBar;
CTransparentStaticText* m_ProgressValueText;
CTransparentStaticText* m_StatusValueText;
wxButton* m_TaskCommandsButton;
wxRect m_ProgressRect;
int m_oldWorkCount;
time_t error_time;
wxBitmap m_GreenDot;
wxBitmap m_YellowDot;
wxBitmap m_RedDot;
wxTimer* m_pulseTimer;
bool m_bStableTaskInfoChanged;
int m_CurrentTaskSelection;
wxString m_sNotAvailableString;
wxString m_sNoProjectsString;
};
#endif //__sg_TaskPanel__

View File

@ -183,7 +183,6 @@
DD616A3008150050006981C1 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = F51BDF4903086C46012012A7 /* InfoPlist.strings */; };
DD635A420D384FA500BAC1A5 /* texfont.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DD635A410D384FA500BAC1A5 /* texfont.cpp */; };
DD6381F90870DD83007A2F8E /* make_app_icon_h.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DD6381F80870DD83007A2F8E /* make_app_icon_h.cpp */; };
DD63F7510B64EECE0053037F /* libwx_mac_static.a in Frameworks */ = {isa = PBXBuildFile; fileRef = DDA90F260B64673D008F2E87 /* libwx_mac_static.a */; };
DD6617880A3FFD8C00FFEBEB /* check_security.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DD6617870A3FFD8C00FFEBEB /* check_security.cpp */; };
DD67F8140ADB9DD000B0015E /* wxPieCtrl.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DD40E75D0ADB87BC00214518 /* wxPieCtrl.cpp */; };
DD6802300E701ACD0067D009 /* cert_sig.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DD68022E0E701ACD0067D009 /* cert_sig.cpp */; };
@ -201,6 +200,10 @@
DD7475520D86273300860636 /* coproc.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DD7475500D86273300860636 /* coproc.cpp */; };
DD7748B50A356D6C0025D05E /* SetupSecurity.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DD7748B40A356D6C0025D05E /* SetupSecurity.cpp */; };
DD7749680A3596380025D05E /* Security.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DD1929D80918A2F100C31BCF /* Security.framework */; };
DD7A5D8312EEBE5E0006268E /* sg_TaskCommandPopup.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DD7A5D8212EEBE5E0006268E /* sg_TaskCommandPopup.cpp */; };
DD7A5D9F12EEBFC20006268E /* sg_ProjectWebSitesPopup.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DD7A5D9E12EEBFC20006268E /* sg_ProjectWebSitesPopup.cpp */; };
DD7A5DAB12EEC37B0006268E /* sg_ProjectCommandPopup.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DD7A5DAA12EEC37B0006268E /* sg_ProjectCommandPopup.cpp */; };
DD7A5E5012EEE3A20006268E /* sg_BoincSimpleFrame.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DDAFA7AC12D4834D00997329 /* sg_BoincSimpleFrame.cpp */; };
DD7AEB4A0C87CE1300AC3B5C /* screensaver.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DD7AEB490C87CE1300AC3B5C /* screensaver.cpp */; };
DD7BF7DA0B8E7A9800A009F7 /* str_util.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DD7BF7D70B8E7A9800A009F7 /* str_util.cpp */; };
DD7BF7E10B8E7B3700A009F7 /* str_util.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DD7BF7D70B8E7A9800A009F7 /* str_util.cpp */; };
@ -283,6 +286,7 @@
DDAD31D90EC26B14002DA09D /* mac_address.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DDAD31D60EC26B14002DA09D /* mac_address.cpp */; };
DDAEC9FF07FA5A5C00A7BC36 /* SetVersion.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DDAEC9E707FA58A000A7BC36 /* SetVersion.cpp */; };
DDB219B210B3BBA900417AEF /* WaitPermissions.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DDB219B110B3BBA900417AEF /* WaitPermissions.cpp */; };
DDB42E3412F1B6A400E6D8A2 /* libwx_mac_static.a in Frameworks */ = {isa = PBXBuildFile; fileRef = DDA90F260B64673D008F2E87 /* libwx_mac_static.a */; };
DDB693500ABFE9C600689FD8 /* procinfo_mac.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DDB6934F0ABFE9C600689FD8 /* procinfo_mac.cpp */; };
DDB6E3EF0D5B27AA00ED12B8 /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 20286C33FDCF999611CA2CEA /* Carbon.framework */; };
DDB74A6C0D74259E00E97A40 /* AppKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DDFE854A0B60CFD0009B43D9 /* AppKit.framework */; };
@ -302,14 +306,17 @@
DDBC6CA50D5D458700564C49 /* boinc_ss_logo.png in Resources */ = {isa = PBXBuildFile; fileRef = DDBC6CA40D5D458700564C49 /* boinc_ss_logo.png */; };
DDBD51760C169B770074905B /* LoginItemAPI.c in Sources */ = {isa = PBXBuildFile; fileRef = DD1277BE081F3E73007B5DE1 /* LoginItemAPI.c */; };
DDBE74390C03B1C600453BB8 /* cs_platforms.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DDBE74380C03B1C600453BB8 /* cs_platforms.cpp */; };
DDBEABA212DB1E930087252D /* MacBitmapComboBox.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DDBEABA112DB1E930087252D /* MacBitmapComboBox.cpp */; };
DDC06AB410A3E93F00C8D9A5 /* url.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DDC06AB210A3E93F00C8D9A5 /* url.cpp */; };
DDC06AB810A3E97700C8D9A5 /* url.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DDC06AB210A3E93F00C8D9A5 /* url.cpp */; };
DDC06ABC10A3E98D00C8D9A5 /* url.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DDC06AB210A3E93F00C8D9A5 /* url.cpp */; };
DDC132F30E2DAB1B0014D305 /* AsyncRPC.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DDC132F20E2DAB1B0014D305 /* AsyncRPC.cpp */; };
DDC321AE12E45162006CB55F /* sg_PanelBase.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DDC321AC12E45162006CB55F /* sg_PanelBase.cpp */; };
DDC3D55E0D507D1700BE6D23 /* BOINCClientManager.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DDC3D55C0D507D1700BE6D23 /* BOINCClientManager.cpp */; };
DDC836E60EDEA5DB001C2EF9 /* TermsOfUsePage.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DDC836E50EDEA5DB001C2EF9 /* TermsOfUsePage.cpp */; };
DDC988FE0F3BD44100EE8D0E /* gui_rpc_client_ops.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DD73E34E08A0694000656EB1 /* gui_rpc_client_ops.cpp */; };
DDCF84080E1B7C0A005EDC45 /* DlgItemProperties.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DDCF84060E1B7C0A005EDC45 /* DlgItemProperties.cpp */; };
DDD0697312D70C9400120920 /* sg_TaskPanel.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DDD0697112D70C9400120920 /* sg_TaskPanel.cpp */; };
DDD095490A3EDF2D00C95BA4 /* switcher.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DDD095480A3EDF2D00C95BA4 /* switcher.cpp */; };
DDD3370A106224E800867C7D /* AddRemoveUser.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DDD33709106224E800867C7D /* AddRemoveUser.cpp */; };
DDD3370F10622C6C00867C7D /* LoginItemAPI.c in Sources */ = {isa = PBXBuildFile; fileRef = DD1277BE081F3E73007B5DE1 /* LoginItemAPI.c */; };
@ -370,6 +377,7 @@
DDD9C5AB10CCF6A300A1E4CD /* coproc.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DD7475500D86273300860636 /* coproc.cpp */; };
DDD9C5AC10CCF6AB00A1E4CD /* coproc.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DD7475500D86273300860636 /* coproc.cpp */; };
DDDC35260909212D006076EC /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = F51BDF4903086C46012012A7 /* InfoPlist.strings */; };
DDDD6D8012E4611300C258A0 /* sg_ProjectPanel.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DDDD6D7E12E4611300C258A0 /* sg_ProjectPanel.cpp */; };
DDDE43B10EC04C1800083520 /* DlgExitMessage.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DDDE43B00EC04C1800083520 /* DlgExitMessage.cpp */; };
DDE1372A10DC5E5300161D6B /* cs_notice.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DDE1372810DC5E5300161D6B /* cs_notice.cpp */; };
DDE1372F10DC5E8D00161D6B /* notice.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DDE1372D10DC5E8D00161D6B /* notice.cpp */; };
@ -821,6 +829,12 @@
DD7475500D86273300860636 /* coproc.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = coproc.cpp; sourceTree = "<group>"; };
DD7748980A356C880025D05E /* SetUpSecurity */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = SetUpSecurity; sourceTree = BUILT_PRODUCTS_DIR; };
DD7748B40A356D6C0025D05E /* SetupSecurity.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = SetupSecurity.cpp; path = ../clientgui/mac/SetupSecurity.cpp; sourceTree = SOURCE_ROOT; };
DD7A5D8112EEBDF30006268E /* sg_TaskCommandPopup.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = sg_TaskCommandPopup.h; path = ../clientgui/sg_TaskCommandPopup.h; sourceTree = SOURCE_ROOT; };
DD7A5D8212EEBE5E0006268E /* sg_TaskCommandPopup.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = sg_TaskCommandPopup.cpp; path = ../clientgui/sg_TaskCommandPopup.cpp; sourceTree = SOURCE_ROOT; };
DD7A5D9D12EEBFC20006268E /* sg_ProjectWebSitesPopup.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = sg_ProjectWebSitesPopup.h; path = ../clientgui/sg_ProjectWebSitesPopup.h; sourceTree = SOURCE_ROOT; };
DD7A5D9E12EEBFC20006268E /* sg_ProjectWebSitesPopup.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = sg_ProjectWebSitesPopup.cpp; path = ../clientgui/sg_ProjectWebSitesPopup.cpp; sourceTree = SOURCE_ROOT; };
DD7A5DA712EEC33F0006268E /* sg_ProjectCommandPopup.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = sg_ProjectCommandPopup.h; path = ../clientgui/sg_ProjectCommandPopup.h; sourceTree = SOURCE_ROOT; };
DD7A5DAA12EEC37B0006268E /* sg_ProjectCommandPopup.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = sg_ProjectCommandPopup.cpp; path = ../clientgui/sg_ProjectCommandPopup.cpp; sourceTree = SOURCE_ROOT; };
DD7AEB490C87CE1300AC3B5C /* screensaver.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = screensaver.cpp; path = ../clientscr/screensaver.cpp; sourceTree = SOURCE_ROOT; };
DD7AEB680C87CE6500AC3B5C /* screensaver.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = screensaver.h; path = ../clientscr/screensaver.h; sourceTree = SOURCE_ROOT; };
DD7BF7D70B8E7A9800A009F7 /* str_util.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = str_util.cpp; sourceTree = "<group>"; };
@ -909,6 +923,8 @@
DDAD31D70EC26B14002DA09D /* mac_address.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = mac_address.h; path = ../lib/mac_address.h; sourceTree = SOURCE_ROOT; };
DDAEC9E107FA583B00A7BC36 /* SetVersion */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = SetVersion; sourceTree = BUILT_PRODUCTS_DIR; };
DDAEC9E707FA58A000A7BC36 /* SetVersion.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = SetVersion.cpp; path = ../clientgui/mac/SetVersion.cpp; sourceTree = SOURCE_ROOT; };
DDAFA7AC12D4834D00997329 /* sg_BoincSimpleFrame.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = sg_BoincSimpleFrame.cpp; sourceTree = "<group>"; };
DDAFA7AD12D4834D00997329 /* sg_BoincSimpleFrame.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = sg_BoincSimpleFrame.h; sourceTree = "<group>"; };
DDB219A410B3BB6100417AEF /* WaitPermissions.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = WaitPermissions.app; sourceTree = BUILT_PRODUCTS_DIR; };
DDB219A610B3BB6200417AEF /* WaitPermissions-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "WaitPermissions-Info.plist"; sourceTree = "<group>"; };
DDB219B110B3BBA900417AEF /* WaitPermissions.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = WaitPermissions.cpp; path = ../mac_installer/WaitPermissions.cpp; sourceTree = SOURCE_ROOT; };
@ -928,10 +944,14 @@
DDBDF4A90987091800464F83 /* ValidateEmailAddress.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = ValidateEmailAddress.cpp; path = ../clientgui/ValidateEmailAddress.cpp; sourceTree = SOURCE_ROOT; };
DDBDF4AA0987091800464F83 /* ValidateEmailAddress.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = ValidateEmailAddress.h; path = ../clientgui/ValidateEmailAddress.h; sourceTree = SOURCE_ROOT; };
DDBE74380C03B1C600453BB8 /* cs_platforms.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = cs_platforms.cpp; sourceTree = "<group>"; };
DDBEABA012DB1E930087252D /* MacBitmapComboBox.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = MacBitmapComboBox.h; path = ../clientgui/MacBitmapComboBox.h; sourceTree = "<group>"; };
DDBEABA112DB1E930087252D /* MacBitmapComboBox.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = MacBitmapComboBox.cpp; path = ../clientgui/MacBitmapComboBox.cpp; sourceTree = "<group>"; };
DDC06AB210A3E93F00C8D9A5 /* url.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = url.cpp; path = ../lib/url.cpp; sourceTree = SOURCE_ROOT; };
DDC06AB310A3E93F00C8D9A5 /* url.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = url.h; path = ../lib/url.h; sourceTree = SOURCE_ROOT; };
DDC132F10E2DAB1B0014D305 /* AsyncRPC.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AsyncRPC.h; sourceTree = "<group>"; };
DDC132F20E2DAB1B0014D305 /* AsyncRPC.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = AsyncRPC.cpp; sourceTree = "<group>"; };
DDC321AC12E45162006CB55F /* sg_PanelBase.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = sg_PanelBase.cpp; path = ../clientgui/sg_PanelBase.cpp; sourceTree = SOURCE_ROOT; };
DDC321AD12E45162006CB55F /* sg_PanelBase.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = sg_PanelBase.h; path = ../clientgui/sg_PanelBase.h; sourceTree = SOURCE_ROOT; };
DDC3D55C0D507D1700BE6D23 /* BOINCClientManager.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = BOINCClientManager.cpp; path = ../clientgui/BOINCClientManager.cpp; sourceTree = SOURCE_ROOT; };
DDC3D55D0D507D1700BE6D23 /* BOINCClientManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = BOINCClientManager.h; path = ../clientgui/BOINCClientManager.h; sourceTree = SOURCE_ROOT; };
DDC63EEF0985B89600383FD2 /* DlgGenericMessage.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = DlgGenericMessage.cpp; path = ../clientgui/DlgGenericMessage.cpp; sourceTree = SOURCE_ROOT; };
@ -954,6 +974,8 @@
DDCE783F0A70BF72008218B6 /* sg_ProjectsComponent.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = sg_ProjectsComponent.h; path = ../clientgui/sg_ProjectsComponent.h; sourceTree = SOURCE_ROOT; };
DDCF84060E1B7C0A005EDC45 /* DlgItemProperties.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = DlgItemProperties.cpp; sourceTree = "<group>"; };
DDCF84070E1B7C0A005EDC45 /* DlgItemProperties.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DlgItemProperties.h; sourceTree = "<group>"; };
DDD0697112D70C9400120920 /* sg_TaskPanel.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = sg_TaskPanel.cpp; path = ../clientgui/sg_TaskPanel.cpp; sourceTree = SOURCE_ROOT; };
DDD0697212D70C9400120920 /* sg_TaskPanel.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = sg_TaskPanel.h; path = ../clientgui/sg_TaskPanel.h; sourceTree = SOURCE_ROOT; };
DDD0953F0A3EDD2500C95BA4 /* switcher */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = switcher; sourceTree = BUILT_PRODUCTS_DIR; };
DDD095480A3EDF2D00C95BA4 /* switcher.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = switcher.cpp; sourceTree = "<group>"; };
DDD337021062235D00867C7D /* AddRemoveUser */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = AddRemoveUser; sourceTree = BUILT_PRODUCTS_DIR; };
@ -966,6 +988,8 @@
DDD52DC90C03CAE6009B5FC0 /* ViewWork.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = ViewWork.h; path = ../clientgui/ViewWork.h; sourceTree = SOURCE_ROOT; };
DDD74D8707CF482E0065AC9D /* boinc */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = boinc; sourceTree = BUILT_PRODUCTS_DIR; };
DDD9C59210CCF54300A1E4CD /* coproc_detect.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = coproc_detect.cpp; path = ../client/coproc_detect.cpp; sourceTree = SOURCE_ROOT; };
DDDD6D7E12E4611300C258A0 /* sg_ProjectPanel.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = sg_ProjectPanel.cpp; path = ../clientgui/sg_ProjectPanel.cpp; sourceTree = SOURCE_ROOT; };
DDDD6D7F12E4611300C258A0 /* sg_ProjectPanel.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = sg_ProjectPanel.h; path = ../clientgui/sg_ProjectPanel.h; sourceTree = SOURCE_ROOT; };
DDDE43B00EC04C1800083520 /* DlgExitMessage.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = DlgExitMessage.cpp; path = ../clientgui/DlgExitMessage.cpp; sourceTree = SOURCE_ROOT; };
DDDE43B80EC04C3C00083520 /* DlgExitMessage.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = DlgExitMessage.h; path = ../clientgui/DlgExitMessage.h; sourceTree = SOURCE_ROOT; };
DDE1372810DC5E5300161D6B /* cs_notice.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = cs_notice.cpp; path = ../client/cs_notice.cpp; sourceTree = SOURCE_ROOT; };
@ -1074,10 +1098,10 @@
DD3E15310A774397007E0084 /* Carbon.framework in Frameworks */,
DD3E15320A774397007E0084 /* IOKit.framework in Frameworks */,
DD3E15330A774397007E0084 /* Security.framework in Frameworks */,
DD63F7510B64EECE0053037F /* libwx_mac_static.a in Frameworks */,
DDA546610D16964E008CC69A /* QuickTime.framework in Frameworks */,
DD21B49D0D750FC600AFFEE5 /* AppKit.framework in Frameworks */,
DD1682B10F8DC6D90096D714 /* OpenGL.framework in Frameworks */,
DDB42E3412F1B6A400E6D8A2 /* libwx_mac_static.a in Frameworks */,
);
runOnlyForDeploymentPostprocessing = 0;
};
@ -1413,6 +1437,8 @@
DD58C45F08F334EA00C1DF66 /* ProxyPage.h */,
DD58C46008F334EA00C1DF66 /* resource.h */,
DD81C41707C5D13E0098A04D /* stdwx.cpp */,
DDAFA7AC12D4834D00997329 /* sg_BoincSimpleFrame.cpp */,
DDAFA7AD12D4834D00997329 /* sg_BoincSimpleFrame.h */,
DDCAD7D10A6C603A0086C7EE /* sg_BoincSimpleGUI.cpp */,
DDCAD7D20A6C603A0086C7EE /* sg_BoincSimpleGUI.h */,
DD4C560A0AD389A2009E23C6 /* sg_ClientStateIndicator.cpp */,
@ -1427,12 +1453,24 @@
DD4C560F0AD389A2009E23C6 /* sg_ImageButton.h */,
DDCAD7D50A6C603A0086C7EE /* sg_ImageLoader.cpp */,
DDCAD7D60A6C603A0086C7EE /* sg_ImageLoader.h */,
DDC321AC12E45162006CB55F /* sg_PanelBase.cpp */,
DDC321AD12E45162006CB55F /* sg_PanelBase.h */,
DD4C56100AD389A2009E23C6 /* sg_ProgressBar.cpp */,
DD4C56110AD389A2009E23C6 /* sg_ProgressBar.h */,
DDDD6D7E12E4611300C258A0 /* sg_ProjectPanel.cpp */,
DDDD6D7F12E4611300C258A0 /* sg_ProjectPanel.h */,
DD7A5DAA12EEC37B0006268E /* sg_ProjectCommandPopup.cpp */,
DD7A5DA712EEC33F0006268E /* sg_ProjectCommandPopup.h */,
DDCE783E0A70BF72008218B6 /* sg_ProjectsComponent.cpp */,
DDCE783F0A70BF72008218B6 /* sg_ProjectsComponent.h */,
DD7A5D9D12EEBFC20006268E /* sg_ProjectWebSitesPopup.h */,
DD7A5D9E12EEBFC20006268E /* sg_ProjectWebSitesPopup.cpp */,
DDCAD7D90A6C603A0086C7EE /* sg_StatImageLoader.cpp */,
DDCAD7DA0A6C603A0086C7EE /* sg_StatImageLoader.h */,
DD7A5D8212EEBE5E0006268E /* sg_TaskCommandPopup.cpp */,
DD7A5D8112EEBDF30006268E /* sg_TaskCommandPopup.h */,
DDD0697112D70C9400120920 /* sg_TaskPanel.cpp */,
DDD0697212D70C9400120920 /* sg_TaskPanel.h */,
DDCAD7DB0A6C603A0086C7EE /* sg_ViewTabPage.cpp */,
DDCAD7DC0A6C603A0086C7EE /* sg_ViewTabPage.h */,
DD247AF70AEA308A0034104A /* SkinManager.cpp */,
@ -1733,6 +1771,8 @@
DD1F0ACD0822069E00AFC5FA /* MacGUI.pch */,
DDA99BF31099AF18002F8E9B /* MacAccessiblity.cpp */,
DD29728E10BB657A00DF3C2E /* MacAccessiblity.h */,
DDBEABA112DB1E930087252D /* MacBitmapComboBox.cpp */,
DDBEABA012DB1E930087252D /* MacBitmapComboBox.h */,
DD2F32F707F2A88B00645DDC /* MacSysMenu.cpp */,
DDA9D3BB09189A8C0060E7A7 /* Mac_GUI.cpp */,
DD2F32EF07F2A83E00645DDC /* MacSysMenu.h */,
@ -2595,6 +2635,14 @@
DDA850A41207EED900B473A6 /* WizardAttach.cpp in Sources */,
DD4FA25D121828E400154856 /* BOINCHtmlLBox.cpp in Sources */,
DD4FA2621218290600154856 /* BOINCVListBox.cpp in Sources */,
DDD0697312D70C9400120920 /* sg_TaskPanel.cpp in Sources */,
DDBEABA212DB1E930087252D /* MacBitmapComboBox.cpp in Sources */,
DDC321AE12E45162006CB55F /* sg_PanelBase.cpp in Sources */,
DDDD6D8012E4611300C258A0 /* sg_ProjectPanel.cpp in Sources */,
DD7A5D8312EEBE5E0006268E /* sg_TaskCommandPopup.cpp in Sources */,
DD7A5D9F12EEBFC20006268E /* sg_ProjectWebSitesPopup.cpp in Sources */,
DD7A5DAB12EEC37B0006268E /* sg_ProjectCommandPopup.cpp in Sources */,
DD7A5E5012EEE3A20006268E /* sg_BoincSimpleFrame.cpp in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
@ -3151,7 +3199,11 @@
../clientgui,
);
INFOPLIST_FILE = Info.plist;
LIBRARY_SEARCH_PATHS = "../../wxMac-2.8.10/src/build/Deployment/";
LIBRARY_SEARCH_PATHS = (
"../../wxMac-2.8.10/src/build/Deployment/",
"\"$(SRCROOT)/../../jpeg-6b\"",
"\"$(SRCROOT)/../../wxMac-2.8.10/src/build/Deployment\"",
);
OTHER_CFLAGS = (
"-DHAVE_CONFIG_H",
"-D_FILE_OFFSET_BITS=64",
@ -3197,7 +3249,11 @@
../clientgui,
);
INFOPLIST_FILE = Info.plist;
LIBRARY_SEARCH_PATHS = "../../wxMac-2.8.10/src/build/Deployment/";
LIBRARY_SEARCH_PATHS = (
"../../wxMac-2.8.10/src/build/Deployment/",
"\"$(SRCROOT)/../../jpeg-6b\"",
"\"$(SRCROOT)/../../wxMac-2.8.10/src/build/Deployment\"",
);
OTHER_CFLAGS = (
"-DHAVE_CONFIG_H",
"-D_FILE_OFFSET_BITS=64",
@ -3243,7 +3299,11 @@
../clientgui,
);
INFOPLIST_FILE = Info.plist;
LIBRARY_SEARCH_PATHS = "../../wxMac-2.8.10/src/build/Deployment/";
LIBRARY_SEARCH_PATHS = (
"../../wxMac-2.8.10/src/build/Deployment/",
"\"$(SRCROOT)/../../jpeg-6b\"",
"\"$(SRCROOT)/../../wxMac-2.8.10/src/build/Deployment\"",
);
OTHER_CFLAGS = (
"-DHAVE_CONFIG_H",
"-D_FILE_OFFSET_BITS=64",
@ -3289,7 +3349,11 @@
../clientgui,
);
INFOPLIST_FILE = Info.plist;
LIBRARY_SEARCH_PATHS = "../../wxMac-2.8.10/src/build/Deployment/";
LIBRARY_SEARCH_PATHS = (
"../../wxMac-2.8.10/src/build/Deployment/",
"\"$(SRCROOT)/../../jpeg-6b\"",
"\"$(SRCROOT)/../../wxMac-2.8.10/src/build/Deployment\"",
);
OTHER_CFLAGS = (
"-DHAVE_CONFIG_H",
"-D_FILE_OFFSET_BITS=64",
@ -3766,7 +3830,11 @@
../clientgui,
);
INFOPLIST_FILE = Info.plist;
LIBRARY_SEARCH_PATHS = "../../wxMac-2.8.10/src/build/Deployment/";
LIBRARY_SEARCH_PATHS = (
"../../wxMac-2.8.10/src/build/Deployment/",
"\"$(SRCROOT)/../../jpeg-6b\"",
"\"$(SRCROOT)/../../wxMac-2.8.10/src/build/Deployment\"",
);
OTHER_CFLAGS = (
"-DHAVE_CONFIG_H",
"-D_FILE_OFFSET_BITS=64",
@ -3811,7 +3879,11 @@
../clientgui,
);
INFOPLIST_FILE = Info.plist;
LIBRARY_SEARCH_PATHS = "../../wxMac-2.8.10/src/build/Deployment/";
LIBRARY_SEARCH_PATHS = (
"../../wxMac-2.8.10/src/build/Deployment/",
"\"$(SRCROOT)/../../jpeg-6b\"",
"\"$(SRCROOT)/../../wxMac-2.8.10/src/build/Deployment\"",
);
OTHER_CFLAGS = (
"-DHAVE_CONFIG_H",
"-D_FILE_OFFSET_BITS=64",
@ -4286,7 +4358,11 @@
../clientgui,
);
INFOPLIST_FILE = Info.plist;
LIBRARY_SEARCH_PATHS = "../../wxMac-2.8.10/src/build/Deployment/";
LIBRARY_SEARCH_PATHS = (
"../../wxMac-2.8.10/src/build/Deployment/",
"\"$(SRCROOT)/../../jpeg-6b\"",
"\"$(SRCROOT)/../../wxMac-2.8.10/src/build/Deployment\"",
);
OTHER_CFLAGS = (
"-DHAVE_CONFIG_H",
"-D_FILE_OFFSET_BITS=64",