| 54 |
} shiki_editor; |
} shiki_editor; |
| 55 |
|
|
| 56 |
/* シングルトンオブジェクトの定義 */ |
/* シングルトンオブジェクトの定義 */ |
|
/* TODO : GtkNoteBook もここに入れるのが望ましいと思う… |
|
|
* ノートブックは,どう考えても,一つのプロセスに一つだよなぁ… |
|
|
* そもそも TAB_INFO_LIST が入っちゃってるのに |
|
|
* そうすれば,一気に全体的に API が簡素になるはず */ |
|
| 57 |
#define Shiki_EDITOR_WINDOW shiki_editor.editor_window |
#define Shiki_EDITOR_WINDOW shiki_editor.editor_window |
| 58 |
#define Shiki_EDITOR_NOTEBOOK shiki_editor.notebook |
#define Shiki_EDITOR_NOTEBOOK shiki_editor.notebook |
| 59 |
#define Shiki_EDITOR_STATUSBAR shiki_editor.statusbar |
#define Shiki_EDITOR_STATUSBAR shiki_editor.statusbar |
| 72 |
|
|
| 73 |
/* プロトタイプ */ |
/* プロトタイプ */ |
| 74 |
|
|
| 75 |
|
/* タブの生成と削除 : 基本的に,ShikiTabInfo の中身に格納する情報を増やしたかったら,この 2 つの関数だけを変更すれば良い (ようにする…) */ |
| 76 |
|
static void append_tabpage(gchar *filename); |
| 77 |
|
static void remove_tabpage(); |
| 78 |
|
|
| 79 |
/* ファイル関係 */ |
/* ファイル関係 */ |
| 80 |
static void open_file(GtkNotebook *notebook, gchar *filename); |
static void open_file(gchar *filename); |
| 81 |
static void open_file_from_notebook(GtkNotebook *notebook); |
static void open_file_handler(); |
| 82 |
static void open_file_handler(GtkWidget *widget, GtkWidget *notebook); |
static void save_file(); |
| 83 |
static void save_file_from_notebook(GtkNotebook *notebook); |
static void save_file_as(); |
|
static void save_file_handler(GtkWidget *widget, GtkWidget *notebook); |
|
|
static void save_file_as_from_notebook(GtkNotebook *notebook); |
|
|
static void save_file_as_handler(GtkWidget *widget, GtkWidget *notebook); |
|
| 84 |
static gchar *get_filename_from_dialog(const gchar *msg); |
static gchar *get_filename_from_dialog(const gchar *msg); |
| 85 |
|
|
| 86 |
/* テキストバッファ関係 */ |
/* テキストバッファ関係 */ |
| 93 |
static void update_modeline_label(); |
static void update_modeline_label(); |
| 94 |
static void text_buffer_cursor_moved_handler(); |
static void text_buffer_cursor_moved_handler(); |
| 95 |
|
|
|
|
|
| 96 |
/* 確認 */ |
/* 確認 */ |
| 97 |
static void really_quit_dialog_yes(GtkWidget *widget, gboolean *flag); |
static void really_quit_dialog_yes(GtkWidget *widget, gboolean *flag); |
| 98 |
static void really_quit_dialog_no(GtkWidget *widget, gint *flag); |
static void really_quit_dialog_no(GtkWidget *widget, gint *flag); |
| 99 |
static gboolean not_yet_save_changes_really_quit(GtkTextBuffer *buffer); |
static gboolean not_yet_save_changes_really_quit(GtkTextBuffer *buffer); |
| 100 |
static gboolean delete_event_handler(GtkWidget *widget, GdkEvent *event, GtkWidget *buffer); |
static gboolean delete_event_handler(GtkWidget *widget, GdkEvent *event, GtkTextBuffer *buffer); |
| 101 |
|
|
| 102 |
/* Gauche と S 式操作やインデント関連 */ |
/* Gauche と S 式操作やインデント関連 */ |
| 103 |
static gchar *eval_cstring_by_gauche(gchar *s); |
static gchar *eval_cstring_by_gauche(gchar *s); |
| 104 |
static gchar *load_cstring_by_gauche(gchar *s); |
static gchar *load_cstring_by_gauche(gchar *s); |
| 105 |
static void load_buffer_by_gauche(); |
static void load_buffer_by_gauche(); |
| 106 |
static void load_region_handler(GtkWidget *widget, GtkWidget *notebook); |
static void load_region_by_gauche(); |
| 107 |
static void load_scheme_file_by_gauche(GtkNotebook *notebook); |
static void load_scheme_file_by_gauche(); |
| 108 |
static gboolean is_kakko_or_kokka(gunichar ch, gpointer); |
static gboolean is_kakko_or_kokka(gunichar ch, gpointer); |
| 109 |
static gboolean is_kokka(gunichar ch, gpointer); |
static gboolean is_kokka(gunichar ch, gpointer); |
| 110 |
static gboolean search_last_sexp_string(GtkTextIter *start); |
static gboolean search_last_sexp_string(GtkTextIter *start); |
| 115 |
static void font_selection_ok(GtkWidget *button, GtkWidget *font_dialog); |
static void font_selection_ok(GtkWidget *button, GtkWidget *font_dialog); |
| 116 |
static void switch_tabpage_handler(GtkNotebook *notebook, GtkNotebookPage *page, guint pagenum) ; |
static void switch_tabpage_handler(GtkNotebook *notebook, GtkNotebookPage *page, guint pagenum) ; |
| 117 |
static void tabsborder_on_off(GtkButton *button, GtkNotebook *notebook); |
static void tabsborder_on_off(GtkButton *button, GtkNotebook *notebook); |
| 118 |
static void rotate_tab_position(GtkButton *button, GtkNotebook *notebook); |
static void rotate_tab_position(GtkButton *button, GtkNotebook *notebook); |
| 119 |
|
|
| 120 |
/* バッファ内 ↑↓←→ 移動 */ |
/* バッファ内 ↑↓←→ 移動 */ |
| 121 |
static void forward_current_buffer(); |
static void forward_current_buffer(); |
| 128 |
static gboolean signal_key_release_handler(GtkWidget *notebook, GdkEventKey *event, gpointer contextid); |
static gboolean signal_key_release_handler(GtkWidget *notebook, GdkEventKey *event, gpointer contextid); |
| 129 |
|
|
| 130 |
/* ヘルプや情報 */ |
/* ヘルプや情報 */ |
| 131 |
static void open_online_help(GtkNotebook *notebook); |
static void open_online_help(); |
|
static void online_help_handler(GtkWidget *button, GtkNotebook *notebook); |
|
| 132 |
static void about_this_application(); |
static void about_this_application(); |
| 133 |
|
|
| 134 |
/* 初期化 */ |
/* エディタの初期化 */ |
| 135 |
static void shiki_editor_window_init(int argc, char **argv); |
static void shiki_editor_window_init(int argc, char **argv); |
| 136 |
|
|
|
|
|
|
/* タブの生成と削除 : 基本的に,ShikiTabInfo の中身に格納する情報を増やしたかったら,この 2 つの関数だけを変更すれば良い (ようにする…) */ |
|
|
static void append_tabpage(GtkNotebook *notebook, gchar *filename); |
|
|
static void remove_tabpage(GtkNotebook *notebook); |
|
|
|
|
|
/* 基本的に *_handler は,上記したような関数を呼び出すだけのイベントハンドラのためのラッパー */ |
|
|
static void append_tabpage_handler(GtkButton *button, GtkNotebook *notebook); |
|
|
static void remove_tabpage_handler(GtkButton *button, GtkNotebook *notebook); |
|
|
|
|
| 137 |
/* ノートブックにタブとページ (バッファ) を追加 */ |
/* ノートブックにタブとページ (バッファ) を追加 */ |
| 138 |
static void append_tabpage(GtkNotebook *notebook, gchar *filename) { |
static void append_tabpage(gchar *filename) { |
| 139 |
/*-------------------- 新しいタブを作る ----------------------------------*/ |
/*-------------------- 新しいタブを作る ----------------------------------*/ |
| 140 |
/* ShikiTabInfo には,タブに関連する情報が全て保持されている */ |
/* ShikiTabInfo には,タブに関連する情報が全て保持されている */ |
| 141 |
ShikiTabInfo *tabinfo = g_malloc(sizeof(ShikiTabInfo)); |
ShikiTabInfo *tabinfo = g_malloc(sizeof(ShikiTabInfo)); |
| 162 |
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); |
| 163 |
|
|
| 164 |
/* タブをノートブックに登録する */ |
/* タブをノートブックに登録する */ |
| 165 |
gtk_notebook_append_page(notebook, GTK_WIDGET(tabinfo->tabpage), gtk_label_new(tabinfo->tabpage_label)); |
gtk_notebook_append_page(Shiki_EDITOR_NOTEBOOK, GTK_WIDGET(tabinfo->tabpage), gtk_label_new(tabinfo->tabpage_label)); |
| 166 |
/* 対応するタブ情報を大域テーブルに保存しておく */ |
/* 対応するタブ情報を大域テーブルに保存しておく */ |
| 167 |
Shiki_EDITOR_TAB_INFO_LIST = g_list_append(Shiki_EDITOR_TAB_INFO_LIST, tabinfo); |
Shiki_EDITOR_TAB_INFO_LIST = g_list_append(Shiki_EDITOR_TAB_INFO_LIST, tabinfo); |
| 168 |
gtk_widget_show_all(GTK_WIDGET(notebook)); |
gtk_widget_show_all(GTK_WIDGET(Shiki_EDITOR_NOTEBOOK)); |
| 169 |
/* 開いたページに移動する */ |
/* 開いたページに移動する */ |
| 170 |
gtk_notebook_set_current_page(notebook, g_list_length(Shiki_EDITOR_TAB_INFO_LIST) - 1); |
gtk_notebook_set_current_page(Shiki_EDITOR_NOTEBOOK, g_list_length(Shiki_EDITOR_TAB_INFO_LIST) - 1); |
| 171 |
} |
} |
| 172 |
|
|
| 173 |
/* ノートブックからタブとページ (バッファ) を削除 */ |
/* ノートブックからタブとページ (バッファ) を削除 */ |
| 174 |
static void remove_tabpage(GtkNotebook *notebook) { |
static void remove_tabpage() { |
| 175 |
/* タブが 1 つしか残っていなかったら消させない */ |
/* タブが 1 つしか残っていなかったら消させない */ |
| 176 |
if(g_list_length(Shiki_EDITOR_TAB_INFO_LIST) == 1) |
if(g_list_length(Shiki_EDITOR_TAB_INFO_LIST) == 1) |
| 177 |
return; |
return; |
| 188 |
|
|
| 189 |
/* カレントのタブ情報を更新 */ |
/* カレントのタブ情報を更新 */ |
| 190 |
Shiki_CURRENT_TAB_INFO = g_list_nth_data(Shiki_EDITOR_TAB_INFO_LIST, Shiki_CURRENT_TAB_NUM); |
Shiki_CURRENT_TAB_INFO = g_list_nth_data(Shiki_EDITOR_TAB_INFO_LIST, Shiki_CURRENT_TAB_NUM); |
| 191 |
gtk_notebook_remove_page(notebook, Shiki_CURRENT_TAB_NUM); |
gtk_notebook_remove_page(Shiki_EDITOR_NOTEBOOK, Shiki_CURRENT_TAB_NUM); |
| 192 |
/* ウィジットを強制的に再描画 */ |
/* ウィジットを強制的に再描画 */ |
| 193 |
gtk_widget_queue_draw(GTK_WIDGET(notebook)); |
gtk_widget_queue_draw(GTK_WIDGET(Shiki_EDITOR_NOTEBOOK)); |
| 194 |
} |
} |
| 195 |
} |
} |
| 196 |
|
|
|
static void remove_tabpage_handler(GtkButton *button, GtkNotebook *notebook) { |
|
|
remove_tabpage(notebook); |
|
|
} |
|
|
|
|
|
static void append_tabpage_handler(GtkButton *button, GtkNotebook *notebook) { |
|
|
append_tabpage(notebook, g_strdup("*scratch*")); |
|
|
} |
|
|
|
|
| 197 |
/* バッファの内容を消去 */ |
/* バッファの内容を消去 */ |
| 198 |
static void clear_current_buffer() { |
static void clear_current_buffer() { |
| 199 |
GtkTextIter start, end; |
GtkTextIter start, end; |
| 211 |
} |
} |
| 212 |
|
|
| 213 |
/* ファイルをロード */ |
/* ファイルをロード */ |
| 214 |
static void load_scheme_file_by_gauche(GtkNotebook *notebook) { |
static void load_scheme_file_by_gauche() { |
| 215 |
gchar *contents, *text; |
gchar *contents, *text; |
| 216 |
gsize br, bw, len; |
gsize br, bw, len; |
| 217 |
GError *err = NULL; |
GError *err = NULL; |
| 361 |
} |
} |
| 362 |
|
|
| 363 |
/* 現在表示されているページの内容をファイルに保存 */ |
/* 現在表示されているページの内容をファイルに保存 */ |
| 364 |
static void save_file_from_notebook(GtkNotebook *notebook) { |
static void save_file() { |
| 365 |
|
|
| 366 |
/* ヘルプへの変更は保存しない */ |
/* ヘルプへの変更は保存しない */ |
| 367 |
if(g_ascii_strcasecmp("*help*", Shiki_CURRENT_TAB_TITLE) == 0) return; |
if(g_ascii_strcasecmp("*help*", Shiki_CURRENT_TAB_TITLE) == 0) return; |
| 374 |
gchar *filename = get_filename_from_dialog("Save File As ..."); |
gchar *filename = get_filename_from_dialog("Save File As ..."); |
| 375 |
if(!filename) return; |
if(!filename) return; |
| 376 |
if(!save_text_buffer(filename, Shiki_CURRENT_TEXT_BUFFER)) return; |
if(!save_text_buffer(filename, Shiki_CURRENT_TEXT_BUFFER)) return; |
| 377 |
gtk_notebook_set_tab_label_text(notebook, GTK_WIDGET(Shiki_CURRENT_TAB), filename); |
gtk_notebook_set_tab_label_text(Shiki_EDITOR_NOTEBOOK, GTK_WIDGET(Shiki_CURRENT_TAB), filename); |
| 378 |
gtk_window_set_title (GTK_WINDOW(Shiki_EDITOR_WINDOW), filename); |
gtk_window_set_title (GTK_WINDOW(Shiki_EDITOR_WINDOW), filename); |
| 379 |
g_free(filename); |
g_free(filename); |
| 380 |
} else |
} else |
| 381 |
save_text_buffer(Shiki_CURRENT_TAB_TITLE, Shiki_CURRENT_TEXT_BUFFER); |
save_text_buffer(Shiki_CURRENT_TAB_TITLE, Shiki_CURRENT_TEXT_BUFFER); |
| 382 |
} |
} |
| 383 |
|
|
|
/* ファイルを保存するイベントハンドラ */ |
|
|
static void save_file_handler(GtkWidget *widget, GtkWidget *notebook) { |
|
|
save_file_from_notebook(GTK_NOTEBOOK(notebook)); |
|
|
} |
|
|
|
|
| 384 |
/* 現在表示されているページの内容をファイルに別名保存 */ |
/* 現在表示されているページの内容をファイルに別名保存 */ |
| 385 |
static void save_file_as_from_notebook(GtkNotebook *notebook) { |
static void save_file_as() { |
| 386 |
gchar *filename = get_filename_from_dialog("Save File As ..."); |
gchar *filename = get_filename_from_dialog("Save File As ..."); |
| 387 |
|
|
| 388 |
if(!filename) return; |
if(!filename) return; |
| 389 |
if(!save_text_buffer(filename, Shiki_CURRENT_TEXT_BUFFER)) return; |
if(!save_text_buffer(filename, Shiki_CURRENT_TEXT_BUFFER)) return; |
| 390 |
|
|
| 391 |
gtk_notebook_set_tab_label_text(notebook, GTK_WIDGET(Shiki_CURRENT_TAB), filename); |
gtk_notebook_set_tab_label_text(Shiki_EDITOR_NOTEBOOK, GTK_WIDGET(Shiki_CURRENT_TAB), filename); |
| 392 |
gtk_window_set_title (GTK_WINDOW (Shiki_EDITOR_WINDOW), filename); |
gtk_window_set_title (GTK_WINDOW (Shiki_EDITOR_WINDOW), filename); |
| 393 |
|
|
| 394 |
g_free(filename); |
g_free(filename); |
| 395 |
} |
} |
| 396 |
|
|
|
/* ファイルを別名保存するイベントハンドラ */ |
|
|
static void save_file_as_handler(GtkWidget *widget, GtkWidget *notebook) { |
|
|
save_file_as_from_notebook(GTK_NOTEBOOK(notebook)); |
|
|
} |
|
|
|
|
| 397 |
/* YES ボタン,NO ボタンそれぞれで呼ばれる callback */ |
/* YES ボタン,NO ボタンそれぞれで呼ばれる callback */ |
| 398 |
static void really_quit_dialog_yes(GtkWidget *widget, gboolean *flag){*flag = FALSE;} |
static void really_quit_dialog_yes(GtkWidget *widget, gboolean *flag){*flag = FALSE;} |
| 399 |
static void really_quit_dialog_no(GtkWidget *widget, gint *flag){*flag = TRUE;} |
static void really_quit_dialog_no(GtkWidget *widget, gint *flag){*flag = TRUE;} |
| 442 |
} |
} |
| 443 |
|
|
| 444 |
/* バッファがまだ保存されていないのに本当に終了するのかを尋ねる */ |
/* バッファがまだ保存されていないのに本当に終了するのかを尋ねる */ |
| 445 |
static gboolean delete_event_handler(GtkWidget *widget, GdkEvent *event, GtkWidget *buffer){ |
static gboolean delete_event_handler(GtkWidget *widget, GdkEvent *event, GtkTextBuffer *buffer){ |
| 446 |
return not_yet_save_changes_really_quit(GTK_TEXT_BUFFER(buffer)); |
return not_yet_save_changes_really_quit(buffer); |
| 447 |
} |
} |
| 448 |
|
|
| 449 |
/* ファイルを開く */ |
/* ファイルを開く */ |
| 450 |
static void open_file(GtkNotebook *notebook, gchar *filename) { |
static void open_file(gchar *filename) { |
| 451 |
gchar *contents, *text; |
gchar *contents, *text; |
| 452 |
gsize br, bw, len; |
gsize br, bw, len; |
| 453 |
GError *err = NULL; |
GError *err = NULL; |
| 454 |
|
|
| 455 |
|
g_return_if_fail(filename != NULL); |
| 456 |
|
|
| 457 |
if(g_file_get_contents(filename, &contents, &len, NULL)) { |
if(g_file_get_contents(filename, &contents, &len, NULL)) { |
| 458 |
GtkTextIter p; |
GtkTextIter p; |
| 459 |
|
|
| 460 |
/* 新しいバッファを開く */ |
/* 新しいバッファを開く */ |
| 461 |
append_tabpage(notebook, g_strdup(filename)); |
append_tabpage(g_strdup(filename)); |
| 462 |
|
|
| 463 |
if(!(text = g_locale_to_utf8(contents, -1, &br, &bw, &err))) |
if(!(text = g_locale_to_utf8(contents, -1, &br, &bw, &err))) |
| 464 |
gtk_text_buffer_set_text(Shiki_CURRENT_TEXT_BUFFER, contents, len); |
gtk_text_buffer_set_text(Shiki_CURRENT_TEXT_BUFFER, contents, len); |
| 472 |
gtk_text_buffer_place_cursor(Shiki_CURRENT_TEXT_BUFFER, &p); |
gtk_text_buffer_place_cursor(Shiki_CURRENT_TEXT_BUFFER, &p); |
| 473 |
update_modeline_label(); |
update_modeline_label(); |
| 474 |
gtk_window_set_title (GTK_WINDOW (Shiki_EDITOR_WINDOW), filename); |
gtk_window_set_title (GTK_WINDOW (Shiki_EDITOR_WINDOW), filename); |
| 475 |
gtk_widget_show_all(GTK_WIDGET(notebook)); |
gtk_widget_show_all(GTK_WIDGET(Shiki_EDITOR_NOTEBOOK)); |
| 476 |
g_free(contents); g_free(text); g_free(filename); |
g_free(contents); g_free(text); g_free(filename); |
| 477 |
} else |
} else |
| 478 |
g_printerr("Get file contents error !\n"); |
g_printerr("Get file contents error !\n"); |
| 479 |
} |
} |
| 480 |
|
|
| 481 |
/* ファイルをダイアログで指定して開く */ |
/* ファイルをダイアログで指定して開く */ |
| 482 |
static void open_file_from_notebook(GtkNotebook *notebook) { |
static void open_file_handler() { |
| 483 |
gchar *filename = get_filename_from_dialog("File Selection"); |
gchar *filename = get_filename_from_dialog("File Selection"); |
| 484 |
|
|
| 485 |
if(!filename) return; |
if(!filename) return; |
| 486 |
open_file(notebook, filename); |
open_file(filename); |
|
} |
|
|
|
|
|
/* ファイルを開くイベントハンドラ */ |
|
|
static void open_file_handler(GtkWidget *widget, GtkWidget *notebook) { |
|
|
open_file_from_notebook(GTK_NOTEBOOK(notebook)); |
|
| 487 |
} |
} |
| 488 |
|
|
| 489 |
/* gauche を起動して文字列を評価 */ |
/* gauche を起動して文字列を評価 */ |
| 517 |
} |
} |
| 518 |
|
|
| 519 |
/* 緑ボタンのハンドリング.バッファの選択範囲の S 式をロード (逐次評価) */ |
/* 緑ボタンのハンドリング.バッファの選択範囲の S 式をロード (逐次評価) */ |
| 520 |
static void load_region_handler(GtkWidget *widget, GtkWidget *notebook) { |
static void load_region_by_gauche() { |
| 521 |
|
|
| 522 |
GtkTextIter start, end, p; |
GtkTextIter start, end, p; |
| 523 |
gchar *code; |
gchar *code; |
| 688 |
break; |
break; |
| 689 |
|
|
| 690 |
case GDK_t : /* Ctrl + t : タブを開く */ |
case GDK_t : /* Ctrl + t : タブを開く */ |
| 691 |
append_tabpage(GTK_NOTEBOOK(notebook), g_strdup("*scratch*")); |
append_tabpage(g_strdup("*scratch*")); |
| 692 |
break; |
break; |
| 693 |
|
|
| 694 |
case GDK_k : /* Ctrl + k : タブを閉じる */ |
case GDK_k : /* Ctrl + k : タブを閉じる */ |
| 695 |
remove_tabpage(GTK_NOTEBOOK(notebook)); |
remove_tabpage(); |
| 696 |
break; |
break; |
| 697 |
} |
} |
| 698 |
} |
} |
| 749 |
|
|
| 750 |
case GDK_f : /* C-x C-f : ファイル開く */ |
case GDK_f : /* C-x C-f : ファイル開く */ |
| 751 |
gtk_statusbar_push(GTK_STATUSBAR(Shiki_EDITOR_STATUSBAR), GPOINTER_TO_INT(contextid), "C-f"); |
gtk_statusbar_push(GTK_STATUSBAR(Shiki_EDITOR_STATUSBAR), GPOINTER_TO_INT(contextid), "C-f"); |
| 752 |
open_file_from_notebook(GTK_NOTEBOOK(notebook)); |
open_file_handler(); |
| 753 |
break; |
break; |
| 754 |
|
|
| 755 |
case GDK_s : /* C-x C-s : ファイル保存 */ |
case GDK_s : /* C-x C-s : ファイル保存 */ |
| 756 |
gtk_statusbar_push(GTK_STATUSBAR(Shiki_EDITOR_STATUSBAR), GPOINTER_TO_INT(contextid), "C-s"); |
gtk_statusbar_push(GTK_STATUSBAR(Shiki_EDITOR_STATUSBAR), GPOINTER_TO_INT(contextid), "C-s"); |
| 757 |
save_file_from_notebook(GTK_NOTEBOOK(notebook)); |
save_file(); |
| 758 |
break; |
break; |
| 759 |
|
|
| 760 |
case GDK_w : /* C-x C-w : ファイル別名保存 */ |
case GDK_w : /* C-x C-w : ファイル別名保存 */ |
| 761 |
gtk_statusbar_push(GTK_STATUSBAR(Shiki_EDITOR_STATUSBAR), GPOINTER_TO_INT(contextid), "C-w"); |
gtk_statusbar_push(GTK_STATUSBAR(Shiki_EDITOR_STATUSBAR), GPOINTER_TO_INT(contextid), "C-w"); |
| 762 |
save_file_as_from_notebook(GTK_NOTEBOOK(notebook)); |
save_file_as(); |
| 763 |
break; |
break; |
| 764 |
} |
} |
| 765 |
controlx_pressed = 0; |
controlx_pressed = 0; |
| 777 |
} |
} |
| 778 |
return FALSE; |
return FALSE; |
| 779 |
} |
} |
| 780 |
static void open_online_help(GtkNotebook *notebook) { |
static void open_online_help() { |
| 781 |
GtkTextIter p; |
GtkTextIter p; |
| 782 |
append_tabpage(notebook, g_strdup("*help*")); |
append_tabpage(g_strdup("*help*")); |
| 783 |
gtk_text_buffer_set_text(Shiki_CURRENT_TEXT_BUFFER, |
gtk_text_buffer_set_text(Shiki_CURRENT_TEXT_BUFFER, |
| 784 |
"起動\n" |
"起動\n" |
| 785 |
"$ ./shiki [file1 file2 ....]\n\n" |
"$ ./shiki [file1 file2 ....]\n\n" |
| 813 |
gtk_text_buffer_place_cursor(Shiki_CURRENT_TEXT_BUFFER, &p); |
gtk_text_buffer_place_cursor(Shiki_CURRENT_TEXT_BUFFER, &p); |
| 814 |
} |
} |
| 815 |
|
|
|
static void online_help_handler(GtkWidget *button, GtkNotebook *notebook) { |
|
|
open_online_help(notebook); |
|
|
} |
|
|
|
|
| 816 |
/* エディタの編集画面の初期化 */ |
/* エディタの編集画面の初期化 */ |
| 817 |
static void shiki_editor_window_init(int argc, char **argv) { |
static void shiki_editor_window_init(int argc, char **argv) { |
| 818 |
GtkWidget *vbox, *toolbar; |
GtkWidget *vbox, *toolbar; |
| 846 |
/* ファイル開く */ |
/* ファイル開く */ |
| 847 |
oicon = gtk_tool_button_new(gtk_image_new_from_stock ("gtk-open", iconsize), ""); |
oicon = gtk_tool_button_new(gtk_image_new_from_stock ("gtk-open", iconsize), ""); |
| 848 |
/* 「開く」ボタンにファイルを読み込むアクションを関連付ける */ |
/* 「開く」ボタンにファイルを読み込むアクションを関連付ける */ |
| 849 |
g_signal_connect(G_OBJECT(oicon), "clicked", G_CALLBACK(open_file_handler), G_OBJECT(Shiki_EDITOR_NOTEBOOK)); |
g_signal_connect(G_OBJECT(oicon), "clicked", G_CALLBACK(open_file_handler), NULL); |
| 850 |
gtk_container_add(GTK_CONTAINER (toolbar), GTK_WIDGET(oicon)); |
gtk_container_add(GTK_CONTAINER (toolbar), GTK_WIDGET(oicon)); |
| 851 |
gtk_tool_item_set_tooltip(oicon, toolbar_tips, "ファイルを開きます", |
gtk_tool_item_set_tooltip(oicon, toolbar_tips, "ファイルを開きます", |
| 852 |
"新しいバッファを開いて,そこにファイルの内容を展開します."); |
"新しいバッファを開いて,そこにファイルの内容を展開します."); |
| 854 |
/* バッファ保存 */ |
/* バッファ保存 */ |
| 855 |
sicon = gtk_tool_button_new(gtk_image_new_from_stock ("gtk-save", iconsize), ""); |
sicon = gtk_tool_button_new(gtk_image_new_from_stock ("gtk-save", iconsize), ""); |
| 856 |
/* 「保存」ボタンにファイルを書き出すアクションを関連付ける */ |
/* 「保存」ボタンにファイルを書き出すアクションを関連付ける */ |
| 857 |
g_signal_connect(G_OBJECT(sicon), "clicked", G_CALLBACK(save_file_handler), G_OBJECT(Shiki_EDITOR_NOTEBOOK)); |
g_signal_connect(G_OBJECT(sicon), "clicked", G_CALLBACK(save_file), NULL); |
| 858 |
gtk_container_add (GTK_CONTAINER (toolbar), GTK_WIDGET(sicon)); |
gtk_container_add (GTK_CONTAINER (toolbar), GTK_WIDGET(sicon)); |
| 859 |
gtk_tool_item_set_tooltip(sicon, toolbar_tips, "バッファを保存します", |
gtk_tool_item_set_tooltip(sicon, toolbar_tips, "バッファを保存します", |
| 860 |
"バッファにファイル名が設定されていない場合には,ダイアログを開いてファイル名を取得します"); |
"バッファにファイル名が設定されていない場合には,ダイアログを開いてファイル名を取得します"); |
| 862 |
/* バッファを別名保存 */ |
/* バッファを別名保存 */ |
| 863 |
saicon = gtk_tool_button_new(gtk_image_new_from_stock ("gtk-save-as", iconsize), ""); |
saicon = gtk_tool_button_new(gtk_image_new_from_stock ("gtk-save-as", iconsize), ""); |
| 864 |
/* 「別名保存」ボタンに別名のファイル開いて内容を書き出すアクションを関連付ける */ |
/* 「別名保存」ボタンに別名のファイル開いて内容を書き出すアクションを関連付ける */ |
| 865 |
g_signal_connect(G_OBJECT(saicon), "clicked", G_CALLBACK(save_file_as_handler), G_OBJECT(Shiki_EDITOR_NOTEBOOK)); |
g_signal_connect(G_OBJECT(saicon), "clicked", G_CALLBACK(save_file_as), NULL); |
| 866 |
gtk_container_add (GTK_CONTAINER (toolbar), GTK_WIDGET(saicon)); |
gtk_container_add (GTK_CONTAINER (toolbar), GTK_WIDGET(saicon)); |
| 867 |
gtk_tool_item_set_tooltip(saicon, toolbar_tips, "バッファを別名保存します", |
gtk_tool_item_set_tooltip(saicon, toolbar_tips, "バッファを別名保存します", |
| 868 |
""); |
""); |
| 870 |
/* バッファ実行 */ |
/* バッファ実行 */ |
| 871 |
eicon = gtk_tool_button_new(gtk_image_new_from_stock ("gtk-execute", iconsize), ""); |
eicon = gtk_tool_button_new(gtk_image_new_from_stock ("gtk-execute", iconsize), ""); |
| 872 |
/* 「選択範囲をロード」ボタンに libgauche を関連付ける */ |
/* 「選択範囲をロード」ボタンに libgauche を関連付ける */ |
| 873 |
g_signal_connect(G_OBJECT(eicon), "clicked", G_CALLBACK(load_region_handler), G_OBJECT(Shiki_EDITOR_NOTEBOOK)); |
g_signal_connect(G_OBJECT(eicon), "clicked", G_CALLBACK(load_region_by_gauche), NULL); |
| 874 |
gtk_container_add (GTK_CONTAINER (toolbar), GTK_WIDGET(eicon)); |
gtk_container_add (GTK_CONTAINER (toolbar), GTK_WIDGET(eicon)); |
| 875 |
gtk_tool_item_set_tooltip(eicon, toolbar_tips, "選択範囲の S 式をロードします (load-region-lisp)", |
gtk_tool_item_set_tooltip(eicon, toolbar_tips, "選択範囲の S 式をロードします (load-region-lisp)", |
| 876 |
"Scheme (gauche) で評価できる S 式を評価します."); |
"Scheme (gauche) で評価できる S 式を評価します."); |
| 889 |
gtk_tool_item_set_tooltip(icon, toolbar_tips, "タブ位置の設定", ""); |
gtk_tool_item_set_tooltip(icon, toolbar_tips, "タブ位置の設定", ""); |
| 890 |
|
|
| 891 |
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), ""); |
| 892 |
g_signal_connect(G_OBJECT(icon), "clicked", G_CALLBACK(append_tabpage_handler), G_OBJECT(Shiki_EDITOR_NOTEBOOK)); |
g_signal_connect(G_OBJECT(icon), "clicked", G_CALLBACK(append_tabpage), NULL); |
| 893 |
gtk_container_add(GTK_CONTAINER (toolbar), GTK_WIDGET(icon)); |
gtk_container_add(GTK_CONTAINER (toolbar), GTK_WIDGET(icon)); |
| 894 |
gtk_tool_item_set_tooltip(icon, toolbar_tips, "新規バッファを開きます", ""); |
gtk_tool_item_set_tooltip(icon, toolbar_tips, "新規バッファを開きます", ""); |
| 895 |
|
|
| 900 |
"まだ内容が保存されていない場合でも警告しません"); |
"まだ内容が保存されていない場合でも警告しません"); |
| 901 |
|
|
| 902 |
icon = gtk_tool_button_new(gtk_image_new_from_stock ("gtk-close", iconsize), ""); |
icon = gtk_tool_button_new(gtk_image_new_from_stock ("gtk-close", iconsize), ""); |
| 903 |
g_signal_connect(G_OBJECT(icon), "clicked", G_CALLBACK(remove_tabpage_handler), G_OBJECT(Shiki_EDITOR_NOTEBOOK)); |
g_signal_connect(G_OBJECT(icon), "clicked", G_CALLBACK(remove_tabpage), NULL); |
| 904 |
gtk_container_add(GTK_CONTAINER (toolbar), GTK_WIDGET(icon)); |
gtk_container_add(GTK_CONTAINER (toolbar), GTK_WIDGET(icon)); |
| 905 |
gtk_tool_item_set_tooltip(icon, toolbar_tips, "バッファを閉じます", |
gtk_tool_item_set_tooltip(icon, toolbar_tips, "バッファを閉じます", |
| 906 |
"まだ内容が保存されていない場合は警告します"); |
"まだ内容が保存されていない場合は警告します"); |
| 911 |
gtk_tool_item_set_tooltip(icon, toolbar_tips, "フォントの変更", ""); |
gtk_tool_item_set_tooltip(icon, toolbar_tips, "フォントの変更", ""); |
| 912 |
|
|
| 913 |
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), ""); |
| 914 |
g_signal_connect(G_OBJECT(icon), "clicked", G_CALLBACK(load_scheme_file_by_gauche), G_OBJECT(Shiki_EDITOR_NOTEBOOK)); |
g_signal_connect(G_OBJECT(icon), "clicked", G_CALLBACK(load_scheme_file_by_gauche), NULL); |
| 915 |
gtk_container_add(GTK_CONTAINER (toolbar), GTK_WIDGET(icon)); |
gtk_container_add(GTK_CONTAINER (toolbar), GTK_WIDGET(icon)); |
| 916 |
gtk_tool_item_set_tooltip(icon, toolbar_tips, "Scheme ファイルをロード", ""); |
gtk_tool_item_set_tooltip(icon, toolbar_tips, "Scheme ファイルをロード", ""); |
| 917 |
|
|
| 921 |
gtk_tool_item_set_tooltip(icon, toolbar_tips, "バッファをロード", ""); |
gtk_tool_item_set_tooltip(icon, toolbar_tips, "バッファをロード", ""); |
| 922 |
|
|
| 923 |
icon = gtk_tool_button_new(gtk_image_new_from_stock ("gtk-dialog-question", iconsize), ""); |
icon = gtk_tool_button_new(gtk_image_new_from_stock ("gtk-dialog-question", iconsize), ""); |
| 924 |
g_signal_connect(G_OBJECT(icon), "clicked", G_CALLBACK(online_help_handler), Shiki_EDITOR_NOTEBOOK); |
g_signal_connect(G_OBJECT(icon), "clicked", G_CALLBACK(open_online_help), NULL); |
| 925 |
gtk_container_add(GTK_CONTAINER (toolbar), GTK_WIDGET(icon)); |
gtk_container_add(GTK_CONTAINER (toolbar), GTK_WIDGET(icon)); |
| 926 |
gtk_tool_item_set_tooltip(icon, toolbar_tips, "ヘルプ", ""); |
gtk_tool_item_set_tooltip(icon, toolbar_tips, "ヘルプ", ""); |
| 927 |
|
|
| 945 |
if(argc >= 2) { |
if(argc >= 2) { |
| 946 |
int i; |
int i; |
| 947 |
for(i = 1; i < argc; i++) |
for(i = 1; i < argc; i++) |
| 948 |
open_file(Shiki_EDITOR_NOTEBOOK, g_strdup(argv[i])); |
open_file(g_strdup(argv[i])); |
| 949 |
} else /* 指定されてなければ,デフォルトのページを追加 */ |
} else /* 指定されてなければ,デフォルトのページを追加 */ |
| 950 |
open_online_help(Shiki_EDITOR_NOTEBOOK); |
open_online_help(Shiki_EDITOR_NOTEBOOK); |
| 951 |
|
|