X-Git-Url: http://git.kpe.io/?p=ctsim.git;a=blobdiff_plain;f=src%2Fctsim.cpp;h=fe9586754b741a0fcaaf3da6e77db9b817f28b13;hp=8dc7e229b526ab201241350ab6215a2a8c48c260;hb=9f29c8b32c972db1178d6f8551d5cd57ceb67083;hpb=7ae47cb0ff0a16d1c36797576155263434cc73ff diff --git a/src/ctsim.cpp b/src/ctsim.cpp index 8dc7e22..fe95867 100644 --- a/src/ctsim.cpp +++ b/src/ctsim.cpp @@ -9,7 +9,7 @@ ** This is part of the CTSim program ** Copyright (C) 1983-2000 Kevin Rosenberg ** -** $Id: ctsim.cpp,v 1.22 2000/12/29 20:18:59 kevin Exp $ +** $Id: ctsim.cpp,v 1.54 2001/01/28 19:10:18 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 @@ -24,60 +24,67 @@ ** along with this program; if not, write to the Free Software ** Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA ******************************************************************************/ - - -// 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 - -#if !wxUSE_DOC_VIEW_ARCHITECTURE -#error You must set wxUSE_DOC_VIEW_ARCHITECTURE to 1 in setup.h! -#endif - -#include "ct.h" + +#ifdef MSVC +#define strdup _strdup +#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/image.h" +#include "wx/filesys.h" +#include "wx/fs_zip.h" + +#if !wxUSE_DOC_VIEW_ARCHITECTURE +#error You must set wxUSE_DOC_VIEW_ARCHITECTURE to 1 in setup.h! +#endif + + +#include "ct.h" #include "ctsim.h" +#include "ctsim-map.h" #include "docs.h" #include "views.h" #include "dialogs.h" - + #if defined(HAVE_CONFIG_H) #include "config.h" -#endif - +#endif + #if defined(HAVE_GETOPT_H) || defined(HAVE_GETOPT_LONG) -#ifdef MSVC -#define __STDC__ 1 -#endif -#include "getopt.h" -#ifdef MSVC -#undef __STDC__ +#ifdef MSVC +#define __STDC__ 1 +#endif +#include "getopt.h" +#ifdef MSVC +#undef __STDC__ #endif #endif - -static const char* rcsindent = "$Id: ctsim.cpp,v 1.22 2000/12/29 20:18:59 kevin Exp $"; -class CTSimApp* theApp = NULL; +static const char* rcsindent = "$Id: ctsim.cpp,v 1.54 2001/01/28 19:10:18 kevin Exp $"; struct option CTSimApp::ctsimOptions[] = { - {"help", 0, 0, O_HELP}, - {"version", 0, 0, O_VERSION}, - {0, 0, 0, 0} + {"help", 0, 0, O_HELP}, + {"version", 0, 0, O_VERSION}, + {0, 0, 0, 0} }; IMPLEMENT_APP(CTSimApp) CTSimApp::CTSimApp() - : m_docManager(NULL), m_pFrame(NULL) +: m_docManager(NULL), m_pFrame(NULL), m_pLog(0) { - theApp = this; + theApp = this; } #ifdef HAVE_SYS_TIME_H @@ -95,235 +102,454 @@ CTSimApp::OnInit() setpriority (PRIO_PROCESS, 0, 15); // set to low scheduling priority #endif - // process options - while (1) { - int c = getopt_long (argc, argv, "", ctsimOptions, NULL); - if (c == -1) - break; - - switch (c) { - case O_VERSION: - std::cout << rcsindent << std::endl; -#ifdef CTSIMVERSION - std::cout << "Version: CTSIMVERSION" << std::endl; -#elif defined(VERSION) - std::cout << "Version: VERSION" << std::endl; -#endif - exit(0); - case O_HELP: - case '?': - usage (argv[0]); - exit (0); - default: - usage (argv[0]); - exit (1); - } - } + m_pConfig = new wxConfig("ctsim"); + wxConfigBase::Set(m_pConfig); - m_docManager = new wxDocManager; + g_bRunningWXWindows = true; + // process options + while (1) { + int c = getopt_long (argc, argv, "", ctsimOptions, NULL); + if (c == -1) + break; - new wxDocTemplate (m_docManager, "ImageFile", "*.if", "", "if", "ImageFile doc", "ImageFile View", CLASSINFO(ImageFileDocument), CLASSINFO(ImageFileView)); - - new wxDocTemplate (m_docManager, "ProjectionFile", "*.pj", "", "pj", "ProjectionFile doc", "ProjectionFile View", CLASSINFO(ProjectionFileDocument), CLASSINFO(ProjectionFileView)); - - new wxDocTemplate (m_docManager, "PhantomFile", "*.phm", "", "phm", "Phantom doc", "Phantom View", CLASSINFO(PhantomDocument), CLASSINFO(PhantomView)); - - new wxDocTemplate (m_docManager, "PlotFile", "*.plt", "", "plt", "Plot doc", "Plot View", CLASSINFO(PlotFileDocument), CLASSINFO(PlotFileView)); + switch (c) { + case O_VERSION: + std::cout << rcsindent << std::endl; +#ifdef CTSIMVERSION + std::cout << "Version: CTSIMVERSION" << std::endl; +#elif defined(VERSION) + std::cout << "Version: VERSION" << std::endl; +#endif + exit(0); + case O_HELP: + case '?': + usage (argv[0]); + exit (0); + default: + usage (argv[0]); + exit (1); + } + } + + m_docManager = new wxDocManager (wxDEFAULT_DOCMAN_FLAGS, true); + + m_pDocTemplImage = new wxDocTemplate (m_docManager, "ImageFile", "*.if", "", "if", "ImageFile", "ImageView", CLASSINFO(ImageFileDocument), CLASSINFO(ImageFileView)); + m_pDocTemplProjection = new wxDocTemplate (m_docManager, "ProjectionFile", "*.pj", "", "pj", "ProjectionFile", "ProjectionView", CLASSINFO(ProjectionFileDocument), CLASSINFO(ProjectionFileView)); + m_pDocTemplPhantom = new wxDocTemplate (m_docManager, "PhantomFile", "*.phm", "", "phm", "PhantomFile", "PhantomView", CLASSINFO(PhantomFileDocument), CLASSINFO(PhantomFileView)); + m_pDocTemplPlot = new wxDocTemplate (m_docManager, "PlotFile", "*.plt", "", "plt", "PlotFile", "PlotView", CLASSINFO(PlotFileDocument), CLASSINFO(PlotFileView)); + m_pDocTemplText = new wxDocTemplate (m_docManager, "TextFile", "*.txt", "", "txt", "TextFile", "TextView", CLASSINFO(TextFileDocument), CLASSINFO(TextFileView), wxTEMPLATE_INVISIBLE); + +#if wxUSE_GIF + wxImage::AddHandler(new wxGIFHandler); // Required for images in the online documentation +#endif + +#if wxUSE_STREAMS && wxUSE_ZIPSTREAM && wxUSE_ZLIB + wxFileSystem::AddHandler(new wxZipFSHandler); // Required for advanced HTML help +#endif + + // Create the main frame window + int xDisplay, yDisplay; + ::wxDisplaySize (&xDisplay, &yDisplay); + m_pFrame = new MainFrame(m_docManager, (wxFrame *) NULL, -1, "CTSim", wxPoint(0, 0), + wxSize(nearest(xDisplay * .75), nearest(yDisplay * .755)), wxDEFAULT_FRAME_STYLE); + + setIconForFrame (m_pFrame); + m_pFrame->Centre(wxBOTH); + m_pFrame->Show(true); + SetTopWindow (m_pFrame); + + for (int i = optind + 1; i <= argc; i++) { + wxString filename = argv [i - 1]; + m_docManager->CreateDocument (filename, wxDOC_SILENT); + } + + if (m_pConfig) + m_docManager->FileHistoryLoad(*m_pConfig); + +#ifdef CTSIM_MDI + TextFileDocument* pLogDoc = newTextDoc(); + if (pLogDoc) { + m_pLog = pLogDoc->getTextCtrl(); + pLogDoc->SetDocumentName("Log.txt"); + pLogDoc->SetFilename("Log.txt"); + pLogDoc->getView()->getFrame()->SetTitle("Log"); + int xSize, ySize; + m_pFrame->GetClientSize(&xSize, &ySize); + int yLogSize = ySize / 3; + pLogDoc->getView()->getFrame()->SetSize (0, ySize - yLogSize, xSize, yLogSize); + pLogDoc->getView()->getFrame()->Show (true); + } else +#else + m_pLog = new wxTextCtrl (m_pFrame, -1, "Log Window\n", wxPoint(0, 0), wxSize(0,0), wxTE_MULTILINE | wxTE_READONLY); +#endif + wxLog::SetActiveTarget (new wxLogTextCtrl(m_pLog)); - //// Create the main frame window - m_pFrame = new MainFrame(m_docManager, (wxFrame *) NULL, -1, "CTSim", wxPoint(0, 0), wxSize(500, 400), wxDEFAULT_FRAME_STYLE); - - SetTopWindow (m_pFrame); - m_pFrame->Centre(wxBOTH); +#ifdef CTSIM_WINHELP + if (! m_pFrame->getWinHelpController().Initialize("ctsim")) + *m_pLog << "Cannot initialize the Windows Help system" << "\n"; +#endif + if (! m_pFrame->getHtmlHelpController().Initialize(::wxGetCwd() + "/ctsim")) + *m_pLog << "Cannot initialize the HTML Help system" << "\n"; - m_pFrame->Show(true); + return true; +} - for (int i = optind + 1; i <= argc; i++) { - wxString filename = argv [i - 1]; - m_docManager->CreateDocument (filename, wxDOC_SILENT); - } - return true; +#include "./ctsim.xpm" +void +CTSimApp::setIconForFrame(wxFrame* pFrame) +{ + wxIcon iconApp (ctsim16_xpm); + + if (iconApp.Ok()) + pFrame->SetIcon (iconApp); } void CTSimApp::usage(const char* program) { - std::cout << "usage: " << fileBasename(program) << " [files-to-open...] [OPTIONS]\n"; - std::cout << "Computed Tomography Simulator (Graphical Shell)\n"; - std::cout << "\n"; - std::cout << " --version Display version\n"; - std::cout << " --help Display this help message\n"; + std::cout << "usage: " << fileBasename(program) << " [files-to-open...] [OPTIONS]\n"; + std::cout << "Computed Tomography Simulator (Graphical Shell)\n"; + std::cout << "\n"; + std::cout << " --version Display version\n"; + std::cout << " --help Display this help message\n"; } int CTSimApp::OnExit() { - delete m_docManager; #ifdef HAVE_DMALLOC - dmalloc_shutdown(); + dmalloc_shutdown(); #endif - return 0; + return 0; } wxString CTSimApp::getUntitledFilename() { static int untitledNumber = 1; - + wxString filename ("Untitled"); filename << untitledNumber++; - + return (filename); } // Top-level window for CTSim +#if CTSIM_MDI +IMPLEMENT_CLASS(MainFrame, wxMDIParentFrame) + +BEGIN_EVENT_TABLE(MainFrame, wxMDIParentFrame) +#else IMPLEMENT_CLASS(MainFrame, wxDocParentFrame) BEGIN_EVENT_TABLE(MainFrame, wxDocParentFrame) - EVT_MENU(MAINMENU_HELP_ABOUT, MainFrame::OnAbout) - EVT_MENU(MAINMENU_HELP_CONTENTS, MainFrame::OnHelpContents) - EVT_MENU(MAINMENU_FILE_CREATE_PHANTOM, MainFrame::OnCreatePhantom) - EVT_MENU(MAINMENU_FILE_EXIT, MainFrame::OnExit) - EVT_MENU(MAINMENU_WINDOW_BASE, MainFrame::OnWindowMenu0) - EVT_MENU(MAINMENU_WINDOW_BASE+1, MainFrame::OnWindowMenu1) - EVT_MENU(MAINMENU_WINDOW_BASE+2, MainFrame::OnWindowMenu2) - EVT_MENU(MAINMENU_WINDOW_BASE+3, MainFrame::OnWindowMenu3) - EVT_MENU(MAINMENU_WINDOW_BASE+4, MainFrame::OnWindowMenu4) - EVT_MENU(MAINMENU_WINDOW_BASE+5, MainFrame::OnWindowMenu5) - EVT_MENU(MAINMENU_WINDOW_BASE+6, MainFrame::OnWindowMenu6) - EVT_MENU(MAINMENU_WINDOW_BASE+7, MainFrame::OnWindowMenu7) - EVT_MENU(MAINMENU_WINDOW_BASE+8, MainFrame::OnWindowMenu8) - EVT_MENU(MAINMENU_WINDOW_BASE+9, MainFrame::OnWindowMenu9) - EVT_MENU(MAINMENU_WINDOW_BASE+10, MainFrame::OnWindowMenu10) - EVT_MENU(MAINMENU_WINDOW_BASE+11, MainFrame::OnWindowMenu11) - EVT_MENU(MAINMENU_WINDOW_BASE+12, MainFrame::OnWindowMenu12) - EVT_MENU(MAINMENU_WINDOW_BASE+13, MainFrame::OnWindowMenu13) - EVT_MENU(MAINMENU_WINDOW_BASE+14, MainFrame::OnWindowMenu14) - EVT_MENU(MAINMENU_WINDOW_BASE+15, MainFrame::OnWindowMenu15) - EVT_MENU(MAINMENU_WINDOW_BASE+16, MainFrame::OnWindowMenu16) - EVT_MENU(MAINMENU_WINDOW_BASE+17, MainFrame::OnWindowMenu17) - EVT_MENU(MAINMENU_WINDOW_BASE+18, MainFrame::OnWindowMenu18) - EVT_MENU(MAINMENU_WINDOW_BASE+19, MainFrame::OnWindowMenu19) - EVT_UPDATE_UI_RANGE(MAINMENU_WINDOW_BASE, MAINMENU_WINDOW_BASE+20, MainFrame::OnUpdateUI) +#endif + +EVT_MENU(MAINMENU_HELP_ABOUT, MainFrame::OnAbout) +EVT_MENU(MAINMENU_HELP_CONTENTS, MainFrame::OnHelpContents) +EVT_MENU(MAINMENU_HELP_TOPICS, MainFrame::OnHelpTopics) +EVT_SIZE(MainFrame::OnSize) + +#if defined(CTSIM_WINHELP) && (defined(DEBUG) || defined(_DEBUG)) +EVT_MENU(MAINMENU_HELP_SECONDARY, MainFrame::OnHelpSecondary) +#endif +EVT_MENU(MAINMENU_FILE_CREATE_PHANTOM, MainFrame::OnCreatePhantom) +EVT_MENU(MAINMENU_FILE_CREATE_FILTER, MainFrame::OnCreateFilter) +EVT_MENU(MAINMENU_FILE_EXIT, MainFrame::OnExit) +EVT_MENU_RANGE(wxID_FILE1, wxID_FILE9, MainFrame::OnMRUFile) +EVT_MENU(MAINMENU_WINDOW_BASE, MainFrame::OnWindowMenu0) +EVT_MENU(MAINMENU_WINDOW_BASE+1, MainFrame::OnWindowMenu1) +EVT_MENU(MAINMENU_WINDOW_BASE+2, MainFrame::OnWindowMenu2) +EVT_MENU(MAINMENU_WINDOW_BASE+3, MainFrame::OnWindowMenu3) +EVT_MENU(MAINMENU_WINDOW_BASE+4, MainFrame::OnWindowMenu4) +EVT_MENU(MAINMENU_WINDOW_BASE+5, MainFrame::OnWindowMenu5) +EVT_MENU(MAINMENU_WINDOW_BASE+6, MainFrame::OnWindowMenu6) +EVT_MENU(MAINMENU_WINDOW_BASE+7, MainFrame::OnWindowMenu7) +EVT_MENU(MAINMENU_WINDOW_BASE+8, MainFrame::OnWindowMenu8) +EVT_MENU(MAINMENU_WINDOW_BASE+9, MainFrame::OnWindowMenu9) +EVT_MENU(MAINMENU_WINDOW_BASE+10, MainFrame::OnWindowMenu10) +EVT_MENU(MAINMENU_WINDOW_BASE+11, MainFrame::OnWindowMenu11) +EVT_MENU(MAINMENU_WINDOW_BASE+12, MainFrame::OnWindowMenu12) +EVT_MENU(MAINMENU_WINDOW_BASE+13, MainFrame::OnWindowMenu13) +EVT_MENU(MAINMENU_WINDOW_BASE+14, MainFrame::OnWindowMenu14) +EVT_MENU(MAINMENU_WINDOW_BASE+15, MainFrame::OnWindowMenu15) +EVT_MENU(MAINMENU_WINDOW_BASE+16, MainFrame::OnWindowMenu16) +EVT_MENU(MAINMENU_WINDOW_BASE+17, MainFrame::OnWindowMenu17) +EVT_MENU(MAINMENU_WINDOW_BASE+18, MainFrame::OnWindowMenu18) +EVT_MENU(MAINMENU_WINDOW_BASE+19, MainFrame::OnWindowMenu19) +EVT_UPDATE_UI_RANGE(MAINMENU_WINDOW_BASE, MAINMENU_WINDOW_BASE+20, MainFrame::OnUpdateUI) END_EVENT_TABLE() +#if CTSIM_MDI +MainFrame::MainFrame(wxDocManager *manager, wxFrame *frame, wxWindowID id, const wxString& title, const wxPoint& pos, const wxSize& size, const long type) +: wxDocMDIParentFrame(manager, NULL, id, title, pos, size, type, "MainFrame") +#else MainFrame::MainFrame(wxDocManager *manager, wxFrame *frame, wxWindowID id, const wxString& title, const wxPoint& pos, const wxSize& size, const long type) - : wxDocParentFrame(manager, frame, id, title, pos, size, type), m_pLog(NULL) +: wxDocParentFrame(manager, frame, id, title, pos, size, type, "MainFrame") +#endif { - m_pLog = new wxTextCtrl (this, -1, "Log Window\n", wxPoint(0, 250), wxSize(100,50), wxTE_MULTILINE | wxTE_READONLY); - wxLog::SetActiveTarget(new wxLogTextCtrl(m_pLog)); - CreateStatusBar(); - SetStatusText ("Welcome to CTSim"); + //// Make a menubar + wxMenu *file_menu = new wxMenu; + + 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->AppendSeparator(); + file_menu->Append(MAINMENU_FILE_EXIT, "E&xit"); + + // history of files visited + theApp->getDocManager()->FileHistoryAddFilesToMenu(file_menu); + theApp->getDocManager()->FileHistoryUseMenu(file_menu); + +#ifndef CTSIM_MDI + m_pWindowMenu = new wxMenu; + m_pWindowMenu->UpdateUI (this); +#endif - //// Make a menubar - wxMenu *file_menu = new wxMenu; - - file_menu->Append(MAINMENU_FILE_CREATE_PHANTOM, "Cr&eate Phantom..."); - file_menu->Append(wxID_OPEN, "&Open..."); - - file_menu->AppendSeparator(); - file_menu->Append(MAINMENU_FILE_EXIT, "E&xit"); - - // history of files visited - m_docManager->FileHistoryUseMenu(file_menu); - - m_pWindowMenu = new wxMenu; - m_pWindowMenu->UpdateUI (this); + wxMenu* help_menu = new wxMenu; + help_menu->Append(MAINMENU_HELP_CONTENTS, "&Contents\tF1"); + help_menu->Append(MAINMENU_HELP_TOPICS, "&Topics\tCtrl-T"); +#if defined(CTSIM_WINHELP) && (defined(DEBUG) || defined(_DEBUG)) + help_menu->Append(MAINMENU_HELP_SECONDARY, "&Secondary Help"); +#endif + help_menu->Append(MAINMENU_HELP_ABOUT, "&About"); + + wxMenuBar* menu_bar = new wxMenuBar; + + menu_bar->Append(file_menu, "&File"); +#ifndef CTSIM_MDI + menu_bar->Append(m_pWindowMenu, "&Window"); +#endif + menu_bar->Append(help_menu, "&Help"); + + SetMenuBar(menu_bar); + +#ifndef CTSIM_MDI + int i; + for (i = 0; i < MAX_WINDOW_MENUITEMS; i++) { + m_apWindowMenuItems[i] = new wxMenuItem (m_pWindowMenu, MAINMENU_WINDOW_BASE+i, wxString("[EMPTY]")); + m_pWindowMenu->Append (m_apWindowMenuItems[i]); + m_pWindowMenu->Enable (MAINMENU_WINDOW_BASE+i, false); + } +#endif - wxMenu* help_menu = new wxMenu; - help_menu->Append(MAINMENU_HELP_CONTENTS, "&Contents"); - help_menu->AppendSeparator(); - help_menu->Append(MAINMENU_HELP_ABOUT, "&About"); - - wxMenuBar* menu_bar = new wxMenuBar; - - menu_bar->Append(file_menu, "&File"); - menu_bar->Append(m_pWindowMenu, "&Window"); - menu_bar->Append(help_menu, "&Help"); - - SetMenuBar(menu_bar); + m_iDefaultPhantomID = Phantom::PHM_HERMAN; + m_iDefaultFilterID = SignalFilter::FILTER_BANDLIMIT; + m_iDefaultFilterDomainID = SignalFilter::DOMAIN_FREQUENCY; + m_iDefaultFilterXSize = 256; + m_iDefaultFilterYSize = 256; + m_dDefaultFilterParam = 1.; + m_dDefaultFilterBandwidth = 1.; + m_dDefaultFilterInputScale = 1.; + m_dDefaultFilterOutputScale = 1.; + + wxAcceleratorEntry accelEntries[15]; + accelEntries[0].Set (wxACCEL_CTRL, static_cast('O'), wxID_OPEN); + accelEntries[1].Set (wxACCEL_CTRL, static_cast('H'), MAINMENU_HELP_TOPICS); + accelEntries[2].Set (wxACCEL_CTRL, static_cast('P'), MAINMENU_FILE_CREATE_PHANTOM); + accelEntries[3].Set (wxACCEL_CTRL, static_cast('F'), MAINMENU_FILE_CREATE_FILTER); +#ifndef CTSIM_MDI + accelEntries[4].Set (wxACCEL_NORMAL, WXK_F1, MAINMENU_HELP_CONTENTS); + for (i = 0; i < 10; i++) + accelEntries[i+4].Set (wxACCEL_CTRL, static_cast('0'+i), MAINMENU_WINDOW_BASE+i); + wxAcceleratorTable accelTable (15, accelEntries); +#else + wxAcceleratorTable accelTable (4, accelEntries); +#endif - for (int i = 0; i < MAX_WINDOW_MENUITEMS; i++) { - m_apWindowMenuItems[i] = new wxMenuItem (m_pWindowMenu, MAINMENU_WINDOW_BASE+i, wxString("")); - m_pWindowMenu->Append (m_apWindowMenuItems[i]); - m_pWindowMenu->Enable (MAINMENU_WINDOW_BASE+i, false); - } + SetAcceleratorTable (accelTable); } -void -MainFrame::OnAbout(wxCommandEvent& WXUNUSED(event) ) -{ - wxString msg = "CTSim\nThe Open Source Computed Tomography Simulator\n"; -#ifdef CTSIMVERSION - msg += "Version "; - msg += CTSIMVERSION; - msg += "\n\n"; -#elif defined(VERSION) - msg << "Version: " << VERSION << "\n\n"; -#endif - msg += "Author: Kevin Rosenberg \nUsage: ctsim [files-to-open..] [--help]"; +MainFrame::~MainFrame() +{ + if (theApp->getConfig()) + theApp->getDocManager()->FileHistorySave (*theApp->getConfig()); + delete theApp->getDocManager(); - wxMessageBox(msg, "About CTSim", wxOK | wxICON_INFORMATION, this); +} + +void +MainFrame::OnSize (wxSizeEvent& event) +{ +#ifdef CTSIM_MDI + int xSize, ySize; + wxMDIParentFrame::GetClientSize(&xSize, &ySize); + wxSize sizeClient (xSize, ySize); +#else + wxSize sizeClient = GetClientSize(); +#endif + wxSize sizeLog = sizeClient; + if (sizeClient.y < 100) { + sizeLog.y = 0; + sizeLog.x = 0; + } else { + sizeLog.x = sizeClient.x; + sizeLog.y = 100; + } + sizeClient.x -= sizeLog.x; + sizeClient.y -= sizeLog.y; +// m_pLog->SetSize (0, sizeClient.y, sizeLog.x, sizeLog.y); +// GetClientWindow()->SetSize (0, 0, sizeClient.x, sizeClient.y); +// GetClientWindow()->Refresh(); +#if CTSIM_MDI + wxDocMDIParentFrame::OnSize (event); +#else + wxDocParentFrame::OnSize (event); +#endif } void -MainFrame::OnCreatePhantom(wxCommandEvent& WXUNUSED(event)) -{ - DialogGetPhantom dialogPhantom (this, Phantom::PHM_HERMAN); - int dialogReturn = dialogPhantom.ShowModal(); - if (dialogReturn == wxID_OK) { - wxString selection (dialogPhantom.getPhantom()); - *theApp->getLog() << "Selected phantom " << selection.c_str() << "\n"; - wxString filename = selection + ".phm"; - theApp->getDocManager()->CreateDocument(filename, wxDOC_SILENT); +MainFrame::OnCreatePhantom(wxCommandEvent& event) +{ + DialogGetPhantom dialogPhantom (this, m_iDefaultPhantomID); + int dialogReturn = dialogPhantom.ShowModal(); + if (dialogReturn == wxID_OK) { + wxString selection (dialogPhantom.getPhantom()); + *theApp->getLog() << "Selected phantom " << selection.c_str() << "\n"; + wxString filename = selection + ".phm"; + m_iDefaultPhantomID = Phantom::convertNameToPhantomID (selection.c_str()); + theApp->getDocManager()->CreateDocument (filename, wxDOC_SILENT); + } + +} + +void +MainFrame::OnCreateFilter (wxCommandEvent& WXUNUSED(event)) +{ + DialogGetFilterParameters dialogFilter (this, m_iDefaultFilterXSize, m_iDefaultFilterYSize, m_iDefaultFilterID, m_dDefaultFilterParam, m_dDefaultFilterBandwidth, m_iDefaultFilterDomainID, m_dDefaultFilterInputScale, m_dDefaultFilterOutputScale); + int dialogReturn = dialogFilter.ShowModal(); + if (dialogReturn == wxID_OK) { + wxString strFilter (dialogFilter.getFilterName()); + wxString strDomain (dialogFilter.getDomainName()); + m_iDefaultFilterID = SignalFilter::convertFilterNameToID (strFilter.c_str()); + m_iDefaultFilterDomainID = SignalFilter::convertDomainNameToID (strDomain.c_str()); + m_iDefaultFilterXSize = dialogFilter.getXSize(); + m_iDefaultFilterYSize = dialogFilter.getYSize(); + m_dDefaultFilterBandwidth = dialogFilter.getBandwidth(); + m_dDefaultFilterParam= dialogFilter.getFilterParam(); + m_dDefaultFilterInputScale = dialogFilter.getInputScale(); + m_dDefaultFilterOutputScale = dialogFilter.getOutputScale(); + std::ostringstream os; + os << "Generate Filter=" << strFilter.c_str() + << ", size=(" << static_cast(m_iDefaultFilterXSize) << "," << static_cast(m_iDefaultFilterYSize) + << "), domain=" << strDomain.c_str() << ", filterParam=" << m_dDefaultFilterParam << ", bandwidth=" << m_dDefaultFilterBandwidth + << ", inputScale=" << m_dDefaultFilterInputScale << ", outputScale=" << m_dDefaultFilterOutputScale; + *theApp->getLog() << os.str().c_str() << "\n"; + wxString filename = "untitled.if"; + ImageFileDocument* pFilterDoc = theApp->newImageDoc(); + if (! pFilterDoc) { + sys_error (ERR_SEVERE, "Unable to create filter image"); + return; } - + ImageFile& rIF = pFilterDoc->getImageFile(); + rIF.setArraySize (m_iDefaultFilterXSize, m_iDefaultFilterYSize); + rIF.filterResponse (strDomain.c_str(), m_dDefaultFilterBandwidth, strFilter.c_str(), m_dDefaultFilterParam, m_dDefaultFilterInputScale, m_dDefaultFilterOutputScale); + rIF.labelAdd (os.str().c_str()); + if (theApp->getSetModifyNewDocs()) + pFilterDoc->Modify (true); + pFilterDoc->UpdateAllViews(); + pFilterDoc->GetFirstView()->OnUpdate (NULL, NULL); + pFilterDoc->getView()->getFrame()->SetClientSize(m_iDefaultFilterXSize, m_iDefaultFilterYSize); + pFilterDoc->getView()->getFrame()->Show(true); + } +} + +void +CTSimApp::getCompatibleImages (const ImageFileDocument* pIFDoc, std::vector& vecIF) +{ + const ImageFile& rIF = pIFDoc->getImageFile(); + unsigned int nx = rIF.nx(); + unsigned int ny = rIF.ny(); + wxList& rListDocs = m_docManager->GetDocuments(); + for (wxNode* pNode = rListDocs.GetFirst(); pNode != NULL; pNode = pNode->GetNext()) { + wxDocument* pDoc = reinterpret_cast(pNode->GetData()); + ImageFileDocument* pIFCompareDoc = dynamic_cast(pDoc); + if (pIFCompareDoc && (pIFDoc != pIFCompareDoc)) { + const ImageFile& rCompareIF = pIFCompareDoc->getImageFile(); + if (rCompareIF.nx() == nx && rCompareIF.ny() == ny) + vecIF.push_back (pIFCompareDoc); + } + } } -void -CTSimApp::getCompatibleImages (const ImageFileDocument* pIFDoc, std::vector& vecIF) -{ - const ImageFile& rIF = pIFDoc->getImageFile(); - unsigned int nx = rIF.nx(); - unsigned int ny = rIF.ny(); - wxList& rListDocs = m_docManager->GetDocuments(); - for (wxNode* pNode = rListDocs.GetFirst(); pNode != NULL; pNode = pNode->GetNext()) { - wxDocument* pDoc = reinterpret_cast(pNode->GetData()); - ImageFileDocument* pIFCompareDoc = dynamic_cast(pDoc); - if (pIFCompareDoc && (pIFDoc != pIFCompareDoc)) { - const ImageFile& rCompareIF = pIFCompareDoc->getImageFile(); - if (rCompareIF.nx() == nx && rCompareIF.ny() == ny) - vecIF.push_back (pIFCompareDoc); - } - } -} - void -MainFrame::OnHelpContents(wxCommandEvent& WXUNUSED(event) ) +MainFrame::OnHelpTopics (wxCommandEvent& event) { - wxMessageBox("No help available, refer to man pages of command-line tools"); + showHelp (event.GetId()); +} + +void +MainFrame::OnHelpContents (wxCommandEvent& event) +{ + showHelp (event.GetId()); +} + +#if defined(CTSIM_WINHELP) && (defined(DEBUG) || defined(_DEBUG)) +void +MainFrame::OnHelpSecondary (wxCommandEvent& event) +{ + m_htmlHelp.DisplayContents(); +} +#endif + +void +MainFrame::showHelp (int commandID) +{ +#ifdef CTSIM_WINHELP + m_winHelp.LoadFile(); +#else + m_htmlHelp.LoadFile(); +#endif + + switch (commandID) { + + case MAINMENU_HELP_CONTENTS: +#ifdef CTSIM_WINHELP + m_winHelp.DisplayContents (); +#else + m_htmlHelp.DisplayContents (); +#endif + break; + + case MAINMENU_HELP_TOPICS: +#ifdef CTSIM_WINHELP + m_winHelp.DisplaySection (introduction); +#else + m_htmlHelp.DisplayIndex(); +#endif + break; + + default: + *theApp->getLog() << "Unknown help command # " << commandID << "\n"; + break; + } } void MainFrame::OnExit (wxCommandEvent& WXUNUSED(event) ) { - Close(true); + Close(true); } void MainFrame::OnUpdateUI (wxUpdateUIEvent& rEvent) { int iPos = 0; - wxList& rListDocs = m_docManager->GetDocuments(); + wxList& rListDocs = theApp->getDocManager()->GetDocuments(); wxNode* pNode = rListDocs.GetFirst(); while (iPos < MAX_WINDOW_MENUITEMS && pNode != NULL) { wxDocument* pDoc = static_cast(pNode->GetData()); wxString strFilename = pDoc->GetFilename(); + if (iPos < 10) { + strFilename += "\tCtrl-"; + strFilename += static_cast('0' + iPos); + } static_cast(m_apWindowMenuItems[iPos])->SetName (strFilename); m_apWindowMenuData[iPos] = pDoc; m_pWindowMenu->Enable (MAINMENU_WINDOW_BASE+iPos, true); @@ -332,12 +558,22 @@ MainFrame::OnUpdateUI (wxUpdateUIEvent& rEvent) } for (int i = iPos; i < MAX_WINDOW_MENUITEMS; i++) { m_pWindowMenu->Enable (MAINMENU_WINDOW_BASE+i, false); - static_cast(m_apWindowMenuItems[i])->SetName (wxString("")); + static_cast(m_apWindowMenuItems[i])->SetName (wxString("[EMPTY]")); m_apWindowMenuData[i] = NULL; } - + } +#ifdef CTSIM_CUSTOM_MRU +void +MainFrame::OnMRUFile (wxCommandEvent& event) +{ + wxString fileName (theApp->getDocManager()->GetHistoryFile(event.GetId() - wxID_FILE1)); + if (fileName != "") + theApp->getDocManager()->CreateDocument(fileName, wxDOC_SILENT); +} +#endif + void MainFrame::DoWindowMenu (int iMenuPosition, wxCommandEvent& event) { @@ -413,3 +649,223 @@ void MainFrame::OnWindowMenu19 (wxCommandEvent& event) { DoWindowMenu (19, event); } +class BitmapControl : public wxPanel +{ +private: + DECLARE_DYNAMIC_CLASS (BitmapControl) + DECLARE_EVENT_TABLE () + wxBitmap* m_pBitmap; + +public: + BitmapControl (wxBitmap* pBitmap, wxWindow *parent, wxWindowID id = -1, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = wxSTATIC_BORDER, + const wxValidator& validator = wxDefaultValidator, + const wxString& name = "BitmapCtrl"); + + + virtual ~BitmapControl(); + + virtual wxSize GetBestSize() const; + + wxBitmap* getBitmap() + { return m_pBitmap; } + + void OnPaint(wxPaintEvent& event); +}; + + +BEGIN_EVENT_TABLE(BitmapControl, wxPanel) +EVT_PAINT(BitmapControl::OnPaint) +END_EVENT_TABLE() + +IMPLEMENT_CLASS(BitmapControl, wxPanel) + + +BitmapControl::BitmapControl (wxBitmap* pBitmap, wxWindow* parent, wxWindowID id, const wxPoint& pos, const wxSize& size, + long style, const wxValidator& validator, const wxString& name) + : m_pBitmap(pBitmap) +{ + Create(parent, id, pos, size, style, name); + + SetSize (GetBestSize()); +} + +wxSize +BitmapControl::GetBestSize () const +{ + if (m_pBitmap) + return wxSize (m_pBitmap->GetWidth(), m_pBitmap->GetHeight()); + else + return wxSize(0,0); +} + +BitmapControl::~BitmapControl() +{} + +void +BitmapControl::OnPaint (wxPaintEvent& event) +{ + wxPaintDC dc(this); + if (m_pBitmap) + dc.DrawBitmap (*m_pBitmap, 0, 0); +} + + +class BitmapDialog : public wxDialog { +private: + BitmapControl* m_pBitmapCtrl; + +public: + BitmapDialog (wxBitmap* pBitmap, char const* pszTitle); + virtual ~BitmapDialog(); +}; + +BitmapDialog::BitmapDialog (wxBitmap* pBitmap, char const* pszTitle) +: wxDialog(theApp->getMainFrame(), -1, wxString(pszTitle), wxDefaultPosition, wxDefaultSize, wxDIALOG_MODAL | wxDEFAULT_DIALOG_STYLE) +{ + wxBoxSizer* pTopSizer = new wxBoxSizer (wxVERTICAL); + + pTopSizer->Add (new BitmapControl (pBitmap, this), 0, wxALIGN_CENTER | wxALL, 5); + + wxBoxSizer* pButtonSizer = new wxBoxSizer (wxHORIZONTAL); + wxButton* pButtonOk = new wxButton (this, wxID_OK, "Ok"); + pButtonSizer->Add (pButtonOk, 0, wxEXPAND | wxALL, 10); + + pTopSizer->Add (pButtonSizer, 0, wxALIGN_CENTER); + + SetAutoLayout (true); + SetSizer (pTopSizer); + pTopSizer->Fit (this); + pTopSizer->SetSizeHints (this); +} + +BitmapDialog::~BitmapDialog() +{} + + +#include "./splash.xpm" +void +MainFrame::OnAbout(wxCommandEvent& WXUNUSED(event) ) +{ + wxBitmap bmp (splash); + if (bmp.Ok()) { + BitmapDialog dlg (&bmp, "About CTSim"); + dlg.Show(true); + } else { + wxString msg = "CTSim\nThe Open Source Computed Tomography Simulator\n"; +#ifdef CTSIMVERSION + msg += "Version "; + msg += CTSIMVERSION; + msg += "\n\n"; +#elif defined(VERSION) + msg << "Version: " << VERSION << "\n\n"; +#endif + msg += "Author: Kevin Rosenberg \nUsage: ctsim [files-to-open..] [--help]"; + + wxMessageBox(msg, "About CTSim", wxOK | wxICON_INFORMATION, this); + } +} + + +ProjectionFileDocument* +CTSimApp::newProjectionDoc() +{ + ProjectionFileDocument* newDoc = dynamic_cast(m_pDocTemplProjection->CreateDocument ("")); + if (newDoc) { + ProjectionFileView* pView = newDoc->getView(); + if (pView) { + wxFrame* pFrame = pView->getFrame(); + if (pFrame) { + pFrame->SetSize (0,0); + pFrame->Show (false); + } + } + newDoc->OnNewDocument(); + } + + return newDoc; +} + +ImageFileDocument* +CTSimApp::newImageDoc() +{ + ImageFileDocument* newDoc = dynamic_cast(m_pDocTemplImage->CreateDocument ("")); + if (newDoc) { + ImageFileView* pView = newDoc->getView(); + if (pView) { + wxFrame* pFrame = pView->getFrame(); + if (pFrame) { + pFrame->SetSize (0,0); + pFrame->Show (false); + } + } + newDoc->OnNewDocument(); + } + + return newDoc; +} + +PlotFileDocument* +CTSimApp::newPlotDoc() +{ + PlotFileDocument* newDoc = dynamic_cast(m_pDocTemplPlot->CreateDocument ("")); + if (newDoc) { + PlotFileView* pView = newDoc->getView(); + if (pView) { + wxFrame* pFrame = pView->getFrame(); + if (pFrame) { + wxSize size; + m_pFrame->GetClientSize (&size.x, &size.y); + pFrame->SetSize (size.x / 2, size.y / 2); + } + } + newDoc->OnNewDocument(); + } + + return newDoc; +} + + +TextFileDocument* +CTSimApp::newTextDoc() +{ + wxString strFilename (getUntitledFilename()); + strFilename += ".txt"; + + TextFileDocument* newDoc = dynamic_cast(m_pDocTemplText->CreateDocument ("")); + if (newDoc) { + TextFileView* pView = newDoc->getView(); + if (pView) { + wxFrame* pFrame = pView->getFrame(); + if (pFrame) { + wxSize size; + m_pFrame->GetClientSize (&size.x, &size.y);; + pFrame->SetSize (size.x / 2, size.y / 2); + pFrame->Show (false); + } + } + newDoc->OnNewDocument(); + } + + return newDoc; +} + + +PhantomFileDocument* +CTSimApp::newPhantomDoc() +{ + PhantomFileDocument* newDoc = dynamic_cast(m_pDocTemplPhantom->CreateDocument ("")); + if (newDoc) { + PhantomFileView* pView = newDoc->getView(); + if (pView) { + wxFrame* pFrame = pView->getFrame(); + if (pFrame) + pFrame->SetSize (0,0); + } + newDoc->OnNewDocument(); + } + + return newDoc; +}