| 44 |
|
|
| 45 |
/* タブごとの情報を管理する構造体 */ |
/* タブごとの情報を管理する構造体 */ |
| 46 |
typedef struct { |
typedef struct { |
| 47 |
|
const gchar *locale; /* バッファ内容のロケール */ |
| 48 |
GtkScrolledWindow *tabpage; /* タブ */ |
GtkScrolledWindow *tabpage; /* タブ */ |
| 49 |
gchar *tabpage_label; /* ベース (ファイル名) のみ */ |
gchar *tabpage_label; /* ベース (ファイル名) のみ */ |
| 50 |
GtkTextView *text_view; /* タブの表示 */ |
GtkTextView *text_view; /* タブの表示 */ |
| 57 |
|
|
| 58 |
/* エディタ全体に関する情報と,現在表示されているタブ情報へのキャッシュを管理する構造体 */ |
/* エディタ全体に関する情報と,現在表示されているタブ情報へのキャッシュを管理する構造体 */ |
| 59 |
static struct { |
static struct { |
| 60 |
|
const gchar *default_locale; |
| 61 |
GtkWidget *editor_window; |
GtkWidget *editor_window; |
| 62 |
GtkClipboard *clipboard; |
GtkClipboard *clipboard; |
| 63 |
GtkNotebook *notebook; |
GtkNotebook *notebook; |
| 69 |
} shiki_editor; |
} shiki_editor; |
| 70 |
|
|
| 71 |
/* シングルトンオブジェクトの定義 */ |
/* シングルトンオブジェクトの定義 */ |
| 72 |
|
#define Shiki_EDITOR_DEFAULT_LOCALE shiki_editor.default_locale |
| 73 |
#define Shiki_EDITOR_WINDOW shiki_editor.editor_window |
#define Shiki_EDITOR_WINDOW shiki_editor.editor_window |
| 74 |
#define Shiki_EDITOR_CLIPBOARD shiki_editor.clipboard |
#define Shiki_EDITOR_CLIPBOARD shiki_editor.clipboard |
| 75 |
#define Shiki_EDITOR_NOTEBOOK shiki_editor.notebook |
#define Shiki_EDITOR_NOTEBOOK shiki_editor.notebook |
| 80 |
/* 現在表示されているタブに対するアクセス用各種キャッシュ情報 */ |
/* 現在表示されているタブに対するアクセス用各種キャッシュ情報 */ |
| 81 |
#define Shiki_CURRENT_TAB_NUM shiki_editor.current_tabpage_num |
#define Shiki_CURRENT_TAB_NUM shiki_editor.current_tabpage_num |
| 82 |
#define Shiki_CURRENT_TAB_INFO shiki_editor.current_tabpage_info |
#define Shiki_CURRENT_TAB_INFO shiki_editor.current_tabpage_info |
| 83 |
|
#define Shiki_CURRENT_LOCALE (shiki_editor.current_tabpage_info)->locale |
| 84 |
#define Shiki_CURRENT_UNDO_INFO_LIST (shiki_editor.current_tabpage_info)->undoInfoList |
#define Shiki_CURRENT_UNDO_INFO_LIST (shiki_editor.current_tabpage_info)->undoInfoList |
| 85 |
#define Shiki_CURRENT_TAB (shiki_editor.current_tabpage_info)->tabpage |
#define Shiki_CURRENT_TAB (shiki_editor.current_tabpage_info)->tabpage |
| 86 |
#define Shiki_CURRENT_TAB_TITLE (shiki_editor.current_tabpage_info)->tabpage_label |
#define Shiki_CURRENT_TAB_TITLE (shiki_editor.current_tabpage_info)->tabpage_label |
| 102 |
GAUCHE_FUNCTION_COLOR |
GAUCHE_FUNCTION_COLOR |
| 103 |
} HIGHILIGHT_COLOR; |
} HIGHILIGHT_COLOR; |
| 104 |
|
|
| 105 |
|
GdkColor COLOR_BLACK; |
| 106 |
|
GdkColor COLOR_GREEN; |
| 107 |
|
|
| 108 |
/* プロトタイプ */ |
/* プロトタイプ */ |
| 109 |
|
|
| 110 |
/* タブの生成と削除 : 基本的に,ShikiTabInfo の中身に格納する情報を増やしたかったら,この 2 つの関数だけを変更すれば良い (ようにする…) */ |
/* タブの生成と削除 : 基本的に,ShikiTabInfo の中身に格納する情報を増やしたかったら,この 2 つの関数だけを変更すれば良い (ようにする…) */ |
| 131 |
static void delete_range_handler(GtkTextBuffer *buffer, GtkTextIter *start, GtkTextIter *end); |
static void delete_range_handler(GtkTextBuffer *buffer, GtkTextIter *start, GtkTextIter *end); |
| 132 |
|
|
| 133 |
/* モードライン */ |
/* モードライン */ |
|
static gint get_current_line_number(GtkTextBuffer *buffer); |
|
| 134 |
static void update_modeline_label(); |
static void update_modeline_label(); |
| 135 |
static void text_buffer_cursor_moved_handler(); |
static void text_buffer_cursor_moved_handler(); |
| 136 |
|
|
| 423 |
/*-------------------- 新しいタブを作る ----------------------------------*/ |
/*-------------------- 新しいタブを作る ----------------------------------*/ |
| 424 |
/* ShikiTabInfo には,タブに関連する情報が全て保持されている */ |
/* ShikiTabInfo には,タブに関連する情報が全て保持されている */ |
| 425 |
ShikiTabInfo *tabinfo = g_malloc(sizeof(ShikiTabInfo)); |
ShikiTabInfo *tabinfo = g_malloc(sizeof(ShikiTabInfo)); |
| 426 |
|
tabinfo->locale = "Gtk Default (utf8)"; |
| 427 |
tabinfo->undoInfoList = NULL; |
tabinfo->undoInfoList = NULL; |
| 428 |
tabinfo->filename = filename; |
tabinfo->filename = filename; |
| 429 |
tabinfo->tabpage_label = g_path_get_basename(filename); |
tabinfo->tabpage_label = g_path_get_basename(filename); |
| 451 |
/* 様々な初期化処理 */ |
/* 様々な初期化処理 */ |
| 452 |
|
|
| 453 |
/* 括弧の強調表示のためのタグを作る */ |
/* 括弧の強調表示のためのタグを作る */ |
| 454 |
gtk_text_buffer_create_tag(tabinfo->text_buffer, "parent_emphasis_background", "background", "pink", NULL); |
gtk_text_buffer_create_tag(tabinfo->text_buffer, "parent_emphasis_background", "background", "green", NULL); |
| 455 |
|
|
| 456 |
/* キーワードハイライティング */ |
/* キーワードハイライティング */ |
| 457 |
gtk_text_buffer_create_tag(tabinfo->text_buffer, "keyword_highlighting", "foreground", "blue", NULL); |
gtk_text_buffer_create_tag(tabinfo->text_buffer, "keyword_highlighting", "foreground", "blue", NULL); |
| 612 |
gtk_widget_destroy(GTK_WIDGET(about)); |
gtk_widget_destroy(GTK_WIDGET(about)); |
| 613 |
} |
} |
| 614 |
|
|
|
/* 現在のバッファのカーソル位置の行番号を取得 */ |
|
|
static gint get_current_line_number(GtkTextBuffer *b) { |
|
|
GtkTextIter p; |
|
|
gtk_text_buffer_get_iter_at_mark(b, &p, gtk_text_buffer_get_insert(b)); |
|
|
return gtk_text_iter_get_line(&p) + 1; |
|
|
} |
|
|
|
|
| 615 |
/* バッファの状態に合わせてモードラインを変更 */ |
/* バッファの状態に合わせてモードラインを変更 */ |
| 616 |
static void update_modeline_label() { |
static void update_modeline_label() { |
| 617 |
gchar* basename = g_path_get_basename(Shiki_CURRENT_TAB_TITLE); |
static gchar label[1024]; |
| 618 |
gchar* l = g_strdup_printf("-E:%s %-10s (Gauche Interaction)--L%d--------------------------------------", |
GtkTextIter p; |
| 619 |
|
gtk_text_buffer_get_iter_at_mark(Shiki_CURRENT_TEXT_BUFFER, &p, gtk_text_buffer_get_insert(Shiki_CURRENT_TEXT_BUFFER)); |
| 620 |
|
|
| 621 |
|
g_snprintf(label, 1024, "--%s- %-10s (Gauche Interaction) [%s] L%d:%d ", |
| 622 |
gtk_text_buffer_get_modified(Shiki_CURRENT_TEXT_BUFFER) ? "**" : "--", |
gtk_text_buffer_get_modified(Shiki_CURRENT_TEXT_BUFFER) ? "**" : "--", |
| 623 |
basename, get_current_line_number(Shiki_CURRENT_TEXT_BUFFER)); |
Shiki_CURRENT_TAB_TITLE, |
| 624 |
gtk_label_set_text(GTK_LABEL(Shiki_EDITOR_MODELINE_LABEL), l); |
Shiki_CURRENT_LOCALE, |
| 625 |
g_free(l); g_free(basename); |
gtk_text_iter_get_line(&p) + 1, |
| 626 |
|
gtk_text_iter_get_line_offset (&p) + 1); |
| 627 |
|
gtk_label_set_text(GTK_LABEL(Shiki_EDITOR_MODELINE_LABEL), label); |
| 628 |
} |
} |
| 629 |
|
|
| 630 |
static void text_buffer_cursor_moved_handler(){ |
static void text_buffer_cursor_moved_handler(){ |
| 759 |
|
|
| 760 |
/* ファイルを開く */ |
/* ファイルを開く */ |
| 761 |
static void open_file(gchar *filename) { |
static void open_file(gchar *filename) { |
| 762 |
gchar *contents, *text; |
gchar *contents, *text = NULL; |
| 763 |
gsize br, bw, len; |
gsize br, bw, len; |
| 764 |
GError *err = NULL; |
GError *err = NULL; |
| 765 |
|
|
| 773 |
|
|
| 774 |
if(!(text = g_locale_to_utf8(contents, -1, &br, &bw, &err))) |
if(!(text = g_locale_to_utf8(contents, -1, &br, &bw, &err))) |
| 775 |
gtk_text_buffer_set_text(Shiki_CURRENT_TEXT_BUFFER, contents, len); |
gtk_text_buffer_set_text(Shiki_CURRENT_TEXT_BUFFER, contents, len); |
| 776 |
else |
else { |
| 777 |
gtk_text_buffer_set_text(Shiki_CURRENT_TEXT_BUFFER, text, len); |
gtk_text_buffer_set_text(Shiki_CURRENT_TEXT_BUFFER, text, len); |
| 778 |
|
Shiki_CURRENT_LOCALE = Shiki_EDITOR_DEFAULT_LOCALE; |
| 779 |
|
} |
| 780 |
|
|
| 781 |
/* バッファ未変更に */ |
/* バッファ未変更に */ |
| 782 |
gtk_text_buffer_set_modified(Shiki_CURRENT_TEXT_BUFFER, FALSE); |
gtk_text_buffer_set_modified(Shiki_CURRENT_TEXT_BUFFER, FALSE); |
| 1125 |
|
|
| 1126 |
/* エディタの編集画面の初期化 */ |
/* エディタの編集画面の初期化 */ |
| 1127 |
static void shiki_editor_window_init(int argc, char **argv) { |
static void shiki_editor_window_init(int argc, char **argv) { |
| 1128 |
GtkWidget *vbox, *toolbar; |
GtkWidget *vbox, *toolbar, *modeline_bg = gtk_event_box_new(); |
| 1129 |
GtkToolItem *icon; |
GtkToolItem *icon; |
| 1130 |
GtkIconSize iconsize; |
GtkIconSize iconsize; |
| 1131 |
GtkTooltips *toolbar_tips = gtk_tooltips_new(); |
GtkTooltips *toolbar_tips = gtk_tooltips_new(); |
| 1287 |
gtk_container_add(GTK_CONTAINER (toolbar), GTK_WIDGET(icon)); |
gtk_container_add(GTK_CONTAINER (toolbar), GTK_WIDGET(icon)); |
| 1288 |
gtk_tool_item_set_tooltip(icon, toolbar_tips, "このアプリケーションについて", ""); |
gtk_tool_item_set_tooltip(icon, toolbar_tips, "このアプリケーションについて", ""); |
| 1289 |
|
|
| 1290 |
gtk_box_pack_start(GTK_BOX(vbox), Shiki_EDITOR_MODELINE_LABEL = gtk_label_new("-E:** *scratch* (Gauche Interaction)--L1--All---------------------------------"), TRUE, TRUE, 0); |
/* モードライン作る */ |
| 1291 |
|
Shiki_EDITOR_MODELINE_LABEL = gtk_label_new(NULL); |
| 1292 |
|
gtk_container_add(GTK_CONTAINER (modeline_bg), Shiki_EDITOR_MODELINE_LABEL); |
| 1293 |
|
|
| 1294 |
|
gdk_color_parse("black", &COLOR_BLACK); |
| 1295 |
|
gdk_color_parse("green", &COLOR_GREEN); |
| 1296 |
|
|
| 1297 |
|
gtk_widget_modify_fg(Shiki_EDITOR_MODELINE_LABEL, GTK_STATE_NORMAL, &COLOR_GREEN); |
| 1298 |
|
gtk_widget_modify_bg(modeline_bg, GTK_STATE_NORMAL, &COLOR_BLACK); |
| 1299 |
|
|
| 1300 |
|
gtk_box_pack_start(GTK_BOX(vbox), modeline_bg, TRUE, TRUE, 0); |
| 1301 |
|
|
| 1302 |
/* C-x C-s などの状態を表示するステータスバーをウィンドウボトムに追加 */ |
/* C-x C-s などの状態を表示するステータスバーをウィンドウボトムに追加 */ |
| 1303 |
Shiki_EDITOR_STATUSBAR = gtk_statusbar_new(); |
Shiki_EDITOR_STATUSBAR = gtk_statusbar_new(); |
| 1322 |
|
|
| 1323 |
int main(int argc, char *argv[]) { |
int main(int argc, char *argv[]) { |
| 1324 |
/* 初期化してメインループへ */ |
/* 初期化してメインループへ */ |
| 1325 |
gtk_set_locale(); |
Shiki_EDITOR_DEFAULT_LOCALE = g_locale_to_utf8(gtk_set_locale(), -1, NULL, NULL, NULL); |
| 1326 |
gtk_init(&argc, &argv); |
gtk_init(&argc, &argv); |
| 1327 |
GC_INIT(); Scm_Init(GAUCHE_SIGNATURE); |
GC_INIT(); Scm_Init(GAUCHE_SIGNATURE); |
| 1328 |
shiki_editor_window_init(argc, argv); |
shiki_editor_window_init(argc, argv); |