2015-04-02 18:00:50 -04:00
|
|
|
/**
|
|
|
|
* Main Application Frame
|
|
|
|
*/
|
2015-05-07 17:05:27 -04:00
|
|
|
#include "widget.h"
|
|
|
|
|
2015-05-11 19:42:33 -04:00
|
|
|
// Nasty globals
|
2015-05-12 16:30:22 -04:00
|
|
|
extern TyroMenu *Glob_menu_bar;
|
2015-05-26 15:46:55 -04:00
|
|
|
extern PrefPane *Glob_pref_pane;
|
2015-06-03 17:06:55 -04:00
|
|
|
extern wxStatusBar *Glob_status_bar;
|
|
|
|
static TabContainer *notebook = nullptr;
|
2015-06-05 16:50:52 -04:00
|
|
|
static FilePane *filePane = nullptr;
|
2015-03-30 14:50:10 -04:00
|
|
|
|
2015-05-15 19:12:00 -04:00
|
|
|
// Frame icon
|
|
|
|
#include "../../resources/xpm/tyro.xpm"
|
|
|
|
|
2015-05-11 19:42:33 -04:00
|
|
|
/**
|
|
|
|
* Constructor
|
|
|
|
*/
|
2015-04-21 10:21:02 -04:00
|
|
|
MainFrame::MainFrame(wxFrame *frame, const wxString &title)
|
2015-06-01 14:10:02 -04:00
|
|
|
: wxFrame(frame, -1, title, wxDefaultPosition, wxSize(800,600))
|
2015-04-17 12:48:00 -04:00
|
|
|
{
|
2015-05-15 16:55:18 -04:00
|
|
|
// Create the tab container
|
|
|
|
notebook = new TabContainer(this);
|
|
|
|
|
2015-06-12 16:50:27 -04:00
|
|
|
filePane = new FilePane(this, wxID_ANY, wxStandardPaths::Get().GetDocumentsDir());
|
2015-06-05 16:50:52 -04:00
|
|
|
|
2015-05-12 16:30:22 -04:00
|
|
|
// Set the frame icon
|
2015-04-27 11:33:24 -04:00
|
|
|
wxIcon app_icon(tyro_icon);
|
2015-04-17 12:48:00 -04:00
|
|
|
this->SetIcon(app_icon);
|
|
|
|
|
2015-05-11 19:42:33 -04:00
|
|
|
// Apply the menu bar to the current frame
|
2015-05-12 16:30:22 -04:00
|
|
|
this->SetMenuBar(Glob_menu_bar);
|
2015-05-07 17:05:27 -04:00
|
|
|
|
2015-06-03 17:06:55 -04:00
|
|
|
// Setup StatusBar
|
|
|
|
Glob_status_bar = new wxStatusBar(this, wxID_ANY);
|
|
|
|
Glob_status_bar->SetFieldsCount(3);
|
2015-04-09 11:45:19 -04:00
|
|
|
|
2015-05-11 19:42:33 -04:00
|
|
|
this->DoLayout();
|
2015-06-03 17:06:55 -04:00
|
|
|
|
2015-05-11 19:42:33 -04:00
|
|
|
this->BindEvents();
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Time to clean up!
|
|
|
|
*/
|
|
|
|
MainFrame::~MainFrame()
|
|
|
|
{
|
|
|
|
wxLogDebug("Main Frame Destructor Called.");
|
2015-05-26 15:46:55 -04:00
|
|
|
delete notebook;
|
2015-05-11 19:42:33 -04:00
|
|
|
delete toolBar;
|
2015-06-05 16:50:52 -04:00
|
|
|
delete filePane;
|
2015-06-03 14:32:19 -04:00
|
|
|
|
|
|
|
wxDELETE(this->findDlg);
|
|
|
|
wxDELETE(this->findData);
|
|
|
|
wxDELETE(this->replaceDlg);
|
|
|
|
wxDELETE(this->findReplaceData);
|
|
|
|
|
2015-06-03 17:06:55 -04:00
|
|
|
Glob_status_bar->Destroy();
|
|
|
|
|
2015-05-11 19:42:33 -04:00
|
|
|
manager->UnInit();
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Layout the widgets on the main frame
|
|
|
|
*
|
|
|
|
* @return void
|
|
|
|
*/
|
|
|
|
void MainFrame::DoLayout()
|
2015-05-15 16:55:18 -04:00
|
|
|
{
|
2015-05-11 19:42:33 -04:00
|
|
|
this->manager = new wxAuiManager(this);
|
2015-05-11 17:02:11 -04:00
|
|
|
this->SetupToolbar();
|
|
|
|
|
2015-05-11 19:42:33 -04:00
|
|
|
// Setup properties for each AUI pane
|
2015-05-11 17:02:11 -04:00
|
|
|
wxAuiPaneInfo toolBarPaneInfo;
|
2015-05-12 14:09:40 -04:00
|
|
|
toolBarPaneInfo
|
|
|
|
.Top()
|
|
|
|
.ToolbarPane()
|
|
|
|
.Gripper(false)
|
|
|
|
.DockFixed(true)
|
|
|
|
.Resizable(true);
|
2015-05-11 19:42:33 -04:00
|
|
|
this->manager->AddPane(toolBar, toolBarPaneInfo);
|
2015-05-11 17:02:11 -04:00
|
|
|
|
2015-06-05 16:50:52 -04:00
|
|
|
wxAuiPaneInfo filePaneInfo;
|
|
|
|
filePaneInfo.Left()
|
|
|
|
.MinSize(225, 550)
|
|
|
|
.RightDockable(true)
|
|
|
|
.LeftDockable(true)
|
|
|
|
.Resizable(true);
|
|
|
|
this->manager->AddPane(filePane, filePaneInfo);
|
|
|
|
|
2015-05-11 17:02:11 -04:00
|
|
|
wxAuiPaneInfo notebookPaneInfo;
|
|
|
|
notebookPaneInfo.CenterPane();
|
2015-05-11 19:42:33 -04:00
|
|
|
this->manager->AddPane(notebook, notebookPaneInfo);
|
2015-04-09 11:45:19 -04:00
|
|
|
|
2015-06-03 17:06:55 -04:00
|
|
|
wxAuiPaneInfo statusPaneInfo;
|
|
|
|
statusPaneInfo.Bottom()
|
|
|
|
.ToolbarPane()
|
|
|
|
.Gripper(false)
|
|
|
|
.DockFixed(true)
|
|
|
|
.Resizable(true);
|
|
|
|
this->manager->AddPane(Glob_status_bar, statusPaneInfo);
|
|
|
|
|
2015-05-11 19:42:33 -04:00
|
|
|
// Update everything
|
2015-04-21 10:09:39 -04:00
|
|
|
this->EnableEditControls(false);
|
2015-05-07 17:05:27 -04:00
|
|
|
}
|
2015-04-01 10:11:56 -04:00
|
|
|
|
2015-05-11 19:42:33 -04:00
|
|
|
/**
|
|
|
|
* Create the status bar
|
|
|
|
*
|
|
|
|
* @return void
|
|
|
|
*/
|
2015-04-02 11:01:21 -04:00
|
|
|
void MainFrame::SetupStatusBar()
|
2015-04-01 15:15:29 -04:00
|
|
|
{
|
2015-05-12 16:30:22 -04:00
|
|
|
CreateStatusBar(3);
|
2015-04-01 15:15:29 -04:00
|
|
|
}
|
|
|
|
|
2015-04-21 17:06:21 -04:00
|
|
|
/**
|
|
|
|
* Create the main toolbar
|
|
|
|
*
|
|
|
|
* @return void
|
|
|
|
*/
|
2015-04-02 11:01:21 -04:00
|
|
|
void MainFrame::SetupToolbar()
|
2015-04-01 15:15:29 -04:00
|
|
|
{
|
2015-04-02 14:20:35 -04:00
|
|
|
// Icon files
|
2015-05-12 16:30:22 -04:00
|
|
|
#ifndef __WXGTK__
|
2015-05-11 17:02:11 -04: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 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);
|
2015-05-12 16:30:22 -04:00
|
|
|
#else
|
2015-04-17 12:48:00 -04:00
|
|
|
wxBitmap new_file_icon = wxArtProvider::GetBitmap(wxART_NEW, wxART_TOOLBAR);
|
|
|
|
wxBitmap open_file_icon = wxArtProvider::GetBitmap(wxART_FILE_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);
|
2015-04-16 09:37:20 -04:00
|
|
|
#endif
|
|
|
|
|
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");
|
|
|
|
toolBar->AddTool(wxID_SAVE, "Save", save_file_icon, "Save file");
|
2015-05-12 14:09:40 -04:00
|
|
|
|
2015-04-15 12:17:25 -04:00
|
|
|
toolBar->AddSeparator();
|
2015-05-12 14:09:40 -04: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();
|
|
|
|
|
2015-04-02 14:20:35 -04:00
|
|
|
toolBar->Realize();
|
2015-04-01 15:15:29 -04:00
|
|
|
}
|
|
|
|
|
2015-04-21 17:06:21 -04:00
|
|
|
/**
|
|
|
|
* Bind event handlers
|
|
|
|
*
|
|
|
|
* @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
|
2015-06-12 16:50:27 -04:00
|
|
|
this->Bind(wxEVT_MENU, &MainFrame::OnNew, this, wxID_NEW);
|
|
|
|
this->Bind(wxEVT_MENU, &MainFrame::OnOpen, this, wxID_OPEN);
|
|
|
|
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, notebook, myID_CLOSE_ALL_BUT_THIS);
|
|
|
|
this->Bind(wxEVT_MENU, &TabContainer::OnCloseAll, notebook, myID_CLOSE_ALL);
|
|
|
|
this->Bind(wxEVT_MENU, &MainFrame::OnQuit, this, wxID_EXIT);
|
2015-04-30 17:10:26 -04:00
|
|
|
|
|
|
|
// Edit Menu Events
|
2015-06-01 14:10:02 -04:00
|
|
|
this->Bind(wxEVT_MENU, [=](wxCommandEvent& event) {
|
|
|
|
EditPane *editor = notebook->GetCurrentEditor();
|
|
|
|
|
|
|
|
switch(event.GetId())
|
|
|
|
{
|
|
|
|
case wxID_CUT:
|
|
|
|
editor->Cut();
|
|
|
|
break;
|
|
|
|
|
|
|
|
case wxID_COPY:
|
|
|
|
editor->Copy();
|
|
|
|
break;
|
|
|
|
|
|
|
|
case wxID_PASTE:
|
|
|
|
if (editor->CanPaste()) editor->Paste();
|
|
|
|
break;
|
|
|
|
|
|
|
|
case wxID_SELECTALL:
|
|
|
|
editor->SelectAll();
|
|
|
|
break;
|
|
|
|
|
|
|
|
case wxID_UNDO:
|
|
|
|
if (editor->CanUndo()) editor->Undo();
|
|
|
|
break;
|
|
|
|
|
|
|
|
case wxID_REDO:
|
|
|
|
if (editor->CanRedo()) editor->Redo();
|
|
|
|
break;
|
|
|
|
|
|
|
|
case wxID_PREFERENCES:
|
|
|
|
Glob_pref_pane->Show(this);
|
|
|
|
break;
|
|
|
|
|
|
|
|
case wxID_FIND:
|
|
|
|
this->OnEditFind(event);
|
|
|
|
break;
|
|
|
|
|
|
|
|
case wxID_REPLACE:
|
|
|
|
this->OnEditReplace(event);
|
|
|
|
break;
|
|
|
|
|
|
|
|
default:
|
|
|
|
event.Skip(true);
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
});
|
2015-04-30 17:10:26 -04:00
|
|
|
|
|
|
|
// View Menu Events
|
2015-06-12 16:50:27 -04:00
|
|
|
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-05-07 17:05:27 -04:00
|
|
|
|
2015-04-30 17:10:26 -04:00
|
|
|
// Find/Replace Events
|
2015-06-12 16:50:27 -04:00
|
|
|
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);
|
2015-06-03 09:24:08 -04:00
|
|
|
this->Bind(wxEVT_FIND_CLOSE, [=](wxFindDialogEvent &event) {
|
|
|
|
wxLogDebug("wxEVT_FIND_CLOSE");
|
|
|
|
event.GetDialog()->Hide();
|
|
|
|
});
|
2015-04-30 17:10:26 -04:00
|
|
|
|
2015-05-13 16:55:44 -04:00
|
|
|
// Language Selection
|
2015-06-12 16:50:27 -04:00
|
|
|
this->Bind(wxEVT_MENU, &MainFrame::OnLangSelect, this, wxID_ANY);
|
2015-05-13 16:55:44 -04:00
|
|
|
|
2015-04-30 17:10:26 -04:00
|
|
|
// Help Menu Events
|
2015-06-12 16:50:27 -04:00
|
|
|
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
|
|
|
|
*
|
|
|
|
* @return void
|
|
|
|
*/
|
2015-04-09 17:16:28 -04:00
|
|
|
void MainFrame::OnNew(wxCommandEvent &WXUNUSED(event))
|
2015-03-30 14:50:10 -04:00
|
|
|
{
|
2015-04-13 16:48:41 -04:00
|
|
|
this->EnableEditControls();
|
2015-04-09 17:16:28 -04:00
|
|
|
notebook->AddTab();
|
2015-05-11 19:42:33 -04:00
|
|
|
|
|
|
|
// Make sure the layout is updated immediately
|
|
|
|
this->manager->Update();
|
2015-03-31 22:52:12 -04:00
|
|
|
}
|
|
|
|
|
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
|
|
|
|
*/
|
2015-04-09 17:16:28 -04:00
|
|
|
void MainFrame::OnOpen(wxCommandEvent &WXUNUSED(event))
|
2015-04-02 18:00:50 -04:00
|
|
|
{
|
2015-04-23 16:40:59 -04:00
|
|
|
wxArrayString filelist;
|
2015-04-09 17:16:28 -04:00
|
|
|
|
2015-05-28 16:25:16 -04:00
|
|
|
wxFileDialog dlg(this, "Open file(s)", wxEmptyString, wxEmptyString,
|
2015-04-23 16:40:59 -04:00
|
|
|
TYRO_FILE_OPEN_WILDCARDS, wxFD_OPEN | wxFD_FILE_MUST_EXIST | wxFD_CHANGE_DIR | wxFD_MULTIPLE);
|
2015-04-09 17:16:28 -04:00
|
|
|
|
|
|
|
if (dlg.ShowModal() != wxID_OK) return;
|
|
|
|
|
2015-04-23 16:40:59 -04:00
|
|
|
dlg.GetPaths(filelist);
|
2015-05-15 16:55:18 -04:00
|
|
|
|
|
|
|
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;
|
2015-04-09 17:16:28 -04:00
|
|
|
|
2015-04-23 16:40:59 -04:00
|
|
|
// Open a new tab for each file
|
2015-05-28 16:25:16 -04:00
|
|
|
notebook->Freeze();
|
2015-04-23 16:40:59 -04:00
|
|
|
for (int i = 0; i < listcount; i++)
|
|
|
|
{
|
|
|
|
notebook->AddTab(filelist[i]);
|
|
|
|
}
|
2015-05-28 16:25:16 -04:00
|
|
|
notebook->Thaw();
|
2015-04-13 16:48:41 -04:00
|
|
|
|
2015-05-07 18:13:45 -04:00
|
|
|
this->EnableEditControls(true);
|
2015-04-20 17:02:34 -04:00
|
|
|
}
|
|
|
|
|
2015-05-04 20:33:01 -04:00
|
|
|
/**
|
|
|
|
* Close the current tab via the toolbar or menu
|
|
|
|
*
|
|
|
|
* @return void
|
|
|
|
*/
|
2015-04-16 17:03:27 -04:00
|
|
|
void MainFrame::OnCloseTab(wxCommandEvent &WXUNUSED(event))
|
2015-04-09 17:16:28 -04:00
|
|
|
{
|
2015-04-16 17:03:27 -04:00
|
|
|
int current_tab = notebook->GetSelection();
|
|
|
|
|
2015-05-15 16:55:18 -04:00
|
|
|
notebook->Freeze();
|
2015-04-16 17:03:27 -04:00
|
|
|
notebook->DeletePage(current_tab);
|
2015-04-21 10:21:02 -04:00
|
|
|
|
|
|
|
if (notebook->GetPageCount() == 0)
|
|
|
|
{
|
|
|
|
this->EnableEditControls(false);
|
|
|
|
}
|
2015-05-11 19:42:33 -04:00
|
|
|
|
2015-05-15 16:55:18 -04:00
|
|
|
notebook->Thaw();
|
2015-05-11 19:42:33 -04:00
|
|
|
this->manager->Update();
|
2015-04-09 17:16:28 -04:00
|
|
|
}
|
|
|
|
|
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))
|
|
|
|
{
|
2015-05-15 16:55:18 -04:00
|
|
|
notebook->Freeze();
|
2015-04-27 15:00:31 -04:00
|
|
|
notebook->DeleteAllPages();
|
|
|
|
this->EnableEditControls(false);
|
2015-05-15 16:55:18 -04:00
|
|
|
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
|
|
|
|
*/
|
2015-04-30 19:35:21 -04:00
|
|
|
void MainFrame::OnSave(wxCommandEvent &event)
|
2015-04-09 17:16:28 -04:00
|
|
|
{
|
2015-04-15 21:26:09 -04:00
|
|
|
EditPane *editor = notebook->GetCurrentEditor();
|
2015-04-30 19:35:21 -04:00
|
|
|
|
|
|
|
// Check if the filename is set for the current file
|
|
|
|
if ( ! editor->fileName.IsOk())
|
|
|
|
{
|
|
|
|
this->OnSaveAs(event);
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2015-04-17 12:48:00 -04:00
|
|
|
editor->SaveFile();
|
2015-04-09 17:16:28 -04:00
|
|
|
}
|
|
|
|
|
2015-05-04 20:33:01 -04:00
|
|
|
/**
|
|
|
|
* Save the current document with a new name
|
|
|
|
*
|
|
|
|
* @return void
|
|
|
|
*/
|
2015-04-09 17:16:28 -04:00
|
|
|
void MainFrame::OnSaveAs(wxCommandEvent &WXUNUSED(event))
|
|
|
|
{
|
2015-04-17 16:55:48 -04:00
|
|
|
EditPane *editor = notebook->GetCurrentEditor();
|
|
|
|
|
|
|
|
// If the file hasn't been changed, just return
|
|
|
|
if ( ! editor->IsModified()) return;
|
|
|
|
|
|
|
|
wxFileDialog dlg(
|
|
|
|
this,
|
|
|
|
"Save as...",
|
|
|
|
wxEmptyString,
|
|
|
|
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);
|
|
|
|
const wxString fullPath = filePath;
|
|
|
|
const wxString caption= fileName.GetFullName();
|
|
|
|
|
|
|
|
// Update the name of the tab
|
|
|
|
notebook->SetPageToolTip(notebook->GetSelection(), fullPath);
|
|
|
|
notebook->SetPageText(notebook->GetSelection(), caption);
|
|
|
|
|
|
|
|
// Update the editor highlighting
|
|
|
|
editor->Highlight(filePath);
|
|
|
|
}
|
2015-05-11 19:42:33 -04:00
|
|
|
|
|
|
|
// Update the main view
|
|
|
|
this->manager->Update();
|
2015-04-13 13:01:25 -04:00
|
|
|
}
|
2015-04-02 18:00:50 -04:00
|
|
|
|
2015-05-11 19:42:33 -04:00
|
|
|
/**
|
|
|
|
* Close Tyro
|
|
|
|
*
|
|
|
|
* @return void
|
|
|
|
*/
|
2015-04-02 11:01:21 -04:00
|
|
|
void MainFrame::OnQuit(wxCommandEvent &WXUNUSED(event))
|
2015-03-30 14:50:10 -04:00
|
|
|
{
|
2015-06-01 14:10:02 -04:00
|
|
|
this->Destroy();
|
2015-04-09 13:54:28 -04:00
|
|
|
}
|
|
|
|
|
2015-05-11 19:42:33 -04:00
|
|
|
/**
|
|
|
|
* Create and show about dialog
|
|
|
|
*
|
|
|
|
* @return void
|
|
|
|
*/
|
2015-04-02 11:01:21 -04:00
|
|
|
void MainFrame::OnAbout(wxCommandEvent &WXUNUSED(event))
|
2015-03-30 14:50:10 -04:00
|
|
|
{
|
2015-04-09 17:16:28 -04:00
|
|
|
wxAboutDialogInfo info;
|
2015-06-12 16:50:27 -04:00
|
|
|
wxPlatformInfo plat_info;
|
2015-04-09 17:16:28 -04:00
|
|
|
|
2015-04-17 12:48:00 -04:00
|
|
|
info.SetName(APP_NAME);
|
2015-04-30 17:10:26 -04:00
|
|
|
info.SetVersion(APP_VERSION, APP_VERSION_MORE);
|
2015-04-09 17:16:28 -04:00
|
|
|
|
2015-05-11 19:42:33 -04:00
|
|
|
info.AddDeveloper("Tim Warren");
|
2015-05-13 16:55:44 -04:00
|
|
|
info.AddArtist("Brian Smith: Main icon");
|
2015-06-12 16:50:27 -04:00
|
|
|
|
|
|
|
#ifndef __WXGTK__
|
2015-05-13 16:55:44 -04:00
|
|
|
info.AddArtist("http://dryicons.com: Other icons");
|
2015-06-12 16:50:27 -04:00
|
|
|
#endif
|
|
|
|
|
|
|
|
wxString desc = "Tyro, a text editor for all development\n\n"
|
|
|
|
"System info: \n";
|
|
|
|
|
|
|
|
desc += wxString::Format("Architecture: %s\n",
|
|
|
|
wxPlatformInfo::GetArchName(plat_info.GetArchitecture()));
|
|
|
|
|
|
|
|
desc += wxString::Format("Operating System:\n\t%s %i.%i\n",
|
|
|
|
wxPlatformInfo::GetOperatingSystemIdName(plat_info.GetOperatingSystemId()),
|
|
|
|
plat_info.GetOSMajorVersion(),
|
|
|
|
plat_info.GetOSMinorVersion());
|
|
|
|
|
|
|
|
desc += wxString::Format("wxWidgets version: %s %i.%i.%i\n",
|
|
|
|
plat_info.GetPortIdName(),
|
|
|
|
wxMAJOR_VERSION,
|
|
|
|
wxMINOR_VERSION,
|
|
|
|
wxRELEASE_NUMBER
|
|
|
|
);
|
|
|
|
|
|
|
|
#ifdef __WXGTK__
|
|
|
|
wxLinuxDistributionInfo dist_info = wxGetLinuxDistributionInfo();
|
|
|
|
wxString desk = plat_info.GetDesktopEnvironment();
|
|
|
|
if (desk != "")
|
|
|
|
{
|
|
|
|
desc += wxString::Format("Desktop Environment:%s\n", desk);
|
|
|
|
}
|
|
|
|
|
|
|
|
desc += "Distro: ";
|
|
|
|
desc += dist_info.Description;
|
|
|
|
|
|
|
|
if (dist_info.CodeName != "")
|
|
|
|
{
|
|
|
|
desc += " (" + dist_info.CodeName + ")\n";
|
|
|
|
}
|
|
|
|
#endif
|
|
|
|
|
|
|
|
info.SetDescription(desc);
|
2015-04-09 17:16:28 -04:00
|
|
|
|
2015-04-27 15:00:31 -04:00
|
|
|
info.SetCopyright(" (C) 2015");
|
2015-04-09 17:16:28 -04:00
|
|
|
|
2015-04-13 13:01:25 -04:00
|
|
|
wxAboutBox(info);
|
2015-03-30 14:50:10 -04:00
|
|
|
}
|
2015-04-13 16:48:41 -04:00
|
|
|
|
2015-04-23 16:40:59 -04:00
|
|
|
/**
|
|
|
|
* Toggle display of invisibles
|
|
|
|
*
|
|
|
|
* @param wxCommandEvent& event
|
|
|
|
* @return void
|
|
|
|
*/
|
|
|
|
void MainFrame::OnToggleWhitespace(wxCommandEvent& event)
|
|
|
|
{
|
2015-04-27 15:00:31 -04:00
|
|
|
EditPane *editor = notebook->GetCurrentEditor();
|
2015-04-23 16:40:59 -04:00
|
|
|
int flag = (event.IsChecked())
|
|
|
|
? wxSTC_WS_VISIBLEALWAYS
|
|
|
|
: wxSTC_WS_INVISIBLE;
|
|
|
|
|
2015-04-27 15:00:31 -04:00
|
|
|
editor->SetViewWhiteSpace(flag);
|
2015-04-23 16:40:59 -04:00
|
|
|
}
|
|
|
|
|
2015-05-04 20:33:01 -04:00
|
|
|
/**
|
|
|
|
* Show the find dialog
|
|
|
|
*
|
|
|
|
* @return void
|
|
|
|
*/
|
2015-04-30 17:10:26 -04:00
|
|
|
void MainFrame::OnEditFind(wxCommandEvent &WXUNUSED(event))
|
2015-04-29 14:36:34 -04:00
|
|
|
{
|
2015-06-03 14:32:19 -04:00
|
|
|
if (this->findDlg == nullptr)
|
2015-04-30 17:10:26 -04:00
|
|
|
{
|
2015-06-01 14:10:02 -04:00
|
|
|
this->findData = new wxFindReplaceData(wxFR_DOWN);
|
|
|
|
this->findDlg = new wxFindReplaceDialog(this, this->findData, "Find");
|
2015-04-30 17:10:26 -04:00
|
|
|
}
|
2015-06-03 14:32:19 -04:00
|
|
|
|
|
|
|
this->findDlg->Show(true);
|
2015-04-28 14:58:52 -04:00
|
|
|
}
|
|
|
|
|
2015-05-04 20:33:01 -04:00
|
|
|
/**
|
|
|
|
* Show the find/replace dialog
|
|
|
|
*
|
|
|
|
* @return void
|
|
|
|
*/
|
2015-04-30 17:10:26 -04:00
|
|
|
void MainFrame::OnEditReplace(wxCommandEvent &WXUNUSED(event))
|
2015-04-29 14:36:34 -04:00
|
|
|
{
|
2015-06-03 14:32:19 -04:00
|
|
|
if (this->replaceDlg == nullptr)
|
2015-04-30 17:10:26 -04:00
|
|
|
{
|
2015-05-26 15:46:55 -04:00
|
|
|
this->findReplaceData = new wxFindReplaceData(wxFR_DOWN);
|
2015-06-01 14:10:02 -04:00
|
|
|
this->replaceDlg = new wxFindReplaceDialog(this, this->findReplaceData,
|
2015-05-05 19:45:08 -04:00
|
|
|
"Find and Replace", wxFR_REPLACEDIALOG);
|
2015-04-30 17:10:26 -04:00
|
|
|
}
|
2015-06-03 14:32:19 -04:00
|
|
|
|
|
|
|
this->replaceDlg->Show(true);
|
2015-04-28 14:58:52 -04:00
|
|
|
}
|
|
|
|
|
2015-04-30 17:10:26 -04:00
|
|
|
/**
|
|
|
|
* Handles events coming from find dialog
|
2015-05-04 20:33:01 -04:00
|
|
|
*
|
|
|
|
* @param wxFindDialogEvent& event
|
|
|
|
* @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();
|
|
|
|
EditPane *editor = notebook->GetCurrentEditor();
|
|
|
|
|
|
|
|
// Parse flags
|
|
|
|
int stc_flags = 0;
|
|
|
|
int fr_flags = event.GetFlags();
|
|
|
|
|
2015-05-04 16:27:21 -04:00
|
|
|
if (fr_flags & wxFR_WHOLEWORD) stc_flags |= wxSTC_FIND_WHOLEWORD;
|
|
|
|
if (fr_flags & wxFR_MATCHCASE) stc_flags |= wxSTC_FIND_MATCHCASE;
|
|
|
|
|
|
|
|
// Position after search
|
|
|
|
int new_pos = 0;
|
2015-04-30 17:10:26 -04:00
|
|
|
|
|
|
|
// Send find flags to editor control
|
|
|
|
editor->SetSearchFlags(stc_flags);
|
2015-06-03 09:24:08 -04:00
|
|
|
|
2015-04-30 17:10:26 -04:00
|
|
|
if (type == wxEVT_FIND)
|
|
|
|
{
|
2015-05-04 16:27:21 -04:00
|
|
|
wxLogDebug("wxEVT_FIND");
|
|
|
|
|
2015-06-03 09:24:08 -04:00
|
|
|
if (editor->GetCurrentPos() < 0 || editor->GetCurrentPos() > editor->GetLastPosition())
|
2015-06-01 16:51:00 -04:00
|
|
|
{
|
|
|
|
editor->GotoPos(1);
|
2015-06-03 09:24:08 -04:00
|
|
|
}
|
2015-06-01 16:51:00 -04:00
|
|
|
|
2015-05-04 16:27:21 -04:00
|
|
|
editor->SearchAnchor();
|
2015-04-30 17:10:26 -04:00
|
|
|
}
|
2015-05-26 15:46:55 -04: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");
|
2015-05-04 16:27:21 -04: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());
|
|
|
|
|
|
|
|
int sel_start = editor->GetSelectionStart();
|
|
|
|
int sel_end = editor->GetSelectionEnd();
|
|
|
|
|
2015-05-26 15:46:55 -04: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
|
|
|
|
{
|
|
|
|
((sel_start - 1) > 0)
|
|
|
|
? editor->GotoPos(sel_start - 1)
|
|
|
|
: editor->GotoPos(sel_start);
|
|
|
|
}
|
|
|
|
|
2015-05-26 15:46:55 -04: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
|
|
|
}
|
2015-05-26 15:46:55 -04:00
|
|
|
|
|
|
|
return;
|
2015-04-30 17:10:26 -04:00
|
|
|
}
|
|
|
|
else if (type == wxEVT_FIND_REPLACE)
|
|
|
|
{
|
2015-05-04 16:27:21 -04:00
|
|
|
wxLogDebug("wxEVT_FIND_REPLACE");
|
2015-05-26 15:46:55 -04:00
|
|
|
editor->ReplaceSelection(event.GetReplaceString());
|
2015-04-30 17:10:26 -04:00
|
|
|
}
|
|
|
|
else if (type == wxEVT_FIND_REPLACE_ALL)
|
|
|
|
{
|
2015-05-04 16:27:21 -04:00
|
|
|
wxLogDebug("wxEVT_FIND_REPLACE_ALL");
|
2015-06-03 14:32:19 -04:00
|
|
|
|
|
|
|
// Freeze editor drawing until replacement is finished
|
|
|
|
editor->Freeze();
|
|
|
|
|
|
|
|
editor->GotoPos(0); // Go to the start of the document
|
|
|
|
editor->SearchAnchor();
|
|
|
|
|
|
|
|
editor->BeginUndoAction();
|
|
|
|
|
|
|
|
while (editor->SearchNext(stc_flags, event.GetFindString()) != -1)
|
|
|
|
{
|
|
|
|
editor->ReplaceSelection(event.GetReplaceString());
|
|
|
|
}
|
|
|
|
|
|
|
|
editor->EndUndoAction();
|
|
|
|
|
|
|
|
editor->ScrollToEnd();
|
|
|
|
|
|
|
|
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
|
|
|
|
*
|
|
|
|
* @param wxCommandEvent& event
|
|
|
|
* @return void
|
|
|
|
*/
|
2015-04-29 14:36:34 -04:00
|
|
|
void MainFrame::OnToggleLineWrap(wxCommandEvent &event)
|
|
|
|
{
|
|
|
|
EditPane *editor = notebook->GetCurrentEditor();
|
|
|
|
int flag = (event.IsChecked())
|
|
|
|
? wxSTC_WRAP_WORD
|
|
|
|
: wxSTC_WRAP_NONE;
|
|
|
|
|
|
|
|
editor->SetWrapMode(flag);
|
2015-04-28 14:58:52 -04:00
|
|
|
}
|
|
|
|
|
2015-04-30 19:35:21 -04:00
|
|
|
/**
|
|
|
|
* Toggle display of line ending characters
|
|
|
|
*
|
|
|
|
* @param wxCommandEvent& event
|
|
|
|
* @return void
|
|
|
|
*/
|
|
|
|
void MainFrame::OnToggleLineEndings(wxCommandEvent &event)
|
|
|
|
{
|
|
|
|
notebook->GetCurrentEditor()->SetViewEOL(event.IsChecked());
|
|
|
|
}
|
|
|
|
|
2015-04-21 17:06:21 -04:00
|
|
|
/**
|
|
|
|
* Toggle enable/disable of document-specific controls
|
|
|
|
*
|
|
|
|
* @param bool enable
|
|
|
|
* @return void
|
|
|
|
*/
|
2015-04-21 10:09:39 -04:00
|
|
|
void MainFrame::EnableEditControls(bool enable)
|
2015-04-13 16:48:41 -04:00
|
|
|
{
|
2015-05-11 19:42:33 -04:00
|
|
|
// Update menu items
|
2015-05-12 16:30:22 -04:00
|
|
|
Glob_menu_bar->EnableEditControls(enable);
|
2015-05-11 19:42:33 -04:00
|
|
|
|
|
|
|
// Toggle toolbar items
|
2015-04-23 16:40:59 -04:00
|
|
|
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);
|
2015-05-11 19:42:33 -04:00
|
|
|
|
|
|
|
// Make sure the toolbar is refreshed instantly
|
|
|
|
this->manager->Update();
|
2015-04-21 10:09:39 -04:00
|
|
|
}
|
2015-05-13 16:55:44 -04:00
|
|
|
|
|
|
|
/**
|
|
|
|
* Handle selection of highlighting language
|
|
|
|
*
|
|
|
|
* @param wxCommandEvent& event
|
|
|
|
* @return void
|
|
|
|
*/
|
|
|
|
void MainFrame::OnLangSelect(wxCommandEvent &event)
|
|
|
|
{
|
2015-05-14 14:59:04 -04:00
|
|
|
wxMenu *selectedMenu = (wxMenu *) event.GetEventObject();
|
2015-05-13 16:55:44 -04:00
|
|
|
wxMenu *langMenu = Glob_menu_bar->GetMenu(myLANG_MENU);
|
2015-05-14 14:59:04 -04:00
|
|
|
if (langMenu == NULL) wxLogDebug("Couldn't get lang menu");
|
|
|
|
|
|
|
|
if (selectedMenu == langMenu)
|
2015-05-13 16:55:44 -04:00
|
|
|
{
|
2015-05-14 14:59:04 -04:00
|
|
|
wxMenuItem *sel_item = langMenu->FindChildItem(event.GetId());
|
2015-05-13 16:55:44 -04:00
|
|
|
wxString itemLabel = sel_item->GetItemLabelText();
|
2015-05-14 14:59:04 -04:00
|
|
|
|
2015-05-13 16:55:44 -04:00
|
|
|
notebook->GetCurrentEditor()->SetCurrentLang(itemLabel.ToStdString());
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
// Go to the more specific event handlers
|
|
|
|
event.Skip(true);
|
|
|
|
}
|
|
|
|
}
|
2015-05-26 15:46:55 -04:00
|
|
|
|
2015-05-27 11:37:02 -04:00
|
|
|
/**
|
|
|
|
* Applies settings when prefs are changed
|
|
|
|
*
|
|
|
|
* @return void
|
|
|
|
*/
|
|
|
|
void MainFrame::OnPrefsChanged(wxCommandEvent &WXUNUSED(event))
|
2015-05-28 16:25:16 -04:00
|
|
|
{
|
2015-05-27 11:37:02 -04:00
|
|
|
EditPane *editor;
|
|
|
|
|
2015-05-28 16:25:16 -04:00
|
|
|
notebook->Freeze();
|
2015-05-27 11:37:02 -04:00
|
|
|
for(size_t i = 0; i < notebook->GetPageCount(); i++)
|
|
|
|
{
|
|
|
|
editor = notebook->GetEditor(i);
|
|
|
|
editor->ReApplyTheme();
|
|
|
|
}
|
2015-05-28 16:25:16 -04:00
|
|
|
notebook->Thaw();
|
2015-05-27 11:37:02 -04:00
|
|
|
}
|