Develop and Download Open Source Software

Browse CVS Repository

Annotation of /shiki/shiki/buffer.c

Parent Directory Parent Directory | Revision Log Revision Log | View Revision Graph Revision Graph


Revision 1.15 - (hide annotations) (download) (as text)
Thu Dec 28 05:04:45 2006 UTC (17 years, 3 months ago) by aloha
Branch: MAIN
Changes since 1.14: +14 -26 lines
File MIME type: text/x-csrc
impl load-(file | buffer) related funtion (but currently very buggy ... for exam, SEGV while using load-file and then select other tab. It's not known exactly why...)

1 aloha 1.1 /* vim: set encoding=utf8:
2     *
3     * buffer.c
4     *
5     * This file is part of Shiki.
6     *
7     * Copyright(C)2006 WAKATSUKI toshihiro
8     *
9     * Permission is hereby granted, free of charge, to any person obtaining a
10     * copy of this software and associated documentation files (the "Software"),
11     * to deal in the Software without restriction, including without limitation
12     * the rights to use, copy, modify, merge, publish, distribute, sublicense,
13     * and/or sell copies of the Software, and to permit persons to whom the
14     * Software is furnished to do so, subject to the following conditions:
15     *
16     * The above copyright notice and this permission notice shall be included in
17     * all copies or substantial portions of the Software.
18     *
19     * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
20     * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
21     * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
22     * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
23     * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
24     * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
25     * SOFTWARE.
26     *
27 aloha 1.15 * $Id: buffer.c,v 1.14 2006/12/03 15:21:04 aloha Exp $
28 aloha 1.1 */
29     #include"shiki.h"
30 aloha 1.2
31 aloha 1.7 /* GtkTextBuffer ��������������������� ShikiBuffer ��������������������� */
32     static gint compBuffer(gconstpointer a, gconstpointer b) {
33     return ((ShikiBuffer *)a)->text_buffer == b ? 0 : b - a;
34     }
35 aloha 1.3
36 aloha 1.7 static GList *get_ShikiBufferListElement_By_GtkTextBuffer(GtkTextBuffer *b) {
37     return g_list_find_custom(Shiki_EDITOR_BUFFER_LIST, b, compBuffer);
38 aloha 1.3 }
39 aloha 1.4
40 aloha 1.9 /* ������������������������������������������������������������������������������������������ */
41     static gboolean delete_event_handler(GtkWidget *widget, GdkEvent *event, GtkTextBuffer *buffer){
42     /* delete-event ������������������������FALSE ��������������������������������������������� */
43     return Shiki_need_buffer_save_p(buffer) && !Shiki_yes_or_no_p("��������������������������������������������������������������������������� ?");
44     }
45    
46     /* ��������������������������������������������� */
47     static void insert_text_handler(GtkTextBuffer *buffer, GtkTextIter *iter, gchar *str, gint len) {
48     /* Undo ��������������������������� */
49     ShikiUndoInfo *undoInfo = g_malloc(sizeof(ShikiUndoInfo));
50     g_return_if_fail(undoInfo != NULL);
51     undoInfo->action = SHIKI_UNDO_INSERT;
52     undoInfo->str = g_strdup(str);
53     undoInfo->strlen = len;
54     undoInfo->start = gtk_text_iter_get_offset(iter);
55     undoInfo->end = undoInfo->start + undoInfo->strlen;
56 aloha 1.14
57     if(Shiki_CURRENT_UNDO_INFO_LIST) {
58     GList *p = Shiki_CURRENT_UNDO_INFO_LIST->prev;
59     Shiki_CURRENT_UNDO_INFO_LIST = g_list_prepend(Shiki_CURRENT_UNDO_INFO_LIST, undoInfo);
60     Shiki_CURRENT_UNDO_INFO_LIST->prev = p;
61     } else
62     Shiki_CURRENT_UNDO_INFO_LIST = g_list_prepend(Shiki_CURRENT_UNDO_INFO_LIST, undoInfo);
63 aloha 1.9 }
64    
65 aloha 1.14 /* ������������������������������������������������ */
66     static void delete_range_handler(GtkTextBuffer *buffer, GtkTextIter *start, GtkTextIter *end) {
67     /* Undo ��������������������������� */
68     ShikiUndoInfo *undoInfo = g_malloc(sizeof(ShikiUndoInfo));
69     g_return_if_fail(undoInfo != NULL);
70     undoInfo->action = SHIKI_UNDO_DELETE;
71     undoInfo->str = gtk_text_buffer_get_text(buffer, start, end, FALSE);
72     undoInfo->start = gtk_text_iter_get_offset(start);
73     undoInfo->end = gtk_text_iter_get_offset(end);
74     undoInfo->strlen = end - start;
75    
76     if(Shiki_CURRENT_UNDO_INFO_LIST) {
77     GList *p = Shiki_CURRENT_UNDO_INFO_LIST->prev;
78     Shiki_CURRENT_UNDO_INFO_LIST = g_list_prepend(Shiki_CURRENT_UNDO_INFO_LIST, undoInfo);
79     Shiki_CURRENT_UNDO_INFO_LIST->prev = p;
80     } else
81     Shiki_CURRENT_UNDO_INFO_LIST = g_list_prepend(Shiki_CURRENT_UNDO_INFO_LIST, undoInfo);
82     }
83 aloha 1.12
84     void Shiki_undo() {
85     GtkTextIter start, end;
86 aloha 1.14 ShikiUndoInfo *undoInfo;
87     GList *p;
88     if(!Shiki_CURRENT_UNDO_INFO_LIST) {
89 aloha 1.12 Shiki_msgbox("������������ Undo ���������������");
90     return;
91     }
92 aloha 1.14 undoInfo = Shiki_CURRENT_UNDO_INFO_LIST->data;
93 aloha 1.12 if(undoInfo->action == SHIKI_UNDO_UNDO) {
94 aloha 1.14 GList *l = g_list_nth(Shiki_CURRENT_UNDO_INFO_LIST, 2);
95     if(l)
96     Shiki_CURRENT_UNDO_INFO_LIST = l;
97     else {
98     Shiki_msgbox("������������ Undo ���������������");
99     return;
100     }
101     } else if(undoInfo->action == SHIKI_UNDO_REDO) {
102     GList *l = g_list_next(Shiki_CURRENT_UNDO_INFO_LIST);
103     if(l)
104     Shiki_CURRENT_UNDO_INFO_LIST = l;
105     else {
106     Shiki_msgbox("������������ Undo ���������������");
107     return;
108     }
109     }
110    
111     undoInfo = Shiki_CURRENT_UNDO_INFO_LIST->data;
112    
113     gtk_text_buffer_get_iter_at_offset(Shiki_CURRENT_TEXT_BUFFER, &start, undoInfo->start);
114     gtk_text_buffer_get_iter_at_offset(Shiki_CURRENT_TEXT_BUFFER, &end, undoInfo->end);
115    
116     if(!Shiki_CURRENT_UNDO_INFO_LIST->next) {
117     p = Shiki_CURRENT_UNDO_INFO_LIST;
118     Shiki_CURRENT_UNDO_INFO_LIST = g_list_next(Shiki_CURRENT_UNDO_INFO_LIST);
119     } else {
120     Shiki_CURRENT_UNDO_INFO_LIST = g_list_next(Shiki_CURRENT_UNDO_INFO_LIST);
121     p = Shiki_CURRENT_UNDO_INFO_LIST->prev;
122 aloha 1.12 }
123 aloha 1.14
124     if(undoInfo->action == SHIKI_UNDO_INSERT)
125     gtk_text_buffer_delete(Shiki_CURRENT_TEXT_BUFFER, &start, &end);
126     else if(undoInfo->action == SHIKI_UNDO_DELETE)
127     gtk_text_buffer_insert(Shiki_CURRENT_TEXT_BUFFER, &start, undoInfo->str, -1);
128    
129     Shiki_CURRENT_UNDO_INFO_LIST->prev = p;
130    
131     undoInfo = g_malloc(sizeof(ShikiUndoInfo));
132     g_return_if_fail(undoInfo != NULL);
133     undoInfo->action = SHIKI_UNDO_UNDO;
134    
135     p = Shiki_CURRENT_UNDO_INFO_LIST->prev;
136     Shiki_CURRENT_UNDO_INFO_LIST = g_list_prepend(Shiki_CURRENT_UNDO_INFO_LIST, undoInfo);
137     Shiki_CURRENT_UNDO_INFO_LIST->prev = p;
138    
139     { /* Debug print */
140     GList *l = Shiki_CURRENT_UNDO_INFO_LIST;
141     while(l->prev) l = l->prev;
142     g_print("Undo : NULL -> ");
143     for(; l != NULL; l = l->next) {
144     if(l == Shiki_CURRENT_UNDO_INFO_LIST)
145     g_print(" | ");
146     switch(((ShikiUndoInfo *)l->data)->action) {
147     case SHIKI_UNDO_UNDO :
148     g_print("[U] -> ");
149     break;
150     case SHIKI_UNDO_REDO :
151     g_print("[R] -> ");
152     break;
153     case SHIKI_UNDO_INSERT :
154     g_print("[+] -> ");
155     break;
156     case SHIKI_UNDO_DELETE :
157     g_print("[-] -> ");
158     break;
159     }
160     }
161     g_print("NIL\n");
162     }
163     }
164    
165     void Shiki_redo() {
166     GtkTextIter start, end;
167     ShikiUndoInfo *undoInfo;
168     GList *p;
169     if(!Shiki_CURRENT_UNDO_INFO_LIST) {
170     Shiki_msgbox("������������ Redo ���������������");
171 aloha 1.12 return;
172 aloha 1.14 }
173     undoInfo = Shiki_CURRENT_UNDO_INFO_LIST->data;
174     if(undoInfo->action == SHIKI_UNDO_UNDO)
175     undoInfo = g_list_nth_data(Shiki_CURRENT_UNDO_INFO_LIST, 1);
176     else if(undoInfo->action == SHIKI_UNDO_REDO) {
177     GList *l = g_list_nth_prev(Shiki_CURRENT_UNDO_INFO_LIST, 3);
178     if(l) {
179     Shiki_CURRENT_UNDO_INFO_LIST = l;
180     undoInfo = g_list_nth_data(Shiki_CURRENT_UNDO_INFO_LIST, 1);
181     } else {
182     Shiki_msgbox("������������ Redo ���������������");
183     return;
184     }
185     }
186    
187 aloha 1.12 gtk_text_buffer_get_iter_at_offset(Shiki_CURRENT_TEXT_BUFFER, &start, undoInfo->start);
188     gtk_text_buffer_get_iter_at_offset(Shiki_CURRENT_TEXT_BUFFER, &end, undoInfo->end);
189    
190 aloha 1.14 p = Shiki_CURRENT_UNDO_INFO_LIST->prev;
191    
192     if(undoInfo->action == SHIKI_UNDO_INSERT)
193 aloha 1.12 gtk_text_buffer_delete(Shiki_CURRENT_TEXT_BUFFER, &start, &end);
194 aloha 1.14 else if(undoInfo->action == SHIKI_UNDO_DELETE)
195     gtk_text_buffer_insert(Shiki_CURRENT_TEXT_BUFFER, &start, undoInfo->str, -1);
196    
197     undoInfo = g_malloc(sizeof(ShikiUndoInfo));
198     g_return_if_fail(undoInfo != NULL);
199     undoInfo->action = SHIKI_UNDO_REDO;
200    
201     Shiki_CURRENT_UNDO_INFO_LIST = g_list_prepend(Shiki_CURRENT_UNDO_INFO_LIST, undoInfo);
202    
203     Shiki_CURRENT_UNDO_INFO_LIST->prev = p;
204    
205     { /* Debug ptirt */
206     GList *l = Shiki_CURRENT_UNDO_INFO_LIST;
207     while(l->prev) l = l->prev;
208     g_print("Redo : NULL -> ");
209     for(; l != NULL; l = l->next) {
210     if(l == Shiki_CURRENT_UNDO_INFO_LIST)
211     g_print(" | ");
212     switch(((ShikiUndoInfo *)l->data)->action) {
213     case SHIKI_UNDO_UNDO :
214     g_print("[U] -> ");
215     break;
216     case SHIKI_UNDO_REDO :
217     g_print("[R] -> ");
218     break;
219     case SHIKI_UNDO_INSERT :
220     g_print("[+] -> ");
221     break;
222     case SHIKI_UNDO_DELETE :
223     g_print("[-] -> ");
224     break;
225     }
226     }
227     g_print("NIL\n");
228     }
229 aloha 1.12 }
230    
231 aloha 1.9 /* ��������������������������������������������������������������� */
232 aloha 1.15 void Shiki_update_modeline() {
233 aloha 1.11 gtk_label_set_text(GTK_LABEL(Shiki_EDITOR_MODELINE_LABEL), Scm_GetString(SCM_STRING(Scm_EvalCString("(if *mode-line-format* (*mode-line-format*) \"\")", Shiki_CURRENT_BUFFER_ENV))));
234 aloha 1.9 }
235    
236 aloha 1.11 static void cursor_moved_handler() {
237 aloha 1.15 Shiki_update_modeline();
238 aloha 1.11 }
239    
240 aloha 1.9 /* ��������������������������������������� (������������) ��������� */
241     GtkTextBuffer *Shiki_new_buffer_create(gchar *filename) {
242     /*-------------------- ������������������������ ----------------------------------*/
243     /* ShikiBuffer ������������������������������������������������������������������ */
244     ShikiBuffer *tabinfo = g_malloc(sizeof(ShikiBuffer));
245     tabinfo->locale = "Gtk Default (utf8)";
246     tabinfo->undoInfoList = NULL;
247     tabinfo->filename = filename;
248     tabinfo->name = g_path_get_basename(filename);
249 aloha 1.10 tabinfo->tabpage_label = g_strndup(tabinfo->name, 10);
250 aloha 1.9 tabinfo->env = Scm_MakeModule(NULL, FALSE);
251 aloha 1.14
252 aloha 1.9 /* xyzzy lisp ��������������� */
253     Scm_Init_xyzzylisp(SCM_MODULE(tabinfo->env));
254    
255     /* ������������������������������ (������������������������) ��������� */
256     tabinfo->tabpage = GTK_SCROLLED_WINDOW(gtk_scrolled_window_new(NULL, NULL));
257     gtk_scrolled_window_set_policy (tabinfo->tabpage, GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
258    
259     /* ��������������������������������������������������������������������������������������� */
260     tabinfo->text_view = GTK_TEXT_VIEW(gtk_text_view_new());
261     gtk_text_view_set_wrap_mode(tabinfo->text_view, GTK_WRAP_WORD);
262     tabinfo->text_buffer = gtk_text_view_get_buffer(tabinfo->text_view);
263     gtk_widget_set_size_request(GTK_WIDGET(tabinfo->text_view), 680, 700);
264    
265     gtk_container_add(GTK_CONTAINER(tabinfo->tabpage), GTK_WIDGET(tabinfo->text_view));
266 aloha 1.11 g_signal_connect(tabinfo->text_buffer, "mark_set", G_CALLBACK(cursor_moved_handler), tabinfo->text_view);
267 aloha 1.9 g_signal_connect(tabinfo->text_buffer, "insert-text", G_CALLBACK(insert_text_handler), NULL);
268     g_signal_connect(tabinfo->text_buffer, "delete-range", G_CALLBACK(delete_range_handler), NULL);
269    
270     /* ������������������������������������������������������������������������������������������������������ */
271     tabinfo->delete_handler_id = g_signal_connect(Shiki_EDITOR_WINDOW, "delete_event", G_CALLBACK(delete_event_handler), tabinfo->text_buffer);
272    
273     /* ������������������������ */
274    
275     /* ������������������������������������������������ */
276     gtk_text_buffer_create_tag(tabinfo->text_buffer, "parent_emphasis_background", "background", "green", NULL);
277    
278 aloha 1.13 /* ������/������������������������������������ */
279     gtk_text_buffer_create_tag(tabinfo->text_buffer, "match_highlighting", "background", "pink", NULL);
280    
281 aloha 1.9 /* ������������������������������������������ */
282     gtk_text_buffer_create_tag(tabinfo->text_buffer, "keyword_highlighting", "foreground", "blue", NULL);
283     /* ������ */
284     gtk_text_buffer_create_tag(tabinfo->text_buffer, "function_highlighting", "foreground", "red", NULL);
285     /* ������������ */
286     gtk_text_buffer_create_tag (tabinfo->text_buffer, "comment_highlighting", "foreground", "purple", NULL);
287     /* ��������� */
288     gtk_text_buffer_create_tag (tabinfo->text_buffer, "string_highlighting", "foreground", "orange", NULL);
289     /* ������������������������������������������ */
290     gtk_notebook_append_page(Shiki_EDITOR_NOTEBOOK, GTK_WIDGET(tabinfo->tabpage), gtk_label_new(tabinfo->tabpage_label));
291     /* ������������������������������������������������������������������ */
292     Shiki_EDITOR_BUFFER_LIST = g_list_append(Shiki_EDITOR_BUFFER_LIST, tabinfo);
293    
294     gtk_widget_show_all(GTK_WIDGET(Shiki_EDITOR_NOTEBOOK));
295     /* ��������������������������������� */
296     gtk_notebook_set_current_page(Shiki_EDITOR_NOTEBOOK, g_list_length(Shiki_EDITOR_BUFFER_LIST) - 1);
297     //Shiki_CURRENT_TAB_INFO = tabinfo;
298 aloha 1.14
299 aloha 1.11 Scm_EvalCString("(set! *mode-line-format* (lambda () (format #f \"--~A- ~A (Gauche Interaction) [GtkDefault (utf8)] L~S:~S \" (if (buffer-modified-p) \"--\" \"**\") (buffer-name (selected-buffer)) (current-line-number) (current-column))))", tabinfo->env);
300 aloha 1.9 return tabinfo->text_buffer;
301     }
302    
303 aloha 1.10 void Shiki_create_file_buffer(const gchar *filename) {
304     gchar *text;
305     gchar *utf8filename = g_locale_to_utf8(filename, -1, NULL, NULL, NULL);
306     GtkTextIter p;
307     ScmObj s;
308    
309     /* g_file_get_contents(filename, &contents, &len, NULL); */
310    
311     /* ������������������������������ */
312     Shiki_new_buffer_create(g_strdup(filename));
313     gtk_window_set_title (GTK_WINDOW (Shiki_EDITOR_WINDOW), filename);
314    
315     Scm_Define(SCM_MODULE(Shiki_CURRENT_BUFFER_ENV), SCM_SYMBOL(SCM_INTERN("*filename*")), SCM_MAKE_STR_COPYING(utf8filename));
316     g_free(utf8filename);
317    
318     Scm_EvalCString("(use gauche.charconv)", Shiki_CURRENT_BUFFER_ENV);
319    
320     /* ������������������������������������������������������������������������������ */
321     s = Scm_EvalCString("(port->string (open-input-conversion-port (open-input-file *filename*) \"*jp\" :owner? #t))", Shiki_CURRENT_BUFFER_ENV);
322     text = Scm_GetString(SCM_STRING(s));
323     if(text)
324     gtk_text_buffer_set_text(Shiki_CURRENT_TEXT_BUFFER, text, -1);
325     else {
326     /* open-input-conversion-port ������������������������������������������������������
327     * ��������������������������������������������������������������������������� UTF8
328     */
329     gchar *contents;
330     gsize br, bw, len;
331     GError *err = NULL;
332    
333     if(g_file_get_contents(filename, &contents, &len, NULL)) {
334     if(!(text = g_locale_to_utf8(contents, -1, &br, &bw, &err)))
335 aloha 1.13 gtk_text_buffer_set_text(Shiki_CURRENT_TEXT_BUFFER, text, -1);
336 aloha 1.10 else
337 aloha 1.13 gtk_text_buffer_set_text(Shiki_CURRENT_TEXT_BUFFER, contents, -1);
338 aloha 1.10 g_free(contents);
339     }
340     }
341    
342     /* ������������������������ */
343     gtk_text_buffer_set_modified(Shiki_CURRENT_TEXT_BUFFER, FALSE);
344     /* ������������������������������ */
345     gtk_text_buffer_get_start_iter(Shiki_CURRENT_TEXT_BUFFER, &p);
346     gtk_text_buffer_place_cursor(Shiki_CURRENT_TEXT_BUFFER, &p);
347 aloha 1.11 Shiki_update_modeline(Shiki_CURRENT_TEXT_BUFFER);
348 aloha 1.10 gtk_widget_show_all(GTK_WIDGET(Shiki_EDITOR_NOTEBOOK));
349     }
350    
351     void Shiki_open_file_dialog() {
352     const gchar *filename = Shiki_file_name_dialog("���������������������");
353    
354     if(!filename) return;
355     Shiki_create_file_buffer(filename);
356     }
357    
358 aloha 1.7 void Shiki_delete_buffer(GtkTextBuffer *buffer) {
359     /* ��������������������������������������������������������������������������������������������������� */
360     /* ���������������������Scheme ������������������������ Gtk ������������������������������������������������ */
361     GList *bufListElem = get_ShikiBufferListElement_By_GtkTextBuffer(buffer);
362     ShikiBuffer *tabInfo = bufListElem->data;
363     gint bufNum = g_list_position(Shiki_EDITOR_BUFFER_LIST, bufListElem);
364    
365     /* ��������� 1 ��������������������������������������������������� */
366     if(g_list_length(Shiki_EDITOR_BUFFER_LIST) == 1)
367 aloha 1.4 return;
368 aloha 1.7 /* ��������������������������������������������������������������������������������������������� */
369     g_signal_handler_disconnect(Shiki_EDITOR_WINDOW, tabInfo->delete_handler_id);
370     Shiki_EDITOR_BUFFER_LIST = g_list_delete_link(Shiki_EDITOR_BUFFER_LIST, bufListElem);
371     gtk_widget_destroy(GTK_WIDGET(tabInfo->tabpage));
372     g_free(tabInfo->tabpage_label);
373     g_free(tabInfo->name);
374     g_free(tabInfo->filename);
375     g_free(tabInfo);
376     gtk_notebook_remove_page(Shiki_EDITOR_NOTEBOOK, bufNum);
377     /* ��������������� */
378     gtk_widget_queue_draw(GTK_WIDGET(Shiki_EDITOR_NOTEBOOK));
379     }
380    
381     GtkTextBuffer *Shiki_find_buffer(const gchar *name) {
382     GList *l;
383     for(l = Shiki_EDITOR_BUFFER_LIST; l != NULL; l = l->next)
384     if(strcmp(((ShikiBuffer *)l->data)->name, name) == 0)
385     return ((ShikiBuffer *)l->data)->text_buffer;
386     return NULL;
387     }
388    
389     gchar *Shiki_buffer_substring(gint start, gint end) {
390     if(start >= end)
391     return NULL;
392     else {
393     GtkTextIter s, e;
394     gtk_text_buffer_get_iter_at_offset(Shiki_CURRENT_TEXT_BUFFER, &s, start);
395     gtk_text_buffer_get_iter_at_offset(Shiki_CURRENT_TEXT_BUFFER, &e, end);
396    
397     return gtk_text_buffer_get_text(Shiki_CURRENT_TEXT_BUFFER, &s, &e, FALSE);
398     }
399     }
400    
401     void Shiki_delete_region(gint start, gint end) {
402     if(start >= end)
403     return;
404     else {
405     GtkTextIter s, e;
406     gtk_text_buffer_get_iter_at_offset(Shiki_CURRENT_TEXT_BUFFER, &s, start);
407     gtk_text_buffer_get_iter_at_offset(Shiki_CURRENT_TEXT_BUFFER, &e, end);
408 aloha 1.4
409 aloha 1.7 return gtk_text_buffer_delete(Shiki_CURRENT_TEXT_BUFFER, &s, &e);
410     }
411 aloha 1.4 }
412    
413     gint Shiki_point() {
414     GtkTextIter p;
415     gtk_text_buffer_get_iter_at_mark(Shiki_CURRENT_TEXT_BUFFER,&p, gtk_text_buffer_get_insert(Shiki_CURRENT_TEXT_BUFFER));
416     return gtk_text_iter_get_offset(&p);
417     }
418    
419     gint Shiki_point_max() {
420     GtkTextIter p;
421     gtk_text_buffer_get_end_iter(Shiki_CURRENT_TEXT_BUFFER, &p);
422     return gtk_text_iter_get_offset(&p);
423     }
424    
425     gint Shiki_point_min() {
426     return 0;
427     }
428    
429     void Shiki_goto_char(gint offset) {
430     GtkTextIter p;
431     gtk_text_buffer_get_iter_at_offset(Shiki_CURRENT_TEXT_BUFFER, &p, offset);
432     gtk_text_buffer_place_cursor(Shiki_CURRENT_TEXT_BUFFER, &p);
433     }
434    
435     void Shiki_forward_char() {
436     GtkTextIter p;
437     gtk_text_buffer_get_iter_at_mark(Shiki_CURRENT_TEXT_BUFFER,&p, gtk_text_buffer_get_insert(Shiki_CURRENT_TEXT_BUFFER));
438     gtk_text_iter_forward_char(&p);
439     gtk_text_buffer_place_cursor(Shiki_CURRENT_TEXT_BUFFER, &p);
440     }
441    
442     void Shiki_backward_char() {
443     GtkTextIter p;
444     gtk_text_buffer_get_iter_at_mark(Shiki_CURRENT_TEXT_BUFFER,&p, gtk_text_buffer_get_insert(Shiki_CURRENT_TEXT_BUFFER));
445     gtk_text_iter_backward_char(&p);
446     gtk_text_buffer_place_cursor(Shiki_CURRENT_TEXT_BUFFER, &p);
447     }
448    
449     void Shiki_goto_line(gint line) {
450     GtkTextIter p;
451     gtk_text_buffer_get_iter_at_line(Shiki_CURRENT_TEXT_BUFFER, &p, line);
452     gtk_text_buffer_place_cursor(Shiki_CURRENT_TEXT_BUFFER, &p);
453     }
454    
455     void Shiki_goto_bol() {
456     GtkTextIter p;
457     gtk_text_buffer_get_iter_at_mark(Shiki_CURRENT_TEXT_BUFFER,&p, gtk_text_buffer_get_insert(Shiki_CURRENT_TEXT_BUFFER));
458     gtk_text_buffer_get_iter_at_line_offset(Shiki_CURRENT_TEXT_BUFFER, &p, gtk_text_iter_get_line(&p), 0);
459     gtk_text_buffer_place_cursor(Shiki_CURRENT_TEXT_BUFFER, &p);
460     }
461    
462     void Shiki_goto_eol() {
463     GtkTextIter p;
464     gtk_text_buffer_get_iter_at_mark(Shiki_CURRENT_TEXT_BUFFER,&p, gtk_text_buffer_get_insert(Shiki_CURRENT_TEXT_BUFFER));
465     gtk_text_iter_forward_to_line_end(&p);
466     gtk_text_iter_backward_char(&p);
467     gtk_text_buffer_place_cursor(Shiki_CURRENT_TEXT_BUFFER, &p);
468     }
469 aloha 1.5
470 aloha 1.7 void Shiki_forward_line(gint count) {
471     GtkTextIter p;
472     gint i;
473     gtk_text_buffer_get_iter_at_mark(Shiki_CURRENT_TEXT_BUFFER,&p, gtk_text_buffer_get_insert(Shiki_CURRENT_TEXT_BUFFER));
474 aloha 1.14
475 aloha 1.7 if(count >= 0) {
476     for(i = count; i != 0; i--)
477     gtk_text_view_forward_display_line(Shiki_CURRENT_TEXT_VIEW, &p);
478     } else {
479     for(i = count; i != 0; i++)
480     gtk_text_view_backward_display_line(Shiki_CURRENT_TEXT_VIEW, &p);
481     }
482     gtk_text_buffer_place_cursor(Shiki_CURRENT_TEXT_BUFFER, &p);
483 aloha 1.5 }
484    
485     const char *Shiki_buffer_name(GtkTextBuffer *buffer) {
486     GList *l = get_ShikiBufferListElement_By_GtkTextBuffer(buffer);
487     if(l)
488     return ((ShikiBuffer *)(l->data))->name;
489     else
490     return NULL;
491     }
492    
493 aloha 1.6 gboolean Shiki_deleted_buffer_p(GtkTextBuffer *buffer) {
494     GList *l = get_ShikiBufferListElement_By_GtkTextBuffer(buffer);
495     if(l)
496     return FALSE;
497     else
498     return TRUE;
499     }
500    
501 aloha 1.5 GtkTextBuffer *Shiki_get_next_buffer(GtkTextBuffer *buffer) {
502     GList *l = get_ShikiBufferListElement_By_GtkTextBuffer(buffer);
503     if(l && l->next)
504     return ((ShikiBuffer *)(l->next->data))->text_buffer;
505     else
506     return NULL;
507     }
508    
509     GtkTextBuffer *Shiki_get_previous_buffer(GtkTextBuffer *buffer) {
510     GList *l = get_ShikiBufferListElement_By_GtkTextBuffer(buffer);
511     if(l && l->prev)
512     return ((ShikiBuffer *)(l->prev->data))->text_buffer;
513     else
514     return NULL;
515     }
516    
517     ScmObj Shiki_buffer_list() {
518     GList *l;
519     GtkTextBuffer *b;
520     ScmObj bl = SCM_NIL;
521    
522     for(l = Shiki_EDITOR_BUFFER_LIST; l != NULL; l = l->next) {
523     b= ((ShikiBuffer *)(l->data))->text_buffer;
524     bl = Scm_Cons(SHIKI_BUFFER_BOX(g_object_ref(b)), bl);
525     }
526     return bl;
527     }
528 aloha 1.7
529     void Shiki_erase_buffer(GtkTextBuffer *buffer) {
530     GtkTextIter start, end;
531     gtk_text_buffer_get_start_iter(buffer, &start);
532     gtk_text_buffer_get_end_iter(buffer, &end);
533     gtk_text_buffer_delete(buffer, &start, &end);
534     }
535    
536     const gchar *Shiki_file_name_dialog(const gchar *msg) {
537    
538     GtkWidget *dialog = gtk_file_selection_new(msg);
539     gint resp = gtk_dialog_run(GTK_DIALOG(dialog));
540     const gchar *filename = NULL;
541    
542     if(resp == GTK_RESPONSE_OK)
543     filename = gtk_file_selection_get_filename(GTK_FILE_SELECTION(dialog));
544    
545     gtk_widget_destroy(dialog);
546     return filename;
547     }
548    
549     gboolean Shiki_yes_or_no_p(const gchar *msg) {
550     GtkWidget *dialog = gtk_message_dialog_new(GTK_WINDOW(Shiki_EDITOR_WINDOW),
551 aloha 1.14 GTK_DIALOG_DESTROY_WITH_PARENT, GTK_MESSAGE_QUESTION,
552     GTK_BUTTONS_YES_NO, msg);
553 aloha 1.9 gint resp;
554     gtk_dialog_set_default_response(GTK_DIALOG(dialog), GTK_RESPONSE_YES);
555     resp = gtk_dialog_run(GTK_DIALOG(dialog));
556     gtk_widget_destroy(dialog);
557     if(GTK_RESPONSE_YES == resp)
558     return TRUE;
559     return FALSE;
560     }
561    
562     gboolean Shiki_no_or_yes_p(const gchar *msg) {
563     GtkWidget *dialog = gtk_message_dialog_new(GTK_WINDOW(Shiki_EDITOR_WINDOW),
564 aloha 1.14 GTK_DIALOG_DESTROY_WITH_PARENT, GTK_MESSAGE_QUESTION,
565     GTK_BUTTONS_YES_NO, msg);
566 aloha 1.9 gint resp;
567     gtk_dialog_set_default_response(GTK_DIALOG(dialog), GTK_RESPONSE_NO);
568     resp = gtk_dialog_run(GTK_DIALOG(dialog));
569 aloha 1.7 gtk_widget_destroy(dialog);
570     if(GTK_RESPONSE_YES == resp)
571     return TRUE;
572     return FALSE;
573     }
574 aloha 1.8
575     gboolean Shiki_need_buffer_save_p(GtkTextBuffer *buffer) {
576     return gtk_text_buffer_get_modified(buffer);
577     }
578    
579     /* ������������ */
580     void Shiki_kill_buffer(GtkTextBuffer *buffer) {
581     if(!Shiki_need_buffer_save_p(buffer) || Shiki_yes_or_no_p("��������������������������������������������������������������������������� ?"))
582     Shiki_delete_buffer(buffer);
583     }
584 aloha 1.12
585     void Shiki_msgbox(const gchar *msg) {
586     GtkWidget *dialog;
587     dialog = gtk_message_dialog_new(GTK_WINDOW(Shiki_EDITOR_WINDOW),
588     GTK_DIALOG_DESTROY_WITH_PARENT, GTK_MESSAGE_INFO, GTK_BUTTONS_OK,msg);
589     gtk_dialog_run(GTK_DIALOG(dialog));
590     gtk_widget_destroy(dialog);
591     }
592 aloha 1.13
593     /* GtkTextCharPredicate */
594     static gboolean is_kakko_or_kokka(gunichar ch, gpointer p) {
595     return ch == '(' || ch == ')';
596     }
597     static gboolean is_kakko(gunichar ch, gpointer p) {return ch == '(';}
598     static gboolean is_kokka(gunichar ch, gpointer p) {return ch == ')';}
599     static gboolean search_sexp_kokka(GtkTextIter *end) {
600     gint nest_level = 0;
601    
602     /* ������������ ')' ��������� */
603     while(1) {
604     if(!gtk_text_iter_forward_find_char(end, is_kakko_or_kokka, NULL, NULL))
605     return FALSE;
606    
607     if(gtk_text_iter_get_char(end) == '(')
608     nest_level++;
609     else {
610     if(!nest_level)
611     break;
612     else
613     nest_level--;
614     }
615     }
616     return TRUE;
617     }
618    
619    
620     /* ')' ��������������� '(' ������������������ (S ���) ��������������� */
621     static gboolean search_last_sexp_kakko(GtkTextIter *start) {
622     gint nest_level = 0;
623     /* ��������������������������������������� ')' ��������� */
624     while(1) {
625     if(!gtk_text_iter_backward_find_char(start, is_kakko_or_kokka, NULL, NULL))
626     return FALSE;
627    
628     if(gtk_text_iter_get_char(start) == ')')
629     nest_level++;
630     else {
631     if(!nest_level)
632     break;
633     else
634     nest_level--;
635     }
636     }
637     return TRUE;
638     }
639    
640     /* ��������������������� '(' ��������������� ')' ������������������ (S ���) ��������������� */
641     static gboolean search_sexp(GtkTextIter *start, GtkTextIter *end) {
642    
643     /* ������������������������������ */
644     gtk_text_buffer_get_iter_at_mark(Shiki_CURRENT_TEXT_BUFFER, start, gtk_text_buffer_get_insert(Shiki_CURRENT_TEXT_BUFFER));
645    
646     if(gtk_text_iter_get_char(start) != '(')
647     gtk_text_iter_forward_find_char(start, is_kakko, NULL, NULL);
648    
649     *end = *start;
650    
651     /* ��������������������������������� S ������������������ */
652     if(!search_sexp_kokka(end)) return FALSE;
653     gtk_text_iter_forward_char(end);
654     return TRUE;
655     }
656    
657     /* ��������������������� ')' ��������������� '(' ������������������ (S ���) ��������������� */
658     static gboolean search_last_sexp(GtkTextIter *start, GtkTextIter *end) {
659    
660     /* ������������������������������ */
661     gtk_text_buffer_get_iter_at_mark(Shiki_CURRENT_TEXT_BUFFER, end, gtk_text_buffer_get_insert(Shiki_CURRENT_TEXT_BUFFER));
662    
663     gtk_text_iter_backward_char(end);
664    
665     if(gtk_text_iter_get_char(end) != ')')
666     gtk_text_iter_backward_find_char(end, is_kokka, NULL, NULL);
667     *start = *end;
668     gtk_text_iter_forward_char(end);
669    
670     /* ��������������������������������� S ������������������ */
671     if(!search_last_sexp_kakko(start)) return FALSE;
672    
673     return TRUE;
674     }
675    
676     /* gauche ��������������������������������� */
677     static gchar *eval_cstring_by_gauche(gchar *s) {
678     gchar *msg;
679    
680     ScmObj result, error;
681     /* ������������������������������ */
682     ScmObj os = Scm_MakeOutputStringPort(TRUE);
683    
684     /* Scheme ��������������������������������������� */
685     /* http://alohakun.blog7.fc2.com/blog-entry-517.html */
686     Scm_Define(SCM_MODULE(Shiki_CURRENT_BUFFER_ENV), SCM_SYMBOL(SCM_INTERN("*input*")), SCM_MAKE_STR_COPYING(s));
687     Scm_Define(SCM_MODULE(Shiki_CURRENT_BUFFER_ENV), SCM_SYMBOL(SCM_INTERN("*error*")), SCM_FALSE);
688    
689     result = Scm_EvalCString("(guard (e (else (set! *error* e) #f)) (eval (read-from-string *input*) (current-module)))", SCM_OBJ(Shiki_CURRENT_BUFFER_ENV));
690    
691     error = Scm_GlobalVariableRef(SCM_MODULE(Shiki_CURRENT_BUFFER_ENV), SCM_SYMBOL(SCM_INTERN("*error*")), 0);
692    
693     /* ��������������������������������������������������������� */
694     if (!SCM_FALSEP(error))
695     Scm_Write(error, os, SCM_WRITE_DISPLAY);
696     else
697     Scm_Write(result, os, SCM_WRITE_DISPLAY);
698    
699     msg = Scm_GetString(SCM_STRING(Scm_GetOutputString(SCM_PORT(os))));
700     /* ������������������ */
701     Scm_ClosePort(SCM_PORT(os));
702    
703     return msg;
704     }
705 aloha 1.15 void Shiki_load_file(const gchar *filename) {
706     gchar *result, *utf8filename = g_filename_to_utf8(filename, -1, NULL, NULL, NULL);
707     GtkTextIter p;
708    
709     Scm_Define(SCM_MODULE(Shiki_CURRENT_BUFFER_ENV), SCM_SYMBOL(SCM_INTERN("*filename*")), SCM_MAKE_STR_COPYING(utf8filename));
710     result = eval_cstring_by_gauche("(load *filename*)");
711    
712     gtk_text_buffer_get_end_iter(Shiki_CURRENT_TEXT_BUFFER, &p);
713     gtk_text_buffer_insert(Shiki_CURRENT_TEXT_BUFFER, &p, "\n", -1);
714     gtk_text_buffer_insert(Shiki_CURRENT_TEXT_BUFFER, &p, result, -1);
715     }
716 aloha 1.13
717     void Shiki_eval_expression() {
718    
719     gchar *code, *result;
720     GtkTextIter start, end;
721    
722     if(!search_sexp(&start, &end)) return;
723    
724     code = gtk_text_buffer_get_text(Shiki_CURRENT_TEXT_BUFFER, &start, &end, FALSE);
725     result = eval_cstring_by_gauche(code);
726     g_free(code);
727    
728     gtk_text_buffer_get_iter_at_mark(Shiki_CURRENT_TEXT_BUFFER, &end, gtk_text_buffer_get_insert(Shiki_CURRENT_TEXT_BUFFER));
729    
730     gtk_text_buffer_insert(Shiki_CURRENT_TEXT_BUFFER, &end, "\n", -1);
731     gtk_text_buffer_insert(Shiki_CURRENT_TEXT_BUFFER, &end, result, -1);
732     gtk_text_buffer_insert(Shiki_CURRENT_TEXT_BUFFER, &end, "\n", -1);
733     }
734    
735     void Shiki_eval_last_sexp() {
736     gchar *code, *result;
737     GtkTextIter start, end;
738    
739     if(!search_last_sexp(&start, &end)) return;
740    
741     code = gtk_text_buffer_get_text(Shiki_CURRENT_TEXT_BUFFER, &start, &end, FALSE);
742     result = eval_cstring_by_gauche(code);
743     g_free(code);
744    
745     gtk_text_buffer_get_iter_at_mark(Shiki_CURRENT_TEXT_BUFFER, &end, gtk_text_buffer_get_insert(Shiki_CURRENT_TEXT_BUFFER));
746    
747     gtk_text_buffer_insert(Shiki_CURRENT_TEXT_BUFFER, &end, "\n", -1);
748     gtk_text_buffer_insert(Shiki_CURRENT_TEXT_BUFFER, &end, result, -1);
749     gtk_text_buffer_insert(Shiki_CURRENT_TEXT_BUFFER, &end, "\n", -1);
750     }
751    
752     typedef enum {
753     SHIKI_SEARCH_FORWARD,
754     SHIKI_SEARCH_BACKWARD
755     } ShikiSearchDirection;
756    
757     static struct {
758     GtkWidget *input;
759     gboolean ci;
760     gboolean word;
761     gboolean regexp;
762     gboolean escape;
763     gboolean loop;
764     } ShikiSearchBufferInfo;
765    
766     gboolean Shiki_search_string(const gchar *pattern, gboolean no_dup,
767     ShikiSearchDirection direction) {
768     GtkTextIter p, match_start, match_end, start, end;
769     gboolean result;
770    
771     gtk_text_buffer_get_start_iter(Shiki_CURRENT_TEXT_BUFFER, &start);
772     gtk_text_buffer_get_end_iter(Shiki_CURRENT_TEXT_BUFFER, &end);
773    
774     gtk_text_buffer_get_iter_at_mark(Shiki_CURRENT_TEXT_BUFFER, &p, gtk_text_buffer_get_insert(Shiki_CURRENT_TEXT_BUFFER));
775    
776     if(direction == SHIKI_SEARCH_FORWARD) {
777     if(no_dup)
778     gtk_text_iter_forward_char(&p);
779    
780     result = gtk_text_iter_forward_search(&p, pattern,
781     GTK_TEXT_SEARCH_TEXT_ONLY, &match_start, &match_end, &end);
782     } else {
783     if(no_dup)
784     gtk_text_iter_backward_char(&p);
785 aloha 1.14
786 aloha 1.13 result = gtk_text_iter_backward_search(&p, pattern,
787     GTK_TEXT_SEARCH_TEXT_ONLY, &match_start, &match_end, &start);
788     }
789    
790     if(result) {
791     gtk_text_buffer_remove_tag_by_name(Shiki_CURRENT_TEXT_BUFFER, "match_highlighting", &start, &end);
792     gtk_text_buffer_apply_tag_by_name(Shiki_CURRENT_TEXT_BUFFER, "match_highlighting", &match_start, &match_end);
793     gtk_text_buffer_place_cursor(Shiki_CURRENT_TEXT_BUFFER, &match_start);
794     gtk_text_view_scroll_to_iter(Shiki_CURRENT_TEXT_VIEW, &match_start,
795 aloha 1.14 0.0, FALSE, FALSE, FALSE);
796 aloha 1.13 }
797     return result;
798     }
799    
800     static void destroy_handler(GtkWidget *button, GtkWidget *widget) {gtk_widget_destroy(widget);}
801    
802     static void toggled_handler(GtkToggleButton *togglebutton, gboolean *flag) {
803     *flag = !*flag;
804     }
805    
806     static void search_forward_handler() {
807     Shiki_search_string(gtk_entry_get_text(GTK_ENTRY(ShikiSearchBufferInfo.input)), TRUE, SHIKI_SEARCH_FORWARD);
808     }
809     static void search_backward_handler() {
810     Shiki_search_string(gtk_entry_get_text(GTK_ENTRY(ShikiSearchBufferInfo.input)), TRUE, SHIKI_SEARCH_BACKWARD);
811     }
812    
813     void Shiki_search_buffer() {
814     static GtkWidget *input = NULL;
815     GtkWidget *dialog = gtk_dialog_new_with_buttons ("������������������", GTK_WINDOW(Shiki_EDITOR_WINDOW), GTK_DIALOG_DESTROY_WITH_PARENT, NULL);
816     GtkWidget *table = gtk_table_new(6, 3, FALSE);
817     GtkWidget *label = gtk_label_new("������ : ");
818     GtkWidget *check1 = gtk_check_button_new_with_label("���������������������������������");
819     gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(check1), TRUE);
820     GtkWidget *check2 = gtk_check_button_new_with_label("���������������������������");
821     GtkWidget *check3 = gtk_check_button_new_with_label("������������");
822     GtkWidget *check4 = gtk_check_button_new_with_label("���������������������������������������������");
823     GtkWidget *check5 = gtk_check_button_new_with_label("���������������������������������");
824     GtkWidget *prev = gtk_button_new_with_label ("���������");
825     g_signal_connect (prev, "clicked", G_CALLBACK(search_backward_handler), NULL);
826     GtkWidget *next = gtk_button_new_with_label ("���������");
827     g_signal_connect (next, "clicked", G_CALLBACK(search_forward_handler), NULL);
828     GtkWidget *cancel = gtk_button_new_with_label ("���������������");
829 aloha 1.14
830 aloha 1.13 if(!input)
831     ShikiSearchBufferInfo.input = input = g_object_ref(gtk_entry_new());
832     ShikiSearchBufferInfo.ci =
833 aloha 1.14 ShikiSearchBufferInfo.word =
834     ShikiSearchBufferInfo.regexp =
835     ShikiSearchBufferInfo.escape =
836     ShikiSearchBufferInfo.loop = FALSE;
837 aloha 1.13
838     g_signal_connect (check1, "toggled", G_CALLBACK (toggled_handler), &(ShikiSearchBufferInfo.ci));
839     g_signal_connect (check2, "toggled", G_CALLBACK (toggled_handler), &(ShikiSearchBufferInfo.word));
840     g_signal_connect (check3, "toggled", G_CALLBACK (toggled_handler), &(ShikiSearchBufferInfo.regexp));
841     g_signal_connect (check4, "toggled", G_CALLBACK (toggled_handler), &(ShikiSearchBufferInfo.escape));
842     g_signal_connect (check5, "toggled", G_CALLBACK (toggled_handler), &(ShikiSearchBufferInfo.loop));
843    
844     g_signal_connect (G_OBJECT(dialog), "delete_event", G_CALLBACK(gtk_widget_destroy), NULL);
845     g_signal_connect (G_OBJECT(cancel), "clicked", G_CALLBACK(destroy_handler), dialog);
846     gtk_table_set_row_spacings(GTK_TABLE(table), 10);
847     gtk_table_set_col_spacings(GTK_TABLE(table), 10);
848     gtk_container_border_width (GTK_CONTAINER (dialog), 10);
849     gtk_table_attach_defaults (GTK_TABLE(table), label, 0, 1, 0, 1);
850     gtk_table_attach_defaults (GTK_TABLE(table), input, 1, 2, 0, 1);
851     gtk_table_attach_defaults (GTK_TABLE(table), prev, 2, 3, 0, 1);
852     gtk_table_attach_defaults (GTK_TABLE(table), check1, 1, 2, 1, 2);
853     gtk_table_attach_defaults (GTK_TABLE(table), check2, 1, 2, 2, 3);
854     gtk_table_attach_defaults (GTK_TABLE(table), check3, 1, 2, 3, 4);
855     gtk_table_attach_defaults (GTK_TABLE(table), check4, 1, 2, 4, 5);
856     gtk_table_attach_defaults (GTK_TABLE(table), check5, 1, 2, 5, 6);
857     gtk_table_attach_defaults (GTK_TABLE(table), next, 2, 3, 1, 2);
858     gtk_table_attach_defaults (GTK_TABLE(table), cancel, 2, 3, 2, 3);
859     gtk_container_add(GTK_CONTAINER(GTK_DIALOG(dialog)->vbox), table);
860     gtk_widget_show_all(table);
861     gtk_dialog_run(GTK_DIALOG(dialog));
862     }
863    
864     static struct {
865     GtkWidget *find;
866     GtkWidget *replace;
867     gboolean ci;
868     gboolean word;
869     gboolean regexp;
870     gboolean escape;
871     gboolean from_first;
872     } ShikiReplaceBufferInfo;
873    
874     gboolean Shiki_replace_string(const gchar *find, const gchar *replace, gboolean no_dup, gboolean interactive_p, gboolean from_first_p) {
875     GtkTextIter start, end, match_start, match_end;
876     gboolean result = FALSE;
877    
878     if(from_first_p)
879     gtk_text_buffer_get_start_iter(Shiki_CURRENT_TEXT_BUFFER, &start);
880     else
881     gtk_text_buffer_get_iter_at_mark(Shiki_CURRENT_TEXT_BUFFER, &start, gtk_text_buffer_get_insert(Shiki_CURRENT_TEXT_BUFFER));
882    
883     gtk_text_buffer_get_end_iter(Shiki_CURRENT_TEXT_BUFFER, &end);
884    
885     while((result = gtk_text_iter_forward_search(&start, find,
886 aloha 1.14 GTK_TEXT_SEARCH_TEXT_ONLY, &match_start, &match_end, &end))) {
887 aloha 1.13
888     gtk_text_buffer_remove_tag_by_name(Shiki_CURRENT_TEXT_BUFFER, "match_highlighting", &start, &end);
889     gtk_text_buffer_apply_tag_by_name(Shiki_CURRENT_TEXT_BUFFER, "match_highlighting", &match_start, &match_end);
890     gtk_text_buffer_place_cursor(Shiki_CURRENT_TEXT_BUFFER, &match_start);
891     gtk_text_view_scroll_to_iter(Shiki_CURRENT_TEXT_VIEW, &match_start,
892     0.0, FALSE, FALSE, FALSE);
893     if(!interactive_p
894     ||
895     (interactive_p && Shiki_yes_or_no_p("������������������ ?"))) {
896     gtk_text_buffer_delete(Shiki_CURRENT_TEXT_BUFFER, &match_start, &match_end);
897     gtk_text_buffer_insert_at_cursor(Shiki_CURRENT_TEXT_BUFFER, replace, -1);
898     }
899     gtk_text_buffer_get_iter_at_mark(Shiki_CURRENT_TEXT_BUFFER, &start, gtk_text_buffer_get_insert(Shiki_CURRENT_TEXT_BUFFER));
900     gtk_text_iter_forward_char(&start);
901     gtk_text_buffer_get_end_iter(Shiki_CURRENT_TEXT_BUFFER, &end);
902     }
903    
904     return result;
905     }
906    
907     static void replace_interactive_handler() {
908     Shiki_replace_string(gtk_entry_get_text(GTK_ENTRY(ShikiReplaceBufferInfo.find)), gtk_entry_get_text(GTK_ENTRY(ShikiReplaceBufferInfo.replace)), TRUE, TRUE, ShikiReplaceBufferInfo.from_first);
909     }
910     static void replace_all_handler() {
911     Shiki_replace_string(gtk_entry_get_text(GTK_ENTRY(ShikiReplaceBufferInfo.find)), gtk_entry_get_text(GTK_ENTRY(ShikiReplaceBufferInfo.replace)), TRUE, FALSE, ShikiReplaceBufferInfo.from_first);
912     }
913    
914     void Shiki_replace_buffer() {
915     static GtkWidget *find = NULL;
916     static GtkWidget *replace = NULL;
917     GtkWidget *dialog = gtk_dialog_new_with_buttons ("������������������", GTK_WINDOW(Shiki_EDITOR_WINDOW), GTK_DIALOG_DESTROY_WITH_PARENT, NULL);
918     GtkWidget *table = gtk_table_new(7, 3, FALSE);
919     GtkWidget *find_label = gtk_label_new("������ : ");
920     GtkWidget *rep_label = gtk_label_new("������ : ");
921     GtkWidget *check1 = gtk_check_button_new_with_label("���������������������������������");
922     gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(check1), TRUE);
923     GtkWidget *check2 = gtk_check_button_new_with_label("���������������������������");
924     GtkWidget *check3 = gtk_check_button_new_with_label("������������");
925     GtkWidget *check4 = gtk_check_button_new_with_label("���������������������������������������������");
926     GtkWidget *check5 = gtk_check_button_new_with_label("���������������������������");
927     gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(check5), TRUE);
928     GtkWidget *interactive = gtk_button_new_with_label ("������������");
929     g_signal_connect (interactive, "clicked", G_CALLBACK(replace_interactive_handler), NULL);
930     GtkWidget *all = gtk_button_new_with_label ("������������");
931     g_signal_connect (all, "clicked", G_CALLBACK(replace_all_handler), NULL);
932     GtkWidget *cancel = gtk_button_new_with_label ("���������������");
933    
934     if(!find && !replace) {
935     ShikiReplaceBufferInfo.find = find = g_object_ref(gtk_entry_new());
936     ShikiReplaceBufferInfo.replace = replace = g_object_ref(gtk_entry_new());
937     }
938 aloha 1.14
939 aloha 1.13 ShikiReplaceBufferInfo.ci =
940 aloha 1.14 ShikiReplaceBufferInfo.word =
941     ShikiReplaceBufferInfo.regexp =
942     ShikiReplaceBufferInfo.escape = FALSE;
943 aloha 1.13 ShikiReplaceBufferInfo.from_first = TRUE;
944    
945     g_signal_connect (check1, "toggled", G_CALLBACK (toggled_handler), &(ShikiReplaceBufferInfo.ci));
946     g_signal_connect (check2, "toggled", G_CALLBACK (toggled_handler), &(ShikiReplaceBufferInfo.word));
947     g_signal_connect (check3, "toggled", G_CALLBACK (toggled_handler), &(ShikiReplaceBufferInfo.regexp));
948     g_signal_connect (check4, "toggled", G_CALLBACK (toggled_handler), &(ShikiReplaceBufferInfo.escape));
949     g_signal_connect (check5, "toggled", G_CALLBACK (toggled_handler), &(ShikiReplaceBufferInfo.from_first));
950    
951     g_signal_connect (G_OBJECT(dialog), "delete_event", G_CALLBACK(gtk_widget_destroy), NULL);
952     g_signal_connect (G_OBJECT(cancel), "clicked", G_CALLBACK(destroy_handler), dialog);
953     gtk_table_set_row_spacings(GTK_TABLE(table), 10);
954     gtk_table_set_col_spacings(GTK_TABLE(table), 10);
955     gtk_container_border_width (GTK_CONTAINER (dialog), 10);
956    
957     gtk_table_attach_defaults (GTK_TABLE(table), find_label, 0, 1, 0, 1);
958     gtk_table_attach_defaults (GTK_TABLE(table), find, 1, 2, 0, 1);
959     gtk_table_attach_defaults (GTK_TABLE(table), interactive, 2, 3, 0, 1);
960    
961     gtk_table_attach_defaults (GTK_TABLE(table), rep_label, 0, 1, 1, 2);
962     gtk_table_attach_defaults (GTK_TABLE(table), replace, 1, 2, 1, 2);
963     gtk_table_attach_defaults (GTK_TABLE(table), all, 2, 3, 1, 2);
964    
965     gtk_table_attach_defaults (GTK_TABLE(table), check1, 1, 2, 2, 3);
966     gtk_table_attach_defaults (GTK_TABLE(table), cancel, 2, 3, 2, 3);
967    
968     gtk_table_attach_defaults (GTK_TABLE(table), check2, 1, 2, 3, 4);
969     gtk_table_attach_defaults (GTK_TABLE(table), check3, 1, 2, 4, 5);
970     gtk_table_attach_defaults (GTK_TABLE(table), check4, 1, 2, 5, 6);
971     gtk_table_attach_defaults (GTK_TABLE(table), check5, 1, 2, 6, 7);
972    
973     gtk_container_add(GTK_CONTAINER(GTK_DIALOG(dialog)->vbox), table);
974     gtk_widget_show_all(table);
975     gtk_dialog_run(GTK_DIALOG(dialog));
976     }
977    
978    

Back to OSDN">Back to OSDN
ViewVC Help
Powered by ViewVC 1.1.26