X-Git-Url: http://git.kpe.io/?p=ctsim.git;a=blobdiff_plain;f=src%2Fctsim.cpp;h=9248247d03640f0fdb77c4179d28beda2c97ffaa;hp=3736f8d9164589f91ec1599632e40df311b75497;hb=5a6caa64e880f613b82e516031028d02fd127257;hpb=a18f7b9629e21da7c33abc59718b5ab150f3e3d1 diff --git a/src/ctsim.cpp b/src/ctsim.cpp index 3736f8d..9248247 100644 --- a/src/ctsim.cpp +++ b/src/ctsim.cpp @@ -7,9 +7,9 @@ ** Date Started: July 2000 ** ** This is part of the CTSim program -** Copyright (C) 1983-2000 Kevin Rosenberg +** Copyright (c) 1983-2001 Kevin Rosenberg ** -** $Id: ctsim.cpp,v 1.45 2001/01/26 23:23:00 kevin Exp $ +** $Id: ctsim.cpp,v 1.101 2001/03/30 19:17:32 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 @@ -29,13 +29,8 @@ #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 @@ -43,6 +38,9 @@ #include "wx/image.h" #include "wx/filesys.h" #include "wx/fs_zip.h" +#ifdef __WXMSW__ +#include "wx/msw/helpchm.h" +#endif #if !wxUSE_DOC_VIEW_ARCHITECTURE #error You must set wxUSE_DOC_VIEW_ARCHITECTURE to 1 in setup.h! @@ -50,11 +48,13 @@ #include "ct.h" +#include "ctndicom.h" #include "ctsim.h" -#include "ctsim-map.h" #include "docs.h" #include "views.h" #include "dialogs.h" +#include "tips.h" +#include "backgroundmgr.h" #if defined(HAVE_CONFIG_H) #include "config.h" @@ -70,19 +70,22 @@ #endif #endif -static const char* rcsindent = "$Id: ctsim.cpp,v 1.45 2001/01/26 23:23:00 kevin Exp $"; +static const char* rcsindent = "$Id: ctsim.cpp,v 1.101 2001/03/30 19:17:32 kevin Exp $"; struct option CTSimApp::ctsimOptions[] = { {"help", 0, 0, O_HELP}, {"version", 0, 0, O_VERSION}, + {"print", 0, 0, O_PRINT}, {0, 0, 0, 0} }; IMPLEMENT_APP(CTSimApp) CTSimApp::CTSimApp() -: m_docManager(NULL), m_pFrame(NULL), m_pLog(0) +: m_bAdvancedOptions(false), m_bSetModifyNewDocs(true), m_bVerboseLogging(false), m_bShowStartupTips(true), +m_iCurrentTip(0), m_bUseBackgroundTasks(false), +m_docManager(NULL), m_pFrame(NULL), m_pConfig(0), m_pLog(0), m_pLogDoc(0) { theApp = this; } @@ -101,11 +104,11 @@ CTSimApp::OnInit() #ifdef HAVE_SETPRIORITY setpriority (PRIO_PROCESS, 0, 15); // set to low scheduling priority #endif - - m_pConfig = new wxConfig("ctsim"); - wxConfigBase::Set(m_pConfig); - + + openConfig(); + g_bRunningWXWindows = true; + bool bPrintFiles = false; // process options while (1) { int c = getopt_long (argc, argv, "", ctsimOptions, NULL); @@ -125,6 +128,9 @@ CTSimApp::OnInit() case '?': usage (argv[0]); exit (0); + case O_PRINT: + bPrintFiles = true; + break; default: usage (argv[0]); exit (1); @@ -138,6 +144,9 @@ CTSimApp::OnInit() 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_GLCANVAS + m_pDocTemplGraph3d = new wxDocTemplate (m_docManager, "Graph3dFile", "*.g3d", "", "g3d", "Graph3dFile", "Graph3dView", CLASSINFO(Graph3dFileDocument), CLASSINFO(Graph3dFileView), wxTEMPLATE_INVISIBLE); +#endif #if wxUSE_GIF wxImage::AddHandler(new wxGIFHandler); // Required for images in the online documentation @@ -150,48 +159,92 @@ CTSimApp::OnInit() // 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(xDisplay * .75, yDisplay * .755), wxDEFAULT_FRAME_STYLE); + 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_WINHELP - if (! m_pFrame->getWinHelpController().Initialize("ctsim")) - ::wxMessageBox ("Cannot initialize the help system", "Error"); -#endif - if (! m_pFrame->getHtmlHelpController().Initialize(::wxGetCwd() + "/ctsim")) - ::wxMessageBox ("Cannot initialize the help system", "Error"); - + #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"); + m_pLogDoc = newTextDoc(); + if (m_pLogDoc) { + m_pLog = m_pLogDoc->getTextCtrl(); + m_pLogDoc->SetDocumentName("Log.txt"); + m_pLogDoc->SetFilename("Log.txt"); + m_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); + int yLogSize = ySize / 4; + m_pLogDoc->getView()->getFrame()->SetSize (0, ySize - yLogSize, xSize, yLogSize); + m_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)); + + wxString helpDir; + if (! m_pConfig->Read("HelpDir", &helpDir)) + helpDir = ::wxGetCwd(); +#ifdef CTSIM_WINHELP + if (! m_pFrame->getWinHelpController().Initialize(helpDir + "/ctsim")) + *m_pLog << "Cannot initialize the Windows Help system" << "\n"; +#else + if (! m_pFrame->getHtmlHelpController().Initialize(helpDir + "/ctsim") && + ! m_pFrame->getHtmlHelpController().Initialize("/usr/local/man/ctsim")) + *m_pLog << "Cannot initialize the HTML Help system" << "\n"; + else { + if (::wxDirExists ("/tmp")) + m_pFrame->getHtmlHelpController().SetTempDir(_T("/tmp")); + m_pFrame->getHtmlHelpController().UseConfig (m_pConfig); + } +#endif + + for (int i = optind + 1; i <= argc; i++) { + wxString filename = argv [i - 1]; + wxDocument* pNewDoc = m_docManager->CreateDocument (filename, wxDOC_SILENT); + if (bPrintFiles) { + wxView* pNewView = pNewDoc->GetFirstView(); + wxPrintout *printout = pNewView->OnCreatePrintout(); + if (printout) { + wxPrinter printer; + printer.Print(pNewView->GetFrame(), printout, TRUE); + delete printout; + } + wxCommandEvent nullEvent; + nullEvent.SetId (wxID_CLOSE); + m_docManager->OnFileClose (nullEvent); + } + } + if (bPrintFiles) { + wxCommandEvent closeEvent; + closeEvent.SetInt (MAINMENU_FILE_EXIT); + m_pFrame->AddPendingEvent(closeEvent); + } + + if (getStartupTips()) + ShowTips(); + +#ifdef HAVE_WXTHREADS + m_pBackgroundMgr = new BackgroundManager; +#endif return true; } +void +CTSimApp::ShowTips() +{ + CTSimTipProvider tipProvider (m_iCurrentTip); + setStartupTips (::wxShowTip (m_pFrame, &tipProvider, getStartupTips())); + m_iCurrentTip = tipProvider.GetCurrentTip(); +} + #include "./ctsim.xpm" void @@ -216,12 +269,58 @@ CTSimApp::usage(const char* program) int CTSimApp::OnExit() { + closeConfig(); + #ifdef HAVE_DMALLOC dmalloc_shutdown(); #endif return 0; } +void +CTSimApp::openConfig() +{ +#ifdef MSVC + m_pConfig = new wxConfig("ctsim", "Kevin Rosenberg", "", "", wxCONFIG_USE_LOCAL_FILE); +#else + m_pConfig = new wxConfig("ctsim", "Kevin Rosenberg", ".ctsim", "", wxCONFIG_USE_LOCAL_FILE); +#endif + + wxConfigBase::Set(m_pConfig); + m_pConfig->Read ("AdvancedOptions", &m_bAdvancedOptions); + m_pConfig->Read ("SetModifyNewDocs", &m_bSetModifyNewDocs); + m_pConfig->Read ("VerboseLogging", &m_bVerboseLogging); + m_pConfig->Read ("StartupTips", &m_bShowStartupTips); + m_pConfig->Read ("CurrentTip", &m_iCurrentTip); + m_pConfig->Read ("UseBackgroundTasks", &m_bUseBackgroundTasks); +#ifdef HAVE_FFTW + wxString strFftwWisdom; + m_pConfig->Read ("FftwWisdom", strFftwWisdom); + if (strFftwWisdom.size() > 0) + fftw_import_wisdom_from_string (strFftwWisdom.c_str()); +#endif +} + +void +CTSimApp::closeConfig() +{ + m_pConfig->Write ("AdvancedOptions", m_bAdvancedOptions); + m_pConfig->Write ("SetModifyNewDocs", m_bSetModifyNewDocs); + m_pConfig->Write ("VerboseLogging", m_bVerboseLogging); + m_pConfig->Write ("StartupTips", m_bShowStartupTips); + m_pConfig->Write ("CurrentTip", m_iCurrentTip); + m_pConfig->Write ("UseBackgroundTasks", m_bUseBackgroundTasks); +#ifdef HAVE_FFTW + const char* const pszWisdom = fftw_export_wisdom_to_string(); + wxString strFftwWisdom (pszWisdom); + fftw_free ((void*) pszWisdom); + m_pConfig->Write ("FftwWisdom", strFftwWisdom); +#endif + + delete m_pConfig; +} + + wxString CTSimApp::getUntitledFilename() { @@ -246,9 +345,27 @@ IMPLEMENT_CLASS(MainFrame, wxDocParentFrame) BEGIN_EVENT_TABLE(MainFrame, wxDocParentFrame) #endif +EVT_MENU(MAINMENU_FILE_PREFERENCES, MainFrame::OnPreferences) EVT_MENU(MAINMENU_HELP_ABOUT, MainFrame::OnAbout) EVT_MENU(MAINMENU_HELP_CONTENTS, MainFrame::OnHelpContents) -EVT_MENU(MAINMENU_HELP_TOPICS, MainFrame::OnHelpTopics) +EVT_MENU(MAINMENU_HELP_TIPS, MainFrame::OnHelpTips) +EVT_MENU(MAINMENU_IMPORT, MainFrame::OnImport) +EVT_MENU(IDH_QUICKSTART, MainFrame::OnHelpButton) +EVT_MENU(MAINMENU_LOG_EVENT, MainFrame::OnLogEvent) +EVT_MENU(NEW_IMAGEFILE_EVENT, MainFrame::OnNewImageFile) +EVT_MENU(NEW_PROJECTIONFILE_EVENT, MainFrame::OnNewProjectionFile) +EVT_BUTTON(IDH_DLG_RASTERIZE, MainFrame::OnHelpButton) +EVT_BUTTON(IDH_DLG_PROJECTIONS, MainFrame::OnHelpButton) +EVT_BUTTON(IDH_DLG_RECONSTRUCTION, MainFrame::OnHelpButton) +EVT_BUTTON(IDH_DLG_FILTER, MainFrame::OnHelpButton) +EVT_BUTTON(IDH_DLG_MINMAX, MainFrame::OnHelpButton) +EVT_BUTTON(IDH_DLG_EXPORT, MainFrame::OnHelpButton) +EVT_BUTTON(IDH_DLG_PHANTOM, MainFrame::OnHelpButton) +EVT_BUTTON(IDH_DLG_COMPARISON, MainFrame::OnHelpButton) +EVT_BUTTON(IDH_DLG_PREFERENCES, MainFrame::OnHelpButton) +EVT_BUTTON(IDH_DLG_POLAR, MainFrame::OnHelpButton) +EVT_BUTTON(IDH_DLG_AUTOSCALE, MainFrame::OnHelpButton) + EVT_SIZE(MainFrame::OnSize) #if defined(CTSIM_WINHELP) && (defined(DEBUG) || defined(_DEBUG)) @@ -291,6 +408,8 @@ MainFrame::MainFrame(wxDocManager *manager, wxFrame *frame, wxWindowID id, const : wxDocParentFrame(manager, frame, id, title, pos, size, type, "MainFrame") #endif { + m_bShuttingDown = false; + //// Make a menubar wxMenu *file_menu = new wxMenu; @@ -299,24 +418,27 @@ MainFrame::MainFrame(wxDocManager *manager, wxFrame *frame, wxWindowID id, const file_menu->Append(wxID_OPEN, "&Open...\tCtrl-O"); file_menu->AppendSeparator(); + file_menu->Append (MAINMENU_IMPORT, "&Import...\tCtrl-M"); + file_menu->Append (MAINMENU_FILE_PREFERENCES, "Prefere&nces..."); 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 - + wxMenu* help_menu = new wxMenu; - help_menu->Append(MAINMENU_HELP_CONTENTS, "&Contents\tF1"); - help_menu->Append(MAINMENU_HELP_TOPICS, "&Topics\tCtrl-T"); + help_menu->Append (MAINMENU_HELP_CONTENTS, "&Contents\tF1"); + help_menu->Append (MAINMENU_HELP_TIPS, "&Tips"); + help_menu->Append (IDH_QUICKSTART, "&Quick Start"); #if defined(CTSIM_WINHELP) && (defined(DEBUG) || defined(_DEBUG)) - help_menu->Append(MAINMENU_HELP_SECONDARY, "&Secondary Help"); + help_menu->Append (MAINMENU_HELP_SECONDARY, "&Secondary Help"); #endif - help_menu->Append(MAINMENU_HELP_ABOUT, "&About"); + help_menu->Append (MAINMENU_HELP_ABOUT, "&About"); wxMenuBar* menu_bar = new wxMenuBar; @@ -328,6 +450,7 @@ MainFrame::MainFrame(wxDocManager *manager, wxFrame *frame, wxWindowID id, const SetMenuBar(menu_bar); + #ifndef CTSIM_MDI int i; for (i = 0; i < MAX_WINDOW_MENUITEMS; i++) { @@ -336,7 +459,7 @@ MainFrame::MainFrame(wxDocManager *manager, wxFrame *frame, wxWindowID id, const m_pWindowMenu->Enable (MAINMENU_WINDOW_BASE+i, false); } #endif - + m_iDefaultPhantomID = Phantom::PHM_HERMAN; m_iDefaultFilterID = SignalFilter::FILTER_BANDLIMIT; m_iDefaultFilterDomainID = SignalFilter::DOMAIN_FREQUENCY; @@ -346,48 +469,60 @@ MainFrame::MainFrame(wxDocManager *manager, wxFrame *frame, wxWindowID id, const m_dDefaultFilterBandwidth = 1.; m_dDefaultFilterInputScale = 1.; m_dDefaultFilterOutputScale = 1.; + m_iDefaultImportFormat = ImageFile::IMPORT_FORMAT_PNG; 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[1].Set (wxACCEL_CTRL, static_cast('P'), MAINMENU_FILE_CREATE_PHANTOM); + accelEntries[2].Set (wxACCEL_CTRL, static_cast('F'), MAINMENU_FILE_CREATE_FILTER); + accelEntries[3].Set (wxACCEL_CTRL, static_cast('M'), MAINMENU_IMPORT); accelEntries[4].Set (wxACCEL_NORMAL, WXK_F1, MAINMENU_HELP_CONTENTS); +#ifndef CTSIM_MDI for (i = 0; i < 10; i++) - accelEntries[i+4].Set (wxACCEL_CTRL, static_cast('0'+i), MAINMENU_WINDOW_BASE+i); + accelEntries[i+5].Set (wxACCEL_CTRL, static_cast('0'+i), MAINMENU_WINDOW_BASE+i); wxAcceleratorTable accelTable (15, accelEntries); #else - wxAcceleratorTable accelTable (4, accelEntries); + wxAcceleratorTable accelTable (5, accelEntries); #endif - + SetAcceleratorTable (accelTable); } MainFrame::~MainFrame() { - if (theApp->getConfig()) - theApp->getDocManager()->FileHistorySave (*theApp->getConfig()); - delete theApp->getDocManager(); + m_bShuttingDown = true; // Currently used so that Log Window will close +#if 0 + // delete all non-modified documents + wxList& rListDocs = theApp->getDocManager()->GetDocuments(); + for (wxNode* pNode = rListDocs.GetFirst(); pNode != NULL; pNode = pNode->GetNext()) { + wxDocument* pDoc = dynamic_cast(pNode->GetData()); + if (pDoc && ! pDoc->IsModified()) { + theApp->getDocManager()->RemoveDocument(pDoc); + delete pDoc; + } + } +#endif + ::wxYield(); + if (theApp->getConfig()) + theApp->getDocManager()->FileHistorySave (*theApp->getConfig()); + ::wxYield(); + delete theApp->getDocManager(); + } void MainFrame::OnSize (wxSizeEvent& event) { - wxSize sizeClient = GetClientSize(); - wxSize sizeLog = sizeClient; - if (sizeClient.y < 100) { - sizeLog.y = 0; - sizeLog.x = 0; - } else { - sizeLog.x = sizeClient.x; - sizeLog.y = 100; +#ifdef CTSIM_MDI + if (theApp->getLogDoc()) { + int xSize, ySize; + GetClientSize(&xSize, &ySize); + int yLogSize = ySize / 4; + theApp->getLogDoc()->getView()->getFrame()->SetSize (0, ySize - yLogSize, xSize, yLogSize); + theApp->getLogDoc()->getView()->getFrame()->Show (true); } - 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(); +#endif + #if CTSIM_MDI wxDocMDIParentFrame::OnSize (event); #else @@ -402,7 +537,8 @@ MainFrame::OnCreatePhantom(wxCommandEvent& event) int dialogReturn = dialogPhantom.ShowModal(); if (dialogReturn == wxID_OK) { wxString selection (dialogPhantom.getPhantom()); - *theApp->getLog() << "Selected phantom " << selection.c_str() << "\n"; + if (theApp->getVerboseLogging()) + *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); @@ -433,7 +569,8 @@ MainFrame::OnCreateFilter (wxCommandEvent& WXUNUSED(event)) << ", inputScale=" << m_dDefaultFilterInputScale << ", outputScale=" << m_dDefaultFilterOutputScale; *theApp->getLog() << os.str().c_str() << "\n"; wxString filename = "untitled.if"; - ImageFileDocument* pFilterDoc = dynamic_cast(theApp->getDocManager()->CreateDocument ("untitled.if", wxDOC_SILENT)); + ImageFileDocument* pFilterDoc = theApp->newImageDoc(); + pFilterDoc->setBadFileOpen(); if (! pFilterDoc) { sys_error (ERR_SEVERE, "Unable to create filter image"); return; @@ -442,10 +579,12 @@ MainFrame::OnCreateFilter (wxCommandEvent& WXUNUSED(event)) 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()) + if (theApp->getAskDeleteNewDocs()) pFilterDoc->Modify (true); pFilterDoc->UpdateAllViews(); pFilterDoc->GetFirstView()->OnUpdate (NULL, NULL); + pFilterDoc->getView()->getFrame()->SetClientSize(m_iDefaultFilterXSize, m_iDefaultFilterYSize); + pFilterDoc->getView()->getFrame()->Show(true); } } @@ -467,14 +606,70 @@ CTSimApp::getCompatibleImages (const ImageFileDocument* pIFDoc, std::vector(event.GetClientData()); + + ImageFileDocument* pImageDoc = theApp->newImageDoc(); + if (! pImageDoc) { + sys_error (ERR_SEVERE, "Unable to create image file"); + return; + } + pImageDoc->setImageFile (pImageFile); + pImageDoc->UpdateAllViews (NULL); + if (ImageFileView* imageView = pImageDoc->getView()) { + imageView->OnUpdate (imageView, NULL); + imageView->getFrame()->SetFocus(); + imageView->getFrame()->Show(true); + } + if (theApp->getAskDeleteNewDocs()) + pImageDoc->Modify (true); + +} + +void +MainFrame::OnNewProjectionFile (wxCommandEvent& event) +{ + Projections* pProjections = reinterpret_cast(event.GetClientData()); + ProjectionFileDocument* pProjDoc = theApp->newProjectionDoc(); + if (! pProjDoc) { + sys_error (ERR_SEVERE, "Unable to create projection file"); + return; + } + pProjDoc->setProjections (pProjections); + pProjDoc->UpdateAllViews (NULL); + if (ProjectionFileView* projView = pProjDoc->getView()) { + projView->OnUpdate (projView, NULL); + projView->getFrame()->SetFocus(); + projView->getFrame()->Show(true); + } + + if (theApp->getAskDeleteNewDocs()) + pProjDoc->Modify (true); +} + +void +MainFrame::OnLogEvent (wxCommandEvent& event) +{ + *theApp->getLog() << event.GetString(); +} + +void +MainFrame::OnHelpTips (wxCommandEvent& event) +{ + theApp->ShowTips(); +} + void -MainFrame::OnHelpTopics (wxCommandEvent& event) +MainFrame::OnHelpContents (wxCommandEvent& event) { showHelp (event.GetId()); } void -MainFrame::OnHelpContents (wxCommandEvent& event) +MainFrame::OnHelpButton (wxCommandEvent& event) { showHelp (event.GetId()); } @@ -483,21 +678,15 @@ MainFrame::OnHelpContents (wxCommandEvent& event) void MainFrame::OnHelpSecondary (wxCommandEvent& event) { - m_htmlHelp.DisplayContents(); + 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 (); @@ -505,18 +694,15 @@ MainFrame::showHelp (int commandID) m_htmlHelp.DisplayContents (); #endif break; - - case MAINMENU_HELP_TOPICS: + + + default: #ifdef CTSIM_WINHELP - m_winHelp.DisplaySection (introduction); + m_winHelp.DisplaySection (commandID); #else - m_htmlHelp.DisplayIndex(); + m_htmlHelp.Display (commandID); #endif break; - - default: - *theApp->getLog() << "Unknown help command # " << commandID << "\n"; - break; } } @@ -529,6 +715,7 @@ MainFrame::OnExit (wxCommandEvent& WXUNUSED(event) ) void MainFrame::OnUpdateUI (wxUpdateUIEvent& rEvent) { +#ifndef CTSIM_MDI int iPos = 0; wxList& rListDocs = theApp->getDocManager()->GetDocuments(); wxNode* pNode = rListDocs.GetFirst(); @@ -550,16 +737,16 @@ MainFrame::OnUpdateUI (wxUpdateUIEvent& rEvent) static_cast(m_apWindowMenuItems[i])->SetName (wxString("[EMPTY]")); m_apWindowMenuData[i] = NULL; } - +#endif } #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); + wxString fileName (theApp->getDocManager()->GetHistoryFile(event.GetId() - wxID_FILE1)); + if (fileName != "") + theApp->getDocManager()->CreateDocument(fileName, wxDOC_SILENT); } #endif @@ -734,14 +921,138 @@ BitmapDialog::~BitmapDialog() {} +void +MainFrame::OnPreferences (wxCommandEvent& WXUNUSED(event) ) +{ + DialogPreferences dlg (this, "CTSim Preferences", theApp->getAdvancedOptions(), + theApp->getAskDeleteNewDocs(), theApp->getVerboseLogging(), theApp->getStartupTips(), + theApp->getUseBackgroundTasks()); + if (dlg.ShowModal() == wxID_OK) { + theApp->setAdvancedOptions (dlg.getAdvancedOptions()); + theApp->setAskDeleteNewDocs (dlg.getAskDeleteNewDocs()); + theApp->setVerboseLogging (dlg.getVerboseLogging()); + theApp->setStartupTips (dlg.getStartupTips()); + theApp->setUseBackgroundTasks (dlg.getUseBackgroundTasks()); + } +} + +void +MainFrame::OnImport (wxCommandEvent& WXUNUSED(event) ) +{ + DialogImportParameters dialogImport (this, m_iDefaultImportFormat); + if (dialogImport.ShowModal() != wxID_OK) + return; + + wxString strFormatName (dialogImport.getFormatName ()); + m_iDefaultImportFormat = ImageFile::convertImportFormatNameToID (strFormatName.c_str()); + + wxString strExt; + wxString strWildcard; + if (m_iDefaultImportFormat == ImageFile::IMPORT_FORMAT_PPM) { + strExt = ".ppm"; + strWildcard = "PPM Files (*.ppm)|*.ppm|PGM Files (*.pgm)|*.pgm"; + } +#ifdef HAVE_PNG + else if (m_iDefaultImportFormat == ImageFile::IMPORT_FORMAT_PNG) { + strExt = ".png"; + strWildcard = "PNG Files (*.png)|*.png"; + } +#endif +#ifdef HAVE_CTN_DICOM + else if (m_iDefaultImportFormat == ImageFile::IMPORT_FORMAT_DICOM) { + strExt = "*.*"; + strWildcard = "Dicom Files (*.*)|*.*"; + } +#endif + else { + return; + } + + wxString strFilename = wxFileSelector (wxString("Import Filename"), wxString(""), + wxString(""), strExt, strWildcard, wxHIDE_READONLY | wxOPEN); + if (! strFilename.IsEmpty()) { + if (m_iDefaultImportFormat == ImageFile::IMPORT_FORMAT_PPM || m_iDefaultImportFormat == ImageFile::IMPORT_FORMAT_PNG) { + ImageFile* pIF = new ImageFile; + if (pIF->importImage (strFormatName.c_str(), strFilename.c_str())) { + ImageFileDocument* pIFDoc = theApp->newImageDoc(); + pIFDoc->setImageFile(pIF); + pIFDoc->getView()->getFrame()->Show(true); + std::ostringstream os; + os << "Import file " << strFilename.c_str() << " (type " << strFormatName.c_str() << ")"; + pIF->labelAdd (os.str().c_str()); + if (theApp->getAskDeleteNewDocs()) + pIFDoc->Modify (true); + pIFDoc->UpdateAllViews(); + pIFDoc->GetFirstView()->OnUpdate (NULL, NULL); + pIFDoc->getView()->getFrame()->Show(true); + } else + delete pIF; + } +#ifdef HAVE_CTN_DICOM + else if (m_iDefaultImportFormat == ImageFile::IMPORT_FORMAT_DICOM) { + DicomImporter dicomImport (strFilename.c_str()); + if (dicomImport.fail()) { + ::wxMessageBox (dicomImport.failMessage().c_str(), "Import Error"); + } else if (dicomImport.testImage()) { + ImageFileDocument* pIFDoc = theApp->newImageDoc(); + ImageFile* pIF = dicomImport.getImageFile(); + pIFDoc->setImageFile (pIF); + pIFDoc->getView()->getFrame()->Show(true); + std::ostringstream os; + os << "Import file " << strFilename.c_str() << " (type " << strFormatName.c_str() << ")"; + pIF->labelAdd (os.str().c_str()); + if (theApp->getAskDeleteNewDocs()) + pIFDoc->Modify (true); + pIFDoc->UpdateAllViews(); + pIFDoc->GetFirstView()->OnUpdate (NULL, NULL); + pIFDoc->getView()->getFrame()->Show(true); + } else if (dicomImport.testProjections()) { + ProjectionFileDocument* pProjDoc = theApp->newProjectionDoc(); + Projections* pProj = dicomImport.getProjections(); + pProjDoc->setProjections (pProj); + pProjDoc->getView()->getFrame()->Show(true); + std::ostringstream os; + os << "Import projection file " << strFilename.c_str() << " (type " << strFormatName.c_str() << ")"; + pProj->setRemark (os.str().c_str()); + if (theApp->getAskDeleteNewDocs()) + pProjDoc->Modify (true); + pProjDoc->UpdateAllViews(); + pProjDoc->GetFirstView()->OnUpdate (NULL, NULL); + pProjDoc->getView()->getFrame()->Show(true); + } else + ::wxMessageBox ("Unrecognized DICOM file contents", "Import Error"); + } +#endif + else + sys_error (ERR_WARNING, "Unknown import format type"); + } +} + #include "./splash.xpm" void MainFrame::OnAbout(wxCommandEvent& WXUNUSED(event) ) { + long lFreeMem = ::wxGetFreeMemory() / (1024L * 1024L); + wxString strOSDesc = ::wxGetOsDescription(); + *theApp->getLog() << "Operating System: " << strOSDesc; + if (lFreeMem > 0) + *theApp->getLog() << ", Free Memory: " << lFreeMem << " MB"; + *theApp->getLog() << ", wxWindows: " << wxVERSION_STRING; +#ifdef __TIMESTAMP__ + *theApp->getLog() << ", Build Date: " << __TIMESTAMP__; +#endif +#if defined(DEBUG) + *theApp->getLog() << ", CTSim Debug version"; +#else + *theApp->getLog() << ", CTSim Release version"; +#endif + + *theApp->getLog() << "\n"; + wxBitmap bmp (splash); if (bmp.Ok()) { BitmapDialog dlg (&bmp, "About CTSim"); - dlg.Show(true); + dlg.ShowModal(); } else { wxString msg = "CTSim\nThe Open Source Computed Tomography Simulator\n"; #ifdef CTSIMVERSION @@ -754,6 +1065,7 @@ MainFrame::OnAbout(wxCommandEvent& WXUNUSED(event) ) msg += "Author: Kevin Rosenberg \nUsage: ctsim [files-to-open..] [--help]"; wxMessageBox(msg, "About CTSim", wxOK | wxICON_INFORMATION, this); + *theApp->getLog() << msg << "\n"; } } @@ -761,63 +1073,65 @@ MainFrame::OnAbout(wxCommandEvent& WXUNUSED(event) ) ProjectionFileDocument* CTSimApp::newProjectionDoc() { - wxString strFilename (getUntitledFilename()); - strFilename += ".pj"; - - ProjectionFileDocument* newDoc = dynamic_cast(m_pDocTemplProjection->CreateDocument (strFilename)); + 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); + if (pFrame) { + pFrame->SetSize (0,0); + pFrame->Show (false); + } } + newDoc->SetDocumentName (m_pDocTemplProjection->GetDocumentName()); + newDoc->SetDocumentTemplate (m_pDocTemplProjection); newDoc->OnNewDocument(); -// newDoc->SetFilename(strFilename, true); } - + return newDoc; } ImageFileDocument* CTSimApp::newImageDoc() { - wxString strFilename (getUntitledFilename()); - strFilename += ".pj"; - - ImageFileDocument* newDoc = dynamic_cast(m_pDocTemplImage->CreateDocument (strFilename)); + 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); + if (pFrame) { + pFrame->SetSize (0,0); + pFrame->Show (false); + } } + newDoc->SetDocumentName (m_pDocTemplImage->GetDocumentName()); + newDoc->SetDocumentTemplate (m_pDocTemplImage); newDoc->OnNewDocument(); -// newDoc->SetFilename(strFilename, true); } - + return newDoc; } PlotFileDocument* CTSimApp::newPlotDoc() { - wxString strFilename (getUntitledFilename()); - strFilename += ".plt"; - - PlotFileDocument* newDoc = dynamic_cast(m_pDocTemplPlot->CreateDocument (strFilename)); + PlotFileDocument* newDoc = dynamic_cast(m_pDocTemplPlot->CreateDocument ("")); if (newDoc) { PlotFileView* pView = newDoc->getView(); if (pView) { wxFrame* pFrame = pView->getFrame(); - if (pFrame) - pFrame->SetSize(0,0); + if (pFrame) { + wxSize size; + m_pFrame->GetClientSize (&size.x, &size.y); + pFrame->SetSize (size.x / 2, size.y / 2); + pFrame->Show (false); + } } + newDoc->SetDocumentName (m_pDocTemplPlot->GetDocumentName()); + newDoc->SetDocumentTemplate (m_pDocTemplPlot); newDoc->OnNewDocument(); -// newDoc->SetFilename(strFilename, true); } - + return newDoc; } @@ -827,19 +1141,24 @@ CTSimApp::newTextDoc() { wxString strFilename (getUntitledFilename()); strFilename += ".txt"; - - TextFileDocument* newDoc = dynamic_cast(m_pDocTemplText->CreateDocument (strFilename)); + + TextFileDocument* newDoc = dynamic_cast(m_pDocTemplText->CreateDocument ("")); if (newDoc) { TextFileView* pView = newDoc->getView(); if (pView) { wxFrame* pFrame = pView->getFrame(); - if (pFrame) - pFrame->SetSize(0,0); + if (pFrame) { + wxSize size; + m_pFrame->GetClientSize (&size.x, &size.y);; + pFrame->SetSize (size.x / 2, size.y / 2); + pFrame->Show (false); + } } + newDoc->SetDocumentName (m_pDocTemplText->GetDocumentName()); + newDoc->SetDocumentTemplate (m_pDocTemplText); newDoc->OnNewDocument(); -// newDoc->SetFilename(strFilename, true); } - + return newDoc; } @@ -847,20 +1166,40 @@ CTSimApp::newTextDoc() PhantomFileDocument* CTSimApp::newPhantomDoc() { - wxString strFilename (getUntitledFilename()); - strFilename += ".phm"; - - PhantomFileDocument* newDoc = dynamic_cast(m_pDocTemplPhantom->CreateDocument (strFilename)); + 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); + pFrame->SetSize (0,0); } + newDoc->SetDocumentName (m_pDocTemplPhantom->GetDocumentName()); + newDoc->SetDocumentTemplate (m_pDocTemplPhantom); newDoc->OnNewDocument(); -// newDoc->SetFilename(strFilename, true); } + + return newDoc; +} +#if wxUSE_GLCANVAS + +Graph3dFileDocument* +CTSimApp::newGraph3dDoc() +{ + Graph3dFileDocument* newDoc = dynamic_cast(m_pDocTemplGraph3d->CreateDocument ("")); + if (newDoc) { + Graph3dFileView* pView = newDoc->getView(); + if (pView) { + wxFrame* pFrame = pView->getFrame(); + if (pFrame) + pFrame->SetSize (0,0); + } + newDoc->SetDocumentName (m_pDocTemplGraph3d->GetDocumentName()); + newDoc->SetDocumentTemplate (m_pDocTemplGraph3d); + newDoc->OnNewDocument(); + } + return newDoc; } +#endif