r470: Fixed shutdown error, take 3
[ctsim.git] / src / views.cpp
index a72ace4a3432104c64fdcbeecc31f8e2c17ccedd..2e0f78ab58480ada03cb6be7484eeff75a3d4c7c 100644 (file)
@@ -9,7 +9,7 @@
 **  This is part of the CTSim program
 **  Copyright (c) 1983-2001 Kevin Rosenberg
 **
-**  $Id: views.cpp,v 1.87 2001/01/28 22:45:54 kevin Exp $
+**  $Id: views.cpp,v 1.90 2001/01/30 02:20:50 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
@@ -65,6 +65,7 @@
 
 BEGIN_EVENT_TABLE(ImageFileCanvas, wxScrolledWindow)
 EVT_MOUSE_EVENTS(ImageFileCanvas::OnMouseEvent)
+EVT_CHAR(ImageFileCanvas::OnChar)
 END_EVENT_TABLE()
 
 
@@ -175,6 +176,18 @@ ImageFileCanvas::OnMouseEvent(wxMouseEvent& event)
   }
 }
 
+void
+ImageFileCanvas::OnChar (wxKeyEvent& event)
+{
+  if (event.GetKeyCode() == WXK_ESCAPE) {
+    m_xCursor = -1;
+    m_yCursor = -1;
+    if (m_pView)
+      m_pView->OnUpdate (NULL);
+  } else
+    wxScrolledWindow::OnChar (event);
+}
+
 wxSize
 ImageFileCanvas::GetBestSize() const
 {
@@ -387,8 +400,7 @@ ImageFileView::OnCompare (wxCommandEvent& event)
           << " and " << pCompareDoc->GetFirstView()->GetFrame()->GetTitle().c_str() << ": "
           << os.str().c_str();
         differenceImage.labelAdd (os.str().c_str());
-        if (theApp->getSetModifyNewDocs())
-          pDifferenceDoc->Modify (true);
+        pDifferenceDoc->Modify (true);
         pDifferenceDoc->UpdateAllViews (this);
         pDifferenceDoc->getView()->OnUpdate (this, NULL);
         pDifferenceDoc->getView()->getFrame()->Show(true);
@@ -404,8 +416,7 @@ ImageFileView::OnInvertValues (wxCommandEvent& event)
   ImageFile& rIF = GetDocument()->getImageFile();
   rIF.invertPixelValues (rIF);
   rIF.labelAdd ("Invert Pixel Values");
-  if (theApp->getSetModifyNewDocs())
-    GetDocument()->Modify(TRUE);
+  GetDocument()->Modify (true);
   GetDocument()->UpdateAllViews (this);
 }
 
@@ -415,8 +426,7 @@ ImageFileView::OnSquare (wxCommandEvent& event)
   ImageFile& rIF = GetDocument()->getImageFile();
   rIF.square (rIF);
   rIF.labelAdd ("Square Pixel Values");
-  if (theApp->getSetModifyNewDocs())
-    GetDocument()->Modify(TRUE);
+  GetDocument()->Modify (true);
   GetDocument()->UpdateAllViews (this);
 }
 
@@ -426,8 +436,7 @@ ImageFileView::OnSquareRoot (wxCommandEvent& event)
   ImageFile& rIF = GetDocument()->getImageFile();
   rIF.sqrt (rIF);
   rIF.labelAdd ("Square-root Pixel Values");
-  if (theApp->getSetModifyNewDocs())
-    GetDocument()->Modify(TRUE);
+  GetDocument()->Modify (true);
   GetDocument()->UpdateAllViews (this);
 }
 
@@ -437,8 +446,7 @@ ImageFileView::OnLog (wxCommandEvent& event)
   ImageFile& rIF = GetDocument()->getImageFile();
   rIF.log (rIF);
   rIF.labelAdd ("Logrithm base-e Pixel Values");
-  if (theApp->getSetModifyNewDocs())
-    GetDocument()->Modify(TRUE);
+  GetDocument()->Modify (true);
   GetDocument()->UpdateAllViews (this);
 }
 
