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.13 - (hide annotations) (download) (as text)
Sat Dec 2 14:23:20 2006 UTC (17 years, 4 months ago) by aloha
Branch: MAIN
Changes since 1.12: +382 -3 lines
File MIME type: text/x-csrc
add search-buffer/replace-buffer (interactive/all)

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

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