r578: no message
[ctsim.git] / src / docs.cpp
index b356033164193c8a900a84b1d0ed1678895d974e..16462d7bb27544ff5cdc8c9e51b6de72ae6d91cb 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.28 2001/02/25 06:32:12 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
@@ -149,47 +149,54 @@ ProjectionFileDocument::OnSaveDocument(const wxString& filename)
 
 ProjectionFileDocument::~ProjectionFileDocument()
 {
+  m_criticalSection.Enter();
   for (BackgroundContainer::iterator i = m_vecpBackgroundSupervisors.begin(); 
-        i != m_vecpBackgroundSupervisors.end(); i++) {
-          (*i)->cancel();
-    }
-  
-  m_vecpBackgroundSupervisors.clear();
+        i != m_vecpBackgroundSupervisors.end(); i++)
+          BackgroundSupervisor::cancelSupervisor(*i);
+  m_criticalSection.Leave();
+
+  while (m_vecpBackgroundSupervisors.size() > 0) {
+     ::wxUsleep(50);
+     ::wxYield();
+  }
+
   delete m_pProjectionFile;
 }
 
 void
 ProjectionFileDocument::OnAddBackground (wxCommandEvent& event)
 {
-}
-
-void
-ProjectionFileDocument::OnRemoveBackground (wxCommandEvent& event)
-{
-}
+  BackgroundSupervisor* pSupervisor = reinterpret_cast<BackgroundSupervisor*>(event.GetClientData());
+  wxASSERT (pSupervisor != NULL);
 
-void
-ProjectionFileDocument::addReconstructor (BackgroundSupervisor* pRecon)
-{
   wxCriticalSectionLocker locker (m_criticalSection);
-  m_vecpBackgroundSupervisors.push_back (pRecon);
+  if (pSupervisor)
+    m_vecpBackgroundSupervisors.push_back (pSupervisor);
 }
 
 void
-ProjectionFileDocument::removeReconstructor (BackgroundSupervisor* pRecon)
+ProjectionFileDocument::OnRemoveBackground (wxCommandEvent& event)
 {
-  wxCriticalSectionLocker locker (m_criticalSection);
+  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++) 
-          if (*i == pRecon) {
+          if (*i == pSupervisor) {
             m_vecpBackgroundSupervisors.erase(i);
             bFound = true;
             break;
         }
-   if (! bFound) 
+  m_criticalSection.Leave();
+
+  if (! bFound) 
      sys_error (ERR_SEVERE, "Could not find background task [ProjectionFileDocument::removeBackgroundTask");
+  
+  wxCommandEvent ackEvent (wxEVT_COMMAND_MENU_SELECTED, BackgroundSupervisor::MSG_DOCUMENT_ACK_REMOVE);
+  wxPostEvent (pSupervisor, ackEvent);
 }
 
 bool