|
|
|
@ -1416,7 +1416,7 @@ void Source::View::extend_selection() { |
|
|
|
return get_buffer()->get_text(start, end); |
|
|
|
return get_buffer()->get_text(start, end); |
|
|
|
}; |
|
|
|
}; |
|
|
|
|
|
|
|
|
|
|
|
Gtk::TextIter start = get_buffer()->end(), end = get_buffer()->end(); |
|
|
|
Gtk::TextIter start_backward_search = get_buffer()->end(), start_forward_search = get_buffer()->end(); |
|
|
|
auto start_stored_prev = start_stored; |
|
|
|
auto start_stored_prev = start_stored; |
|
|
|
if(start_angle_iter && end_angle_iter) { // If inside angle brackets in for instance <selection here>
|
|
|
|
if(start_angle_iter && end_angle_iter) { // If inside angle brackets in for instance <selection here>
|
|
|
|
auto next = start_angle_iter; |
|
|
|
auto next = start_angle_iter; |
|
|
|
@ -1425,8 +1425,8 @@ void Source::View::extend_selection() { |
|
|
|
prev.backward_char(); |
|
|
|
prev.backward_char(); |
|
|
|
auto element = get_element(next); |
|
|
|
auto element = get_element(next); |
|
|
|
if(*next == '/') { |
|
|
|
if(*next == '/') { |
|
|
|
start = end = start_angle_iter; |
|
|
|
start_backward_search = start_forward_search = start_angle_iter; |
|
|
|
start.backward_char(); |
|
|
|
start_backward_search.backward_char(); |
|
|
|
} |
|
|
|
} |
|
|
|
else if(*prev == '/' || std::any_of(void_elements.begin(), void_elements.end(), [&element](const std::string &e) { return e == element; })) { |
|
|
|
else if(*prev == '/' || std::any_of(void_elements.begin(), void_elements.end(), [&element](const std::string &e) { return e == element; })) { |
|
|
|
end_angle_iter.forward_char(); |
|
|
|
end_angle_iter.forward_char(); |
|
|
|
@ -1434,8 +1434,8 @@ void Source::View::extend_selection() { |
|
|
|
return; |
|
|
|
return; |
|
|
|
} |
|
|
|
} |
|
|
|
else { |
|
|
|
else { |
|
|
|
start = end = end_angle_iter; |
|
|
|
start_backward_search = start_forward_search = end_angle_iter; |
|
|
|
end.forward_char(); |
|
|
|
start_forward_search.forward_char(); |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
else if(start_stored_prev.backward_char() && *start_stored_prev == '<' && *end_stored == '>') { // Matches for instance <div>, where div is selected
|
|
|
|
else if(start_stored_prev.backward_char() && *start_stored_prev == '<' && *end_stored == '>') { // Matches for instance <div>, where div is selected
|
|
|
|
@ -1446,17 +1446,17 @@ void Source::View::extend_selection() { |
|
|
|
get_buffer()->select_range(start_stored_prev, next); |
|
|
|
get_buffer()->select_range(start_stored_prev, next); |
|
|
|
return; |
|
|
|
return; |
|
|
|
} |
|
|
|
} |
|
|
|
start = end = end_stored; |
|
|
|
start_backward_search = start_forward_search = end_stored; |
|
|
|
end.forward_char(); |
|
|
|
start_forward_search.forward_char(); |
|
|
|
} |
|
|
|
} |
|
|
|
else if(start_angle_reversed_iter && end_angle_reversed_iter) { // If not inside angle brackets, for instance <>selection here</>
|
|
|
|
else if(start_angle_reversed_iter && end_angle_reversed_iter) { // If not inside angle brackets, for instance <>selection here</>
|
|
|
|
start = start_angle_reversed_iter; |
|
|
|
start_backward_search = start_angle_reversed_iter; |
|
|
|
end = end_angle_reversed_iter; |
|
|
|
start_forward_search = end_angle_reversed_iter; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
if(start && end) { |
|
|
|
if(start_backward_search && start_forward_search) { |
|
|
|
Gtk::TextIter start_children, end_children; |
|
|
|
Gtk::TextIter start_children, end_children; |
|
|
|
auto iter = start; |
|
|
|
auto iter = start_backward_search; |
|
|
|
int depth = 0; |
|
|
|
int depth = 0; |
|
|
|
// Search backward for opening element
|
|
|
|
// Search backward for opening element
|
|
|
|
while(find_open_symbol_backward(iter, iter, '>', '<') && iter.backward_char()) { // Backward to > (end of opening element)
|
|
|
|
while(find_open_symbol_backward(iter, iter, '>', '<') && iter.backward_char()) { // Backward to > (end of opening element)
|
|
|
|
@ -1469,9 +1469,9 @@ void Source::View::extend_selection() { |
|
|
|
if(!no_child_element) { |
|
|
|
if(!no_child_element) { |
|
|
|
iter.forward_char(); |
|
|
|
iter.forward_char(); |
|
|
|
if(*iter == '/') { |
|
|
|
if(*iter == '/') { |
|
|
|
--depth; |
|
|
|
|
|
|
|
if(!iter.backward_chars(2)) |
|
|
|
if(!iter.backward_chars(2)) |
|
|
|
break; |
|
|
|
break; |
|
|
|
|
|
|
|
--depth; |
|
|
|
continue; |
|
|
|
continue; |
|
|
|
} |
|
|
|
} |
|
|
|
auto element = get_element(iter); |
|
|
|
auto element = get_element(iter); |
|
|
|
@ -1482,8 +1482,8 @@ void Source::View::extend_selection() { |
|
|
|
} |
|
|
|
} |
|
|
|
else if(depth == 0) { |
|
|
|
else if(depth == 0) { |
|
|
|
iter.backward_char(); |
|
|
|
iter.backward_char(); |
|
|
|
auto start = iter; |
|
|
|
auto start_selection = iter; |
|
|
|
iter = end; |
|
|
|
iter = start_forward_search; |
|
|
|
// Search forward for closing element
|
|
|
|
// Search forward for closing element
|
|
|
|
int depth = 0; |
|
|
|
int depth = 0; |
|
|
|
while(find_close_symbol_forward(iter, iter, '>', '<') && iter.forward_char()) { // Forward to < (start of closing element)
|
|
|
|
while(find_close_symbol_forward(iter, iter, '>', '<') && iter.forward_char()) { // Forward to < (start of closing element)
|
|
|
|
@ -1495,13 +1495,11 @@ void Source::View::extend_selection() { |
|
|
|
if(start_children <= start_stored && end_children >= end_stored && (start_children != start_stored || end_children != end_stored)) // Select children
|
|
|
|
if(start_children <= start_stored && end_children >= end_stored && (start_children != start_stored || end_children != end_stored)) // Select children
|
|
|
|
get_buffer()->select_range(start_children, end_children); |
|
|
|
get_buffer()->select_range(start_children, end_children); |
|
|
|
else |
|
|
|
else |
|
|
|
get_buffer()->select_range(start, iter); |
|
|
|
get_buffer()->select_range(start_selection, iter); |
|
|
|
return; |
|
|
|
return; |
|
|
|
} |
|
|
|
} |
|
|
|
else { |
|
|
|
else |
|
|
|
--depth; |
|
|
|
--depth; |
|
|
|
continue; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
else |
|
|
|
else |
|
|
|
break; |
|
|
|
break; |
|
|
|
@ -1511,17 +1509,13 @@ void Source::View::extend_selection() { |
|
|
|
if(std::any_of(void_elements.begin(), void_elements.end(), [&element](const std::string &e) { return e == element; })) { |
|
|
|
if(std::any_of(void_elements.begin(), void_elements.end(), [&element](const std::string &e) { return e == element; })) { |
|
|
|
if(!(find_close_symbol_forward(iter, iter, '<', '>') && iter.forward_char())) // Forward to >
|
|
|
|
if(!(find_close_symbol_forward(iter, iter, '<', '>') && iter.forward_char())) // Forward to >
|
|
|
|
break; |
|
|
|
break; |
|
|
|
continue; |
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
else if(find_close_symbol_forward(iter, iter, '<', '>') && iter.backward_char()) { // Forward to >
|
|
|
|
else if(find_close_symbol_forward(iter, iter, '<', '>') && iter.backward_char()) { // Forward to >
|
|
|
|
if(*iter == '/') { |
|
|
|
if(*iter == '/') |
|
|
|
iter.forward_chars(2); |
|
|
|
iter.forward_chars(2); |
|
|
|
continue; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
else { |
|
|
|
else { |
|
|
|
++depth; |
|
|
|
++depth; |
|
|
|
iter.forward_chars(2); |
|
|
|
iter.forward_chars(2); |
|
|
|
continue; |
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
else |
|
|
|
else |
|
|
|
@ -1530,17 +1524,12 @@ void Source::View::extend_selection() { |
|
|
|
} |
|
|
|
} |
|
|
|
break; |
|
|
|
break; |
|
|
|
} |
|
|
|
} |
|
|
|
else { |
|
|
|
else if(!iter.backward_chars(2)) |
|
|
|
++depth; |
|
|
|
|
|
|
|
if(!iter.backward_chars(2)) |
|
|
|
|
|
|
|
break; |
|
|
|
|
|
|
|
continue; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
else { |
|
|
|
|
|
|
|
if(!iter.backward_char()) |
|
|
|
|
|
|
|
break; |
|
|
|
break; |
|
|
|
|
|
|
|
++depth; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
else if(!iter.backward_char()) |
|
|
|
|
|
|
|
break; |
|
|
|
} |
|
|
|
} |
|
|
|
else |
|
|
|
else |
|
|
|
break; |
|
|
|
break; |
|
|
|
|