@ -1016,16 +1016,16 @@ bool Source::View::find_close_curly_bracket_forward(Gtk::TextIter iter, Gtk::Tex
return false ;
return false ;
}
}
long Source : : View : : open_close_paranthesis_count ( Gtk : : TextIter iter ) {
long Source : : View : : open_close_bracket_count ( Gtk : : TextIter iter , unsigned int left_bracket , unsigned int right_bracket ) {
long para_count = 0 ;
long curly_count = 0 ;
auto iter_stored = iter ;
auto iter_stored = iter ;
long bracket_count = 0 ;
long curly_count = 0 ;
do {
do {
if ( * iter = = ' ( ' & & is_code_iter ( iter ) )
if ( * iter = = left_bracket & & is_code_iter ( iter ) )
para _count+ + ;
bracket _count+ + ;
else if ( * iter = = ' ) ' & & is_code_iter ( iter ) )
else if ( * iter = = right_bracket & & is_code_iter ( iter ) )
para _count- - ;
bracket _count- - ;
else if ( * iter = = ' { ' & & is_code_iter ( iter ) )
else if ( * iter = = ' { ' & & is_code_iter ( iter ) )
curly_count + + ;
curly_count + + ;
else if ( * iter = = ' } ' & & is_code_iter ( iter ) )
else if ( * iter = = ' } ' & & is_code_iter ( iter ) )
@ -1037,24 +1037,78 @@ long Source::View::open_close_paranthesis_count(Gtk::TextIter iter) {
iter = iter_stored ;
iter = iter_stored ;
if ( ! iter . forward_char ( ) ) {
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 ;
curly_count = 0 ;
do {
do {
if ( * iter = = ' ( ' & & is_code_iter ( iter ) )
if ( * iter = = ' ( ' & & is_code_iter ( iter ) )
para_count + + ;
bracket _count+ + ;
else if ( * iter = = ' ) ' & & is_code_iter ( iter ) )
else if ( * iter = = ' ) ' & & is_code_iter ( iter ) )
para_count - - ;
bracket _count- - ;
else if ( * iter = = ' { ' & & is_code_iter ( iter ) )
else if ( * iter = = ' { ' & & is_code_iter ( iter ) )
curly_count + + ;
curly_count + + ;
else if ( * iter = = ' } ' & & is_code_iter ( iter ) )
else if ( * iter = = ' } ' & & is_code_iter ( iter ) )
curly_count - - ;
curly_count - - ;
if ( bracket_count = = 0 ) {
parenthesis_end_iter = iter ;
return true ;
}
if ( curly_count < 0 )
if ( curly_count < 0 )
break ;
return false ;
} while ( iter . forward_char ( ) ) ;
} while ( iter . forward_char ( ) ) ;
return para_count ;
return false ;
}
}
std : : string Source : : View : : get_token ( Gtk : : TextIter iter ) {
std : : string Source : : View : : get_token ( Gtk : : TextIter iter ) {
@ -1627,8 +1681,7 @@ bool Source::View::on_key_press_event_bracket_language(GdkEventKey* key) {
//Move after ')' if closed expression
//Move after ')' if closed expression
else if ( key - > keyval = = GDK_KEY_parenright ) {
else if ( key - > keyval = = GDK_KEY_parenright ) {
if ( * iter = = ' ) ' ) {
if ( * iter = = ' ) ' ) {
Gtk : : TextIter found_iter ;
if ( open_close_bracket_count ( iter , ' ( ' , ' ) ' ) = = 0 ) {
if ( open_close_paranthesis_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 ( ) ) ;
@ -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 ( ) ;
get_buffer ( ) - > end_user_action ( ) ;
return on_key_press_event_basic ( key ) ;
return on_key_press_event_basic ( key ) ;