|
|
|
@ -906,36 +906,29 @@ Gtk::TextIter Source::View::get_tabs_end_iter() { |
|
|
|
return get_tabs_end_iter(get_buffer()->get_insert()); |
|
|
|
return get_tabs_end_iter(get_buffer()->get_insert()); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
bool Source::View::find_start_of_closed_expression(Gtk::TextIter iter, Gtk::TextIter &found_iter) { |
|
|
|
bool Source::View::find_open_non_curly_bracket_backward(Gtk::TextIter iter, Gtk::TextIter &found_iter) { |
|
|
|
int count1=0; |
|
|
|
long para_count=0; |
|
|
|
int count2=0; |
|
|
|
long square_count=0; |
|
|
|
|
|
|
|
long curly_count=0; |
|
|
|
bool ignore=false; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
do { |
|
|
|
do { |
|
|
|
if(!get_source_buffer()->iter_has_context_class(iter, "comment") && !get_source_buffer()->iter_has_context_class(iter, "string")) { |
|
|
|
if(*iter=='(' && is_code_iter(iter)) |
|
|
|
if(*iter=='\'') { |
|
|
|
para_count++; |
|
|
|
auto before_iter=iter; |
|
|
|
else if(*iter==')' && is_code_iter(iter)) |
|
|
|
before_iter.backward_char(); |
|
|
|
para_count--; |
|
|
|
auto before_before_iter=before_iter; |
|
|
|
else if(*iter=='[' && is_code_iter(iter)) |
|
|
|
before_before_iter.backward_char(); |
|
|
|
square_count++; |
|
|
|
if(*before_iter!='\\' || *before_before_iter=='\\') |
|
|
|
else if(*iter==']' && is_code_iter(iter)) |
|
|
|
ignore=!ignore; |
|
|
|
square_count--; |
|
|
|
} |
|
|
|
else if(*iter=='{' && is_code_iter(iter)) |
|
|
|
else if(!ignore) { |
|
|
|
curly_count++; |
|
|
|
if(*iter==')') |
|
|
|
else if(*iter=='}' && is_code_iter(iter)) |
|
|
|
count1++; |
|
|
|
curly_count--; |
|
|
|
else if(*iter==']') |
|
|
|
|
|
|
|
count2++; |
|
|
|
if(curly_count>0) |
|
|
|
else if(*iter=='(') |
|
|
|
break; |
|
|
|
count1--; |
|
|
|
|
|
|
|
else if(*iter=='[') |
|
|
|
if(para_count>0 || square_count>0) { |
|
|
|
count2--; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
if(iter.starts_line() && count1<=0 && count2<=0) { |
|
|
|
|
|
|
|
auto insert_iter=get_buffer()->get_insert()->get_iter(); |
|
|
|
|
|
|
|
while(iter!=insert_iter && *iter==static_cast<unsigned char>(tab_char) && iter.forward_char()) {} |
|
|
|
|
|
|
|
found_iter=iter; |
|
|
|
found_iter=iter; |
|
|
|
return true; |
|
|
|
return true; |
|
|
|
} |
|
|
|
} |
|
|
|
@ -943,102 +936,125 @@ bool Source::View::find_start_of_closed_expression(Gtk::TextIter iter, Gtk::Text |
|
|
|
return false; |
|
|
|
return false; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
bool Source::View::find_open_expression_symbol(Gtk::TextIter iter, const Gtk::TextIter &until_iter, Gtk::TextIter &found_iter) { |
|
|
|
Gtk::TextIter Source::View::find_start_of_sentence(Gtk::TextIter iter) { |
|
|
|
int count1=0; |
|
|
|
int para_count=0; |
|
|
|
int count2=0; |
|
|
|
int square_count=0; |
|
|
|
|
|
|
|
long curly_count=0; |
|
|
|
bool ignore=false; |
|
|
|
|
|
|
|
|
|
|
|
do { |
|
|
|
while(iter!=until_iter && iter.backward_char()) { |
|
|
|
if(*iter=='(' && is_code_iter(iter)) |
|
|
|
if(!get_source_buffer()->iter_has_context_class(iter, "comment") && !get_source_buffer()->iter_has_context_class(iter, "string")) { |
|
|
|
para_count++; |
|
|
|
if(*iter=='\'') { |
|
|
|
else if(*iter==')' && is_code_iter(iter)) |
|
|
|
auto before_iter=iter; |
|
|
|
para_count--; |
|
|
|
before_iter.backward_char(); |
|
|
|
else if(*iter=='[' && is_code_iter(iter)) |
|
|
|
auto before_before_iter=before_iter; |
|
|
|
square_count++; |
|
|
|
before_before_iter.backward_char(); |
|
|
|
else if(*iter==']' && is_code_iter(iter)) |
|
|
|
if(*before_iter!='\\' || *before_before_iter=='\\') |
|
|
|
square_count--; |
|
|
|
ignore=!ignore; |
|
|
|
else if(*iter=='{' && is_code_iter(iter)) |
|
|
|
} |
|
|
|
curly_count++; |
|
|
|
else if(!ignore) { |
|
|
|
else if(*iter=='}' && is_code_iter(iter)) |
|
|
|
if(*iter==')') |
|
|
|
curly_count--; |
|
|
|
count1++; |
|
|
|
|
|
|
|
else if(*iter==']') |
|
|
|
if(curly_count>0) |
|
|
|
count2++; |
|
|
|
break; |
|
|
|
else if(*iter=='(') |
|
|
|
|
|
|
|
count1--; |
|
|
|
if(iter.starts_line() && para_count==0 && square_count==0) { |
|
|
|
else if(*iter=='[') |
|
|
|
//Handle : and , on previous line
|
|
|
|
count2--; |
|
|
|
auto previous_iter=iter; |
|
|
|
} |
|
|
|
previous_iter.backward_char(); |
|
|
|
if(count1<0 || count2<0) { |
|
|
|
while(!previous_iter.starts_line() && (*previous_iter==' ' || previous_iter.ends_line()) && previous_iter.backward_char()) {} |
|
|
|
found_iter=iter; |
|
|
|
if(*previous_iter!=',' && *previous_iter!=':') |
|
|
|
return true; |
|
|
|
return iter; |
|
|
|
|
|
|
|
else if(*previous_iter==':') { |
|
|
|
|
|
|
|
previous_iter.backward_char(); |
|
|
|
|
|
|
|
while(!previous_iter.starts_line() && *previous_iter==' ' && previous_iter.backward_char()) {} |
|
|
|
|
|
|
|
if(*previous_iter==')') { |
|
|
|
|
|
|
|
auto token=get_token(get_tabs_end_iter(get_buffer()->get_iter_at_line(previous_iter.get_line()))); |
|
|
|
|
|
|
|
if(token=="case") |
|
|
|
|
|
|
|
return iter; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
else |
|
|
|
|
|
|
|
return iter; |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
} while(iter.backward_char()); |
|
|
|
|
|
|
|
|
|
|
|
return false; |
|
|
|
return iter; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
bool Source::View::find_right_bracket_forward(Gtk::TextIter iter, Gtk::TextIter &found_iter) { |
|
|
|
bool Source::View::find_open_curly_bracket_backward(Gtk::TextIter iter, Gtk::TextIter &found_iter) { |
|
|
|
int count=0; |
|
|
|
long count=0; |
|
|
|
|
|
|
|
|
|
|
|
bool ignore=false; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
while(iter.forward_char()) { |
|
|
|
do { |
|
|
|
if(!get_source_buffer()->iter_has_context_class(iter, "comment") && !get_source_buffer()->iter_has_context_class(iter, "string")) { |
|
|
|
if(*iter=='{') { |
|
|
|
if(*iter=='\'') { |
|
|
|
if(count==0 && is_code_iter(iter)) { |
|
|
|
auto before_iter=iter; |
|
|
|
|
|
|
|
before_iter.backward_char(); |
|
|
|
|
|
|
|
auto before_before_iter=before_iter; |
|
|
|
|
|
|
|
before_before_iter.backward_char(); |
|
|
|
|
|
|
|
if(*before_iter!='\\' || *before_before_iter=='\\') |
|
|
|
|
|
|
|
ignore=!ignore; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
else if(!ignore) { |
|
|
|
|
|
|
|
if(*iter=='}') { |
|
|
|
|
|
|
|
if(count==0) { |
|
|
|
|
|
|
|
found_iter=iter; |
|
|
|
found_iter=iter; |
|
|
|
return true; |
|
|
|
return true; |
|
|
|
} |
|
|
|
} |
|
|
|
count--; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
else if(*iter=='{') |
|
|
|
|
|
|
|
count++; |
|
|
|
count++; |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
else if(*iter=='}' && is_code_iter(iter)) |
|
|
|
} |
|
|
|
count--; |
|
|
|
|
|
|
|
} while(iter.backward_char()); |
|
|
|
return false; |
|
|
|
return false; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
bool Source::View::find_left_bracket_backward(Gtk::TextIter iter, Gtk::TextIter &found_iter) { |
|
|
|
bool Source::View::find_close_curly_bracket_forward(Gtk::TextIter iter, Gtk::TextIter &found_iter) { |
|
|
|
int count=0; |
|
|
|
long count=0; |
|
|
|
|
|
|
|
|
|
|
|
bool ignore=false; |
|
|
|
do { |
|
|
|
|
|
|
|
if(*iter=='}' && is_code_iter(iter)) { |
|
|
|
while(iter.backward_char()) { |
|
|
|
|
|
|
|
if(!get_source_buffer()->iter_has_context_class(iter, "comment") && !get_source_buffer()->iter_has_context_class(iter, "string")) { |
|
|
|
|
|
|
|
if(*iter=='\'') { |
|
|
|
|
|
|
|
auto before_iter=iter; |
|
|
|
|
|
|
|
before_iter.backward_char(); |
|
|
|
|
|
|
|
auto before_before_iter=before_iter; |
|
|
|
|
|
|
|
before_before_iter.backward_char(); |
|
|
|
|
|
|
|
if(*before_iter!='\\' || *before_before_iter=='\\') |
|
|
|
|
|
|
|
ignore=!ignore; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
else if(!ignore) { |
|
|
|
|
|
|
|
if(*iter=='{') { |
|
|
|
|
|
|
|
if(count==0) { |
|
|
|
if(count==0) { |
|
|
|
found_iter=iter; |
|
|
|
found_iter=iter; |
|
|
|
return true; |
|
|
|
return true; |
|
|
|
} |
|
|
|
} |
|
|
|
count--; |
|
|
|
count--; |
|
|
|
} |
|
|
|
} |
|
|
|
else if(*iter=='}') |
|
|
|
else if(*iter=='{' && is_code_iter(iter)) |
|
|
|
count++; |
|
|
|
count++; |
|
|
|
|
|
|
|
} while(iter.forward_char()); |
|
|
|
|
|
|
|
return false; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
long Source::View::open_close_paranthesis_count(Gtk::TextIter iter) { |
|
|
|
|
|
|
|
long para_count=0; |
|
|
|
|
|
|
|
long curly_count=0; |
|
|
|
|
|
|
|
auto iter_stored=iter; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
do { |
|
|
|
|
|
|
|
if(*iter=='(' && is_code_iter(iter)) |
|
|
|
|
|
|
|
para_count++; |
|
|
|
|
|
|
|
else if(*iter==')' && is_code_iter(iter)) |
|
|
|
|
|
|
|
para_count--; |
|
|
|
|
|
|
|
else if(*iter=='{' && is_code_iter(iter)) |
|
|
|
|
|
|
|
curly_count++; |
|
|
|
|
|
|
|
else if(*iter=='}' && is_code_iter(iter)) |
|
|
|
|
|
|
|
curly_count--; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if(curly_count>0) |
|
|
|
|
|
|
|
break; |
|
|
|
|
|
|
|
} while(iter.backward_char()); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
iter=iter_stored; |
|
|
|
|
|
|
|
if(!iter.forward_char()) { |
|
|
|
|
|
|
|
return para_count; |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
curly_count=0; |
|
|
|
return false; |
|
|
|
do { |
|
|
|
|
|
|
|
if(*iter=='(' && is_code_iter(iter)) |
|
|
|
|
|
|
|
para_count++; |
|
|
|
|
|
|
|
else if(*iter==')' && is_code_iter(iter)) |
|
|
|
|
|
|
|
para_count--; |
|
|
|
|
|
|
|
else if(*iter=='{' && is_code_iter(iter)) |
|
|
|
|
|
|
|
curly_count++; |
|
|
|
|
|
|
|
else if(*iter=='}' && is_code_iter(iter)) |
|
|
|
|
|
|
|
curly_count--; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if(curly_count<0) |
|
|
|
|
|
|
|
break; |
|
|
|
|
|
|
|
} while(iter.forward_char()); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
return para_count; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
std::string Source::View::get_token(Gtk::TextIter iter) { |
|
|
|
std::string Source::View::get_token(Gtk::TextIter iter) { |
|
|
|
@ -1135,7 +1151,7 @@ bool Source::View::on_key_press_event(GdkEventKey* key) { |
|
|
|
return on_key_press_event_basic(key); |
|
|
|
return on_key_press_event_basic(key); |
|
|
|
|
|
|
|
|
|
|
|
auto iter=get_buffer()->get_insert()->get_iter(); |
|
|
|
auto iter=get_buffer()->get_insert()->get_iter(); |
|
|
|
if(get_source_buffer()->iter_has_context_class(iter, "comment") || get_source_buffer()->iter_has_context_class(iter, "string")) |
|
|
|
if(!is_code_iter(iter)) |
|
|
|
return on_key_press_event_basic(key); |
|
|
|
return on_key_press_event_basic(key); |
|
|
|
|
|
|
|
|
|
|
|
if(is_bracket_language) |
|
|
|
if(is_bracket_language) |
|
|
|
@ -1406,24 +1422,32 @@ bool Source::View::on_key_press_event_bracket_language(GdkEventKey* key) { |
|
|
|
} |
|
|
|
} |
|
|
|
else |
|
|
|
else |
|
|
|
get_buffer()->erase(iter, end_blank_iter); |
|
|
|
get_buffer()->erase(iter, end_blank_iter); |
|
|
|
iter=get_buffer()->get_insert()->get_iter(); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Gtk::TextIter start_of_sentence_iter; |
|
|
|
|
|
|
|
if(find_start_of_closed_expression(iter, start_of_sentence_iter)) { |
|
|
|
|
|
|
|
auto start_sentence_tabs_end_iter=get_tabs_end_iter(start_of_sentence_iter); |
|
|
|
|
|
|
|
auto tabs=get_line_before(start_sentence_tabs_end_iter); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
std::smatch sm; |
|
|
|
iter=get_buffer()->get_insert()->get_iter(); |
|
|
|
if(iter.backward_char() && *iter=='{') { |
|
|
|
auto previous_iter=iter; |
|
|
|
auto found_iter=iter; |
|
|
|
previous_iter.backward_char(); |
|
|
|
bool found_right_bracket=find_right_bracket_forward(iter, found_iter); |
|
|
|
auto start_iter=previous_iter; |
|
|
|
|
|
|
|
if(*start_iter=='{') |
|
|
|
|
|
|
|
start_iter.backward_char(); |
|
|
|
|
|
|
|
Gtk::TextIter open_non_curly_bracket_iter; |
|
|
|
|
|
|
|
bool open_non_curly_bracket_iter_found=false; |
|
|
|
|
|
|
|
if(find_open_non_curly_bracket_backward(start_iter, open_non_curly_bracket_iter)) { |
|
|
|
|
|
|
|
open_non_curly_bracket_iter_found=true; |
|
|
|
|
|
|
|
start_iter=get_tabs_end_iter(get_buffer()->get_iter_at_line(open_non_curly_bracket_iter.get_line())); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
else |
|
|
|
|
|
|
|
start_iter=get_tabs_end_iter(get_buffer()->get_iter_at_line(find_start_of_sentence(start_iter).get_line())); |
|
|
|
|
|
|
|
auto tabs=get_line_before(start_iter); |
|
|
|
|
|
|
|
if(*previous_iter=='{') { |
|
|
|
|
|
|
|
Gtk::TextIter found_iter; |
|
|
|
|
|
|
|
bool found_right_bracket=find_close_curly_bracket_forward(iter, found_iter); |
|
|
|
|
|
|
|
|
|
|
|
bool has_bracket=false; |
|
|
|
bool has_right_curly_bracket=false; |
|
|
|
if(found_right_bracket) { |
|
|
|
if(found_right_bracket) { |
|
|
|
auto tabs_end_iter=get_tabs_end_iter(found_iter); |
|
|
|
auto tabs_end_iter=get_tabs_end_iter(found_iter); |
|
|
|
auto line_tabs=get_line_before(tabs_end_iter); |
|
|
|
auto line_tabs=get_line_before(tabs_end_iter); |
|
|
|
if(tabs.size()==line_tabs.size()) |
|
|
|
if(tabs.size()==line_tabs.size()) |
|
|
|
has_bracket=true; |
|
|
|
has_right_curly_bracket=true; |
|
|
|
} |
|
|
|
} |
|
|
|
if(*get_buffer()->get_insert()->get_iter()=='}') { |
|
|
|
if(*get_buffer()->get_insert()->get_iter()=='}') { |
|
|
|
get_buffer()->insert_at_cursor("\n"+tabs+tab+"\n"+tabs); |
|
|
|
get_buffer()->insert_at_cursor("\n"+tabs+tab+"\n"+tabs); |
|
|
|
@ -1435,17 +1459,17 @@ bool Source::View::on_key_press_event_bracket_language(GdkEventKey* key) { |
|
|
|
get_buffer()->end_user_action(); |
|
|
|
get_buffer()->end_user_action(); |
|
|
|
return true; |
|
|
|
return true; |
|
|
|
} |
|
|
|
} |
|
|
|
else if(!has_bracket) { |
|
|
|
else if(!has_right_curly_bracket) { |
|
|
|
//Insert new lines with bracket end
|
|
|
|
//Insert new lines with bracket end
|
|
|
|
bool add_semicolon=false; |
|
|
|
bool add_semicolon=false; |
|
|
|
if(language && (language->get_id()=="chdr" || language->get_id()=="cpphdr" || |
|
|
|
if(language && (language->get_id()=="chdr" || language->get_id()=="cpphdr" || |
|
|
|
language->get_id()=="c" || language->get_id()=="cpp")) { |
|
|
|
language->get_id()=="c" || language->get_id()=="cpp")) { |
|
|
|
auto token=get_token(start_of_sentence_iter); |
|
|
|
auto token=get_token(start_iter); |
|
|
|
if(token.empty()) { |
|
|
|
if(token.empty()) { |
|
|
|
auto iter=start_of_sentence_iter; |
|
|
|
auto iter=start_iter; |
|
|
|
while(!iter.starts_line() && iter.backward_char()) {} |
|
|
|
while(!iter.starts_line() && iter.backward_char()) {} |
|
|
|
if(iter.backward_char() && find_start_of_closed_expression(iter, iter)) |
|
|
|
if(iter.backward_char()) |
|
|
|
token=get_token(iter); |
|
|
|
token=get_token(get_tabs_end_iter(get_buffer()->get_iter_at_line(iter.get_line()))); |
|
|
|
} |
|
|
|
} |
|
|
|
if(token=="class" || token=="struct") |
|
|
|
if(token=="class" || token=="struct") |
|
|
|
add_semicolon=true; |
|
|
|
add_semicolon=true; |
|
|
|
@ -1466,19 +1490,24 @@ bool Source::View::on_key_press_event_bracket_language(GdkEventKey* key) { |
|
|
|
return true; |
|
|
|
return true; |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
auto line=get_line_before(); |
|
|
|
|
|
|
|
iter=get_buffer()->get_insert()->get_iter(); |
|
|
|
//Indent multiline expressions
|
|
|
|
auto found_iter=iter; |
|
|
|
if(open_non_curly_bracket_iter_found) { |
|
|
|
if(find_open_expression_symbol(iter, start_of_sentence_iter, found_iter)) { |
|
|
|
auto tabs_end_iter=get_tabs_end_iter(open_non_curly_bracket_iter); |
|
|
|
auto tabs_end_iter=get_tabs_end_iter(found_iter); |
|
|
|
auto tabs=get_line_before(get_tabs_end_iter(open_non_curly_bracket_iter)); |
|
|
|
tabs=get_line_before(tabs_end_iter); |
|
|
|
|
|
|
|
auto iter=tabs_end_iter; |
|
|
|
auto iter=tabs_end_iter; |
|
|
|
while(iter<=found_iter) { |
|
|
|
while(iter<=open_non_curly_bracket_iter) { |
|
|
|
tabs+=' '; |
|
|
|
tabs+=' '; |
|
|
|
iter.forward_char(); |
|
|
|
iter.forward_char(); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
get_buffer()->insert_at_cursor("\n"+tabs); |
|
|
|
|
|
|
|
scroll_to(get_buffer()->get_insert()); |
|
|
|
|
|
|
|
get_buffer()->end_user_action(); |
|
|
|
|
|
|
|
return true; |
|
|
|
} |
|
|
|
} |
|
|
|
else if(std::regex_match(line, sm, no_bracket_statement_regex)) { |
|
|
|
auto line=get_line_before(); |
|
|
|
|
|
|
|
std::smatch sm; |
|
|
|
|
|
|
|
if(std::regex_match(line, sm, no_bracket_statement_regex)) { |
|
|
|
get_buffer()->insert_at_cursor("\n"+tabs+tab); |
|
|
|
get_buffer()->insert_at_cursor("\n"+tabs+tab); |
|
|
|
scroll_to(get_buffer()->get_insert()); |
|
|
|
scroll_to(get_buffer()->get_insert()); |
|
|
|
get_buffer()->end_user_action(); |
|
|
|
get_buffer()->end_user_action(); |
|
|
|
@ -1514,14 +1543,19 @@ bool Source::View::on_key_press_event_bracket_language(GdkEventKey* key) { |
|
|
|
} |
|
|
|
} |
|
|
|
//Indenting after ':'
|
|
|
|
//Indenting after ':'
|
|
|
|
else if(*iter==':') { |
|
|
|
else if(*iter==':') { |
|
|
|
Gtk::TextIter left_bracket_iter; |
|
|
|
bool perform_indent=true; |
|
|
|
if(find_left_bracket_backward(iter, left_bracket_iter)) { |
|
|
|
auto previous_iter=iter; |
|
|
|
if(!left_bracket_iter.ends_line()) |
|
|
|
previous_iter.backward_char(); |
|
|
|
left_bracket_iter.forward_char(); |
|
|
|
while(!previous_iter.starts_line() && *previous_iter==' ' && previous_iter.backward_char()) {} |
|
|
|
Gtk::TextIter start_of_left_bracket_sentence_iter; |
|
|
|
if(*previous_iter==')') { |
|
|
|
if(find_start_of_closed_expression(left_bracket_iter, start_of_left_bracket_sentence_iter)) { |
|
|
|
auto token=get_token(get_tabs_end_iter(get_buffer()->get_iter_at_line(previous_iter.get_line()))); |
|
|
|
std::smatch sm; |
|
|
|
if(token!="case") |
|
|
|
auto tabs_end_iter=get_tabs_end_iter(start_of_left_bracket_sentence_iter); |
|
|
|
perform_indent=false; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
if(perform_indent) { |
|
|
|
|
|
|
|
Gtk::TextIter found_curly_iter; |
|
|
|
|
|
|
|
if(find_open_curly_bracket_backward(iter, found_curly_iter)) { |
|
|
|
|
|
|
|
auto tabs_end_iter=get_tabs_end_iter(get_buffer()->get_iter_at_line(found_curly_iter.get_line())); |
|
|
|
auto tabs_start_of_sentence=get_line_before(tabs_end_iter); |
|
|
|
auto tabs_start_of_sentence=get_line_before(tabs_end_iter); |
|
|
|
if(tabs.size()==(tabs_start_of_sentence.size()+tab_size)) { |
|
|
|
if(tabs.size()==(tabs_start_of_sentence.size()+tab_size)) { |
|
|
|
auto start_line_iter=get_buffer()->get_iter_at_line(iter.get_line()); |
|
|
|
auto start_line_iter=get_buffer()->get_iter_at_line(iter.get_line()); |
|
|
|
@ -1544,7 +1578,6 @@ bool Source::View::on_key_press_event_bracket_language(GdkEventKey* key) { |
|
|
|
get_buffer()->end_user_action(); |
|
|
|
get_buffer()->end_user_action(); |
|
|
|
return true; |
|
|
|
return true; |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
//Indent left when writing } on a new line
|
|
|
|
//Indent left when writing } on a new line
|
|
|
|
else if(key->keyval==GDK_KEY_braceright) { |
|
|
|
else if(key->keyval==GDK_KEY_braceright) { |
|
|
|
std::string line=get_line_before(); |
|
|
|
std::string line=get_line_before(); |
|
|
|
@ -1595,51 +1628,7 @@ bool Source::View::on_key_press_event_bracket_language(GdkEventKey* key) { |
|
|
|
else if(key->keyval==GDK_KEY_parenright) { |
|
|
|
else if(key->keyval==GDK_KEY_parenright) { |
|
|
|
if(*iter==')') { |
|
|
|
if(*iter==')') { |
|
|
|
Gtk::TextIter found_iter; |
|
|
|
Gtk::TextIter found_iter; |
|
|
|
auto bracket_count=[this](Gtk::TextIter iter) { |
|
|
|
if(open_close_paranthesis_count(iter)==0) { |
|
|
|
int para_count=0; |
|
|
|
|
|
|
|
int curly_count=0; |
|
|
|
|
|
|
|
auto iter_stored=iter; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
do { |
|
|
|
|
|
|
|
if(!get_source_buffer()->iter_has_context_class(iter, "comment") && !get_source_buffer()->iter_has_context_class(iter, "string")) { |
|
|
|
|
|
|
|
if(*iter==')') |
|
|
|
|
|
|
|
para_count++; |
|
|
|
|
|
|
|
else if(*iter=='(') |
|
|
|
|
|
|
|
para_count--; |
|
|
|
|
|
|
|
else if(*iter=='}') |
|
|
|
|
|
|
|
curly_count++; |
|
|
|
|
|
|
|
else if(*iter=='{') |
|
|
|
|
|
|
|
curly_count--; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if(curly_count<0) |
|
|
|
|
|
|
|
break; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} while(iter.backward_char()); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
iter=iter_stored; |
|
|
|
|
|
|
|
if(!iter.forward_char()) { |
|
|
|
|
|
|
|
return para_count; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
curly_count=0; |
|
|
|
|
|
|
|
do { |
|
|
|
|
|
|
|
if(!get_source_buffer()->iter_has_context_class(iter, "comment") && !get_source_buffer()->iter_has_context_class(iter, "string")) { |
|
|
|
|
|
|
|
if(*iter==')') |
|
|
|
|
|
|
|
para_count++; |
|
|
|
|
|
|
|
else if(*iter=='(') |
|
|
|
|
|
|
|
para_count--; |
|
|
|
|
|
|
|
else if(*iter=='}') |
|
|
|
|
|
|
|
curly_count++; |
|
|
|
|
|
|
|
else if(*iter=='{') |
|
|
|
|
|
|
|
curly_count--; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if(curly_count>0) |
|
|
|
|
|
|
|
break; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} while(iter.forward_char()); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
return para_count; |
|
|
|
|
|
|
|
}; |
|
|
|
|
|
|
|
if(bracket_count(iter)==0) { |
|
|
|
|
|
|
|
iter.forward_char(); |
|
|
|
iter.forward_char(); |
|
|
|
get_buffer()->place_cursor(iter); |
|
|
|
get_buffer()->place_cursor(iter); |
|
|
|
scroll_to(get_buffer()->get_insert()); |
|
|
|
scroll_to(get_buffer()->get_insert()); |
|
|
|
|