| 85 |
static void really_quit_dialog_yes(GtkWidget *widget, gboolean *flag); |
static void really_quit_dialog_yes(GtkWidget *widget, gboolean *flag); |
| 86 |
static void really_quit_dialog_no(GtkWidget *widget, gint *flag); |
static void really_quit_dialog_no(GtkWidget *widget, gint *flag); |
| 87 |
static gboolean not_yet_save_changes_really_quit(GtkTextBuffer *buffer); |
static gboolean not_yet_save_changes_really_quit(GtkTextBuffer *buffer); |
| 88 |
static gboolean delete_event_handler(GtkWidget *widget, GdkEvent *event); |
static gboolean delete_event_handler(GtkWidget *widget, GdkEvent *event, GtkWidget *buffer); |
| 89 |
static void prepend_tabpage(GtkNotebook *notebook, gchar *filename); |
static void append_tabpage(GtkNotebook *notebook, gchar *filename); |
| 90 |
static GtkWidget *new_scrolled_text_buffer(ShikiTabInfo **tabinfo); |
static GtkWidget *new_scrolled_text_buffer(ShikiTabInfo **tabinfo); |
| 91 |
static void open_file_from_notebook(GtkNotebook *notebook); |
static void open_file_from_notebook(GtkNotebook *notebook); |
| 92 |
static void open_file_handler(GtkWidget *widget, GtkWidget *notebook); |
static void open_file_handler(GtkWidget *widget, GtkWidget *notebook); |
| 96 |
static gboolean is_kokka(gunichar ch, gpointer); |
static gboolean is_kokka(gunichar ch, gpointer); |
| 97 |
static gboolean search_sexp_string(GtkTextIter *start); |
static gboolean search_sexp_string(GtkTextIter *start); |
| 98 |
static gint get_parent_nest_level_at_cursor(GtkTextBuffer *buffer); |
static gint get_parent_nest_level_at_cursor(GtkTextBuffer *buffer); |
| 99 |
static void switch_page(GtkNotebook *notebook, GtkNotebookPage *page, guint pagenum) ; |
static void switch_tabpage_handler(GtkNotebook *notebook, GtkNotebookPage *page, guint pagenum) ; |
| 100 |
static void tabsborder_on_off(GtkButton *button, GtkNotebook *notebook); |
static void tabsborder_on_off(GtkButton *button, GtkNotebook *notebook); |
| 101 |
static void remove_tabpage(GtkNotebook *notebook); |
static void remove_tabpage(GtkNotebook *notebook); |
| 102 |
static void remove_tabpage_handler(GtkButton *button, GtkWidget *notebook); |
static void remove_tabpage_handler(GtkButton *button, GtkWidget *notebook); |
| 103 |
static void prepend_tabpage_handler(GtkButton *button, GtkNotebook *notebook); |
static void append_tabpage_handler(GtkButton *button, GtkNotebook *notebook); |
| 104 |
static void rotate_tab_position(GtkButton *button, GtkNotebook *notebook); |
static void rotate_tab_position(GtkButton *button, GtkNotebook *notebook); |
| 105 |
static void forward_current_buffer(); |
static void forward_current_buffer(); |
| 106 |
static void backward_current_buffer(); |
static void backward_current_buffer(); |
| 363 |
} |
} |
| 364 |
|
|
| 365 |
/* バッファがまだ保存されていないのに本当に終了するのかを尋ねる */ |
/* バッファがまだ保存されていないのに本当に終了するのかを尋ねる */ |
| 366 |
static gboolean delete_event_handler(GtkWidget *widget, GdkEvent *event){ |
static gboolean delete_event_handler(GtkWidget *widget, GdkEvent *event, GtkWidget *buffer){ |
| 367 |
return not_yet_save_changes_really_quit(Shiki_CURRENT_TEXT_BUFFER); |
return not_yet_save_changes_really_quit(GTK_TEXT_BUFFER(buffer)); |
| 368 |
} |
} |
| 369 |
|
|
| 370 |
/* 新しいタブを作る */ |
/* 新しいタブを作る */ |
| 383 |
gtk_container_add(GTK_CONTAINER((*tabinfo)->tabpage), GTK_WIDGET((*tabinfo)->text_view)); |
gtk_container_add(GTK_CONTAINER((*tabinfo)->tabpage), GTK_WIDGET((*tabinfo)->text_view)); |
| 384 |
gtk_widget_set_size_request(GTK_WIDGET((*tabinfo)->text_view), 500, 600); |
gtk_widget_set_size_request(GTK_WIDGET((*tabinfo)->text_view), 500, 600); |
| 385 |
g_signal_connect((*tabinfo)->text_buffer, "mark_set", G_CALLBACK(text_buffer_cursor_moved_handler), (*tabinfo)->text_view); |
g_signal_connect((*tabinfo)->text_buffer, "mark_set", G_CALLBACK(text_buffer_cursor_moved_handler), (*tabinfo)->text_view); |
| 386 |
g_signal_connect((*tabinfo)->tabpage, "destroy", G_CALLBACK(delete_event_handler), NULL); |
g_signal_connect(Shiki_EDITOR_WINDOW, "delete_event", G_CALLBACK(delete_event_handler), (*tabinfo)->text_buffer); |
| 387 |
/* 様々な初期化処理 */ |
/* 様々な初期化処理 */ |
| 388 |
/* 括弧の強調表示のためのタグを作る */ |
/* 括弧の強調表示のためのタグを作る */ |
| 389 |
gtk_text_buffer_create_tag ((*tabinfo)->text_buffer, "parent_emphasis_background", "background", "green", NULL); |
gtk_text_buffer_create_tag ((*tabinfo)->text_buffer, "parent_emphasis_background", "background", "green", NULL); |
| 404 |
GtkTextIter p; |
GtkTextIter p; |
| 405 |
|
|
| 406 |
/* 新しいバッファを開く */ |
/* 新しいバッファを開く */ |
| 407 |
prepend_tabpage(notebook, g_strdup(filename)); |
append_tabpage(notebook, g_strdup(filename)); |
| 408 |
|
|
| 409 |
if(!(text = g_locale_to_utf8(contents, -1, &br, &bw, &err))) |
if(!(text = g_locale_to_utf8(contents, -1, &br, &bw, &err))) |
| 410 |
gtk_text_buffer_set_text(Shiki_CURRENT_TEXT_BUFFER, contents, len); |
gtk_text_buffer_set_text(Shiki_CURRENT_TEXT_BUFFER, contents, len); |
| 525 |
} |
} |
| 526 |
|
|
| 527 |
/* タブが切り替わる時のイベントハンドリング */ |
/* タブが切り替わる時のイベントハンドリング */ |
| 528 |
static void switch_page(GtkNotebook *notebook, GtkNotebookPage *page, guint pagenum) { |
static void switch_tabpage_handler(GtkNotebook *notebook, GtkNotebookPage *page, guint pagenum) { |
| 529 |
/* タブに対応する情報が格納された構造体を切替える */ |
/* タブに対応する情報が格納された構造体を切替える */ |
| 530 |
Shiki_CURRENT_TAB_INFO = (ShikiTabInfo *)g_list_nth_data(Shiki_EDITOR_TAB_INFO_LIST, pagenum); |
Shiki_CURRENT_TAB_INFO = (ShikiTabInfo *)g_list_nth_data(Shiki_EDITOR_TAB_INFO_LIST, pagenum); |
| 531 |
/* 現在のタブ番号を切替える */ |
/* 現在のタブ番号を切替える */ |
| 554 |
/* ノートブックからページを削除 */ |
/* ノートブックからページを削除 */ |
| 555 |
static void remove_tabpage(GtkNotebook *notebook) { |
static void remove_tabpage(GtkNotebook *notebook) { |
| 556 |
if(!not_yet_save_changes_really_quit(Shiki_CURRENT_TEXT_BUFFER)) { |
if(!not_yet_save_changes_really_quit(Shiki_CURRENT_TEXT_BUFFER)) { |
| 557 |
/* 対応するタブ情報を削除 */ |
/* タブに対応するタブ情報を削除 */ |
| 558 |
/* XXX : 必要 ??? g_free(Shiki_CURRENT_TAB_TITLE); |
g_free(Shiki_CURRENT_TAB_TITLE); |
| 559 |
g_free(Shiki_CURRENT_FILENAME); */ |
g_free(Shiki_CURRENT_FILENAME); |
| 560 |
Shiki_EDITOR_TAB_INFO_LIST = g_list_delete_link(Shiki_EDITOR_TAB_INFO_LIST, g_list_nth(Shiki_EDITOR_TAB_INFO_LIST, Shiki_CURRENT_TAB_NUM)); |
Shiki_EDITOR_TAB_INFO_LIST = g_list_delete_link(Shiki_EDITOR_TAB_INFO_LIST, g_list_nth(Shiki_EDITOR_TAB_INFO_LIST, Shiki_CURRENT_TAB_NUM)); |
| 561 |
|
|
| 562 |
|
/* カレントのタブ情報を更新 */ |
| 563 |
|
Shiki_CURRENT_TAB_INFO = g_list_nth_data(Shiki_EDITOR_TAB_INFO_LIST, Shiki_CURRENT_TAB_NUM); |
| 564 |
gtk_notebook_remove_page(notebook, Shiki_CURRENT_TAB_NUM); |
gtk_notebook_remove_page(notebook, Shiki_CURRENT_TAB_NUM); |
| 565 |
/* ウィジットを強制的に再描画 */ |
/* ウィジットを強制的に再描画 */ |
| 566 |
gtk_widget_queue_draw(GTK_WIDGET(notebook)); |
gtk_widget_queue_draw(GTK_WIDGET(notebook)); |
| 572 |
} |
} |
| 573 |
|
|
| 574 |
/* ノートブックにページを追加 */ |
/* ノートブックにページを追加 */ |
| 575 |
static void prepend_tabpage(GtkNotebook *notebook, gchar *filename) { |
static void append_tabpage(GtkNotebook *notebook, gchar *filename) { |
| 576 |
ShikiTabInfo *tabinfo; |
ShikiTabInfo *tabinfo; |
| 577 |
GtkWidget *tabpage = new_scrolled_text_buffer(&tabinfo); |
GtkWidget *tabpage = new_scrolled_text_buffer(&tabinfo); |
| 578 |
tabinfo->filename = filename; |
tabinfo->filename = filename; |
| 579 |
tabinfo->tabpage_label = g_path_get_basename(filename); |
tabinfo->tabpage_label = g_path_get_basename(filename); |
| 580 |
gtk_notebook_prepend_page(notebook, tabpage, gtk_label_new(tabinfo->tabpage_label)); |
gtk_notebook_append_page(notebook, tabpage, gtk_label_new(tabinfo->tabpage_label)); |
| 581 |
Shiki_EDITOR_TAB_INFO_LIST = g_list_prepend(Shiki_EDITOR_TAB_INFO_LIST, tabinfo); |
Shiki_EDITOR_TAB_INFO_LIST = g_list_append(Shiki_EDITOR_TAB_INFO_LIST, tabinfo); |
| 582 |
Shiki_CURRENT_TAB_INFO = tabinfo; |
gtk_notebook_set_current_page(notebook, g_list_length(Shiki_EDITOR_TAB_INFO_LIST) - 1); |
| 583 |
gtk_widget_show_all(GTK_WIDGET(notebook)); |
gtk_widget_show_all(GTK_WIDGET(notebook)); |
| 584 |
} |
} |
| 585 |
|
|
| 586 |
static void prepend_tabpage_handler(GtkButton *button, GtkNotebook *notebook) { |
static void append_tabpage_handler(GtkButton *button, GtkNotebook *notebook) { |
| 587 |
prepend_tabpage(notebook, g_strdup("*scratch*")); |
append_tabpage(notebook, g_strdup("*scratch*")); |
| 588 |
} |
} |
| 589 |
|
|
| 590 |
/* タブの位置を調整 */ |
/* タブの位置を調整 */ |
| 667 |
break; |
break; |
| 668 |
|
|
| 669 |
case GDK_t : /* Ctrl + t : タブを開く */ |
case GDK_t : /* Ctrl + t : タブを開く */ |
| 670 |
prepend_tabpage(GTK_NOTEBOOK(notebook), g_strdup("*scratch*")); |
append_tabpage(GTK_NOTEBOOK(notebook), g_strdup("*scratch*")); |
| 671 |
break; |
break; |
| 672 |
|
|
| 673 |
case GDK_k : /* Ctrl + k : タブを閉じる */ |
case GDK_k : /* Ctrl + k : タブを閉じる */ |
| 779 |
gtk_box_pack_start(GTK_BOX(vbox), toolbar, FALSE, FALSE, 0); |
gtk_box_pack_start(GTK_BOX(vbox), toolbar, FALSE, FALSE, 0); |
| 780 |
|
|
| 781 |
notebook = gtk_notebook_new(); |
notebook = gtk_notebook_new(); |
| 782 |
g_signal_connect(G_OBJECT(notebook), "switch-page", GTK_SIGNAL_FUNC(switch_page), NULL); |
g_signal_connect(G_OBJECT(notebook), "switch-page", GTK_SIGNAL_FUNC(switch_tabpage_handler), NULL); |
| 783 |
|
|
| 784 |
/* ツールバーに付けるアイコンの設定 */ |
/* ツールバーに付けるアイコンの設定 */ |
| 785 |
gtk_toolbar_set_style(GTK_TOOLBAR (toolbar), GTK_TOOLBAR_ICONS); |
gtk_toolbar_set_style(GTK_TOOLBAR (toolbar), GTK_TOOLBAR_ICONS); |
| 833 |
gtk_tool_item_set_tooltip(icon, toolbar_tips, "タブ位置の設定", ""); |
gtk_tool_item_set_tooltip(icon, toolbar_tips, "タブ位置の設定", ""); |
| 834 |
|
|
| 835 |
icon = gtk_tool_button_new(gtk_image_new_from_stock ("gtk-add", iconsize), ""); |
icon = gtk_tool_button_new(gtk_image_new_from_stock ("gtk-add", iconsize), ""); |
| 836 |
g_signal_connect(G_OBJECT(icon), "clicked", G_CALLBACK(prepend_tabpage_handler), G_OBJECT(notebook)); |
g_signal_connect(G_OBJECT(icon), "clicked", G_CALLBACK(append_tabpage_handler), G_OBJECT(notebook)); |
| 837 |
gtk_container_add(GTK_CONTAINER (toolbar), GTK_WIDGET(icon)); |
gtk_container_add(GTK_CONTAINER (toolbar), GTK_WIDGET(icon)); |
| 838 |
gtk_tool_item_set_tooltip(icon, toolbar_tips, "新規バッファを開きます", ""); |
gtk_tool_item_set_tooltip(icon, toolbar_tips, "新規バッファを開きます", ""); |
| 839 |
|
|
| 854 |
gtk_container_add(GTK_CONTAINER (toolbar), GTK_WIDGET(icon)); |
gtk_container_add(GTK_CONTAINER (toolbar), GTK_WIDGET(icon)); |
| 855 |
gtk_tool_item_set_tooltip(icon, toolbar_tips, "フォントの変更", ""); |
gtk_tool_item_set_tooltip(icon, toolbar_tips, "フォントの変更", ""); |
| 856 |
|
|
| 857 |
icon = gtk_tool_button_new(gtk_image_new_from_stock ("gtk-connect", iconsize), ""); |
icon = gtk_tool_button_new(gtk_image_new_from_stock ("gtk-connect", iconsize), ""); |
| 858 |
g_signal_connect(G_OBJECT(icon), "clicked", G_CALLBACK(load_scheme_file_by_gauche), G_OBJECT(notebook)); |
g_signal_connect(G_OBJECT(icon), "clicked", G_CALLBACK(load_scheme_file_by_gauche), G_OBJECT(notebook)); |
| 859 |
gtk_container_add(GTK_CONTAINER (toolbar), GTK_WIDGET(icon)); |
gtk_container_add(GTK_CONTAINER (toolbar), GTK_WIDGET(icon)); |
| 860 |
gtk_tool_item_set_tooltip(icon, toolbar_tips, "Scheme ファイルをロード", ""); |
gtk_tool_item_set_tooltip(icon, toolbar_tips, "Scheme ファイルをロード", ""); |
| 881 |
g_signal_connect(G_OBJECT(notebook), "key-release-event", G_CALLBACK (signal_key_release_handler), GINT_TO_POINTER(contextid)); |
g_signal_connect(G_OBJECT(notebook), "key-release-event", G_CALLBACK (signal_key_release_handler), GINT_TO_POINTER(contextid)); |
| 882 |
|
|
| 883 |
/* デフォルトのページを追加 */ |
/* デフォルトのページを追加 */ |
| 884 |
prepend_tabpage(GTK_NOTEBOOK(notebook), g_strdup("*scratch*")); |
append_tabpage(GTK_NOTEBOOK(notebook), g_strdup("*scratch*")); |
| 885 |
|
|
| 886 |
gtk_widget_grab_focus(notebook); |
gtk_widget_grab_focus(notebook); |
| 887 |
gtk_widget_show_all(Shiki_EDITOR_WINDOW); |
gtk_widget_show_all(Shiki_EDITOR_WINDOW); |