PageRenderTime 25ms CodeModel.GetById 18ms RepoModel.GetById 0ms app.codeStats 0ms

/puss/puss/Puss.c

http://ljedit.googlecode.com/
C | 276 lines | 205 code | 55 blank | 16 comment | 23 complexity | 4526d34d1adddd7b31b6257f316e077d MD5 | raw file
  1. // Puss.c
  2. #include "Puss.h"
  3. #include <memory.h>
  4. #include <stdlib.h>
  5. #include <string.h>
  6. #include "DocManager.h"
  7. #include "DocSearch.h"
  8. #include "ExtendManager.h"
  9. #include "PluginManager.h"
  10. #include "PosLocate.h"
  11. #include "PanelOrder.h"
  12. #include "OptionManager.h"
  13. #include "OptionSetup.h"
  14. #include "GlobalOptions.h"
  15. #include "Utils.h"
  16. PussApp* puss_app = 0;
  17. static const gchar* puss_get_module_path() {
  18. return puss_app->module_path;
  19. }
  20. static const gchar* puss_get_locale_path() {
  21. return puss_app->locale_path;
  22. }
  23. static const gchar* puss_get_extends_path() {
  24. return puss_app->extends_path;
  25. }
  26. static const gchar* puss_get_plugins_path() {
  27. return puss_app->plugins_path;
  28. }
  29. static GtkBuilder* puss_get_ui_builder() {
  30. return puss_app->builder;
  31. }
  32. static gboolean puss_load_ui(const gchar* filename ) {
  33. GError* err = 0;
  34. gchar* filepath = g_build_filename(puss_app->module_path, "res", filename, NULL);
  35. if( !filepath ) {
  36. g_printerr("ERROR(puss) : build ui filepath failed!\n");
  37. return FALSE;
  38. }
  39. gtk_builder_add_from_file(puss_app->builder, filepath, &err);
  40. g_free(filepath);
  41. if( err ) {
  42. g_printerr("ERROR(puss): %s\n", err->message);
  43. g_error_free(err);
  44. return FALSE;
  45. }
  46. return TRUE;
  47. }
  48. static gboolean puss_load_ui_files() {
  49. puss_app->builder = gtk_builder_new();
  50. if( !puss_app->builder ) {
  51. g_printerr("ERROR(puss) : gtk_builder_new failed!\n");
  52. return FALSE;
  53. }
  54. gtk_builder_set_translation_domain(puss_app->builder, TEXT_DOMAIN);
  55. if( !( puss_load_ui("puss_ui_manager.xml")
  56. && puss_load_ui("puss_main_window.xml") ) )
  57. {
  58. return FALSE;
  59. }
  60. // fix old glade version, not support GtkUIManager
  61. {
  62. GtkWidget* menu_toolbar_vbox = GTK_WIDGET(gtk_builder_get_object(puss_app->builder, "menu_toolbar_vbox"));
  63. GtkBox* main_vbox = GTK_BOX(gtk_builder_get_object(puss_app->builder, "main_vbox"));
  64. if( menu_toolbar_vbox && main_vbox ) {
  65. gtk_box_pack_start(main_vbox, menu_toolbar_vbox, FALSE, TRUE, 0);
  66. gtk_box_reorder_child(main_vbox, menu_toolbar_vbox, 0);
  67. }
  68. }
  69. gtk_builder_connect_signals(puss_app->builder, 0);
  70. return TRUE;
  71. }
  72. static gboolean puss_main_ui_create() {
  73. gchar* icon_file;
  74. puss_app->main_window = GTK_WINDOW(gtk_builder_get_object(puss_app->builder, "main_window"));
  75. puss_app->ui_manager = GTK_UI_MANAGER(gtk_builder_get_object(puss_app->builder, "main_ui_manager"));
  76. puss_app->doc_panel = GTK_NOTEBOOK(gtk_builder_get_object(puss_app->builder, "doc_panel"));
  77. puss_app->left_panel = GTK_NOTEBOOK(gtk_builder_get_object(puss_app->builder, "left_panel"));
  78. puss_app->right_panel = GTK_NOTEBOOK(gtk_builder_get_object(puss_app->builder, "right_panel"));
  79. puss_app->bottom_panel = GTK_NOTEBOOK(gtk_builder_get_object(puss_app->builder, "bottom_panel"));
  80. if( !( puss_app->main_window
  81. && puss_app->ui_manager
  82. && puss_app->doc_panel
  83. && puss_app->left_panel
  84. && puss_app->right_panel
  85. && puss_app->bottom_panel
  86. && puss_find_dialog_init(puss_app->builder) ) )
  87. {
  88. return FALSE;
  89. }
  90. // set icon
  91. icon_file = g_build_filename(puss_app->module_path, "res", "puss.png", NULL);
  92. gtk_window_set_icon_from_file(puss_app->main_window, icon_file, 0);
  93. g_free(icon_file);
  94. gtk_widget_show_all( gtk_bin_get_child(GTK_BIN(puss_app->main_window)) );
  95. return TRUE;
  96. }
  97. static void puss_locale_init() {
  98. bindtextdomain(TEXT_DOMAIN, puss_app->locale_path);
  99. bind_textdomain_codeset(TEXT_DOMAIN, "UTF-8");
  100. }
  101. static void cb_puss_main_window_destroy() {
  102. puss_panel_order_save();
  103. puss_plugin_manager_unload_all();
  104. gtk_main_quit();
  105. }
  106. static Puss __api__ = {
  107. // app
  108. puss_get_module_path
  109. , puss_get_locale_path
  110. , puss_get_extends_path
  111. , puss_get_plugins_path
  112. // UI
  113. , puss_get_ui_builder
  114. , puss_panel_append
  115. , puss_panel_remove
  116. , puss_panel_get_pos
  117. // doc & view
  118. , puss_doc_set_url
  119. , puss_doc_get_url
  120. , puss_doc_set_charset
  121. , puss_doc_get_charset
  122. , puss_doc_set_BOM
  123. , puss_doc_get_BOM
  124. , puss_doc_get_view_from_page
  125. , puss_doc_get_buffer_from_page
  126. // doc manager
  127. , puss_doc_get_view_from_page_num
  128. , puss_doc_get_buffer_from_page_num
  129. , puss_doc_find_page_from_url
  130. , puss_doc_new
  131. , puss_doc_open
  132. , puss_doc_open_locate
  133. , puss_doc_locate
  134. , puss_doc_save_current
  135. , puss_doc_close_current
  136. , puss_doc_save_all
  137. , puss_doc_close_all
  138. // utils
  139. , puss_send_focus_change
  140. , puss_active_panel_page
  141. , puss_save_file
  142. , puss_load_file
  143. , puss_format_filename
  144. // option manager
  145. , puss_option_manager_option_reg
  146. , puss_option_manager_option_find
  147. , puss_option_manager_option_set
  148. , puss_option_manager_monitor_reg
  149. , puss_option_manager_monitor_unreg
  150. // option setup
  151. , puss_option_setup_reg
  152. , puss_option_setup_unreg
  153. // extend manager
  154. , puss_extend_manager_query
  155. // plugin manager
  156. , puss_plugin_engine_regist
  157. // search utils
  158. , puss_find_and_locate_text
  159. };
  160. gboolean puss_create(const gchar* filepath) {
  161. puss_app = g_new0(PussApp, 1);
  162. puss_app->api = &__api__;
  163. puss_app->module_path = g_path_get_dirname(filepath);
  164. puss_app->locale_path = g_build_filename(puss_app->module_path, "locale", NULL);
  165. puss_app->extends_path = g_build_filename(puss_app->module_path, "extends", NULL);
  166. puss_app->plugins_path = g_build_filename(puss_app->module_path, "plugins", NULL);
  167. puss_app->extends_map = g_hash_table_new(g_str_hash, g_str_equal);
  168. puss_locale_init();
  169. if( !puss_option_manager_create() ) {
  170. g_printerr("ERROR(puss) : create option manager failed!\n");
  171. return FALSE;
  172. }
  173. puss_reg_global_options();
  174. if( !( puss_utils_create()
  175. && puss_load_ui_files()
  176. && puss_main_ui_create()
  177. && puss_doc_manager_create()
  178. && puss_pos_locate_create()
  179. && puss_option_setup_create()
  180. && puss_plugin_manager_create()
  181. && puss_extend_manager_create() ) )
  182. {
  183. return FALSE;
  184. }
  185. puss_panel_order_load();
  186. return TRUE;
  187. }
  188. void puss_destroy() {
  189. puss_extend_manager_destroy();
  190. puss_plugin_manager_destroy();
  191. puss_pos_locate_destroy();
  192. puss_doc_manager_destroy();
  193. puss_utils_destroy();
  194. puss_option_setup_destroy();
  195. puss_option_manager_destroy();
  196. g_object_unref(G_OBJECT(puss_app->builder));
  197. g_hash_table_destroy(puss_app->extends_map);
  198. g_free(puss_app->plugins_path);
  199. g_free(puss_app->extends_path);
  200. g_free(puss_app->locale_path);
  201. g_free(puss_app->module_path);
  202. g_free(puss_app);
  203. puss_app = 0;
  204. }
  205. void puss_run() {
  206. g_signal_connect(puss_app->main_window, "destroy", G_CALLBACK(&cb_puss_main_window_destroy), 0);
  207. puss_plugin_manager_load_all();
  208. gtk_notebook_set_current_page(puss_app->left_panel, 0);
  209. gtk_notebook_set_current_page(puss_app->right_panel, 0);
  210. gtk_notebook_set_current_page(puss_app->bottom_panel, 0);
  211. gtk_widget_show( GTK_WIDGET(puss_app->main_window) );
  212. #ifdef G_OS_WIN32
  213. #ifndef _DEBUG
  214. // when use puss winboot run puss.exe, main window will hidden
  215. // show need show window
  216. //
  217. gdk_window_show( gtk_widget_get_window(GTK_WIDGET(puss_app->main_window)) );
  218. #endif
  219. #endif
  220. gtk_main();
  221. }