/** * crée le GtkComboBox pour l'entrée d'un nom de fichier ou de répertoire * mémorise la liste des répertoires utilisés * * \param nom de l'icône * * \return le GtkComboBox * */ GtkWidget * gsb_select_icon_create_entry_text ( gchar * name_icon ) { GtkWidget *combo; GtkTreeIter iter; if ( store ) { devel_debug ( "combo existe" ); } else { devel_debug ( "combo n'existe pas" ); store = gtk_list_store_new ( 2, G_TYPE_STRING, G_TYPE_INT ); gtk_list_store_append (store, &iter); if ( g_strcmp0 ( gsb_dirs_get_pixmaps_dir ( ), path_icon ) != 0 ) { gtk_list_store_set (store, &iter, 0, gsb_dirs_get_pixmaps_dir ( ), -1); gtk_list_store_prepend (store, &iter); } gtk_list_store_set (store, &iter, 0, path_icon, -1); } combo = gtk_combo_box_entry_new_with_model ( GTK_TREE_MODEL ( store ), 0 ); gtk_entry_set_text ( GTK_ENTRY (GTK_BIN (combo)->child), name_icon ); return combo; }
GtkWidget * new_image_label ( GsbButtonStyle style, const gchar * image_name, const gchar * name ) { GtkWidget *vbox; GtkWidget *hbox; GtkWidget *label = NULL; GtkWidget *image; vbox = gtk_box_new ( GTK_ORIENTATION_VERTICAL, 0 ); hbox = gtk_box_new ( GTK_ORIENTATION_HORIZONTAL, 0 ); /* Define image */ if ( style == GSB_BUTTON_ICON || style == GSB_BUTTON_BOTH ) { image = gtk_image_new_from_file (g_build_filename ( gsb_dirs_get_pixmaps_dir ( ), image_name, NULL)); gtk_box_pack_start ( GTK_BOX(vbox), image, TRUE, TRUE, 0 ); } else if (style == GSB_BUTTON_BOTH_HORIZ ) { image = gtk_image_new_from_file (g_build_filename ( gsb_dirs_get_pixmaps_dir ( ), image_name, NULL)); gtk_box_pack_start ( GTK_BOX(hbox), image, TRUE, TRUE, 0 ); } /* Define label */ if ( style == GSB_BUTTON_TEXT || style == GSB_BUTTON_BOTH ) { label = gtk_label_new ( name ); gtk_label_set_text_with_mnemonic ( GTK_LABEL(label), name ); gtk_label_set_line_wrap ( GTK_LABEL(label), TRUE ); gtk_label_set_justify ( GTK_LABEL(label), GTK_JUSTIFY_CENTER ); gtk_box_pack_start ( GTK_BOX(vbox), label, TRUE, TRUE, 0 ); } else if (style == GSB_BUTTON_BOTH_HORIZ ) { label = gtk_label_new ( name ); gtk_label_set_text_with_mnemonic ( GTK_LABEL(label), name ); gtk_label_set_line_wrap ( GTK_LABEL(label), TRUE ); gtk_label_set_justify ( GTK_LABEL(label), GTK_JUSTIFY_CENTER ); gtk_box_pack_start ( GTK_BOX(hbox), label, TRUE, TRUE, 0 ); } if (style == GSB_BUTTON_BOTH_HORIZ ) { gtk_box_pack_start ( GTK_BOX(vbox), hbox, TRUE, TRUE, 0 ); } gtk_widget_show_all ( vbox ); /* permettra de changer le label du bouton */ g_object_set_data ( G_OBJECT ( vbox ), "label", label ); return vbox; }
/** * * \return must be freed * */ gchar *gsb_main_get_print_dir_var ( void ) { gchar *path_str = NULL; path_str = g_strdup_printf ( "Paths\n" "\tg_get_user_data_dir () = %s\n" "\tgsb_dirs_get_user_data_dir () = %s\n\n" "\tg_get_user_config_dir () = %s\n" "\tgsb_dirs_get_user_config_dir () = %s\n" "\tgsb_dirs_get_grisbirc_filename () = %s\n" "\tgsb_dirs_get_accelerator_filename () = %s\n\n" "\tgsb_dirs_get_categories_dir () = %s\n" "\tgsb_dirs_get_locale_dir () = %s\n" "\tgsb_dirs_get_plugins_dir () = %s\n" "\tgsb_dirs_get_pixmaps_dir () = %s\n" "\tgsb_dirs_get_ui_dir () = %s\n\n", g_get_user_data_dir (), gsb_dirs_get_user_data_dir (), g_get_user_config_dir (), gsb_dirs_get_user_config_dir (), gsb_dirs_get_grisbirc_filename (), gsb_dirs_get_accelerator_filename (), gsb_dirs_get_categories_dir ( ), gsb_dirs_get_locale_dir ( ), gsb_dirs_get_plugins_dir ( ), gsb_dirs_get_pixmaps_dir ( ), gsb_dirs_get_ui_dir ( ) ); return path_str; }
/** * charge le fichier de configuration et initialise les variabes. * * * * */ gboolean gsb_grisbi_init_app ( void ) { gboolean first_use = FALSE; gchar *string; #ifdef HAVE_PLUGINS gsb_plugins_scan_dir ( gsb_dirs_get_plugins_dir ( ) ); #endif /* create the icon of grisbi (set in the panel of gnome or other) */ string = g_build_filename ( gsb_dirs_get_pixmaps_dir ( ), "grisbi-logo.png", NULL ); if ( g_file_test ( string, G_FILE_TEST_EXISTS ) ) gtk_window_set_default_icon_from_file ( string, NULL ); g_free (string); /* initialisation of the variables */ gsb_color_initialise_couleurs_par_defaut ( ); init_variables (); register_import_formats (); /* firt use ? */ if ( ! gsb_file_config_load_config () ) first_use = TRUE; return first_use; }
/** * Function that makes a nice title with an optional icon. It is * mainly used to automate preference tabs with titles. * * \param title Title that will be displayed in window * \param filename (relative or absolute) to an image in a file format * recognized by gtk_image_new_from_file(). Use NULL if you don't * want an image to be displayed * * \returns A pointer to a vbox widget that will contain all created * widgets and user defined widgets */ GtkWidget *new_vbox_with_title_and_icon ( gchar *title, gchar *image_filename) { GtkWidget *vbox_pref, *hbox, *label, *image, *eb; GtkStyle * style; gchar* tmpstr1; gchar* tmpstr2; vbox_pref = gtk_vbox_new ( FALSE, 6 ); gtk_widget_show ( vbox_pref ); eb = gtk_event_box_new (); style = gtk_widget_get_style ( eb ); gtk_widget_modify_bg ( eb, 0, &(style -> bg[GTK_STATE_ACTIVE]) ); gtk_box_pack_start ( GTK_BOX ( vbox_pref ), eb, FALSE, FALSE, 0); /* Title hbox */ hbox = gtk_hbox_new ( FALSE, 6 ); gtk_widget_show ( hbox ); gtk_container_add ( GTK_CONTAINER ( eb ), hbox ); gtk_container_set_border_width ( GTK_CONTAINER ( hbox ), 3 ); /* Icon */ if ( image_filename ) { gchar* tmpstr = g_build_filename ( gsb_dirs_get_pixmaps_dir ( ), image_filename, NULL); image = gtk_image_new_from_file (tmpstr); g_free(tmpstr); gtk_box_pack_start ( GTK_BOX ( hbox ), image, FALSE, FALSE, 0); gtk_widget_show ( image ); } /* Nice huge title */ label = gtk_label_new ( title ); tmpstr1 = g_markup_escape_text (title, strlen(title)); tmpstr2 = g_strconcat ("<span size=\"x-large\" weight=\"bold\">", tmpstr1, "</span>", NULL ); gtk_label_set_markup ( GTK_LABEL(label), tmpstr2); g_free(tmpstr1); g_free(tmpstr2); gtk_box_pack_start ( GTK_BOX ( hbox ), label, FALSE, FALSE, 0); gtk_widget_show ( label ); return vbox_pref; }
/** * Création d'un GtkMenuToolButton à partir d'une image et d'un label * * \param image_name filename * \param label_name label for button * * \return a GtkToolItem or NULL * */ GtkToolItem *utils_buttons_menu_new_from_image_label ( const gchar *image_name, const gchar *label_name ) { GtkToolItem *button = NULL; GtkWidget *image; gchar *filename; filename = g_build_filename ( gsb_dirs_get_pixmaps_dir (), image_name, NULL ); if ( filename ) { image = gtk_image_new_from_file ( filename ); g_free ( filename ); button = gtk_menu_tool_button_new ( image, label_name ); } return button; }
/* **************************************************************************************************************************** */ gboolean modification_logo_accueil ( ) { GtkWidget *file_selector; GtkWidget *preview; file_selector = gtk_file_chooser_dialog_new ( _("Select a new logo"), GTK_WINDOW ( fenetre_preferences ), GTK_FILE_CHOOSER_ACTION_OPEN, GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, GTK_STOCK_OPEN, GTK_RESPONSE_OK, NULL); if ( etat.is_pixmaps_dir ) gtk_file_chooser_set_current_folder ( GTK_FILE_CHOOSER ( file_selector ), gsb_dirs_get_pixmaps_dir ( ) ); else gtk_file_chooser_set_current_folder ( GTK_FILE_CHOOSER ( file_selector ), gsb_file_get_last_path () ); gtk_window_set_position ( GTK_WINDOW ( file_selector ), GTK_WIN_POS_CENTER_ON_PARENT ); /* create the preview */ preview = gtk_image_new (); gtk_file_chooser_set_preview_widget ( GTK_FILE_CHOOSER ( file_selector ), preview ); g_signal_connect (G_OBJECT (file_selector), "update-preview", G_CALLBACK ( preferences_view_update_preview_logo ), preview ); switch ( gtk_dialog_run ( GTK_DIALOG ( file_selector ) ) ) { case GTK_RESPONSE_OK: change_logo_accueil ( file_selector ); gsb_file_update_last_path ( file_selection_get_last_directory ( GTK_FILE_CHOOSER ( file_selector ), TRUE ) ); default: gtk_widget_destroy ( file_selector ); break; } return ( FALSE ); }
/** * retourne le logo par défaut de grisbi * * * return a new pixbuf * */ GdkPixbuf *gsb_select_icon_get_default_logo_pixbuf ( void ) { GdkPixbuf *pixbuf = NULL; GError *error = NULL; pixbuf = gdk_pixbuf_new_from_file ( g_build_filename (gsb_dirs_get_pixmaps_dir ( ), "grisbi-logo.png", NULL), &error ); if ( ! pixbuf ) { devel_debug ( error -> message ); g_error_free ( error ); } if ( gdk_pixbuf_get_width (pixbuf) > LOGO_WIDTH || gdk_pixbuf_get_height (pixbuf) > LOGO_HEIGHT ) { return gsb_select_icon_resize_logo_pixbuf ( pixbuf ); } else return pixbuf; }
/** * Create and initialize a new grisbi assistant. It is basically * composed of a GtkDialog with a notebook that is switched from page * to page when user click on dialog buttons. * * \param title Title of the assistant. * \param explanation Short text to display in the first * page of the assistant. * \param image_filename Icon to display in the title. (if NULL, use grisbi.png, default logo) * \param enter_callback A callback to connect to the "switch-page" callback when go to the first page * of the Grisbi assistant notebook. (the callback should * be : gboolean callback ( GtkWidget *assistant, gint new_page ) ) * */ GtkWidget * gsb_assistant_new ( const gchar * title, const gchar * explanation, gchar * image_filename, GCallback enter_callback ) { GtkWidget * assistant, *notebook, *hbox, *label, *image, *view, *eb; GtkWidget * button_cancel, * button_prev, * button_next; GtkWidget *button_select; GtkStyle * style; GtkTextBuffer * buffer; gchar *tmpstr; gint width = 140; assistant = gtk_dialog_new_with_buttons ( title, GTK_WINDOW ( run.window ), GTK_DIALOG_MODAL | GTK_DIALOG_NO_SEPARATOR, NULL ); gtk_window_set_default_size ( GTK_WINDOW ( assistant ), 800, 500 ); gtk_window_set_position ( GTK_WINDOW ( assistant ), GTK_WIN_POS_CENTER_ON_PARENT ); gtk_window_set_resizable ( GTK_WINDOW ( assistant ), TRUE ); g_object_set_data ( G_OBJECT ( run.window ), "assistant", assistant ); button_select = gtk_toggle_button_new_with_label ( _("Select all") ); gtk_widget_set_size_request ( button_select, width, -1 ); gtk_box_pack_start ( GTK_BOX ( GTK_DIALOG ( assistant )->action_area ), button_select, FALSE, FALSE, 0 ); g_object_set_data ( G_OBJECT(assistant), "button_select", button_select ); button_cancel = gtk_dialog_add_button ( GTK_DIALOG(assistant), GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL ); gtk_widget_set_size_request ( button_cancel, width, -1 ); g_object_set_data ( G_OBJECT(assistant), "button_cancel", button_cancel ); button_prev = gtk_dialog_add_button ( GTK_DIALOG(assistant), GTK_STOCK_GO_BACK, GTK_RESPONSE_NO ); gtk_widget_set_size_request ( button_prev, width, -1 ); g_object_set_data ( G_OBJECT(assistant), "button_prev", button_prev ); gtk_widget_set_sensitive ( button_prev, FALSE ); button_next = gtk_dialog_add_button ( GTK_DIALOG(assistant), GTK_STOCK_GO_FORWARD, GTK_RESPONSE_YES ); gtk_widget_set_size_request ( button_next, width, -1 ); g_object_set_data ( G_OBJECT(assistant), "button_next", button_next ); eb = gtk_event_box_new (); style = gtk_widget_get_style ( eb ); gtk_widget_modify_bg ( eb, 0, &(style -> bg[GTK_STATE_ACTIVE]) ); hbox = gtk_hbox_new ( FALSE, 12 ); gtk_container_add ( GTK_CONTAINER(eb), hbox ); gtk_container_set_border_width ( GTK_CONTAINER(hbox), 12 ); label = gtk_label_new ( NULL ); tmpstr = g_markup_printf_escaped ( "<b><span size=\"x-large\">%s</span></b>", title ); gtk_label_set_markup ( GTK_LABEL(label), tmpstr ); g_free ( tmpstr ); gtk_box_pack_start ( GTK_BOX(hbox), label, TRUE, TRUE, 0 ); if (!image_filename) image_filename = "grisbi.png"; tmpstr = g_build_filename ( gsb_dirs_get_pixmaps_dir ( ), image_filename, NULL); image = gtk_image_new_from_file ( tmpstr ); g_free ( tmpstr ); gtk_box_pack_start ( GTK_BOX(hbox), image, FALSE, FALSE, 0 ); gtk_box_pack_start ( GTK_BOX ( GTK_DIALOG(assistant) -> vbox ), eb, FALSE, FALSE, 0 ); notebook = gtk_notebook_new (); gtk_notebook_set_show_tabs ( GTK_NOTEBOOK(notebook), FALSE ); gtk_notebook_set_show_border ( GTK_NOTEBOOK(notebook), FALSE ); gtk_box_pack_start ( GTK_BOX ( GTK_DIALOG(assistant) -> vbox ), notebook, TRUE, TRUE, 0 ); view = gtk_text_view_new (); gtk_text_view_set_wrap_mode (GTK_TEXT_VIEW (view), GTK_WRAP_WORD); buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (view)); tmpstr = g_strconcat ( "\n", explanation, "\n", NULL ); gtk_text_buffer_set_text (buffer, tmpstr, -1); g_free ( tmpstr ); gtk_text_view_set_editable ( GTK_TEXT_VIEW(view), FALSE ); gtk_text_view_set_cursor_visible ( GTK_TEXT_VIEW(view), FALSE ); gtk_text_view_set_left_margin ( GTK_TEXT_VIEW(view), 12 ); gtk_text_view_set_right_margin ( GTK_TEXT_VIEW(view), 12 ); /* Create some handy fonts. */ gtk_text_buffer_create_tag ( buffer, "bold", "weight", PANGO_WEIGHT_BOLD, NULL ); gtk_text_buffer_create_tag ( buffer, "x-large", "scale", PANGO_SCALE_X_LARGE, NULL ); gtk_text_buffer_create_tag ( buffer, "indented", "left-margin", 24, NULL ); gtk_notebook_append_page ( GTK_NOTEBOOK(notebook), view, gtk_label_new(NULL) ); g_signal_connect_after ( notebook, "switch-page", G_CALLBACK ( gsb_assistant_change_page ), assistant ); gsb_assistant_set_next ( assistant, 0, 1 ); g_object_set_data ( G_OBJECT(assistant), "notebook", notebook ); /* need to set (gchar *) because title is const gchar, the good way should be my_strdup, * but we don't touch/free title later so it should be ok... */ g_object_set_data ( G_OBJECT(assistant), "title", (gchar *) title ); g_object_set_data ( G_OBJECT(assistant), "enter0", enter_callback ); return assistant; }
/* **************************************************************************************************************************** */ void change_logo_accueil ( GtkWidget * file_selector ) { GdkPixbuf * pixbuf; const gchar *selected_filename; selected_filename = file_selection_get_filename ( GTK_FILE_CHOOSER ( file_selector ) ); if ( gsb_data_account_get_accounts_amount () ) { /* on change le logo */ gchar * chemin_logo; gtk_container_remove ( GTK_CONTAINER ( logo_button ), preview ); chemin_logo = g_strstrip ( g_strdup ( selected_filename ) ); if ( !strlen ( chemin_logo ) ) { if ( logo_accueil && GTK_IS_WIDGET ( logo_accueil ) ) gtk_widget_hide ( logo_accueil ); preview = gtk_image_new_from_stock ( GTK_STOCK_MISSING_IMAGE, GTK_ICON_SIZE_BUTTON ); } else { /* Update preview */ pixbuf = gdk_pixbuf_new_from_file ( chemin_logo, NULL ); if (!pixbuf) { if ( logo_accueil && GTK_IS_WIDGET ( logo_accueil )) gtk_widget_hide ( logo_accueil ); preview = gtk_image_new_from_stock ( GTK_STOCK_MISSING_IMAGE, GTK_ICON_SIZE_BUTTON ); } else { if ( g_strcmp0 ( g_path_get_dirname ( chemin_logo ), gsb_dirs_get_pixmaps_dir ( ) ) == 0 ) { gchar *name_logo; etat.is_pixmaps_dir = TRUE; name_logo = g_path_get_basename ( chemin_logo ); if ( g_strcmp0 ( name_logo, "grisbi-logo.png" ) != 0 ) etat.name_logo = name_logo; else etat.name_logo = NULL; } else { etat.is_pixmaps_dir = FALSE; if ( etat.name_logo && strlen ( etat.name_logo ) ) g_free ( etat.name_logo ); etat.name_logo = NULL; } gsb_select_icon_set_logo_pixbuf ( pixbuf ); preview = gtk_image_new_from_pixbuf ( gdk_pixbuf_scale_simple ( pixbuf, 48, 48, GDK_INTERP_BILINEAR ) ); /* Update homepage logo */ gtk_widget_destroy ( logo_accueil ); logo_accueil = gtk_image_new_from_pixbuf ( gsb_select_icon_get_logo_pixbuf ( ) ); gtk_box_pack_start ( GTK_BOX ( hbox_title ), logo_accueil, FALSE, FALSE, 0 ); gtk_widget_show ( logo_accueil ); /* modify the icon of grisbi (set in the panel of gnome or other) */ gtk_window_set_default_icon ( gsb_select_icon_get_logo_pixbuf ( ) ); } g_free ( chemin_logo ); } gtk_widget_show ( preview ); gtk_container_add ( GTK_CONTAINER ( logo_button ), preview ); /* Mark file as modified */ gsb_file_set_modified ( TRUE ); } }
void main_mac_osx ( int argc, char **argv ) { #ifdef GTKOSXAPPLICATION GtkWidget *vbox; GtkWidget *menubar; GdkPixbuf *pixbuf; cmdline_options opt; gboolean first_use = FALSE; gint status = CMDLINE_SYNTAX_OK; GtkOSXApplication *theApp; devel_debug ("main_mac_osx"); #if IS_DEVELOPMENT_VERSION == 1 gsb_grisbi_print_environment_var ( ); #endif gtk_init ( &argc, &argv ); /* initialisation libgoffice */ libgoffice_init ( ); /* Initialize plugins manager */ go_plugins_init (NULL, NULL, NULL, NULL, TRUE, GO_TYPE_PLUGIN_LOADER_MODULE); /* init the app */ theApp = g_object_new ( GTK_TYPE_OSX_APPLICATION, NULL ); /* initialisation des différents répertoires */ gsb_dirs_init ( ); bindtextdomain ( PACKAGE, gsb_dirs_get_locale_dir ( ) ); bind_textdomain_codeset ( PACKAGE, "UTF-8" ); textdomain ( PACKAGE ); /* Setup locale/gettext */ setlocale (LC_ALL, ""); gsb_locale_init ( ); /* on commence par détourner le signal SIGSEGV */ gsb_grisbi_trappe_signal_sigsegv ( ); /* parse command line parameter, exit with correct error code when needed */ if ( !parse_options (argc, argv, &opt, &status ) ) exit ( status ); /* initialise les données de l'application */ first_use = gsb_grisbi_init_app ( ); vbox = gsb_main_create_main_window ( ); { gboolean falseval = FALSE; gboolean trueval = TRUE; g_signal_connect ( theApp, "NSApplicationDidBecomeActive", G_CALLBACK ( grisbi_osx_app_active_cb ), &trueval ); g_signal_connect ( theApp, "NSApplicationWillResignActive", G_CALLBACK ( grisbi_osx_app_active_cb ), &falseval); g_signal_connect ( theApp, "NSApplicationBlockTermination", G_CALLBACK ( gsb_main_grisbi_close ), NULL); g_signal_connect ( theApp, "NSApplicationWillTerminate", G_CALLBACK ( main_window_destroy_event ), NULL ); } menubar = gsb_grisbi_create_main_menu ( vbox ); grisbi_osx_init_menus ( main_window, menubar ); main_window_set_size_and_position ( ); gtk_widget_show ( run.window ); #if IS_DEVELOPMENT_VERSION == 1 dialog_message ( "development-version", VERSION ); #endif gsb_grisbi_load_file_if_necessary ( &opt ); if ( first_use && !nom_fichier_comptes ) gsb_assistant_first_run (); else display_tip ( FALSE ); if ( quartz_application_get_bundle_id ( ) == NULL ) { pixbuf = gdk_pixbuf_new_from_file ( g_build_filename (gsb_dirs_get_pixmaps_dir ( ), "grisbi-logo.png", NULL), NULL ); if ( pixbuf ) gtk_osxapplication_set_dock_icon_pixbuf ( theApp, pixbuf ); } gtk_osxapplication_set_use_quartz_accelerators ( theApp, TRUE ); gtk_osxapplication_ready ( theApp ); gtk_main (); /* sauvegarde les raccourcis claviers */ gtk_accel_map_save ( gsb_dirs_get_accelerator_filename () ); g_object_unref ( theApp ); gsb_locale_shutdown ( ); gsb_dirs_shutdown ( ); /* liberation libgoffice */ libgoffice_shutdown ( ); #if GSB_GMEMPROFILE g_mem_profile(); #endif exit ( 0 ); #endif /* GTKOSXAPPLICATION */ }