@@ -448,8 +456,7 @@ ImageFileView::OnExp (wxCommandEvent& event)
   ImageFile& rIF = GetDocument()->getImageFile();
   rIF.exp (rIF);
   rIF.labelAdd ("Exponent base-e Pixel Values");
-  if (theApp->getSetModifyNewDocs())
-    GetDocument()->Modify(TRUE);
+  GetDocument()->Modify (true);
   GetDocument()->UpdateAllViews (this);
 }
 
@@ -485,8 +492,7 @@ ImageFileView::OnAdd (wxCommandEvent& event)
       newImage.labelsCopy (rRHSIF, s.c_str());
       newImage.labelAdd (os.str().c_str());
       *theApp->getLog() << os.str().c_str() << "\n";
-      if (theApp->getSetModifyNewDocs())
-        pNewDoc->Modify(TRUE);
+      pNewDoc->Modify (true);
       pNewDoc->UpdateAllViews (this);
       pNewDoc->getView()->OnUpdate (this, NULL);
       pNewDoc->getView()->getFrame()->Show(true);
@@ -526,8 +532,7 @@ ImageFileView::OnSubtract (wxCommandEvent& event)
       newImage.labelsCopy (rRHSIF, s.c_str());
       newImage.labelAdd (os.str().c_str());
       *theApp->getLog() << os.str().c_str() << "\n";
-      if (theApp->getSetModifyNewDocs())
-        pNewDoc->Modify(TRUE);
+      pNewDoc->Modify (true);
       pNewDoc->UpdateAllViews (this);
       pNewDoc->getView()->OnUpdate (this, NULL);
       pNewDoc->getView()->getFrame()->Show(true);
@@ -567,8 +572,7 @@ ImageFileView::OnMultiply (wxCommandEvent& event)
       newImage.labelsCopy (rRHSIF, s.c_str());
       newImage.labelAdd (os.str().c_str());
       *theApp->getLog() << os.str().c_str() << "\n";
-      if (theApp->getSetModifyNewDocs())
-        pNewDoc->Modify(TRUE);
+      pNewDoc->Modify (true);
       pNewDoc->UpdateAllViews (this);
       pNewDoc->getView()->OnUpdate (this, NULL);
       pNewDoc->getView()->getFrame()->Show(true);
@@ -608,8 +612,7 @@ ImageFileView::OnDivide (wxCommandEvent& event)
       newImage.labelsCopy (rRHSIF, s.c_str());
       newImage.labelAdd (os.str().c_str());
       *theApp->getLog() << os.str().c_str() << "\n";
-      if (theApp->getSetModifyNewDocs())
-        pNewDoc->Modify(TRUE);
+      pNewDoc->Modify (true);
       pNewDoc->UpdateAllViews (this);
       pNewDoc->getView()->OnUpdate (this, NULL);
       pNewDoc->getView()->getFrame()->Show(true);
@@ -627,8 +630,7 @@ ImageFileView::OnFFT (wxCommandEvent& event)
   rIF.labelAdd ("FFT Image");
   m_bMinSpecified = false;
   m_bMaxSpecified = false;
-  if (theApp->getSetModifyNewDocs())
-    GetDocument()->Modify(TRUE);
+  GetDocument()->Modify (true);
   GetDocument()->UpdateAllViews (this);
 }
 
@@ -640,8 +642,7 @@ ImageFileView::OnIFFT (wxCommandEvent& event)
   rIF.labelAdd ("IFFT Image");
   m_bMinSpecified = false;
   m_bMaxSpecified = false;
-  if (theApp->getSetModifyNewDocs())
-    GetDocument()->Modify(TRUE);
+  GetDocument()->Modify (true);
   GetDocument()->UpdateAllViews (this);
 }
 
@@ -653,8 +654,7 @@ ImageFileView::OnFFTRows (wxCommandEvent& event)
   rIF.labelAdd ("FFT Rows");
   m_bMinSpecified = false;
   m_bMaxSpecified = false;
