self.point += self.paste_buffer.len();
}
+ fn beginning_of_buffer(&mut self) {
+ self.point = 0;
+ }
+
+ fn end_of_buffer(&mut self) {
+ self.point = self.text.len();
+ }
+
+ fn cut(&mut self, start: usize, end: usize) {
+ assert!(self.is_char_boundary(start));
+ assert!(self.is_char_boundary(end));
+ assert!(end >= start);
+
+ if end == start {
+ return;
+ }
+
+ let new_point = if self.point <= start {
+ self.point
+ } else if self.point <= end {
+ start
+ } else {
+ self.point + start - end
+ };
+
+ self.paste_buffer = self.text[start..end].to_owned();
+ self.text = self.text[..start].to_owned() + &self.text[end..];
+ self.point = new_point;
+ }
+
fn handle_keypress(&mut self, key: OurKey) {
match key {
Left | Ctrl('B') => { self.backward(); },
assert_eq!(&ec.text, "Besźel");
assert_eq!(ec.point, 6);
+ // But then moving backwards one character goes back over the
+ // combining char and the printing one before it
+ assert_eq!(ec.backward(), true);
+ assert_eq!(ec.point, 3);
+
ec.paste_buffer = "PASTE".to_owned();
ec.paste();
- assert_eq!(&ec.text, "BesźPASTEel");
- assert_eq!(ec.point, 11);
+ assert_eq!(&ec.text, "BesPASTEźel");
+ assert_eq!(ec.point, 8);
+}
+
+pub struct SingleLineEditor {
+ core: EditorCore,
+}
+
+impl SingleLineEditor {
+ pub fn new() -> Self {
+ SingleLineEditor {
+ core: EditorCore {
+ text: "".to_owned(),
+ point: 0,
+ paste_buffer: "".to_owned(),
+ },
+ }
+ }
+
+ fn cut_to_end(&mut self) {
+ self.core.cut(self.core.point, self.core.text.len());
+ }
+
+ pub fn handle_keypress(&mut self, key: OurKey) -> bool {
+ match key {
+ Ctrl('A') => { self.core.beginning_of_buffer(); },
+ Ctrl('E') => { self.core.end_of_buffer(); },
+ Ctrl('K') => { self.cut_to_end(); },
+ Return => { return true; },
+ _ => { self.core.handle_keypress(key); }
+ }
+ return false;
+ }
}