SourceView::SourceView (const std::string& language, bool readOnly) { // Set the search path to the language and style files gchar* directories[2]; std::string langFilesDir = GlobalRegistry().get(RKEY_APP_PATH) + "sourceviewer/"; directories[0] = const_cast<gchar*> (langFilesDir.c_str()); // stupid GtkSourceLanguageManager is expecting non-const gchar* pointer... directories[1] = NULL; GtkSourceStyleSchemeManager* styleSchemeManager = gtk_source_style_scheme_manager_get_default(); gtk_source_style_scheme_manager_set_search_path(styleSchemeManager, directories); gtk_source_style_scheme_manager_force_rescan(styleSchemeManager); _langManager = gtk_source_language_manager_new(); gtk_source_language_manager_set_search_path(_langManager, directories); GtkSourceLanguage* lang = gtk_source_language_manager_get_language(_langManager, language.c_str()); if (lang == NULL) { gtkutil::errorDialog(_("Cannot find language for source viewer")); g_error("SourceView: Cannot find language %s\n", language.c_str()); throw std::runtime_error("SourceView: Cannot find language"); } // Remember the pointers to the textbuffers _buffer = gtk_source_buffer_new_with_language(lang); gtk_source_buffer_set_highlight_syntax(_buffer, TRUE); _view = GTK_SOURCE_VIEW(gtk_source_view_new_with_buffer(_buffer)); gtk_widget_set_size_request(GTK_WIDGET(_view), 0, -1); // allow shrinking gtk_text_view_set_wrap_mode(GTK_TEXT_VIEW(_view), GTK_WRAP_NONE); gtk_text_view_set_editable(GTK_TEXT_VIEW(_view), readOnly ? FALSE : TRUE); gtk_source_view_set_show_line_numbers(_view, TRUE); gtk_source_view_set_auto_indent(_view, TRUE); // Use a fixed width font PangoFontDescription* fontDesc = pango_font_description_from_string("Monospace"); if (fontDesc != NULL) { gtk_widget_modify_font(GTK_WIDGET(_view), fontDesc); } // Use a tab size of 4 gtk_source_view_set_tab_width(GTK_SOURCE_VIEW(_view), 4); g_signal_connect(G_OBJECT(_view), "key_press_event", G_CALLBACK(escape_clear_focus_widget), 0); _widget = gtkutil::ScrolledFrame(GTK_WIDGET(_view)); }
/* If we are running from the source dir (e.g. during make check) * we override the path to read from the data dir. */ static void init_style_scheme_manager (void) { gchar *dir; dir = g_build_filename (TOP_SRCDIR, "data", "styles", NULL); if (g_file_test (dir, G_FILE_TEST_IS_DIR)) { GtkSourceStyleSchemeManager *manager; gchar **dirs; manager = gtk_source_style_scheme_manager_get_default (); dirs = g_new0 (gchar *, 2); dirs[0] = dir; gtk_source_style_scheme_manager_set_search_path (manager, dirs); g_strfreev (dirs); } else {
MapeEditView* mape_edit_view_new(MapePreView* pre_view, MapeStatusbar* statusbar, GError** error) { MapeEditView* view; GtkSourceBuffer* buf; GPtrArray* search_dirs; const gchar* const* data_dirs; const gchar* const* dir; view = malloc(sizeof(MapeEditView) ); view->pre_view = pre_view; view->statusbar = statusbar; view->file_path = NULL; view->encoding = "UTF-8"; view->type = MAPE_MAPGEN_NONE; view->render_thread = NULL; view->rerender = FALSE; view->fixed_seed = FALSE; view->view = gtk_source_view_new(); buf = GTK_SOURCE_BUFFER( gtk_text_view_get_buffer(GTK_TEXT_VIEW(view->view) ) ); g_signal_connect_after( G_OBJECT(buf), "changed", G_CALLBACK(mape_edit_view_cb_changed), view ); g_signal_connect( G_OBJECT(pre_view->event_box), "button-press-event", G_CALLBACK(mape_edit_view_cb_update), view ); view->font_desc = pango_font_description_new(); pango_font_description_set_family(view->font_desc, "monospace"); gtk_widget_modify_font(view->view, view->font_desc); search_dirs = g_ptr_array_new(); #ifdef G_OS_WIN32 g_ptr_array_add( search_dirs, g_win32_get_package_installation_subdirectory(NULL, NULL, "mape-syntax") ); #endif g_ptr_array_add( search_dirs, g_build_filename(g_get_home_dir(), ".mape-syntax", NULL) ); g_ptr_array_add( search_dirs, g_strdup("./mape-syntax") ); g_ptr_array_add( search_dirs, g_strdup("./src/mape/mape-syntax") ); data_dirs = g_get_system_data_dirs(); for(dir = data_dirs; *dir != NULL; ++ dir) g_ptr_array_add(search_dirs, g_build_filename(*dir, "mape", NULL)); g_ptr_array_add(search_dirs, NULL); view->lang_manager = gtk_source_language_manager_new(); gtk_source_language_manager_set_search_path( view->lang_manager, (gchar**)search_dirs->pdata ); view->style_manager = gtk_source_style_scheme_manager_new(); gtk_source_style_scheme_manager_set_search_path( view->style_manager, (gchar**)search_dirs->pdata ); g_ptr_array_foreach(search_dirs, (GFunc)g_free, NULL); g_ptr_array_free(search_dirs, TRUE); mape_edit_view_set_filename(view, NULL); gtk_widget_show(view->view); view->window = gtk_scrolled_window_new(NULL, NULL); gtk_scrolled_window_set_policy( GTK_SCROLLED_WINDOW(view->window), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC ); gtk_scrolled_window_set_shadow_type( GTK_SCROLLED_WINDOW(view->window), GTK_SHADOW_IN ); gtk_container_add( GTK_CONTAINER(view->window), view->view ); gtk_widget_show(view->window); return view; }
SourceView::SourceView(const std::string& language, bool readOnly) { // Set the search path to the language and style files gchar* directories[2]; #if defined(POSIX) && defined(PKGDATADIR) std::string langFilesDir = std::string(PKGDATADIR) + "/sourceviewer/"; #else std::string langFilesDir = GlobalRegistry().get(RKEY_APP_PATH) + "sourceviewer/"; #endif directories[0] = const_cast<gchar*>(langFilesDir.c_str()); // stupid GtkSourceLanguageManager is expecting non-const gchar* pointer... directories[1] = NULL; GtkSourceStyleSchemeManager* styleSchemeManager = gtk_source_style_scheme_manager_get_default(); gtk_source_style_scheme_manager_set_search_path(styleSchemeManager, directories); gtk_source_style_scheme_manager_force_rescan(styleSchemeManager); _langManager = gtk_source_language_manager_new(); gtk_source_language_manager_set_search_path(_langManager, directories); GtkSourceLanguage* lang = gtk_source_language_manager_get_language(_langManager, language.c_str()); if (lang == NULL) { globalErrorStream() << "SourceView: Cannot find language " << language << " in " << langFilesDir << std::endl; } // Remember the pointers to the textbuffers if (lang != NULL) { _buffer = gtk_source_buffer_new_with_language(lang); gtk_source_buffer_set_highlight_syntax(_buffer, TRUE); } else { _buffer = gtk_source_buffer_new(NULL); gtk_source_buffer_set_highlight_syntax(_buffer, FALSE); } _view = GTK_SOURCE_VIEW(gtk_source_view_new_with_buffer(_buffer)); gtk_widget_set_size_request(GTK_WIDGET(_view), 0, -1); // allow shrinking gtk_text_view_set_wrap_mode(GTK_TEXT_VIEW(_view), GTK_WRAP_WORD); gtk_text_view_set_editable(GTK_TEXT_VIEW(_view), readOnly ? FALSE : TRUE); gtk_source_view_set_show_line_numbers(_view, TRUE); gtk_source_view_set_auto_indent(_view, TRUE); // Use a fixed width font PangoFontDescription* fontDesc = pango_font_description_from_string("Monospace"); if (fontDesc != NULL) { gtk_widget_modify_font(GTK_WIDGET(_view), fontDesc); } // Use a tab size of 4 gtk_source_view_set_tab_width(GTK_SOURCE_VIEW(_view), 4); widget_connect_escape_clear_focus_widget(GTK_WIDGET(_view)); _widget = gtkutil::ScrolledFrame(GTK_WIDGET(_view)); }