diff --git a/src/notebook.cc b/src/notebook.cc index c1c5aaa..766d26c 100644 --- a/src/notebook.cc +++ b/src/notebook.cc @@ -199,55 +199,10 @@ bool Notebook::save(int page) { if(page>=size()) return false; auto view=get_view(page); - if (view->file_path != "" && view->get_buffer()->get_modified()) { - //Remove trailing whitespace characters on save, and add trailing newline if missing - if(Config::get().source.cleanup_whitespace_characters) { - auto buffer=view->get_buffer(); - buffer->begin_user_action(); - for(int line=0;lineget_line_count();line++) { - auto iter=buffer->get_iter_at_line(line); - auto end_iter=iter; - while(!end_iter.ends_line()) - end_iter.forward_char(); - if(iter==end_iter) - continue; - iter=end_iter; - while(!iter.starts_line() && (*iter==' ' || *iter=='\t' || iter.ends_line())) - iter.backward_char(); - if(*iter!=' ' && *iter!='\t') - iter.forward_char(); - if(iter==end_iter) - continue; - buffer->erase(iter, end_iter); - } - auto iter=buffer->end(); - if(!iter.starts_line()) - buffer->insert(buffer->end(), "\n"); - buffer->end_user_action(); - } - - if(filesystem::write(view->file_path, view->get_buffer())) { - view->last_read_time=std::chrono::system_clock::to_time_t(std::chrono::system_clock::now()); - if(auto clang_view=dynamic_cast(view)) { - if(clang_view->language->get_id()=="chdr" || clang_view->language->get_id()=="cpphdr") { - for(auto a_view: source_views) { - if(auto a_clang_view=dynamic_cast(a_view)) { - if(clang_view!=a_clang_view) - a_clang_view->soft_reparse_needed=true; - } - } - } - } - - view->get_buffer()->set_modified(false); - - Project::on_save(page); - - return true; - } - Terminal::get().print("Error: could not save file " +view->file_path.string()+"\n", true); - } - return false; + if(!view->save(source_views)) + return false; + Project::on_save(page); + return true; } bool Notebook::save_current() { diff --git a/src/source.cc b/src/source.cc index dd3cfba..f3c0f15 100644 --- a/src/source.cc +++ b/src/source.cc @@ -395,6 +395,46 @@ Gsv::DrawSpacesFlags Source::View::parse_show_whitespace_characters(const std::s static_cast(std::accumulate(out.begin(), out.end(), 0)); } +bool Source::View::save(const std::vector views) { + if(file_path.empty() || !get_buffer()->get_modified()) + return false; + //Remove trailing whitespace characters on save, and add trailing newline if missing + if(Config::get().source.cleanup_whitespace_characters) { + auto buffer=get_buffer(); + buffer->begin_user_action(); + for(int line=0;lineget_line_count();line++) { + auto iter=buffer->get_iter_at_line(line); + auto end_iter=iter; + while(!end_iter.ends_line()) + end_iter.forward_char(); + if(iter==end_iter) + continue; + iter=end_iter; + while(!iter.starts_line() && (*iter==' ' || *iter=='\t' || iter.ends_line())) + iter.backward_char(); + if(*iter!=' ' && *iter!='\t') + iter.forward_char(); + if(iter==end_iter) + continue; + buffer->erase(iter, end_iter); + } + auto iter=buffer->end(); + if(!iter.starts_line()) + buffer->insert(buffer->end(), "\n"); + buffer->end_user_action(); + } + + if(filesystem::write(file_path, get_buffer())) { + last_read_time=std::chrono::system_clock::to_time_t(std::chrono::system_clock::now()); + get_buffer()->set_modified(false); + return true; + } + else { + Terminal::get().print("Error: could not save file "+file_path.string()+"\n", true); + return false; + } +} + void Source::View::configure() { //TODO: Move this to notebook? Might take up too much memory doing this for every tab. auto style_scheme_manager=Gsv::StyleSchemeManager::get_default(); diff --git a/src/source.h b/src/source.h index 1aba690..fbd17a7 100644 --- a/src/source.h +++ b/src/source.h @@ -72,6 +72,7 @@ namespace Source { View(const boost::filesystem::path &file_path, Glib::RefPtr language); ~View(); + virtual bool save(const std::vector views); virtual void configure(); void search_highlight(const std::string &text, bool case_sensitive, bool regex); @@ -125,8 +126,8 @@ namespace Source { bool full_reparse_needed=false; virtual void soft_reparse() {soft_reparse_needed=false;} virtual bool full_reparse() {full_reparse_needed=false; return true;} - std::time_t last_read_time; protected: + std::time_t last_read_time; bool parsed=false; Tooltips diagnostic_tooltips; Tooltips type_tooltips; diff --git a/src/source_clang.cc b/src/source_clang.cc index 5512daf..c05516a 100644 --- a/src/source_clang.cc +++ b/src/source_clang.cc @@ -43,6 +43,21 @@ Source::View(file_path, language) { }); } +bool Source::ClangViewParse::save(const std::vector views) { + if(!Source::View::save(views)) + return false; + + if(language->get_id()=="chdr" || language->get_id()=="cpphdr") { + for(auto &view: views) { + if(auto clang_view=dynamic_cast(view)) { + if(this!=clang_view) + clang_view->soft_reparse_needed=true; + } + } + } + return true; +} + void Source::ClangViewParse::configure() { Source::View::configure(); diff --git a/src/source_clang.h b/src/source_clang.h index a108aae..028059a 100644 --- a/src/source_clang.h +++ b/src/source_clang.h @@ -26,6 +26,7 @@ namespace Source { ClangViewParse(const boost::filesystem::path &file_path, Glib::RefPtr language); + bool save(const std::vector views) override; void configure() override; void soft_reparse() override;