boinc/clientgui/sg_DlgMessages.cpp

306 lines
8.4 KiB
C++

// Berkeley Open Infrastructure for Network Computing
// http://boinc.berkeley.edu
// Copyright (C) 2005 University of California
//
// This is free software; you can redistribute it and/or
// modify it under the terms of the GNU Lesser General Public
// License as published by the Free Software Foundation;
// either version 2.1 of the License, or (at your option) any later version.
//
// This software is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
// See the GNU Lesser General Public License for more details.
//
// To view the GNU Lesser General Public License visit
// http://www.gnu.org/copyleft/lesser.html
// or write to the Free Software Foundation, Inc.,
// 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
#if defined(__GNUG__) && !defined(__APPLE__)
#pragma implementation "sg_DlgMessages.h"
#endif
#include "stdwx.h"
#include "common_defs.h"
#include "diagnostics.h"
#include "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 "sg_DlgMessages.h"
#include "sg_SGUIListControl.h"
#include "Events.h"
enum
{
ID_CLOSEBUTTON = 20001,
};
#define COLUMN_PROJECT 0
#define COLUMN_TIME 1
#define COLUMN_MESSAGE 2
BEGIN_EVENT_TABLE( CDlgMessages,wxDialog)
EVT_BUTTON(-1,CDlgMessages::OnBtnClick)
EVT_TIMER(ID_REFRESHMESSAGESTIMER, CDlgMessages::OnListRender)
EVT_ERASE_BACKGROUND(CDlgMessages::OnEraseBackground)
END_EVENT_TABLE()
// end events
CDlgMessages::CDlgMessages(wxWindow* parent, wxWindowID id, const wxString& title, const wxPoint& pos, const wxSize& size, long style, const wxString& name)
{
m_bProcessingListRenderEvent = false;
Create(parent,id,title,pos,size,style,name);
if((pos==wxDefaultPosition)&&(size==wxDefaultSize)){
SetSize(0,0,545,450);
}
if((pos!=wxDefaultPosition)&&(size==wxDefaultSize)){
SetSize(545,450);
}
m_pList = new CSGUIListCtrl(this, ID_SIMPLE_MESSAGESVIEW, DEFAULT_LIST_MULTI_SEL_FLAGS);
wxASSERT(m_pList);
// Create List Pane Items
m_pList->InsertColumn(COLUMN_PROJECT, _("Project"), wxLIST_FORMAT_LEFT, 109);
m_pList->InsertColumn(COLUMN_TIME, _("Time"), wxLIST_FORMAT_LEFT, 130);
m_pList->InsertColumn(COLUMN_MESSAGE, _("Message"), wxLIST_FORMAT_LEFT, 250);
m_pMessageInfoAttr = new wxListItemAttr(*wxBLACK, *wxWHITE, wxNullFont);
m_pMessageErrorAttr = new wxListItemAttr(*wxRED, *wxWHITE, wxNullFont);
initBefore();
//Create dialog
CreateDialog();
initAfter();
}
CDlgMessages::~CDlgMessages()
{
if (m_pRefreshMessagesTimer) {
m_pRefreshMessagesTimer->Stop();
delete m_pRefreshMessagesTimer;
}
if (m_pMessageInfoAttr) {
delete m_pMessageInfoAttr;
m_pMessageInfoAttr = NULL;
}
if (m_pMessageErrorAttr) {
delete m_pMessageErrorAttr;
m_pMessageErrorAttr = NULL;
}
}
void CDlgMessages::CreateDialog()
{
CSkinSimple* pSkinSimple = wxGetApp().GetSkinManager()->GetSimple();
wxASSERT(pSkinSimple);
wxASSERT(wxDynamicCast(pSkinSimple, CSkinSimple));
//Set Background color
SetBackgroundColour(*pSkinSimple->GetBackgroundImage()->GetBackgroundColor());
wxToolTip *ttClose = new wxToolTip(_("Close message window"));
btnClose=new wxBitmapButton(this,ID_CLOSEBUTTON,*(pSkinSimple->GetCloseButton()->GetBitmap()),wxPoint(472,398),wxSize(57,16),wxNO_BORDER);
btnClose->SetBitmapSelected(*(pSkinSimple->GetCloseButton()->GetBitmapClicked()));
btnClose->SetToolTip(ttClose);
Refresh();
}
void CDlgMessages::VwXDrawBackImg(wxEraseEvent& event,wxWindow *win,wxBitmap* bitMap,int opz){
event.Skip(false);wxDC *dc;
dc=event.GetDC();
dc->SetBackground(wxBrush(win->GetBackgroundColour(),wxSOLID));
dc->Clear();
switch (opz) {
case 0:{
dc->DrawBitmap(*bitMap, 0, 0);
break;}
case 1:{
wxRect rec=win->GetClientRect();
rec.SetLeft((rec.GetWidth()-bitMap->GetWidth()) / 2);
rec.SetTop ((rec.GetHeight()-bitMap->GetHeight()) / 2);
dc->DrawBitmap(*bitMap,rec.GetLeft(),rec.GetTop(),0);
break;}
case 2:{
wxRect rec=win->GetClientRect();
for(int y=0;y < rec.GetHeight();y+=bitMap->GetHeight()){
for(int x=0;x < rec.GetWidth();x+=bitMap->GetWidth()){
dc->DrawBitmap(*bitMap,x,y,0);
}
}
break;}
}
}
void CDlgMessages::OnEraseBackground(wxEraseEvent& event){
CSkinSimple* pSkinSimple = wxGetApp().GetSkinManager()->GetSimple();
wxASSERT(pSkinSimple);
wxASSERT(wxDynamicCast(pSkinSimple, CSkinSimple));
wxObject *m_wxWin = event.GetEventObject();
if(m_wxWin==this){
event.Skip(true);
VwXDrawBackImg(
event,
this,
pSkinSimple->GetMessagesDialogBackgroundImage()->GetBitmap(),
0
);
VwXEvOnEraseBackground(event) ;
return;
}
event.Skip(true);
}
void CDlgMessages::OnBtnClick(wxCommandEvent& /*event*/){ //init function
EndModal(wxID_CANCEL);
} //end function
void CDlgMessages::VwXEvOnEraseBackground(wxEraseEvent& WXUNUSED(event)){ //init function
} //end function
void CDlgMessages::initBefore(){
}
void CDlgMessages::initAfter(){
//add your code here
Centre();
//set polling timer for interface
m_pRefreshMessagesTimer = new wxTimer(this, ID_REFRESHMESSAGESTIMER);
wxASSERT(m_pRefreshMessagesTimer);
m_pRefreshMessagesTimer->Start(1000);
}
wxInt32 CDlgMessages::GetDocCount() {
return wxGetApp().GetDocument()->GetMessageCount();
}
void CDlgMessages::OnListRender (wxTimerEvent& event) {
if (!m_bProcessingListRenderEvent) {
m_bProcessingListRenderEvent = true;
wxASSERT(m_pList);
wxInt32 iDocCount = GetDocCount();
if (0 >= iDocCount) {
m_pList->DeleteAllItems();
} else {
if (m_iPreviousDocCount != iDocCount)
m_pList->SetItemCount(iDocCount);
}
if ((iDocCount) && (_EnsureLastItemVisible()) && (m_iPreviousDocCount != iDocCount)) {
m_pList->EnsureVisible(iDocCount - 1);
}
if (m_iPreviousDocCount != iDocCount) {
m_iPreviousDocCount = iDocCount;
}
m_bProcessingListRenderEvent = false;
}
event.Skip();
}
wxString CDlgMessages::OnListGetItemText(long item, long column) const {
wxString strBuffer = wxEmptyString;
switch(column) {
case COLUMN_PROJECT:
FormatProjectName(item, strBuffer);
break;
case COLUMN_TIME:
FormatTime(item, strBuffer);
break;
case COLUMN_MESSAGE:
FormatMessage(item, strBuffer);
break;
}
return strBuffer;
}
wxListItemAttr* CDlgMessages::OnListGetItemAttr(long item) const {
wxListItemAttr* pAttribute = NULL;
wxString strBuffer = wxEmptyString;
FormatPriority(item, strBuffer);
if (wxT("E") == strBuffer) {
pAttribute = m_pMessageErrorAttr;
} else {
pAttribute = m_pMessageInfoAttr;
}
return pAttribute;
}
bool CDlgMessages::_EnsureLastItemVisible() {
return EnsureLastItemVisible();
}
bool CDlgMessages::EnsureLastItemVisible() {
return true;
}
wxInt32 CDlgMessages::FormatProjectName(wxInt32 item, wxString& strBuffer) const {
MESSAGE* message = wxGetApp().GetDocument()->message(item);
if (message) {
strBuffer = wxString(message->project.c_str(), wxConvUTF8);
}
return 0;
}
wxInt32 CDlgMessages::FormatPriority(wxInt32 item, wxString& strBuffer) const {
MESSAGE* message = wxGetApp().GetDocument()->message(item);
if (message) {
switch(message->priority) {
case MSG_INFO:
strBuffer = wxT("I");
break;
default:
strBuffer = wxT("E");
break;
}
}
return 0;
}
wxInt32 CDlgMessages::FormatTime(wxInt32 item, wxString& strBuffer) const {
wxDateTime dtBuffer;
MESSAGE* message = wxGetApp().GetDocument()->message(item);
if (message) {
dtBuffer.Set((time_t)message->timestamp);
strBuffer = dtBuffer.Format();
}
return 0;
}
wxInt32 CDlgMessages::FormatMessage(wxInt32 item, wxString& strBuffer) const {
MESSAGE* message = wxGetApp().GetDocument()->message(item);
if (message) {
strBuffer = wxString(message->body.c_str(), wxConvUTF8);
}
strBuffer.Replace(wxT("\n"), wxT(""), true);
return 0;
}