3
* $Id: dialogoadquisicion.cpp 3763 2011-04-25 12:07:55Z 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
14
//#define _GINKGO_TRACE
16
#include <api/globals.h>
17
#include <api/ilock.h>
21
#include <wx/animate.h>
22
#include <wx/imaglist.h>
24
#include <wx/config.h>
25
#include <wx/ginkgostyle/ginkgostyle.h>
26
#include <wx/propiedades/wxpropiedades.h>
28
#include "dialogoadquisicion.h"
30
#include <resources/ginkgoresourcemanager.h>
31
#include <main/entorno.h>
32
#include <main/controllers/controladorcomandos.h>
33
#include <main/controllers/controladorpermisos.h>
34
#include <main/controllers/controladorlog.h>
35
#include <main/controllers/controladorhistorial.h>
36
#include <main/controllers/controladoreventos.h>
37
#include <eventos/eventosginkgo.h>
38
#include <api/icontextoestudio.h>
40
#define SIZE_ICONOS 16
42
#define ICONO_ESTUDIO 0
44
#define ICONO_HOMBRE 2
47
#define SIZE_ICONOS 16
50
#define COL_PACS_DESCRIPTION 1
51
#define COL_PACS_MODE 2
70
class DescargasGridTable;
72
class Descarga : public GNC::GCS::IObservador
75
Descarga(DescargasGridTable* pGridTable, const std::string& s, const std::string& pd,const std::string& des, const std::string& uid, const std::string& mod, bool seriesMode)
77
m_pGridTable = pGridTable;
79
PatientDescription = pd;
83
SeriesMode = seriesMode;
87
GNC::GCS::ControladorEventos::Instance()->Registrar(this, GNC::GCS::Eventos::EventoProgresoComando());
94
GNC::Entorno::Instance()->GetControladorComandos()->AbortarComandosDeOwner(this);
95
GNC::GCS::ControladorEventos::Instance()->DesRegistrar(this, GNC::GCS::Eventos::EventoProgresoComando());
101
std::string PatientDescription;
102
std::string Description;
103
std::string Modality;
111
GADAPI::ComandoPACS* m_pComando;
116
if (StatusId == Iniciada) {
119
if (m_pComando != NULL) {
120
GNC::GCS::ControladorComandos::Instance()->AbortarComando(m_pComando, false);
124
GADAPI::ComandoPACSParams * pParams;
126
pParams = new GADAPI::ComandoPACSParams(Server, UID, GADAPI::ComandoPACSParams::TA_Serie);
128
pParams = new GADAPI::ComandoPACSParams(Server, UID, GADAPI::ComandoPACSParams::TA_Estudio);
131
m_pComando = new GADAPI::ComandoPACS(pParams);
132
GNC::Entorno::Instance()->GetControladorComandos()->ProcessAsync(_Std("Downloading from PACS..."), m_pComando, this);
134
Status = _Std("Starting...");
140
if (StatusId == Parada || StatusId == Terminada || StatusId == Erronea) {
146
Status = _Std("Stopped");
148
if (m_pComando != NULL) {
149
GNC::GCS::ControladorComandos::Instance()->AbortarComando(m_pComando, false);
155
virtual void ProcesarEvento(GNC::GCS::Eventos::IEvento *evt);
157
void OnProgresoInicio();
158
void OnProgresoProgreso(float progresoNormalizado, const std::string& texto);
159
void OnProgresoFinalizacion();
161
DescargasGridTable* m_pGridTable;
163
friend class DescargasGridTable;
166
class ProgresoCellRenderer : public wxGridCellFloatRenderer
170
ProgresoCellRenderer(DescargasGridTable* table)
172
m_pGridTable = table;
175
~ProgresoCellRenderer()
180
virtual void Draw(wxGrid& grid,
181
wxGridCellAttr& attr,
183
const wxRect& cellRect,
187
virtual wxGridCellRenderer* Clone () const
189
return new ProgresoCellRenderer(m_pGridTable);
193
DescargasGridTable* m_pGridTable;
196
class DescargasGridTable : public wxGridTableBase
200
GNC::GUI::DialogoAdquisicion* pDlg;
202
std::vector<Descarga*> m_Descargas;
204
DescargasGridTable(GNC::GUI::DialogoAdquisicion* pParent)
209
~DescargasGridTable()
211
for(std::vector<Descarga*>::iterator it = m_Descargas.begin(); it!= m_Descargas.end(); ++it) {
217
virtual int GetNumberRows()
219
return m_Descargas.size();
221
virtual int GetNumberCols()
226
int FindDescarga(const std::string& uid)
229
for (unsigned int i = 0; pos == -1 && i < m_Descargas.size(); i++) {
230
if (m_Descargas[i]->UID == uid) {
237
virtual bool AddDescarga(const std::string& s, const std::string& pd,const std::string& sd, const std::string& su, const std::string& sm, bool initIfStopped, bool seriesMode)
241
if (s.empty() || su.empty()) {
242
LOG_ERROR("GUI/Adquisition", "Empty mandatory values (serverId | serieInstanceUID) while adding serie to download queue");
245
int pos = FindDescarga(su);
247
if (m_Descargas[pos]->StatusId != Descargas::Iniciada && initIfStopped) {
248
GetView()->SelectRow(pos);
249
IniciarDescarga(pos);
257
m_Descargas.push_back(new Descarga(this ,s, pd, sd, su, sm, seriesMode));
258
wxGridTableMessage msg( this, wxGRIDTABLE_NOTIFY_ROWS_INSERTED,
259
m_Descargas.size() - 1, 1);
261
GetView()->ProcessTableMessage( msg );
262
pos = FindDescarga(su);
263
GetView()->SelectRow(pos);
265
IniciarDescarga(pos);
270
virtual void RemoveDescarga(Descarga* d)
272
RemoveDescarga(FindDescarga(d->UID));
275
virtual void RemoveDescarga(const std::string& uid)
277
RemoveDescarga(FindDescarga(uid));
281
virtual bool DeleteRows( size_t pos = 0, size_t numRows = 1 )
283
bool removed = false;
284
for (unsigned int i = 0; i < numRows; i++) {
291
virtual void RemoveDescarga(int pos)
297
delete m_Descargas[pos];
298
m_Descargas.erase(m_Descargas.begin() + pos);
299
wxGridTableMessage msg( this, wxGRIDTABLE_NOTIFY_ROWS_DELETED, pos, 1);
301
GetView()->ProcessTableMessage( msg );
302
pDlg->UpdateButtons();
307
virtual void SetProgresoDescarga(int pos, float p)
309
if (pos >= 0 && pos < (int)m_Descargas.size()) {
310
Descarga* d = m_Descargas[pos];
312
wxGridTableMessage msg( this, wxGRIDTABLE_REQUEST_VIEW_GET_VALUES, pos, 1);
314
GetView()->ProcessTableMessage( msg );
320
virtual void SetEstadoDescarga(int pos, const std::string& text)
322
if (pos >= 0 && pos < (int)m_Descargas.size()) {
323
Descarga* d = m_Descargas[pos];
325
wxGridTableMessage msg( this, wxGRIDTABLE_REQUEST_VIEW_GET_VALUES, pos, 1);
327
GetView()->ProcessTableMessage( msg );
333
virtual void IniciarDescarga(int pos)
335
if (pos >= 0 && pos < (int)m_Descargas.size()) {
336
Descarga* d = m_Descargas[pos];
338
wxGridTableMessage msg( this, wxGRIDTABLE_REQUEST_VIEW_GET_VALUES, pos, 1);
340
GetView()->ProcessTableMessage( msg );
341
pDlg->UpdateButtons();
347
virtual void DetenerDescarga(int pos)
349
if (pos >= 0 && pos < (int)m_Descargas.size()) {
350
Descarga* d = m_Descargas[pos];
352
wxGridTableMessage msg( this, wxGRIDTABLE_REQUEST_VIEW_GET_VALUES, pos, 1);
354
GetView()->ProcessTableMessage( msg );
355
pDlg->UpdateButtons();
361
virtual Descarga const * GetDescarga(int i) const
363
if (i < 0 || i > (int) m_Descargas.size()) {
367
return m_Descargas[i];
372
virtual bool IsEmptyCell( int row, int /*col*/ )
374
if (row >= (int)m_Descargas.size()) {
381
virtual wxString GetValue( int row, int col )
383
const Descarga& dr = *(m_Descargas[row]);
387
case Col_PatientInfo:
388
return wxString::FromUTF8( (dr.PatientDescription).c_str() );
390
case Col_Description:
391
return wxString::FromUTF8( (dr.Description).c_str() );
394
return wxString::Format(_T("%f"), 100.0f * dr.Progreso);
397
return wxString::FromUTF8( (dr.Status).c_str() );
400
return wxEmptyString;
402
virtual void SetValue( int /*row*/, int /*col*/, const wxString& /*value*/ )
404
//const Descarga& dr = *(m_Descargas[row]);
408
virtual wxString GetColLabelValue( int col )
412
case Col_PatientInfo:
415
case Col_Description:
416
return _("Description");
419
return _("Progress");
425
wxFAIL_MSG(_("unknown column"));
427
return wxEmptyString;
430
virtual wxString GetTypeName( int /*row*/, int col )
435
case Col_PatientInfo:
436
return wxGRID_VALUE_STRING;
438
case Col_Description:
439
return wxGRID_VALUE_STRING;
442
return wxGRID_VALUE_FLOAT;
445
return wxGRID_VALUE_STRING;
448
wxFAIL_MSG(_("unknown column"));
450
return wxEmptyString;
453
virtual bool CanGetValueAs( int /*row*/, int col, const wxString& typeName )
455
if ( typeName == wxGRID_VALUE_STRING )
459
else if ( typeName == wxGRID_VALUE_FLOAT )
461
if ( col == Col_Progress )
469
virtual bool CanSetValueAs( int row, int col, const wxString& typeName )
471
return CanGetValueAs(row, col, typeName);
474
virtual double GetValueAsDouble( int row, int col )
476
const Descarga& dr = *(m_Descargas[row]);
486
virtual void SetValueAsDouble( int /*row*/, int /*col*/, double /*value*/ )
490
BugsGridData& gd = gs_dataBugsGrid[row];
499
wxFAIL_MSG(_T("unexpected column"));
504
virtual void OnChangeStatusDescarga(const Descarga& des) {
505
int pos = FindDescarga(des.UID);
506
wxArrayInt selectedRows = GetView()->GetSelectedRows();
507
for (wxArrayInt::iterator it = selectedRows.begin(); it != selectedRows.end(); ++it) {
509
pDlg->UpdateButtons();
517
void ProgresoCellRenderer::Draw(wxGrid& grid,
518
wxGridCellAttr& attr,
520
const wxRect& cellRect,
524
wxGridCellRenderer::Draw(grid, attr, dc, cellRect, row, col, isSelected);
526
float progreso = m_pGridTable->GetDescarga(row)->Progreso;
532
dc.SetPen( wxPen( wxColour(58, 143, 255), 1, wxSOLID ) );
533
dc.SetBrush(*wxTRANSPARENT_BRUSH);
534
wxRect cr = cellRect;
536
dc.DrawRectangle(cr.x, cr.y, cr.width, cr.height);
538
cr.width = (int) ( (float)cr.width * progreso );
540
dc.GradientFillLinear(cr, wxColour(224, 237, 255), wxColour(119, 169, 255), wxEAST);
542
SetTextColoursAndFont(grid, attr, dc, isSelected);
543
int func = dc.GetLogicalFunction();
544
dc.SetLogicalFunction(wxXOR);
546
wxCoord tx = 0, ty = 0;
547
wxString str = wxString::Format(wxT("%.02f%%"), 100.0f * progreso);
548
dc.GetTextExtent(str, &tx, &ty, NULL, NULL, NULL);
550
dc.DrawText(str, cellRect.x + (cellRect.width >> 1) - (tx >> 1), cellRect.y + (cellRect.height >> 1) - (ty >> 1) );
551
dc.SetLogicalFunction(func);
555
void Descarga::ProcesarEvento(GNC::GCS::Eventos::IEvento *evt)
557
GNC::GCS::Eventos::EventoProgresoComando* pEvt = dynamic_cast<GNC::GCS::Eventos::EventoProgresoComando*> (evt);
558
if (pEvt == NULL || pEvt->GetComando() == NULL || pEvt->GetComando() != m_pComando) {
561
switch (pEvt->GetTipo()) {
562
case GNC::GCS::Eventos::EventoProgresoComando::TEP_Iniciado:
565
case GNC::GCS::Eventos::EventoProgresoComando::TEP_Progreso:
566
OnProgresoProgreso(pEvt->GetProgresoNormalizado(), pEvt->GetTexto());
568
case GNC::GCS::Eventos::EventoProgresoComando::TEP_Finalizado:
569
OnProgresoFinalizacion();
571
case GNC::GCS::Eventos::EventoProgresoComando::TEP_Unknown:
574
m_pGridTable->OnChangeStatusDescarga(*this);
577
void Descarga::OnProgresoInicio()
579
int did = m_pGridTable->FindDescarga(UID);
580
m_pGridTable->SetEstadoDescarga(did, _Std("Started"));
583
void Descarga::OnProgresoProgreso(float progresoNormalizado, const std::string& texto)
585
int did = m_pGridTable->FindDescarga(UID);
587
m_pGridTable->SetProgresoDescarga(did, progresoNormalizado);
588
m_pGridTable->SetEstadoDescarga(did, texto);
592
void Descarga::OnProgresoFinalizacion()
594
int did = m_pGridTable->FindDescarga(UID);
598
if (!m_pComando->m_pPACSParams->m_pModelo->TieneImagenes()) {
599
std::string errorMsg;
601
if (m_pComando->m_pPACSParams->m_error.size() > 0) {
602
errorMsg = _Std("Error: ") + m_pComando->m_pPACSParams->m_error;
605
errorMsg = _Std("Error: No images were downloaded");
609
m_pGridTable->SetEstadoDescarga(did, errorMsg);
612
Status = _Std("Finished");
613
StatusId = Terminada;
614
m_pGridTable->SetEstadoDescarga(did, _Std("Finished"));
621
//---------------------------------------------------------------------------
623
//---------------HELPER DRAG & DROP ---------
624
class wxDropTargetDescargas: public wxTextDropTarget
627
wxDropTargetDescargas():wxTextDropTarget()
629
SetDefaultAction(wxDragCopy);
632
~wxDropTargetDescargas()
636
virtual bool OnDropText(wxCoord /*x*/, wxCoord /*y*/, const wxString& text)
638
return text == wxT("");
642
GNC::GUI::DialogoAdquisicion* GNC::GUI::DialogoAdquisicion::Instance()
644
if (m_pInstance == NULL) {
645
m_pInstance = new DialogoAdquisicion(GNC::Entorno::Instance()->GetVentanaRaiz());
650
void GNC::GUI::DialogoAdquisicion::FreeInstance()
652
if(m_pInstance!=NULL){
653
m_pInstance->Close();
658
GNC::GUI::DialogoAdquisicion* GNC::GUI::DialogoAdquisicion::m_pInstance = NULL;
661
GNC::GUI::DialogoAdquisicion::DialogoAdquisicion(wxWindow* pParent) : DialogoAdquisicionBase(pParent)
663
m_pComandoPACS = NULL;
664
m_pImageList = new wxImageList(SIZE_ICONOS,SIZE_ICONOS,true);
668
m_pAnimation = new wxAnimationCtrl(m_pPanelPACS,wxID_ANY,GinkgoResourcesManager::BarraProgreso::GetIcoLoading());
669
m_pAnimation->Hide();
670
m_pSizerAnimation->Add(m_pAnimation, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5);
672
m_pBotonIniciarPararTask->Enable(false);
673
m_pBotonDeleteTask->Enable(false);
674
m_pBotonOpenTask->Enable(false);
675
m_AutoAddSeries = false;
676
m_AutoAddSeriesItem = NULL;
678
m_pDescargasGridTable = new Descargas::DescargasGridTable(this);
679
m_pGridDescargas->SetTable(m_pDescargasGridTable, false, wxGrid::wxGridSelectRows);
681
wxGridCellAttr *attrRO = new wxGridCellAttr();
682
wxGridCellAttr *attrPG = new wxGridCellAttr();
684
attrRO->SetReadOnly();
685
attrPG->SetReadOnly();
686
attrPG->SetRenderer(new Descargas::ProgresoCellRenderer(m_pDescargasGridTable));
688
for (int i = 0; i < m_pDescargasGridTable->GetNumberCols(); i++) {
689
if (i != Descargas::Col_Progress) {
690
m_pGridDescargas->SetColAttr(i, attrRO);
693
m_pGridDescargas->SetColAttr(i, attrPG);
696
m_pGridDescargas->SetMargins(0, 0);
697
//m_pGridDescargas->EnableScrolling(false, true);
699
m_pGridDescargas->Connect(wxEVT_GRID_RANGE_SELECT, wxGridRangeSelectEventHandler(DialogoAdquisicion::OnGridSelect), NULL, this);
700
m_pGridDescargas->Connect(wxEVT_GRID_CELL_LEFT_DCLICK, wxGridEventHandler(DialogoAdquisicion::OnGridDClick), NULL, this);
701
m_pGridDescargas->Connect(wxEVT_GRID_CELL_RIGHT_CLICK, wxGridEventHandler(DialogoAdquisicion::OnGridMenu), NULL, this);
702
m_pGridDescargas->Connect(wxEVT_KEY_DOWN, wxKeyEventHandler(DialogoAdquisicion::OnGridKeyDown), NULL, this);
703
m_pGridDescargas->SetDropTarget(new wxDropTargetDescargas());
705
m_pImageList->Add(GinkgoResourcesManager::PanelHistorial::GetIcoEstudio());
706
m_pImageList->Add(GinkgoResourcesManager::PanelHistorial::GetIcoSerie());
707
m_pImageList->Add(GinkgoResourcesManager::PanelHistorial::GetIcoHombre());
708
m_pImageList->Add(GinkgoResourcesManager::PanelHistorial::GetIcoMujer());
709
m_pImageList->Add(GinkgoResourcesManager::PanelHistorial::GetIcoOtro());
710
m_pTreeListResultados->SetImageList(m_pImageList);
712
m_pTreeListResultados->SetMainColumn(0);
713
m_pTreeListResultados->Connect(wxEVT_COMMAND_TREE_SEL_CHANGED, wxTreeEventHandler( DialogoAdquisicion::OnTreeSelChanged ), NULL, this);
714
m_pTreeListResultados->Connect(wxEVT_COMMAND_TREE_ITEM_ACTIVATED, wxTreeEventHandler( DialogoAdquisicion::OnTreeItemActivated ), NULL, this);
715
m_pTreeListResultados->Connect(wxEVT_COMMAND_TREE_ITEM_MENU, wxTreeEventHandler( DialogoAdquisicion::OnTreeItemMenu ), NULL, this);
716
m_pTreeListResultados->Connect(wxEVT_COMMAND_TREE_ITEM_EXPANDED, wxTreeEventHandler( DialogoAdquisicion::OnTreeItemExpanded ), NULL, this);
717
m_pTreeListResultados->Connect(wxEVT_COMMAND_TREE_BEGIN_DRAG, wxTreeEventHandler( DialogoAdquisicion::OnTreeBeginDrag ), NULL, this);
720
m_pPACSList->Connect(wxEVT_COMMAND_TREE_SEL_CHANGED, wxTreeEventHandler( DialogoAdquisicion::OnPACSChanged), NULL, this);
723
for (int i = 0; i < 100; i++) {
724
m_pDescargasGridTable->AddDescarga("server", "patientID", "patientName", "serieDescr", "serieIUID");
725
m_pDescargasGridTable->SetProgresoDescarga( i, ((float) i) / 100.0f);
729
if(GNC::GCS::ControladorPermisos::Instance()->Get("core.pacs.limits", "patient_scope")) {
730
m_HardCodedPatientSearch = true;
732
std::ostringstream os;
734
GNC::GCS::IEntorno::ListaModelosIntegracion& modelos = GNC::Entorno::Instance()->GetModelosIntegracion();
736
for (GNC::GCS::IEntorno::ListaModelosIntegracion::iterator it = modelos.begin(); it != modelos.end(); it++) {
738
GIL::IModeloIntegracion* modelo = *it;
739
GIL::TListaIdentificadores& ids = modelo->Paciente.listaIdentificadores;
741
for (GIL::TListaIdentificadores::iterator it = ids.begin(); it != ids.end(); it++)
754
int tmpIndex = m_pFieldCombo->FindString(_("Id"));
756
m_pFieldCombo->Remove(tmpIndex,tmpIndex);
758
tmpIndex = m_pFieldCombo->FindString(_("Name"));
760
m_pFieldCombo->Remove(tmpIndex,tmpIndex);
763
m_HardCodedPatientId = os.str();
766
int tmpIndex = m_pFieldCombo->FindString(_("Name"));
768
m_pFieldCombo->Insert(_("Name"),0);
770
tmpIndex = m_pFieldCombo->FindString(_("Id"));
772
m_pFieldCombo->Insert(_("Id"),0);
774
m_HardCodedPatientSearch = false;
776
m_pFieldCombo->Select(0);
780
const int MaxModalityNumber=20; // Modificar la constante si se aƱaden o quitan cĆ³digos de modalidad
781
std::string modalidades[MaxModalityNumber] = {"CR","CT","DR","DX","IO","MG","MR","NM","OT","PT","RF","RG","SC","SR","US","XA","XC","ES","ECG","HD"};
782
for(int i = 0; i<MaxModalityNumber; i++) {
783
wxCheckBox* pCheckBox = new wxCheckBox( m_pPanelPACS, wxID_ANY, wxString::FromUTF8(modalidades[i].c_str()), wxDefaultPosition, wxDefaultSize, 0 );
784
m_pModalitySizer->Add( pCheckBox, 0, wxALL, 2 );
785
m_modalitiesList.push_back(pCheckBox);
786
pCheckBox->Connect( wxEVT_KEY_UP, wxKeyEventHandler( DialogoAdquisicion::OnKeyDownFormulario ), NULL, this );
788
m_pPanelPACS->Layout();
789
m_pPanelSearch->Layout();
790
m_notebook1->Layout();
793
m_pModeloDicom = GnkPtr<IModeloDicom>(new IModeloDicom());
797
m_pGridDescargas->EnableDragColSize(true);
799
GNC::GCS::ControladorEventos::Instance()->Registrar(this, GNC::GCS::Eventos::EventoProgresoComando());
802
GNC::GUI::DialogoAdquisicion::~DialogoAdquisicion()
804
GNC::Entorno::Instance()->GetControladorComandos()->AbortarComandosDeOwner(this);
806
m_pDescargasGridTable->Clear();
807
this->m_pTreeListResultados->DeleteRoot();
810
m_pAnimation->Destroy();
813
bool GNC::GUI::DialogoAdquisicion::Show(bool show)
815
//se recarga la lista de servidores pacs
816
m_pPACSList->DeleteRoot();
817
wxTreeItemId root = m_pPACSList->AddRoot(wxT("Root"));
818
for (DicomServerHolder* sl = DicomServerList::Instance()->GetList(); sl != NULL; sl = sl->next) {
819
wxTreeItemId idItem = m_pPACSList->AppendItem(root, wxString::FromUTF8(sl->server.ID.c_str()));
820
std::ostringstream ostr;
821
ostr << sl->server.AET << "@" << sl->server.HostName << ":" << sl->server.Port;
822
m_pPACSList->SetItemText(idItem, COL_PACS_DESCRIPTION, wxString::FromUTF8(ostr.str().c_str()));
823
//mode (series or studies)
824
m_pPACSList->SetItemText(idItem, COL_PACS_MODE, (sl->server.retrieveSeries?wxT("Series"):wxT("Studies")));
827
if(m_pPACSList->GetChildrenCount(root) == 0){
828
m_pPACSList->AppendItem(root, _("There is no PACS server configured"));
829
m_pPACSList->SetColumnWidth(0,220);
830
m_pPACSList->Enable(false);
831
m_pPanelPACS->Enable(false);
833
m_pPACSList->SetColumnWidth(0,80);
835
wxConfigBase * config = wxConfigBase::Get();
836
//se actualiza el fichero de configuracion
837
config->SetPath(wxT("/GinkgoCore/Adquisicion"));
838
wxString pacsDefecto;
839
config->Read(wxT("PACSDefecto"),&pacsDefecto,wxT(""));
840
wxTreeItemId idItem = m_pPACSList->FindItem(root, pacsDefecto);
841
if (!idItem.IsOk()) {
842
wxTreeItemIdValue cookie;
843
idItem = m_pPACSList->GetFirstChild(root, cookie);
844
pacsDefecto = m_pPACSList->GetItemText(idItem);
846
m_pPACSList->SelectItem(idItem);
847
m_SelectedPACS = pacsDefecto;
848
m_Mode = (m_pPACSList->GetItemText(idItem, COL_PACS_MODE) == wxT("Series"))?TD_SERIES:TD_STUDIES;
850
m_pPACSList->Enable(true);
851
m_pPanelPACS->Enable(true);
854
return DialogoAdquisicionBase::Show(show);
859
//---------------------------------------------------------------------------
860
//region Eventos de interfaz
861
void GNC::GUI::DialogoAdquisicion::OnPACSChanged(wxTreeEvent & event)
863
wxTreeItemId item = event.GetItem();
865
wxString newSelection = m_pPACSList->GetItemText(event.GetItem());
866
if (m_SelectedPACS != newSelection) {
867
m_SelectedPACS = newSelection;
868
//se guarda la opcion seleccionada
869
wxConfigBase * config = wxConfigBase::Get();
870
//se actualiza el fichero de configuracion
871
config->SetPath(wxT("/GinkgoCore/Adquisicion"));
873
config->Write(wxT("PACSDefecto"), m_SelectedPACS);
875
if(m_pComandoPACS != NULL)
877
GNC::Entorno::Instance()->GetControladorComandos()->AbortarComando(m_pComandoPACS, false);
879
m_pModeloDicom = GnkPtr<IModeloDicom>(new IModeloDicom());
881
//GNC::GCS::ILocker locker(m_TreeListResultadosLocker);
882
this->m_pTreeListResultados->DeleteRoot();
883
m_AutoAddSeries = false;
884
m_Mode = (m_pPACSList->GetItemText(item, COL_PACS_MODE) == wxT("Series"))?TD_SERIES:TD_STUDIES;
890
void GNC::GUI::DialogoAdquisicion::OnKeyDownFormulario( wxKeyEvent& event )
892
if(event.GetKeyCode() == WXK_RETURN || event.GetKeyCode() == WXK_NUMPAD_ENTER) {
894
if (m_pTextControlField->IsEnabled()) {
895
OnBusquedaClick(evt);
900
if(event.GetKeyCode() == WXK_ESCAPE) {
909
void GNC::GUI::DialogoAdquisicion::OnFechaDesdeDateChanged( wxDateEvent& /*event*/ )
911
m_pBetween->SetValue(true);
916
void GNC::GUI::DialogoAdquisicion::OnFechaHastaDateChanged( wxDateEvent& /*event*/ )
918
m_pBetween->SetValue(true);
921
void GNC::GUI::DialogoAdquisicion::OnCancelClick( wxCommandEvent& )
923
if (m_AutoAddSeries) {
924
m_AutoAddSeries = false;
925
m_AutoAddSeriesItem = NULL;
928
if(m_pComandoPACS != NULL)
930
m_pTextControlField->ShowCancelButton(false);
931
ShowAnimation(false);
932
GNC::Entorno::Instance()->GetControladorComandos()->AbortarComando(m_pComandoPACS, false);
933
m_pComandoPACS = NULL;
935
//GNC::GCS::ILocker locker(m_TreeListResultadosLocker);
936
if(m_lastExpanded.IsOk()) {
937
m_pTreeListResultados->Collapse(m_lastExpanded);
939
LimpiarBusquedas(false);
944
void GNC::GUI::DialogoAdquisicion::OnBusquedaClick( wxCommandEvent& )
947
if (m_AutoAddSeries) {
948
m_AutoAddSeries = false;
949
m_AutoAddSeriesItem = NULL;
952
if(m_pComandoPACS != NULL)
954
m_pTextControlField->ShowCancelButton(false);
955
ShowAnimation(false);
956
GNC::Entorno::Instance()->GetControladorComandos()->AbortarComando(m_pComandoPACS, false);
957
m_pComandoPACS = NULL;
959
//GNC::GCS::ILocker locker(m_TreeListResultadosLocker);
960
if(m_lastExpanded.IsOk()) {
961
m_pTreeListResultados->Collapse(m_lastExpanded);
963
LimpiarBusquedas(false);
967
std::string server = GetServerSeleccionado();
968
m_pModeloDicom = GnkPtr<IModeloDicom>(new IModeloDicom());
972
std::string fechaDesde("");
973
std::string fechaHasta("");
974
std::string timeFrom("");
975
std::string timeTo("");
976
if (m_pBetween->GetValue()){
977
if(m_pTextControlFechaDesde->GetValue().IsValid()){
978
fechaDesde = std::string(m_pTextControlFechaDesde->GetValue().Format(wxT("%Y/%m/%d")).ToUTF8());
980
if(m_pTextControlFechaHasta->GetValue().IsValid()){
981
fechaHasta = std::string(m_pTextControlFechaHasta->GetValue().Format(wxT("%Y/%m/%d")).ToUTF8());
983
} else if (m_pToday->GetValue() || m_pTodayAM->GetValue() || m_pTodayPM->GetValue()) {
984
fechaDesde = fechaHasta = wxDateTime::Now().Format(wxT("%Y/%m/%d")).ToUTF8();
985
if (m_pTodayAM->GetValue()) {
988
} else if (m_pTodayPM->GetValue()) {
992
} else if (m_pYesterday->GetValue()) {
993
fechaHasta = fechaDesde = wxDateTime::Now().Add(wxDateSpan(0,0,0,-1)).Format(wxT("%Y/%m/%d")).ToUTF8();
994
} else if (m_pLastWeek->GetValue()) {
995
fechaDesde = wxDateTime::Now().Add(wxDateSpan(0,0,-1,0)).Format(wxT("%Y/%m/%d")).ToUTF8();
996
} else if (m_pLastMonth->GetValue()) {
997
fechaDesde = wxDateTime::Now().Add(wxDateSpan(0,-1,0,0)).Format(wxT("%Y/%m/%d")).ToUTF8();
998
} else if (m_pLastThreeMonths->GetValue()) {
999
fechaDesde = wxDateTime::Now().Add(wxDateSpan(0,-3,0,0)).Format(wxT("%Y/%m/%d")).ToUTF8();
1002
if(fechaDesde == "" && fechaHasta == "" && m_pTextControlField->GetValue().size() == 0
1003
&& (m_HardCodedPatientSearch && m_HardCodedPatientId.size() == 0) )
1005
int answer = wxMessageBox(_("Search without parameters could take al long time\nWould you like to continue?"),_("Search"), wxYES_NO , this);
1006
if (answer == wxNO) {
1011
std::string idPaciente, nombrePaciente, studyUID, accNumber;
1013
if (m_HardCodedPatientSearch) {
1014
idPaciente = m_HardCodedPatientId;
1015
nombrePaciente = "";
1018
if (m_pFieldCombo->GetValue() == _("Id")) {
1019
idPaciente = m_pTextControlField->GetValue().ToUTF8();
1020
} else if (m_pFieldCombo->GetValue() == _("Name")) {
1021
nombrePaciente = m_pTextControlField->GetValue().ToUTF8();
1022
} else if (m_pFieldCombo->GetValue() == _("Acc#")) {
1023
accNumber = m_pTextControlField->GetValue().ToUTF8();
1024
} else if (m_pFieldCombo->GetValue() == _("Study UID")) {
1025
studyUID = m_pTextControlField->GetValue().ToUTF8();
1028
//modalities checked
1031
GADAPI::ComandoPACSParams * pParams = new GADAPI::ComandoPACSParams(
1037
fechaDesde,fechaHasta,
1039
server, GADAPI::ComandoPACSParams::TA_Estudio, m_pModeloDicom, this); // Buscamos los estudios del paciente
1041
m_pComandoPACS = new GADAPI::ComandoPACS(pParams);
1042
GNC::Entorno::Instance()->GetControladorComandos()->ProcessAsync(_Std("Exploring PACS..."),m_pComandoPACS, this);
1043
m_pTextControlField->ShowCancelButton(true);
1044
ShowAnimation(true);
1047
std::string GNC::GUI::DialogoAdquisicion::GetModalities()
1049
std::string modalities;
1052
for (TModalitiesVector::iterator it =m_modalitiesList.begin(); it !=m_modalitiesList.end(); it++) {
1053
wxCheckBox* pCheck = dynamic_cast<wxCheckBox*>(*it);
1055
if(pCheck->IsChecked()){
1057
if (modalities == ""){
1058
modalities = pCheck->GetLabel().ToUTF8();
1061
modalities.append("\\");
1062
modalities.append(pCheck->GetLabel().ToUTF8());
1072
void GNC::GUI::DialogoAdquisicion::OnLimpiarClick( wxCommandEvent& /*event*/ )
1077
void GNC::GUI::DialogoAdquisicion::OnIniciarPararTasksClick( wxCommandEvent& /*event*/ )
1081
m_pGridDescargas->BeginBatch();
1082
for ( int i = 0; i < m_pGridDescargas->GetNumberRows(); i++ )
1084
if ( m_pGridDescargas->IsInSelection( i , 0 ) )
1086
// Esto puede ser una fuente de problemas: OJO
1087
const Descargas::Descarga* d = m_pDescargasGridTable->GetDescarga(i);
1088
switch (d->StatusId) {
1089
case Descargas::Iniciada:
1090
if (action == 0 ||action == 1) { // Para asegurar que solo se hace una operacion:
1091
m_pDescargasGridTable->DetenerDescarga(i);
1095
std::cerr << "Error en la logica de control de tareas de descarga" << std::endl;
1098
case Descargas::Parada:
1099
if (action == 0 || action == 2) { // Para asegurar que solo se hace una operacion:
1100
m_pDescargasGridTable->IniciarDescarga(i);
1104
std::cerr << "Error en la logica de control de tareas de descarga" << std::endl;
1107
case Descargas::Terminada:
1109
case Descargas::Erronea:
1112
std::cerr << "Error en la logica de control de tareas de descarga" << std::endl;
1119
if (action == 1) { // Hemos detenido descargas iniciadas
1120
m_pBotonIniciarPararTask->SetLabel(_("Start"));
1121
m_pBotonDeleteTask->Enable(true);
1123
else if (action == 2) { // Hemos iniciado descargas paradas
1124
m_pBotonIniciarPararTask->SetLabel(_("Stop"));
1125
m_pBotonDeleteTask->Enable(false);
1127
m_pGridDescargas->EndBatch();
1130
void GNC::GUI::DialogoAdquisicion::OnDeleteTasksClick( wxCommandEvent& /*event*/ )
1133
if ( m_pGridDescargas->IsSelection() )
1135
int lastDeleted = -1;
1136
int deletedCount = 0;
1137
m_pGridDescargas->BeginBatch();
1138
for ( int i = 0; i < m_pGridDescargas->GetNumberRows(); )
1140
if ( m_pGridDescargas->IsInSelection( i , 0 ) ) {
1141
m_pGridDescargas->DeleteRows( i, 1 );
1147
m_pGridDescargas->EndBatch();
1148
//cuando elimino selecciono la fila anterior
1149
if (lastDeleted != -1) {
1150
lastDeleted = lastDeleted - deletedCount;
1151
if ( lastDeleted < 0 && m_pGridDescargas->GetNumberRows() > 0 ) {
1152
m_pGridDescargas->SelectRow(0);
1154
if ( lastDeleted < m_pGridDescargas->GetNumberRows() ) {
1155
m_pGridDescargas->SelectRow(lastDeleted);
1162
void GNC::GUI::DialogoAdquisicion::OnOpenTasksClick( wxCommandEvent& /*event*/ )
1164
if ( m_pGridDescargas->IsSelection() )
1166
m_pGridDescargas->BeginBatch();
1167
typedef std::list<const Descargas::Descarga*> TListaDescargas;
1168
TListaDescargas listaAbrir;
1170
for ( int i = 0; i < m_pGridDescargas->GetNumberRows();++i )
1172
if ( m_pGridDescargas->IsInSelection( i , 0 ) ) {
1173
const Descargas::Descarga* d = m_pDescargasGridTable->GetDescarga(i);
1174
if (d->StatusId == Descargas::Terminada) {
1175
listaAbrir.push_back(d);
1179
//se comprueba que todas las series seleccionadas existen...
1180
GNC::GCS::Eventos::EvtHandleDicom::ListaUIDs listaUIdsAbrir;
1181
TListaDescargas listaNoExisten;
1182
TListaDescargas listaAbrirDiagnosticos;
1184
for (TListaDescargas::iterator it = listaAbrir.begin(); it != listaAbrir.end();++it) {
1185
if ( ! GNC::GCS::ControladorHistorial::Instance()->ExisteSerie((*it)->UID) ) {
1186
listaNoExisten.push_back((*it));
1187
} else if ( (*it)->Modality == "SR" ) {
1188
listaAbrirDiagnosticos.push_back((*it));
1190
listaUIdsAbrir.push_back((*it)->UID);
1194
//uids que no existen en el historial
1195
if (listaNoExisten.size() > 0) {
1196
DialogoNotFoundBase dlg(this);
1197
for ( TListaDescargas::iterator it = listaNoExisten.begin(); it != listaNoExisten.end(); ++it) {
1198
std::ostringstream ostr;
1199
if ((*it)->Description != "") {
1200
ostr << (*it)->Description;
1202
ostr << (*it)->Modality << " (" << (*it)->UID << ")";
1205
dlg.m_pListaSeries->Append( wxString::FromUTF8(ostr.str().c_str()) );
1208
if (listaUIdsAbrir.size() > 0) {
1209
dlg.m_pPanelOk->Show(false);
1211
dlg.m_pPanelOkCancel->Show(false);
1214
int answer = dlg.ShowModal();
1215
if (answer == wxID_CANCEL) {
1220
//diagnosticos que se quieren abrir
1221
if (listaAbrirDiagnosticos.size() > 0) {
1222
wxMessageBox(_("Diagnostic files can't be opened, you have to open the diagnosed series"), _("Info"),
1223
wxOK | wxICON_INFORMATION, this);
1226
if(listaUIdsAbrir.size() > 0) {
1227
GNC::GCS::ControladorEventos::Instance()->ProcesarEvento(new GNC::GCS::Eventos::EvtHandleDicom(listaUIdsAbrir, GNC::GCS::Eventos::EvtHandleDicom::OpenSeries));
1229
m_pGridDescargas->EndBatch();
1233
void GNC::GUI::DialogoAdquisicion::OnClearTasksClick( wxCommandEvent& /*event*/ )
1235
m_pGridDescargas->BeginBatch();
1236
for ( int i = 0; i < m_pGridDescargas->GetNumberRows(); )
1238
const Descargas::Descarga* d = m_pDescargasGridTable->GetDescarga(i);
1239
if ( d->StatusId == Descargas::Terminada || d->StatusId == Descargas::Erronea ) {
1240
m_pGridDescargas->DeleteRows( i, 1 );
1244
m_pGridDescargas->EndBatch();
1247
void GNC::GUI::DialogoAdquisicion::OnCloseClick( wxCommandEvent& /*event*/ )
1252
void GNC::GUI::DialogoAdquisicion::OnDescargarClick( wxCommandEvent& /*event*/ )
1257
// Eventos del Treelist
1258
void GNC::GUI::DialogoAdquisicion::OnTreeSelChanged(wxTreeEvent& event)
1261
wxTreeItemId item = event.GetItem();
1263
wxTreeItemId idPadre = m_pTreeListResultados->GetItemParent(item);
1264
m_pBDescargar->Enable(idPadre != m_pTreeListResultados->GetRootItem()); // El item es un estudio o una serie
1266
m_pBDescargar->Enable(false);
1273
void GNC::GUI::DialogoAdquisicion::OnTreeItemActivated(wxTreeEvent& event)
1282
void GNC::GUI::DialogoAdquisicion::OnTreeItemMenu(wxTreeEvent& event)
1284
//clase menu contextual
1285
class PopUpMenuDescargar: public wxMenu
1288
PopUpMenuDescargar(DialogoAdquisicion* pDlg, bool allowDownload) : wxMenu()
1291
if (allowDownload) {
1292
wxMenuItem* descargar = new wxMenuItem( this,wxID_ANY,_("Download"));
1294
descargar->SetBitmaps(GinkgoResourcesManager::Adquisicion::GetIcoDownload());
1296
descargar->SetBitmap(GinkgoResourcesManager::Adquisicion::GetIcoDownload());
1299
this->AppendSeparator();
1301
Connect(descargar->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( PopUpMenuDescargar::OnDescargar ), NULL, this);
1303
wxMenuItem* props = new wxMenuItem( this, wxID_ANY, _("Properties..."));
1305
Connect(props->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( PopUpMenuDescargar::OnProperties ),NULL, this);
1308
~PopUpMenuDescargar()
1311
Disconnect(wxID_ANY, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( PopUpMenuDescargar::OnDescargar ), NULL, this);
1312
Disconnect(wxID_ANY, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( PopUpMenuDescargar::OnProperties ), NULL, this);
1315
void OnDescargar(wxCommandEvent& )
1318
m_pDlg->AddDescarga(true);
1322
void OnProperties(wxCommandEvent& )
1325
m_pDlg->ShowProperties();
1329
DialogoAdquisicion* m_pDlg;
1333
wxTreeItemId item = event.GetItem();
1335
wxTreeItemId idPadre = m_pTreeListResultados->GetItemParent(item);
1336
if(idPadre != m_pTreeListResultados->GetRootItem() ){ // El item es un estudio o una serie
1337
wxTreeItemId idAbuelo = m_pTreeListResultados->GetItemParent(m_pTreeListResultados->GetItemParent(item));
1338
// Comprobamos que el item es un estudio o es una serie desplegada.
1339
if ( ( idAbuelo == m_pTreeListResultados->GetRootItem() ) || ! ( (m_pTreeListResultados->GetItemText(item, COLUMNA_UID)).empty() ) ) {
1341
PopUpMenuDescargar* pMenu = new PopUpMenuDescargar(this, true);
1343
m_pTreeListResultados->PopupMenu(pMenu);
1349
PopUpMenuDescargar* pMenu = new PopUpMenuDescargar(this, false);
1351
m_pTreeListResultados->PopupMenu(pMenu);
1358
void GNC::GUI::DialogoAdquisicion::OnTreeItemExpanded(wxTreeEvent& event)
1361
//GNC::GCS::ILocker locker(m_TreeListResultadosLocker);
1362
wxTreeItemId item = event.GetItem();
1364
if (m_AutoAddSeries && (m_AutoAddSeriesItem != item) ) {
1365
m_AutoAddSeries = false;
1366
m_AutoAddSeriesItem = NULL;
1369
if(item && item.IsOk()){
1370
m_pTreeListResultados->SortChildren(item);
1371
//si el abuelo del item es root => consultar
1372
if(m_pTreeListResultados->IsExpanded(item) && m_pTreeListResultados->GetItemParent(m_pTreeListResultados->GetItemParent(item)) == m_pTreeListResultados->GetRootItem())
1374
//se cancela el anterior comando y se contrae el item expandido
1375
if(m_pComandoPACS != NULL)
1377
GNC::Entorno::Instance()->GetControladorComandos()->AbortarComando(m_pComandoPACS, false);
1378
m_pComandoPACS = NULL;
1379
if(m_lastExpanded.IsOk()) {
1380
m_pTreeListResultados->Collapse(m_lastExpanded);
1384
std::string server=GetServerSeleccionado();
1388
GADAPI::ComandoPACSParams * pParams = new GADAPI::ComandoPACSParams(
1391
std::string(m_pTreeListResultados->GetItemText(item,COLUMNA_UID).ToUTF8()),
1397
"",server, GADAPI::ComandoPACSParams::TA_Serie, m_pModeloDicom, this);
1399
m_pComandoPACS = new GADAPI::ComandoPACS(pParams);
1400
GNC::Entorno::Instance()->GetControladorComandos()->ProcessAsync(_Std("Exploring PACS..."),m_pComandoPACS, this);
1401
m_pTextControlField->ShowCancelButton(true);
1402
ShowAnimation(true);
1403
m_lastExpanded = item;
1413
void GNC::GUI::DialogoAdquisicion::OnTreeBeginDrag(wxTreeEvent& )
1415
wxTreeItemId seleccion = m_pTreeListResultados->GetSelection();
1416
if(seleccion.IsOk()){
1417
if(m_pTreeListResultados->GetItemParent(seleccion) == m_pTreeListResultados->GetRootItem()){
1418
//esto es para que de la impresion de que no podemos arrastrar la raiz
1419
class wxFooDataObject: public wxDataObjectSimple
1422
wxFooDataObject():wxDataObjectSimple() {}
1423
~wxFooDataObject() {}
1425
wxFooDataObject myData;
1426
wxDropSource dragSource(myData,this);
1427
dragSource.DoDragDrop(wxDrag_AllowMove);
1429
//comenzamos drag & drop
1430
wxTextDataObject myData(wxT(""));
1431
wxDropSource dragSource(myData,this);
1432
wxDragResult result = dragSource.DoDragDrop(wxDrag_AllowMove);
1433
if (result == wxDragCopy) {
1440
void GNC::GUI::DialogoAdquisicion::UpdateButtons()
1447
m_pGridDescargas->BeginBatch();
1448
for ( int i = 0; i < m_pGridDescargas->GetNumberRows(); i++)
1450
if ( m_pGridDescargas->IsInSelection( i , 0 ) ) {
1451
const Descargas::Descarga* d = m_pDescargasGridTable->GetDescarga(i);
1452
switch( d->StatusId ) {
1453
case Descargas::Parada:
1457
case Descargas::Iniciada:
1461
case Descargas::Terminada:
1464
case Descargas::Erronea:
1471
m_pGridDescargas->EndBatch();
1474
m_pBotonIniciarPararTask->Enable(false);
1475
m_pBotonIniciarPararTask->SetLabel(_("Start"));
1476
m_pBotonOpenTask->Enable(false);
1477
m_pBotonDeleteTask->Enable(false);
1481
m_pBotonDeleteTask->Enable( (total == terminadas) || (total == (terminadas + paradas)) );
1482
if (total == terminadas){
1483
m_pBotonIniciarPararTask->Enable(false);
1484
m_pBotonIniciarPararTask->SetLabel(_("Start"));
1485
m_pBotonDeleteTask->Enable(true);
1487
else if ( total == iniciadas) {
1488
m_pBotonIniciarPararTask->Enable(true);
1489
m_pBotonIniciarPararTask->SetLabel(_("Stop"));
1490
m_pBotonDeleteTask->Enable(false);
1492
else if ( total == (paradas + terminadas ) ) {
1493
m_pBotonIniciarPararTask->Enable(true);
1494
m_pBotonIniciarPararTask->SetLabel(_("Start"));
1495
m_pBotonDeleteTask->Enable(true);
1497
else if (total == paradas) {
1498
m_pBotonIniciarPararTask->Enable(true);
1499
m_pBotonIniciarPararTask->SetLabel(_("Start"));
1500
m_pBotonDeleteTask->Enable(true);
1503
m_pBotonIniciarPararTask->Enable(false);
1504
m_pBotonIniciarPararTask->SetLabel(_("Start"));
1505
m_pBotonDeleteTask->Enable(false);
1508
m_pBotonOpenTask->Enable( total == terminadas);
1512
void GNC::GUI::DialogoAdquisicion::OnGridSelect(wxGridRangeSelectEvent& event)
1519
void GNC::GUI::DialogoAdquisicion::OnGridKeyDown(wxKeyEvent& event)
1521
switch (event.GetKeyCode())
1525
if ( m_pBotonDeleteTask->IsEnabled() ) {
1527
OnDeleteTasksClick(evt);
1532
case WXK_NUMPAD_ENTER:
1535
if ( m_pBotonOpenTask->IsEnabled() ) {
1537
OnOpenTasksClick(evt);
1547
void GNC::GUI::DialogoAdquisicion::OnGridDClick(wxGridEvent& event)
1549
if ( m_pBotonOpenTask->IsEnabled() ) {
1551
OnOpenTasksClick(evt);
1556
void GNC::GUI::DialogoAdquisicion::OnGridMenu(wxGridEvent& )
1558
//clase menu contextual
1559
class PopUpMenuListaDescargas: public wxMenu
1562
PopUpMenuListaDescargas(DialogoAdquisicion* pDlg) : wxMenu()
1566
if (m_pDlg->m_pBotonOpenTask->IsEnabled()) {
1567
wxMenuItem* menuItem = new wxMenuItem( this,wxID_ANY,m_pDlg->m_pBotonOpenTask->GetLabel());
1569
Connect(menuItem->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( PopUpMenuListaDescargas::OnOpen ),NULL,this);
1573
if (m_pDlg->m_pBotonIniciarPararTask->IsEnabled()) {
1574
wxMenuItem* menuItem = new wxMenuItem( this,wxID_ANY,m_pDlg->m_pBotonIniciarPararTask->GetLabel());
1576
Connect(menuItem->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( PopUpMenuListaDescargas::OnIniciarParar ),NULL,this);
1580
if (m_pDlg->m_pBotonDeleteTask->IsEnabled()) {
1581
wxMenuItem* menuItem = new wxMenuItem( this,wxID_ANY,m_pDlg->m_pBotonDeleteTask->GetLabel());
1583
menuItem->SetBitmaps(GinkgoResourcesManager::Adquisicion::GetIcoEliminarDescarga());
1585
menuItem->SetBitmap(GinkgoResourcesManager::Adquisicion::GetIcoEliminarDescarga());
1588
Connect(menuItem->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( PopUpMenuListaDescargas::OnDelete ),NULL,this);
1592
wxMenuItem* menuItem = new wxMenuItem( this,wxID_ANY,_("Clear Finished"));
1594
menuItem->SetBitmaps(GinkgoResourcesManager::Adquisicion::GetIcoClear());
1596
menuItem->SetBitmap(GinkgoResourcesManager::Adquisicion::GetIcoClear());
1599
Connect(menuItem->GetId(), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( PopUpMenuListaDescargas::OnClear ),NULL,this);
1602
~PopUpMenuListaDescargas()
1605
Disconnect(wxID_ANY, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( PopUpMenuListaDescargas::OnIniciarParar ),NULL,this);
1606
Disconnect(wxID_ANY, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( PopUpMenuListaDescargas::OnDelete ),NULL,this);
1607
Disconnect(wxID_ANY, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( PopUpMenuListaDescargas::OnOpen ),NULL,this);
1610
void OnIniciarParar(wxCommandEvent& )
1613
m_pDlg->OnIniciarPararTasksClick(evt);
1616
void OnDelete(wxCommandEvent& )
1619
m_pDlg->OnDeleteTasksClick(evt);
1622
void OnOpen(wxCommandEvent& )
1625
m_pDlg->OnOpenTasksClick(evt);
1628
void OnClear(wxCommandEvent& )
1631
m_pDlg->OnClearTasksClick(evt);
1634
DialogoAdquisicion* m_pDlg;
1638
PopUpMenuListaDescargas* pMenu = new PopUpMenuListaDescargas(this);
1639
m_pGridDescargas->PopupMenu(pMenu);
1643
void GNC::GUI::DialogoAdquisicion::OnGridSize( wxSizeEvent& event )
1645
/*m_pGridDescargas->SetSize(event.GetSize());
1651
//---------------------------------------------------------------------------
1654
void GNC::GUI::DialogoAdquisicion::AutoSizeGrid()
1656
wxSize s = m_pGridDescargas->GetSize();
1658
float prop = 1.0f / ( (float)m_pGridDescargas->GetNumberCols() );
1660
int cw = s.GetWidth() - 10;
1663
for (; i < m_pGridDescargas->GetNumberCols() - 1; i++)
1665
int iw = (int) (prop * (float)cw);
1667
m_pGridDescargas->SetColSize(i, iw);
1669
if ( i < m_pGridDescargas->GetNumberCols()) {
1670
m_pGridDescargas->SetColSize(i, cw - aw );
1674
m_pGridDescargas->Refresh();
1678
std::string GNC::GUI::DialogoAdquisicion::GetServerSeleccionado()
1681
wxTreeItemId idItem = m_pPACSList->GetSelection();
1682
if (idItem.IsOk()) {
1683
id = std::string(m_pPACSList->GetItemText(idItem).ToUTF8());
1685
wxMessageBox(_("Select a valid PACS Server"), _("Info"),
1686
wxOK | wxICON_INFORMATION, this);
1692
// Obtiene el item seleccionado del TreeList de resultados, genera una descarga, la apila y la inicia.
1693
void GNC::GUI::DialogoAdquisicion::AddDescarga(bool lanzarBusqueda)
1696
//GNC::GCS::ILocker locker(m_TreeListResultadosLocker);
1697
wxTreeItemId seleccion = m_pTreeListResultados->GetSelection();
1699
if(seleccion.IsOk()){
1700
if(m_pTreeListResultados->GetItemParent(seleccion) == m_pTreeListResultados->GetRootItem()){
1703
else if(m_pTreeListResultados->GetItemParent(m_pTreeListResultados->GetItemParent(seleccion)) == m_pTreeListResultados->GetRootItem()){
1705
if (m_Mode == TD_STUDIES) {
1706
//download study node
1707
std::string uidPaciente = std::string(m_pTreeListResultados->GetItemText(m_pTreeListResultados->GetItemParent(seleccion), COLUMNA_UID).ToUTF8());
1708
std::string descPaciente = std::string(m_pTreeListResultados->GetItemText(m_pTreeListResultados->GetItemParent(seleccion)).ToUTF8());
1710
std::string uidStudy = std::string(m_pTreeListResultados->GetItemText(seleccion, COLUMNA_UID).ToUTF8());
1711
std::string descStudy = std::string( (m_pTreeListResultados->GetItemText(seleccion) + _T("(") + m_pTreeListResultados->GetItemText(seleccion, COLUMNA_MODALIDAD) + _T(")") ).ToUTF8());
1712
std::string modStudy = std::string( m_pTreeListResultados->GetItemText(seleccion, COLUMNA_MODALIDAD ).ToUTF8());
1714
if (!modStudy.empty() && ! GNC::GCS::ControladorPermisos::Instance()->Get("core.pacs.download", modStudy)) {
1715
LOG_ERROR("GUI/Adquisition", _Std("Download of modality ") << modStudy << _Std(" not allowed"));
1716
wxMessageBox(_("You are not allowed to download this kind of modalities."),_("Modality download error"),wxICON_ERROR);
1718
bool forceInit = true;
1719
if (m_pDescargasGridTable->FindDescarga(uidStudy) != -1) {
1720
forceInit = wxMessageBox(_("Series were already in the download queue.\nDo you want to repeat download?"),_("Download warning"),wxICON_INFORMATION|wxYES_NO) == wxYES;
1723
bool downloaded = m_pDescargasGridTable->AddDescarga(GetServerSeleccionado(), descPaciente, descStudy, uidStudy,modStudy, forceInit, false);
1724
m_pTreeListResultados->SetItemBold(seleccion, downloaded);
1728
//series mode, we have to search series in study
1729
if (lanzarBusqueda) {
1731
//estamos en un estudio
1732
std::string uidPaciente = std::string(m_pTreeListResultados->GetItemText(m_pTreeListResultados->GetItemParent(seleccion), COLUMNA_UID).ToUTF8());
1733
std::string descPaciente = std::string(m_pTreeListResultados->GetItemText(m_pTreeListResultados->GetItemParent(seleccion)).ToUTF8());
1735
// Necesitamos buscar las series
1737
// Primero comprobamos que no estan ya desplegadas, y asi ahorramos una busqueda en el PACS.
1738
wxTreeItemId eid = seleccion;
1739
std::string server = GetServerSeleccionado();
1740
int numSeriesDescargadas = 0;
1742
std::list<wxTreeItemId> s_items = m_pTreeListResultados->GetPublicChildren(eid);
1743
std::set<std::string> listaModalidad;
1744
bool forceInit = true;
1745
bool questionMade = false;
1746
for (std::list<wxTreeItemId>::iterator ititem = s_items.begin(); ititem != s_items.end(); ititem++) {
1747
wxTreeItemId cid = *ititem;
1749
std::string uidSerie = std::string(m_pTreeListResultados->GetItemText(cid, COLUMNA_UID).ToUTF8());
1750
std::string modalidadSerie = std::string(m_pTreeListResultados->GetItemText(cid, COLUMNA_MODALIDAD).ToUTF8());
1751
if (!uidSerie.empty()) { // La serie esta desplegada
1752
if( GNC::GCS::ControladorPermisos::Instance()->Get("core.pacs.download", modalidadSerie) ) {
1753
if (!questionMade && m_pDescargasGridTable->FindDescarga(uidSerie) != -1) {
1754
forceInit = wxMessageBox(_("Series were already in the download queue.\nDo you want to force download?"),_("Download warning"),wxICON_INFORMATION|wxYES_NO) == wxYES;
1755
questionMade = true;
1758
std::string descSerie = std::string( (m_pTreeListResultados->GetItemText(cid) + _T("(") + m_pTreeListResultados->GetItemText(cid, COLUMNA_MODALIDAD) + _T(")") ).ToUTF8());
1759
bool downloaded = m_pDescargasGridTable->AddDescarga(server, descPaciente, descSerie, uidSerie,modalidadSerie,forceInit, true);
1760
m_pTreeListResultados->SetItemBold(cid, downloaded);
1761
numSeriesDescargadas++;
1763
listaModalidad.insert( modalidadSerie );
1767
if (numSeriesDescargadas == 0 && listaModalidad.size() == 0)
1769
// Desplegamos la serie.
1771
wxTreeItemId item = seleccion;
1772
// >>------- Es un cut&paste del evento OnTreeItemExpanded, pero mejor esto que complicar la interfaz invocandolo directamente (lockers, omision de evento, reset de estado de la auto descarga de series , etc..)
1773
//se cancela el anterior comando y se contrae el item expandido
1774
if(item && item.IsOk()){
1775
//si el abuelo del item es root => consultar
1776
m_AutoAddSeries = true;
1777
m_AutoAddSeriesItem = item;
1780
if(m_pComandoPACS != NULL)
1782
GNC::Entorno::Instance()->GetControladorComandos()->AbortarComando(m_pComandoPACS, false);
1783
m_pComandoPACS = NULL;
1785
if(m_lastExpanded.IsOk()) {
1786
m_pTreeListResultados->Collapse(m_lastExpanded);
1787
m_lastExpanded.Unset();
1790
std::string server=GetServerSeleccionado();
1796
GADAPI::ComandoPACSParams * pParams = new GADAPI::ComandoPACSParams(
1799
std::string(m_pTreeListResultados->GetItemText(item,COLUMNA_UID).ToUTF8()),
1805
"",server, GADAPI::ComandoPACSParams::TA_Serie, m_pModeloDicom, this);
1807
m_pComandoPACS = new GADAPI::ComandoPACS(pParams);
1808
GNC::Entorno::Instance()->GetControladorComandos()->ProcessAsync(_Std("Exploring PACS..."),m_pComandoPACS, this);
1809
m_pTextControlField->ShowCancelButton(true);
1810
ShowAnimation(true);
1812
else if ( listaModalidad.size() > 0)
1814
std::ostringstream ostr;
1815
ostr << _Std("You are not allowed to download this kind of modalities (");
1816
bool primero = true;
1817
for (std::set<std::string>::iterator it = listaModalidad.begin(); it != listaModalidad.end(); ++it) {
1823
ostr << ", " << (*it);
1827
wxMessageBox(wxString::FromUTF8( ostr.str().c_str() ), _("Modality download error"), wxICON_ERROR);
1833
//estamos en una serie
1834
std::string uidPaciente = std::string(m_pTreeListResultados->GetItemText(m_pTreeListResultados->GetItemParent(m_pTreeListResultados->GetItemParent(seleccion)), COLUMNA_UID).ToUTF8());
1835
std::string descPaciente = std::string(m_pTreeListResultados->GetItemText(m_pTreeListResultados->GetItemParent(m_pTreeListResultados->GetItemParent(seleccion))).ToUTF8());
1837
std::string uidSerie = std::string(m_pTreeListResultados->GetItemText(seleccion, COLUMNA_UID).ToUTF8());
1838
std::string descSerie = std::string( (m_pTreeListResultados->GetItemText(seleccion) + _T("(") + m_pTreeListResultados->GetItemText(seleccion, COLUMNA_MODALIDAD) + _T(")") ).ToUTF8());
1839
std::string modSerie = std::string( m_pTreeListResultados->GetItemText(seleccion, COLUMNA_MODALIDAD ).ToUTF8());
1841
if (!modSerie.empty()) {
1842
if(! GNC::GCS::ControladorPermisos::Instance()->Get("core.pacs.download", modSerie)) {
1843
LOG_ERROR("GUI/Adquisition", _Std("Download of modality ") << modSerie << _Std(" not allowed"));
1844
wxMessageBox(_("You are not allowed to download this kind of modalities."),_("Modality download error"),wxICON_ERROR);
1847
bool forceInit = true;
1848
if (m_pDescargasGridTable->FindDescarga(uidSerie) != -1) {
1849
forceInit = wxMessageBox(_("Series were already in the download queue.\nDo you want to force download?"),_("Download warning"),wxICON_INFORMATION|wxYES_NO) == wxYES;
1852
bool downloaded = m_pDescargasGridTable->AddDescarga(GetServerSeleccionado(), descPaciente, descSerie, uidSerie,modSerie, forceInit, true);
1853
m_pTreeListResultados->SetItemBold(seleccion, downloaded);
1864
// Shows a dialog with the properties of selected treelist item
1865
void GNC::GUI::DialogoAdquisicion::ShowProperties()
1869
wxTreeItemId selection = m_pTreeListResultados->GetSelection();
1871
if(selection.IsOk()){
1872
GNC::GUI::wxPropiedades::TListaMapasPropiedades listaMapas;
1874
wxTreeItemId patientTreeItemId;
1875
wxTreeItemId studyTreeItemId;
1876
wxTreeItemId serieTreeItemId;
1878
if(m_pTreeListResultados->GetItemParent(selection) == m_pTreeListResultados->GetRootItem()){
1880
patientTreeItemId = selection;
1882
else if(m_pTreeListResultados->GetItemParent(m_pTreeListResultados->GetItemParent(selection)) == m_pTreeListResultados->GetRootItem()){
1883
studyTreeItemId = selection;
1884
patientTreeItemId = m_pTreeListResultados->GetItemParent(selection);
1888
serieTreeItemId = selection;
1889
studyTreeItemId = m_pTreeListResultados->GetItemParent(selection);
1890
patientTreeItemId = m_pTreeListResultados->GetItemParent(studyTreeItemId);
1893
if (patientTreeItemId.IsOk()) {
1894
GNC::GUI::wxPropiedades::TMapaPropiedades mapaPropiedades;
1895
mapaPropiedades[_Std("Patient's Id")] = std::string(m_pTreeListResultados->GetItemText(patientTreeItemId, COLUMNA_UID).ToUTF8());
1896
listaMapas.push_back(mapaPropiedades);
1898
if (studyTreeItemId.IsOk()) {
1899
GNC::GUI::wxPropiedades::TMapaPropiedades mapaPropiedades;
1900
mapaPropiedades[_Std("Study Instance UID")] = std::string(m_pTreeListResultados->GetItemText(studyTreeItemId, COLUMNA_UID).ToUTF8());
1901
mapaPropiedades[_Std("Accession number")] = std::string(m_pTreeListResultados->GetItemText(studyTreeItemId, COLUMNA_ACCNUMBER).ToUTF8());
1902
mapaPropiedades[_Std("Study date")] = std::string(m_pTreeListResultados->GetItemText(studyTreeItemId, COLUMNA_FECHA).ToUTF8());
1903
listaMapas.push_back(mapaPropiedades);
1905
if (serieTreeItemId.IsOk()) {
1906
GNC::GUI::wxPropiedades::TMapaPropiedades mapaPropiedades;
1907
mapaPropiedades[_Std("Series Instance UID")] = std::string(m_pTreeListResultados->GetItemText(serieTreeItemId, COLUMNA_UID).ToUTF8());
1908
mapaPropiedades[_Std("Modality")] = std::string(m_pTreeListResultados->GetItemText(serieTreeItemId, COLUMNA_MODALIDAD).ToUTF8());
1909
mapaPropiedades[_Std("Series date")] = std::string(m_pTreeListResultados->GetItemText(serieTreeItemId, COLUMNA_FECHA).ToUTF8());
1911
listaMapas.push_back(mapaPropiedades);
1914
GNC::GUI::wxPropiedades* pProp = new GNC::GUI::wxPropiedades(this, _Std("Search Results"), listaMapas);
1921
void GNC::GUI::DialogoAdquisicion::ShowAnimation(bool show)
1923
m_pAnimation->Show(show);
1924
m_pPanelPACS->Layout();
1925
m_pPanelPACS->Refresh(true);
1927
m_pAnimation->Play();
1929
m_pAnimation->Stop();
1933
void GNC::GUI::DialogoAdquisicion::LimpiarBusquedas(bool /*lock*/) {
1936
GNC::GCS::ILocker* pLocker = NULL;
1938
pLocker = new GNC::GCS::ILocker(m_TreeListResultadosLocker);
1941
m_pTreeListResultados->DeleteRoot();
1942
m_pTreeListResultados->AddRoot(wxT("Top"));
1943
m_pModeloDicom = GnkPtr<IModeloDicom>(new IModeloDicom());
1946
if (pLocker != NULL) {
1956
//---------------------------------------------------------------------------
1957
//region realizacion de la interfaz IComandoPACSNotificador
1958
void GNC::GUI::DialogoAdquisicion::PACSCargarListado(IModeloDicom * pModelo)
1961
//GNC::GCS::ILocker locker(m_TreeListResultadosLocker);
1962
m_pTextControlField->ShowCancelButton(false);
1963
ShowAnimation(false);
1964
if(m_pComandoPACS == NULL)
1969
if (m_pComandoPACS->m_pPACSParams->m_Ambito == GADAPI::ComandoPACSParams::TA_Serie)
1971
wxTreeItemId pacienteTreeId;
1972
wxTreeItemId estudioTreeId;
1974
m_lastExpanded.Unset();
1975
//actualizar el arbol
1976
const IModeloEstudio* estudio = NULL;
1977
pModelo->BuscarEstudio(m_pComandoPACS->m_pPACSParams->m_studyUID,&estudio);
1979
m_pComandoPACS = NULL;
1981
if (estudio != NULL) {
1982
std::set<std::string> listaModalidad;
1983
{//begin freeze/thaw
1987
bool encontrado = false;
1988
wxString wxUIDEstudio = wxString::FromUTF8(estudio->GetUID().c_str());
1990
std::list<wxTreeItemId> p_items = m_pTreeListResultados->GetPublicChildren(m_pTreeListResultados->GetRootItem());
1991
for (std::list<wxTreeItemId>::iterator ititem = p_items.begin(); ititem != p_items.end() && !encontrado; ititem++) {
1992
pacienteTreeId = *ititem;
1994
std::list<wxTreeItemId> e_items = m_pTreeListResultados->GetPublicChildren(pacienteTreeId);
1995
for (std::list<wxTreeItemId>::iterator ititem = e_items.begin(); ititem != e_items.end() && !encontrado; ititem++) {
1996
estudioTreeId = *ititem;
1998
if(m_pTreeListResultados->GetItemText(estudioTreeId,COLUMNA_UID) == wxUIDEstudio) {
2006
if(estudioTreeId.IsOk() && estudio->ListaSeries().size() > 0) {
2007
m_pTreeListResultados->DeleteChildren(estudioTreeId);
2008
bool forceInit = true;
2009
bool questionMade = false;
2011
for (IModeloEstudio::ListaSeriesType::const_iterator it3 = estudio->ListaSeries().begin(); it3 != estudio->ListaSeries().end(); it3++) {
2012
const IModeloSerie& s = *it3;
2013
wxString uidSerie = wxString::FromUTF8(s.GetUID().c_str());
2014
wxString numeroDeImagenes = wxString::FromUTF8(s.GetNumero().c_str());
2015
wxString tipoSerie = wxString::FromUTF8(s.GetTipo().c_str());
2016
wxString descripcionSerie = wxString::FromUTF8(s.GetDescripcion().c_str());
2020
hora.ParseFormat( wxString::FromUTF8( (s.GetHora()).c_str() ).GetData(), wxT("%H%M%S"), wxDefaultDateTime);
2021
fecha.ParseFormat( wxString::FromUTF8( (s.GetFecha()).c_str() ).GetData(), wxT("%Y%m%d"), wxDefaultDateTime);
2025
if(fecha.IsValid()){
2026
if (hora.IsValid()) {
2028
fecha.SetHour(hora.GetHour());
2029
fecha.SetMinute(hora.GetMinute());
2030
fecha.SetSecond(hora.GetSecond());
2032
fechaStr = wxString(fecha.Format(_("%m/%d/%Y %H:%M:%S"), wxDateTime::TimeZone(wxDateTime::GMT1)));
2035
fechaStr = wxString(fecha.Format(_("%m/%d/%Y 00:00:00"), wxDateTime::TimeZone(wxDateTime::GMT1)));
2039
fechaStr = _("00/00/0000 00:00:00");
2043
wxTreeItemId serieTreeId = m_pTreeListResultados->AppendItem(estudioTreeId, descripcionSerie);
2044
m_pTreeListResultados->SetItemText(serieTreeId, COLUMNA_MODALIDAD, tipoSerie);
2046
m_pTreeListResultados->SetItemText(serieTreeId, COLUMNA_FECHA, fechaStr);
2048
m_pTreeListResultados->SetItemText(serieTreeId, COLUMNA_MEDICO, wxString::FromUTF8(s.GetDoctor().c_str()));
2049
m_pTreeListResultados->SetItemText(serieTreeId, COLUMNA_UID_VISIBLE, uidSerie);
2050
m_pTreeListResultados->SetItemText(serieTreeId, COLUMNA_UID, uidSerie);
2051
m_pTreeListResultados->SetItemText(serieTreeId, COLUMNA_ACCNUMBER, wxString::FromUTF8(estudio->GetAccNumber().c_str()));
2053
m_pTreeListResultados->SetItemImage(serieTreeId,ICONO_SERIE,wxTreeItemIcon_Normal);
2054
m_pTreeListResultados->SetItemImage(serieTreeId,ICONO_SERIE,wxTreeItemIcon_Selected);
2055
m_pTreeListResultados->SetItemImage(serieTreeId,ICONO_SERIE,wxTreeItemIcon_Expanded);
2056
m_pTreeListResultados->SetItemImage(serieTreeId,ICONO_SERIE,wxTreeItemIcon_SelectedExpanded);
2058
if (m_AutoAddSeries) {
2060
std::string uidPaciente = std::string(m_pTreeListResultados->GetItemText(pacienteTreeId, COLUMNA_UID).ToUTF8());
2061
std::string descPaciente = std::string(m_pTreeListResultados->GetItemText(pacienteTreeId).ToUTF8());
2063
std::string uidSerie = std::string(m_pTreeListResultados->GetItemText(serieTreeId, COLUMNA_UID).ToUTF8());
2064
std::string descSerie = std::string( (m_pTreeListResultados->GetItemText(serieTreeId) + _T("(") + m_pTreeListResultados->GetItemText(serieTreeId, COLUMNA_MODALIDAD) + _T(")") ).ToUTF8());
2066
std::string modalidadSerie = std::string(m_pTreeListResultados->GetItemText(serieTreeId, COLUMNA_MODALIDAD).ToUTF8());
2068
if( GNC::GCS::ControladorPermisos::Instance()->Get("core.pacs.download", modalidadSerie) ) {
2069
if (!questionMade && m_pDescargasGridTable->FindDescarga(uidSerie) != -1) {
2071
forceInit = wxMessageBox(_("Series were already in the download queue.\nDo you want to force download?"),_("Download warning"),wxICON_INFORMATION|wxYES_NO) == wxYES;
2073
questionMade = true;
2076
bool downloaded = m_pDescargasGridTable->AddDescarga(GetServerSeleccionado(), descPaciente, descSerie, uidSerie, modalidadSerie,forceInit, true);
2077
m_pTreeListResultados->SetItemBold(serieTreeId, downloaded);
2079
listaModalidad.insert(modalidadSerie);
2084
if (m_AutoAddSeries) {
2085
m_AutoAddSeries = false;
2086
m_AutoAddSeriesItem = NULL;
2088
m_pTreeListResultados->SortChildren(estudioTreeId);
2089
m_pTreeListResultados->Expand(estudioTreeId);
2091
} else if (estudioTreeId.IsOk()) {
2092
m_pTreeListResultados->Collapse(estudioTreeId);
2097
if ( listaModalidad.size() > 0) {
2098
std::ostringstream ostr;
2099
ostr << _Std("You are not allowed to download this kind of modalities (");
2100
bool primero = true;
2101
for (std::set<std::string>::iterator it = listaModalidad.begin(); it != listaModalidad.end(); ++it) {
2106
ostr << ", " << (*it);
2110
wxMessageBox(wxString::FromUTF8( ostr.str().c_str() ), _("Modality download error"), wxICON_ERROR);
2119
wxTreeItemId pacienteTreeId;
2120
wxTreeItemId estudioTreeId;
2121
wxTreeItemId serieTreeId;
2123
if (m_pComandoPACS->m_pPACSParams->m_error.size() > 0) {
2124
m_pComandoPACS = NULL;
2127
else if(pModelo->ListaPacientes().size() == 0){
2128
if (!m_pComandoPACS->EstaAbortado()) {
2129
LimpiarBusquedas(false);
2130
wxTreeItemId topTreeId = m_pTreeListResultados->GetRootItem();
2131
if (! topTreeId || ! topTreeId.IsOk() ) {
2132
topTreeId = m_pTreeListResultados->AddRoot(wxT("Top"));
2134
m_pTreeListResultados->AppendItem(topTreeId, _("No results found"));
2136
m_pComandoPACS = NULL;
2140
m_pComandoPACS = NULL;
2142
LimpiarBusquedas(false);
2144
wxTreeItemId topTreeId = m_pTreeListResultados->GetRootItem();
2145
if (! topTreeId || ! topTreeId.IsOk() ) {
2146
topTreeId = m_pTreeListResultados->AddRoot(wxT("Top"));
2150
m_pComandoPACS = NULL;
2158
wxWindowDisabler disableAll;
2162
for (IModeloDicom::ListaPacientesType::const_iterator it = pModelo->ListaPacientes().begin(); it != pModelo->ListaPacientes().end(); it++) {
2163
const IModeloPaciente& p = *it;
2164
std::string pacienteNombre = p.GetNombre() + " (" + p.GetUID() + ")";
2165
wxString nombrePaciente = wxString::FromUTF8(pacienteNombre.c_str());
2166
wxString uidPaciente = wxString::FromUTF8(p.GetUID().c_str());
2169
bool notfound = true;
2170
wxTreeItemId tid = topTreeId;
2171
std::list<wxTreeItemId> p_items = m_pTreeListResultados->GetPublicChildren(topTreeId);
2172
for (std::list<wxTreeItemId>::iterator ititem = p_items.begin(); ititem != p_items.end(); ititem++) {
2173
wxTreeItemId cid = *ititem;
2175
m_pTreeListResultados->GetItemText(cid) == nombrePaciente &&
2176
m_pTreeListResultados->GetItemText(cid, COLUMNA_UID) == uidPaciente
2179
pacienteTreeId = cid;
2184
pacienteTreeId = m_pTreeListResultados->AppendItem(topTreeId, nombrePaciente);
2185
m_pTreeListResultados->SetItemText(pacienteTreeId, COLUMNA_UID, uidPaciente);
2188
m_pTreeListResultados->SetItemBold(pacienteTreeId, true);
2189
m_pTreeListResultados->SetItemTextColour(pacienteTreeId, *wxBLUE);
2193
if(p.GetSexo() == "M") {
2194
icono = ICONO_HOMBRE;
2195
} else if(p.GetSexo() == "F") {
2196
icono = ICONO_MUJER;
2201
m_pTreeListResultados->SetItemImage(pacienteTreeId,icono,wxTreeItemIcon_Normal);
2202
m_pTreeListResultados->SetItemImage(pacienteTreeId,icono,wxTreeItemIcon_Selected);
2203
m_pTreeListResultados->SetItemImage(pacienteTreeId,icono,wxTreeItemIcon_Expanded);
2204
m_pTreeListResultados->SetItemImage(pacienteTreeId,icono,wxTreeItemIcon_SelectedExpanded);
2207
if (!pacienteTreeId) {
2211
for (IModeloPaciente::ListaEstudiosType::const_iterator it2 = p.ListaEstudios().begin(); it2 != p.ListaEstudios().end(); it2++) {
2212
const IModeloEstudio& e = *it2;
2215
hora.ParseFormat( wxString::FromUTF8( (e.GetHora()).c_str() ).GetData(), wxT("%H%M%S"), wxDefaultDateTime);
2216
fecha.ParseFormat( wxString::FromUTF8( (e.GetFecha()).c_str() ).GetData(), wxT("%Y%m%d"), wxDefaultDateTime);
2218
wxString modalidadEstudio = wxString::FromUTF8(e.GetModalidad().c_str());
2219
wxString uidEstudio = wxString::FromUTF8(e.GetUID().c_str());
2220
wxString descripcionEstudio = wxString::FromUTF8(e.GetDescripcion().c_str());
2221
wxString AccNumber = wxString::FromUTF8(e.GetAccNumber().c_str());
2222
wxString medicoEstudio = wxString::FromUTF8(e.GetDoctor().c_str());
2226
if(fecha.IsValid()){
2227
if (hora.IsValid()) {
2229
fecha.SetHour(hora.GetHour());
2230
fecha.SetMinute(hora.GetMinute());
2231
fecha.SetSecond(hora.GetSecond());
2233
fechaStr = wxString(fecha.Format(_("%m/%d/%Y %H:%M:%S"), wxDateTime::TimeZone(wxDateTime::GMT1)));
2236
fechaStr = wxString(fecha.Format(_("%m/%d/%Y 00:00:00"), wxDateTime::TimeZone(wxDateTime::GMT1)));
2240
fechaStr = _("00/00/0000 00:00:00");
2243
std::list<wxTreeItemId> e_items = m_pTreeListResultados->GetPublicChildren(pacienteTreeId);
2244
for (std::list<wxTreeItemId>::iterator ititem = e_items.begin(); ititem != e_items.end(); ititem++) {
2245
wxTreeItemId cid = *ititem;
2247
m_pTreeListResultados->GetItemText(cid) == descripcionEstudio &&
2248
m_pTreeListResultados->GetItemText(cid, COLUMNA_MODALIDAD) == modalidadEstudio&&
2249
m_pTreeListResultados->GetItemText(cid, COLUMNA_FECHA) == fechaStr &&
2250
m_pTreeListResultados->GetItemText(cid, COLUMNA_MEDICO) == medicoEstudio &&
2251
m_pTreeListResultados->GetItemText(cid, COLUMNA_UID_VISIBLE) == uidEstudio &&
2252
m_pTreeListResultados->GetItemText(cid, COLUMNA_UID) == uidEstudio &&
2253
m_pTreeListResultados->GetItemText(cid, COLUMNA_ACCNUMBER) == AccNumber
2256
estudioTreeId = cid;
2262
estudioTreeId = m_pTreeListResultados->AppendItem(pacienteTreeId, descripcionEstudio);
2263
m_pTreeListResultados->SetItemText(estudioTreeId, COLUMNA_MODALIDAD, modalidadEstudio);
2264
m_pTreeListResultados->SetItemText(estudioTreeId, COLUMNA_FECHA, fechaStr);
2266
m_pTreeListResultados->SetItemText(estudioTreeId, COLUMNA_MEDICO, medicoEstudio);
2267
m_pTreeListResultados->SetItemText(estudioTreeId, COLUMNA_UID_VISIBLE, uidEstudio);
2268
m_pTreeListResultados->SetItemText(estudioTreeId, COLUMNA_UID, uidEstudio);
2269
m_pTreeListResultados->SetItemText(estudioTreeId, COLUMNA_ACCNUMBER, AccNumber);
2273
m_pTreeListResultados->SetItemImage(estudioTreeId,ICONO_ESTUDIO,wxTreeItemIcon_Normal);
2274
m_pTreeListResultados->SetItemImage(estudioTreeId,ICONO_ESTUDIO,wxTreeItemIcon_Selected);
2275
m_pTreeListResultados->SetItemImage(estudioTreeId,ICONO_ESTUDIO,wxTreeItemIcon_Expanded);
2276
m_pTreeListResultados->SetItemImage(estudioTreeId,ICONO_ESTUDIO,wxTreeItemIcon_SelectedExpanded);
2279
if (!estudioTreeId) {
2283
if (m_Mode == TD_SERIES)
2285
for (IModeloEstudio::ListaSeriesType::const_iterator it3 = e.ListaSeries().begin(); it3 != e.ListaSeries().end(); it3++) {
2286
const IModeloSerie& s = *it3;
2287
wxString uidSerie = wxString::FromUTF8(s.GetUID().c_str());
2288
wxString numeroDeImagenes = wxString::FromUTF8(s.GetNumero().c_str());
2289
wxString tipoSerie = wxString::FromUTF8(s.GetTipo().c_str());
2290
wxString descripcionSerie = wxString::FromUTF8(s.GetDescripcion().c_str());
2291
wxString medicoSerie = wxString::FromUTF8(s.GetDoctor().c_str());
2292
wxDateTime fechaSerie;
2293
wxDateTime horaSerie;
2294
hora.ParseFormat( wxString::FromUTF8( (s.GetHora()).c_str() ).GetData(), wxT("%H%M%S"), wxDefaultDateTime);
2295
fecha.ParseFormat( wxString::FromUTF8( (s.GetFecha()).c_str() ).GetData(), wxT("%Y%m%d"), wxDefaultDateTime);
2297
wxString fechaSerieStr;
2299
if(fechaSerie.IsValid()){
2300
if (horaSerie.IsValid()) {
2301
fechaSerie.SetHour(horaSerie.GetHour());
2302
fechaSerie.SetMinute(horaSerie.GetMinute());
2303
fechaSerie.SetSecond(horaSerie.GetSecond());
2305
fechaSerieStr = wxString(fechaSerie.Format(_("%m/%d/%Y %H:%M:%S"), wxDateTime::TimeZone(wxDateTime::GMT1)));
2308
fechaSerieStr = wxString(fechaSerie.Format(_("%m/%d/%Y 00:00:00"), wxDateTime::TimeZone(wxDateTime::GMT1)));
2312
fechaSerieStr = _("00/00/0000 00:00:00");
2315
std::list<wxTreeItemId> s_items = m_pTreeListResultados->GetPublicChildren(estudioTreeId);
2316
for (std::list<wxTreeItemId>::iterator ititem = s_items.begin(); ititem != s_items.end(); ititem++) {
2317
wxTreeItemId cid = *ititem;
2320
m_pTreeListResultados->GetItemText(cid) == descripcionSerie &&
2321
m_pTreeListResultados->GetItemText(cid, COLUMNA_MODALIDAD) == tipoSerie &&
2322
m_pTreeListResultados->GetItemText(cid, COLUMNA_FECHA) == fechaSerieStr &&
2323
m_pTreeListResultados->GetItemText(cid, COLUMNA_MEDICO) == medicoSerie &&
2324
m_pTreeListResultados->GetItemText(cid, COLUMNA_UID_VISIBLE) == uidSerie &&
2325
m_pTreeListResultados->GetItemText(cid, COLUMNA_UID) == uidSerie
2334
serieTreeId = m_pTreeListResultados->AppendItem(estudioTreeId, descripcionSerie);
2336
m_pTreeListResultados->SetItemText(serieTreeId, COLUMNA_MODALIDAD, tipoSerie);
2337
m_pTreeListResultados->SetItemText(serieTreeId, COLUMNA_FECHA, fechaSerieStr);
2339
m_pTreeListResultados->SetItemText(serieTreeId, COLUMNA_MEDICO, medicoSerie);
2340
m_pTreeListResultados->SetItemText(serieTreeId, COLUMNA_UID_VISIBLE, uidSerie);
2341
m_pTreeListResultados->SetItemText(serieTreeId, COLUMNA_UID, uidSerie);
2342
m_pTreeListResultados->SetItemText(serieTreeId, COLUMNA_ACCNUMBER, AccNumber);
2344
m_pTreeListResultados->SetItemImage(serieTreeId,ICONO_SERIE,wxTreeItemIcon_Normal);
2345
m_pTreeListResultados->SetItemImage(serieTreeId,ICONO_SERIE,wxTreeItemIcon_Selected);
2346
m_pTreeListResultados->SetItemImage(serieTreeId,ICONO_SERIE,wxTreeItemIcon_Expanded);
2347
m_pTreeListResultados->SetItemImage(serieTreeId,ICONO_SERIE,wxTreeItemIcon_SelectedExpanded);
2350
if(e.ListaSeries().size() == 0)
2352
wxTreeItemId serieTreeId = m_pTreeListResultados->AppendItem(estudioTreeId, _("Searching..."));
2357
m_pTreeListResultados->SortChildren(m_pTreeListResultados->GetRootItem());
2360
}//else rellenar el arbol
2362
m_pTreeListResultados->Refresh(false);
2363
//m_pBotonBusqueda->SetAutoLayout(true);
2368
void GNC::GUI::DialogoAdquisicion::ProcesarEvento(GNC::GCS::Eventos::IEvento *evt)
2370
GNC::GCS::Eventos::EventoProgresoComando* pEvt = dynamic_cast<GNC::GCS::Eventos::EventoProgresoComando*> (evt);
2371
if (pEvt == NULL || pEvt->GetComando() == NULL || pEvt->GetComando() != m_pComandoPACS) {
2374
switch (pEvt->GetTipo()) {
2375
case GNC::GCS::Eventos::EventoProgresoComando::TEP_Iniciado:
2377
case GNC::GCS::Eventos::EventoProgresoComando::TEP_Progreso:
2379
case GNC::GCS::Eventos::EventoProgresoComando::TEP_Finalizado:
2380
m_pTextControlField->ShowCancelButton(false);
2381
ShowAnimation(false);
2382
m_pComandoPACS = NULL;
2384
case GNC::GCS::Eventos::EventoProgresoComando::TEP_Unknown: