From 36e07a9784dd10945097d99e7032c9ea9094aa87 Mon Sep 17 00:00:00 2001 From: Tim Warren Date: Thu, 7 May 2015 17:05:27 -0400 Subject: [PATCH] Lots of refactoring, need to fix a segfault with Close All --- Makefile | 8 +- src/TyroApp.cpp | 18 ++-- src/settings/LangConfig.cpp | 2 +- src/settings/ThemeConfig.cpp | 6 +- src/settings/ThemeConfig.h | 7 +- src/widgets/EditPane.cpp | 13 ++- src/widgets/EditPane.h | 3 +- src/widgets/MainFrame.cpp | 194 ++++------------------------------- src/widgets/MainFrame.h | 20 +--- src/widgets/TabContainer.cpp | 115 ++++++++++++++++++++- src/widgets/TabContainer.h | 12 ++- src/widgets/TyroMenu.cpp | 108 +++++++++++++++++++ src/widgets/TyroMenu.h | 28 +++++ src/widgets/widget.h | 18 ++++ 14 files changed, 331 insertions(+), 221 deletions(-) create mode 100644 src/widgets/TyroMenu.cpp create mode 100644 src/widgets/TyroMenu.h create mode 100644 src/widgets/widget.h diff --git a/Makefile b/Makefile index 9735468..d163ab0 100644 --- a/Makefile +++ b/Makefile @@ -87,8 +87,14 @@ lib: $(OBJECTS) $(BASE_LIB) run: ifneq ($(OS),Darwin) - ./build/Tyro + ./$(PROGRAM) else + ./build/Tyro.app/Contents/MacOS/Tyro +endif + + +ifeq ($(OS),Darwin) +run-app: open -a $(PWD)/build/Tyro.app endif diff --git a/src/TyroApp.cpp b/src/TyroApp.cpp index 6e8cd8d..cd50c79 100644 --- a/src/TyroApp.cpp +++ b/src/TyroApp.cpp @@ -20,11 +20,14 @@ private: wxConfigBase *Config; //************************************************************** - -#include "widgets/MainFrame.h" +#include "widgets/widget.h" IMPLEMENT_APP(TyroApp); +// Some global stuff +TyroMenu *mbar; +MainFrame *main_frame; + /** * Start the event loop and create the main window * @@ -36,13 +39,14 @@ bool TyroApp::OnInit() this->SetVendorName(APP_VENDOR); Config = wxConfigBase::Get(); - MainFrame* frame = new MainFrame(0L, APP_NAME); + mbar = new TyroMenu(); + main_frame = new MainFrame(0L, APP_NAME); - SetTopWindow(frame); + SetTopWindow(main_frame); - frame->Layout(); - frame->CenterOnScreen(); - frame->Show(true); + main_frame->Layout(); + main_frame->CenterOnScreen(); + main_frame->Show(true); return true; } diff --git a/src/settings/LangConfig.cpp b/src/settings/LangConfig.cpp index d76574c..80f7a9b 100644 --- a/src/settings/LangConfig.cpp +++ b/src/settings/LangConfig.cpp @@ -57,7 +57,7 @@ string LangConfig::GetLangByFile(wxFileName &fileName) } } - this->SetLang(lang); + this->SetLang(""); return this->lang; } diff --git a/src/settings/ThemeConfig.cpp b/src/settings/ThemeConfig.cpp index 38304ea..ad9da25 100644 --- a/src/settings/ThemeConfig.cpp +++ b/src/settings/ThemeConfig.cpp @@ -1,10 +1,14 @@ +/** + * Theme manager + */ + #include "ThemeConfig.h" #include ThemeConfig::ThemeConfig() { this->LoadJson(themes_json); - this->current_theme = "Solarized"; + this->SetTheme("Solarized"); } ThemeConfig::~ThemeConfig() {} diff --git a/src/settings/ThemeConfig.h b/src/settings/ThemeConfig.h index 368ec53..8064e8a 100644 --- a/src/settings/ThemeConfig.h +++ b/src/settings/ThemeConfig.h @@ -1,8 +1,5 @@ -/* - * File: ThemeConfig.h - * Author: twarren - * - * Created on May 7, 2015, 9:39 AM +/** + * Theme manager */ #ifndef TYRO_THEME_CONFIG_H diff --git a/src/widgets/EditPane.cpp b/src/widgets/EditPane.cpp index 329727f..c272483 100644 --- a/src/widgets/EditPane.cpp +++ b/src/widgets/EditPane.cpp @@ -1,4 +1,8 @@ -#include "EditPane.h" +/** + * The editor widget + */ + +#include "widget.h" EditPane::EditPane( wxWindow *parent, wxWindowID id, const wxPoint &pos, const wxSize &size @@ -120,8 +124,11 @@ void EditPane::Highlight(wxString filePath) * @return void */ void EditPane::ApplyTheme(string lang, string theme) -{ - theme_config->SetTheme(theme); +{ + if (theme != "") + { + theme_config->SetTheme(theme); + } // Get the keywords and mapping for the selected language JsonValue lexer_map = lang_config->GetLexerMap(lang); diff --git a/src/widgets/EditPane.h b/src/widgets/EditPane.h index 78ce0f7..07a2587 100644 --- a/src/widgets/EditPane.h +++ b/src/widgets/EditPane.h @@ -1,7 +1,6 @@ #ifndef TYROEDIT_PANE_H #define TYROEDIT_PANE_H -#include "../wx_common.h" #include "../settings/LangConfig.h" #include "../settings/ThemeConfig.h" @@ -22,7 +21,7 @@ public: void Highlight(wxString filePath); bool SaveFile(); bool SaveFile(const wxString &filename); - void ApplyTheme(string lang, string theme="Solarized"); + void ApplyTheme(string lang, string theme=""); private: StringConstMap lexerMap; StringConstMap::iterator lexerMapIt; diff --git a/src/widgets/MainFrame.cpp b/src/widgets/MainFrame.cpp index f66c87b..3b0d750 100644 --- a/src/widgets/MainFrame.cpp +++ b/src/widgets/MainFrame.cpp @@ -1,7 +1,10 @@ /** * Main Application Frame */ -#include "MainFrame.h" +#include "widget.h" + +extern TyroMenu *mbar; +static TabContainer *notebook; MainFrame::MainFrame(wxFrame *frame, const wxString &title) : wxFrame(frame, -1, title) @@ -14,7 +17,11 @@ MainFrame::MainFrame(wxFrame *frame, const wxString &title) this->SetIcon(app_icon); // Create menus and bars - this->SetupMenu(); +#ifdef __WXMAC__ + wxMenuBar::MacSetCommonMenuBar(mbar); +#endif // __WXMAC__ + SetMenuBar(mbar); + this->SetupStatusBar(); this->SetupToolbar(); @@ -35,7 +42,11 @@ MainFrame::MainFrame(wxFrame *frame, const wxString &title) SetSizerAndFit(base_sizer); } -MainFrame::~MainFrame() {} +MainFrame::~MainFrame() +{ + wxLogDebug("Main Frame Destructor Called."); + //delete notebook; +} void MainFrame::SetupStatusBar() { @@ -96,68 +107,6 @@ void MainFrame::SetupToolbar() toolBar->Realize(); } -/** - * Create the main menu - * - * @return void - */ -void MainFrame::SetupMenu() -{ - // create a menu bar - this->mbar = new wxMenuBar(); - - // Create Base menus - fileMenu = new wxMenu(); - editMenu = new wxMenu(); - viewMenu = new wxMenu(); - langMenu = new wxMenu(); - helpMenu = new wxMenu(); - - // Add items to top-level menus - fileMenu->Append(wxID_NEW, "&New\tCtrl+N", "Create a new file"); - fileMenu->AppendSeparator(); - fileMenu->Append(wxID_OPEN, "&Open\tCtrl+O", "Opens an existing file"); - fileMenu->Append(wxID_SAVE, "&Save\tCtrl+S", "Save the content"); - fileMenu->Append(wxID_SAVEAS, "Save &As...\tShift+Ctrl+S", "Save current file as..."); - fileMenu->AppendSeparator(); - fileMenu->Append(wxID_CLOSE, "&Close\tCtrl+W", "Close the current document"); - fileMenu->Append(myID_CLOSE_ALL, "C&lose All\tShift+Ctrl+W", "Close all open documents."); - fileMenu->Append(wxID_EXIT, "&Quit\tCtrl+Q", "Quit the application"); - - editMenu->Append(wxID_UNDO, "&Undo\tCtrl+Z", "Undo last action"); - editMenu->Append(wxID_REDO, "&Redo\tCtrl+Y", "Redo last action"); - editMenu->AppendSeparator(); - editMenu->Append(wxID_CUT, "Cu&t\tCtrl+X", "Cut selected text"); - editMenu->Append(wxID_COPY, "&Copy\tCtrl+C", "Copy selected text"); - editMenu->Append(wxID_PASTE, "&Paste\tCtrl+V", "Paste contents of clipboard"); - editMenu->Append(wxID_CLEAR, "&Delete\tDel"); - editMenu->AppendSeparator(); - //editMenu->Append(wxID_FIND, "&Find\tCtrl+F"); - //editMenu->Append(wxID_REPLACE, "&Replace\tCtrl+R"); - //editMenu->AppendSeparator(); - //editMenu->Append(wxID_PREFERENCES, "&Preferences\tCtrl+P"); - //editMenu->AppendSeparator(); - editMenu->Append(wxID_SELECTALL, "Select All\tCtrl+A", "Select all the text in the current document"); - - viewMenu->AppendCheckItem(myID_VIEW_WHITESPACE, "Show Invisible Characters\tCtrl+Shift+I", "Toggle visibility of white space characters"); - viewMenu->AppendCheckItem(myID_VIEW_LINE_ENDINGS, "Show line endings", "Toggle visibility of line ending characters"); - viewMenu->AppendCheckItem(myID_LINE_WRAP, "Word Wrap", "Toggle wrapping of long lines"); - - helpMenu->Append(wxID_ABOUT, "&About...\tF1", "Show info about this application"); - - // Add the menus to the menubar - this->mbar->Append(fileMenu, "&File"); - this->mbar->Append(editMenu, "&Edit"); - this->mbar->Append(viewMenu, "&View"); - this->mbar->Append(langMenu, "&Language"); - this->mbar->Append(helpMenu, "&Help"); - -#ifdef __WXMAC__ - wxMenuBar::MacSetCommonMenuBar(mbar); -#endif // __WXMAC__ - SetMenuBar(mbar); -} - /** * Bind event handlers * @@ -171,7 +120,7 @@ void MainFrame::BindEvents() Bind(wxEVT_COMMAND_MENU_SELECTED, &MainFrame::OnSave, this, wxID_SAVE); Bind(wxEVT_COMMAND_MENU_SELECTED, &MainFrame::OnSaveAs, this, wxID_SAVEAS); Bind(wxEVT_COMMAND_MENU_SELECTED, &MainFrame::OnCloseTab, this, wxID_CLOSE); - Bind(wxEVT_COMMAND_MENU_SELECTED, &MainFrame::OnCloseAll, this, myID_CLOSE_ALL); + Bind(wxEVT_COMMAND_MENU_SELECTED, &TabContainer::OnCloseAll, notebook, myID_CLOSE_ALL); Bind(wxEVT_COMMAND_MENU_SELECTED, &MainFrame::OnQuit, this, wxID_EXIT); // Edit Menu Events @@ -188,12 +137,7 @@ void MainFrame::BindEvents() Bind(wxEVT_COMMAND_MENU_SELECTED, &MainFrame::OnToggleWhitespace, this, myID_VIEW_WHITESPACE); Bind(wxEVT_COMMAND_MENU_SELECTED, &MainFrame::OnToggleLineWrap, this, myID_LINE_WRAP); Bind(wxEVT_COMMAND_MENU_SELECTED, &MainFrame::OnToggleLineEndings, this, myID_VIEW_LINE_ENDINGS); - - // Notebook Events - Bind(wxEVT_AUINOTEBOOK_PAGE_CLOSE, &MainFrame::OnClose, this, wxID_ANY); - Bind(wxEVT_AUINOTEBOOK_PAGE_CLOSED, &MainFrame::OnClosed, this, wxID_ANY); - Bind(wxEVT_AUINOTEBOOK_TAB_RIGHT_DOWN, &MainFrame::OnTabContextMenu, this, wxID_ANY); - + // Find/Replace Events Bind(wxEVT_FIND, &MainFrame::OnFindDialog, this, wxID_ANY); Bind(wxEVT_FIND_NEXT, &MainFrame::OnFindDialog, this, wxID_ANY); @@ -240,60 +184,7 @@ void MainFrame::OnOpen(wxCommandEvent &WXUNUSED(event)) notebook->AddTab(filelist[i]); } - this->EnableEditControls(true); -} - -/** - * Event handler for file saving checks on tab close - * - * @param wxAuiNotebookEvent& event - * @return void - */ -void MainFrame::OnClose(wxAuiNotebookEvent &event) -{ - int current_tab = notebook->GetSelection(); - EditPane *editor = notebook->GetCurrentEditor(); - - // Sanity check - if (current_tab == -1) return; - - if (editor->IsModified()) - { - int Msgbox_Choice = wxMessageBox( - "File has not been saved, save file before closing?", - "Modified File", - wxYES_NO | wxCANCEL | wxICON_QUESTION, - this - ); - - if (Msgbox_Choice == wxCANCEL) - { - return event.Veto(); - } - else if (Msgbox_Choice == wxYES) - { - editor->SaveFile(); - if (editor->IsModified()) - { - wxMessageBox(TYRO_SAVE_ERROR, TYRO_SAVE_ERROR_CAPTION, wxOK | wxICON_EXCLAMATION); - return event.Veto(); - } - } - }; -} - -/** - * Event handler triggered after a tab is closed - * - * @param WXUNUSED - * @return void - */ -void MainFrame::OnClosed(wxAuiNotebookEvent &WXUNUSED(event)) -{ - if (notebook->GetPageCount() == 0) - { - this->EnableEditControls(false); - } + //this->EnableEditControls(true); } /** @@ -615,59 +506,10 @@ void MainFrame::OnToggleLineEndings(wxCommandEvent &event) */ void MainFrame::EnableEditControls(bool enable) { - this->fileMenu->Enable(wxID_SAVE, enable); - this->fileMenu->Enable(wxID_SAVEAS, enable); - this->fileMenu->Enable(wxID_CLOSE, enable); - this->fileMenu->Enable(myID_CLOSE_ALL, enable); - - // Enable/disable top level menus - this->EnableEntireMenu(myEDIT_MENU, this->editMenu, enable); - this->EnableEntireMenu(myVIEW_MENU, this->viewMenu, enable); - this->EnableEntireMenu(myLANG_MENU, this->langMenu, enable); - + mbar->EnableEditControls(enable); this->toolBar->EnableTool(wxID_SAVE, enable); this->toolBar->EnableTool(wxID_CLOSE, enable); this->toolBar->EnableTool(wxID_COPY, enable); this->toolBar->EnableTool(wxID_CUT, enable); this->toolBar->EnableTool(wxID_PASTE, enable); } - -/** - * Enable/disable all the items in the menu, for environments - * that don't properly support disabling the menu by the parent label (like Ubuntu's Unity) - * - * @param size_t menuId - * @param wxMenu* menu - * @param bool enable - * @return void - */ -void MainFrame::EnableEntireMenu(size_t menuId, wxMenu *menu, bool enable) -{ - // Toggle the top of the menu - this->mbar->EnableTop(menuId, enable); - - // Toggle the rest of the items in the menu - wxMenuItemList list = menu->GetMenuItems(); - wxMenuItemList::iterator iter; - - for(iter = list.begin(); iter != list.end(); ++iter) - { - wxMenuItem *current = *iter; - current->Enable(enable); - } -} - -/** - * Displays a context menu on the current tab - * - * @return void - */ -void MainFrame::OnTabContextMenu(wxAuiNotebookEvent &WXUNUSED(event)) -{ - // Create Menu - wxMenu *contextMenu = new wxMenu(); - contextMenu->Append(wxID_CLOSE, "&Close\tCtrl+W", "Close the current tab"); - contextMenu->Append(myID_CLOSE_ALL, "C&lose All\tShift+Ctrl+W", "Close all open documents."); - - this->PopupMenu(contextMenu); -} diff --git a/src/widgets/MainFrame.h b/src/widgets/MainFrame.h index 03a5375..e61cf89 100644 --- a/src/widgets/MainFrame.h +++ b/src/widgets/MainFrame.h @@ -5,46 +5,31 @@ #ifndef TYROMAIN_H #define TYROMAIN_H -#include "../wx_common.h" - #include #include #include #include - #include "TabContainer.h" class MainFrame: public wxFrame { - friend class TabContainer; public: MainFrame(wxFrame *frame, const wxString &title); ~MainFrame(); + void EnableEditControls(bool enable=true); private: - TabContainer *notebook; wxToolBar *toolBar; - wxMenuBar *mbar; - wxMenu *fileMenu; - wxMenu *editMenu; - wxMenu *viewMenu; - wxMenu *langMenu; - wxMenu *helpMenu; wxFindReplaceData *findReplaceData; wxFindReplaceDialog *findDlg; wxFindReplaceDialog *replaceDlg; - void SetupMenu(); void SetupToolbar(); void SetupStatusBar(); void BindEvents(); - void EnableEditControls(bool enable=true); - void EnableEntireMenu(size_t menuId, wxMenu *menu, bool enable=true); // Main Menu Event handlers void OnNew(wxCommandEvent &event); void OnOpen(wxCommandEvent &event); - void OnClose(wxAuiNotebookEvent &event); void OnCloseAll(wxCommandEvent &event); - void OnClosed(wxAuiNotebookEvent &event); void OnFileClose(wxCommandEvent &event); void OnSave(wxCommandEvent &event); void OnSaveAs(wxCommandEvent &event); @@ -66,9 +51,6 @@ class MainFrame: public wxFrame void OnCloseTab(wxCommandEvent &event); void OnQuit(wxCommandEvent &event); void OnAbout(wxCommandEvent &event); - - // Tab Context Menu Event handlers - void OnTabContextMenu(wxAuiNotebookEvent &event); }; diff --git a/src/widgets/TabContainer.cpp b/src/widgets/TabContainer.cpp index 22c37b4..4c0843e 100644 --- a/src/widgets/TabContainer.cpp +++ b/src/widgets/TabContainer.cpp @@ -2,8 +2,9 @@ * Wrapper around wxAuiNotebook */ -#include "TabContainer.h" +#include "widget.h" +extern MainFrame *main_frame; static unsigned long untitled_document_count = 0; TabContainer::TabContainer( @@ -14,9 +15,16 @@ TabContainer::TabContainer( long style ) : wxAuiNotebook(parent, id, pos, size, style) { + 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); + Bind(wxEVT_AUINOTEBOOK_PAGE_CHANGED, &TabContainer::OnTabSwitch, this, wxID_ANY); } -TabContainer::~TabContainer() {} +TabContainer::~TabContainer() +{ + wxLogDebug("TabContainer destructor called"); +} /** * Add a new blank document @@ -69,4 +77,107 @@ void TabContainer::AddTab(wxString filePath) EditPane *TabContainer::GetCurrentEditor() { return (EditPane *) this->GetCurrentPage(); +} + +/** + * Get the EditPane control in the specified tab + * + * @param size_t page_idx + * @return *EditPane + */ +EditPane *TabContainer::GetEditor(size_t page_idx) +{ + return (EditPane *) this->GetPage(page_idx); +} + +/** + * Event handler for file saving checks on tab close + * + * @param wxAuiNotebookEvent& event + * @return void + */ +void TabContainer::OnClose(wxAuiNotebookEvent &event) +{ + int current_tab = this->GetSelection(); + EditPane *editor = this->GetCurrentEditor(); + + // Sanity check + if (current_tab == -1) return; + + if (editor->IsModified()) + { + int Msgbox_Choice = wxMessageBox( + "File has not been saved, save file before closing?", + "Modified File", + wxYES_NO | wxCANCEL | wxICON_QUESTION, + this + ); + + if (Msgbox_Choice == wxCANCEL) + { + return event.Veto(); + } + else if (Msgbox_Choice == wxYES) + { + editor->SaveFile(); + if (editor->IsModified()) + { + wxMessageBox(TYRO_SAVE_ERROR, TYRO_SAVE_ERROR_CAPTION, wxOK | wxICON_EXCLAMATION); + return event.Veto(); + } + } + }; +} + +/** + * Event handler triggered after a tab is closed + * + * @param WXUNUSED + * @return void + */ +void TabContainer::OnClosed(wxAuiNotebookEvent &WXUNUSED(event)) +{ + if (this->GetPageCount() == 0) + { + main_frame->EnableEditControls(false); + } +} + +/** + * Displays a context menu on the current tab + * + * @return void + */ +void TabContainer::OnTabContextMenu(wxAuiNotebookEvent &WXUNUSED(event)) +{ + // Create Menu + wxMenu *contextMenu = new wxMenu(); + contextMenu->Append(wxID_CLOSE, "&Close\tCtrl+W", "Close the current tab"); + contextMenu->Append(myID_CLOSE_ALL, "C&lose All\tShift+Ctrl+W", "Close all open documents."); + + this->PopupMenu(contextMenu); +} + +/** + * Close all the open tabs + * + * @return void + */ +void TabContainer::OnCloseAll(wxCommandEvent &WXUNUSED(event)) +{ + this->DeleteAllPages(); + main_frame->EnableEditControls(false); +} + +/** + * Update menu state when switching tabs + * + * @param wxAuiNotebookEvent& event + * @return void + */ +void TabContainer::OnTabSwitch(wxAuiNotebookEvent &WXUNUSED(event)) +{ + //EditPane *editor = this->GetEditor(event.GetSelection()); + + // @TODO: Update menu item checkboxes based on the state of the current editor } \ No newline at end of file diff --git a/src/widgets/TabContainer.h b/src/widgets/TabContainer.h index 640bc39..7a01c49 100644 --- a/src/widgets/TabContainer.h +++ b/src/widgets/TabContainer.h @@ -5,12 +5,10 @@ #ifndef TABCONTAINER_H #define TABCONTAINER_H -#include "../wx_common.h" - +#include "EditPane.h" +#include "MainFrame.h" #include #include -#include "EditPane.h" - static long tab_style = wxBORDER_NONE | wxAUI_NB_TAB_SPLIT |wxAUI_NB_TAB_MOVE | wxAUI_NB_SCROLL_BUTTONS | wxAUI_NB_WINDOWLIST_BUTTON @@ -30,7 +28,13 @@ public: void AddTab(); void AddTab(wxString filePath); EditPane *GetCurrentEditor(); + EditPane *GetEditor(size_t page_idx); + void OnCloseAll(wxCommandEvent &event); private: + void OnTabSwitch(wxAuiNotebookEvent &event); + void OnClose(wxAuiNotebookEvent &event); + void OnClosed(wxAuiNotebookEvent &event); + void OnTabContextMenu(wxAuiNotebookEvent &event); }; #endif /* TABCONTAINER_H */ diff --git a/src/widgets/TyroMenu.cpp b/src/widgets/TyroMenu.cpp new file mode 100644 index 0000000..e08d34e --- /dev/null +++ b/src/widgets/TyroMenu.cpp @@ -0,0 +1,108 @@ +#include "widget.h" + +TyroMenu::TyroMenu() +{ + fileMenu = new wxMenu(); + editMenu = new wxMenu(); + viewMenu = new wxMenu(); + langMenu = new wxMenu(); + helpMenu = new wxMenu(); + + this->SetupMainMenus(); + + // Add the menus to the menubar + this->Insert(myFILE_MENU, fileMenu, "&File"); + this->Insert(myEDIT_MENU, editMenu, "&Edit"); + this->Insert(myVIEW_MENU, viewMenu, "&View"); + this->Insert(myLANG_MENU, langMenu, "&Language"); + this->Insert(myHELP_MENU, helpMenu, "&Help"); +} + +TyroMenu::~TyroMenu() +{ + wxLogDebug("TyroMenu Destructor Called."); + + //delete fileMenu; + //delete editMenu; + //delete viewMenu; + //delete langMenu; + //delete helpMenu; +} + +void TyroMenu::SetupMainMenus() +{ + // Add items to top-level menus + fileMenu->Append(wxID_NEW, "&New\tCtrl+N", "Create a new file"); + fileMenu->AppendSeparator(); + fileMenu->Append(wxID_OPEN, "&Open\tCtrl+O", "Opens an existing file"); + fileMenu->Append(wxID_SAVE, "&Save\tCtrl+S", "Save the content"); + fileMenu->Append(wxID_SAVEAS, "Save &As...\tShift+Ctrl+S", "Save current file as..."); + fileMenu->AppendSeparator(); + fileMenu->Append(wxID_CLOSE, "&Close\tCtrl+W", "Close the current document"); + fileMenu->Append(myID_CLOSE_ALL, "C&lose All\tShift+Ctrl+W", "Close all open documents."); + fileMenu->Append(wxID_EXIT, "&Quit\tCtrl+Q", "Quit the application"); + + editMenu->Append(wxID_UNDO, "&Undo\tCtrl+Z", "Undo last action"); + editMenu->Append(wxID_REDO, "&Redo\tCtrl+Y", "Redo last action"); + editMenu->AppendSeparator(); + editMenu->Append(wxID_CUT, "Cu&t\tCtrl+X", "Cut selected text"); + editMenu->Append(wxID_COPY, "&Copy\tCtrl+C", "Copy selected text"); + editMenu->Append(wxID_PASTE, "&Paste\tCtrl+V", "Paste contents of clipboard"); + editMenu->Append(wxID_CLEAR, "&Delete\tDel"); + editMenu->AppendSeparator(); + //editMenu->Append(wxID_FIND, "&Find\tCtrl+F"); + //editMenu->Append(wxID_REPLACE, "&Replace\tCtrl+R"); + //editMenu->AppendSeparator(); + //editMenu->Append(wxID_PREFERENCES, "&Preferences\tCtrl+P"); + //editMenu->AppendSeparator(); + editMenu->Append(wxID_SELECTALL, "Select All\tCtrl+A", "Select all the text in the current document"); + + viewMenu->AppendCheckItem(myID_VIEW_WHITESPACE, "Show Invisible Characters\tCtrl+Shift+I", "Toggle visibility of white space characters"); + viewMenu->AppendCheckItem(myID_VIEW_LINE_ENDINGS, "Show line endings", "Toggle visibility of line ending characters"); + viewMenu->AppendCheckItem(myID_LINE_WRAP, "Word Wrap", "Toggle wrapping of long lines"); + + helpMenu->Append(wxID_ABOUT, "&About...\tF1", "Show info about this application"); +} + +void TyroMenu::SetupLangMenu() +{ + +} + +void TyroMenu::EnableEditControls(bool enable) +{ + this->fileMenu->Enable(wxID_SAVE, enable); + this->fileMenu->Enable(wxID_SAVEAS, enable); + this->fileMenu->Enable(wxID_CLOSE, enable); + this->fileMenu->Enable(myID_CLOSE_ALL, enable); + + // Enable/disable top level menus + this->EnableEntireMenu(myEDIT_MENU, this->editMenu, enable); + this->EnableEntireMenu(myVIEW_MENU, this->viewMenu, enable); + this->EnableEntireMenu(myLANG_MENU, this->langMenu, enable); +} + +/** + * Enable/disable all the items in the menu, for environments + * that don't properly support disabling the menu by the parent label (like Ubuntu's Unity) + * + * @param size_t menuId + * @param wxMenu* menu + * @param bool enable + * @return void + */ +void TyroMenu::EnableEntireMenu(size_t menuId, wxMenu *menu, bool enable) +{ + // Toggle the top of the menu + this->EnableTop(menuId, enable); + + // Toggle the rest of the items in the menu + wxMenuItemList list = menu->GetMenuItems(); + wxMenuItemList::iterator iter; + + for(iter = list.begin(); iter != list.end(); ++iter) + { + wxMenuItem *current = *iter; + current->Enable(enable); + } +} \ No newline at end of file diff --git a/src/widgets/TyroMenu.h b/src/widgets/TyroMenu.h new file mode 100644 index 0000000..a9e2b54 --- /dev/null +++ b/src/widgets/TyroMenu.h @@ -0,0 +1,28 @@ +/* + * File: TyroMenu.h + * Author: twarren + * + * Created on May 7, 2015, 3:10 PM + */ + +#ifndef TYRO_MENU_H +#define TYRO_MENU_H + +class TyroMenu : public wxMenuBar { +public: + TyroMenu(); + ~TyroMenu(); + void EnableEditControls(bool enable); +private: + wxMenu *fileMenu; + wxMenu *editMenu; + wxMenu *viewMenu; + wxMenu *langMenu; + wxMenu *helpMenu; + void SetupMainMenus(); + void SetupLangMenu(); + void EnableEntireMenu(size_t menuId, wxMenu *menu, bool enable); +}; + +#endif /* TYRO_MENU_H */ + diff --git a/src/widgets/widget.h b/src/widgets/widget.h new file mode 100644 index 0000000..071f0d5 --- /dev/null +++ b/src/widgets/widget.h @@ -0,0 +1,18 @@ +/* + * File: widget.h + * Author: twarren + * + * Created on May 7, 2015, 2:35 PM + */ + +#ifndef TYRO_WIDGET_H +#define TYRO_WIDGET_H + +#include "../wx_common.h" +#include "TyroMenu.h" +#include "EditPane.h" +#include "TabContainer.h" +#include "MainFrame.h" + +#endif /* TYRO_WIDGET_H */ +