-  if (theApp->getSetModifyNewDocs())
-    GetDocument()->Modify(TRUE);
+  GetDocument()->Modify (true);
   GetDocument()->UpdateAllViews (this);
 }
 
@@ -666,8 +666,7 @@ ImageFileView::OnIFFTRows (wxCommandEvent& event)
   rIF.labelAdd ("IFFT Rows");
   m_bMinSpecified = false;
   m_bMaxSpecified = false;
-  if (theApp->getSetModifyNewDocs())
-    GetDocument()->Modify(TRUE);
+  GetDocument()->Modify (true);
   GetDocument()->UpdateAllViews (this);
 }
 
@@ -679,8 +678,7 @@ ImageFileView::OnFFTCols (wxCommandEvent& event)
   rIF.labelAdd ("FFT Columns");
   m_bMinSpecified = false;
   m_bMaxSpecified = false;
-  if (theApp->getSetModifyNewDocs())
-    GetDocument()->Modify(TRUE);
+  GetDocument()->Modify (true);
   GetDocument()->UpdateAllViews (this);
 }
 
@@ -692,8 +690,7 @@ ImageFileView::OnIFFTCols (wxCommandEvent& event)
   rIF.labelAdd ("IFFT Columns");
   m_bMinSpecified = false;
   m_bMaxSpecified = false;
-  if (theApp->getSetModifyNewDocs())
-    GetDocument()->Modify(TRUE);
+  GetDocument()->Modify (true);
   GetDocument()->UpdateAllViews (this);
 }
 #endif
@@ -707,8 +704,7 @@ ImageFileView::OnFourier (wxCommandEvent& event)
   rIF.labelAdd ("Fourier Image");
   m_bMinSpecified = false;
   m_bMaxSpecified = false;
-  if (theApp->getSetModifyNewDocs())
-    GetDocument()->Modify(TRUE);
+  GetDocument()->Modify (true);
   GetDocument()->UpdateAllViews (this);
 }
 
@@ -721,8 +717,7 @@ ImageFileView::OnInverseFourier (wxCommandEvent& event)
   rIF.labelAdd ("Inverse Fourier Image");
   m_bMinSpecified = false;
   m_bMaxSpecified = false;
-  if (theApp->getSetModifyNewDocs())
-    GetDocument()->Modify(TRUE);
+  GetDocument()->Modify (true);
   GetDocument()->UpdateAllViews (this);
 }
 
@@ -734,8 +729,7 @@ ImageFileView::OnShuffleNaturalToFourierOrder (wxCommandEvent& event)
   rIF.labelAdd ("Shuffle Natural To Fourier Order");
   m_bMinSpecified = false;
   m_bMaxSpecified = false;
-  if (theApp->getSetModifyNewDocs())
-    GetDocument()->Modify(TRUE);
+  GetDocument()->Modify (true);
   GetDocument()->UpdateAllViews (this);
 }
 
@@ -747,8 +741,7 @@ ImageFileView::OnShuffleFourierToNaturalOrder (wxCommandEvent& event)
   rIF.labelAdd ("Shuffle Fourier To Natural Order");
   m_bMinSpecified = false;
   m_bMaxSpecified = false;
-  if (theApp->getSetModifyNewDocs())
-    GetDocument()->Modify(TRUE);
+  GetDocument()->Modify (true);
   GetDocument()->UpdateAllViews (this);
 }
 
@@ -761,8 +754,7 @@ ImageFileView::OnMagnitude (wxCommandEvent& event)
     rIF.labelAdd ("Magnitude of complex-image");
     m_bMinSpecified = false;
     m_bMaxSpecified = false;
-    if (theApp->getSetModifyNewDocs())
-      GetDocument()->Modify(TRUE);
+    GetDocument()->Modify (true);
     GetDocument()->UpdateAllViews (this);
   }
 }
@@ -776,8 +768,7 @@ ImageFileView::OnPhase (wxCommandEvent& event)
     rIF.labelAdd ("Phase of complex-image");
     m_bMinSpecified = false;
     m_bMaxSpecified = false;
