Version 5.1.3
[ctsim.git] / src / ctsim.cpp
index 48dd5360a9646e3807fef7ff3cd47b0c1f569bbb..9befa24c35cbc67c036c3e0d36df8b51d6adf6a5 100644 (file)
@@ -7,9 +7,7 @@
 **   Date Started:  July 2000
 **
 **  This is part of the CTSim program
-**  Copyright (c) 1983-2001 Kevin Rosenberg
-**
-**  $Id$
+**  Copyright (c) 1983-2009 Kevin Rosenberg
 **
 **  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
@@ -38,6 +36,7 @@
 #include "wx/image.h"
 #include "wx/filesys.h"
 #include "wx/fs_zip.h"
+#include "wx/cmdline.h"
 #ifdef __WXMSW__
 #include "wx/msw/helpchm.h"
 #endif
 #endif
 #endif
 
-static const char* rcsindent = "$Id$";
-
-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_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)
+  m_iCurrentTip(0), m_bUseBackgroundTasks(false),
+  m_docManager(NULL), m_pFrame(NULL), m_pConfig(0), m_pLog(0), m_pLogDoc(0),
+  m_bPrintCmdLineImages(false), m_bCmdLineVerboseFlag(false)
 {
   theApp = this;
 }
@@ -98,10 +89,57 @@ m_docManager(NULL), m_pFrame(NULL), m_pConfig(0), m_pLog(0), m_pLogDoc(0)
 #include <sys/resource.h>
 #endif
 
