X-Git-Url: http://git.kpe.io/?p=ctsim.git;a=blobdiff_plain;f=src%2Fctsim.cpp;h=fe9586754b741a0fcaaf3da6e77db9b817f28b13;hp=32873df061766e66a6cfdaa188beca6478315486;hb=9f29c8b32c972db1178d6f8551d5cd57ceb67083;hpb=100160988c5bd211bdbc4c6d7340426d8c6408c8 diff --git a/src/ctsim.cpp b/src/ctsim.cpp index 32873df..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.37 2001/01/19 22:53:57 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 @@ -48,6 +48,7 @@ #error You must set wxUSE_DOC_VIEW_ARCHITECTURE to 1 in setup.h! #endif + #include "ct.h" #include "ctsim.h" #include "ctsim-map.h" @@ -69,7 +70,7 @@ #endif #endif -static const char* rcsindent = "$Id: ctsim.cpp,v 1.37 2001/01/19 22:53:57 kevin Exp $"; +static const char* rcsindent = "$Id: ctsim.cpp,v 1.54 2001/01/28 19:10:18 kevin Exp $"; struct option CTSimApp::ctsimOptions[] = { @@ -81,7 +82,7 @@ struct option CTSimApp::ctsimOptions[] = IMPLEMENT_APP(CTSimApp) CTSimApp::CTSimApp() -: m_docManager(NULL), m_pFrame(NULL) +: m_docManager(NULL), m_pFrame(NULL), m_pLog(0) { theApp = this; } @@ -100,7 +101,10 @@ 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); + g_bRunningWXWindows = true; // process options while (1) { @@ -127,12 +131,13 @@ CTSimApp::OnInit() } } - m_docManager = new wxDocManager; + m_docManager = new wxDocManager (wxDEFAULT_DOCMAN_FLAGS, true); - 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)); + 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 @@ -143,24 +148,49 @@ CTSimApp::OnInit() #endif // Create the main frame window - m_pFrame = new MainFrame(m_docManager, (wxFrame *) NULL, -1, "CTSim", wxPoint(0, 0), wxSize(500, 400), wxDEFAULT_FRAME_STYLE); + 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); - SetTopWindow (m_pFrame); + setIconForFrame (m_pFrame); m_pFrame->Centre(wxBOTH); - - m_pFrame->Show(true); - + 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); } - setIconForFrame (m_pFrame); - - if (! m_pFrame->getHelpController().Initialize("ctsim")) - ::wxMessageBox ("Cannot initialize the help system", "Error"); - - + 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)); + +#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"; + return true; } @@ -188,7 +218,6 @@ CTSimApp::usage(const char* program) int CTSimApp::OnExit() { - delete m_docManager; #ifdef HAVE_DMALLOC dmalloc_shutdown(); #endif @@ -222,9 +251,15 @@ BEGIN_EVENT_TABLE(MainFrame, wxDocParentFrame) 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) @@ -252,17 +287,12 @@ 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) -: wxMDIParentFrame(NULL, id, title, pos, size, type), m_pLog(NULL) +: 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; @@ -274,30 +304,41 @@ MainFrame::MainFrame(wxDocManager *manager, wxFrame *frame, wxWindowID id, const 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"); +#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); - for (int i = 0; i < MAX_WINDOW_MENUITEMS; i++) { - m_apWindowMenuItems[i] = new wxMenuItem (m_pWindowMenu, MAINMENU_WINDOW_BASE+i, wxString("")); +#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 + m_iDefaultPhantomID = Phantom::PHM_HERMAN; m_iDefaultFilterID = SignalFilter::FILTER_BANDLIMIT; m_iDefaultFilterDomainID = SignalFilter::DOMAIN_FREQUENCY; @@ -308,18 +349,61 @@ MainFrame::MainFrame(wxDocManager *manager, wxFrame *frame, wxWindowID id, const m_dDefaultFilterInputScale = 1.; m_dDefaultFilterOutputScale = 1.; - wxAcceleratorEntry accelEntries[14]; + 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 (16, accelEntries); + wxAcceleratorTable accelTable (15, accelEntries); +#else + wxAcceleratorTable accelTable (4, accelEntries); +#endif + SetAcceleratorTable (accelTable); } +MainFrame::~MainFrame() +{ + if (theApp->getConfig()) + theApp->getDocManager()->FileHistorySave (*theApp->getConfig()); + delete theApp->getDocManager(); + +} + +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& event) { @@ -330,7 +414,7 @@ MainFrame::OnCreatePhantom(wxCommandEvent& event) *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); + theApp->getDocManager()->CreateDocument (filename, wxDOC_SILENT); } } @@ -358,7 +442,7 @@ 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(); if (! pFilterDoc) { sys_error (ERR_SEVERE, "Unable to create filter image"); return; @@ -371,6 +455,8 @@ MainFrame::OnCreateFilter (wxCommandEvent& WXUNUSED(event)) pFilterDoc->Modify (true); pFilterDoc->UpdateAllViews(); pFilterDoc->GetFirstView()->OnUpdate (NULL, NULL); + pFilterDoc->getView()->getFrame()->SetClientSize(m_iDefaultFilterXSize, m_iDefaultFilterYSize); + pFilterDoc->getView()->getFrame()->Show(true); } } @@ -404,21 +490,43 @@ 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) { - m_help.LoadFile(); +#ifdef CTSIM_WINHELP + m_winHelp.LoadFile(); +#else + m_htmlHelp.LoadFile(); +#endif switch (commandID) { + case MAINMENU_HELP_CONTENTS: - m_help.DisplayContents (); +#ifdef CTSIM_WINHELP + m_winHelp.DisplayContents (); +#else + m_htmlHelp.DisplayContents (); +#endif break; + case MAINMENU_HELP_TOPICS: - m_help.DisplaySection (introduction); +#ifdef CTSIM_WINHELP + m_winHelp.DisplaySection (introduction); +#else + m_htmlHelp.DisplayIndex(); +#endif break; - + default: - *getLog() << "Unknown help command # " << commandID << "\n"; + *theApp->getLog() << "Unknown help command # " << commandID << "\n"; break; } } @@ -450,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) { @@ -600,12 +718,12 @@ private: BitmapControl* m_pBitmapCtrl; public: - BitmapDialog (wxBitmap* pBitmap); + BitmapDialog (wxBitmap* pBitmap, char const* pszTitle); virtual ~BitmapDialog(); }; -BitmapDialog::BitmapDialog (wxBitmap* pBitmap) -: wxDialog(theApp->getMainFrame(), -1, wxString("About"), wxDefaultPosition, wxDefaultSize, wxDIALOG_MODAL) +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); @@ -626,17 +744,14 @@ BitmapDialog::BitmapDialog (wxBitmap* pBitmap) BitmapDialog::~BitmapDialog() {} -#include "./splash.xpm" +#include "./splash.xpm" void MainFrame::OnAbout(wxCommandEvent& WXUNUSED(event) ) { - // - // wxImage image; - // if (wxFile::image.LoadFile ("/splash.png")) { wxBitmap bmp (splash); if (bmp.Ok()) { - BitmapDialog dlg (&bmp); + BitmapDialog dlg (&bmp, "About CTSim"); dlg.Show(true); } else { wxString msg = "CTSim\nThe Open Source Computed Tomography Simulator\n"; @@ -653,3 +768,104 @@ MainFrame::OnAbout(wxCommandEvent& WXUNUSED(event) ) } } + +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; +}