-    if (theApp->getSetModifyNewDocs())
-      GetDocument()->Modify(TRUE);
+    GetDocument()->Modify (true);
     GetDocument()->UpdateAllViews (this);
   }
 }
@@ -1017,15 +1008,14 @@ ImageFileView::OnUpdate (wxView *WXUNUSED(sender), wxObject *WXUNUSED(hint) )
 bool 
 ImageFileView::OnClose (bool deleteWindow)
 {
+  //GetDocumentManager()->ActivateView (this, false, true);
   if (! GetDocument() || ! GetDocument()->Close())
     return false;
   
   if (m_pCanvas) {
-    m_pCanvas->Show(false);
     m_pCanvas->setView(NULL);
     m_pCanvas = NULL;
   }
-  m_pFrame->Show(false);
   wxString s(theApp->GetAppName());
   if (m_pFrame)
     m_pFrame->SetTitle(s);
@@ -1036,7 +1026,10 @@ ImageFileView::OnClose (bool deleteWindow)
   if (deleteWindow) {
     m_pFrame->Destroy();
     m_pFrame = NULL;
+    if (GetDocument() && GetDocument()->getBadFileOpen())
+      ::wxYield();  // wxWindows bug workaround
   }
+  
   return true;
 }
 
@@ -1109,8 +1102,7 @@ ImageFileView::OnScaleSize (wxCommandEvent& event)
     rScaledIF.labelAdd (os.str().c_str());
     rIF.scaleImage (rScaledIF);
     *theApp->getLog() << os.str().c_str() << "\n";
-    if (theApp->getSetModifyNewDocs())
-      pScaledDoc->Modify(TRUE);
+    pScaledDoc->Modify (true);
     pScaledDoc->UpdateAllViews (this);
     pScaledDoc->getView()->OnUpdate (this, NULL);
     pScaledDoc->getView()->getFrame()->Show(true);
@@ -1195,8 +1187,7 @@ ImageFileView::OnPlotRow (wxCommandEvent& event)
       delete pYImag;
       delete pYMag;
     }
-    if (theApp->getSetModifyNewDocs())
-      pPlotDoc->Modify(true);
+    pPlotDoc->Modify (true);
     pPlotDoc->UpdateAllViews ();
     pPlotDoc->getView()->OnUpdate (this, NULL);
     pPlotDoc->getView()->getFrame()->Show(true);
@@ -1281,8 +1272,7 @@ ImageFileView::OnPlotCol (wxCommandEvent& event)
       delete pYImag;
       delete pYMag;
     }
-    if (theApp->getSetModifyNewDocs())
-      pPlotDoc->Modify(true);
+    pPlotDoc->Modify (true);
     pPlotDoc->UpdateAllViews ();
     pPlotDoc->getView()->OnUpdate (this, NULL);
     pPlotDoc->getView()->getFrame()->Show(true);
@@ -1376,8 +1366,7 @@ ImageFileView::OnPlotFFTRow (wxCommandEvent& event)
     delete pYMag;
     delete [] pcIn;
     
-    if (theApp->getSetModifyNewDocs())
-      pPlotDoc->Modify(true);
+    pPlotDoc->Modify (true);
     pPlotDoc->UpdateAllViews ();
     pPlotDoc->getView()->OnUpdate (this, NULL);
     pPlotDoc->getView()->getFrame()->Show(true);
@@ -1477,8 +1466,7 @@ ImageFileView::OnPlotFFTCol (wxCommandEvent& event)
     delete pdTemp;
     delete [] pcIn;
     
-    if (theApp->getSetModifyNewDocs())
-      pPlotDoc->Modify(true);
+    pPlotDoc->Modify (true);
     pPlotDoc->UpdateAllViews ();
     pPlotDoc->getView()->OnUpdate (this, NULL);
     pPlotDoc->getView()->getFrame()->Show(true);
@@ -1568,8 +1556,7 @@ ImageFileView::OnCompareCol (wxCommandEvent& event)
       delete pX;
       delete pY1;
       delete pY2;
