| 54 |
|
|
| 55 |
/* タブの生成と削除 : 基本的に,ShikiBuffer の中身に格納する情報を増やしたかったら,この 2 つの関数だけを変更すれば良い (ようにする…) */ |
/* タブの生成と削除 : 基本的に,ShikiBuffer の中身に格納する情報を増やしたかったら,この 2 つの関数だけを変更すれば良い (ようにする…) */ |
| 56 |
extern void Scm_Init_xyzzylisp(ScmModule *module); |
extern void Scm_Init_xyzzylisp(ScmModule *module); |
|
static void remove_tabpage(); |
|
| 57 |
|
|
| 58 |
/* foo_bar_handler() は,イベントハンドラのためのラッパー */ |
/* foo_bar_handler() は,イベントハンドラのためのラッパー */ |
| 59 |
|
static void kill_buffer_handler(); |
| 60 |
static void append_default_tabpage_handler(); |
static void append_default_tabpage_handler(); |
| 61 |
|
|
| 62 |
/* ファイル関係 */ |
/* ファイル関係 */ |
| 79 |
static void text_buffer_cursor_moved_handler(); |
static void text_buffer_cursor_moved_handler(); |
| 80 |
|
|
| 81 |
/* 確認 */ |
/* 確認 */ |
|
static gboolean not_yet_save_changes_really_quit(GtkTextBuffer *buffer); |
|
| 82 |
static gboolean delete_event_handler(GtkWidget *widget, GdkEvent *event, GtkTextBuffer *buffer); |
static gboolean delete_event_handler(GtkWidget *widget, GdkEvent *event, GtkTextBuffer *buffer); |
| 83 |
|
|
| 84 |
/* Gauche と S 式操作やインデント・キーワードハイライティング関連 */ |
/* Gauche と S 式操作やインデント・キーワードハイライティング関連 */ |
| 452 |
break; |
break; |
| 453 |
|
|
| 454 |
case GDK_k : /* Ctrl + k : タブを閉じる */ |
case GDK_k : /* Ctrl + k : タブを閉じる */ |
| 455 |
remove_tabpage(); |
kill_buffer_handler(); |
| 456 |
break; |
break; |
| 457 |
|
|
| 458 |
case GDK_w : /* Ctrl + w : カット */ |
case GDK_w : /* Ctrl + w : カット */ |
| 550 |
gtk_widget_show_all(GTK_WIDGET(Shiki_EDITOR_NOTEBOOK)); |
gtk_widget_show_all(GTK_WIDGET(Shiki_EDITOR_NOTEBOOK)); |
| 551 |
/* 開いたページに移動する */ |
/* 開いたページに移動する */ |
| 552 |
gtk_notebook_set_current_page(Shiki_EDITOR_NOTEBOOK, g_list_length(Shiki_EDITOR_BUFFER_LIST) - 1); |
gtk_notebook_set_current_page(Shiki_EDITOR_NOTEBOOK, g_list_length(Shiki_EDITOR_BUFFER_LIST) - 1); |
| 553 |
|
//Shiki_CURRENT_TAB_INFO = tabinfo; |
| 554 |
return tabinfo->text_buffer; |
return tabinfo->text_buffer; |
| 555 |
} |
} |
| 556 |
|
|
| 559 |
} |
} |
| 560 |
|
|
| 561 |
/* ノートブックからタブとページ (バッファ) を削除 */ |
/* ノートブックからタブとページ (バッファ) を削除 */ |
| 562 |
static void remove_tabpage() { |
static void kill_buffer_handler() { |
| 563 |
/* タブが 1 つしか残っていなかったら消させない */ |
Shiki_kill_buffer(Shiki_CURRENT_TEXT_BUFFER); |
|
if(g_list_length(Shiki_EDITOR_BUFFER_LIST) == 1) |
|
|
return; |
|
|
if(!not_yet_save_changes_really_quit(Shiki_CURRENT_TEXT_BUFFER)) { |
|
|
/* デリートハンドラをエディタトップレベルのウィジットから取り除く */ |
|
|
g_signal_handler_disconnect(Shiki_EDITOR_WINDOW, (Shiki_CURRENT_TAB_INFO)->delete_handler_id); |
|
|
/* タブの中身を削除 */ |
|
|
gtk_widget_destroy(GTK_WIDGET(Shiki_CURRENT_TEXT_VIEW)); |
|
|
/* タブに対応するタブ情報を削除 */ |
|
|
g_free(Shiki_CURRENT_TAB_TITLE); |
|
|
g_free(Shiki_CURRENT_BASENAME); |
|
|
g_free(Shiki_CURRENT_FILENAME); |
|
|
Shiki_EDITOR_BUFFER_LIST = g_list_delete_link(Shiki_EDITOR_BUFFER_LIST, g_list_nth(Shiki_EDITOR_BUFFER_LIST, Shiki_CURRENT_TAB_NUM)); |
|
|
g_free(Shiki_CURRENT_TAB_INFO); |
|
|
|
|
|
/* カレントのタブ情報を更新 */ |
|
|
Shiki_CURRENT_TAB_INFO = g_list_nth_data(Shiki_EDITOR_BUFFER_LIST, Shiki_CURRENT_TAB_NUM); |
|
|
gtk_notebook_remove_page(Shiki_EDITOR_NOTEBOOK, Shiki_CURRENT_TAB_NUM); |
|
|
/* ウィジットを強制的に再描画 */ |
|
|
gtk_widget_queue_draw(GTK_WIDGET(Shiki_EDITOR_NOTEBOOK)); |
|
|
} |
|
| 564 |
} |
} |
| 565 |
|
|
| 566 |
/* バッファをまるごとロード */ |
/* バッファをまるごとロード */ |
| 573 |
|
|
| 574 |
/* ファイルをロード */ |
/* ファイルをロード */ |
| 575 |
static void load_scheme_file_by_gauche() { |
static void load_scheme_file_by_gauche() { |
| 576 |
gchar *contents, *text; |
gchar *contents, *text = NULL; |
| 577 |
gsize br, bw, len; |
gsize br, bw, len; |
| 578 |
GError *err = NULL; |
GError *err = NULL; |
| 579 |
const gchar *filename = Shiki_file_name_dialog("File Selection"); |
const gchar *filename = Shiki_file_name_dialog("File Selection"); |
| 745 |
gtk_window_set_title (GTK_WINDOW (Shiki_EDITOR_WINDOW), filename); |
gtk_window_set_title (GTK_WINDOW (Shiki_EDITOR_WINDOW), filename); |
| 746 |
} |
} |
| 747 |
|
|
|
/* 本当に終了してもよろしいですか ? */ |
|
|
static gboolean not_yet_save_changes_really_quit(GtkTextBuffer *buffer) { |
|
|
/* 変更が無ければそのまま終了 */ |
|
|
if(!gtk_text_buffer_get_modified(buffer)) return FALSE; |
|
|
|
|
|
return !Shiki_yes_or_no_p("バッファが変更されています.\nセーブしないで終了しますか ?"); |
|
|
} |
|
|
|
|
| 748 |
/* バッファがまだ保存されていないのに本当に終了するのかを尋ねる */ |
/* バッファがまだ保存されていないのに本当に終了するのかを尋ねる */ |
| 749 |
static gboolean delete_event_handler(GtkWidget *widget, GdkEvent *event, GtkTextBuffer *buffer){ |
static gboolean delete_event_handler(GtkWidget *widget, GdkEvent *event, GtkTextBuffer *buffer){ |
| 750 |
return not_yet_save_changes_really_quit(buffer); |
/* delete-event が発行された際,FALSE を返したらバッファは破棄される */ |
| 751 |
|
return Shiki_need_buffer_save_p(buffer) && !Shiki_yes_or_no_p("バッファは変更されています.変更内容を破棄しますか ?"); |
| 752 |
} |
} |
| 753 |
|
|
| 754 |
/* ファイルを開く */ |
/* ファイルを開く */ |
| 768 |
g_free(utf8filename); |
g_free(utf8filename); |
| 769 |
|
|
| 770 |
Scm_EvalCString("(use gauche.charconv)", Shiki_CURRENT_BUFFER_ENV); |
Scm_EvalCString("(use gauche.charconv)", Shiki_CURRENT_BUFFER_ENV); |
| 771 |
/* |
|
|
Scm_EvalCString("(define contents (call-with-input-file *filename* port->string))", Shiki_CURRENT_BUFFER_ENV); |
|
|
Scm_EvalCString("(define ces (ces-guess-from-string contents \"*JP\"))", Shiki_CURRENT_BUFFER_ENV); |
|
|
ces = Scm_EvalCString("ces", Shiki_CURRENT_BUFFER_ENV); |
|
|
Shiki_CURRENT_CES = Scm_GetString(SCM_STRING(ces)); |
|
|
//s = Scm_EvalCString("(ces-convert contents ces)", Shiki_CURRENT_BUFFER_ENV); |
|
|
s = Scm_EvalCString("(ces-convert contents `utf8)", Shiki_CURRENT_BUFFER_ENV); |
|
|
*/ |
|
|
|
|
| 772 |
/* ファイルから文字列を取り出し,変換後にバッファに格納 */ |
/* ファイルから文字列を取り出し,変換後にバッファに格納 */ |
| 773 |
s = Scm_EvalCString("(port->string (open-input-conversion-port (open-input-file *filename*) \"*jp\" :owner? #t))", Shiki_CURRENT_BUFFER_ENV); |
s = Scm_EvalCString("(port->string (open-input-conversion-port (open-input-file *filename*) \"*jp\" :owner? #t))", Shiki_CURRENT_BUFFER_ENV); |
| 774 |
text = Scm_GetString(SCM_STRING(s)); |
text = Scm_GetString(SCM_STRING(s)); |
| 775 |
gtk_text_buffer_set_text(Shiki_CURRENT_TEXT_BUFFER, text, -1); |
if(text) |
| 776 |
|
gtk_text_buffer_set_text(Shiki_CURRENT_TEXT_BUFFER, text, -1); |
| 777 |
|
else { |
| 778 |
|
/* open-input-conversion-port が失敗したならば,とりあえずシステム |
| 779 |
|
* ロケールに変換してみる.駄目だったら諦めて駄目元で UTF8 |
| 780 |
|
*/ |
| 781 |
|
gchar *contents; |
| 782 |
|
gsize br, bw, len; |
| 783 |
|
GError *err = NULL; |
| 784 |
|
|
| 785 |
|
if(g_file_get_contents(filename, &contents, &len, NULL)) { |
| 786 |
|
if(!(text = g_locale_to_utf8(contents, -1, &br, &bw, &err))) |
| 787 |
|
gtk_text_buffer_insert(Shiki_CURRENT_TEXT_BUFFER, &p, text, -1); |
| 788 |
|
else |
| 789 |
|
gtk_text_buffer_insert(Shiki_CURRENT_TEXT_BUFFER, &p, contents, -1); |
| 790 |
|
g_free(contents); |
| 791 |
|
} |
| 792 |
|
} |
| 793 |
|
|
| 794 |
/* バッファ未変更に */ |
/* バッファ未変更に */ |
| 795 |
gtk_text_buffer_set_modified(Shiki_CURRENT_TEXT_BUFFER, FALSE); |
gtk_text_buffer_set_modified(Shiki_CURRENT_TEXT_BUFFER, FALSE); |
| 1226 |
"まだ内容が保存されていない場合でも警告しません"); |
"まだ内容が保存されていない場合でも警告しません"); |
| 1227 |
|
|
| 1228 |
icon = gtk_tool_button_new(gtk_image_new_from_stock (GTK_STOCK_CLOSE, iconsize), ""); |
icon = gtk_tool_button_new(gtk_image_new_from_stock (GTK_STOCK_CLOSE, iconsize), ""); |
| 1229 |
g_signal_connect(G_OBJECT(icon), "clicked", G_CALLBACK(remove_tabpage), NULL); |
g_signal_connect(G_OBJECT(icon), "clicked", G_CALLBACK(kill_buffer_handler), NULL); |
| 1230 |
gtk_container_add(GTK_CONTAINER (toolbar), GTK_WIDGET(icon)); |
gtk_container_add(GTK_CONTAINER (toolbar), GTK_WIDGET(icon)); |
| 1231 |
gtk_tool_item_set_tooltip(icon, toolbar_tips, "バッファを閉じます", |
gtk_tool_item_set_tooltip(icon, toolbar_tips, "バッファを閉じます", |
| 1232 |
"まだ内容が保存されていない場合は警告します"); |
"まだ内容が保存されていない場合は警告します"); |