Browse Source

Notebook::save cleanup: got rid of clang spesific code in Notebook

merge-requests/365/head
eidheim 10 years ago
parent
commit
3e6e06d2d5
  1. 53
      src/notebook.cc
  2. 40
      src/source.cc
  3. 3
      src/source.h
  4. 15
      src/source_clang.cc
  5. 1
      src/source_clang.h

53
src/notebook.cc

@ -199,55 +199,10 @@ bool Notebook::save(int page) {
if(page>=size()) if(page>=size())
return false; return false;
auto view=get_view(page); auto view=get_view(page);
if (view->file_path != "" && view->get_buffer()->get_modified()) { if(!view->save(source_views))
//Remove trailing whitespace characters on save, and add trailing newline if missing return false;
if(Config::get().source.cleanup_whitespace_characters) { Project::on_save(page);
auto buffer=view->get_buffer(); return true;
buffer->begin_user_action();
for(int line=0;line<buffer->get_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<Source::ClangView*>(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<Source::ClangView*>(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;
} }
bool Notebook::save_current() { bool Notebook::save_current() {

40
src/source.cc

@ -395,6 +395,46 @@ Gsv::DrawSpacesFlags Source::View::parse_show_whitespace_characters(const std::s
static_cast<Gsv::DrawSpacesFlags>(std::accumulate(out.begin(), out.end(), 0)); static_cast<Gsv::DrawSpacesFlags>(std::accumulate(out.begin(), out.end(), 0));
} }
bool Source::View::save(const std::vector<Source::View*> 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;line<buffer->get_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() { void Source::View::configure() {
//TODO: Move this to notebook? Might take up too much memory doing this for every tab. //TODO: Move this to notebook? Might take up too much memory doing this for every tab.
auto style_scheme_manager=Gsv::StyleSchemeManager::get_default(); auto style_scheme_manager=Gsv::StyleSchemeManager::get_default();

3
src/source.h

@ -72,6 +72,7 @@ namespace Source {
View(const boost::filesystem::path &file_path, Glib::RefPtr<Gsv::Language> language); View(const boost::filesystem::path &file_path, Glib::RefPtr<Gsv::Language> language);
~View(); ~View();
virtual bool save(const std::vector<Source::View*> views);
virtual void configure(); virtual void configure();
void search_highlight(const std::string &text, bool case_sensitive, bool regex); void search_highlight(const std::string &text, bool case_sensitive, bool regex);
@ -125,8 +126,8 @@ namespace Source {
bool full_reparse_needed=false; bool full_reparse_needed=false;
virtual void soft_reparse() {soft_reparse_needed=false;} virtual void soft_reparse() {soft_reparse_needed=false;}
virtual bool full_reparse() {full_reparse_needed=false; return true;} virtual bool full_reparse() {full_reparse_needed=false; return true;}
std::time_t last_read_time;
protected: protected:
std::time_t last_read_time;
bool parsed=false; bool parsed=false;
Tooltips diagnostic_tooltips; Tooltips diagnostic_tooltips;
Tooltips type_tooltips; Tooltips type_tooltips;

15
src/source_clang.cc

@ -43,6 +43,21 @@ Source::View(file_path, language) {
}); });
} }
bool Source::ClangViewParse::save(const std::vector<Source::View*> 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<Source::ClangView*>(view)) {
if(this!=clang_view)
clang_view->soft_reparse_needed=true;
}
}
}
return true;
}
void Source::ClangViewParse::configure() { void Source::ClangViewParse::configure() {
Source::View::configure(); Source::View::configure();

1
src/source_clang.h

@ -26,6 +26,7 @@ namespace Source {
ClangViewParse(const boost::filesystem::path &file_path, Glib::RefPtr<Gsv::Language> language); ClangViewParse(const boost::filesystem::path &file_path, Glib::RefPtr<Gsv::Language> language);
bool save(const std::vector<Source::View*> views) override;
void configure() override; void configure() override;
void soft_reparse() override; void soft_reparse() override;

Loading…
Cancel
Save