File loading and saving checks

This commit is contained in:
Tim Warren 2015-04-17 16:55:48 -04:00
parent 3415733eff
commit 34ccd73350
7 changed files with 173 additions and 41 deletions

View File

@ -16,8 +16,8 @@ WX_RES = $(shell wx-config --rescomp)
LDLIBS = $(TARGET)
DEV_CXXFLAGS = -g -Wall -Wextra
CXXFLAGS = -Os -s
DEV_CXXFLAGS = -g -Wall -Wextra -DDEBUG
CXXFLAGS = -Os -DNDEBUG
TEST_SRC = $(wildcard tests/*.cpp)
TESTS = $(patsubst %.cpp,%,$(TEST_SRC))

View File

@ -15,9 +15,7 @@ A Cross-platform Code Editor
Required packages:
* build-essential
* libwxgtk3.0-0
* libwxgtk3.0-dev
* libssh2-1
* libssh2-1-dev
Optional:

View File

@ -10,6 +10,12 @@ const wxString APP_NAME = "Tyro";
const wxString APP_VENDOR = "Aviat Ion";
const wxString APP_VERSION = "0.0.1";
// Some boilerplate text
const wxString TYRO_SAVE_ERROR = "Failed to save the file. Maybe you lack the permissions.";
const wxString TYRO_SAVE_ERROR_CAPTION = "Saving Failed";
const wxString TYRO_OPEN_ERROR = "Failed to open the file. Check that it exists, and that you have read permissions.";
const wxString TYRO_OPEN_ERROR_CAPTION = "Open Failed";
// EditPane file extension to lexer mapping
typedef pair<string, int> StringConstMapData;
typedef map<string, int> StringConstMap;

View File

@ -29,14 +29,19 @@ EditPane::~EditPane()
}
/**
* Encapsulate lexer selection when opening a file
* Handle the highlighting config for the
* selected file
*
* @param wxString filePath
* @return bool
* @return void
*/
bool EditPane::LoadAndHighlight(wxString filePath)
void EditPane::Highlight(wxString filePath)
{
fileName = filePath;
this->fileName.Assign(filePath);
wxLogDebug("Highlighting method");
// Get the configuration name for the selected language
string lang = this->GetLangByFile();
this->StyleClearAll();
@ -147,29 +152,58 @@ bool EditPane::LoadAndHighlight(wxString filePath)
else
{
string typeMap[] = {"null", "int", "unsigned int", "double", "string", "boolean", "array", "object"};
stringstream output;
cerr << "current lang is:" << lang << endl;
cerr << "keywords array is not an array" << endl;
cerr << "keyword array is a " << typeMap[keywords_array.type()] << endl;
output << "current lang is:" << lang << endl;
output << "keywords array is not an array" << endl;
output << "keyword array is a " << typeMap[keywords_array.type()] << endl;
wxLogDebug(output.str().c_str());
}
return this->LoadFile(filePath);
}
/**
* Check file path and open the selected file
*
* @param wxString filePath
* @return bool
*/
bool EditPane::Load(wxString filePath)
{
this->fileName.Assign(filePath);
if (this->FileReadable())
{
this->Highlight(filePath);
bool didLoad = this->LoadFile(filePath);
// @TODO Toggle controls based on write permission
return didLoad;
}
return false;
}
/**
* Determine the format of the current file by
* matching its extension against the patterns
* in the configuration files
*
* @return string
*/
string EditPane::GetLangByFile()
{
JsonValue langList = config->GetRoot();
JsonValue::iterator it;
wxFileName fname(this->fileName);
wxString curr_file = fname.GetFullName();
wxString curr_file = this->fileName.GetFullName();
// Loop through each language to find a matching file pattern
for (it = langList.begin(); it != langList.end(); ++it)
{
string lang = it.key().asString();
// Parse the file pattern
wxString file_pattern((*it)["file_pattern"].asString());
@ -195,7 +229,9 @@ string EditPane::GetLangByFile()
bool EditPane::SaveFile()
{
if ( ! this->fileName)
wxString fname;
if ( ! this->fileName.IsOk())
{
wxFileDialog dlg (
this,
@ -207,24 +243,88 @@ bool EditPane::SaveFile()
);
if (dlg.ShowModal() != wxID_OK) return false;
this->fileName = dlg.GetPath();
fname = dlg.GetPath();
}
else
{
fname = this->fileName.GetFullPath();
}
return this->SaveFile(this->fileName);
const wxString cfname(fname);
return this->SaveFile(cfname);
}
bool EditPane::SaveFile(const wxString &filename)
{
if ( ! this->IsModified()) return true;
this->SetSavePoint();
this->fileName.Assign(filename);
return wxStyledTextCtrl::SaveFile(filename);
// Check file permissions
if (this->FileWritable())
{
this->SetSavePoint();
return wxStyledTextCtrl::SaveFile(filename);
}
return false;
}
bool EditPane::IsModified()
{
return (GetModify() && !GetReadOnly());
return this->GetModify();
}
/**
* Check that the current file can be opened
*
* @return bool
*/
bool EditPane::FileReadable()
{
if (
this->fileName.IsOk() &&
this->fileName.Exists() &&
this->fileName.IsFileReadable()
) return true;
// Hmm...well, let's give an error
wxMessageDialog errDlg(
this,
TYRO_OPEN_ERROR,
TYRO_OPEN_ERROR_CAPTION,
wxOK | wxICON_ERROR | wxCENTER
);
errDlg.ShowModal();
return false;
}
/**
* Check that the current file can be saved
*
* @return bool
*/
bool EditPane::FileWritable()
{
// Lets see...can we write somewhere?
if (
this->fileName.IsOk() &&
((this->fileName.Exists() && this->fileName.IsFileWritable()) ||
(( ! this->fileName.Exists()) && this->fileName.IsDirWritable()))
) return true;
// Hmm...well, let's give an error
wxMessageDialog errDlg(
this,
TYRO_SAVE_ERROR,
TYRO_SAVE_ERROR_CAPTION,
wxOK | wxICON_ERROR | wxCENTER
);
errDlg.ShowModal();
return false;
}
void EditPane::BindEvents()

View File

@ -21,9 +21,10 @@ public:
wxVSCROLL
);
~EditPane();
wxString fileName;
wxFileName fileName;
string GetLangByFile();
bool LoadAndHighlight(wxString filePath);
bool Load(wxString filePath);
void Highlight(wxString filePath);
bool SaveFile();
bool SaveFile(const wxString &filename);
bool IsModified();
@ -36,6 +37,8 @@ private:
MARGIN_FOLD,
MARGIN_LINE_NUMBERS
};
bool FileReadable();
bool FileWritable();
void BindEvents();
void OnMarginClick(wxStyledTextEvent &event);
};

