| 2 |
* |
* |
| 3 |
* shiki.c |
* shiki.c |
| 4 |
* |
* |
| 5 |
|
* This file is main file of Shiki. |
| 6 |
|
* |
| 7 |
* Copyright(C)2006 WAKATSUKI toshihiro |
* Copyright(C)2006 WAKATSUKI toshihiro |
| 8 |
* |
* |
| 9 |
* Permission is hereby granted, free of charge, to any person obtaining a |
* Permission is hereby granted, free of charge, to any person obtaining a |
| 27 |
* $Id$ |
* $Id$ |
| 28 |
*/ |
*/ |
| 29 |
|
|
| 30 |
#include<gauche.h> |
#include"shiki.h" |
|
#include<gtk/gtk.h> |
|
|
#include<gdk/gdkkeysyms.h> |
|
| 31 |
|
|
| 32 |
static gint editor_indent_width = 2; |
static gint editor_indent_width = 2; |
| 33 |
|
|
|
/* Undo/Redo のための情報 */ |
|
|
typedef enum {SHIKI_UNDO_INSERT, SHIKI_UNDO_DELETE} ShikiAction; |
|
|
|
|
|
typedef struct { |
|
|
ShikiAction action; |
|
|
gchar *str; |
|
|
gint strlen; |
|
|
gint start; |
|
|
gint end; |
|
|
} ShikiUndoInfo; |
|
|
|
|
|
/* タブごとの情報を管理する構造体 */ |
|
|
typedef struct { |
|
|
const gchar *locale; /* バッファ内容のロケール */ |
|
|
GtkScrolledWindow *tabpage; /* タブ */ |
|
|
gchar *tabpage_label; /* タブのタイトル */ |
|
|
gchar *basename; /* ベース (ファイル名) のみ */ |
|
|
GtkTextView *text_view; /* タブの表示 */ |
|
|
GtkTextBuffer *text_buffer; /* タブのテキストバッファ */ |
|
|
gchar *filename; /* ファイル名のフルパス */ |
|
|
GList *undoInfoList; /* タブごとのバッファ変更履歴 */ |
|
|
ScmObj env; /* タブごとに独立した Scheme 環境 */ |
|
|
guint delete_handler_id; /* トップレベルに登録したハンドラ ID */ |
|
|
} ShikiTabInfo; |
|
|
|
|
| 34 |
/* エディタ全体に関する情報と,現在表示されているタブ情報へのキャッシュを管理する構造体 */ |
/* エディタ全体に関する情報と,現在表示されているタブ情報へのキャッシュを管理する構造体 */ |
| 35 |
static struct { |
ShikiEditorType Shiki_editor; |
|
const gchar *default_locale; |
|
|
GtkWidget *editor_window; |
|
|
GtkClipboard *clipboard; |
|
|
GtkNotebook *notebook; |
|
|
GtkWidget *statusbar; |
|
|
GtkWidget *modeline_label; |
|
|
GList *tabInfoList; |
|
|
gint current_tabpage_num; |
|
|
ShikiTabInfo *current_tabpage_info; |
|
|
} shiki_editor; |
|
|
|
|
|
/* シングルトンオブジェクトの定義 */ |
|
|
#define Shiki_EDITOR_DEFAULT_LOCALE shiki_editor.default_locale |
|
|
#define Shiki_EDITOR_WINDOW shiki_editor.editor_window |
|
|
#define Shiki_EDITOR_CLIPBOARD shiki_editor.clipboard |
|
|
#define Shiki_EDITOR_NOTEBOOK shiki_editor.notebook |
|
|
#define Shiki_EDITOR_STATUSBAR shiki_editor.statusbar |
|
|
#define Shiki_EDITOR_MODELINE_LABEL shiki_editor.modeline_label |
|
|
#define Shiki_EDITOR_TAB_INFO_LIST shiki_editor.tabInfoList |
|
|
|
|
|
/* 現在表示されているタブに対するアクセス用各種キャッシュ情報 */ |
|
|
#define Shiki_CURRENT_TAB_NUM shiki_editor.current_tabpage_num |
|
|
#define Shiki_CURRENT_TAB_INFO shiki_editor.current_tabpage_info |
|
|
#define Shiki_CURRENT_CES (shiki_editor.current_tabpage_info)->locale |
|
|
#define Shiki_CURRENT_UNDO_INFO_LIST (shiki_editor.current_tabpage_info)->undoInfoList |
|
|
#define Shiki_CURRENT_TAB (shiki_editor.current_tabpage_info)->tabpage |
|
|
#define Shiki_CURRENT_TAB_TITLE (shiki_editor.current_tabpage_info)->tabpage_label |
|
|
#define Shiki_CURRENT_TEXT_VIEW (shiki_editor.current_tabpage_info)->text_view |
|
|
#define Shiki_CURRENT_TEXT_BUFFER (shiki_editor.current_tabpage_info)->text_buffer |
|
|
#define Shiki_CURRENT_BASENAME (shiki_editor.current_tabpage_info)->basename |
|
|
#define Shiki_CURRENT_FILENAME (shiki_editor.current_tabpage_info)->filename |
|
|
#define Shiki_CURRENT_BUFFER_ENV (shiki_editor.current_tabpage_info)->env |
|
| 36 |
|
|
| 37 |
static gchar *R5RS_keywords[] = {"and", "begin", "case", "cond-expand", "cond", "define-accessor", "define-class", "defined?", "define-generic", "define", "define-macro", "define-method", "define-module", "define-private", "define-public", "define-reader-ctor", "define-syntax", "define-syntax-macro", "defmacro", "defmacro*-public", "delay", "do", "else", "fluid-let", "if", "lambda", "let", "let*", "letrec", "letrec-syntax", "let-syntax", "or", "quasiquote", "quote", "set!", "syntax-rules", "unquote", NULL}; |
static gchar *R5RS_keywords[] = {"and", "begin", "case", "cond-expand", "cond", "define-accessor", "define-class", "defined?", "define-generic", "define", "define-macro", "define-method", "define-module", "define-private", "define-public", "define-reader-ctor", "define-syntax", "define-syntax-macro", "defmacro", "defmacro*-public", "delay", "do", "else", "fluid-let", "if", "lambda", "let", "let*", "letrec", "letrec-syntax", "let-syntax", "or", "quasiquote", "quote", "set!", "syntax-rules", "unquote", NULL}; |
| 38 |
|
|
| 52 |
|
|
| 53 |
/* プロトタイプ */ |
/* プロトタイプ */ |
| 54 |
|
|
| 55 |
/* タブの生成と削除 : 基本的に,ShikiTabInfo の中身に格納する情報を増やしたかったら,この 2 つの関数だけを変更すれば良い (ようにする…) */ |
/* タブの生成と削除 : 基本的に,ShikiBuffer の中身に格納する情報を増やしたかったら,この 2 つの関数だけを変更すれば良い (ようにする…) */ |
| 56 |
|
extern void Scm_Init_xyzzylisp(ScmModule *module); |
| 57 |
static void get_buffer_create(gchar *filename); |
static void get_buffer_create(gchar *filename); |
| 58 |
static void remove_tabpage(); |
static void remove_tabpage(); |
| 59 |
|
|
| 125 |
static void about_this_application(); |
static void about_this_application(); |
| 126 |
|
|
| 127 |
/* エディタの初期化 */ |
/* エディタの初期化 */ |
| 128 |
static void shiki_editor_window_init(int argc, char **argv); |
static void Shiki_editor_window_init(int argc, char **argv); |
|
|
|
|
/* xyzzy lisp buffer/builtin 互換関数 */ |
|
|
#include "xyzzylisp.c" |
|
| 129 |
|
|
| 130 |
/* バッファの内容を消去 */ |
/* バッファの内容を消去 */ |
| 131 |
static void clear_current_buffer() { |
static void clear_current_buffer() { |
| 335 |
/* タブが切り替わる時のイベントハンドリング */ |
/* タブが切り替わる時のイベントハンドリング */ |
| 336 |
static void switch_tabpage_handler(GtkNotebook *notebook, GtkNotebookPage *page, guint pagenum) { |
static void switch_tabpage_handler(GtkNotebook *notebook, GtkNotebookPage *page, guint pagenum) { |
| 337 |
/* タブに対応する情報が格納された構造体を切替える */ |
/* タブに対応する情報が格納された構造体を切替える */ |
| 338 |
Shiki_CURRENT_TAB_INFO = (ShikiTabInfo *)g_list_nth_data(Shiki_EDITOR_TAB_INFO_LIST, pagenum); |
Shiki_CURRENT_TAB_INFO = (ShikiBuffer *)g_list_nth_data(Shiki_EDITOR_TAB_INFO_LIST, pagenum); |
| 339 |
|
|
| 340 |
/* 現在のタブ番号を切替える */ |
/* 現在のタブ番号を切替える */ |
| 341 |
Shiki_CURRENT_TAB_NUM = pagenum; |
Shiki_CURRENT_TAB_NUM = pagenum; |
| 482 |
return FALSE; |
return FALSE; |
| 483 |
} |
} |
| 484 |
|
|
|
|
|
| 485 |
/* ノートブックにタブとページ (バッファ) を追加 */ |
/* ノートブックにタブとページ (バッファ) を追加 */ |
| 486 |
static void get_buffer_create(gchar *filename) { |
static void get_buffer_create(gchar *filename) { |
| 487 |
/*-------------------- 新しいタブを作る ----------------------------------*/ |
/*-------------------- 新しいタブを作る ----------------------------------*/ |
| 488 |
/* ShikiTabInfo には,タブに関連する情報が全て保持されている */ |
/* ShikiBuffer には,タブに関連する情報が全て保持されている */ |
| 489 |
ShikiTabInfo *tabinfo = g_malloc(sizeof(ShikiTabInfo)); |
ShikiBuffer *tabinfo = g_malloc(sizeof(ShikiBuffer)); |
| 490 |
tabinfo->locale = "Gtk Default (utf8)"; |
tabinfo->locale = "Gtk Default (utf8)"; |
| 491 |
tabinfo->undoInfoList = NULL; |
tabinfo->undoInfoList = NULL; |
| 492 |
tabinfo->filename = filename; |
tabinfo->filename = filename; |
| 493 |
tabinfo->basename = g_path_get_basename(filename); |
tabinfo->name = g_path_get_basename(filename); |
| 494 |
tabinfo->tabpage_label = g_strndup(tabinfo->basename, 7); |
tabinfo->tabpage_label = g_strndup(tabinfo->name, 7); |
| 495 |
tabinfo->env = Scm_MakeModule(NULL, FALSE); |
tabinfo->env = Scm_MakeModule(NULL, FALSE); |
| 496 |
|
|
| 497 |
/* xyzzy lisp 関数を登録 */ |
/* xyzzy lisp 関数を登録 */ |
| 1172 |
} |
} |
| 1173 |
|
|
| 1174 |
/* エディタの編集画面の初期化 */ |
/* エディタの編集画面の初期化 */ |
| 1175 |
static void shiki_editor_window_init(int argc, char **argv) { |
static void Shiki_editor_window_init(int argc, char **argv) { |
| 1176 |
GtkWidget *vbox, *toolbar, *modeline_bg = gtk_event_box_new(); |
GtkWidget *vbox, *toolbar, *modeline_bg = gtk_event_box_new(); |
| 1177 |
GtkToolItem *icon; |
GtkToolItem *icon; |
| 1178 |
GtkIconSize iconsize; |
GtkIconSize iconsize; |
| 1374 |
gtk_init(&argc, &argv); |
gtk_init(&argc, &argv); |
| 1375 |
GC_INIT(); Scm_Init(GAUCHE_SIGNATURE); |
GC_INIT(); Scm_Init(GAUCHE_SIGNATURE); |
| 1376 |
Scm_Load("gauche-init.scm", 0); |
Scm_Load("gauche-init.scm", 0); |
| 1377 |
shiki_editor_window_init(argc, argv); |
Shiki_editor_window_init(argc, argv); |
| 1378 |
gtk_main(); |
gtk_main(); |
| 1379 |
Scm_Exit(0); |
Scm_Exit(0); |
| 1380 |
return 0; |
return 0; |