mirror of https://github.com/BOINC/boinc.git
Add new Simple GUI
svn path=/trunk/boinc/; revision=22948
This commit is contained in:
parent
c9f77c4db2
commit
bf789a23db
|
@ -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
|
||||
|
|
@ -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"));
|
||||
|
||||
|
|
|
@ -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 );
|
||||
|
|
|
@ -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(
|
||||
|
|
|
@ -37,6 +37,7 @@
|
|||
///
|
||||
#define BOINC_ADVANCEDGUI 1
|
||||
#define BOINC_SIMPLEGUI 2
|
||||
#define BOINC_NEWSIMPLEGUI 3
|
||||
|
||||
|
||||
class wxLogBOINC;
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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);
|
||||
}
|
|
@ -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__
|
|
@ -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.
|
||||
|
|
|
@ -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"};
|
|
@ -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"};
|
|
@ -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"};
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
@ -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_
|
||||
|
||||
|
|
@ -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());
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
|
@ -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);
|
||||
}
|
|
@ -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__
|
|
@ -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;
|
||||
}
|
||||
|
|
@ -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__
|
|
@ -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();
|
||||
}
|
||||
|
||||
|
|
@ -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__
|
|
@ -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));
|
||||
}
|
||||
}
|
|
@ -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__
|
|
@ -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();
|
||||
}
|
||||
}
|
|
@ -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__
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
}
|
|
@ -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__
|
|
@ -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",
|
||||
|
|
Loading…
Reference in New Issue