~ubuntu-branches/ubuntu/maverick/notecase/maverick

« back to all changes in this revision

Viewing changes to src/TextView.cpp

  • Committer: Bazaar Package Importer
  • Author(s): Cyril Brulebois
  • Date: 2005-09-09 09:32:43 UTC
  • Revision ID: james.westby@ubuntu.com-20050909093243-s6namw0yh7q3tqy0
Tags: upstream-1.0.5
ImportĀ upstreamĀ versionĀ 1.0.5

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
////////////////////////////////////////////////////////////////////////////
 
2
// NoteCase notes manager project <http://notecase.sf.net>
 
3
//
 
4
// This code is licensed under BSD license.See "license.txt" for more details.
 
5
//
 
6
// File: GTK+ TextView wrapper class
 
7
////////////////////////////////////////////////////////////////////////////
 
8
 
 
9
#include "TextView.h"
 
10
 
 
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);
 
16
 
 
17
TextView::TextView()
 
18
{
 
19
        m_pWidget = NULL;
 
20
}
 
21
 
 
22
TextView::~TextView()
 
23
{
 
24
}
 
25
 
 
26
void TextView::Create()
 
27
{
 
28
        GtkWidget *textview1;
 
29
 
 
30
        GtkTextBuffer *buffer = gtk_text_buffer_new (NULL);
 
31
        textview1 = gtk_text_view_new_with_buffer (buffer);
 
32
        gtk_widget_show (textview1);
 
33
 
 
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
 
36
 
 
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);
 
40
 
 
41
        m_pWidget = textview1;
 
42
}
 
43
 
 
44
void TextView::Clear()
 
45
{
 
46
        GtkTextView *textview =  (GtkTextView *)m_pWidget;
 
47
        GtkTextBuffer* buffer1 = gtk_text_view_get_buffer(textview);
 
48
 
 
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));
 
53
 
 
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);
 
59
}
 
60
 
 
61
gchar* TextView::GetText()
 
62
{
 
63
        GtkTextView *textview =  (GtkTextView *)m_pWidget;
 
64
        GtkTextBuffer* buffer1 = gtk_text_view_get_buffer(textview);
 
65
 
 
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));
 
69
        
 
70
        return gtk_text_buffer_get_text(buffer1, &itStart, &itEnd, FALSE);
 
71
}
 
72
 
 
73
void TextView::SetText(const gchar *szText)
 
74
{
 
75
        GtkTextView *textview =  (GtkTextView *)m_pWidget;
 
76
        GtkTextBuffer* buffer1 = gtk_text_view_get_buffer(textview);
 
77
 
 
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);
 
80
 
 
81
        gtk_text_buffer_insert_at_cursor(buffer1, szText, -1);
 
82
        gtk_text_view_place_cursor_onscreen(GTK_TEXT_VIEW(textview));
 
83
        
 
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);
 
86
}
 
87
 
 
88
void TextView::InsertText(int nOffset, const gchar *szText)
 
89
{
 
90
        GtkTextView *textview =  (GtkTextView *)m_pWidget;
 
91
        GtkTextBuffer* buffer1 = gtk_text_view_get_buffer(textview);
 
92
 
 
93
        GtkTextIter itStart;
 
94
        gtk_text_buffer_get_iter_at_offset(buffer1, &itStart, nOffset);
 
95
 
 
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);
 
98
 
 
99
        gtk_text_buffer_insert(buffer1, &itStart, szText, -1);
 
100
        gtk_text_view_place_cursor_onscreen(GTK_TEXT_VIEW(textview));
 
101
 
 
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);
 
104
}
 
105
 
 
106
void TextView::DeleteText(int nOffset, int nLength)
 
107
{
 
108
        GtkTextView *textview =  (GtkTextView *)m_pWidget;
 
109
        GtkTextBuffer* buffer1 = gtk_text_view_get_buffer(textview);
 
110
        
 
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);
 
114
 
 
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);
 
117
 
 
118
        gtk_text_buffer_delete(buffer1, &itStart, &itEnd);
 
119
 
 
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);
 
122
}
 
123
 
 
124
void TextView::ClipboardCut()
 
125
{
 
126
        GtkTextView *textview =  (GtkTextView *)m_pWidget;
 
127
        GtkTextBuffer* buffer1 = gtk_text_view_get_buffer(textview);
 
128
 
 
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);
 
132
}
 
133
 
 
134
void TextView::ClipboardCopy()
 
