Skip to content
This repository has been archived by the owner on Jun 25, 2020. It is now read-only.

Commit

Permalink
Added move on '>' if closed expression, and move and select text insi…
Browse files Browse the repository at this point in the history
…de () on the '(' in >( if closed expression
  • Loading branch information
eidheim committed Sep 6, 2016
1 parent 92f93c9 commit 51d4134
Show file tree
Hide file tree
Showing 2 changed files with 97 additions and 15 deletions.
109 changes: 95 additions & 14 deletions src/source.cc
Original file line number Diff line number Diff line change
Expand Up @@ -1016,16 +1016,16 @@ bool Source::View::find_close_curly_bracket_forward(Gtk::TextIter iter, Gtk::Tex
return false;
}

long Source::View::open_close_paranthesis_count(Gtk::TextIter iter) {
long para_count=0;
long curly_count=0;
long Source::View::open_close_bracket_count(Gtk::TextIter iter, unsigned int left_bracket, unsigned int right_bracket) {
auto iter_stored=iter;
long bracket_count=0;
long curly_count=0;

do {
if(*iter=='(' && is_code_iter(iter))
para_count++;
else if(*iter==')' && is_code_iter(iter))
para_count--;
if(*iter==left_bracket && is_code_iter(iter))
bracket_count++;
else if(*iter==right_bracket && is_code_iter(iter))
bracket_count--;
else if(*iter=='{' && is_code_iter(iter))
curly_count++;
else if(*iter=='}' && is_code_iter(iter))
Expand All @@ -1037,24 +1037,78 @@ long Source::View::open_close_paranthesis_count(Gtk::TextIter iter) {

iter=iter_stored;
if(!iter.forward_char()) {
return para_count;
return bracket_count;
}

curly_count=0;
do {
if(*iter==left_bracket && is_code_iter(iter))
bracket_count++;
else if(*iter==right_bracket && is_code_iter(iter))
bracket_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 bracket_count;
}

bool Source::View::is_templated_function(Gtk::TextIter iter, Gtk::TextIter &parenthesis_end_iter) {
auto iter_stored=iter;
long bracket_count=0;
long curly_count=0;

if(!(iter.backward_char() && *iter=='>' && *iter_stored=='('))
return false;

do {
if(*iter=='<' && is_code_iter(iter))
bracket_count++;
else if(*iter=='>' && is_code_iter(iter))
bracket_count--;
else if(*iter=='{' && is_code_iter(iter))
curly_count++;
else if(*iter=='}' && is_code_iter(iter))
curly_count--;

if(bracket_count==0)
break;

if(curly_count>0)
break;
} while(iter.backward_char());

if(bracket_count!=0)
return false;

iter=iter_stored;
bracket_count=0;
curly_count=0;
do {
if(*iter=='(' && is_code_iter(iter))
para_count++;
bracket_count++;
else if(*iter==')' && is_code_iter(iter))
para_count--;
bracket_count--;
else if(*iter=='{' && is_code_iter(iter))
curly_count++;
else if(*iter=='}' && is_code_iter(iter))
curly_count--;

if(bracket_count==0) {
parenthesis_end_iter=iter;
return true;
}

if(curly_count<0)
break;
return false;
} while(iter.forward_char());

return para_count;
return false;
}

std::string Source::View::get_token(Gtk::TextIter iter) {
Expand Down Expand Up @@ -1627,8 +1681,7 @@ bool Source::View::on_key_press_event_bracket_language(GdkEventKey* key) {
//Move after ')' if closed expression
else if(key->keyval==GDK_KEY_parenright) {
if(*iter==')') {
Gtk::TextIter found_iter;
if(open_close_paranthesis_count(iter)==0) {
if(open_close_bracket_count(iter, '(', ')')==0) {
iter.forward_char();
get_buffer()->place_cursor(iter);
scroll_to(get_buffer()->get_insert());
Expand All @@ -1637,6 +1690,34 @@ bool Source::View::on_key_press_event_bracket_language(GdkEventKey* key) {
}
}
}
//Move after '>' if >( and closed expression
else if(key->keyval==GDK_KEY_greater) {
if(*iter=='>') {
iter.forward_char();
Gtk::TextIter parenthesis_end_iter;
if(*iter=='(' && is_templated_function(iter, parenthesis_end_iter)) {
get_buffer()->place_cursor(iter);
scroll_to(get_buffer()->get_insert());
get_buffer()->end_user_action();
return true;
}
}
}
//Move after '(' if >( and select text inside parentheses
else if(key->keyval==GDK_KEY_parenleft) {
auto previous_iter=iter;
previous_iter.backward_char();
if(*previous_iter=='>') {
Gtk::TextIter parenthesis_end_iter;
if(*iter=='(' && is_templated_function(iter, parenthesis_end_iter)) {
iter.forward_char();
get_buffer()->select_range(iter, parenthesis_end_iter);
scroll_to(iter);
get_buffer()->end_user_action();
return true;
}
}
}

get_buffer()->end_user_action();
return on_key_press_event_basic(key);
Expand Down
3 changes: 2 additions & 1 deletion src/source.h
Original file line number Diff line number Diff line change
Expand Up @@ -126,7 +126,8 @@ namespace Source {
bool find_open_non_curly_bracket_backward(Gtk::TextIter iter, Gtk::TextIter &found_iter);
bool find_open_curly_bracket_backward(Gtk::TextIter iter, Gtk::TextIter &found_iter);
bool find_close_curly_bracket_forward(Gtk::TextIter iter, Gtk::TextIter &found_iter);
long open_close_paranthesis_count(Gtk::TextIter iter);
long open_close_bracket_count(Gtk::TextIter iter, unsigned int left_bracket, unsigned int right_bracket);
bool is_templated_function(Gtk::TextIter iter, Gtk::TextIter &parenthesis_end_iter);

std::string get_token(Gtk::TextIter iter);

Expand Down

0 comments on commit 51d4134

Please sign in to comment.