3
* $Id: statusbarprogreso.cpp 3526 2011-03-16 19:56:19Z carlos $
6
* Copyright 2008-10 MetaEmotion S.L. All rights reserved.
7
* http://ginkgo-cadx.com
9
* This file is licensed under LGPL v3 license.
10
* See License.txt for details
15
#include <wx/animate.h>
16
#include <wx/mstream.h>
18
#include <wx/msgdlg.h>
19
#include <wx/statbmp.h>
20
#include <wx/thread.h>
21
#include <wx/ginkgostyle/ginkgostyle.h>
22
#include "statusbarprogreso.h"
24
#include <resources/ginkgoresourcemanager.h>
26
#include <main/controllers/controladoreventos.h>
27
#include <main/controllers/controladorvistas.h>
28
#include <eventos/eventosginkgo.h>
31
IMPLEMENT_DYNAMIC_CLASS(EventoMensajesUsuarioAsync, wxEvent)
38
GNC::GUI::StatusBarProgreso::StatusBarProgreso( wxWindow* pPadre, wxWindow* pPadrePanel, bool listenMessages, wxWindowID id, long style) : wxStatusBar(pPadre, id, style)
40
m_pPanelTareas = new PanelTareasBase(pPadrePanel);
41
m_pPanelTareas->Show(false);
43
SetFieldsCount(Field_Max); //uno para el texto y el otro para lo q yo quiera
44
static const int widths[Field_Max] = { -1, 32, 250, 150};
45
SetStatusWidths(Field_Max, widths);
48
m_pMensajeTarea = new wxStaticText(this,wxID_ANY,wxT(""), wxDefaultPosition, wxSize(250, -1));
49
m_pMensajeTarea->Connect(wxEVT_LEFT_DOWN, wxMouseEventHandler( StatusBarProgreso::OnMostrarOcultarDialogoProgreso),NULL,this);
51
//botoncico de progreso
52
m_pIconoProgreso = new wxAnimationCtrl(this,wxID_ANY,GinkgoResourcesManager::BarraProgreso::GetIcoLoading());
53
m_pIconoProgreso->Hide();
55
m_pProgresoTarea = new wxGauge(this, wxID_ANY, 100);
56
m_pProgresoTarea->Hide();
58
m_pIconoParado = new wxStaticBitmap(this,wxID_ANY,GinkgoResourcesManager::BarraProgreso::GetIcoStopped());
59
m_pIconoParado->Show(true);
63
//escuchamos el evento de mensajes
65
GNC::GCS::Eventos::EventoMensajes evt(NULL);
66
GNC::GCS::ControladorEventos::Instance()->Registrar(this,evt);
69
wxSizeEvent event(pPadre->GetSize());
73
this->Connect(wxEVT_SIZE,wxSizeEventHandler(StatusBarProgreso::OnSize),NULL,this);
74
this->GetParent()->Connect(wxEVT_MOVE,wxMoveEventHandler(StatusBarProgreso::OnMove),NULL,this);
75
this->Connect(wxEVT_MENSAJES_USUARIO_ASYNC, EventoMensajesUsuarioAsyncHandler(StatusBarProgreso::OnMensajeUsuario), NULL, this);
78
GNC::GUI::StatusBarProgreso::~StatusBarProgreso()
80
m_pMensajeTarea->Disconnect(wxEVT_LEFT_DOWN, wxMouseEventHandler( StatusBarProgreso::OnMostrarOcultarDialogoProgreso),NULL,this);
82
this->Disconnect(wxEVT_MENSAJES_USUARIO_ASYNC, EventoMensajesUsuarioAsyncHandler(StatusBarProgreso::OnMensajeUsuario), NULL, this);
83
this->GetParent()->Disconnect(wxEVT_MOVE,wxMoveEventHandler(StatusBarProgreso::OnMove),NULL,this);
84
this->Disconnect(wxEVT_SIZE,wxSizeEventHandler(StatusBarProgreso::OnSize),NULL,this);
86
m_pIconoProgreso->Destroy();
87
m_pIconoProgreso = NULL;
88
m_pIconoParado->Destroy();
89
m_pIconoParado = NULL;
90
m_pProgresoTarea->Destroy();
91
m_pProgresoTarea = NULL;
94
void GNC::GUI::StatusBarProgreso::InsertarTarea(long taskId, const std::string& text) {
97
MapaTareasType::iterator it = m_MapaTareas.find(taskId);
98
if (it == m_MapaTareas.end()) {
99
m_pPanelTareas->Freeze();
101
PanelTarea* pt = new PanelTarea(m_pPanelTareas, taskId);
102
wxString str = wxString::FromUTF8(text.c_str());
103
pt->m_pTareaLabel->SetLabel(str);
104
pt->m_pTareaProgreso->SetValue(0);
105
m_MapaTareas[taskId] = pt;
107
m_pPanelTareas->m_pSizerTareas->Add(pt, 0, wxEXPAND | wxDOWN, 10);
108
m_pPanelTareas->Layout();
110
ActualizarInterfaz();
111
m_pPanelTareas->Thaw();
115
void GNC::GUI::StatusBarProgreso::EliminarTarea(long taskId) {
116
PanelTarea* pt = NULL;
117
MapaTareasType::iterator it = m_MapaTareas.find(taskId);
118
if (it != m_MapaTareas.end()) {
119
m_pPanelTareas->Freeze();
124
m_pPanelTareas->m_pSizerTareas->Detach(pt);
126
m_pPanelTareas->Layout();
129
m_MapaTareas.erase(it);
130
ActualizarInterfaz();
131
m_pPanelTareas->Thaw();
136
void GNC::GUI::StatusBarProgreso::SetProgresoTarea(long taskId, float normalizedProgress, const std::string& text) {
138
MapaTareasType::iterator it = m_MapaTareas.find(taskId);
140
if (it != m_MapaTareas.end()) {
141
m_pPanelTareas->Freeze();
142
PanelTarea* pt = (*it).second;
144
int val = std::max<int>(0, std::min<int>(100, (int)(normalizedProgress * 100.0f)));
145
wxString str = wxString::FromUTF8(text.c_str());
146
pt->m_pTareaLabel->SetLabel(str);
147
pt->m_pTareaProgreso->SetValue(val);
150
ActualizarInterfaz();
151
m_pPanelTareas->Thaw();
155
void GNC::GUI::StatusBarProgreso::ActualizarInterfaz()
157
if(m_MapaTareas.size() == 0){
158
if(m_pIconoProgreso->IsPlaying()){
159
m_pIconoProgreso->Stop();
161
m_pIconoProgreso->Hide();
162
m_pProgresoTarea->Hide();
163
m_pIconoParado->Show(true);
164
//SetStatusText(wxT(""),Field_TextoTarea);
165
m_pMensajeTarea->SetLabel(_("0 running tasks."));
167
if (!m_pPanelTareas->m_pSinTareas->IsShown()) {
168
m_pPanelTareas->m_pSinTareas->Show(true);
169
m_pPanelTareas->Layout();
172
if (m_pPanelTareas->m_pSinTareas->IsShown()) {
173
m_pPanelTareas->m_pSinTareas->Show(false);
174
m_pPanelTareas->Layout();
176
m_pIconoParado->Hide();
177
if(!m_pIconoProgreso->IsPlaying()) {
178
m_pIconoProgreso->Show();
179
m_pIconoProgreso->Play();
181
if(m_MapaTareas.size() == 1) {
182
m_pMensajeTarea->SetLabel((*m_MapaTareas.begin()).second->m_pTareaLabel->GetLabel());
183
m_pProgresoTarea->SetValue((*m_MapaTareas.begin()).second->m_pTareaProgreso->GetValue());
184
if (!m_pProgresoTarea->IsShown()) {
185
m_pProgresoTarea->Show();
188
m_pMensajeTarea->SetLabel(wxString::Format(_("There are %d pending tasks"),m_MapaTareas.size()));
189
if (m_pProgresoTarea->IsShown()) {
190
m_pProgresoTarea->Hide();
197
void GNC::GUI::StatusBarProgreso::OnMostrarOcultarDialogoProgreso(wxMouseEvent& )
199
if (GNC::GCS::ControladorVistas::Instance()->EsVisible(m_pPanelTareas)) {
200
GNC::GCS::ControladorVistas::Instance()->OcultarPanel(m_pPanelTareas);
202
wxPoint esquinaInferiorDerecha = GetParent()->GetPosition();
203
esquinaInferiorDerecha.x += GetParent()->GetSize().x;
204
esquinaInferiorDerecha.y += GetParent()->GetSize().y;
205
wxPoint posicionDialogo(0,0);
206
wxSize mejorSizeDialogo(400,170);
207
#if defined (_WINDOWS)
208
posicionDialogo.x = esquinaInferiorDerecha.x - mejorSizeDialogo.x - 5;
209
posicionDialogo.y = esquinaInferiorDerecha.y - mejorSizeDialogo.y - 5 - GetSize().y;
211
posicionDialogo.x = esquinaInferiorDerecha.x - mejorSizeDialogo.x;
212
posicionDialogo.y = esquinaInferiorDerecha.y - mejorSizeDialogo.y;
214
GNC::GCS::ControladorVistas::Instance()->MostrarPanelFlotante(m_pPanelTareas, posicionDialogo.x, posicionDialogo.y);
219
void GNC::GUI::StatusBarProgreso::OnSize(wxSizeEvent& event)
223
GetFieldRect(Field_GifProgreso, rect);
224
wxSize size = m_pIconoProgreso->GetSize();
226
m_pIconoProgreso->Move(rect.x + (rect.width - size.x) / 2,
227
rect.y + (rect.height - size.y) / 2);
228
m_pIconoParado->Move(rect.x + (rect.width - size.x) / 2,
229
rect.y + (rect.height - size.y) / 2);
231
GetFieldRect(Field_ProgresoTarea, rect);
233
wxPoint esquinaInferiorDerecha = GetParent()->GetPosition();
234
esquinaInferiorDerecha.x += GetParent()->GetSize().x;
235
esquinaInferiorDerecha.y += GetParent()->GetSize().y;
237
m_pProgresoTarea->SetSize(rect.x + 2, rect.y + 2, rect.width - 4, rect.height - 4);
239
GetFieldRect(Field_TextoTarea, rect);
240
#if !defined(__WXOSX__)
241
m_pMensajeTarea->SetSize(rect.x + 2, rect.y + 2, rect.width - 4, rect.height - 4);
243
m_pMensajeTarea->SetSize(rect.x , rect.y, rect.width, rect.height);
250
void GNC::GUI::StatusBarProgreso::OnMove(wxMoveEvent& event)
252
wxPoint esquinaInferiorDerecha = GetParent()->GetPosition();
253
esquinaInferiorDerecha.x += GetParent()->GetSize().x;
254
esquinaInferiorDerecha.y += GetParent()->GetSize().y;
259
void GNC::GUI::StatusBarProgreso::OnMensajeUsuario(EventoMensajesUsuarioAsync& event )
261
switch (event.GetTipo()) {
262
case EventoMensajesUsuarioAsync::StatusBar:
264
SetStatusText(event.GetTexto());
267
case EventoMensajesUsuarioAsync::PopUp:
268
switch(event.GetGravedad()) {
269
case EventoMensajesUsuarioAsync::Error:
270
wxMessageBox(event.GetTexto(), _("Error"),wxICON_ERROR);
272
case EventoMensajesUsuarioAsync::Aviso:
273
wxMessageBox(event.GetTexto(), _("Warning"),wxICON_WARNING);
275
case EventoMensajesUsuarioAsync::Informacion:
276
wxMessageBox(event.GetTexto(), _("Info"),wxICON_INFORMATION);
279
wxMessageBox(event.GetTexto(), _("Info"),wxICON_INFORMATION);
284
wxMessageBox(event.GetTexto(), _("Info"),wxICON_INFORMATION);
290
void GNC::GUI::StatusBarProgreso::PreProcesarEvento(GNC::GCS::Eventos::IEvento* /*evt*/, GNC::GCS::IControladorEventos::TipoListaPunterosEventos& /*lista*/)
295
void GNC::GUI::StatusBarProgreso::ProcesarEvento(GNC::GCS::Eventos::IEvento *evt)
297
switch (evt->GetCodigoEvento()) {
298
case ginkgoEVT_Core_MensajesUsuario:
300
GNC::GCS::Eventos::EventoMensajes* pEvt = dynamic_cast<GNC::GCS::Eventos::EventoMensajes*>(evt);
302
switch(pEvt->GetTipo()) {
303
case GNC::GCS::Eventos::EventoMensajes::StatusMessage :
305
switch (pEvt->GetGravedad()) {
306
case GNC::GCS::Eventos::EventoMensajes::Error:
308
EventoMensajesUsuarioAsync event(pEvt->GetMensaje(), EventoMensajesUsuarioAsync::StatusBar, EventoMensajesUsuarioAsync::Error);
309
this->AddPendingEvent(event);
312
case GNC::GCS::Eventos::EventoMensajes::Aviso:
314
EventoMensajesUsuarioAsync event(pEvt->GetMensaje(), EventoMensajesUsuarioAsync::StatusBar,EventoMensajesUsuarioAsync::Aviso);
315
this->AddPendingEvent(event);
318
case GNC::GCS::Eventos::EventoMensajes::Informacion:
320
EventoMensajesUsuarioAsync event(pEvt->GetMensaje(), EventoMensajesUsuarioAsync::StatusBar, EventoMensajesUsuarioAsync::Informacion);
321
this->AddPendingEvent(event);
326
EventoMensajesUsuarioAsync event(pEvt->GetMensaje(), EventoMensajesUsuarioAsync::StatusBar, EventoMensajesUsuarioAsync::Informacion);
327
this->AddPendingEvent(event);
333
case GNC::GCS::Eventos::EventoMensajes::PopUpMessage :
335
switch (pEvt->GetGravedad()) {
336
case GNC::GCS::Eventos::EventoMensajes::Error:
338
EventoMensajesUsuarioAsync event(pEvt->GetMensaje(),EventoMensajesUsuarioAsync::PopUp, EventoMensajesUsuarioAsync::Error);
339
this->AddPendingEvent(event);
342
case GNC::GCS::Eventos::EventoMensajes::Aviso:
344
EventoMensajesUsuarioAsync event(pEvt->GetMensaje(),EventoMensajesUsuarioAsync::PopUp, EventoMensajesUsuarioAsync::Aviso);
345
this->AddPendingEvent(event);
348
case GNC::GCS::Eventos::EventoMensajes::Informacion:
350
EventoMensajesUsuarioAsync event(pEvt->GetMensaje(),EventoMensajesUsuarioAsync::PopUp, EventoMensajesUsuarioAsync::Informacion);
351
this->AddPendingEvent(event);
356
EventoMensajesUsuarioAsync event(pEvt->GetMensaje(),EventoMensajesUsuarioAsync::PopUp, EventoMensajesUsuarioAsync::Informacion);
357
this->AddPendingEvent(event);