X-Git-Url: http://git.kpe.io/?a=blobdiff_plain;f=src%2Fdocs.cpp;h=96f7ee3c2ae793d842e34f91a0fce7abdb99b47f;hb=4d5f56994972346351a48730315a7d85924103ba;hp=59371ab10fd589eb751a63fedf19e43c2f91494e;hpb=31a835d9aebd8acb367a033cc92efb4c944a7b4d;p=ctsim.git diff --git a/src/docs.cpp b/src/docs.cpp index 59371ab..96f7ee3 100644 --- a/src/docs.cpp +++ b/src/docs.cpp @@ -9,7 +9,7 @@ ** This is part of the CTSim program ** Copyright (c) 1983-2001 Kevin Rosenberg ** -** $Id: docs.cpp,v 1.20 2001/01/30 10:58:13 kevin Exp $ +** $Id: docs.cpp,v 1.30 2001/02/25 16:21:36 kevin Exp $ ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License (version 2) as @@ -29,18 +29,14 @@ // #pragma implementation #endif -// For compilers that support precompilation, includes "wx/wx.h". #include "wx/wxprec.h" -#ifdef __BORLANDC__ -#pragma hdrstop -#endif - #ifndef WX_PRECOMP #include "wx/wx.h" #endif #include "wx/txtstrm.h" #include "wx/file.h" +#include "wx/thread.h" #if !wxUSE_DOC_VIEW_ARCHITECTURE #error You must set wxUSE_DOC_VIEW_ARCHITECTURE to 1 in setup.h! @@ -50,6 +46,8 @@ #include "ctsim.h" #include "docs.h" #include "views.h" +#include "threadrecon.h" + // ImageFileDocument @@ -61,7 +59,8 @@ bool ImageFileDocument::OnSaveDocument(const wxString& filename) *theApp->getLog() << "Unable to write image file " << filename << "\n"; return false; } - *theApp->getLog() << "Wrote image file " << filename << "\n"; + if (theApp->getVerboseLogging()) + *theApp->getLog() << "Wrote image file " << filename << "\n"; Modify(false); return true; } @@ -76,7 +75,8 @@ bool ImageFileDocument::OnOpenDocument(const wxString& filename) m_bBadFileOpen = true; return false; } - *theApp->getLog() << "Read image file " << filename << "\n"; + if (theApp->getVerboseLogging()) + *theApp->getLog() << "Read image file " << filename << "\n"; SetFilename(filename, true); Modify(false); UpdateAllViews(); @@ -114,7 +114,8 @@ ImageFileDocument::Revert () msg += "?"; wxMessageDialog dialog (getView()->getFrame(), msg, "Are you sure?", wxYES_NO | wxNO_DEFAULT); if (dialog.ShowModal() == wxID_YES) { - *theApp->getLog() << "Reverting to saved " << GetFilename() << "\n"; + if (theApp->getVerboseLogging()) + *theApp->getLog() << "Reverting to saved " << GetFilename() << "\n"; Modify (false); OnOpenDocument (GetFilename()); } @@ -125,9 +126,69 @@ ImageFileDocument::Revert () return true; } +// BackgroundProcessingDocument - Base Class + +IMPLEMENT_DYNAMIC_CLASS(BackgroundProcessingDocument, wxDocument) +BEGIN_EVENT_TABLE(BackgroundProcessingDocument, wxDocument) +EVT_MENU(BackgroundSupervisor::MSG_BACKGROUND_SUPERVISOR_ADD, BackgroundProcessingDocument::OnAddBackground) +EVT_MENU(BackgroundSupervisor::MSG_BACKGROUND_SUPERVISOR_REMOVE, BackgroundProcessingDocument::OnRemoveBackground) +END_EVENT_TABLE() + +void +BackgroundProcessingDocument::OnAddBackground (wxCommandEvent& event) +{ + BackgroundSupervisor* pSupervisor = reinterpret_cast(event.GetClientData()); + wxASSERT (pSupervisor != NULL); + + wxCriticalSectionLocker locker (m_criticalSection); + if (pSupervisor) + m_vecpBackgroundSupervisors.push_back (pSupervisor); +} + +void +BackgroundProcessingDocument::OnRemoveBackground (wxCommandEvent& event) +{ + BackgroundSupervisor* pSupervisor = reinterpret_cast(event.GetClientData()); + wxASSERT (pSupervisor != NULL); + + m_criticalSection.Enter(); + bool bFound = false; + for (BackgroundContainer::iterator i = m_vecpBackgroundSupervisors.begin(); + i != m_vecpBackgroundSupervisors.end(); + i++) + if (*i == pSupervisor) { + m_vecpBackgroundSupervisors.erase(i); + bFound = true; + break; + } + m_criticalSection.Leave(); + + if (! bFound) + sys_error (ERR_SEVERE, "Could not find background task [OnRemoveBackground]"); + + wxCommandEvent ackEvent (wxEVT_COMMAND_MENU_SELECTED, BackgroundSupervisor::MSG_DOCUMENT_ACK_REMOVE); + wxPostEvent (pSupervisor, ackEvent); +} + +void +BackgroundProcessingDocument::cancelRunningTasks() +{ + m_criticalSection.Enter(); + for (BackgroundContainer::iterator i = m_vecpBackgroundSupervisors.begin(); + i != m_vecpBackgroundSupervisors.end(); i++) + BackgroundSupervisor::cancelSupervisor(*i); + m_criticalSection.Leave(); + + while (m_vecpBackgroundSupervisors.size() > 0) { + ::wxYield(); + ::wxUsleep(50); + } +} + + // ProjectionFileDocument -IMPLEMENT_DYNAMIC_CLASS(ProjectionFileDocument, wxDocument) +IMPLEMENT_DYNAMIC_CLASS(ProjectionFileDocument, BackgroundProcessingTask) bool ProjectionFileDocument::OnSaveDocument(const wxString& filename) @@ -136,11 +197,19 @@ ProjectionFileDocument::OnSaveDocument(const wxString& filename) *theApp->getLog() << "Unable to write projection file " << filename << "\n"; return false; } - *theApp->getLog() << "Wrote projection file " << filename << "\n"; + if (theApp->getVerboseLogging()) + *theApp->getLog() << "Wrote projection file " << filename << "\n"; Modify(false); return true; } +ProjectionFileDocument::~ProjectionFileDocument() +{ + cancelRunningTasks(); + + delete m_pProjectionFile; +} + bool ProjectionFileDocument::OnOpenDocument(const wxString& filename) { @@ -152,7 +221,8 @@ ProjectionFileDocument::OnOpenDocument(const wxString& filename) m_bBadFileOpen = true; return false; } - *theApp->getLog() << "Read projection file " << filename << "\n"; + if (theApp->getVerboseLogging()) + *theApp->getLog() << "Read projection file " << filename << "\n"; SetFilename(filename, true); Modify(false); UpdateAllViews(); @@ -183,7 +253,12 @@ ProjectionFileDocument::getView() const // PhantomFileDocument -IMPLEMENT_DYNAMIC_CLASS(PhantomFileDocument, wxDocument) +IMPLEMENT_DYNAMIC_CLASS(PhantomFileDocument, BackgroundProcessingTask) + +PhantomFileDocument::~PhantomFileDocument() +{ + cancelRunningTasks(); +} bool PhantomFileDocument::OnOpenDocument(const wxString& filename) @@ -194,7 +269,8 @@ PhantomFileDocument::OnOpenDocument(const wxString& filename) wxString myFilename = filename; if (wxFile::Exists (myFilename)) { m_phantom.createFromFile (myFilename); - *theApp->getLog() << "Read phantom file " << filename << "\n"; + if (theApp->getVerboseLogging()) + *theApp->getLog() << "Read phantom file " << filename << "\n"; } else { myFilename.Replace (".phm", ""); m_phantom.createFromPhantom (myFilename); @@ -222,7 +298,8 @@ PhantomFileDocument::OnSaveDocument(const wxString& filename) *theApp->getLog() << "Unable to write phantom file " << filename << "\n"; return false; } - *theApp->getLog() << "Wrote phantom file " << filename << "\n"; + if (theApp->getVerboseLogging()) + *theApp->getLog() << "Wrote phantom file " << filename << "\n"; Modify(false); return true; } @@ -258,7 +335,8 @@ PlotFileDocument::OnSaveDocument(const wxString& filename) *theApp->getLog() << "Unable to write plot file " << filename << "\n"; return false; } - *theApp->getLog() << "Wrote plot file " << filename << "\n"; + if (theApp->getVerboseLogging()) + *theApp->getLog() << "Wrote plot file " << filename << "\n"; Modify(false); return true; } @@ -274,7 +352,8 @@ PlotFileDocument::OnOpenDocument(const wxString& filename) m_bBadFileOpen = true; return false; } - *theApp->getLog() << "Read plot file " << filename << "\n"; + if (theApp->getVerboseLogging()) + *theApp->getLog() << "Read plot file " << filename << "\n"; SetFilename (filename, true); m_namePlot = filename.c_str(); Modify (false); @@ -371,17 +450,19 @@ TextFileDocument::getTextCtrl() // ////////////////////////////////////////////////////////////////////////// +#if wxUSE_GLCANVAS + IMPLEMENT_DYNAMIC_CLASS(Graph3dFileDocument, wxDocument) Graph3dFileDocument::Graph3dFileDocument(void) -: m_bBadFileOpen(false), m_nVertices(0), m_pVertices(0), m_pNormals(0) +: m_bBadFileOpen(false), m_nVertices(0), m_pVertices(0), m_pNormals(0),m_nx(0),m_ny(0),m_array(0) { } Graph3dFileDocument::~Graph3dFileDocument() { - delete [] m_pVertices; - delete [] m_pNormals; +// delete [] m_pVertices; +// delete [] m_pNormals; } bool @@ -417,29 +498,15 @@ Graph3dFileDocument::getView() const bool Graph3dFileDocument::createFromImageFile (const ImageFile& rImageFile) { - delete [] m_pVertices; - delete [] m_pNormals; +// delete [] m_pVertices; +// delete [] m_pNormals; + m_nx = rImageFile.nx(); m_ny = rImageFile.ny(); m_array = rImageFile.getArray(); -#if 0 - const int nTriangles = nx * ny; - m_nVertices = nTriangles; - m_pVertices = new glTripleFloat [nTriangles]; - m_pNormals = new glTripleFloat [nTriangles]; - - for (unsigned int ix = 0; ix < nx; ix++) { - for (unsigned int iy = 0; iy < ny; iy++) { - const int iTriangle = ix * iy; - m_pVertices[iTriangle][0] = ix; - m_pVertices[iTriangle][1] = iy; - m_pVertices[iTriangle][2] = v[ix][iy]; - m_pNormals[iTriangle][0] = 0; - m_pNormals[iTriangle][1] = 0; - m_pNormals[iTriangle][2] = 0; - } - } -#endif + return true; } + +#endif // wxUSE_GLCANVAS