| 73 |
Shiki_CURRENT_UNDO_INFO_LIST = g_list_prepend(Shiki_CURRENT_UNDO_INFO_LIST, undoInfo); |
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) { |
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)))); |
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)))); |
| 485 |
if(!Shiki_need_buffer_save_p(buffer) || Shiki_yes_or_no_p("バッファは変更されています.変更内容を破棄しますか ?")) |
if(!Shiki_need_buffer_save_p(buffer) || Shiki_yes_or_no_p("バッファは変更されています.変更内容を破棄しますか ?")) |
| 486 |
Shiki_delete_buffer(buffer); |
Shiki_delete_buffer(buffer); |
| 487 |
} |
} |
| 488 |
|
|
| 489 |
|
void Shiki_msgbox(const gchar *msg) { |
| 490 |
|
GtkWidget *dialog; |
| 491 |
|
dialog = gtk_message_dialog_new(GTK_WINDOW(Shiki_EDITOR_WINDOW), |
| 492 |
|
GTK_DIALOG_DESTROY_WITH_PARENT, GTK_MESSAGE_INFO, GTK_BUTTONS_OK,msg); |
| 493 |
|
gtk_dialog_run(GTK_DIALOG(dialog)); |
| 494 |
|
gtk_widget_destroy(dialog); |
| 495 |
|
} |