135
{
 
136
        GtkTextView *textview =  (GtkTextView *)m_pWidget;
 
137
        GtkTextBuffer* buffer1 = gtk_text_view_get_buffer(textview);
 
138
 
 
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);
 
142
}
 
143
 
 
144
void TextView::ClipboardPaste()
 
145
{
 
146
        GtkTextView *textview =  (GtkTextView *)m_pWidget;
 
147
        GtkTextBuffer* buffer1 = gtk_text_view_get_buffer(textview);
 
148
 
 
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);
 
152
}
 
153
 
 
154
void TextView::ClipboardDelete()
 
155
{
 
156
        GtkTextView *textview =  (GtkTextView *)m_pWidget;
 
157
        GtkTextBuffer* buffer1 = gtk_text_view_get_buffer(textview);
 
158
        gtk_text_buffer_delete_selection (buffer1, false, true);
 
159
}
 
160
 
 
161
int TextView::GetSelectionEnd()
 
162
{
 
163
        GtkTextView *textview =  (GtkTextView *)m_pWidget;
 
164
        GtkTextBuffer* buffer1 = gtk_text_view_get_buffer(textview);
 
165
 
 
166
        GtkTextIter end;
 
167
        if(gtk_text_buffer_get_selection_bounds(buffer1, NULL, &end))
 
168
        {
 
169
                return gtk_text_iter_get_offset(&end);
 
170
        }
 
171
        return -1; //no selection
 
172
}
 
173
 
 
174
void TextView::SelectRange(int nStart, int nEnd)
 
175
{
 
176
        //select found text in a text view
 
177
        GtkTextView *textview =  (GtkTextView *)m_pWidget;
 
178
        GtkTextBuffer* buffer1 = gtk_text_view_get_buffer(textview);
 
179
 
 
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);
 
185
#endif  
 
186
}
 
187
 
 
188
void TextView::EnsureVisible(int nOffset)
 
189
{
 
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);
 
193
 
 
194
        GtkTextIter iter;
 
195
        gtk_text_buffer_get_iter_at_offset(buffer1, &iter, nOffset);
 
196
 
 
197
        gtk_text_view_scroll_to_iter(textview, &iter, 0.0, TRUE, 0.0, 1.0);
 
198
}
 
199
 
 
200
bool TextView::IsWrapped()
 
201
{
 
202
        GtkTextView *textview =  (GtkTextView *)m_pWidget;
 
203
        return (GTK_WRAP_NONE != gtk_text_view_get_wrap_mode(GTK_TEXT_VIEW(textview)));
 
204
}
 
205
 
 
206
bool TextView::GetModified()
 
207
{
 
208
        GtkTextView *textview =  (GtkTextView *)m_pWidget;
 
209
        GtkTextBuffer* buffer1 = gtk_text_view_get_buffer(textview);
 
210
        return gtk_text_buffer_get_modified(buffer1);
 
211
}
 
212
 
 
213
void TextView::SetModified(bool bModified)
 
214
{
 
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);
 
218
}
 
219
 
 
220
void TextView::SetFocus()
 
221
{
 
222
        gtk_widget_grab_focus( m_pWidget );
 
223
 
 
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) ) ) 
 
228
        );
 
229
}
 
230
 
 
231
//
 
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
 
234
//
 
235
void TextView::GetSelectionBounds(unsigned int& cursor, unsigned int& selection)
 
236
{
 
237
        GtkTextView *textview =  (GtkTextView *)m_pWidget;
 
238
        GtkTextBuffer* buffer1 = gtk_text_view_get_buffer(textview);
 
239
        GtkTextIter iter;
 
240
        
 
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);
 
243
 
 
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);
 
246
}
 
247
 
 
248
void TextView::RestoreSelectionBounds(unsigned int cursor, unsigned int selection)
 
249
{
 
250
        GtkTextView *textview =  (GtkTextView *)m_pWidget;
 
251
        GtkTextBuffer* buffer1 = gtk_text_view_get_buffer(textview);
 
252
        GtkTextIter cursIter, boundIter;
 
253
 
 
254
        gtk_text_buffer_get_iter_at_offset( buffer1, &cursIter, gint(cursor) );
 
255
        gtk_text_buffer_get_iter_at_offset( buffer1, &boundIter, gint(selection) );
 
256
        
 
257
        gtk_text_buffer_select_range ( buffer1, &cursIter, &boundIter );
 
258
}