|
|
|
@ -485,8 +485,7 @@ void Source::View::set_status(const std::string &status) { |
|
|
|
string Source::View::get_line(size_t line_number) { |
|
|
|
string Source::View::get_line(size_t line_number) { |
|
|
|
Gtk::TextIter line_it = get_source_buffer()->get_iter_at_line(line_number); |
|
|
|
Gtk::TextIter line_it = get_source_buffer()->get_iter_at_line(line_number); |
|
|
|
Gtk::TextIter line_end_it = line_it; |
|
|
|
Gtk::TextIter line_end_it = line_it; |
|
|
|
while(!line_end_it.ends_line()) |
|
|
|
while(!line_end_it.ends_line() && line_end_it.forward_char()) {} |
|
|
|
line_end_it++; |
|
|
|
|
|
|
|
std::string line(get_source_buffer()->get_text(line_it, line_end_it)); |
|
|
|
std::string line(get_source_buffer()->get_text(line_it, line_end_it)); |
|
|
|
return line; |
|
|
|
return line; |
|
|
|
} |
|
|
|
} |
|
|
|
@ -516,7 +515,7 @@ bool Source::View::on_key_press_event(GdkEventKey* key) { |
|
|
|
if((line_nr+1)<get_buffer()->get_line_count()) { |
|
|
|
if((line_nr+1)<get_buffer()->get_line_count()) { |
|
|
|
string next_line=get_line(line_nr+1); |
|
|
|
string next_line=get_line(line_nr+1); |
|
|
|
auto line_end_iter=get_buffer()->get_iter_at_line(line_nr+1); |
|
|
|
auto line_end_iter=get_buffer()->get_iter_at_line(line_nr+1); |
|
|
|
line_end_iter--; |
|
|
|
if(line_end_iter.backward_char()) { |
|
|
|
std::smatch sm2; |
|
|
|
std::smatch sm2; |
|
|
|
if(insert_it==line_end_iter && std::regex_match(next_line, sm2, tabs_regex)) { |
|
|
|
if(insert_it==line_end_iter && std::regex_match(next_line, sm2, tabs_regex)) { |
|
|
|
if(sm2[1].str().size()>sm[1].str().size()) { |
|
|
|
if(sm2[1].str().size()>sm[1].str().size()) { |
|
|
|
@ -527,6 +526,7 @@ bool Source::View::on_key_press_event(GdkEventKey* key) { |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
get_source_buffer()->insert_at_cursor("\n"+sm[1].str()); |
|
|
|
get_source_buffer()->insert_at_cursor("\n"+sm[1].str()); |
|
|
|
scroll_to(get_source_buffer()->get_insert()); |
|
|
|
scroll_to(get_source_buffer()->get_insert()); |
|
|
|
get_source_buffer()->end_user_action(); |
|
|
|
get_source_buffer()->end_user_action(); |
|
|
|
@ -570,8 +570,7 @@ bool Source::View::on_key_press_event(GdkEventKey* key) { |
|
|
|
Gtk::TextIter line_it = get_source_buffer()->get_iter_at_line(line_nr); |
|
|
|
Gtk::TextIter line_it = get_source_buffer()->get_iter_at_line(line_nr); |
|
|
|
Gtk::TextIter line_plus_it=line_it; |
|
|
|
Gtk::TextIter line_plus_it=line_it; |
|
|
|
|
|
|
|
|
|
|
|
for(unsigned c=0;c<indent_left_steps;c++) |
|
|
|
if(indent_left_steps==0 || line_plus_it.forward_chars(indent_left_steps)) |
|
|
|
line_plus_it++; |
|
|
|
|
|
|
|
get_source_buffer()->erase(line_it, line_plus_it); |
|
|
|
get_source_buffer()->erase(line_it, line_plus_it); |
|
|
|
} |
|
|
|
} |
|
|
|
get_source_buffer()->end_user_action(); |
|
|
|
get_source_buffer()->end_user_action(); |
|
|
|
@ -590,9 +589,7 @@ bool Source::View::on_key_press_event(GdkEventKey* key) { |
|
|
|
if(std::regex_match(previous_line, sm2, tabs_regex)) { |
|
|
|
if(std::regex_match(previous_line, sm2, tabs_regex)) { |
|
|
|
if(line.size()==sm2[1].str().size() || line.size()==sm2[1].str().size()+tab_size || line.size()==sm2[1].str().size()-tab_size) { |
|
|
|
if(line.size()==sm2[1].str().size() || line.size()==sm2[1].str().size()+tab_size || line.size()==sm2[1].str().size()-tab_size) { |
|
|
|
auto previous_line_end_it=insert_it; |
|
|
|
auto previous_line_end_it=insert_it; |
|
|
|
for(unsigned c=0;c<line.size();c++) |
|
|
|
if(previous_line_end_it.backward_chars(line.size()+1)) |
|
|
|
previous_line_end_it--; |
|
|
|
|
|
|
|
previous_line_end_it--; |
|
|
|
|
|
|
|
get_source_buffer()->erase(previous_line_end_it, insert_it); |
|
|
|
get_source_buffer()->erase(previous_line_end_it, insert_it); |
|
|
|
get_source_buffer()->end_user_action(); |
|
|
|
get_source_buffer()->end_user_action(); |
|
|
|
return true; |
|
|
|
return true; |
|
|
|
@ -601,8 +598,7 @@ bool Source::View::on_key_press_event(GdkEventKey* key) { |
|
|
|
} |
|
|
|
} |
|
|
|
if(line.size()>=tab_size) { |
|
|
|
if(line.size()>=tab_size) { |
|
|
|
auto insert_minus_tab_it=insert_it; |
|
|
|
auto insert_minus_tab_it=insert_it; |
|
|
|
for(unsigned c=0;c<tab_size;c++) |
|
|
|
if(tab_size==0 || insert_minus_tab_it.backward_chars(tab_size)) |
|
|
|
insert_minus_tab_it--; |
|
|
|
|
|
|
|
get_source_buffer()->erase(insert_minus_tab_it, insert_it); |
|
|
|
get_source_buffer()->erase(insert_minus_tab_it, insert_it); |
|
|
|
get_source_buffer()->end_user_action(); |
|
|
|
get_source_buffer()->end_user_action(); |
|
|
|
return true; |
|
|
|
return true; |
|
|
|
@ -1097,20 +1093,20 @@ bool Source::ClangViewParse::on_key_press_event(GdkEventKey* key) { |
|
|
|
if(next_char!='}' && next_line.substr(0, next_line_with_end_bracket.size())!=next_line_with_end_bracket) { |
|
|
|
if(next_char!='}' && next_line.substr(0, next_line_with_end_bracket.size())!=next_line_with_end_bracket) { |
|
|
|
get_source_buffer()->insert_at_cursor("\n"+sm[1].str()+tab+"\n"+sm[1].str()+"}"); |
|
|
|
get_source_buffer()->insert_at_cursor("\n"+sm[1].str()+tab+"\n"+sm[1].str()+"}"); |
|
|
|
auto insert_it = get_source_buffer()->get_insert()->get_iter(); |
|
|
|
auto insert_it = get_source_buffer()->get_insert()->get_iter(); |
|
|
|
for(size_t c=0;c<sm[1].str().size()+2;c++) |
|
|
|
if(insert_it.backward_chars(sm[1].str().size()+2)) { |
|
|
|
insert_it--; |
|
|
|
|
|
|
|
scroll_to(get_source_buffer()->get_insert()); |
|
|
|
scroll_to(get_source_buffer()->get_insert()); |
|
|
|
get_source_buffer()->place_cursor(insert_it); |
|
|
|
get_source_buffer()->place_cursor(insert_it); |
|
|
|
|
|
|
|
} |
|
|
|
get_source_buffer()->end_user_action(); |
|
|
|
get_source_buffer()->end_user_action(); |
|
|
|
return true; |
|
|
|
return true; |
|
|
|
} |
|
|
|
} |
|
|
|
else if(next_char=='}') { |
|
|
|
else if(next_char=='}') { |
|
|
|
get_source_buffer()->insert_at_cursor("\n"+sm[1].str()+tab+"\n"+sm[1].str()); |
|
|
|
get_source_buffer()->insert_at_cursor("\n"+sm[1].str()+tab+"\n"+sm[1].str()); |
|
|
|
auto insert_it = get_source_buffer()->get_insert()->get_iter(); |
|
|
|
auto insert_it = get_source_buffer()->get_insert()->get_iter(); |
|
|
|
for(size_t c=0;c<sm[1].str().size()+1;c++) |
|
|
|
if(insert_it.backward_chars(sm[1].str().size()+1)) { |
|
|
|
insert_it--; |
|
|
|
|
|
|
|
scroll_to(get_source_buffer()->get_insert()); |
|
|
|
scroll_to(get_source_buffer()->get_insert()); |
|
|
|
get_source_buffer()->place_cursor(insert_it); |
|
|
|
get_source_buffer()->place_cursor(insert_it); |
|
|
|
|
|
|
|
} |
|
|
|
get_source_buffer()->end_user_action(); |
|
|
|
get_source_buffer()->end_user_action(); |
|
|
|
return true; |
|
|
|
return true; |
|
|
|
} |
|
|
|
} |
|
|
|
@ -1170,9 +1166,7 @@ bool Source::ClangViewParse::on_key_press_event(GdkEventKey* key) { |
|
|
|
Gtk::TextIter insert_it = get_source_buffer()->get_insert()->get_iter(); |
|
|
|
Gtk::TextIter insert_it = get_source_buffer()->get_insert()->get_iter(); |
|
|
|
Gtk::TextIter line_it = get_source_buffer()->get_iter_at_line(insert_it.get_line()); |
|
|
|
Gtk::TextIter line_it = get_source_buffer()->get_iter_at_line(insert_it.get_line()); |
|
|
|
Gtk::TextIter line_plus_it=line_it; |
|
|
|
Gtk::TextIter line_plus_it=line_it; |
|
|
|
for(unsigned c=0;c<tab_size;c++) |
|
|
|
if(tab_size==0 || line_plus_it.forward_chars(tab_size)) |
|
|
|
line_plus_it++; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
get_source_buffer()->erase(line_it, line_plus_it); |
|
|
|
get_source_buffer()->erase(line_it, line_plus_it); |
|
|
|
} |
|
|
|
} |
|
|
|
get_source_buffer()->insert_at_cursor("}"); |
|
|
|
get_source_buffer()->insert_at_cursor("}"); |
|
|
|
@ -1285,8 +1279,8 @@ void Source::ClangViewAutocomplete::autocomplete() { |
|
|
|
autocomplete_starting=false; |
|
|
|
autocomplete_starting=false; |
|
|
|
if(!autocomplete_cancel_starting) { |
|
|
|
if(!autocomplete_cancel_starting) { |
|
|
|
auto start_iter=get_buffer()->get_insert()->get_iter(); |
|
|
|
auto start_iter=get_buffer()->get_insert()->get_iter(); |
|
|
|
for(size_t c=0;c<prefix.size();c++) |
|
|
|
if(prefix.size()>0 && !start_iter.backward_chars(prefix.size())) |
|
|
|
start_iter--; |
|
|
|
return; |
|
|
|
completion_dialog=std::unique_ptr<CompletionDialog>(new CompletionDialog(*this, get_buffer()->create_mark(start_iter))); |
|
|
|
completion_dialog=std::unique_ptr<CompletionDialog>(new CompletionDialog(*this, get_buffer()->create_mark(start_iter))); |
|
|
|
auto rows=std::make_shared<std::unordered_map<std::string, std::string> >(); |
|
|
|
auto rows=std::make_shared<std::unordered_map<std::string, std::string> >(); |
|
|
|
completion_dialog->on_hide=[this](){ |
|
|
|
completion_dialog->on_hide=[this](){ |
|
|
|
|