View File

@ -24,7 +24,7 @@ MainFrame::MainFrame(wxFrame *frame, const wxString& title)
base_sizer->Add(notebook, 1, wxEXPAND | wxALL, 5);
base_sizer->SetContainingWindow(this);
base_sizer->SetMinSize(600,400);
base_sizer->SetMinSize(800,600);
this->DisableEditControls();
this->BindEvents();
@ -222,7 +222,39 @@ void MainFrame::OnSave(wxCommandEvent &WXUNUSED(event))
void MainFrame::OnSaveAs(wxCommandEvent &WXUNUSED(event))
{
// @TODO Implement OnSaveAs
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);
}
}
void MainFrame::OnQuit(wxCommandEvent &WXUNUSED(event))

View File

@ -38,22 +38,15 @@ void TabContainer::AddTab(wxString filePath)
wxString caption= fileName.GetFullName();
EditPane *editor = new EditPane(this, wxID_ANY);
bool loaded_file = editor->LoadAndHighlight(filePath);
if (loaded_file)
if (editor->Load(filePath))
{
wxLogDebug("File should be properly loaded.");
this->AddPage(editor, caption, true);
return;
}
else
{
wxMessageDialog err(
this,
_T("Failed to open the specified file. Do you have permission to open it?"),
_T("Could not open file."),
wxOK|wxCENTER|wxICON_WARNING
);
err.ShowModal();
}
wxLogDebug("Failed to load file!?");
}
EditPane *TabContainer::GetCurrentEditor()