| 110 |
tabinfo->undoInfoList = NULL; |
tabinfo->undoInfoList = NULL; |
| 111 |
tabinfo->filename = filename; |
tabinfo->filename = filename; |
| 112 |
tabinfo->name = g_path_get_basename(filename); |
tabinfo->name = g_path_get_basename(filename); |
| 113 |
tabinfo->tabpage_label = g_strndup(tabinfo->name, 7); |
tabinfo->tabpage_label = g_strndup(tabinfo->name, 10); |
| 114 |
tabinfo->env = Scm_MakeModule(NULL, FALSE); |
tabinfo->env = Scm_MakeModule(NULL, FALSE); |
| 115 |
|
|
| 116 |
ShikiBufferClass = Scm_MakeForeignPointerClass(SCM_MODULE(tabinfo->env), |
ShikiBufferClass = Scm_MakeForeignPointerClass(SCM_MODULE(tabinfo->env), |
| 165 |
return tabinfo->text_buffer; |
return tabinfo->text_buffer; |
| 166 |
} |
} |
| 167 |
|
|
| 168 |
|
void Shiki_create_file_buffer(const gchar *filename) { |
| 169 |
|
gchar *text; |
| 170 |
|
gchar *utf8filename = g_locale_to_utf8(filename, -1, NULL, NULL, NULL); |
| 171 |
|
GtkTextIter p; |
| 172 |
|
ScmObj s; |
| 173 |
|
|
| 174 |
|
/* g_file_get_contents(filename, &contents, &len, NULL); */ |
| 175 |
|
|
| 176 |
|
/* 新しいバッファを開く */ |
| 177 |
|
Shiki_new_buffer_create(g_strdup(filename)); |
| 178 |
|
gtk_window_set_title (GTK_WINDOW (Shiki_EDITOR_WINDOW), filename); |
| 179 |
|
|
| 180 |
|
Scm_Define(SCM_MODULE(Shiki_CURRENT_BUFFER_ENV), SCM_SYMBOL(SCM_INTERN("*filename*")), SCM_MAKE_STR_COPYING(utf8filename)); |
| 181 |
|
g_free(utf8filename); |
| 182 |
|
|
| 183 |
|
Scm_EvalCString("(use gauche.charconv)", Shiki_CURRENT_BUFFER_ENV); |
| 184 |
|
|
| 185 |
|
/* ファイルから文字列を取り出し,変換後にバッファに格納 */ |
| 186 |
|
s = Scm_EvalCString("(port->string (open-input-conversion-port (open-input-file *filename*) \"*jp\" :owner? #t))", Shiki_CURRENT_BUFFER_ENV); |
| 187 |
|
text = Scm_GetString(SCM_STRING(s)); |
| 188 |
|
if(text) |
| 189 |
|
gtk_text_buffer_set_text(Shiki_CURRENT_TEXT_BUFFER, text, -1); |
| 190 |
|
else { |
| 191 |
|
/* open-input-conversion-port が失敗したならば,とりあえずシステム |
| 192 |
|
* ロケールに変換してみる.駄目だったら諦めて駄目元で UTF8 |
| 193 |
|
*/ |
| 194 |
|
gchar *contents; |
| 195 |
|
gsize br, bw, len; |
| 196 |
|
GError *err = NULL; |
| 197 |
|
|
| 198 |
|
if(g_file_get_contents(filename, &contents, &len, NULL)) { |
| 199 |
|
if(!(text = g_locale_to_utf8(contents, -1, &br, &bw, &err))) |
| 200 |
|
gtk_text_buffer_insert(Shiki_CURRENT_TEXT_BUFFER, &p, text, -1); |
| 201 |
|
else |
| 202 |
|
gtk_text_buffer_insert(Shiki_CURRENT_TEXT_BUFFER, &p, contents, -1); |
| 203 |
|
g_free(contents); |
| 204 |
|
} |
| 205 |
|
} |
| 206 |
|
|
| 207 |
|
/* バッファ未変更に */ |
| 208 |
|
gtk_text_buffer_set_modified(Shiki_CURRENT_TEXT_BUFFER, FALSE); |
| 209 |
|
/* カーソル位置を先頭に */ |
| 210 |
|
gtk_text_buffer_get_start_iter(Shiki_CURRENT_TEXT_BUFFER, &p); |
| 211 |
|
gtk_text_buffer_place_cursor(Shiki_CURRENT_TEXT_BUFFER, &p); |
| 212 |
|
update_modeline_label(); |
| 213 |
|
gtk_widget_show_all(GTK_WIDGET(Shiki_EDITOR_NOTEBOOK)); |
| 214 |
|
} |
| 215 |
|
|
| 216 |
|
void Shiki_open_file_dialog() { |
| 217 |
|
const gchar *filename = Shiki_file_name_dialog("ファイルを開く"); |
| 218 |
|
|
| 219 |
|
if(!filename) return; |
| 220 |
|
Shiki_create_file_buffer(filename); |
| 221 |
|
} |
| 222 |
|
|
| 223 |
void Shiki_delete_buffer(GtkTextBuffer *buffer) { |
void Shiki_delete_buffer(GtkTextBuffer *buffer) { |
| 224 |
/* バッファリストから,リストの要素,バッファ,バッファの番号を逆引き */ |
/* バッファリストから,リストの要素,バッファ,バッファの番号を逆引き */ |
| 225 |
/* 効率が悪いが,Scheme の世界になるべく Gtk のオブジェクトを持ち込まないため */ |
/* 効率が悪いが,Scheme の世界になるべく Gtk のオブジェクトを持ち込まないため */ |