1use glib::object::IsA;
6use glib::translate::*;
7use glib::GString;
8use gtk_sys;
9use std::fmt;
10use std::mem;
11
12glib_wrapper! {
13 pub struct Editable(Interface<gtk_sys::GtkEditable>);
14
15 match fn {
16 get_type => || gtk_sys::gtk_editable_get_type(),
17 }
18}
19
20pub const NONE_EDITABLE: Option<&Editable> = None;
21
22pub trait EditableExt: 'static {
23 fn copy_clipboard(&self);
24
25 fn cut_clipboard(&self);
26
27 fn delete_selection(&self);
28
29 fn delete_text(&self, start_pos: i32, end_pos: i32);
30
31 fn get_chars(&self, start_pos: i32, end_pos: i32) -> Option<GString>;
32
33 fn get_editable(&self) -> bool;
34
35 fn get_position(&self) -> i32;
36
37 fn get_selection_bounds(&self) -> Option<(i32, i32)>;
38
39 fn insert_text(&self, new_text: &str, position: &mut i32);
40
41 fn paste_clipboard(&self);
42
43 fn select_region(&self, start_pos: i32, end_pos: i32);
44
45 fn set_editable(&self, is_editable: bool);
46
47 fn set_position(&self, position: i32);
48}
49
50impl<O: IsA<Editable>> EditableExt for O {
51 fn copy_clipboard(&self) {
52 unsafe {
53 gtk_sys::gtk_editable_copy_clipboard(self.as_ref().to_glib_none().0);
54 }
55 }
56
57 fn cut_clipboard(&self) {
58 unsafe {
59 gtk_sys::gtk_editable_cut_clipboard(self.as_ref().to_glib_none().0);
60 }
61 }
62
63 fn delete_selection(&self) {
64 unsafe {
65 gtk_sys::gtk_editable_delete_selection(self.as_ref().to_glib_none().0);
66 }
67 }
68
69 fn delete_text(&self, start_pos: i32, end_pos: i32) {
70 unsafe {
71 gtk_sys::gtk_editable_delete_text(self.as_ref().to_glib_none().0, start_pos, end_pos);
72 }
73 }
74
75 fn get_chars(&self, start_pos: i32, end_pos: i32) -> Option<GString> {
76 unsafe {
77 from_glib_full(gtk_sys::gtk_editable_get_chars(
78 self.as_ref().to_glib_none().0,
79 start_pos,
80 end_pos,
81 ))
82 }
83 }
84
85 fn get_editable(&self) -> bool {
86 unsafe {
87 from_glib(gtk_sys::gtk_editable_get_editable(
88 self.as_ref().to_glib_none().0,
89 ))
90 }
91 }
92
93 fn get_position(&self) -> i32 {
94 unsafe { gtk_sys::gtk_editable_get_position(self.as_ref().to_glib_none().0) }
95 }
96
97 fn get_selection_bounds(&self) -> Option<(i32, i32)> {
98 unsafe {
99 let mut start_pos = mem::uninitialized();
100 let mut end_pos = mem::uninitialized();
101 let ret = from_glib(gtk_sys::gtk_editable_get_selection_bounds(
102 self.as_ref().to_glib_none().0,
103 &mut start_pos,
104 &mut end_pos,
105 ));
106 if ret {
107 Some((start_pos, end_pos))
108 } else {
109 None
110 }
111 }
112 }
113
114 fn insert_text(&self, new_text: &str, position: &mut i32) {
115 let new_text_length = new_text.len() as i32;
116 unsafe {
117 gtk_sys::gtk_editable_insert_text(
118 self.as_ref().to_glib_none().0,
119 new_text.to_glib_none().0,
120 new_text_length,
121 position,
122 );
123 }
124 }
125
126 fn paste_clipboard(&self) {
127 unsafe {
128 gtk_sys::gtk_editable_paste_clipboard(self.as_ref().to_glib_none().0);
129 }
130 }
131
132 fn select_region(&self, start_pos: i32, end_pos: i32) {
133 unsafe {
134 gtk_sys::gtk_editable_select_region(self.as_ref().to_glib_none().0, start_pos, end_pos);
135 }
136 }
137
138 fn set_editable(&self, is_editable: bool) {
139 unsafe {
140 gtk_sys::gtk_editable_set_editable(
141 self.as_ref().to_glib_none().0,
142 is_editable.to_glib(),
143 );
144 }
145 }
146
147 fn set_position(&self, position: i32) {
148 unsafe {
149 gtk_sys::gtk_editable_set_position(self.as_ref().to_glib_none().0, position);
150 }
151 }
152}
153
154impl fmt::Display for Editable {
155 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
156 write!(f, "Editable")
157 }
158}