diff --git a/checkin_notes b/checkin_notes index e53508f35d..5619bc469c 100644 --- a/checkin_notes +++ b/checkin_notes @@ -421,3 +421,10 @@ David 13 Jan 2010 clientgui/ ViewNotices.cpp,h + +Rom 14 Jan 2010 + - MGR: Use an event handler, the function overload is deprecated. + + clientgui/ + ViewNotices.cpp,h + \ No newline at end of file diff --git a/clientgui/ViewNotices.cpp b/clientgui/ViewNotices.cpp index b368c04159..6997e8074e 100644 --- a/clientgui/ViewNotices.cpp +++ b/clientgui/ViewNotices.cpp @@ -1,205 +1,206 @@ -// 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 . - -#if defined(__GNUG__) && !defined(__APPLE__) -#pragma implementation "ViewNotices.h" -#endif - -#include "stdwx.h" -#include "BOINCGUIApp.h" -#include "BOINCBaseFrame.h" -#include "MainDocument.h" -#include "AdvancedFrame.h" -#include "BOINCTaskCtrl.h" -#include "ViewNotices.h" -#include "Events.h" -#include "error_numbers.h" - - -#include "res/mess.xpm" - - -IMPLEMENT_DYNAMIC_CLASS(CViewNotices, CBOINCBaseView) - -BEGIN_EVENT_TABLE (CViewNotices, CBOINCBaseView) -END_EVENT_TABLE () - -HtmlWindow::HtmlWindow(wxWindow *parent, wxWindowID id, const wxPoint& pos, - const wxSize& size, long style, const wxString& name) -: wxHtmlWindow(parent, id, pos, size, style, name) +// 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 . + +#if defined(__GNUG__) && !defined(__APPLE__) +#pragma implementation "ViewNotices.h" +#endif + +#include "stdwx.h" +#include "BOINCGUIApp.h" +#include "BOINCBaseFrame.h" +#include "MainDocument.h" +#include "AdvancedFrame.h" +#include "BOINCTaskCtrl.h" +#include "ViewNotices.h" +#include "Events.h" +#include "error_numbers.h" + + +#include "res/mess.xpm" + + +IMPLEMENT_DYNAMIC_CLASS(CViewNotices, CBOINCBaseView) + +BEGIN_EVENT_TABLE (CViewNotices, CBOINCBaseView) + EVT_HTML_LINK_CLICKED(ID_HTML_NOTIFICATIONSVIEW, CViewNotices::OnLinkClicked) +END_EVENT_TABLE () + + +CViewNotices::CViewNotices() {} - -void HtmlWindow::OnLinkClicked(const wxHtmlLinkInfo& link) { - if (link.GetHref().StartsWith(_T("http://"))) + + +CViewNotices::CViewNotices(wxNotebook* pNotebook) : + CBOINCBaseView(pNotebook) +{ + CTaskItemGroup* pGroup = NULL; + CTaskItem* pItem = NULL; + + // + // Setup View + // + wxFlexGridSizer* itemFlexGridSizer = new wxFlexGridSizer(2, 0, 0); + wxASSERT(itemFlexGridSizer); + + itemFlexGridSizer->AddGrowableRow(0); + itemFlexGridSizer->AddGrowableCol(1); + + m_pTaskPane = new CBOINCTaskCtrl(this, ID_TASK_NOTIFICATIONSVIEW, DEFAULT_TASK_FLAGS); + wxASSERT(m_pTaskPane); + + m_pHtmlPane = new wxHtmlWindow(this, ID_HTML_NOTIFICATIONSVIEW, wxDefaultPosition, wxDefaultSize, wxHW_SCROLLBAR_AUTO | wxHSCROLL | wxVSCROLL); + wxASSERT(m_pHtmlPane); + + itemFlexGridSizer->Add(m_pTaskPane, 1, wxGROW|wxALL, 1); + itemFlexGridSizer->Add(m_pHtmlPane, 1, wxGROW|wxALL, 1); + + SetSizer(itemFlexGridSizer); + + Layout(); + + m_iOldNoticeCount = 0; + + pGroup = new CTaskItemGroup(_("News Feeds")); + m_TaskGroups.push_back(pGroup); + + pItem = new CTaskItem( + _("BOINC"), + _("Display the latest news about BOINC"), + ID_TASK_NEWS_BOINC + ); + pGroup->m_Tasks.push_back(pItem); + + m_TaskGroups.push_back(pGroup); + + // Create Task Pane Items + m_pTaskPane->UpdateControls(); +} + + +CViewNotices::~CViewNotices() { +} + + +wxString& CViewNotices::GetViewName() { + static wxString strViewName(wxT("Notices")); + return strViewName; +} + + +wxString& CViewNotices::GetViewDisplayName() { + static wxString strViewName(_("Notices")); + return strViewName; +} + + +const char** CViewNotices::GetViewIcon() { + return mess_xpm; +} + + +const int CViewNotices::GetViewRefreshRate() { + return 10; +} + +const int CViewNotices::GetViewCurrentViewPage() { + return VW_NOTIF; +} + + +bool CViewNotices::OnSaveState(wxConfigBase* WXUNUSED(pConfig)) { + return true; +} + + +bool CViewNotices::OnRestoreState(wxConfigBase* WXUNUSED(pConfig)) { + return true; +} + + +void CViewNotices::OnListRender(wxTimerEvent& WXUNUSED(event)) { + wxLogTrace(wxT("Function Start/End"), wxT("CViewNotices::OnListRender - Function Begin")); + + CMainDocument* pDoc = wxGetApp().GetDocument(); + wxString strHTML; + wxString strItems; + wxString strTemp; + wxDateTime dtBuffer; + int n = 0; + unsigned int i = 0; + static bool s_bInProgress = false; + + wxASSERT(pDoc); + wxASSERT(wxDynamicCast(pDoc, CMainDocument)); + wxASSERT(m_pHtmlPane); + + if (s_bInProgress) return; + s_bInProgress = true; + + n = pDoc->GetNoticeCount(); + if (n == -1) { + strItems += _("Retrieving notices..."); + } else { + // Update display only if there is something new + if (n == m_iOldNoticeCount) { + goto done; + } + m_iOldNoticeCount = n; + + // Pre-allocate buffer size so string concat is much faster + strItems.Alloc(4096*n); + + for (i=0; i < (unsigned int)n; i++) { + NOTICE* np = pDoc->notice(i); + if (!np) continue; + char tbuf[512]; + if (strlen(np->title)) { + sprintf(tbuf, "%s
", np->title); + strItems += wxString(tbuf, wxConvUTF8); + + } + strItems += wxString(np->description.c_str(), wxConvUTF8); + strItems += wxT("
"); + dtBuffer.Set((time_t)np->arrival_time); + strItems += dtBuffer.Format(); + if (strlen(np->link)) { + sprintf(tbuf, " · more... ", np->link); + strItems += wxString(tbuf, wxConvUTF8); + } + strItems += wxT("
\n"); + } + } + strHTML = wxT("\n\n"); + strHTML += strItems; + //strHTML += wxT("
\n"); + strHTML += wxT("\n\n"); + m_pHtmlPane->SetFonts(wxT("Sans Serif"), wxT("Courier"), 0); + m_pHtmlPane->SetPage(strHTML); + +done: + s_bInProgress = false; + + wxLogTrace(wxT("Function Start/End"), wxT("CViewNotices::OnListRender - Function End")); +} + + +void CViewNotices::OnLinkClicked( wxHtmlLinkEvent& event ) { + wxHtmlLinkInfo link = event.GetLinkInfo(); + if (link.GetHref().StartsWith(wxT("http://"))) { wxLaunchDefaultBrowser(link.GetHref()); -} - -CViewNotices::CViewNotices() -{} - - -CViewNotices::CViewNotices(wxNotebook* pNotebook) : - CBOINCBaseView(pNotebook) -{ - CTaskItemGroup* pGroup = NULL; - CTaskItem* pItem = NULL; - - // - // Setup View - // - wxFlexGridSizer* itemFlexGridSizer = new wxFlexGridSizer(2, 0, 0); - wxASSERT(itemFlexGridSizer); - - itemFlexGridSizer->AddGrowableRow(0); - itemFlexGridSizer->AddGrowableCol(1); - - m_pTaskPane = new CBOINCTaskCtrl(this, ID_TASK_NOTIFICATIONSVIEW, DEFAULT_TASK_FLAGS); - wxASSERT(m_pTaskPane); - - m_pHtmlPane = new HtmlWindow(this, ID_HTML_NOTIFICATIONSVIEW, wxDefaultPosition, wxDefaultSize, wxHW_SCROLLBAR_AUTO | wxHSCROLL | wxVSCROLL); - wxASSERT(m_pHtmlPane); - - itemFlexGridSizer->Add(m_pTaskPane, 1, wxGROW|wxALL, 1); - itemFlexGridSizer->Add(m_pHtmlPane, 1, wxGROW|wxALL, 1); - - SetSizer(itemFlexGridSizer); - - Layout(); - - m_iOldNoticeCount = 0; - - pGroup = new CTaskItemGroup(_("News Feeds")); - m_TaskGroups.push_back(pGroup); - - pItem = new CTaskItem( - _("BOINC"), - _("Display the latest news about BOINC"), - ID_TASK_NEWS_BOINC - ); - pGroup->m_Tasks.push_back(pItem); - - m_TaskGroups.push_back(pGroup); - - // Create Task Pane Items - m_pTaskPane->UpdateControls(); -} - - -CViewNotices::~CViewNotices() { -} - - -wxString& CViewNotices::GetViewName() { - static wxString strViewName(wxT("Notices")); - return strViewName; -} - - -wxString& CViewNotices::GetViewDisplayName() { - static wxString strViewName(_("Notices")); - return strViewName; -} - - -const char** CViewNotices::GetViewIcon() { - return mess_xpm; -} - - -const int CViewNotices::GetViewRefreshRate() { - return 10; -} - -const int CViewNotices::GetViewCurrentViewPage() { - return VW_NOTIF; -} - - -bool CViewNotices::OnSaveState(wxConfigBase* WXUNUSED(pConfig)) { - return true; -} - - -bool CViewNotices::OnRestoreState(wxConfigBase* WXUNUSED(pConfig)) { - return true; -} - - -void CViewNotices::OnListRender(wxTimerEvent& WXUNUSED(event)) { - wxLogTrace(wxT("Function Start/End"), wxT("CViewNotices::OnListRender - Function Begin")); - - CMainDocument* pDoc = wxGetApp().GetDocument(); - wxString strHTML; - wxString strItems; - wxString strTemp; - wxDateTime dtBuffer; - int n = 0; - unsigned int i = 0; - static bool s_bInProgress = false; - - wxASSERT(pDoc); - wxASSERT(wxDynamicCast(pDoc, CMainDocument)); - wxASSERT(m_pHtmlPane); - - if (s_bInProgress) return; - s_bInProgress = true; - - n = pDoc->GetNoticeCount(); - if (n == -1) { - strItems += _("Retrieving notices..."); - } else { - // Update display only if there is something new - if (n == m_iOldNoticeCount) { - goto done; - } - m_iOldNoticeCount = n; - - // Pre-allocate buffer size so string concat is much faster - strItems.Alloc(4096*n); - - for (i=0; i < (unsigned int)n; i++) { - NOTICE* np = pDoc->notice(i); - if (!np) continue; - char tbuf[512]; - if (strlen(np->title)) { - sprintf(tbuf, "%s
", np->title); - strItems += wxString(tbuf, wxConvUTF8); - - } - strItems += wxString(np->description.c_str(), wxConvUTF8); - strItems += wxT("
"); - dtBuffer.Set((time_t)np->arrival_time); - strItems += dtBuffer.Format(); - if (strlen(np->link)) { - sprintf(tbuf, " · more... ", np->link); - strItems += wxString(tbuf, wxConvUTF8); - } - strItems += wxT("
\n"); - } - } - strHTML = wxT("\n\n"); - strHTML += strItems; - //strHTML += wxT("
\n"); - strHTML += wxT("\n\n"); - m_pHtmlPane->SetFonts(wxT("Sans Serif"), wxT("Courier"), 0); - m_pHtmlPane->SetPage(strHTML); - -done: - s_bInProgress = false; - - wxLogTrace(wxT("Function Start/End"), wxT("CViewNotices::OnListRender - Function End")); -} + } +} + diff --git a/clientgui/ViewNotices.h b/clientgui/ViewNotices.h index fe46efb500..27ae513705 100644 --- a/clientgui/ViewNotices.h +++ b/clientgui/ViewNotices.h @@ -25,16 +25,7 @@ #include "BOINCBaseView.h" -// variant of wxHtmlWindow that directs links to default browser -// -class HtmlWindow: public wxHtmlWindow { -public: - HtmlWindow(wxWindow *parent, wxWindowID id = -1, - const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize, - long style = wxHW_SCROLLBAR_AUTO, const wxString& name = _T("htmlWindow")); - void OnLinkClicked(const wxHtmlLinkInfo& link); -}; - + class CViewNotices : public CBOINCBaseView { DECLARE_DYNAMIC_CLASS( CViewNotices ) @@ -51,13 +42,14 @@ public: virtual const int GetViewCurrentViewPage(); protected: - HtmlWindow* m_pHtmlPane; + wxHtmlWindow* m_pHtmlPane; int m_iOldNoticeCount; virtual bool OnSaveState( wxConfigBase* pConfig ); virtual bool OnRestoreState( wxConfigBase* pConfig ); virtual void OnListRender( wxTimerEvent& event ); + void OnLinkClicked( wxHtmlLinkEvent& event ); DECLARE_EVENT_TABLE() };