From 1b42eae8d80063c533661cf0a767dc2d36dbf96e Mon Sep 17 00:00:00 2001 From: Tim Warren Date: Fri, 15 May 2015 16:55:18 -0400 Subject: [PATCH] Start of command-line arguments --- src/TyroApp.cpp | 79 ++++++++++++++++++++++++++++-------- src/definitions.h | 15 ++++++- src/widgets/MainFrame.cpp | 41 ++++++++++++------- src/widgets/MainFrame.h | 1 + src/widgets/TabContainer.cpp | 19 ++++++--- src/widgets/TabContainer.h | 1 + 6 files changed, 118 insertions(+), 38 deletions(-) diff --git a/src/TyroApp.cpp b/src/TyroApp.cpp index 6f63b53..920e962 100644 --- a/src/TyroApp.cpp +++ b/src/TyroApp.cpp @@ -27,23 +27,25 @@ public: */ bool OnInit() { - this->SetAppName(APP_NAME); - this->SetVendorName(APP_VENDOR); + if ( ! wxApp::OnInit()) return false; - // Initialize globals - this->InitLexerMap(); - Glob_config = wxConfigBase::Get(); - Glob_menu_bar = new TyroMenu(); - Glob_main_frame = new MainFrame(0L, APP_NAME); + this->SetAppName(APP_NAME); + this->SetVendorName(APP_VENDOR); - SetTopWindow(Glob_main_frame); + // Initialize globals + this->InitLexerMap(); + Glob_config = wxConfigBase::Get(); + Glob_menu_bar = new TyroMenu(); + Glob_main_frame = new MainFrame(0L, APP_NAME); - // Setup Main Window - Glob_main_frame->Layout(); - Glob_main_frame->CenterOnScreen(); - Glob_main_frame->Show(true); + // Setup Main Window + Glob_main_frame->Layout(); + Glob_main_frame->CenterOnScreen(); + Glob_main_frame->Show(true); - return true; + SetTopWindow(Glob_main_frame); + + return true; } /** @@ -53,15 +55,58 @@ public: */ int OnExit() { - // Deallocate config object - delete wxConfigBase::Set((wxConfigBase *) NULL); + // Deallocate config object + delete wxConfigBase::Set((wxConfigBase *) NULL); - return close(true); + return close(true); + } + + /** + * Set up Command Line options + * + * @param wxCmdLineParser& parser + * @return void + */ + void OnInitCmdLine(wxCmdLineParser &parser) + { + parser.SetDesc(Glob_cmdLineDesc); + + // Set - as parameter delimeter, so raw file paths can be used + parser.SetSwitchChars("-"); + } + + /** + * Handler for command line options + * + * @param wxCmdLineParser& parser + * @return bool + */ + bool OnCmdLineParsed(wxCmdLineParser &parser) + { + // Get un-named parameters + wxArrayString files; + int i; + int param_count = parser.GetParamCount(); + + wxLogDebug("%i Parameters", param_count); + + for (i = 0; i < param_count; i++) + { + files.Add(parser.GetParam(i)); + } + + // Open files in editor, if any are passed + if (param_count > 0) + { + Glob_main_frame->OpenFiles(files); + } + + return true; } private: /** * Set up mapping for lexers - */ + */ void InitLexerMap() { Glob_lexer_map[""] = wxSTC_LEX_NULL; diff --git a/src/definitions.h b/src/definitions.h index b0c4e6c..f51bf63 100644 --- a/src/definitions.h +++ b/src/definitions.h @@ -8,9 +8,22 @@ // Application config const wxString APP_NAME = "Tyro"; const wxString APP_VENDOR = "Aviat Ion"; -const wxString APP_VERSION = "0.1.0"; +const wxString APP_VERSION = "0.5.0"; const wxString APP_VERSION_MORE = "Pre-release"; +// Command-line arguments +const wxCmdLineEntryDesc Glob_cmdLineDesc[] = { + { + wxCMD_LINE_PARAM, + NULL, + NULL, + "input file(s)", + wxCMD_LINE_VAL_STRING, + wxCMD_LINE_PARAM_OPTIONAL | wxCMD_LINE_PARAM_MULTIPLE + }, + {wxCMD_LINE_NONE} +}; + // Some boilerplate text const wxString TYRO_SAVE_ERROR = "Failed to save the file. Maybe you lack the permissions."; const wxString TYRO_SAVE_ERROR_CAPTION = "Saving Failed"; diff --git a/src/widgets/MainFrame.cpp b/src/widgets/MainFrame.cpp index 7b27af2..005eb3a 100644 --- a/src/widgets/MainFrame.cpp +++ b/src/widgets/MainFrame.cpp @@ -15,6 +15,9 @@ MainFrame::MainFrame(wxFrame *frame, const wxString &title) { findReplaceData = new wxFindReplaceData(wxFR_DOWN); + // Create the tab container + notebook = new TabContainer(this); + // Set the frame icon #include "../../resources/xpm/tyro.xpm" wxIcon app_icon(tyro_icon); @@ -35,7 +38,7 @@ MainFrame::MainFrame(wxFrame *frame, const wxString &title) MainFrame::~MainFrame() { wxLogDebug("Main Frame Destructor Called."); - delete notebook; + //delete notebook; delete toolBar; manager->UnInit(); } @@ -46,10 +49,7 @@ MainFrame::~MainFrame() * @return void */ void MainFrame::DoLayout() -{ - // Create the tab container - notebook = new TabContainer(this); - +{ this->manager = new wxAuiManager(this); this->SetupToolbar(); @@ -188,14 +188,13 @@ void MainFrame::OnNew(wxCommandEvent &WXUNUSED(event)) } /** - * Open existing document(s) + * Display a file open dialog, and open the selected files * * @return void */ void MainFrame::OnOpen(wxCommandEvent &WXUNUSED(event)) { wxArrayString filelist; - int listcount; wxFileDialog dlg (this, "Open file(s)", wxEmptyString, wxEmptyString, TYRO_FILE_OPEN_WILDCARDS, wxFD_OPEN | wxFD_FILE_MUST_EXIST | wxFD_CHANGE_DIR | wxFD_MULTIPLE); @@ -203,15 +202,29 @@ void MainFrame::OnOpen(wxCommandEvent &WXUNUSED(event)) if (dlg.ShowModal() != wxID_OK) return; dlg.GetPaths(filelist); - listcount = filelist.GetCount(); + + this->OpenFiles(filelist); +} + +/** + * Open tabs containing the files passed + * + * @param wxArrayString& filelist + * @return void + */ +void MainFrame::OpenFiles(wxArrayString filelist) +{ + int listcount = filelist.GetCount(); + + if (listcount < 1) return; // Open a new tab for each file - notebook->Hide(); + //notebook->Freeze(); for (int i = 0; i < listcount; i++) { notebook->AddTab(filelist[i]); } - notebook->Show(); + //notebook->Thaw(); this->EnableEditControls(true); } @@ -225,7 +238,7 @@ void MainFrame::OnCloseTab(wxCommandEvent &WXUNUSED(event)) { int current_tab = notebook->GetSelection(); - notebook->Hide(); + notebook->Freeze(); notebook->DeletePage(current_tab); if (notebook->GetPageCount() == 0) @@ -233,7 +246,7 @@ void MainFrame::OnCloseTab(wxCommandEvent &WXUNUSED(event)) this->EnableEditControls(false); } - notebook->Show(); + notebook->Thaw(); this->manager->Update(); } @@ -244,10 +257,10 @@ void MainFrame::OnCloseTab(wxCommandEvent &WXUNUSED(event)) */ void MainFrame::OnCloseAll(wxCommandEvent &WXUNUSED(event)) { - notebook->Hide(); + notebook->Freeze(); notebook->DeleteAllPages(); this->EnableEditControls(false); - notebook->Show(); + notebook->Thaw(); } /** diff --git a/src/widgets/MainFrame.h b/src/widgets/MainFrame.h index 564bb61..1dc00e0 100644 --- a/src/widgets/MainFrame.h +++ b/src/widgets/MainFrame.h @@ -13,6 +13,7 @@ class MainFrame: public wxFrame MainFrame(wxFrame *frame, const wxString &title); ~MainFrame(); void EnableEditControls(bool enable=true); + void OpenFiles(wxArrayString filelist); private: wxAuiManager *manager; wxAuiToolBar *toolBar; diff --git a/src/widgets/TabContainer.cpp b/src/widgets/TabContainer.cpp index 962fe6e..dda76fd 100644 --- a/src/widgets/TabContainer.cpp +++ b/src/widgets/TabContainer.cpp @@ -4,7 +4,6 @@ #include "widget.h" -extern MainFrame *Glob_main_frame; extern TyroMenu *Glob_menu_bar; static unsigned long untitled_document_count = 0; @@ -25,6 +24,8 @@ TabContainer::TabContainer( long style ) : wxAuiNotebook(parent, id, pos, size, style) { + this->parent = (MainFrame *) parent; + Bind(wxEVT_AUINOTEBOOK_PAGE_CLOSE, &TabContainer::OnClose, this, wxID_ANY); Bind(wxEVT_AUINOTEBOOK_PAGE_CLOSED, &TabContainer::OnClosed, this, wxID_ANY); Bind(wxEVT_AUINOTEBOOK_TAB_RIGHT_DOWN, &TabContainer::OnTabContextMenu, this, wxID_ANY); @@ -52,7 +53,7 @@ void TabContainer::AddTab() caption.Printf("Untitled %lu", untitled_document_count); - EditPane *editor = new EditPane(this, wxID_ANY); + EditPane *editor = new EditPane(this); this->AddPage(editor, caption, true); } @@ -64,11 +65,17 @@ void TabContainer::AddTab() * @return void */ void TabContainer::AddTab(wxString filePath) -{ +{ wxFileName fileName(filePath); + if ( ! (fileName.IsOk() && fileName.FileExists())) + { + wxLogDebug("Invalid file name."); + return; + } + wxString caption= fileName.GetFullName(); - EditPane *editor = new EditPane(this, wxID_ANY); + EditPane *editor = new EditPane(this); if (editor->Load(filePath)) { @@ -155,7 +162,7 @@ void TabContainer::OnClosed(wxAuiNotebookEvent &WXUNUSED(event)) { if (this->GetPageCount() == 0) { - Glob_main_frame->EnableEditControls(false); + this->parent->EnableEditControls(false); } } @@ -182,7 +189,7 @@ void TabContainer::OnTabContextMenu(wxAuiNotebookEvent &WXUNUSED(event)) void TabContainer::OnCloseAll(wxCommandEvent &WXUNUSED(event)) { this->DeleteAllPages(); - Glob_main_frame->EnableEditControls(false); + this->parent->EnableEditControls(false); } /** diff --git a/src/widgets/TabContainer.h b/src/widgets/TabContainer.h index 1af4c1c..de4348f 100644 --- a/src/widgets/TabContainer.h +++ b/src/widgets/TabContainer.h @@ -29,6 +29,7 @@ public: EditPane *GetEditor(size_t page_idx); void OnCloseAll(wxCommandEvent &event); private: + MainFrame *parent; void OnTabSwitch(wxAuiNotebookEvent &event); void OnClose(wxAuiNotebookEvent &event); void OnClosed(wxAuiNotebookEvent &event);