X-Git-Url: http://git.kpe.io/?p=ctsim.git;a=blobdiff_plain;f=src%2Fviews.cpp;h=0b8290d0005465c89a5db873ae17384e6c544134;hp=7c47aa6415671807810ac4274111fdee5f3d90de;hb=01ed72399d433ce45a0195f8acaea349a421461e;hpb=c6cda8844a491b71759e5dd5edba830d0b809cfd diff --git a/src/views.cpp b/src/views.cpp index 7c47aa6..0b8290d 100644 --- a/src/views.cpp +++ b/src/views.cpp @@ -9,7 +9,7 @@ ** This is part of the CTSim program ** Copyright (C) 1983-2000 Kevin Rosenberg ** -** $Id: views.cpp,v 1.52 2001/01/06 15:33:15 kevin Exp $ +** $Id: views.cpp,v 1.68 2001/01/20 08:10:33 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 @@ -121,7 +121,10 @@ ImageFileCanvas::OnMouseEvent(wxMouseEvent& event) wxPoint pt(event.GetLogicalPosition(dc)); - const ImageFile& rIF = m_pView->GetDocument()->getImageFile(); + const ImageFileDocument* pIFDoc = m_pView->GetDocument(); + if (! pIFDoc) + return; + const ImageFile& rIF = pIFDoc->getImageFile(); ImageFileArrayConst v = rIF.getArray(); int nx = rIF.nx(); int ny = rIF.ny(); @@ -161,6 +164,17 @@ ImageFileCanvas::OnMouseEvent(wxMouseEvent& event) } } +wxSize +ImageFileCanvas::GetBestSize() const +{ + if (! m_pView) + return wxSize(0,0); + + const ImageFile& rIF = m_pView->GetDocument()->getImageFile(); + return wxSize (rIF.nx(), rIF.ny()); +} + + // ImageFileView IMPLEMENT_DYNAMIC_CLASS(ImageFileView, wxView) @@ -245,7 +259,7 @@ ImageFileView::OnProperties (wxCommandEvent& event) rIF.printLabelsBrief (os); } *theApp->getLog() << os.str().c_str(); - wxMessageDialog dialogMsg (m_frame, os.str().c_str(), "Imagefile Properties", wxOK | wxICON_INFORMATION); + wxMessageDialog dialogMsg (getFrameForChild(), os.str().c_str(), "Imagefile Properties", wxOK | wxICON_INFORMATION); dialogMsg.ShowModal(); } } @@ -256,7 +270,7 @@ ImageFileView::OnScaleAuto (wxCommandEvent& event) const ImageFile& rIF = GetDocument()->getImageFile(); double min, max, mean, mode, median, stddev; rIF.statistics(min, max, mean, mode, median, stddev); - DialogAutoScaleParameters dialogAutoScale (m_frame, mean, mode, median, stddev, m_dAutoScaleFactor); + DialogAutoScaleParameters dialogAutoScale (getFrameForChild(), mean, mode, median, stddev, m_dAutoScaleFactor); int iRetVal = dialogAutoScale.ShowModal(); if (iRetVal == wxID_OK) { m_bMinSpecified = true; @@ -284,7 +298,7 @@ ImageFileView::OnScaleMinMax (wxCommandEvent& event) if (m_bMaxSpecified) max = m_dMaxPixel; - DialogGetMinMax dialogMinMax (m_frame, "Set Image Minimum & Maximum", min, max); + DialogGetMinMax dialogMinMax (getFrameForChild(), "Set Image Minimum & Maximum", min, max); int retVal = dialogMinMax.ShowModal(); if (retVal == wxID_OK) { m_bMinSpecified = true; @@ -314,7 +328,7 @@ ImageFileView::OnCompare (wxCommandEvent& event) if (vecIF.size() == 0) { wxMessageBox("There are no compatible image files open for comparision", "No comparison images"); } else { - DialogGetComparisonImage dialogGetCompare(m_frame, "Get Comparison Image", vecIF, true); + DialogGetComparisonImage dialogGetCompare(getFrameForChild(), "Get Comparison Image", vecIF, true); if (dialogGetCompare.ShowModal() == wxID_OK) { const ImageFile& rIF = GetDocument()->getImageFile(); @@ -428,7 +442,7 @@ ImageFileView::OnAdd (wxCommandEvent& event) if (vecIF.size() == 0) { wxMessageBox ("There are no compatible image files open for comparision", "No comparison images"); } else { - DialogGetComparisonImage dialogGetCompare (m_frame, "Get Image to Add", vecIF, false); + DialogGetComparisonImage dialogGetCompare (getFrameForChild(), "Get Image to Add", vecIF, false); if (dialogGetCompare.ShowModal() == wxID_OK) { ImageFile& rIF = GetDocument()->getImageFile(); @@ -468,7 +482,7 @@ ImageFileView::OnSubtract (wxCommandEvent& event) if (vecIF.size() == 0) { wxMessageBox ("There are no compatible image files open for comparision", "No comparison images"); } else { - DialogGetComparisonImage dialogGetCompare (m_frame, "Get Image to Subtract", vecIF, false); + DialogGetComparisonImage dialogGetCompare (getFrameForChild(), "Get Image to Subtract", vecIF, false); if (dialogGetCompare.ShowModal() == wxID_OK) { ImageFile& rIF = GetDocument()->getImageFile(); @@ -508,7 +522,7 @@ ImageFileView::OnMultiply (wxCommandEvent& event) if (vecIF.size() == 0) { wxMessageBox ("There are no compatible image files open for comparision", "No comparison images"); } else { - DialogGetComparisonImage dialogGetCompare (m_frame, "Get Image to Multiply", vecIF, false); + DialogGetComparisonImage dialogGetCompare (getFrameForChild(), "Get Image to Multiply", vecIF, false); if (dialogGetCompare.ShowModal() == wxID_OK) { ImageFile& rIF = GetDocument()->getImageFile(); @@ -548,7 +562,7 @@ ImageFileView::OnDivide (wxCommandEvent& event) if (vecIF.size() == 0) { wxMessageBox ("There are no compatible image files open for comparision", "No comparison images"); } else { - DialogGetComparisonImage dialogGetCompare (m_frame, "Get Image to Divide", vecIF, false); + DialogGetComparisonImage dialogGetCompare (getFrameForChild(), "Get Image to Divide", vecIF, false); if (dialogGetCompare.ShowModal() == wxID_OK) { ImageFile& rIF = GetDocument()->getImageFile(); @@ -664,7 +678,7 @@ void ImageFileView::OnFourier (wxCommandEvent& event) { ImageFile& rIF = GetDocument()->getImageFile(); - wxProgressDialog dlgProgress (wxString("Fourier"), wxString("Fourier Progress"), 1, m_frame, wxPD_APP_MODAL); + wxProgressDialog dlgProgress (wxString("Fourier"), wxString("Fourier Progress"), 1, getFrameForChild(), wxPD_APP_MODAL); rIF.fourier (rIF); rIF.labelAdd ("Fourier Image"); m_bMinSpecified = false; @@ -678,7 +692,7 @@ void ImageFileView::OnInverseFourier (wxCommandEvent& event) { ImageFile& rIF = GetDocument()->getImageFile(); - wxProgressDialog dlgProgress (wxString("Inverse Fourier"), wxString("Inverse Fourier Progress"), 1, m_frame, wxPD_APP_MODAL); + wxProgressDialog dlgProgress (wxString("Inverse Fourier"), wxString("Inverse Fourier Progress"), 1, getFrameForChild(), wxPD_APP_MODAL); rIF.inverseFourier (rIF); rIF.labelAdd ("Inverse Fourier Image"); m_bMinSpecified = false; @@ -765,19 +779,20 @@ wxFrame* ImageFileView::CreateChildFrame(wxDocument *doc, wxView *view) { #if CTSIM_MDI - wxMDIChildFrame *subframe = new wxMDIChildFrame(theApp->getMainFrame(), -1, "ImageFile Frame", wxPoint(-1, -1), wxSize(0, 0), wxDEFAULT_FRAME_STYLE); + wxDocMDIChildFrame* subframe = new wxDocMDIChildFrame (doc, view, theApp->getMainFrame(), -1, "ImageFile Frame", wxPoint(-1, -1), wxSize(0, 0), wxDEFAULT_FRAME_STYLE); #else - wxDocChildFrame *subframe = new wxDocChildFrame(doc, view, theApp->getMainFrame(), -1, "ImageFile Frame", wxPoint(-1, -1), wxSize(0, 0), wxDEFAULT_FRAME_STYLE); + wxDocChildFrame* subframe = new wxDocChildFrame (doc, view, theApp->getMainFrame(), -1, "ImageFile Frame", wxPoint(-1, -1), wxSize(0, 0), wxDEFAULT_FRAME_STYLE); #endif - + theApp->setIconForFrame (subframe); + wxMenu *file_menu = new wxMenu; - file_menu->Append(MAINMENU_FILE_CREATE_PHANTOM, "Cr&eate Phantom..."); - file_menu->Append(MAINMENU_FILE_CREATE_FILTER, "Create &Filter..."); - file_menu->Append(wxID_OPEN, "&Open..."); - file_menu->Append(wxID_SAVE, "&Save"); + file_menu->Append(MAINMENU_FILE_CREATE_PHANTOM, "Cr&eate Phantom...\tCtrl-P"); + file_menu->Append(MAINMENU_FILE_CREATE_FILTER, "Create &Filter...\tCtrl-F"); + file_menu->Append(wxID_OPEN, "&Open...\tCtrl-O"); + file_menu->Append(wxID_SAVE, "&Save\tCtrl-S"); file_menu->Append(wxID_SAVEAS, "Save &As..."); - file_menu->Append(wxID_CLOSE, "&Close"); + file_menu->Append(wxID_CLOSE, "&Close\tCtrl-W"); file_menu->AppendSeparator(); file_menu->Append(IFMENU_FILE_PROPERTIES, "P&roperties"); @@ -789,9 +804,9 @@ ImageFileView::CreateChildFrame(wxDocument *doc, wxView *view) file_menu->Append(wxID_PREVIEW, "Print Pre&view"); wxMenu *view_menu = new wxMenu; - view_menu->Append(IFMENU_VIEW_SCALE_MINMAX, "Display Scale &Set..."); - view_menu->Append(IFMENU_VIEW_SCALE_AUTO, "Display Scale &Auto..."); - view_menu->Append(IFMENU_VIEW_SCALE_FULL, "Display &Full Scale"); + view_menu->Append(IFMENU_VIEW_SCALE_MINMAX, "Display Scale S&et...\tCtrl-E"); + view_menu->Append(IFMENU_VIEW_SCALE_AUTO, "Display Scale &Auto...\tCtrl-A"); + view_menu->Append(IFMENU_VIEW_SCALE_FULL, "Display F&ull Scale\tCtrl-U"); wxMenu* filter_menu = new wxMenu; filter_menu->Append (IFMENU_FILTER_INVERTVALUES, "&Invert Values"); @@ -839,6 +854,8 @@ ImageFileView::CreateChildFrame(wxDocument *doc, wxView *view) analyze_menu->Append (IFMENU_COMPARE_COL, "Compare &Column"); wxMenu *help_menu = new wxMenu; + help_menu->Append(MAINMENU_HELP_CONTENTS, "&Contents\tF1"); + help_menu->Append(MAINMENU_HELP_TOPICS, "&Topics\tCtrl-H"); help_menu->Append(MAINMENU_HELP_ABOUT, "&About"); wxMenuBar *menu_bar = new wxMenuBar; @@ -849,11 +866,25 @@ ImageFileView::CreateChildFrame(wxDocument *doc, wxView *view) menu_bar->Append(filter_menu, "Fi<er"); menu_bar->Append(analyze_menu, "&Analyze"); menu_bar->Append(help_menu, "&Help"); - + subframe->SetMenuBar(menu_bar); subframe->Centre(wxBOTH); + wxAcceleratorEntry accelEntries[10]; + accelEntries[0].Set (wxACCEL_CTRL, static_cast('O'), wxID_OPEN); + accelEntries[1].Set (wxACCEL_CTRL, static_cast('S'), wxID_SAVE); + accelEntries[2].Set (wxACCEL_CTRL, static_cast('W'), wxID_CLOSE); + accelEntries[3].Set (wxACCEL_CTRL, static_cast('H'), MAINMENU_HELP_TOPICS); + accelEntries[4].Set (wxACCEL_CTRL, static_cast('P'), MAINMENU_FILE_CREATE_PHANTOM); + accelEntries[5].Set (wxACCEL_CTRL, static_cast('F'), MAINMENU_FILE_CREATE_FILTER); + accelEntries[6].Set (wxACCEL_NORMAL, WXK_F1, MAINMENU_HELP_CONTENTS); + accelEntries[7].Set (wxACCEL_CTRL, static_cast('A'), IFMENU_VIEW_SCALE_AUTO); + accelEntries[8].Set (wxACCEL_CTRL, static_cast('U'), IFMENU_VIEW_SCALE_FULL); + accelEntries[9].Set (wxACCEL_CTRL, static_cast('E'), IFMENU_VIEW_SCALE_MINMAX); + wxAcceleratorTable accelTable (10, accelEntries); + subframe->SetAcceleratorTable (accelTable); + return subframe; } @@ -886,6 +917,11 @@ ImageFileView::OnCreate (wxDocument *doc, long WXUNUSED(flags) ) void ImageFileView::OnDraw (wxDC* dc) { + wxSize sizeWindow = m_frame->GetClientSize(); + wxSize sizeBest = m_canvas->GetBestSize(); + if (sizeWindow.x > sizeBest.x || sizeWindow.y > sizeBest.y) + m_frame->SetClientSize (sizeBest); + if (m_bitmap.Ok()) dc->DrawBitmap(m_bitmap, 0, 0, false); @@ -945,8 +981,8 @@ ImageFileView::OnClose (bool deleteWindow) if (!GetDocument()->Close()) return false; - // m_canvas->Clear(); - m_canvas->m_pView = NULL; + m_canvas->Clear(); + //m_canvas->m_pView = NULL; m_canvas = NULL; wxString s(theApp->GetAppName()); if (m_frame) @@ -979,7 +1015,7 @@ ImageFileView::OnExport (wxCommandEvent& event) m_dMaxPixel = max; } - DialogExportParameters dialogExport (m_frame, m_iDefaultExportFormatID); + DialogExportParameters dialogExport (getFrameForChild(), m_iDefaultExportFormatID); if (dialogExport.ShowModal() == wxID_OK) { wxString strFormatName (dialogExport.getFormatName ()); m_iDefaultExportFormatID = ImageFile::convertFormatNameToID (strFormatName.c_str()); @@ -1014,7 +1050,7 @@ ImageFileView::OnScaleSize (wxCommandEvent& event) unsigned int iOldNX = rIF.nx(); unsigned int iOldNY = rIF.ny(); - DialogGetXYSize dialogGetXYSize (m_frame, "Set New X & Y Dimensions", iOldNX, iOldNY); + DialogGetXYSize dialogGetXYSize (getFrameForChild(), "Set New X & Y Dimensions", iOldNX, iOldNY); if (dialogGetXYSize.ShowModal() == wxID_OK) { unsigned int iNewNX = dialogGetXYSize.getXSize(); unsigned int iNewNY = dialogGetXYSize.getYSize(); @@ -1049,15 +1085,26 @@ ImageFileView::OnPlotRow (wxCommandEvent& event) const ImageFile& rIF = dynamic_cast(GetDocument())->getImageFile(); ImageFileArrayConst v = rIF.getArray(); + ImageFileArrayConst vImag = rIF.getImaginaryArray(); int nx = rIF.nx(); int ny = rIF.ny(); if (v != NULL && yCursor < ny) { double* pX = new double [nx]; - double* pY = new double [nx]; + double* pYReal = new double [nx]; + double *pYImag = NULL; + double *pYMag = NULL; + if (rIF.isComplex()) { + pYImag = new double [nx]; + pYMag = new double [nx]; + } for (int i = 0; i < nx; i++) { pX[i] = i; - pY[i] = v[i][yCursor]; + pYReal[i] = v[i][yCursor]; + if (rIF.isComplex()) { + pYImag[i] = vImag[i][yCursor]; + pYMag[i] = ::sqrt (v[i][yCursor] * v[i][yCursor] + vImag[i][yCursor] * vImag[i][yCursor]); + } } PlotFileDocument* pPlotDoc = dynamic_cast(theApp->getDocManager()->CreateDocument("untitled.plt", wxDOC_SILENT)); if (! pPlotDoc) { @@ -1074,12 +1121,37 @@ ImageFileView::OnPlotRow (wxCommandEvent& event) rPlotFile.addEzsetCommand ("lxfrac 0"); rPlotFile.addEzsetCommand ("box"); rPlotFile.addEzsetCommand ("grid"); - rPlotFile.setCurveSize (2, nx); + rPlotFile.addEzsetCommand ("curve 1"); + rPlotFile.addEzsetCommand ("color 1"); + if (rIF.isComplex()) { + rPlotFile.addEzsetCommand ("dash 1"); + rPlotFile.addEzsetCommand ("curve 2"); + rPlotFile.addEzsetCommand ("color 4"); + rPlotFile.addEzsetCommand ("dash 3"); + rPlotFile.addEzsetCommand ("curve 3"); + rPlotFile.addEzsetCommand ("color 0"); + rPlotFile.addEzsetCommand ("solid"); + rPlotFile.setCurveSize (4, nx); + } else + rPlotFile.setCurveSize (2, nx); rPlotFile.addColumn (0, pX); - rPlotFile.addColumn (1, pY); + rPlotFile.addColumn (1, pYReal); + if (rIF.isComplex()) { + rPlotFile.addColumn (2, pYImag); + rPlotFile.addColumn (3, pYMag); + } + for (unsigned int iL = 0; iL < rIF.nLabels(); iL++) + rPlotFile.addDescription (rIF.labelGet(iL).getLabelString().c_str()); + os << " Plot of " << GetDocument()->GetFirstView()->GetFrame()->GetTitle().c_str(); + *theApp->getLog() << os.str().c_str() << "\n"; + rPlotFile.addDescription (os.str().c_str()); } delete pX; - delete pY; + delete pYReal; + if (rIF.isComplex()) { + delete pYImag; + delete pYMag; + } if (theApp->getSetModifyNewDocs()) pPlotDoc->Modify(true); pPlotDoc->UpdateAllViews(); @@ -1097,15 +1169,26 @@ ImageFileView::OnPlotCol (wxCommandEvent& event) const ImageFile& rIF = dynamic_cast(GetDocument())->getImageFile(); ImageFileArrayConst v = rIF.getArray(); + ImageFileArrayConst vImag = rIF.getImaginaryArray(); int nx = rIF.nx(); int ny = rIF.ny(); if (v != NULL && xCursor < nx) { double* pX = new double [ny]; - double* pY = new double [ny]; + double* pYReal = new double [ny]; + double* pYImag = NULL; + double* pYMag = NULL; + if (rIF.isComplex()) { + pYImag = new double [ny]; + pYMag = new double [ny]; + } for (int i = 0; i < ny; i++) { pX[i] = i; - pY[i] = v[xCursor][i]; + pYReal[i] = v[xCursor][i]; + if (rIF.isComplex()) { + pYImag[i] = vImag[xCursor][i]; + pYMag[i] = ::sqrt (v[xCursor][i] * v[xCursor][i] + vImag[xCursor][i] * vImag[xCursor][i]); + } } PlotFileDocument* pPlotDoc = dynamic_cast(theApp->getDocManager()->CreateDocument("untitled.plt", wxDOC_SILENT)); if (! pPlotDoc) { @@ -1122,12 +1205,37 @@ ImageFileView::OnPlotCol (wxCommandEvent& event) rPlotFile.addEzsetCommand ("lxfrac 0"); rPlotFile.addEzsetCommand ("box"); rPlotFile.addEzsetCommand ("grid"); - rPlotFile.setCurveSize (2, nx); + rPlotFile.addEzsetCommand ("curve 1"); + rPlotFile.addEzsetCommand ("color 1"); + if (rIF.isComplex()) { + rPlotFile.addEzsetCommand ("dash 1"); + rPlotFile.addEzsetCommand ("curve 2"); + rPlotFile.addEzsetCommand ("color 4"); + rPlotFile.addEzsetCommand ("dash 3"); + rPlotFile.addEzsetCommand ("curve 3"); + rPlotFile.addEzsetCommand ("color 0"); + rPlotFile.addEzsetCommand ("solid"); + rPlotFile.setCurveSize (4, ny); + } else + rPlotFile.setCurveSize (2, ny); rPlotFile.addColumn (0, pX); - rPlotFile.addColumn (1, pY); + rPlotFile.addColumn (1, pYReal); + if (rIF.isComplex()) { + rPlotFile.addColumn (2, pYImag); + rPlotFile.addColumn (3, pYMag); + } + for (unsigned int iL = 0; iL < rIF.nLabels(); iL++) + rPlotFile.addDescription (rIF.labelGet(iL).getLabelString().c_str()); + os << " Plot of " << GetDocument()->GetFirstView()->GetFrame()->GetTitle().c_str(); + *theApp->getLog() << os.str().c_str() << "\n"; + rPlotFile.addDescription (os.str().c_str()); } delete pX; - delete pY; + delete pYReal; + if (rIF.isComplex()) { + delete pYImag; + delete pYMag; + } if (theApp->getSetModifyNewDocs()) pPlotDoc->Modify(true); pPlotDoc->UpdateAllViews(); @@ -1195,19 +1303,25 @@ ImageFileView::OnPlotFFTRow (wxCommandEvent& event) rPlotFile.addEzsetCommand ("lxfrac 0"); rPlotFile.addEzsetCommand ("curve 1"); rPlotFile.addEzsetCommand ("color 1"); - rPlotFile.addEzsetCommand ("curve 2"); - rPlotFile.addEzsetCommand ("color 2"); - rPlotFile.addEzsetCommand ("dash 1"); - rPlotFile.addEzsetCommand ("curve 3"); - rPlotFile.addEzsetCommand ("dash 2"); - rPlotFile.addEzsetCommand ("color 3"); - rPlotFile.addEzsetCommand ("box"); + rPlotFile.addEzsetCommand ("dash 1"); + rPlotFile.addEzsetCommand ("curve 2"); + rPlotFile.addEzsetCommand ("color 4"); + rPlotFile.addEzsetCommand ("dash 3"); + rPlotFile.addEzsetCommand ("curve 3"); + rPlotFile.addEzsetCommand ("color 0"); + rPlotFile.addEzsetCommand ("solid"); + rPlotFile.addEzsetCommand ("box"); rPlotFile.addEzsetCommand ("grid"); - rPlotFile.setCurveSize (2, nx); + rPlotFile.setCurveSize (4, nx); rPlotFile.addColumn (0, pX); rPlotFile.addColumn (1, pYReal); rPlotFile.addColumn (2, pYImag); rPlotFile.addColumn (3, pYMag); + for (int iL = 0; iL < rIF.nLabels(); iL++) + rPlotFile.addDescription (rIF.labelGet(iL).getLabelString().c_str()); + os << " FFT Plot of " << GetDocument()->GetFirstView()->GetFrame()->GetTitle().c_str(); + *theApp->getLog() << os.str().c_str() << "\n"; + rPlotFile.addDescription (os.str().c_str()); } delete pX; delete pYReal; @@ -1232,16 +1346,46 @@ ImageFileView::OnPlotFFTCol (wxCommandEvent& event) const ImageFile& rIF = dynamic_cast(GetDocument())->getImageFile(); ImageFileArrayConst v = rIF.getArray(); + ImageFileArrayConst vImag = rIF.getImaginaryArray(); int nx = rIF.nx(); int ny = rIF.ny(); if (v != NULL && xCursor < nx) { + fftw_complex* pcIn = new fftw_complex [ny]; + double *pdTemp = new double [ny]; + + int i; + for (i = 0; i < ny; i++) + pdTemp[i] = v[xCursor][i]; + Fourier::shuffleNaturalToFourierOrder (pdTemp, ny); + for (i = 0; i < ny; i++) + pcIn[i].re = pdTemp[i]; + + for (i = 0; i < ny; i++) { + if (rIF.isComplex()) + pdTemp[i] = vImag[xCursor][i]; + else + pdTemp[i] = 0; + } + Fourier::shuffleNaturalToFourierOrder (pdTemp, ny); + for (i = 0; i < ny; i++) + pcIn[i].im = pdTemp[i]; + + fftw_plan plan = fftw_create_plan (ny, FFTW_BACKWARD, FFTW_IN_PLACE); + fftw_one (plan, pcIn, NULL); + fftw_destroy_plan (plan); + double* pX = new double [ny]; - double* pY = new double [ny]; - for (int i = 0; i < ny; i++) { + double* pYReal = new double [ny]; + double* pYImag = new double [ny]; + double* pYMag = new double [ny]; + for (i = 0; i < ny; i++) { pX[i] = i; - pY[i] = v[xCursor][i]; + pYReal[i] = pcIn[i].re; + pYImag[i] = pcIn[i].im; + pYMag[i] = ::sqrt (pcIn[i].re * pcIn[i].re + pcIn[i].im * pcIn[i].im); } + PlotFileDocument* pPlotDoc = dynamic_cast(theApp->getDocManager()->CreateDocument("untitled.plt", wxDOC_SILENT)); if (! pPlotDoc) { sys_error (ERR_SEVERE, "Internal error: unable to create Plot file"); @@ -1252,17 +1396,38 @@ ImageFileView::OnPlotFFTCol (wxCommandEvent& event) std::string title("title "); title += os.str(); rPlotFile.addEzsetCommand (title.c_str()); - rPlotFile.addEzsetCommand ("xlabel Row"); + rPlotFile.addEzsetCommand ("xlabel Column"); rPlotFile.addEzsetCommand ("ylabel Pixel Value"); rPlotFile.addEzsetCommand ("lxfrac 0"); - rPlotFile.addEzsetCommand ("box"); + rPlotFile.addEzsetCommand ("curve 1"); + rPlotFile.addEzsetCommand ("color 1"); + rPlotFile.addEzsetCommand ("dash 1"); + rPlotFile.addEzsetCommand ("curve 2"); + rPlotFile.addEzsetCommand ("color 4"); + rPlotFile.addEzsetCommand ("dash 3"); + rPlotFile.addEzsetCommand ("curve 3"); + rPlotFile.addEzsetCommand ("color 0"); + rPlotFile.addEzsetCommand ("solid"); + rPlotFile.addEzsetCommand ("box"); rPlotFile.addEzsetCommand ("grid"); - rPlotFile.setCurveSize (2, nx); + rPlotFile.setCurveSize (4, ny); rPlotFile.addColumn (0, pX); - rPlotFile.addColumn (1, pY); + rPlotFile.addColumn (1, pYReal); + rPlotFile.addColumn (2, pYImag); + rPlotFile.addColumn (3, pYMag); + for (int iL = 0; iL < rIF.nLabels(); iL++) + rPlotFile.addDescription (rIF.labelGet(iL).getLabelString().c_str()); + os << " FFT Plot of " << GetDocument()->GetFirstView()->GetFrame()->GetTitle().c_str(); + *theApp->getLog() << os.str().c_str() << "\n"; + rPlotFile.addDescription (os.str().c_str()); } delete pX; - delete pY; + delete pYReal; + delete pYImag; + delete pYMag; + delete pdTemp; + delete [] pcIn; + if (theApp->getSetModifyNewDocs()) pPlotDoc->Modify(true); pPlotDoc->UpdateAllViews(); @@ -1285,7 +1450,7 @@ ImageFileView::OnCompareCol (wxCommandEvent& event) wxMessageBox ("No compatible images for Column Comparison", "Error"); return; } - DialogGetComparisonImage dialogGetCompare (m_frame, "Get Comparison Image", vecIFDoc, false); + DialogGetComparisonImage dialogGetCompare (getFrameForChild(), "Get Comparison Image", vecIFDoc, false); if (dialogGetCompare.ShowModal() == wxID_OK) { ImageFileDocument* pCompareDoc = dialogGetCompare.getImageFileDocument(); @@ -1326,10 +1491,28 @@ ImageFileView::OnCompareCol (wxCommandEvent& event) rPlotFile.addEzsetCommand ("dash 5"); rPlotFile.addEzsetCommand ("box"); rPlotFile.addEzsetCommand ("grid"); - rPlotFile.setCurveSize (3, nx); + rPlotFile.setCurveSize (3, ny); rPlotFile.addColumn (0, pX); rPlotFile.addColumn (1, pY1); rPlotFile.addColumn (2, pY2); + + unsigned int iL; + for (iL = 0; iL < rIF.nLabels(); iL++) { + std::string s = GetDocument()->GetFirstView()->GetFrame()->GetTitle().c_str(); + s += ": "; + s += rIF.labelGet(iL).getLabelString(); + rPlotFile.addDescription (s.c_str()); + } + for (iL = 0; iL < rCompareIF.nLabels(); iL++) { + std::string s = pCompareDoc->GetFirstView()->GetFrame()->GetTitle().c_str(); + s += ": "; + s += rCompareIF.labelGet(iL).getLabelString(); + rPlotFile.addDescription (s.c_str()); + } + os << " Between " << GetDocument()->GetFirstView()->GetFrame()->GetTitle().c_str() << " and " + << pCompareDoc->GetFirstView()->GetFrame()->GetTitle().c_str(); + *theApp->getLog() << os.str().c_str() << "\n"; + rPlotFile.addDescription (os.str().c_str()); } delete pX; delete pY1; @@ -1358,7 +1541,7 @@ ImageFileView::OnCompareRow (wxCommandEvent& event) return; } - DialogGetComparisonImage dialogGetCompare (m_frame, "Get Comparison Image", vecIFDoc, false); + DialogGetComparisonImage dialogGetCompare (getFrameForChild(), "Get Comparison Image", vecIFDoc, false); if (dialogGetCompare.ShowModal() == wxID_OK) { ImageFileDocument* pCompareDoc = dialogGetCompare.getImageFileDocument(); @@ -1399,10 +1582,27 @@ ImageFileView::OnCompareRow (wxCommandEvent& event) rPlotFile.addEzsetCommand ("dash 5"); rPlotFile.addEzsetCommand ("box"); rPlotFile.addEzsetCommand ("grid"); - rPlotFile.setCurveSize (3, ny); + rPlotFile.setCurveSize (3, nx); rPlotFile.addColumn (0, pX); rPlotFile.addColumn (1, pY1); rPlotFile.addColumn (2, pY2); + unsigned int iL; + for (iL = 0; iL < rIF.nLabels(); iL++) { + std::string s = GetDocument()->GetFirstView()->GetFrame()->GetTitle().c_str(); + s += ": "; + s += rIF.labelGet(iL).getLabelString(); + rPlotFile.addDescription (s.c_str()); + } + for (iL = 0; iL < rCompareIF.nLabels(); iL++) { + std::string s = pCompareDoc->GetFirstView()->GetFrame()->GetTitle().c_str(); + s += ": "; + s += rCompareIF.labelGet(iL).getLabelString(); + rPlotFile.addDescription (s.c_str()); + } + os << " Between " << GetDocument()->GetFirstView()->GetFrame()->GetTitle().c_str() << " and " + << pCompareDoc->GetFirstView()->GetFrame()->GetTitle().c_str(); + *theApp->getLog() << os.str().c_str() << "\n"; + rPlotFile.addDescription (os.str().c_str()); } delete pX; delete pY1; @@ -1458,9 +1658,18 @@ ImageFileView::OnPlotHistogram (wxCommandEvent& event) rPlotFile.addEzsetCommand ("ylabel Count"); rPlotFile.addEzsetCommand ("box"); rPlotFile.addEzsetCommand ("grid"); - rPlotFile.setCurveSize (2, nx); + rPlotFile.setCurveSize (2, NUMBER_HISTOGRAM_BINS); rPlotFile.addColumn (0, pX); rPlotFile.addColumn (1, pY); + for (unsigned int iL = 0; iL < rIF.nLabels(); iL++) { + std::string s = GetDocument()->GetFirstView()->GetFrame()->GetTitle().c_str(); + s += ": "; + s += rIF.labelGet(iL).getLabelString(); + rPlotFile.addDescription (s.c_str()); + } + os << " Plot of " << GetDocument()->GetFirstView()->GetFrame()->GetTitle().c_str(); + *theApp->getLog() << os.str().c_str() << "\n"; + rPlotFile.addDescription (os.str().c_str()); delete pX; delete pY; if (theApp->getSetModifyNewDocs()) @@ -1537,7 +1746,7 @@ PhantomView::OnProperties (wxCommandEvent& event) void PhantomView::OnProjections (wxCommandEvent& event) { - DialogGetProjectionParameters dialogProjection (m_frame, m_iDefaultNDet, m_iDefaultNView, m_iDefaultNSample, m_dDefaultRotation, m_dDefaultFocalLength, m_dDefaultFieldOfView, m_iDefaultGeometry, m_iDefaultTrace); + DialogGetProjectionParameters dialogProjection (getFrameForChild(), m_iDefaultNDet, m_iDefaultNView, m_iDefaultNSample, m_dDefaultRotation, m_dDefaultFocalLength, m_dDefaultFieldOfView, m_iDefaultGeometry, m_iDefaultTrace); int retVal = dialogProjection.ShowModal(); if (retVal == wxID_OK) { m_iDefaultNDet = dialogProjection.getNDet(); @@ -1568,7 +1777,7 @@ PhantomView::OnProjections (wxCommandEvent& event) Timer timer; if (m_iDefaultTrace > Trace::TRACE_CONSOLE) { - ProjectionsDialog dialogProjections (theScanner, rProj, rPhantom, m_iDefaultTrace, dynamic_cast(m_frame)); + ProjectionsDialog dialogProjections (theScanner, rProj, rPhantom, m_iDefaultTrace, dynamic_cast(getFrameForChild())); for (int iView = 0; iView < rProj.nView(); iView++) { ::wxYield(); ::wxYield(); @@ -1584,7 +1793,7 @@ PhantomView::OnProjections (wxCommandEvent& event) } } } else { - wxProgressDialog dlgProgress (wxString("Projection"), wxString("Projection Progress"), rProj.nView() + 1, m_frame, wxPD_CAN_ABORT); + wxProgressDialog dlgProgress (wxString("Projection"), wxString("Projection Progress"), rProj.nView() + 1, getFrameForChild(), wxPD_CAN_ABORT); for (int i = 0; i < rProj.nView(); i++) { theScanner.collectProjections (rProj, rPhantom, i, 1, true, m_iDefaultTrace); if (! dlgProgress.Update (i+1)) { @@ -1626,7 +1835,7 @@ PhantomView::OnProjections (wxCommandEvent& event) void PhantomView::OnRasterize (wxCommandEvent& event) { - DialogGetRasterParameters dialogRaster (m_frame, m_iDefaultRasterNX, m_iDefaultRasterNY, m_iDefaultRasterNSamples); + DialogGetRasterParameters dialogRaster (getFrameForChild(), m_iDefaultRasterNX, m_iDefaultRasterNY, m_iDefaultRasterNSamples); int retVal = dialogRaster.ShowModal(); if (retVal == wxID_OK) { m_iDefaultRasterNX = dialogRaster.getXSize(); @@ -1644,7 +1853,7 @@ PhantomView::OnRasterize (wxCommandEvent& event) ImageFile& imageFile = pRasterDoc->getImageFile(); imageFile.setArraySize (m_iDefaultRasterNX, m_iDefaultRasterNX); - wxProgressDialog dlgProgress (wxString("Rasterize"), wxString("Rasterization Progress"), imageFile.nx() + 1, m_frame, wxPD_CAN_ABORT); + wxProgressDialog dlgProgress (wxString("Rasterize"), wxString("Rasterization Progress"), imageFile.nx() + 1, getFrameForChild(), wxPD_CAN_ABORT); Timer timer; for (unsigned int i = 0; i < imageFile.nx(); i++) { rPhantom.convertToImagefile (imageFile, m_iDefaultRasterNSamples, Trace::TRACE_NONE, i, 1, true); @@ -1691,16 +1900,17 @@ wxFrame* PhantomView::CreateChildFrame(wxDocument *doc, wxView *view) { #if CTSIM_MDI - wxMDIChildFrame *subframe = new wxMDIChildFrame(theApp->getMainFrame(), -1, "Phantom Frame", wxPoint(10, 10), wxSize(256, 256), wxDEFAULT_FRAME_STYLE); + wxDocMDIChildFrame *subframe = new wxDocMDIChildFrame (doc, view, theApp->getMainFrame(), -1, "Phantom Frame", wxPoint(10, 10), wxSize(256, 256), wxDEFAULT_FRAME_STYLE); #else - wxDocChildFrame *subframe = new wxDocChildFrame(doc, view, theApp->getMainFrame(), -1, "Phantom Frame", wxPoint(10, 10), wxSize(256, 256), wxDEFAULT_FRAME_STYLE); + wxDocChildFrame *subframe = new wxDocChildFrame (doc, view, theApp->getMainFrame(), -1, "Phantom Frame", wxPoint(10, 10), wxSize(256, 256), wxDEFAULT_FRAME_STYLE); #endif + theApp->setIconForFrame (subframe); wxMenu *file_menu = new wxMenu; - file_menu->Append(MAINMENU_FILE_CREATE_PHANTOM, "Cr&eate Phantom..."); - file_menu->Append(MAINMENU_FILE_CREATE_FILTER, "Create &Filter..."); - file_menu->Append(wxID_OPEN, "&Open..."); + file_menu->Append(MAINMENU_FILE_CREATE_PHANTOM, "Cr&eate Phantom...\tCtrl-P"); + file_menu->Append(MAINMENU_FILE_CREATE_FILTER, "Create &Filter...\tCtrl-F"); + file_menu->Append(wxID_OPEN, "&Open...\tCtrl-O"); file_menu->Append(wxID_SAVEAS, "Save &As..."); file_menu->Append(wxID_CLOSE, "&Close"); @@ -1713,11 +1923,12 @@ PhantomView::CreateChildFrame(wxDocument *doc, wxView *view) file_menu->Append(wxID_PREVIEW, "Print Pre&view"); wxMenu *process_menu = new wxMenu; - process_menu->Append(PHMMENU_PROCESS_RASTERIZE, "&Rasterize..."); - process_menu->Append(PHMMENU_PROCESS_PROJECTIONS, "&Projections..."); + process_menu->Append(PHMMENU_PROCESS_RASTERIZE, "&Rasterize...\tCtrl-R"); + process_menu->Append(PHMMENU_PROCESS_PROJECTIONS, "&Projections...\tCtrl-J"); wxMenu *help_menu = new wxMenu; - help_menu->Append(MAINMENU_HELP_CONTENTS, "&Contents"); + help_menu->Append(MAINMENU_HELP_CONTENTS, "&Contents\tF1"); + help_menu->Append(MAINMENU_HELP_TOPICS, "&Topics\tCtrl-H"); help_menu->Append(MAINMENU_HELP_ABOUT, "&About"); wxMenuBar *menu_bar = new wxMenuBar; @@ -1727,9 +1938,20 @@ PhantomView::CreateChildFrame(wxDocument *doc, wxView *view) menu_bar->Append(help_menu, "&Help"); subframe->SetMenuBar(menu_bar); - subframe->Centre(wxBOTH); - + + wxAcceleratorEntry accelEntries[8]; + accelEntries[0].Set (wxACCEL_CTRL, static_cast('O'), wxID_OPEN); + accelEntries[1].Set (wxACCEL_CTRL, static_cast('S'), wxID_SAVE); + accelEntries[2].Set (wxACCEL_CTRL, static_cast('H'), MAINMENU_HELP_TOPICS); + accelEntries[3].Set (wxACCEL_CTRL, static_cast('P'), MAINMENU_FILE_CREATE_PHANTOM); + accelEntries[4].Set (wxACCEL_CTRL, static_cast('F'), MAINMENU_FILE_CREATE_FILTER); + accelEntries[5].Set (wxACCEL_NORMAL, WXK_F1, MAINMENU_HELP_CONTENTS); + accelEntries[6].Set (wxACCEL_CTRL, static_cast('J'), PHMMENU_PROCESS_PROJECTIONS); + accelEntries[7].Set (wxACCEL_CTRL, static_cast('R'), PHMMENU_PROCESS_RASTERIZE); + wxAcceleratorTable accelTable (8, accelEntries); + subframe->SetAcceleratorTable (accelTable); + return subframe; } @@ -1743,7 +1965,7 @@ PhantomView::OnCreate(wxDocument *doc, long WXUNUSED(flags) ) int width, height; m_frame->GetClientSize(&width, &height); m_frame->SetTitle("PhantomView"); - m_canvas = CreateCanvas(this, m_frame); + m_canvas = CreateCanvas (this, m_frame); #ifdef __X__ int x, y; // X requires a forced resize @@ -1757,7 +1979,6 @@ PhantomView::OnCreate(wxDocument *doc, long WXUNUSED(flags) ) return true; } - void PhantomView::OnUpdate(wxView *WXUNUSED(sender), wxObject *WXUNUSED(hint) ) { @@ -1771,21 +1992,19 @@ PhantomView::OnClose (bool deleteWindow) if (!GetDocument()->Close()) return false; -// m_canvas->Clear(); - m_canvas->m_pView = NULL; + m_canvas->Clear(); + //m_canvas->m_pView = NULL; m_canvas = NULL; -// wxString s(wxTheApp->GetAppName()); -// if (m_frame) -// m_frame->SetTitle(s); + wxString s(wxTheApp->GetAppName()); + if (m_frame) + m_frame->SetTitle(s); SetFrame(NULL); Activate(false); - if (deleteWindow) { - + if (deleteWindow) delete m_frame; - return true; - } + return true; } @@ -1816,6 +2035,19 @@ ProjectionFileCanvas::OnDraw(wxDC& dc) m_pView->OnDraw(& dc); } +wxSize +ProjectionFileCanvas::GetBestSize () const +{ + wxSize best (0, 0); + if (m_pView) { + Projections& rProj = m_pView->GetDocument()->getProjections(); + best.Set (rProj.nDet(), rProj.nView()); + } + + return best; +} + + // ProjectionFileView IMPLEMENT_DYNAMIC_CLASS(ProjectionFileView, wxView) @@ -1864,7 +2096,7 @@ ProjectionFileView::OnProperties (wxCommandEvent& event) std::ostringstream os; rProj.printScanInfo(os); *theApp->getLog() << os.str().c_str(); - wxMessageDialog dialogMsg (m_frame, os.str().c_str(), "Projection File Properties", wxOK | wxICON_INFORMATION); + wxMessageDialog dialogMsg (getFrameForChild(), os.str().c_str(), "Projection File Properties", wxOK | wxICON_INFORMATION); dialogMsg.ShowModal(); } @@ -1873,7 +2105,7 @@ void ProjectionFileView::OnConvertPolar (wxCommandEvent& event) { Projections& rProj = GetDocument()->getProjections(); - DialogGetConvertPolarParameters dialogPolar (m_frame, "Convert Polar", m_iDefaultPolarNX, m_iDefaultPolarNY, + DialogGetConvertPolarParameters dialogPolar (getFrameForChild(), "Convert Polar", m_iDefaultPolarNX, m_iDefaultPolarNY, m_iDefaultPolarInterpolation, -1); if (dialogPolar.ShowModal() == wxID_OK) { wxString strInterpolation (dialogPolar.getInterpolationName()); @@ -1906,7 +2138,7 @@ void ProjectionFileView::OnConvertFFTPolar (wxCommandEvent& event) { Projections& rProj = GetDocument()->getProjections(); - DialogGetConvertPolarParameters dialogPolar (m_frame, "Convert to FFT Polar", m_iDefaultPolarNX, m_iDefaultPolarNY, + DialogGetConvertPolarParameters dialogPolar (getFrameForChild(), "Convert to FFT Polar", m_iDefaultPolarNX, m_iDefaultPolarNY, m_iDefaultPolarInterpolation, m_iDefaultPolarZeropad); if (dialogPolar.ShowModal() == wxID_OK) { wxString strInterpolation (dialogPolar.getInterpolationName()); @@ -1944,7 +2176,7 @@ ProjectionFileView::OnReconstructFourier (wxCommandEvent& event) void ProjectionFileView::OnReconstructFBP (wxCommandEvent& event) { - DialogGetReconstructionParameters dialogReconstruction (m_frame, m_iDefaultNX, m_iDefaultNY, m_iDefaultFilter, m_dDefaultFilterParam, m_iDefaultFilterMethod, m_iDefaultFilterGeneration, m_iDefaultZeropad, m_iDefaultInterpolation, m_iDefaultInterpParam, m_iDefaultBackprojector, m_iDefaultTrace); + DialogGetReconstructionParameters dialogReconstruction (getFrameForChild(), m_iDefaultNX, m_iDefaultNY, m_iDefaultFilter, m_dDefaultFilterParam, m_iDefaultFilterMethod, m_iDefaultFilterGeneration, m_iDefaultZeropad, m_iDefaultInterpolation, m_iDefaultInterpParam, m_iDefaultBackprojector, m_iDefaultTrace); int retVal = dialogReconstruction.ShowModal(); if (retVal == wxID_OK) { @@ -1974,16 +2206,11 @@ ProjectionFileView::OnReconstructFBP (wxCommandEvent& event) const Projections& rProj = GetDocument()->getProjections(); imageFile.setArraySize (m_iDefaultNX, m_iDefaultNY); - if (m_iDefaultFilterMethod != ProcessSignal::FILTER_METHOD_CONVOLUTION && m_iDefaultFilterGeneration == ProcessSignal::FILTER_GENERATION_DIRECT && rProj.geometry() != Scanner::GEOMETRY_PARALLEL) { - wxMessageBox ("Sorry!\nCurrently, frequency-based filtering with direct filter generation is not support for geometries other than parallel.\nAborting command.", "Not Supported", wxOK | wxICON_WARNING, m_frame); - return; - } - Reconstructor* pReconstruct = new Reconstructor (rProj, imageFile, optFilterName.c_str(), m_dDefaultFilterParam, optFilterMethodName.c_str(), m_iDefaultZeropad, optFilterGenerationName.c_str(), optInterpName.c_str(), m_iDefaultInterpParam, optBackprojectName.c_str(), m_iDefaultTrace); Timer timerRecon; if (m_iDefaultTrace > Trace::TRACE_CONSOLE) { - ReconstructDialog* pDlgReconstruct = new ReconstructDialog (*pReconstruct, rProj, imageFile, m_iDefaultTrace, m_frame); + ReconstructDialog* pDlgReconstruct = new ReconstructDialog (*pReconstruct, rProj, imageFile, m_iDefaultTrace, getFrameForChild()); for (int iView = 0; iView < rProj.nView(); iView++) { ::wxYield(); ::wxYield(); @@ -2002,7 +2229,7 @@ ProjectionFileView::OnReconstructFBP (wxCommandEvent& event) } delete pDlgReconstruct; } else { - wxProgressDialog dlgProgress (wxString("Reconstruction"), wxString("Reconstruction Progress"), rProj.nView() + 1, m_frame, wxPD_CAN_ABORT); + wxProgressDialog dlgProgress (wxString("Reconstruction"), wxString("Reconstruction Progress"), rProj.nView() + 1, getFrameForChild(), wxPD_CAN_ABORT); for (int i = 0; i < rProj.nView(); i++) { pReconstruct->reconstructView (i, 1); if (! dlgProgress.Update(i + 1)) { @@ -2051,19 +2278,20 @@ wxFrame* ProjectionFileView::CreateChildFrame(wxDocument *doc, wxView *view) { #ifdef CTSIM_MDI - wxMDIChildFrame *subframe = new wxMDIChildFrame (theApp->getMainFrame(), -1, "Projection Frame", wxPoint(10, 10), wxSize(0, 0), wxDEFAULT_FRAME_STYLE); + wxDocMDIChildFrame *subframe = new wxDocMDIChildFrame (doc, view, theApp->getMainFrame(), -1, "Projection Frame", wxPoint(10, 10), wxSize(0, 0), wxDEFAULT_FRAME_STYLE); #else - wxDocChildFrame *subframe = new wxDocChildFrame(doc, view, theApp->getMainFrame(), -1, "Projection Frame", wxPoint(10, 10), wxSize(0, 0), wxDEFAULT_FRAME_STYLE); + wxDocChildFrame *subframe = new wxDocChildFrame (doc, view, theApp->getMainFrame(), -1, "Projection Frame", wxPoint(10, 10), wxSize(0, 0), wxDEFAULT_FRAME_STYLE); #endif + theApp->setIconForFrame (subframe); wxMenu *file_menu = new wxMenu; - file_menu->Append(MAINMENU_FILE_CREATE_PHANTOM, "Cr&eate Phantom..."); - file_menu->Append(MAINMENU_FILE_CREATE_FILTER, "Create &Filter..."); - file_menu->Append(wxID_OPEN, "&Open..."); - file_menu->Append(wxID_SAVE, "&Save"); + file_menu->Append(MAINMENU_FILE_CREATE_PHANTOM, "Cr&eate Phantom...\tCtrl-P"); + file_menu->Append(MAINMENU_FILE_CREATE_FILTER, "Create &Filter...\tCtrl-F"); + file_menu->Append(wxID_OPEN, "&Open...\tCtrl-O"); + file_menu->Append(wxID_SAVE, "&Save\tCtrl-S"); file_menu->Append(wxID_SAVEAS, "Save &As..."); - file_menu->Append(wxID_CLOSE, "&Close"); + file_menu->Append(wxID_CLOSE, "&Close\tCtrl-W"); file_menu->AppendSeparator(); file_menu->Append(PJMENU_FILE_PROPERTIES, "P&roperties"); @@ -2074,16 +2302,16 @@ ProjectionFileView::CreateChildFrame(wxDocument *doc, wxView *view) file_menu->Append(wxID_PREVIEW, "Print Pre&view"); wxMenu *convert_menu = new wxMenu; - convert_menu->Append (PJMENU_CONVERT_POLAR, "&Polar Image..."); - convert_menu->Append (PJMENU_CONVERT_FFT_POLAR, "&FFT->Polar Image..."); + convert_menu->Append (PJMENU_CONVERT_POLAR, "&Polar Image...\tCtrl-L"); + convert_menu->Append (PJMENU_CONVERT_FFT_POLAR, "&FFT->Polar Image...\tCtrl-I"); wxMenu *reconstruct_menu = new wxMenu; - reconstruct_menu->Append (PJMENU_RECONSTRUCT_FBP, "&Filtered Backprojection..."); - reconstruct_menu->Append (PJMENU_RECONSTRUCT_FOURIER, "&Fourier..."); + reconstruct_menu->Append (PJMENU_RECONSTRUCT_FBP, "&Filtered Backprojection...\tCtrl-R"); + reconstruct_menu->Append (PJMENU_RECONSTRUCT_FOURIER, "&Fourier...\tCtrl-E"); wxMenu *help_menu = new wxMenu; - help_menu->Append(MAINMENU_HELP_CONTENTS, "&Contents"); - help_menu->AppendSeparator(); + help_menu->Append(MAINMENU_HELP_CONTENTS, "&Contents\tF1"); + help_menu->Append(MAINMENU_HELP_TOPICS, "&Topics\tCtrl-H"); help_menu->Append(MAINMENU_HELP_ABOUT, "&About"); wxMenuBar *menu_bar = new wxMenuBar; @@ -2093,9 +2321,23 @@ ProjectionFileView::CreateChildFrame(wxDocument *doc, wxView *view) menu_bar->Append (reconstruct_menu, "&Reconstruct"); menu_bar->Append (help_menu, "&Help"); - subframe->SetMenuBar(menu_bar); - + subframe->SetMenuBar(menu_bar); subframe->Centre(wxBOTH); + + wxAcceleratorEntry accelEntries[11]; + accelEntries[0].Set (wxACCEL_CTRL, static_cast('O'), wxID_OPEN); + accelEntries[1].Set (wxACCEL_CTRL, static_cast('S'), wxID_SAVE); + accelEntries[2].Set (wxACCEL_CTRL, static_cast('W'), wxID_CLOSE); + accelEntries[3].Set (wxACCEL_CTRL, static_cast('H'), MAINMENU_HELP_TOPICS); + accelEntries[4].Set (wxACCEL_CTRL, static_cast('P'), MAINMENU_FILE_CREATE_PHANTOM); + accelEntries[5].Set (wxACCEL_CTRL, static_cast('F'), MAINMENU_FILE_CREATE_FILTER); + accelEntries[6].Set (wxACCEL_NORMAL, WXK_F1, MAINMENU_HELP_CONTENTS); + accelEntries[7].Set (wxACCEL_CTRL, static_cast('L'), PJMENU_CONVERT_POLAR); + accelEntries[8].Set (wxACCEL_CTRL, static_cast('I'), PJMENU_CONVERT_FFT_POLAR); + accelEntries[9].Set (wxACCEL_CTRL, static_cast('R'), PJMENU_RECONSTRUCT_FBP); + accelEntries[10].Set (wxACCEL_CTRL, static_cast('E'), PJMENU_RECONSTRUCT_FOURIER); + wxAcceleratorTable accelTable (11, accelEntries); + subframe->SetAcceleratorTable (accelTable); return subframe; } @@ -2127,6 +2369,12 @@ ProjectionFileView::OnCreate(wxDocument *doc, long WXUNUSED(flags) ) void ProjectionFileView::OnDraw (wxDC* dc) { + wxSize clientSize = m_frame->GetClientSize(); + wxSize bestSize = m_canvas->GetBestSize(); + + if (clientSize.x > bestSize.x || clientSize.y > bestSize.y) + m_frame->SetClientSize (bestSize); + if (m_bitmap.Ok()) dc->DrawBitmap (m_bitmap, 0, 0, false); } @@ -2187,8 +2435,8 @@ ProjectionFileView::OnClose (bool deleteWindow) if (!GetDocument()->Close()) return false; - // m_canvas->Clear(); - m_canvas->m_pView = NULL; + m_canvas->Clear(); + // m_canvas->m_pView = NULL; m_canvas = NULL; wxString s(wxTheApp->GetAppName()); if (m_frame) @@ -2251,9 +2499,9 @@ PlotFileView::OnProperties (wxCommandEvent& event) const PlotFile& rPlot = GetDocument()->getPlotFile(); std::ostringstream os; os << "Columns: " << rPlot.getNumColumns() << ", Records: " << rPlot.getNumRecords() << "\n"; - rPlot.printHeaders (os); + rPlot.printHeadersBrief (os); *theApp->getLog() << os.str().c_str(); - wxMessageDialog dialogMsg (m_frame, os.str().c_str(), "Plot File Properties", wxOK | wxICON_INFORMATION); + wxMessageDialog dialogMsg (getFrameForChild(), os.str().c_str(), "Plot File Properties", wxOK | wxICON_INFORMATION); dialogMsg.ShowModal(); } @@ -2264,7 +2512,7 @@ PlotFileView::OnScaleAuto (wxCommandEvent& event) const PlotFile& rPlotFile = GetDocument()->getPlotFile(); double min, max, mean, mode, median, stddev; rPlotFile.statistics (1, min, max, mean, mode, median, stddev); - DialogAutoScaleParameters dialogAutoScale (m_frame, mean, mode, median, stddev, m_dAutoScaleFactor); + DialogAutoScaleParameters dialogAutoScale (getFrameForChild(), mean, mode, median, stddev, m_dAutoScaleFactor); int iRetVal = dialogAutoScale.ShowModal(); if (iRetVal == wxID_OK) { m_bMinSpecified = true; @@ -2298,7 +2546,7 @@ PlotFileView::OnScaleMinMax (wxCommandEvent& event) if (m_bMaxSpecified) max = m_dMaxPixel; - DialogGetMinMax dialogMinMax (m_frame, "Set Y-axis Minimum & Maximum", min, max); + DialogGetMinMax dialogMinMax (getFrameForChild(), "Set Y-axis Minimum & Maximum", min, max); int retVal = dialogMinMax.ShowModal(); if (retVal == wxID_OK) { m_bMinSpecified = true; @@ -2339,19 +2587,20 @@ wxFrame* PlotFileView::CreateChildFrame(wxDocument *doc, wxView *view) { #ifdef CTSIM_MDI - wxMDIChildFrame *subframe = new wxMDIChildFrame (theApp->getMainFrame(), -1, "Plot Frame", wxPoint(10, 10), wxSize(500, 300), wxDEFAULT_FRAME_STYLE); + wxDocMDIChildFrame *subframe = new wxDocMDIChildFrame (doc, view, theApp->getMainFrame(), -1, "Plot Frame", wxPoint(10, 10), wxSize(500, 300), wxDEFAULT_FRAME_STYLE); #else wxDocChildFrame *subframe = new wxDocChildFrame(doc, view, theApp->getMainFrame(), -1, "Plot Frame", wxPoint(10, 10), wxSize(500, 300), wxDEFAULT_FRAME_STYLE); #endif + theApp->setIconForFrame (subframe); wxMenu *file_menu = new wxMenu; - file_menu->Append(MAINMENU_FILE_CREATE_PHANTOM, "Cr&eate Phantom..."); - file_menu->Append(MAINMENU_FILE_CREATE_FILTER, "Create &Filter..."); - file_menu->Append(wxID_OPEN, "&Open..."); - file_menu->Append(wxID_SAVE, "&Save"); + file_menu->Append(MAINMENU_FILE_CREATE_PHANTOM, "Cr&eate Phantom...\tCtrl-P"); + file_menu->Append(MAINMENU_FILE_CREATE_FILTER, "Create &Filter...\tCtrl-F"); + file_menu->Append(wxID_OPEN, "&Open...\tCtrl-O"); + file_menu->Append(wxID_SAVE, "&Save\tCtrl-S"); file_menu->Append(wxID_SAVEAS, "Save &As..."); - file_menu->Append(wxID_CLOSE, "&Close"); + file_menu->Append(wxID_CLOSE, "&Close\tCtrl-W"); file_menu->AppendSeparator(); file_menu->Append(PJMENU_FILE_PROPERTIES, "P&roperties"); @@ -2362,13 +2611,13 @@ PlotFileView::CreateChildFrame(wxDocument *doc, wxView *view) file_menu->Append(wxID_PREVIEW, "Print Pre&view"); wxMenu *view_menu = new wxMenu; - view_menu->Append(PLOTMENU_VIEW_SCALE_MINMAX, "Display Scale &Set..."); - view_menu->Append(PLOTMENU_VIEW_SCALE_AUTO, "Display Scale &Auto..."); - view_menu->Append(PLOTMENU_VIEW_SCALE_FULL, "Display &Full Scale"); + view_menu->Append(PLOTMENU_VIEW_SCALE_MINMAX, "Display Scale &Set...\tCtrl-E"); + view_menu->Append(PLOTMENU_VIEW_SCALE_AUTO, "Display Scale &Auto...\tCtrl-A"); + view_menu->Append(PLOTMENU_VIEW_SCALE_FULL, "Display &Full Scale\tCtrl-U"); wxMenu *help_menu = new wxMenu; - help_menu->Append(MAINMENU_HELP_CONTENTS, "&Contents"); - help_menu->AppendSeparator(); + help_menu->Append(MAINMENU_HELP_CONTENTS, "&Contents\tF1"); + help_menu->Append(MAINMENU_HELP_TOPICS, "&Topics\tCtrl-H"); help_menu->Append(MAINMENU_HELP_ABOUT, "&About"); wxMenuBar *menu_bar = new wxMenuBar; @@ -2378,8 +2627,21 @@ PlotFileView::CreateChildFrame(wxDocument *doc, wxView *view) menu_bar->Append(help_menu, "&Help"); subframe->SetMenuBar(menu_bar); - subframe->Centre(wxBOTH); + + wxAcceleratorEntry accelEntries[10]; + accelEntries[0].Set (wxACCEL_CTRL, static_cast('O'), wxID_OPEN); + accelEntries[1].Set (wxACCEL_CTRL, static_cast('S'), wxID_SAVE); + accelEntries[2].Set (wxACCEL_CTRL, static_cast('W'), wxID_CLOSE); + accelEntries[3].Set (wxACCEL_CTRL, static_cast('H'), MAINMENU_HELP_TOPICS); + accelEntries[4].Set (wxACCEL_CTRL, static_cast('P'), MAINMENU_FILE_CREATE_PHANTOM); + accelEntries[5].Set (wxACCEL_CTRL, static_cast('F'), MAINMENU_FILE_CREATE_FILTER); + accelEntries[6].Set (wxACCEL_NORMAL, WXK_F1, MAINMENU_HELP_CONTENTS); + accelEntries[7].Set (wxACCEL_CTRL, static_cast('E'), PLOTMENU_VIEW_SCALE_MINMAX); + accelEntries[8].Set (wxACCEL_CTRL, static_cast('A'), PLOTMENU_VIEW_SCALE_AUTO); + accelEntries[9].Set (wxACCEL_CTRL, static_cast('U'), PLOTMENU_VIEW_SCALE_FULL); + wxAcceleratorTable accelTable (10, accelEntries); + subframe->SetAcceleratorTable (accelTable); return subframe; } @@ -2483,8 +2745,8 @@ PlotFileView::OnClose (bool deleteWindow) if (!GetDocument()->Close()) return false; - // m_canvas->Clear(); - m_canvas->m_pView = NULL; + m_canvas->Clear(); + // m_canvas->m_pView = NULL; m_canvas = NULL; wxString s(wxTheApp->GetAppName()); if (m_frame)