Tyro/src/widgets/TabContainer.cpp

205 lines
4.4 KiB
C++
Raw Normal View History

/**
* Wrapper around wxAuiNotebook
*/
#include "widget.h"
extern MainFrame *Glob_main_frame;
extern TyroMenu *Glob_menu_bar;
static unsigned long untitled_document_count = 0;
/**
* Constructor
*
* @param wxWindow* parent
* @param wxWindowID id
* @param const wxPoint& pos
* @param const wxSize& size
* @param long style
*/
TabContainer::TabContainer(
wxWindow* parent,
wxWindowID id,
const wxPoint& pos,
const wxSize& size,
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);
}
/**
* Destructor
*/
TabContainer::~TabContainer()
{
wxLogDebug("TabContainer destructor called");
}
2015-04-21 17:06:21 -04:00
/**
* Add a new blank document
*
* @return void
*/
void TabContainer::AddTab()
{
untitled_document_count++;
wxString caption;
2015-04-10 15:11:15 -04:00
caption.Printf("Untitled %lu", untitled_document_count);
2015-04-10 15:11:15 -04:00
2015-04-09 11:45:19 -04:00
EditPane *editor = new EditPane(this, wxID_ANY);
2015-04-10 15:11:15 -04:00
2015-04-15 12:17:25 -04:00
this->AddPage(editor, caption, true);
}
2015-04-21 17:06:21 -04:00
/**
* Open an existing document
*
* @param wxString filePath
* @return void
*/
void TabContainer::AddTab(wxString filePath)
{
2015-04-10 15:11:15 -04:00
wxFileName fileName(filePath);
wxString caption= fileName.GetFullName();
2015-04-09 11:45:19 -04:00
EditPane *editor = new EditPane(this, wxID_ANY);
2015-04-17 16:55:48 -04:00
if (editor->Load(filePath))
2015-04-10 15:11:15 -04:00
{
2015-04-15 12:17:25 -04:00
this->AddPage(editor, caption, true);
2015-04-17 16:55:48 -04:00
this->SetPageToolTip(this->GetPageIndex(this->GetCurrentPage()), fileName.GetFullPath());
// Select the appropriate language in the language menu
Glob_menu_bar->SetCurrentLanguage(editor->GetCurrentLang());
2015-04-17 16:55:48 -04:00
return;
2015-04-10 15:11:15 -04:00
}
2015-04-17 16:55:48 -04:00
wxLogDebug("Failed to load file!?");
2015-04-09 11:45:19 -04:00
}
2015-04-21 17:06:21 -04:00
/**
* Get the EditPane control in the current tab
*
* @return *EditPane
*/
2015-04-09 13:27:30 -04:00
EditPane *TabContainer::GetCurrentEditor()
2015-04-09 11:45:19 -04:00
{
2015-04-09 13:27:30 -04:00
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)
{
Glob_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();
Glob_main_frame->EnableEditControls(false);
}
/**
* Update menu state when switching tabs
*
* @param wxAuiNotebookEvent& event
* @return void
*/
void TabContainer::OnTabSwitch(wxAuiNotebookEvent &event)
{
EditPane *editor = this->GetEditor(event.GetSelection());
// Update view menu options
Glob_menu_bar->SetIdChecked(myID_VIEW_WHITESPACE, (editor->GetViewWhiteSpace() == wxSTC_WS_VISIBLEALWAYS));
Glob_menu_bar->SetIdChecked(myID_VIEW_LINE_ENDINGS, editor->GetViewEOL());
Glob_menu_bar->SetIdChecked(myID_LINE_WRAP, (editor->GetWrapMode() == wxSTC_WRAP_WORD));
// Update language menu selection
Glob_menu_bar->SetCurrentLanguage(editor->GetCurrentLang());
}