r584: no message
[ctsim.git] / src / docs.cpp
index b356033164193c8a900a84b1d0ed1678895d974e..96f7ee3c2ae793d842e34f91a0fce7abdb99b47f 100644 (file)
@@ -9,7 +9,7 @@
 **  This is part of the CTSim program
 **  Copyright (c) 1983-2001 Kevin Rosenberg
 **
-**  $Id: docs.cpp,v 1.26 2001/02/23 18:56:56 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
@@ -126,70 +126,88 @@ ImageFileDocument::Revert ()
   return true;
 }
 
-// ProjectionFileDocument
+// BackgroundProcessingDocument - Base Class
 
-IMPLEMENT_DYNAMIC_CLASS(ProjectionFileDocument, wxDocument)
-BEGIN_EVENT_TABLE(ProjectionFileDocument, wxDocument)
-EVT_MENU(BackgroundSupervisor::MSG_BACKGROUND_SUPERVISOR_ADD, ProjectionFileDocument::OnAddBackground)
-EVT_MENU(BackgroundSupervisor::MSG_BACKGROUND_SUPERVISOR_REMOVE, ProjectionFileDocument::OnRemoveBackground)
+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()
 
-bool 
-ProjectionFileDocument::OnSaveDocument(const wxString& filename)
+void
+BackgroundProcessingDocument::OnAddBackground (wxCommandEvent& event)
 {
-  if (! m_pProjectionFile->write (filename.c_str())) {
-    *theApp->getLog() << "Unable to write projection file " << filename << "\n";
-    return false;
-  }
-  if (theApp->getVerboseLogging())
-    *theApp->getLog() << "Wrote projection file " << filename << "\n";
-  Modify(false);
-  return true;
+  BackgroundSupervisor* pSupervisor = reinterpret_cast<BackgroundSupervisor*>(event.GetClientData());
+  wxASSERT (pSupervisor != NULL);
+
+  wxCriticalSectionLocker locker (m_criticalSection);
+  if (pSupervisor)
+    m_vecpBackgroundSupervisors.push_back (pSupervisor);
 }
 
-ProjectionFileDocument::~ProjectionFileDocument()
+void
+BackgroundProcessingDocument::OnRemoveBackground (wxCommandEvent& event)
 {
+  BackgroundSupervisor* pSupervisor = reinterpret_cast<BackgroundSupervisor*>(event.GetClientData());
+  wxASSERT (pSupervisor != NULL);
+
+  m_criticalSection.Enter();
+  bool bFound = false;
   for (BackgroundContainer::iterator i = m_vecpBackgroundSupervisors.begin(); 
-        i != m_vecpBackgroundSupervisors.end(); i++) {
-          (*i)->cancel();
-    }
+        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]");
   
-  m_vecpBackgroundSupervisors.clear();
-  delete m_pProjectionFile;
+  wxCommandEvent ackEvent (wxEVT_COMMAND_MENU_SELECTED, BackgroundSupervisor::MSG_DOCUMENT_ACK_REMOVE);
+  wxPostEvent (pSupervisor, ackEvent);
 }
 
 void
-ProjectionFileDocument::OnAddBackground (wxCommandEvent& event)
+BackgroundProcessingDocument::cancelRunningTasks()
 {
-}
+  m_criticalSection.Enter();
+  for (BackgroundContainer::iterator i = m_vecpBackgroundSupervisors.begin(); 
+        i != m_vecpBackgroundSupervisors.end(); i++)
+          BackgroundSupervisor::cancelSupervisor(*i);
+  m_criticalSection.Leave();
 
-void
-ProjectionFileDocument::OnRemoveBackground (wxCommandEvent& event)
-{
+  while (m_vecpBackgroundSupervisors.size() > 0) {
+     ::wxYield();
+     ::wxUsleep(50);
+  }
 }
 
-void
-ProjectionFileDocument::addReconstructor (BackgroundSupervisor* pRecon)
+
+// ProjectionFileDocument
+
+IMPLEMENT_DYNAMIC_CLASS(ProjectionFileDocument, BackgroundProcessingTask)
+
+bool 
+ProjectionFileDocument::OnSaveDocument(const wxString& filename)
 {
-  wxCriticalSectionLocker locker (m_criticalSection);
-  m_vecpBackgroundSupervisors.push_back (pRecon);
+  if (! m_pProjectionFile->write (filename.c_str())) {
+    *theApp->getLog() << "Unable to write projection file " << filename << "\n";
+    return false;
+  }
+  if (theApp->getVerboseLogging())
+    *theApp->getLog() << "Wrote projection file " << filename << "\n";
+  Modify(false);
+  return true;
 }
 
-void
-ProjectionFileDocument::removeReconstructor (BackgroundSupervisor* pRecon)
+ProjectionFileDocument::~ProjectionFileDocument()
 {
-  wxCriticalSectionLocker locker (m_criticalSection);
-  bool bFound = false;
-  for (BackgroundContainer::iterator i = m_vecpBackgroundSupervisors.begin(); 
-        i != m_vecpBackgroundSupervisors.end(); 
-        i++) 
-          if (*i == pRecon) {
-            m_vecpBackgroundSupervisors.erase(i);
-            bFound = true;
-            break;
-        }
-   if (! bFound) 
-     sys_error (ERR_SEVERE, "Could not find background task [ProjectionFileDocument::removeBackgroundTask");
+  cancelRunningTasks();
+
+  delete m_pProjectionFile;
 }
 
 bool 
@@ -235,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)