Tyro/src/widgets/MainFrame.cpp

747 lines
16 KiB
C++
Raw Normal View History

/**
* Main Application Frame
*/
2015-07-07 10:01:17 -04:00
#include "src/widgets/MainFrame.h"
// Nasty globals
extern TyroMenu *Glob_menu_bar;
extern wxStatusBar *Glob_status_bar;
// Frame icon (const static char *tyro_icon[])
2016-01-13 09:35:51 -05:00
#include "resources/xpm/tyro.xpm"
2015-05-15 19:12:00 -04:00
/**
* Constructor
*/
MainFrame::MainFrame(wxFrame *frame, const wxString &title, const wxSize &size)
: wxFrame(frame, -1, title, wxDefaultPosition, size)
{
2015-05-15 16:55:18 -04:00
// Create the tab container
this->notebook = new TabContainer(this);
2016-01-13 09:35:51 -05:00
// Initialize other widgets
2020-07-16 10:09:19 -04:00
#ifdef TYRO_FILETREE
this->fileTreePane = new FileTreePane(this);
2020-07-16 10:09:19 -04:00
#endif
this->prefFrame = new PrefFrame();
2016-01-13 09:35:51 -05:00
// Set the frame icon
2015-04-27 11:33:24 -04:00
wxIcon app_icon(tyro_icon);
this->SetIcon(app_icon);
2016-01-13 09:35:51 -05:00
// Apply the menu bar to the current frame
this->SetMenuBar(Glob_menu_bar);
2016-01-13 09:35:51 -05:00
// Setup StatusBar
Glob_status_bar = new wxStatusBar(this, wxID_ANY);
2019-06-03 16:13:12 -04:00
Glob_status_bar->SetFieldsCount(6);
2016-01-13 09:35:51 -05:00
this->MainLayout();
2016-01-13 09:35:51 -05:00
this->BindEvents();
}
/**
* Time to clean up!
2016-01-13 09:35:51 -05:00
*/
MainFrame::~MainFrame()
{
wxLogDebug("Main Frame Destructor Called.");
2016-01-13 09:35:51 -05:00
wxDELETE(this->findDlg);
wxDELETE(this->findData);
wxDELETE(this->replaceDlg);
wxDELETE(this->findReplaceData);
2019-05-23 16:22:49 -04:00
wxDELETE(this->toolBar);
wxDELETE(this->prefFrame);
2020-07-16 10:09:19 -04:00
#ifdef TYRO_FILETREE
wxDELETE(this->fileTreePane);
2020-07-16 10:09:19 -04:00
#endif
this->manager->UnInit();
2016-01-13 09:35:51 -05:00
wxDELETE(this->notebook);
2019-06-18 11:22:49 -04:00
Glob_status_bar->Destroy();
}
/**
* Layout the widgets on the main frame
*
* @return void
2016-01-13 09:35:51 -05:00
*/
void MainFrame::MainLayout()
2016-01-13 09:35:51 -05:00
{
this->manager = new wxAuiManager(this);
2019-05-23 16:22:49 -04:00
this->toolBar = this->SetupToolbar();
2016-01-13 09:35:51 -05:00
// Setup properties for each AUI pane
2015-05-11 17:02:11 -04:00
wxAuiPaneInfo toolBarPaneInfo;
toolBarPaneInfo
.Top()
.ToolbarPane()
.Gripper(false)
.DockFixed(true)
.Resizable(true);
this->manager->AddPane(this->toolBar, toolBarPaneInfo);
2016-01-13 09:35:51 -05:00
2020-07-16 10:09:19 -04:00
#ifdef TYRO_FILETREE
wxAuiPaneInfo filePaneInfo;
filePaneInfo.Left()
.MinSize(225, 550)
.RightDockable(true)
.LeftDockable(true)
.Resizable(true);
this->manager->AddPane(this->fileTreePane, filePaneInfo);
2020-07-16 10:09:19 -04:00
#endif
2016-01-13 09:35:51 -05:00
2015-05-11 17:02:11 -04:00
wxAuiPaneInfo notebookPaneInfo;
notebookPaneInfo.CenterPane();
this->manager->AddPane(this->notebook, notebookPaneInfo);
2016-01-13 09:35:51 -05:00
wxAuiPaneInfo statusPaneInfo;
statusPaneInfo.Bottom()
.ToolbarPane()
.Gripper(false)
.DockFixed(true)
.Resizable(true);
this->manager->AddPane(Glob_status_bar, statusPaneInfo);
2016-01-13 09:35:51 -05:00
// Update everything
this->EnableEditControls(false);
}
2015-04-21 17:06:21 -04:00
/**
* Create the main toolbar
2016-01-13 09:35:51 -05:00
*
2015-04-21 17:06:21 -04:00
* @return void
*/
2019-05-23 16:22:49 -04:00
wxAuiToolBar* MainFrame::SetupToolbar()
2015-04-01 15:15:29 -04:00
{
2015-04-02 14:20:35 -04:00
// Icon files
#ifndef __WXGTK__
2016-01-13 09:35:51 -05:00
#include "resources/xpm/32/new.xpm"
#include "resources/xpm/32/open.xpm"
#include "resources/xpm/32/save.xpm"
#include "resources/xpm/32/cut.xpm"
#include "resources/xpm/32/copy.xpm"
#include "resources/xpm/32/paste.xpm"
2015-04-02 11:01:21 -04:00
2015-05-11 15:41:31 -04:00
wxBitmap new_file_icon(new_file);
wxBitmap open_file_icon(open);
wxBitmap open_folder_icon(open);
2015-05-11 15:41:31 -04:00
wxBitmap save_file_icon(save);
2015-04-16 09:37:20 -04:00
wxBitmap copy_icon(copy);
2015-05-11 15:41:31 -04:00
wxBitmap cut_icon(cut);
wxBitmap paste_icon(paste);
#else
wxBitmap new_file_icon = wxArtProvider::GetBitmap(wxART_NEW, wxART_TOOLBAR);
wxBitmap open_file_icon = wxArtProvider::GetBitmap(wxART_FILE_OPEN, wxART_TOOLBAR);
wxBitmap open_folder_icon = wxArtProvider::GetBitmap(wxART_FOLDER_OPEN, wxART_TOOLBAR);
wxBitmap save_file_icon = wxArtProvider::GetBitmap(wxART_FILE_SAVE, wxART_TOOLBAR);
wxBitmap copy_icon = wxArtProvider::GetBitmap(wxART_COPY, wxART_TOOLBAR);
wxBitmap cut_icon = wxArtProvider::GetBitmap(wxART_CUT, wxART_TOOLBAR);
wxBitmap paste_icon = wxArtProvider::GetBitmap(wxART_PASTE, wxART_TOOLBAR);
#endif
2016-01-13 09:35:51 -05:00
2015-05-11 17:02:11 -04:00
toolBar = new wxAuiToolBar(this);
2015-04-02 14:20:35 -04:00
2015-04-16 09:37:20 -04:00
toolBar->AddTool(wxID_NEW, "New", new_file_icon, "New file");
toolBar->AddTool(wxID_OPEN, "Open", open_file_icon, "Open file");
#ifdef __WXGTK__
2020-07-16 10:09:19 -04:00
#ifdef TYRO_FILETREE
toolBar->AddTool(myID_OPEN_DIR, "Open Dir", open_folder_icon, "Open folder");
2020-07-16 10:09:19 -04:00
#endif
#endif
2015-04-16 09:37:20 -04:00
toolBar->AddTool(wxID_SAVE, "Save", save_file_icon, "Save file");
2015-04-15 12:17:25 -04:00
toolBar->AddSeparator();
2016-01-13 09:35:51 -05:00
2015-04-16 09:37:20 -04:00
toolBar->AddTool(wxID_COPY, "Copy", copy_icon, "Copy");
toolBar->AddTool(wxID_CUT, "Cut", cut_icon, "Cut");
toolBar->AddTool(wxID_PASTE, "Paste", paste_icon, "Paste");
2015-05-11 17:02:11 -04:00
toolBar->AddStretchSpacer();
2016-01-13 09:35:51 -05:00
2015-04-02 14:20:35 -04:00
toolBar->Realize();
2019-05-23 16:22:49 -04:00
return toolBar;
2015-04-01 15:15:29 -04:00
}
2015-04-21 17:06:21 -04:00
/**
* Bind event handlers
2016-01-13 09:35:51 -05:00
*
2015-04-21 17:06:21 -04:00
* @return void
*/
2015-04-09 11:45:19 -04:00
void MainFrame::BindEvents()
2015-03-31 10:19:34 -04:00
{
2015-04-30 17:10:26 -04:00
// File Menu Events
this->Bind(wxEVT_MENU, &MainFrame::OnNew, this, wxID_NEW);
this->Bind(wxEVT_MENU, &MainFrame::OnOpen, this, wxID_OPEN);
2020-07-16 10:09:19 -04:00
#ifdef TYRO_FILETREE
this->Bind(wxEVT_MENU, &MainFrame::OnOpenFolder, this, myID_OPEN_DIR);
2020-07-16 10:09:19 -04:00
#endif
this->Bind(wxEVT_MENU, &MainFrame::OnSave, this, wxID_SAVE);
this->Bind(wxEVT_MENU, &MainFrame::OnSaveAs, this, wxID_SAVEAS);
this->Bind(wxEVT_MENU, &MainFrame::OnCloseTab, this, wxID_CLOSE);
this->Bind(wxEVT_MENU, &TabContainer::OnCloseAllButThis, this->notebook, myID_CLOSE_ALL_BUT_THIS);
this->Bind(wxEVT_MENU, &TabContainer::OnCloseAll, this->notebook, myID_CLOSE_ALL);
this->Bind(wxEVT_MENU, &MainFrame::OnQuit, this, wxID_EXIT);
2016-01-13 09:35:51 -05:00
2015-04-30 17:10:26 -04:00
// Edit Menu Events
this->Bind(wxEVT_MENU, [=](wxCommandEvent& event) {
EditorPane *editor = this->notebook->GetCurrentEditor();
2016-01-13 09:35:51 -05:00
switch(event.GetId())
{
case wxID_CUT:
editor->Cut();
break;
2016-01-13 09:35:51 -05:00
case wxID_COPY:
editor->Copy();
break;
2016-01-13 09:35:51 -05:00
case wxID_PASTE:
if (editor->CanPaste()) editor->Paste();
break;
2016-01-13 09:35:51 -05:00
case wxID_SELECTALL:
editor->SelectAll();
break;
2016-01-13 09:35:51 -05:00
case wxID_UNDO:
if (editor->CanUndo()) editor->Undo();
break;
2016-01-13 09:35:51 -05:00
case wxID_REDO:
if (editor->CanRedo()) editor->Redo();
break;
2019-06-03 16:13:12 -04:00
case wxID_PREFERENCES:
this->prefFrame->Show(this);
break;
2016-01-13 09:35:51 -05:00
case wxID_FIND:
this->OnEditFind(event);
break;
2016-01-13 09:35:51 -05:00
case wxID_REPLACE:
this->OnEditReplace(event);
break;
2016-01-13 09:35:51 -05:00
default:
event.Skip(true);
break;
}
});
2016-01-13 09:35:51 -05:00
2015-04-30 17:10:26 -04:00
// View Menu Events
this->Bind(wxEVT_MENU, &MainFrame::OnToggleWhitespace, this, myID_VIEW_WHITESPACE);
this->Bind(wxEVT_MENU, &MainFrame::OnToggleLineWrap, this, myID_LINE_WRAP);
this->Bind(wxEVT_MENU, &MainFrame::OnToggleLineEndings, this, myID_VIEW_LINE_ENDINGS);
2015-04-30 17:10:26 -04:00
// Find/Replace Events
this->Bind(wxEVT_FIND, &MainFrame::OnFindDialog, this, wxID_ANY);
this->Bind(wxEVT_FIND_NEXT, &MainFrame::OnFindDialog, this, wxID_ANY);
this->Bind(wxEVT_FIND_REPLACE, &MainFrame::OnFindDialog, this, wxID_ANY);
this->Bind(wxEVT_FIND_REPLACE_ALL, &MainFrame::OnFindDialog, this, wxID_ANY);
this->Bind(wxEVT_FIND_CLOSE, [=](wxFindDialogEvent &event) {
wxLogDebug("wxEVT_FIND_CLOSE");
event.GetDialog()->Hide();
});
2016-01-13 09:35:51 -05:00
// Language Selection
this->Bind(wxEVT_MENU, &MainFrame::OnLangSelect, this, wxID_ANY);
2016-01-13 09:35:51 -05:00
2015-04-30 17:10:26 -04:00
// Help Menu Events
this->Bind(wxEVT_MENU, &MainFrame::OnAbout, this, wxID_ABOUT);
2015-03-31 10:19:34 -04:00
}
2015-05-04 20:33:01 -04:00
/**
* Create a new document
2016-01-13 09:35:51 -05:00
*
2015-05-04 20:33:01 -04:00
* @return void
2016-01-13 09:35:51 -05:00
*/
void MainFrame::OnNew(wxCommandEvent &WXUNUSED(event))
2015-03-30 14:50:10 -04:00
{
this->EnableEditControls();
this->notebook->AddTab();
2016-01-13 09:35:51 -05:00
// Make sure the layout is updated immediately
this->manager->Update();
}
2015-05-04 20:33:01 -04:00
/**
2015-05-15 16:55:18 -04:00
* Display a file open dialog, and open the selected files
2015-05-04 20:33:01 -04:00
*
* @return void
2016-01-13 09:35:51 -05:00
*/
void MainFrame::OnOpen(wxCommandEvent &WXUNUSED(event))
{
wxArrayString filelist;
2016-01-13 09:35:51 -05:00
2015-05-28 16:25:16 -04:00
wxFileDialog dlg(this, "Open file(s)", wxEmptyString, wxEmptyString,
TYRO_FILE_OPEN_WILDCARDS, wxFD_OPEN | wxFD_FILE_MUST_EXIST | wxFD_CHANGE_DIR | wxFD_MULTIPLE);
if (dlg.ShowModal() != wxID_OK) return;
2016-01-13 09:35:51 -05:00
dlg.GetPaths(filelist);
2016-01-13 09:35:51 -05:00
2015-05-15 16:55:18 -04:00
this->OpenFiles(filelist);
}
2020-07-16 10:09:19 -04:00
#ifdef TYRO_FILETREE
void MainFrame::OnOpenFolder(wxCommandEvent &event)
{
wxDirDialog dlg(this, "Select Project Dir", wxEmptyString, wxDD_DEFAULT_STYLE | wxDD_DIR_MUST_EXIST | wxDD_CHANGE_DIR);
if (dlg.ShowModal() != wxID_OK) return;
auto path = dlg.GetPath();
this->fileTreePane->CreateTree(path);
}
2020-07-16 10:09:19 -04:00
#endif
2015-05-15 16:55:18 -04:00
/**
* Open tabs containing the files passed
2016-01-13 09:35:51 -05:00
*
2015-05-15 16:55:18 -04:00
* @param wxArrayString& filelist
* @return void
*/
void MainFrame::OpenFiles(wxArrayString filelist)
{
// @TODO skip duplicated files
2015-05-15 16:55:18 -04:00
int listcount = filelist.GetCount();
2016-01-13 09:35:51 -05:00
2015-05-15 16:55:18 -04:00
if (listcount < 1) return;
2016-01-13 09:35:51 -05:00
// Open a new tab for each file
this->notebook->Freeze();
for (int i = 0; i < listcount; i++)
{
this->notebook->AddTab(filelist[i]);
}
this->notebook->Thaw();
2016-01-13 09:35:51 -05:00
this->EnableEditControls(true);
}
2015-05-04 20:33:01 -04:00
/**
* Close the current tab via the toolbar or menu
2016-01-13 09:35:51 -05:00
*
2015-05-04 20:33:01 -04:00
* @return void
2016-01-13 09:35:51 -05:00
*/
void MainFrame::OnCloseTab(wxCommandEvent &WXUNUSED(event))
{
int current_tab = this->notebook->GetSelection();
this->notebook->Freeze();
this->notebook->DeletePage(current_tab);
2016-01-13 09:35:51 -05:00
if (this->notebook->GetPageCount() == 0)
2015-04-21 10:21:02 -04:00
{
this->EnableEditControls(false);
}
2016-01-13 09:35:51 -05:00
this->notebook->Thaw();
this->manager->Update();
}
2015-05-04 20:33:01 -04:00
/**
* Close all the open tabs
*
* @return void
*/
2015-04-27 15:00:31 -04:00
void MainFrame::OnCloseAll(wxCommandEvent &WXUNUSED(event))
{
this->notebook->Freeze();
this->notebook->DeleteAllPages();
2015-04-27 15:00:31 -04:00
this->EnableEditControls(false);
this->notebook->Thaw();
2015-04-27 15:00:31 -04:00
}
2015-05-04 20:33:01 -04:00
/**
* Save the current document
*
* @param wxCommandEvent& event
* @return void
*/
void MainFrame::OnSave(wxCommandEvent &event)
{
EditorPane *editor = this->notebook->GetCurrentEditor();
2016-01-13 09:35:51 -05:00
// Check if the filename is set for the current file
if ( ! editor->fileName.IsOk())
{
this->OnSaveAs(event);
return;
}
2016-01-13 09:35:51 -05:00
editor->SaveFile();
}
2015-05-04 20:33:01 -04:00
/**
* Save the current document with a new name
*
* @return void
*/
void MainFrame::OnSaveAs(wxCommandEvent &WXUNUSED(event))
{
EditorPane *editor = this->notebook->GetCurrentEditor();
2015-04-17 16:55:48 -04:00
// If the file hasn't been changed, just return
if ( ! editor->IsModified()) return;
wxFileDialog dlg(
2016-01-13 09:35:51 -05:00
this,
"Save as...",
wxEmptyString,
2015-04-17 16:55:48 -04:00
wxEmptyString,
TYRO_FILE_SAVE_WILDCARDS,
wxFD_SAVE | wxFD_OVERWRITE_PROMPT
);
// Return if the file isn't to be saved
if (dlg.ShowModal() != wxID_OK) return;
wxString filePath = dlg.GetPath();
// Save the file
if(editor->SaveFile(filePath))
{
wxFileName fileName(filePath);
2019-05-15 16:34:01 -04:00
const wxString caption = fileName.GetFullName();
2016-01-13 09:35:51 -05:00
2015-04-17 16:55:48 -04:00
// Update the name of the tab
this->notebook->SetPageToolTip(this->notebook->GetSelection(), filePath);
this->notebook->SetPageText(this->notebook->GetSelection(), caption);
2015-04-17 16:55:48 -04:00
// Update the editor highlighting
editor->Highlight(filePath);
}
2016-01-13 09:35:51 -05:00
// Update the main view
this->manager->Update();
2016-01-13 09:35:51 -05:00
}
/**
* Close Tyro
*
* @return void
2016-01-13 09:35:51 -05:00
*/
2015-04-02 11:01:21 -04:00
void MainFrame::OnQuit(wxCommandEvent &WXUNUSED(event))
2015-03-30 14:50:10 -04:00
{
this->Destroy();
2015-04-09 13:54:28 -04:00
}
/**
* Create and show about dialog
*
* @return void
2016-01-13 09:35:51 -05:00
*/
2015-04-02 11:01:21 -04:00
void MainFrame::OnAbout(wxCommandEvent &WXUNUSED(event))
2015-03-30 14:50:10 -04:00
{
wxAboutDialogInfo info;
wxPlatformInfo plat_info;
2016-01-13 09:35:51 -05:00
info.SetName(APP_NAME);
2015-04-30 17:10:26 -04:00
info.SetVersion(APP_VERSION, APP_VERSION_MORE);
2016-01-13 09:35:51 -05:00
info.AddDeveloper("Timothy J. Warren");
info.AddArtist("Brian Smith: Main icon");
2016-01-13 09:35:51 -05:00
#ifndef __WXGTK__
info.AddArtist("http://dryicons.com: Other icons");
#endif
2016-01-13 09:35:51 -05:00
2019-06-14 10:17:21 -04:00
wxString desc = "Tyro, a text editor for all development\n\n";
2016-01-13 09:35:51 -05:00
2019-06-14 10:17:21 -04:00
desc += wxString::Format("%s %i.%i (%s)\n",
wxPlatformInfo::GetOperatingSystemIdName(plat_info.GetOperatingSystemId()),
plat_info.GetOSMajorVersion(),
2019-06-14 10:17:21 -04:00
plat_info.GetOSMinorVersion(),
wxPlatformInfo::GetArchName(plat_info.GetArchitecture()));
2016-01-13 09:35:51 -05:00
desc += wxString::Format("%s %i.%i.%i\n",
plat_info.GetPortIdName(),
wxMAJOR_VERSION,
wxMINOR_VERSION,
wxRELEASE_NUMBER
);
2016-01-13 09:35:51 -05:00
#ifdef __WXGTK__
wxLinuxDistributionInfo dist_info = wxGetLinuxDistributionInfo();
wxString desk = plat_info.GetDesktopEnvironment();
if (desk != "")
{
desc += wxString::Format("%s\n", desk);
}
2016-01-13 09:35:51 -05:00
desc += dist_info.Description;
2016-01-13 09:35:51 -05:00
if (dist_info.CodeName != "")
{
desc += " (" + dist_info.CodeName + ")\n";
}
#endif
2016-01-13 09:35:51 -05:00
if ( ! info.HasIcon())
{
wxIcon appIcon = wxIcon(tyro_icon);
info.SetIcon(appIcon);
}
info.SetDescription(desc);
2019-06-14 10:17:21 -04:00
info.SetLicence(APP_LICENSE);
2016-01-13 09:35:51 -05:00
2019-06-14 10:17:21 -04:00
info.SetCopyright("(C) 2015-2019");
2016-01-13 09:35:51 -05:00
2019-06-14 10:17:21 -04:00
wxAboutBox(info, this);
2015-03-30 14:50:10 -04:00
}
/**
* Toggle display of invisibles
2016-01-13 09:35:51 -05:00
*
* @param wxCommandEvent& event
* @return void
*/
void MainFrame::OnToggleWhitespace(wxCommandEvent& event)
{
EditorPane *editor = this->notebook->GetCurrentEditor();
2016-01-13 09:35:51 -05:00
int flag = (event.IsChecked())
? wxSTC_WS_VISIBLEALWAYS
: wxSTC_WS_INVISIBLE;
2016-01-13 09:35:51 -05:00
2015-04-27 15:00:31 -04:00
editor->SetViewWhiteSpace(flag);
}
2015-05-04 20:33:01 -04:00
/**
* Show the find dialog
2016-01-13 09:35:51 -05:00
*
2015-05-04 20:33:01 -04:00
* @return void
2016-01-13 09:35:51 -05:00
*/
void MainFrame::OnEditFind(wxCommandEvent &WXUNUSED(event))
2015-04-29 14:36:34 -04:00
{
if (this->findDlg == nullptr)
2015-04-30 17:10:26 -04:00
{
this->findData = new wxFindReplaceData(wxFR_DOWN);
this->findDlg = new wxFindReplaceDialog(this, this->findData, "Find");
2015-04-30 17:10:26 -04:00
}
2016-01-13 09:35:51 -05:00
this->findDlg->Show(true);
}
2015-05-04 20:33:01 -04:00
/**
* Show the find/replace dialog
2016-01-13 09:35:51 -05:00
*
2015-05-04 20:33:01 -04:00
* @return void
2016-01-13 09:35:51 -05:00
*/
void MainFrame::OnEditReplace(wxCommandEvent &WXUNUSED(event))
2015-04-29 14:36:34 -04:00
{
if (this->replaceDlg == nullptr)
2015-04-30 17:10:26 -04:00
{
this->findReplaceData = new wxFindReplaceData(wxFR_DOWN);
2016-01-13 09:35:51 -05:00
this->replaceDlg = new wxFindReplaceDialog(this, this->findReplaceData,
"Find and Replace", wxFR_REPLACEDIALOG);
2015-04-30 17:10:26 -04:00
}
2016-01-13 09:35:51 -05:00
this->replaceDlg->Show(true);
}
2015-04-30 17:10:26 -04:00
/**
* Handles events coming from find dialog
2016-01-13 09:35:51 -05:00
*
2015-05-04 20:33:01 -04:00
* @param wxFindDialogEvent& event
2016-01-13 09:35:51 -05:00
* @return void
2015-04-30 17:10:26 -04:00
*/
void MainFrame::OnFindDialog(wxFindDialogEvent &event)
2015-04-29 14:36:34 -04:00
{
2015-04-30 17:10:26 -04:00
wxEventType type = event.GetEventType();
EditorPane *editor = this->notebook->GetCurrentEditor();
2016-01-13 09:35:51 -05:00
2015-04-30 17:10:26 -04:00
// Parse flags
2019-05-15 16:34:01 -04:00
uint stc_flags = 0;
uint fr_flags = event.GetFlags();
2016-01-13 09:35:51 -05:00
if (fr_flags & wxFR_WHOLEWORD) stc_flags |= wxSTC_FIND_WHOLEWORD;
if (fr_flags & wxFR_MATCHCASE) stc_flags |= wxSTC_FIND_MATCHCASE;
2016-01-13 09:35:51 -05:00
// Position after search
int new_pos = 0;
2016-01-13 09:35:51 -05:00
2015-04-30 17:10:26 -04:00
// Send find flags to editor control
editor->SetSearchFlags(stc_flags);
2015-04-30 17:10:26 -04:00
if (type == wxEVT_FIND)
{
wxLogDebug("wxEVT_FIND");
2016-01-13 09:35:51 -05:00
if (editor->GetCurrentPos() < 0 || editor->GetCurrentPos() > editor->GetLastPosition())
2015-06-01 16:51:00 -04:00
{
editor->GotoPos(1);
}
2016-01-13 09:35:51 -05:00
editor->SearchAnchor();
2015-04-30 17:10:26 -04:00
}
2016-01-13 09:35:51 -05:00
if (type == wxEVT_FIND_NEXT || type == wxEVT_FIND)
2015-06-01 16:51:00 -04:00
{
if (type == wxEVT_FIND_NEXT)
2015-04-30 17:10:26 -04:00
{
2015-06-01 16:51:00 -04:00
wxLogDebug("wxEVT_FIND_NEXT");
}
2016-01-13 09:35:51 -05:00
2015-06-01 16:51:00 -04:00
new_pos = ((fr_flags & wxFR_DOWN) != 0)
? editor->SearchNext(stc_flags, event.GetFindString())
: editor->SearchPrev(stc_flags, event.GetFindString());
2016-01-13 09:35:51 -05:00
2015-06-01 16:51:00 -04:00
int sel_start = editor->GetSelectionStart();
int sel_end = editor->GetSelectionEnd();
2016-01-13 09:35:51 -05:00
if (new_pos > 0)
2015-06-01 16:51:00 -04:00
{
if ((fr_flags & wxFR_DOWN) != 0)
{
editor->GotoPos(sel_end + 1);
}
else
{
2016-01-13 09:35:51 -05:00
((sel_start - 1) > 0)
2015-06-01 16:51:00 -04:00
? editor->GotoPos(sel_start - 1)
: editor->GotoPos(sel_start);
}
2016-01-13 09:35:51 -05:00
editor->SearchAnchor();
2015-06-01 16:51:00 -04:00
editor->SetSelectionStart(sel_start);
editor->SetSelectionEnd(sel_end);
2015-04-30 17:10:26 -04:00
}
2016-01-13 09:35:51 -05:00
return;
2015-04-30 17:10:26 -04:00
}
else if (type == wxEVT_FIND_REPLACE)
{
wxLogDebug("wxEVT_FIND_REPLACE");
editor->ReplaceSelection(event.GetReplaceString());
2015-04-30 17:10:26 -04:00
}
else if (type == wxEVT_FIND_REPLACE_ALL)
{
wxLogDebug("wxEVT_FIND_REPLACE_ALL");
2016-01-13 09:35:51 -05:00
// Freeze editor drawing until replacement is finished
editor->Freeze();
2016-01-13 09:35:51 -05:00
editor->GotoPos(0); // Go to the start of the document
editor->SearchAnchor();
2016-01-13 09:35:51 -05:00
editor->BeginUndoAction();
2016-01-13 09:35:51 -05:00
while (editor->SearchNext(stc_flags, event.GetFindString()) != -1)
{
editor->ReplaceSelection(event.GetReplaceString());
}
2016-01-13 09:35:51 -05:00
editor->EndUndoAction();
2016-01-13 09:35:51 -05:00
editor->ScrollToEnd();
2016-01-13 09:35:51 -05:00
editor->Thaw();
2015-04-30 17:10:26 -04:00
}
2015-04-29 14:36:34 -04:00
}
2015-05-04 20:33:01 -04:00
/**
* Toggle line wrap
2016-01-13 09:35:51 -05:00
*
2015-05-04 20:33:01 -04:00
* @param wxCommandEvent& event
* @return void
2016-01-13 09:35:51 -05:00
*/
2015-04-29 14:36:34 -04:00
void MainFrame::OnToggleLineWrap(wxCommandEvent &event)
{
EditorPane *editor = this->notebook->GetCurrentEditor();
2015-04-29 14:36:34 -04:00
int flag = (event.IsChecked())
? wxSTC_WRAP_WORD
: wxSTC_WRAP_NONE;
2016-01-13 09:35:51 -05:00
2015-04-29 14:36:34 -04:00
editor->SetWrapMode(flag);
}
/**
* Toggle display of line ending characters
2016-01-13 09:35:51 -05:00
*
* @param wxCommandEvent& event
* @return void
*/
void MainFrame::OnToggleLineEndings(wxCommandEvent &event)
{
this->notebook->GetCurrentEditor()->SetViewEOL(event.IsChecked());
}
2015-04-21 17:06:21 -04:00
/**
* Toggle enable/disable of document-specific controls
2016-01-13 09:35:51 -05:00
*
2015-04-21 17:06:21 -04:00
* @param bool enable
* @return void
*/
void MainFrame::EnableEditControls(bool enable)
{
// Update menu items
2019-06-18 11:22:49 -04:00
auto menu_bar = (TyroMenu *) this->GetMenuBar();
menu_bar->EnableEditControls(enable);
2016-01-13 09:35:51 -05:00
// Toggle toolbar items
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);
2016-01-13 09:35:51 -05:00
// Make sure the toolbar is refreshed instantly
this->manager->Update();
}
/**
* Handle selection of highlighting language
2016-01-13 09:35:51 -05:00
*
* @param wxCommandEvent& event
* @return void
*/
void MainFrame::OnLangSelect(wxCommandEvent &event)
{
2019-05-15 16:34:01 -04:00
auto *selectedMenu = (wxMenu *) event.GetEventObject();
auto *langMenu = Glob_menu_bar->GetMenu(myLANG_MENU);
if (langMenu == nullptr)
{
wxLogDebug("Couldn't get lang menu");
// Go to the more specific event handlers
event.Skip(true);
return;
}
2015-05-14 14:59:04 -04:00
if (selectedMenu == langMenu)
{
2015-05-14 14:59:04 -04:00
wxMenuItem *sel_item = langMenu->FindChildItem(event.GetId());
wxString itemLabel = sel_item->GetItemLabelText();
2015-05-14 14:59:04 -04:00
this->notebook->GetCurrentEditor()->SetCurrentLang(itemLabel.ToStdString());
}
else
{
// Go to the more specific event handlers
event.Skip(true);
}
}
/**
* Applies settings when prefs are changed
*
* @return void
*/
void MainFrame::OnPrefsChanged()
2016-01-13 09:35:51 -05:00
{
this->notebook->Freeze();
for(size_t i = 0; i < this->notebook->GetPageCount(); i++)
{
this->notebook->GetEditor(i)->ReApplyTheme();
}
this->notebook->Thaw();
2019-05-16 15:21:32 -04:00
}