+
+void CTSimApp::OnInitCmdLine(wxCmdLineParser& parser)
+{
+  static const wxCmdLineEntryDesc cmdLineDesc[] = {
+    { wxCMD_LINE_SWITCH, _T("l"), _T("verbose"), _T("verbose logging") },
+    { wxCMD_LINE_SWITCH, _T("v"), _T("version"), _T("print version") },
+    { wxCMD_LINE_SWITCH, _T("p"), _T("print"), _T("print images from command line"),
+      wxCMD_LINE_VAL_NONE,
+      wxCMD_LINE_PARAM_OPTIONAL },
+    { wxCMD_LINE_SWITCH, _T("h"), _T("help"), _T("print this help message"),
+      wxCMD_LINE_VAL_NONE,
+      wxCMD_LINE_PARAM_OPTIONAL | wxCMD_LINE_OPTION_HELP },
+    { wxCMD_LINE_PARAM, NULL, NULL, _T("input file"),
+      wxCMD_LINE_VAL_STRING,
+      wxCMD_LINE_PARAM_OPTIONAL | wxCMD_LINE_PARAM_MULTIPLE },
+    { wxCMD_LINE_NONE }
+  };
+
+  parser.SetDesc(cmdLineDesc);
+}
+
+bool CTSimApp::OnCmdLineParsed(wxCmdLineParser& parser)
+{
+  if (wxApp::OnCmdLineParsed(parser) == false)
+    return false;
+
+  if (parser.Found(_T("version"))) {
+#ifdef VERSION
+      std::cout << "Version: " << VERSION << std::endl;
+#elif defined(CTSIMVERSION)
+      std::cout << "Version: " << CTSIMVERSION << std::endl;
+#else
+      std::cout << "Version: " << "Unknown" << std::endl;
+#endif
+      return false;
+  }
+  if (parser.Found(_T("print"))) {
+    m_bPrintCmdLineImages = true;
+  }
+  if (parser.Found(_T("verbose"))) {
+    m_bCmdLineVerboseFlag = true;
+  }
+
+  return true;
+}
+
 bool
 CTSimApp::OnInit()
 {
-  wxApp::OnInit();
+  if (! wxApp::OnInit())
+    return false;
 
 #ifdef HAVE_SETPRIORITY
   setpriority (PRIO_PROCESS, 0, 15);  // set to low scheduling priority
@@ -110,50 +148,6 @@ CTSimApp::OnInit()
   openConfig();
 
   g_bRunningWXWindows = true;
-  bool bPrintFiles = false;
-  // process options
-  while (1) {
-#ifdef __WXMAC__
-    int c = -1;
-#else
-    char** cargv = new char* [argc];
-    for (int i = 0; i < argc; i++) {
-      const char* p = wxConvUTF8.cWX2MB(argv[i]);
-      cargv[i] = new char [strlen(p)+1];
-      strcpy(cargv[i], p);
-    }
-    int c = getopt_long (argc, cargv, "", ctsimOptions, NULL);
-    for (int i = 0; i < argc; i++) {
-      delete cargv[i];
-    }
-    delete cargv;
-    
-#endif
-    if (c == -1)
-      break;
-
-    switch (c) {
-    case O_VERSION:
-      std::cout << rcsindent << std::endl;
-#ifdef VERSION
-      std::cout << "Version: " << VERSION << std::endl;
-#elif defined(CTSIMVERSION)
-      std::cout << "Version: " << CTSIMVERSION << std::endl;
-#endif
-      exit(0);
-    case O_HELP:
-    case '?':
-      usage (wxConvCurrent->cWX2MB(argv[0]));
-      exit (0);
-    case O_PRINT:
-      bPrintFiles = true;
-      break;
-    default:
-      usage (wxConvCurrent->cWX2MB(argv[0]));
-      exit (1);
-    }
-  }
-
   m_docManager = new wxDocManager (wxDEFAULT_DOCMAN_FLAGS, true);
 
   m_pDocTemplImage = new wxDocTemplate (m_docManager, _T("ImageFile"), _T("*.if"), _T(""), _T("if"), _T("ImageFile"), _T("ImageView"), CLASSINFO(ImageFileDocument), CLASSINFO(ImageFileView));
@@ -179,13 +173,13 @@ CTSimApp::OnInit()
   int xDisplay, yDisplay;
   ::wxDisplaySize (&xDisplay, &yDisplay);
 
-  m_pFrame = new MainFrame(m_docManager, (wxFrame *) NULL, -1, _T("CTSim"), wxPoint(0, 0),
 #ifdef CTSIM_MDI
-    wxSize(nearest<int>(xDisplay * .75), nearest<int>(yDisplay * .75)),
+  wxSize frameSize(nearest<int>(xDisplay * .75), nearest<int>(yDisplay * .75));
 #else
-    wxSize(nearest<int>(xDisplay * .6), nearest<int>(yDisplay * .4)),
+  wxSize frameSize(nearest<int>(xDisplay * .6), nearest<int>(yDisplay * .4));
 #endif
-    wxDEFAULT_FRAME_STYLE);
+
+  m_pFrame = new MainFrame(m_docManager, (wxFrame *) NULL, -1, _T("CTSim"), wxPoint(0, 0), frameSize, wxDEFAULT_FRAME_STYLE);
 
   setIconForFrame (m_pFrame);
   m_pFrame->Centre(wxBOTH);
@@ -199,9 +193,9 @@ CTSimApp::OnInit()
   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");
+    m_pLogDoc->SetDocumentName(_T("Log.txt"));
+    m_pLogDoc->SetFilename(_T("Log.txt"));
+    m_pLogDoc->getView()->getFrame()->SetTitle(_T("Log"));
     int xSize, ySize;
     m_pFrame->GetClientSize(&xSize, &ySize);
     int yLogSize = ySize / 4;
@@ -209,7 +203,7 @@ CTSimApp::OnInit()
     m_pLogDoc->getView()->getFrame()->Show (true);
   } else
 #else
-    m_pLog = new wxTextCtrl (m_pFrame, -1, _T("Log Window\n"), wxPoint(0, 0), wxSize(0,0), wxTE_MULTILINE | wxTE_READONLY);
+    m_pLog = new wxTextCtrl (m_pFrame, -1, _T("Log Window\n"), wxPoint(0, 0), frameSize, wxTE_MULTILINE | wxTE_READONLY);
 #endif
   wxLog::SetActiveTarget (new wxLogTextCtrl(m_pLog));
 
