diff --git a/Makefile b/Makefile index f3994f2..a637fd6 100644 --- a/Makefile +++ b/Makefile @@ -9,6 +9,7 @@ PROGRAM = build/Tyro PROGRAM_OBJECTS = $(patsubst %.cpp,%.o, $(PROGRAM_SRC)) WX_RES = $(shell wx-config --rescomp) +WX_CXXFLAGS = $(shell wx-config --cxxflags) DEV_CXXFLAGS = -g -Wall -Wextra -DDEBUG CXXFLAGS = -Os -DNDEBUG @@ -22,10 +23,8 @@ OS ?= $(shell uname -s) # Get static version of libs to link to on platforms that support it ifneq ($(OS),Linux) - WX_CXXFLAGS = $(shell wx-config --static --cxxflags) WX_LDLIBS = $(shell wx-config --static --libs base core aui stc adv) else - WX_CXXFLAGS = $(shell wx-config --cxxflags) WX_LDLIBS = $(shell wx-config --libs base core aui stc adv) endif diff --git a/Windows-Build.md b/Windows-Build.md index 1df9a14..408153e 100644 --- a/Windows-Build.md +++ b/Windows-Build.md @@ -4,7 +4,7 @@ In order to keep a consistent build system, Tyro is built with MinGW and Msys. T ## Build Environment Setup: -1. Download MinGW installer +1. Download MinGW [installer](http://www.mingw.org/download/installer) 2. Install MinGW & MSyS (at least the following packages) * mingw-developer-toolkit diff --git a/src/definitions.h b/src/definitions.h index e4c0e98..4475a8d 100644 --- a/src/definitions.h +++ b/src/definitions.h @@ -8,7 +8,8 @@ // Application config const wxString APP_NAME = "Tyro"; const wxString APP_VENDOR = "Aviat Ion"; -const wxString APP_VERSION = "0.0.1"; +const wxString APP_VERSION = "0.1.0"; +const wxString APP_VERSION_MORE = "Pre-release"; // Some boilerplate text const wxString TYRO_SAVE_ERROR = "Failed to save the file. Maybe you lack the permissions."; @@ -20,6 +21,24 @@ const wxString TYRO_OPEN_ERROR_CAPTION = "Open Failed"; typedef map StringConstMap; typedef map StringMap; +// Top level menus +enum myMenuIds { + myFILE_MENU, + myEDIT_MENU, + myVIEW_MENU, + myLANG_MENU, + myHELP_MENU +}; + +// Menu ids +enum myMenuItemIds { + myID_VIEW_WHITESPACE = wxID_HIGHEST, + myID_VIEW_LINE_ENDINGS, + myID_CLOSE_ALL, + myID_CLOSE_ALL_BUT_THIS, + myID_LINE_WRAP +}; + const wxString TYRO_FILE_OPEN_WILDCARDS = "All files (*.*)|*|" "Batch (*.bat, *.cmd, *.nt)|*.bat;*.cmd,*.nt|" diff --git a/src/widgets/MainFrame.cpp b/src/widgets/MainFrame.cpp index ab6fd53..4c3e082 100644 --- a/src/widgets/MainFrame.cpp +++ b/src/widgets/MainFrame.cpp @@ -3,28 +3,12 @@ */ #include "MainFrame.h" -// Top level menus -enum myMenuIds { - myFILE_MENU, - myEDIT_MENU, - myVIEW_MENU, - myLANG_MENU, - myHELP_MENU -}; - -// Menu ids -enum myMenuItemIds { - myID_VIEW_WHITESPACE = wxID_HIGHEST, - myID_VIEW_LINE_ENDINGS, - myID_CLOSE_ALL, - myID_CLOSE_ALL_BUT_THIS, - myID_LINE_WRAP -}; - MainFrame::MainFrame(wxFrame *frame, const wxString &title) : wxFrame(frame, -1, title) { #include "../../resources/xpm/tyro.xpm" + + findReplaceData = new wxFindReplaceData(); wxIcon app_icon(tyro_icon); this->SetIcon(app_icon); @@ -148,15 +132,15 @@ void MainFrame::SetupMenu() 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_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_LINE_WRAP, "Wrap Lines", "Toggle line wrapping"); + viewMenu->AppendCheckItem(myID_LINE_WRAP, "Word Wrap", "Toggle wrapping of long lines"); helpMenu->Append(wxID_ABOUT, "&About...\tF1", "Show info about this application"); @@ -180,25 +164,43 @@ void MainFrame::SetupMenu() */ void MainFrame::BindEvents() { + // File Menu Events Bind(wxEVT_COMMAND_MENU_SELECTED, &MainFrame::OnNew, this, wxID_NEW); Bind(wxEVT_COMMAND_MENU_SELECTED, &MainFrame::OnOpen, this, wxID_OPEN); Bind(wxEVT_COMMAND_MENU_SELECTED, &MainFrame::OnSave, this, wxID_SAVE); Bind(wxEVT_COMMAND_MENU_SELECTED, &MainFrame::OnSaveAs, this, wxID_SAVEAS); - Bind(wxEVT_AUINOTEBOOK_PAGE_CLOSE, &MainFrame::OnClose, this, wxID_ANY); - Bind(wxEVT_AUINOTEBOOK_PAGE_CLOSED, &MainFrame::OnClosed, this, wxID_ANY); 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, &MainFrame::OnAbout, this, wxID_ABOUT); Bind(wxEVT_COMMAND_MENU_SELECTED, &MainFrame::OnQuit, this, wxID_EXIT); + + // Edit Menu Events Bind(wxEVT_COMMAND_MENU_SELECTED, &MainFrame::OnEditCut, this, wxID_CUT); Bind(wxEVT_COMMAND_MENU_SELECTED, &MainFrame::OnEditCopy, this, wxID_COPY); Bind(wxEVT_COMMAND_MENU_SELECTED, &MainFrame::OnEditPaste, this, wxID_PASTE); Bind(wxEVT_COMMAND_MENU_SELECTED, &MainFrame::OnEditSelectAll, this, wxID_SELECTALL); Bind(wxEVT_COMMAND_MENU_SELECTED, &MainFrame::OnEditUndo, this, wxID_UNDO); Bind(wxEVT_COMMAND_MENU_SELECTED, &MainFrame::OnEditRedo, this, wxID_REDO); + Bind(wxEVT_COMMAND_MENU_SELECTED, &MainFrame::OnEditFind, this, wxID_FIND); + Bind(wxEVT_COMMAND_MENU_SELECTED, &MainFrame::OnEditReplace, this, wxID_REPLACE); + + // View Menu Events Bind(wxEVT_COMMAND_MENU_SELECTED, &MainFrame::OnToggleWhitespace, this, myID_VIEW_WHITESPACE); - Bind(wxEVT_AUINOTEBOOK_TAB_RIGHT_DOWN, &MainFrame::OnTabContextMenu, this, wxID_ANY); Bind(wxEVT_COMMAND_MENU_SELECTED, &MainFrame::OnToggleLineWrap, this, myID_LINE_WRAP); + + // 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); + Bind(wxEVT_FIND_REPLACE, &MainFrame::OnFindDialog, this, wxID_ANY); + Bind(wxEVT_FIND_REPLACE_ALL, &MainFrame::OnFindDialog, this, wxID_ANY); + Bind(wxEVT_FIND_CLOSE, &MainFrame::OnFindDialog, this, wxID_ANY); + + // Help Menu Events + Bind(wxEVT_COMMAND_MENU_SELECTED, &MainFrame::OnAbout, this, wxID_ABOUT); } void MainFrame::OnNew(wxCommandEvent &WXUNUSED(event)) @@ -386,7 +388,7 @@ void MainFrame::OnAbout(wxCommandEvent &WXUNUSED(event)) wxAboutDialogInfo info; info.SetName(APP_NAME); - info.SetVersion(APP_VERSION, "Prerelease"); + info.SetVersion(APP_VERSION, APP_VERSION_MORE); info.AddDeveloper("Tim Warren, Programmer"); info.AddArtist("Brian Smith, Icon"); @@ -414,20 +416,96 @@ void MainFrame::OnToggleWhitespace(wxCommandEvent& event) editor->SetViewEOL(event.IsChecked()); } -void MainFrame::OnFind(wxCommandEvent &WXUNUSED(event)) +void MainFrame::OnEditFind(wxCommandEvent &WXUNUSED(event)) { + if (findDlg) + { + wxDELETE(findDlg); + } + else + { + findDlg = new wxFindReplaceDialog( + this, + findReplaceData, + "Find" + ); + + findDlg->Show(true); + } } -void MainFrame::OnFindNext(wxCommandEvent &WXUNUSED(event)) +void MainFrame::OnEditReplace(wxCommandEvent &WXUNUSED(event)) { + if (replaceDlg) + { + wxDELETE(replaceDlg); + } + else + { + replaceDlg = new wxFindReplaceDialog( + this, + findReplaceData, + "Find and Replace", + wxFR_REPLACEDIALOG + ); + + replaceDlg->Show(true); + } } -void MainFrame::OnReplace(wxCommandEvent &WXUNUSED(event)) -{ -} - -void MainFrame::OnReplaceNext(wxCommandEvent &WXUNUSED(event)) +/** + * Handles events coming from find dialog + * @param event + */ +void MainFrame::OnFindDialog(wxFindDialogEvent &event) { + wxEventType type = event.GetEventType(); + EditPane *editor = notebook->GetCurrentEditor(); + + // Parse flags + int stc_flags = 0; + int fr_flags = event.GetFlags(); + + if ((fr_flags & wxFR_WHOLEWORD) != 0) stc_flags |= wxSTC_FIND_WHOLEWORD; + if ((fr_flags & wxFR_MATCHCASE) != 0) stc_flags |= wxSTC_FIND_MATCHCASE; + + // Send find flags to editor control + editor->SetSearchFlags(stc_flags); + + if (type == wxEVT_FIND) + { + editor->SearchAnchor(); // Set staring search position at current position + editor->SearchNext(stc_flags, event.GetFindString()); + } + else if (type == wxEVT_FIND_NEXT) + { + editor->SearchAnchor(); + if ((fr_flags & wxFR_DOWN) != 0) + { + editor->SearchNext(stc_flags, event.GetFindString()); + } + else + { + editor->SearchPrev(stc_flags, event.GetFindString()); + } + + } + else if (type == wxEVT_FIND_REPLACE) + { + + } + else if (type == wxEVT_FIND_REPLACE_ALL) + { + + } + else if (type == wxEVT_FIND_CLOSE) + { + event.GetDialog()->Destroy(); + } + else + { + + } } void MainFrame::OnToggleLineWrap(wxCommandEvent &event) diff --git a/src/widgets/MainFrame.h b/src/widgets/MainFrame.h index c9183c5..52ca720 100644 --- a/src/widgets/MainFrame.h +++ b/src/widgets/MainFrame.h @@ -10,6 +10,7 @@ #include #include #include +#include #include "TabContainer.h" @@ -28,6 +29,9 @@ class MainFrame: public wxFrame wxMenu *viewMenu; wxMenu *langMenu; wxMenu *helpMenu; + wxFindReplaceData *findReplaceData; + wxFindReplaceDialog *findDlg; + wxFindReplaceDialog *replaceDlg; void SetupMenu(); void SetupToolbar(); void SetupStatusBar(); @@ -52,10 +56,9 @@ class MainFrame: public wxFrame void OnEditUndo(wxCommandEvent &event); void OnEditRedo(wxCommandEvent &event); - void OnFind(wxCommandEvent &event); - void OnFindNext(wxCommandEvent &event); - void OnReplace(wxCommandEvent &event); - void OnReplaceNext(wxCommandEvent &event); + void OnEditFind(wxCommandEvent &event); + void OnEditReplace(wxCommandEvent &event); + void OnFindDialog(wxFindDialogEvent &event); void OnToggleWhitespace(wxCommandEvent &event); void OnToggleLineWrap(wxCommandEvent &event);