X-Git-Url: http://git.kpe.io/?p=ctsim.git;a=blobdiff_plain;f=src%2Fdocs.cpp;h=82a740e7b2412aeefe854aa08c4076c35b7ee39c;hp=c9f2b3ff0af45bfbb01e3998274fc267a4bf7c42;hb=8a7697ce57b56cdc43698cd1241ad98d49f9b5ac;hpb=ba8635d790ee847d9746c6da24b60bd4cb6d9116 diff --git a/src/docs.cpp b/src/docs.cpp index c9f2b3f..82a740e 100644 --- a/src/docs.cpp +++ b/src/docs.cpp @@ -1,7 +1,7 @@ /***************************************************************************** ** FILE IDENTIFICATION ** -** Name: doc.cpp +** Name: docs.cpp ** Purpose: Document routines for CTSim program ** Programmer: Kevin Rosenberg ** Date Started: July 2000 @@ -9,7 +9,7 @@ ** This is part of the CTSim program ** Copyright (c) 1983-2001 Kevin Rosenberg ** -** $Id: docs.cpp,v 1.19 2001/01/30 07:32:13 kevin Exp $ +** $Id$ ** ** 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 @@ -25,22 +25,14 @@ ** Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA ******************************************************************************/ -#ifdef __GNUG__ -// #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 +42,8 @@ #include "ctsim.h" #include "docs.h" #include "views.h" +#include "threadrecon.h" + // ImageFileDocument @@ -61,7 +55,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,11 +71,14 @@ bool ImageFileDocument::OnOpenDocument(const wxString& filename) m_bBadFileOpen = true; return false; } - *theApp->getLog() << "Read image file " << filename << "\n"; + + if (theApp->getVerboseLogging() && filename != "") + *theApp->getLog() << "Read image file " << filename << "\n"; + SetFilename(filename, true); Modify(false); + getView()->setInitialClientSize(); UpdateAllViews(); - getView()->OnUpdate (getView(), NULL); m_bBadFileOpen = false; return true; @@ -104,7 +102,6 @@ ImageFileDocument::getView() const return dynamic_cast(GetFirstView()); } - bool ImageFileDocument::Revert () { @@ -114,20 +111,81 @@ 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()); } } - getView()->OnUpdate (getView(), NULL); UpdateAllViews(); return true; } +void +ImageFileDocument::Activate() +{ +#if CTSIM_MDI + getView()->getFrame()->Activate(); +#endif +}; + +// BackgroundProcessingDocument - Base Class + +IMPLEMENT_DYNAMIC_CLASS(BackgroundProcessingDocument, wxDocument) +BEGIN_EVENT_TABLE(BackgroundProcessingDocument, wxDocument) +END_EVENT_TABLE() + +#ifdef HAVE_WXTHREADS +void +BackgroundProcessingDocument::addBackgroundSupervisor (BackgroundSupervisor* pSupervisor) +{ + wxCriticalSectionLocker locker (m_criticalSection); + if (pSupervisor) + m_vecpBackgroundSupervisors.push_back (pSupervisor); +} + +void +BackgroundProcessingDocument::removeBackgroundSupervisor (BackgroundSupervisor* pSupervisor) +{ + 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]"); +} +#endif + +void +BackgroundProcessingDocument::cancelRunningTasks() +{ +#ifdef HAVE_WXTHREADS + m_criticalSection.Enter(); + for (BackgroundContainer::iterator i = m_vecpBackgroundSupervisors.begin(); + i != m_vecpBackgroundSupervisors.end(); i++) + (*i)->onCancel(); + m_criticalSection.Leave(); + + while (m_vecpBackgroundSupervisors.size() > 0) { + ::wxYield(); + ::wxUsleep(50); + } +#endif +} + + // ProjectionFileDocument -IMPLEMENT_DYNAMIC_CLASS(ProjectionFileDocument, wxDocument) +IMPLEMENT_DYNAMIC_CLASS(ProjectionFileDocument, BackgroundProcessingDocument) bool ProjectionFileDocument::OnSaveDocument(const wxString& filename) @@ -136,11 +194,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,12 +218,15 @@ ProjectionFileDocument::OnOpenDocument(const wxString& filename) m_bBadFileOpen = true; return false; } - *theApp->getLog() << "Read projection file " << filename << "\n"; + m_bBadFileOpen = false; + + if (theApp->getVerboseLogging() && filename != "") + *theApp->getLog() << "Read projection file " << filename << "\n"; + SetFilename(filename, true); Modify(false); + getView()->setInitialClientSize(); UpdateAllViews(); - GetFirstView()->OnUpdate (GetFirstView(), NULL); - m_bBadFileOpen = false; return true; } @@ -181,35 +250,49 @@ ProjectionFileDocument::getView() const return dynamic_cast(GetFirstView()); } +void +ProjectionFileDocument::Activate() +{ +#if CTSIM_MDI + getView()->getFrame()->Activate(); +#endif +}; + // PhantomFileDocument -IMPLEMENT_DYNAMIC_CLASS(PhantomFileDocument, wxDocument) +IMPLEMENT_DYNAMIC_CLASS(PhantomFileDocument, BackgroundProcessingDocument) + +PhantomFileDocument::~PhantomFileDocument() +{ + cancelRunningTasks(); +} bool -PhantomFileDocument::OnOpenDocument(const wxString& filename) +PhantomFileDocument::OnOpenDocument(const wxString& constFilename) { if (! OnSaveModified()) return false; - wxString myFilename = filename; - if (wxFile::Exists (myFilename)) { - m_phantom.createFromFile (myFilename); - *theApp->getLog() << "Read phantom file " << filename << "\n"; + wxString filename (constFilename); + + if (wxFile::Exists (filename)) { + m_phantom.createFromFile (filename); + if (theApp->getVerboseLogging()) + *theApp->getLog() << "Read phantom file " << filename << "\n"; } else { - myFilename.Replace (".phm", ""); - m_phantom.createFromPhantom (myFilename); + filename.Replace (".phm", ""); + m_phantom.createFromPhantom (filename); } - m_namePhantom = myFilename; - SetFilename (myFilename, true); + m_namePhantom = filename; + SetFilename (filename, true); if (m_phantom.fail()) { - *theApp->getLog() << "Failure creating phantom " << myFilename << "\n"; + *theApp->getLog() << "Failure creating phantom " << filename << "\n"; m_bBadFileOpen = true; return false; } m_idPhantom = m_phantom.id(); Modify(false); UpdateAllViews(); - GetFirstView()->OnUpdate (GetFirstView(), NULL); m_bBadFileOpen = false; return true; @@ -222,7 +305,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; } @@ -246,6 +330,14 @@ PhantomFileDocument::getView() const return dynamic_cast(GetFirstView()); } +void +PhantomFileDocument::Activate() +{ +#if CTSIM_MDI + getView()->getFrame()->Activate(); +#endif +}; + // PlotFileDocument IMPLEMENT_DYNAMIC_CLASS(PlotFileDocument, wxDocument) @@ -258,7 +350,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,13 +367,16 @@ PlotFileDocument::OnOpenDocument(const wxString& filename) m_bBadFileOpen = true; return false; } - *theApp->getLog() << "Read plot file " << filename << "\n"; + m_bBadFileOpen = false; + + if (theApp->getVerboseLogging() && filename != "") + *theApp->getLog() << "Read plot file " << filename << "\n"; + SetFilename (filename, true); m_namePlot = filename.c_str(); Modify (false); + getView()->setInitialClientSize(); UpdateAllViews(); - GetFirstView()->OnUpdate (NULL, NULL); - m_bBadFileOpen = false; return true; } @@ -304,6 +400,14 @@ PlotFileDocument::getView() const return dynamic_cast(GetFirstView()); } +void +PlotFileDocument::Activate() +{ +#if CTSIM_MDI + getView()->getFrame()->Activate(); +#endif +}; + ////////////////////////////////////////////////////////////////////////// // // TextFileDocument @@ -371,8 +475,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_nx(0),m_ny(0),m_array(0) +{ +} + +Graph3dFileDocument::~Graph3dFileDocument() +{ +} + bool Graph3dFileDocument::OnSaveDocument(const wxString& filename) { @@ -385,6 +500,7 @@ Graph3dFileDocument::OnOpenDocument(const wxString& filename) { SetFilename (filename, true); Modify (false); + getView()->setInitialClientSize(); UpdateAllViews(); m_bBadFileOpen = false; return true; @@ -403,3 +519,23 @@ Graph3dFileDocument::getView() const return dynamic_cast(GetFirstView()); } +bool +Graph3dFileDocument::createFromImageFile (const ImageFile& rImageFile) +{ + m_nx = rImageFile.nx(); + m_ny = rImageFile.ny(); + m_array = rImageFile.getArray(); + + return true; +} + +void +Graph3dFileDocument::Activate() +{ +#if CTSIM_MDI + getView()->getFrame()->Activate(); +#endif +}; + + +#endif // wxUSE_GLCANVAS