@@ -240,7 +234,7 @@ CTSimApp::OnInit()
   for (int i = optind + 1; i <= argc; i++) {
     wxString filename = argv [i - 1];
     wxDocument* pNewDoc = m_docManager->CreateDocument (filename, wxDOC_SILENT);
-    if (bPrintFiles) {
+    if (m_bPrintCmdLineImages) {
       wxView* pNewView = pNewDoc->GetFirstView();
       wxPrintout *printout = pNewView->OnCreatePrintout();
       if (printout) {
@@ -253,7 +247,7 @@ CTSimApp::OnInit()
       m_docManager->OnFileClose (nullEvent);
     }
   }
-  if (bPrintFiles) {
+  if (m_bPrintCmdLineImages) {
     wxCommandEvent closeEvent;
     closeEvent.SetInt (MAINMENU_FILE_EXIT);
     m_pFrame->AddPendingEvent(closeEvent);
@@ -353,18 +347,6 @@ CTSimApp::closeConfig()
 }
 
 
-wxString
-CTSimApp::getUntitledFilename()
-{
-  static int untitledNumber = 1;
-
-  wxString filename (_T("Untitled"));
-  filename << untitledNumber++;
-
-  return (filename);
-}
-
-
 // Top-level window for CTSim
 
 #if CTSIM_MDI
@@ -434,7 +416,7 @@ 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")
+: wxDocMDIParentFrame(manager, NULL, id, title, pos, size, type, _T("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, _T("MainFrame"))
@@ -603,7 +585,6 @@ MainFrame::OnCreateFilter (wxCommandEvent& WXUNUSED(event))
       m_dDefaultFilterBandwidth
        << _T(", inputScale=") << m_dDefaultFilterInputScale << _T(", outputScale=") << m_dDefaultFilterOutputScale;
     *theApp->getLog() << os << _T("\n");
-    wxString filename = _T("untitled.if");
     ImageFileDocument* pFilterDoc = theApp->newImageDoc();
     pFilterDoc->setBadFileOpen();
     if (! pFilterDoc) {
@@ -979,13 +960,8 @@ MainFrame::OnImport (wxCommandEvent& WXUNUSED(event) )
     return;
   }
 
-#if WXWIN_COMPATIBILITY_2_4
-  wxString strFilename = wxFileSelector (wxString(wxConvUTF8.cMB2WX("Import Filename")), wxString(wxConvUTF8.cMB2WX("")),
-                                         wxString(wxConvUTF8.cMB2WX("")), strExt, strWildcard, wxHIDE_READONLY | wxOPEN);
-#else
   wxString strFilename = wxFileSelector (wxString(wxConvUTF8.cMB2WX("Import Filename")), wxString(wxConvUTF8.cMB2WX("")),
                                          wxString(wxConvUTF8.cMB2WX("")), strExt, strWildcard, wxOPEN);
-#endif
 
   if (! strFilename.IsEmpty()) {
     if (m_iDefaultImportFormat == ImageFile::IMPORT_FORMAT_PPM || m_iDefaultImportFormat == ImageFile::IMPORT_FORMAT_PNG) {
@@ -1087,28 +1063,40 @@ MainFrame::OnAbout(wxCommandEvent& WXUNUSED(event) )
 
 // Create new documents
 
-ProjectionFileDocument*
-CTSimApp::newProjectionDoc()
-{
-  ProjectionFileDocument* newDoc = dynamic_cast<ProjectionFileDocument*>(m_pDocTemplProjection->CreateDocument (_T("")));
+wxDocument* 
+CTSimApp::newDocumentHelper (wxDocTemplate* tmpl) {
+  wxDocument* newDoc = tmpl->CreateDocument (_T(""));
   if (newDoc) {
-    newDoc->SetDocumentName (m_pDocTemplProjection->GetDocumentName());
-    newDoc->SetDocumentTemplate (m_pDocTemplProjection);
+    newDoc->SetDocumentTemplate (tmpl);
     newDoc->OnNewDocument();
+    wxString fname = newDoc->GetFilename();
+    fname += _T(".");
+    fname += tmpl->GetDefaultExtension();
+    newDoc->SetDocumentName(fname);
+    newDoc->SetTitle(fname);
+    newDoc->SetFilename(fname, true);
   }
 
   return newDoc;
 }
 
+ProjectionFileDocument*
+CTSimApp::newProjectionDoc()
+{
+  ProjectionFileDocument* newDoc = dynamic_cast<ProjectionFileDocument*>
+    (newDocumentHelper(m_pDocTemplProjection));
+  if (newDoc)
+    newDoc->getView()->getFrame()->SetTitle(newDoc->GetDocumentName());
+  return newDoc;
+}
+
 ImageFileDocument*
 CTSimApp::newImageDoc()
 {
-  ImageFileDocument* newDoc = dynamic_cast<ImageFileDocument*>(m_pDocTemplImage->CreateDocument (_T("")));
-  if (newDoc) {
-    newDoc->SetDocumentName (m_pDocTemplImage->GetDocumentName());
-    newDoc->SetDocumentTemplate (m_pDocTemplImage);
-    newDoc->OnNewDocument();
-  }
+  ImageFileDocument* newDoc = dynamic_cast<ImageFileDocument*>
+    (newDocumentHelper(m_pDocTemplImage));
+  if (newDoc)
+    newDoc->getView()->getFrame()->SetTitle(newDoc->GetDocumentName());
 
   return newDoc;
 }
@@ -1116,12 +1104,10 @@ CTSimApp::newImageDoc()
 PlotFileDocument*
 CTSimApp::newPlotDoc()
 {
-  PlotFileDocument* newDoc = dynamic_cast<PlotFileDocument*>(m_pDocTemplPlot->CreateDocument (_T("")));
-  if (newDoc) {
-    newDoc->SetDocumentName (m_pDocTemplPlot->GetDocumentName());
-    newDoc->SetDocumentTemplate (m_pDocTemplPlot);
-    newDoc->OnNewDocument();
-  }
+  PlotFileDocument* newDoc = dynamic_cast<PlotFileDocument*>
+    (newDocumentHelper(m_pDocTemplPlot));
+  if (newDoc)
+    newDoc->getView()->getFrame()->SetTitle(newDoc->GetDocumentName());
 
   return newDoc;
 }
@@ -1130,15 +1116,10 @@ CTSimApp::newPlotDoc()
 TextFileDocument*
 CTSimApp::newTextDoc()
 {
-  wxString strFilename (getUntitledFilename());
-  strFilename += wxString(".txt", *wxConvCurrent);
-
-  TextFileDocument* newDoc = dynamic_cast<TextFileDocument*>(m_pDocTemplText->CreateDocument (_T("")));
-  if (newDoc) {
-    newDoc->SetDocumentName (m_pDocTemplText->GetDocumentName());
-    newDoc->SetDocumentTemplate (m_pDocTemplText);
-    newDoc->OnNewDocument();
-  }
+  TextFileDocument* newDoc = dynamic_cast<TextFileDocument*>
+    (newDocumentHelper(m_pDocTemplText));
+  if (newDoc)
+    newDoc->getView()->getFrame()->SetTitle(newDoc->GetDocumentName());
 
   return newDoc;
 }
@@ -1147,12 +1128,10 @@ CTSimApp::newTextDoc()
 PhantomFileDocument*
 CTSimApp::newPhantomDoc()
 {
-  PhantomFileDocument* newDoc = dynamic_cast<PhantomFileDocument*>(m_pDocTemplPhantom->CreateDocument (_T("")));
-  if (newDoc) {
-    newDoc->SetDocumentName (m_pDocTemplPhantom->GetDocumentName());
-    newDoc->SetDocumentTemplate (m_pDocTemplPhantom);
-    newDoc->OnNewDocument();
-  }
+  PhantomFileDocument* newDoc = dynamic_cast<PhantomFileDocument*>
+    (newDocumentHelper(m_pDocTemplPhantom));
+  if (newDoc)
+    newDoc->getView()->getFrame()->SetTitle(newDoc->GetDocumentName());
 
   return newDoc;
 }
@@ -1162,13 +1141,12 @@ CTSimApp::newPhantomDoc()
 Graph3dFileDocument*
 CTSimApp::newGraph3dDoc()
 {
-  Graph3dFileDocument* newDoc = dynamic_cast<Graph3dFileDocument*>(m_pDocTemplGraph3d->CreateDocument (_T("")));
-  if (newDoc) {
-    newDoc->SetDocumentName (m_pDocTemplGraph3d->GetDocumentName());
-    newDoc->SetDocumentTemplate (m_pDocTemplGraph3d);
-    newDoc->OnNewDocument();
-  }
+  Graph3dFileDocument* newDoc = dynamic_cast<Graph3dFileDocument*>
+    (newDocumentHelper(m_pDocTemplGraph3d));
+  if (newDoc)
+    newDoc->getView()->getFrame()->SetTitle(newDoc->GetDocumentName());
 
   return newDoc;
 }
+
 #endif