1
////////////////////////////////////////////////////////////////////////////
2
// NoteCase notes manager project <http://notecase.sf.net>
4
// This code is licensed under BSD license.See "license.txt" for more details.
6
// File: GTK+ TextView wrapper class
7
////////////////////////////////////////////////////////////////////////////
11
//declare signal handlers
12
void on_textview_edited(GtkTextBuffer *, gpointer data);
13
void on_delete_text (GtkTextBuffer *textbuffer, GtkTextIter *arg1, GtkTextIter *arg2, gpointer user_data);
14
void on_insert_text (GtkTextBuffer *textbuffer, GtkTextIter *arg1, gchar *arg2, gint arg3, gpointer user_data);
15
gint textview_keyboard_handler(GtkWidget *widget, GdkEventKey *event);
26
void TextView::Create()
30
GtkTextBuffer *buffer = gtk_text_buffer_new (NULL);
31
textview1 = gtk_text_view_new_with_buffer (buffer);
32
gtk_widget_show (textview1);
34
g_signal_connect (G_OBJECT (textview1), "key_press_event", GTK_SIGNAL_FUNC (textview_keyboard_handler), NULL);
35
g_signal_connect(buffer, "changed", G_CALLBACK(on_textview_edited), NULL); //track buffer changes
37
//events to handle undo in textview
38
g_signal_connect (buffer, "insert-text", G_CALLBACK(on_insert_text), NULL);
39
g_signal_connect (buffer, "delete-range", G_CALLBACK(on_delete_text), NULL);
41
m_pWidget = textview1;
44
void TextView::Clear()
46
GtkTextView *textview = (GtkTextView *)m_pWidget;
47
GtkTextBuffer* buffer1 = gtk_text_view_get_buffer(textview);
49
//delete previous content
50
GtkTextIter itStart, itEnd;
51
gtk_text_buffer_get_iter_at_offset(buffer1, &itStart, 0);
52
gtk_text_buffer_get_iter_at_offset(buffer1, &itEnd, gtk_text_buffer_get_char_count(buffer1));
54
g_signal_handlers_block_by_func(buffer1, (void *)on_delete_text, 0);
55
g_signal_handlers_block_by_func(buffer1, (void *)on_textview_edited, 0);
56
gtk_text_buffer_delete(buffer1, &itStart, &itEnd);
57
g_signal_handlers_unblock_by_func(buffer1, (void *)on_delete_text, 0);
58
g_signal_handlers_unblock_by_func(buffer1, (void *)on_textview_edited, 0);
61
gchar* TextView::GetText()
63
GtkTextView *textview = (GtkTextView *)m_pWidget;
64
GtkTextBuffer* buffer1 = gtk_text_view_get_buffer(textview);
66
GtkTextIter itStart, itEnd;
67
gtk_text_buffer_get_iter_at_offset(buffer1, &itStart, 0);
68
gtk_text_buffer_get_iter_at_offset(buffer1, &itEnd, gtk_text_buffer_get_char_count(buffer1));
70
return gtk_text_buffer_get_text(buffer1, &itStart, &itEnd, FALSE);
73
void TextView::SetText(const gchar *szText)
75
GtkTextView *textview = (GtkTextView *)m_pWidget;
76
GtkTextBuffer* buffer1 = gtk_text_view_get_buffer(textview);
78
g_signal_handlers_block_by_func(buffer1, (void *)on_textview_edited, 0);
79
g_signal_handlers_block_by_func(buffer1, (void *)on_insert_text, 0);
81
gtk_text_buffer_insert_at_cursor(buffer1, szText, -1);
82
gtk_text_view_place_cursor_onscreen(GTK_TEXT_VIEW(textview));
84
g_signal_handlers_unblock_by_func(buffer1, (void *)on_textview_edited, 0);
85
g_signal_handlers_unblock_by_func(buffer1, (void *)on_insert_text, 0);
88
void TextView::InsertText(int nOffset, const gchar *szText)
90
GtkTextView *textview = (GtkTextView *)m_pWidget;
91
GtkTextBuffer* buffer1 = gtk_text_view_get_buffer(textview);
94
gtk_text_buffer_get_iter_at_offset(buffer1, &itStart, nOffset);
96
g_signal_handlers_block_by_func(buffer1, (void *)on_textview_edited, 0);
97
g_signal_handlers_block_by_func(buffer1, (void *)on_insert_text, 0);
99
gtk_text_buffer_insert(buffer1, &itStart, szText, -1);
100
gtk_text_view_place_cursor_onscreen(GTK_TEXT_VIEW(textview));
102
g_signal_handlers_unblock_by_func(buffer1, (void *)on_insert_text, 0);
103
g_signal_handlers_unblock_by_func(buffer1, (void *)on_textview_edited, 0);
106
void TextView::DeleteText(int nOffset, int nLength)
108
GtkTextView *textview = (GtkTextView *)m_pWidget;
109
GtkTextBuffer* buffer1 = gtk_text_view_get_buffer(textview);
111
GtkTextIter itStart, itEnd;
112
gtk_text_buffer_get_iter_at_offset(buffer1, &itStart, nOffset);
113
gtk_text_buffer_get_iter_at_offset(buffer1, &itEnd, nOffset+nLength);
115
g_signal_handlers_block_by_func(buffer1, (void *)on_textview_edited, 0);
116
g_signal_handlers_block_by_func(buffer1, (void *)on_delete_text, 0);
118
gtk_text_buffer_delete(buffer1, &itStart, &itEnd);
120
g_signal_handlers_unblock_by_func(buffer1, (void *)on_delete_text, 0);
121
g_signal_handlers_unblock_by_func(buffer1, (void *)on_textview_edited, 0);
124
void TextView::ClipboardCut()
126
GtkTextView *textview = (GtkTextView *)m_pWidget;
127
GtkTextBuffer* buffer1 = gtk_text_view_get_buffer(textview);
129
// get the clipboard object
130
GtkClipboard *clipboard = gtk_widget_get_clipboard (m_pWidget, GDK_SELECTION_CLIPBOARD);
131
gtk_text_buffer_cut_clipboard (buffer1, clipboard, true);
134
void TextView::ClipboardCopy()
136
GtkTextView *textview = (GtkTextView *)m_pWidget;
137
GtkTextBuffer* buffer1 = gtk_text_view_get_buffer(textview);
139
// get the clipboard object
140
GtkClipboard *clipboard = gtk_widget_get_clipboard (m_pWidget, GDK_SELECTION_CLIPBOARD);
141
gtk_text_buffer_copy_clipboard (buffer1, clipboard);
144
void TextView::ClipboardPaste()
146
GtkTextView *textview = (GtkTextView *)m_pWidget;
147
GtkTextBuffer* buffer1 = gtk_text_view_get_buffer(textview);
149
// get the clipboard object
150
GtkClipboard *clipboard = gtk_widget_get_clipboard (m_pWidget, GDK_SELECTION_CLIPBOARD);
151
gtk_text_buffer_paste_clipboard (buffer1, clipboard, NULL, true);
154
void TextView::ClipboardDelete()
156
GtkTextView *textview = (GtkTextView *)m_pWidget;
157
GtkTextBuffer* buffer1 = gtk_text_view_get_buffer(textview);
158
gtk_text_buffer_delete_selection (buffer1, false, true);
161
int TextView::GetSelectionEnd()
163
GtkTextView *textview = (GtkTextView *)m_pWidget;
164
GtkTextBuffer* buffer1 = gtk_text_view_get_buffer(textview);
167
if(gtk_text_buffer_get_selection_bounds(buffer1, NULL, &end))
169
return gtk_text_iter_get_offset(&end);
171
return -1; //no selection
174
void TextView::SelectRange(int nStart, int nEnd)
176
//select found text in a text view
177
GtkTextView *textview = (GtkTextView *)m_pWidget;
178
GtkTextBuffer* buffer1 = gtk_text_view_get_buffer(textview);
180
GtkTextIter iterStart, iterEnd;
181
gtk_text_buffer_get_iter_at_offset(buffer1, &iterStart, nStart);
182
gtk_text_buffer_get_iter_at_offset(buffer1, &iterEnd, nEnd);
183
#if GTK_CHECK_VERSION(2,4,0) //define minimal version for this api
184
gtk_text_buffer_select_range(buffer1, &iterStart, &iterEnd);
188
void TextView::EnsureVisible(int nOffset)
190
//scroll text view to ensure text at this offset is visible
191
GtkTextView *textview = (GtkTextView *)m_pWidget;
192
GtkTextBuffer* buffer1 = gtk_text_view_get_buffer(textview);
195
gtk_text_buffer_get_iter_at_offset(buffer1, &iter, nOffset);
197
gtk_text_view_scroll_to_iter(textview, &iter, 0.0, TRUE, 0.0, 1.0);
200
bool TextView::IsWrapped()
202
GtkTextView *textview = (GtkTextView *)m_pWidget;
203
return (GTK_WRAP_NONE != gtk_text_view_get_wrap_mode(GTK_TEXT_VIEW(textview)));
206
bool TextView::GetModified()
208
GtkTextView *textview = (GtkTextView *)m_pWidget;
209
GtkTextBuffer* buffer1 = gtk_text_view_get_buffer(textview);
210
return gtk_text_buffer_get_modified(buffer1);
213
void TextView::SetModified(bool bModified)
215
GtkTextView *textview = (GtkTextView *)m_pWidget;
216
GtkTextBuffer* buffer1 = gtk_text_view_get_buffer(textview);
217
gtk_text_buffer_set_modified(buffer1, (bModified)? TRUE : FALSE);
220
void TextView::SetFocus()
222
gtk_widget_grab_focus( m_pWidget );
224
//view cursor in a TextView
225
gtk_text_view_scroll_mark_onscreen (
226
GTK_TEXT_VIEW(m_pWidget),
227
gtk_text_buffer_get_insert( gtk_text_view_get_buffer( GTK_TEXT_VIEW(m_pWidget) ) )
232
// cursor will be set to cursor position and selection to the other end of the selection.
233
// If there is not selection, selection will be set to same value as the cursor
235
void TextView::GetSelectionBounds(unsigned int& cursor, unsigned int& selection)
237
GtkTextView *textview = (GtkTextView *)m_pWidget;
238
GtkTextBuffer* buffer1 = gtk_text_view_get_buffer(textview);
241
gtk_text_buffer_get_iter_at_mark (buffer1, &iter, gtk_text_buffer_get_insert (buffer1) );
242
cursor = (unsigned int)gtk_text_iter_get_offset(&iter);
244
gtk_text_buffer_get_iter_at_mark (buffer1, &iter, gtk_text_buffer_get_selection_bound (buffer1) );
245
selection = (unsigned int)gtk_text_iter_get_offset(&iter);
248
void TextView::RestoreSelectionBounds(unsigned int cursor, unsigned int selection)
250
GtkTextView *textview = (GtkTextView *)m_pWidget;
251
GtkTextBuffer* buffer1 = gtk_text_view_get_buffer(textview);
252
GtkTextIter cursIter, boundIter;
254
gtk_text_buffer_get_iter_at_offset( buffer1, &cursIter, gint(cursor) );
255
gtk_text_buffer_get_iter_at_offset( buffer1, &boundIter, gint(selection) );
257
gtk_text_buffer_select_range ( buffer1, &cursIter, &boundIter );