Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

textinput.rs replace_selection now slices wrt bytes rather than chars #20208

Closed
wants to merge 6 commits into from

len_of_first_code_units updated, set_selection_range now converts sta…

…rt end code unit counts to bytes
  • Loading branch information
sarkhanbayramli committed Mar 12, 2018
commit ff3f501cc0a916f8f563a06af1324a81b342fb13
@@ -161,7 +161,7 @@ fn len_of_first_n_chars(text: &str, n: usize) -> usize {
/// If the string is fewer than n code units, returns the length of the whole string.


fn len_of_first_n_code_units_new(text: &str, n: usize) -> Option<usize> {//usize {
fn len_of_first_n_code_units(text: &str, n: usize) -> Option<usize> {//usize {
if n == 0 {
return Some(0);
}
@@ -180,19 +180,6 @@ fn len_of_first_n_code_units_new(text: &str, n: usize) -> Option<usize> {//usize
Some(utf8_len)
}

fn len_of_first_n_code_units(text: &str, n: usize) -> usize {
let mut utf8_len = 0;
let mut utf16_len = 0;
for c in text.chars() {
utf16_len += c.len_utf16();
if utf16_len > n {
break;
}
utf8_len += c.len_utf8();
}
utf8_len
}

impl<T: ClipboardProvider> TextInput<T> {
/// Instantiate a new text input control
pub fn new(lines: Lines, initial: DOMString,
@@ -393,58 +380,48 @@ impl<T: ClipboardProvider> TextInput<T> {
} else {
usize::MAX
};
println!("line: {}", &self.lines[start.line]);
println!("line bytes:");
for x in self.lines[start.line].bytes() {
println!("byte: {}", x);
}

let last_char_index_new = len_of_first_n_code_units_new(&*insert, allowed_to_insert_count).unwrap_or(999 as usize);
let last_char_index = len_of_first_n_code_units(&*insert, allowed_to_insert_count);
println!("last_char_index_new: {} last_char_index: {}", last_char_index_new, last_char_index);
let chars_to_insert = &insert[..last_char_index];

// If len_of_first_n_code_units returns None, we are over allowed_to_insert_count
let last_char_index_opt = len_of_first_n_code_units(&*insert, allowed_to_insert_count);
self.clear_selection();
let start_index_code_units_new = len_of_first_n_code_units_new(&self.lines[start.line], start.index).unwrap_or(999 as usize);
let end_index_code_units_new = len_of_first_n_code_units_new(&self.lines[end.line], end.index).unwrap_or(999 as usize);
let start_index_code_units = len_of_first_n_code_units(&self.lines[start.line], start.index);
let end_index_code_units = len_of_first_n_code_units(&self.lines[end.line], end.index);
println!("start.index: {} end.index: {} start_index_code_units: {} end_index_code_units: {} start_index_code_units_new: {} end_index_code_units_new: {}", start.index, end.index, start_index_code_units, end_index_code_units, start_index_code_units_new, end_index_code_units_new);
println!("old new start end index diff: {} {}", start.index == start_index_code_units_new, end.index == end_index_code_units_new);
let new_lines = {
let prefix = &self.lines[start.line][..start.index];
let suffix = &self.lines[end.line][end.index..];
let lines_prefix = &self.lines[..start.line];
let lines_suffix = &self.lines[end.line + 1..];

let mut insert_lines = if self.multiline {
chars_to_insert.split('\n').map(|s| DOMString::from(s)).collect()
} else {
vec!(DOMString::from(chars_to_insert))
};

// FIXME(ajeffrey): effecient append for DOMStrings
let mut new_line = prefix.to_owned();
if last_char_index_opt.is_some() {
let chars_to_insert = &insert[..last_char_index_opt.unwrap()];

let new_lines = {
let prefix = &self.lines[start.line][..start.index];
let suffix = &self.lines[end.line][end.index..];
let lines_prefix = &self.lines[..start.line];
let lines_suffix = &self.lines[end.line + 1..];

let mut insert_lines = if self.multiline {
chars_to_insert.split('\n').map(|s| DOMString::from(s)).collect()
} else {
vec!(DOMString::from(chars_to_insert))
};

new_line.push_str(&insert_lines[0]);
insert_lines[0] = DOMString::from(new_line);
// FIXME(ajeffrey): effecient append for DOMStrings
let mut new_line = prefix.to_owned();

let last_insert_lines_index = insert_lines.len() - 1;
self.edit_point.index = insert_lines[last_insert_lines_index].len();
self.edit_point.line = start.line + last_insert_lines_index;
new_line.push_str(&insert_lines[0]);
insert_lines[0] = DOMString::from(new_line);

// FIXME(ajeffrey): effecient append for DOMStrings
insert_lines[last_insert_lines_index].push_str(suffix);
let last_insert_lines_index = insert_lines.len() - 1;
self.edit_point.index = insert_lines[last_insert_lines_index].len();
self.edit_point.line = start.line + last_insert_lines_index;

let mut new_lines = vec!();
new_lines.extend_from_slice(lines_prefix);
new_lines.extend_from_slice(&insert_lines);
new_lines.extend_from_slice(lines_suffix);
new_lines
};
// FIXME(ajeffrey): effecient append for DOMStrings
insert_lines[last_insert_lines_index].push_str(suffix);

self.lines = new_lines;
let mut new_lines = vec!();
new_lines.extend_from_slice(lines_prefix);
new_lines.extend_from_slice(&insert_lines);
new_lines.extend_from_slice(lines_suffix);
new_lines
};
self.lines = new_lines;
}
self.assert_ok_selection();

}

/// Return the length in UTF-8 bytes of the current line under the editing point.
@@ -957,8 +934,9 @@ impl<T: ClipboardProvider> TextInput<T> {
}

pub fn set_selection_range(&mut self, start: u32, end: u32, direction: SelectionDirection) {
let mut start = start as usize;
let mut end = end as usize;
// convert code point counts start and end to byte counts
let mut start = len_of_first_n_code_units(&self.get_content(), start as usize).unwrap();
let mut end = len_of_first_n_code_units(&self.get_content(), end as usize).unwrap();
let text_end = self.get_content().len();

if end > text_end {
ProTip! Use n and p to navigate between commits in a pull request.
You can’t perform that action at this time.