Develop and Download Open Source Software

Browse CVS Repository

Contents of /shiki/shiki/buffer.c

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


Revision 1.13 - (show 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 /* 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 * $Id: buffer.c,v 1.12 2006/11/30 14:45:49 aloha Exp $
28 */
29 #include"shiki.h"
30
31 ScmClass *ShikiBufferClass;
32 extern void Scm_Init_xyzzylisp(ScmModule *module);
33
34 /* GtkTextBuffer ��������������������� ShikiBuffer ��������������������� */
35 static gint compBuffer(gconstpointer a, gconstpointer b) {
36 return ((ShikiBuffer *)a)->text_buffer == b ? 0 : b - a;
37 }
38
39 static GList *get_ShikiBufferListElement_By_GtkTextBuffer(GtkTextBuffer *b) {
40 return g_list_find_custom(Shiki_EDITOR_BUFFER_LIST, b, compBuffer);
41 }
42
43 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
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 /* ��������������������������������������������������������������� */
120 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 }
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 static void cursor_moved_handler() {
138 Shiki_update_modeline(Shiki_CURRENT_TEXT_BUFFER);
139 }
140
141 /* ��������������������������������������� (������������) ��������� */
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 tabinfo->tabpage_label = g_strndup(tabinfo->name, 10);
151 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 g_signal_connect(tabinfo->text_buffer, "mark_set", G_CALLBACK(cursor_moved_handler), tabinfo->text_view);
174 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 /* ������/������������������������������������ */
186 gtk_text_buffer_create_tag(tabinfo->text_buffer, "match_highlighting", "background", "pink", NULL);
187
188 /* ������������������������������������������ */
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
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 return tabinfo->text_buffer;
208 }
209
210 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 gtk_text_buffer_set_text(Shiki_CURRENT_TEXT_BUFFER, text, -1);
243 else
244 gtk_text_buffer_set_text(Shiki_CURRENT_TEXT_BUFFER, contents, -1);
245 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 Shiki_update_modeline(Shiki_CURRENT_TEXT_BUFFER);
255 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 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 return;
275 /* ��������������������������������������������������������������������������������������������� */
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
316 return gtk_text_buffer_delete(Shiki_CURRENT_TEXT_BUFFER, &s, &e);
317 }
318 }
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
377 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 }
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 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 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
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 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 gtk_widget_destroy(dialog);
477 if(GTK_RESPONSE_YES == resp)
478 return TRUE;
479 return FALSE;
480 }
481
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
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
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