-      if (theApp->getSetModifyNewDocs())
-        pPlotDoc->Modify(true);
+      pPlotDoc->Modify (true);
       pPlotDoc->UpdateAllViews ();
       pPlotDoc->getView()->OnUpdate (this, NULL);
       pPlotDoc->getView()->getFrame()->Show(true);
@@ -1660,8 +1647,7 @@ ImageFileView::OnCompareRow (wxCommandEvent& event)
       delete pX;
       delete pY1;
       delete pY2;
-      if (theApp->getSetModifyNewDocs())
-        pPlotDoc->Modify(true);
+      pPlotDoc->Modify (true);
       pPlotDoc->UpdateAllViews ();
       pPlotDoc->getView()->OnUpdate (this, NULL);
       pPlotDoc->getView()->getFrame()->Show(true);
@@ -1727,8 +1713,7 @@ ImageFileView::OnPlotHistogram (wxCommandEvent& event)
       rPlotFile.addDescription (os.str().c_str());
       delete pX;
       delete pY;
-      if (theApp->getSetModifyNewDocs())
-        pPlotDoc->Modify(true);
+      pPlotDoc->Modify (true);
       pPlotDoc->UpdateAllViews ();
       pPlotDoc->getView()->OnUpdate (this, NULL);
       pPlotDoc->getView()->getFrame()->Show(true);
@@ -1908,8 +1893,7 @@ PhantomFileView::OnProjections (wxCommandEvent& event)
         GetDocumentManager()->ActivateView (projView, true, false);
       }
       ::wxYield();
-      if (theApp->getSetModifyNewDocs())
-        pProjectionDoc->Modify(true);
+      pProjectionDoc-> Modify(true);
       pProjectionDoc->UpdateAllViews (this);
     }
   }
@@ -1951,8 +1935,7 @@ PhantomFileView::OnRasterize (wxCommandEvent& event)
           return;
         }
       }
-      if (theApp->getSetModifyNewDocs())
-        pRasterDoc->Modify(true);
+      pRasterDoc->Modify (true);
       pRasterDoc->UpdateAllViews (this);
       pRasterDoc->getView()->getFrame()->Show(true);
       std::ostringstream os;
@@ -2089,15 +2072,14 @@ PhantomFileView::OnUpdate (wxView *WXUNUSED(sender), wxObject *WXUNUSED(hint) )
 bool 
 PhantomFileView::OnClose (bool deleteWindow)
 {
+  //GetDocumentManager()->ActivateView (this, false, true);
   if (! GetDocument() || ! GetDocument()->Close())
     return false;
   
   if (m_pCanvas) {
-    m_pCanvas->Show(false);
     m_pCanvas->setView(NULL);
     m_pCanvas = NULL;
   }
-    m_pFrame->Show(false);
   wxString s(wxTheApp->GetAppName());
   if (m_pFrame)
     m_pFrame->SetTitle(s);
@@ -2108,6 +2090,8 @@ PhantomFileView::OnClose (bool deleteWindow)
   if (deleteWindow) {
     m_pFrame->Destroy();
     m_pFrame = NULL;
+    if (GetDocument() && GetDocument()->getBadFileOpen())
+      ::wxYield();  // wxWindows bug workaround
   }
   
   return true;
@@ -2245,8 +2229,7 @@ ProjectionFileView::OnConvertPolar (wxCommandEvent& event)
       << strInterpolation.c_str();
     *theApp->getLog() << os.str().c_str() << "\n";
     rIF.labelAdd (os.str().c_str());
-    if (theApp->getSetModifyNewDocs())
-      pPolarDoc->Modify(true);
+    pPolarDoc->Modify (true);
     pPolarDoc->UpdateAllViews ();
     pPolarDoc->getView()->OnUpdate (this, NULL);
     pPolarDoc->getView()->getFrame()->Show(true);
@@ -2280,8 +2263,7 @@ ProjectionFileView::OnConvertFFTPolar (wxCommandEvent& event)
       << strInterpolation.c_str() << ", zeropad=" << m_iDefaultPolarZeropad;
     *theApp->getLog() << os.str().c_str() << "\n";
     rIF.labelAdd (os.str().c_str());
-    if (theApp->getSetModifyNewDocs())
-      pPolarDoc->Modify(true);
+    pPolarDoc->Modify (true);
     pPolarDoc->UpdateAllViews ();
     pPolarDoc->getView()->OnUpdate (this, NULL);
     pPolarDoc->getView()->getFrame()->Show(true);
@@ -2366,8 +2348,7 @@ ProjectionFileView::OnReconstructFBP (wxCommandEvent& event)
         }
       }
       delete pReconstruct;
-      if (theApp->getSetModifyNewDocs())
-        pReconDoc->Modify(true);
+      pReconDoc->Modify (true);
       pReconDoc->UpdateAllViews (this);
       if (ImageFileView* rasterView = pReconDoc->getView()) {
         rasterView->OnUpdate (rasterView, NULL);
@@ -2569,15 +2550,14 @@ ProjectionFileView::OnUpdate (wxView *WXUNUSED(sender), wxObject *WXUNUSED(hint)
 bool 
 ProjectionFileView::OnClose (bool deleteWindow)
 {
+  //GetDocumentManager()->ActivateView (this, false, true);
   if (! GetDocument() || ! GetDocument()->Close())
     return false;
   
   if (m_pCanvas) {
-       m_pCanvas->Show(false);
-    m_pCanvas->setView(NULL);
+       m_pCanvas->setView(NULL);
     m_pCanvas = NULL;
   }
-  m_pFrame->Show(false);
   wxString s(wxTheApp->GetAppName());
   if (m_pFrame)
     m_pFrame->SetTitle(s);
@@ -2588,7 +2568,10 @@ ProjectionFileView::OnClose (bool deleteWindow)
   if (deleteWindow) {
     m_pFrame->Destroy();
     m_pFrame = NULL;
+    if (GetDocument() && GetDocument()->getBadFileOpen())
+      ::wxYield();  // wxWindows bug workaround
   }
+
   return true;
 }
 
@@ -2897,27 +2880,28 @@ PlotFileView::OnUpdate (wxView *WXUNUSED(sender), wxObject *WXUNUSED(hint) )
 bool 
 PlotFileView::OnClose (bool deleteWindow)
 {
+  //GetDocumentManager()->ActivateView (this, false, true);
   if (! GetDocument() || ! GetDocument()->Close())
     return false;
   
   if (m_pCanvas) {
-    m_pCanvas->Show(false);
     m_pCanvas->setView (NULL);
     m_pCanvas = NULL;
   }
-    m_pFrame->Show(false);
   wxString s(wxTheApp->GetAppName());
   if (m_pFrame)
     m_pFrame->SetTitle(s);
   
   Activate(false);
   
-  m_pFrame->SetView(NULL);
   SetFrame(NULL);
   if (deleteWindow) {
     m_pFrame->Destroy();
     m_pFrame = NULL;
-  }
+    if (GetDocument() && GetDocument()->getBadFileOpen())
+      ::wxYield();  // wxWindows bug workaround
+ }
+
   return true;
 }
 
@@ -2972,20 +2956,20 @@ TextFileView::OnClose (bool deleteWindow)
   // if (m_pFrame && m_pFrame->GetTitle() == "Log")
   return false;
   
+  //GetDocumentManager()->ActivateView (this, false, true);
   if (! GetDocument() || ! GetDocument()->Close())
     return false;
   
-  m_pCanvas->Show(false);
-  m_pFrame->Show(false);
   Activate(false);
   
   SetFrame(NULL);
-  m_pFrame->SetView(NULL);
   if (deleteWindow) {
     m_pFrame->Destroy();
     m_pFrame = NULL;
-    
+    if (GetDocument() && GetDocument()->getBadFileOpen())
+      ::wxYield();  // wxWindows bug workaround
   }
+
   return TRUE;
 }