]> Dogcows Code - chaz/homebank/blobdiff - src/ui-pref.c
Merge branch 'master' into ext-perl
[chaz/homebank] / src / ui-pref.c
index 7da069f50719083bab1878da9480ff5dbb65dceb..bcee6b1848e09e19df8a61921583935c0496a3a9 100644 (file)
@@ -24,6 +24,8 @@
 #include "dsp_mainwindow.h"
 #include "gtk-chart-colors.h"
 
+#include "ext.h"
+
 #include "ui-currency.h"
 
 
@@ -53,14 +55,11 @@ enum {
 
 enum
 {
-       PREF_GENERAL,
-       PREF_INTERFACE,
-       PREF_COLUMNS,
-       PREF_DISPLAY,
-       PREF_IMPORT,
-       PREF_REPORT,
-       PREF_EURO,
-       PREF_MAX
+       EXT_COLUMN_ENABLED = 0,
+       EXT_COLUMN_LABEL,
+       EXT_COLUMN_TOOLTIP,
+       EXT_COLUMN_PLUGIN_NAME,
+       EXT_NUM_COLUMNS
 };
 
 
@@ -72,6 +71,7 @@ static gchar *pref_iconname[PREF_MAX] = {
 "prf-import",
 "prf-report",
 "prf-euro",                    // to be renamed
+"prf-plugins",
 //"prf_charts.svg"
 };
 
@@ -82,7 +82,8 @@ N_("Transactions"),
 N_("Display format"),
 N_("Import/Export"),
 N_("Report"),
-N_("Euro minor")
+N_("Euro minor"),
+N_("Plugins")
 //
 };
 
@@ -185,14 +186,17 @@ static EuroParams euro_params[] =
 };
 
 
+static void list_ext_colpref_get(GtkTreeView *treeview, GList **columns);
+
+
 /* = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =*/
 
 
 static LangName languagenames[] =
 {
-// af ar ast be bg ca cs cy da de el en_AU en_CA en_GB es et eu fa fi fr ga gl he hr hu id is it 
+// af ar ast be bg ca cs cy da de el en_AU en_CA en_GB es et eu fa fi fr ga gl he hr hu id is it
 //ja ka ko lt lv ms nb nds nl oc pl pt_BR pt pt_PT ro ru si sk sl sr sv tr uk vi zh_CN zh_TW
-       
+
        { "aa", "Afar" },
        { "ab", "Abkhazian" },
        { "ae", "Avestan" },
@@ -400,7 +404,7 @@ gchar *name1, *name2;
        //keep system laguage on top
        if(code1 == NULL) name1 = NULL;
        if(code2 == NULL) name2 = NULL;
-       
+
     retval = hb_string_utf8_compare(name1, name2);
 
     g_free(name2);
@@ -449,7 +453,7 @@ const gchar *lang;
                        g_warning(" locale name not found '%s'", locale);
                        lang = locale;
                }
-               
+
        }
 
        return lang;
@@ -464,7 +468,7 @@ GtkTreeIter  iter;
 
        model = gtk_combo_box_get_model(GTK_COMBO_BOX(combobox));
        gtk_list_store_append (GTK_LIST_STORE(model), &iter);
-       gtk_list_store_set (GTK_LIST_STORE(model), &iter, 
+       gtk_list_store_set (GTK_LIST_STORE(model), &iter,
                            0, NULL,
                            1, _("System Language"),
                            -1);
@@ -487,13 +491,13 @@ const gchar *dirname;
                {
                const gchar *lang;
                gchar *label;
-                       
+
                        gtk_list_store_append (GTK_LIST_STORE(model), &iter);
 
                        lang = ui_language_combobox_get_name(dirname);
                        label = g_strdup_printf ("%s [%s]", lang, dirname);
 
-                       gtk_list_store_set (GTK_LIST_STORE(model), &iter, 
+                       gtk_list_store_set (GTK_LIST_STORE(model), &iter,
                                                    0, dirname,
                                                    1, label,
                                                    -1);
@@ -530,7 +534,7 @@ GtkCellRenderer *renderer;
        gtk_cell_layout_set_attributes (GTK_CELL_LAYOUT (combobox), renderer, "text", 1, NULL);
 
        gtk_combo_box_set_id_column( GTK_COMBO_BOX(combobox), 0);
-               
+
        g_object_unref(store);
 
        if(label)
@@ -539,7 +543,7 @@ GtkCellRenderer *renderer;
        ui_language_combobox_populate(combobox);
 
        gtk_combo_box_set_active(GTK_COMBO_BOX(combobox), 0);
-       
+
        return combobox;
 }
 
@@ -707,7 +711,7 @@ gchar buf[128];
        cur.frac_digits   = gtk_spin_button_get_value(GTK_SPIN_BUTTON(data->NB_euro_fracdigits));
 
        da_cur_initformat (&cur);
-       
+
        DB( g_print("fmt: %s\n", cur.format) );
 
        g_ascii_formatd(formatd_buf, sizeof (formatd_buf), cur.format, HB_NUMBER_SAMPLE);
@@ -747,11 +751,11 @@ struct defpref_data *data;
 EuroParams *euro;
 gchar *buf;
 gint active;
-       
+
        DB( g_print("\n[ui-pref] eurosetcurrency\n") );
 
        data = g_object_get_data(G_OBJECT(gtk_widget_get_ancestor(widget, GTK_TYPE_WINDOW)), "inst_data");
-       
+
        active = ui_euro_combobox_id_to_active(country);
        euro = &euro_params[active];
        buf = g_strdup_printf("%s - %s", euro->iso, euro->name);
@@ -866,7 +870,7 @@ struct defpref_data *data;
        data = g_object_get_data(G_OBJECT(gtk_widget_get_ancestor(widget, GTK_TYPE_WINDOW)), "inst_data");
 
        gtk_widget_queue_draw (data->DA_colors);
-       
+
 }
 
 
@@ -1018,7 +1022,7 @@ const gchar *lang;
        {
                PREFS->language = g_strdup(lang);
        }
-       
+
        PREFS->toolbar_style = gtk_combo_box_get_active(GTK_COMBO_BOX(data->CY_toolbar));
        //PREFS->image_size = gtk_spin_button_get_value(GTK_SPIN_BUTTON(data->NB_image_size));
 
@@ -1036,7 +1040,7 @@ const gchar *lang;
        PREFS->grid_lines = gtk_combo_box_get_active(GTK_COMBO_BOX(data->CY_gridlines));
        //list_txn_colpref_get(GTK_TREE_VIEW(data->LV_opecolumns), PREFS->lst_ope_columns);
 
-       // transaction 
+       // transaction
        PREFS->date_range_txn = gtk_combo_box_get_active(GTK_COMBO_BOX(data->CY_daterange_txn));
        PREFS->date_future_nbdays  = gtk_spin_button_get_value(GTK_SPIN_BUTTON(data->ST_datefuture_nbdays));
        PREFS->hidereconciled = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(data->CM_hide_reconciled));
@@ -1079,6 +1083,8 @@ const gchar *lang;
        ui_gtk_entry_replace_text(data->ST_euro_groupingchar, &PREFS->minor_cur.grouping_char);
        PREFS->minor_cur.frac_digits = gtk_spin_button_get_value(GTK_SPIN_BUTTON(data->NB_euro_fracdigits));
        //PREFS->chart_legend = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(data->CM_chartlegend));
+
+       list_ext_colpref_get(GTK_TREE_VIEW(data->PI_plugin_columns), &(PREFS->ext_whitelist));
 }
 
 
@@ -1097,10 +1103,10 @@ gint crow, row;
        gtk_grid_set_row_spacing (GTK_GRID (group_grid), SPACING_SMALL);
        gtk_grid_set_column_spacing (GTK_GRID (group_grid), SPACING_MEDIUM);
        gtk_grid_attach (GTK_GRID (content_grid), group_grid, 0, crow++, 1, 1);
-       
+
        label = make_label_group(_("Date options"));
        gtk_grid_attach (GTK_GRID (group_grid), label, 0, 0, 3, 1);
-       
+
        row = 1;
        label = make_label_widget(_("Date order:"));
        //----------------------------------------- l, r, t, b
@@ -1116,10 +1122,10 @@ gint crow, row;
        gtk_grid_set_row_spacing (GTK_GRID (group_grid), SPACING_SMALL);
        gtk_grid_set_column_spacing (GTK_GRID (group_grid), SPACING_MEDIUM);
        gtk_grid_attach (GTK_GRID (content_grid), group_grid, 0, crow++, 1, 1);
-       
+
        label = make_label_group(_("OFX/QFX options"));
        gtk_grid_attach (GTK_GRID (group_grid), label, 0, 0, 3, 1);
-       
+
        row = 1;
        label = make_label_widget(_("_Name field:"));
        //----------------------------------------- l, r, t, b
@@ -1143,10 +1149,10 @@ gint crow, row;
        gtk_grid_set_row_spacing (GTK_GRID (group_grid), SPACING_SMALL);
        gtk_grid_set_column_spacing (GTK_GRID (group_grid), SPACING_MEDIUM);
        gtk_grid_attach (GTK_GRID (content_grid), group_grid, 0, crow++, 1, 1);
-       
+
        label = make_label_group(_("QIF options"));
        gtk_grid_attach (GTK_GRID (group_grid), label, 0, 0, 3, 1);
-       
+
        row = 1;
        label = make_label_widget(_("Memos:"));
        gtk_grid_attach (GTK_GRID (group_grid), label, 1, row, 1, 1);
@@ -1163,10 +1169,10 @@ gint crow, row;
        gtk_grid_set_row_spacing (GTK_GRID (group_grid), SPACING_SMALL);
        gtk_grid_set_column_spacing (GTK_GRID (group_grid), SPACING_MEDIUM);
        gtk_grid_attach (GTK_GRID (content_grid), group_grid, 0, crow++, 1, 1);
-       
+
        label = make_label_group(_("Files folder"));
        gtk_grid_attach (GTK_GRID (group_grid), label, 0, 0, 3, 1);
-       
+
        row = 1;
        label = make_label_widget(_("_Import:"));
        //----------------------------------------- l, r, t, b
@@ -1224,7 +1230,7 @@ gint i, x, y;
        index = gtk_combo_box_get_active(GTK_COMBO_BOX(data->CY_color_scheme));
 
        colorscheme_init(&scheme, index);
-       
+
        gtk_widget_get_size_request (widget, &w, &h);
        x = y = 0;
        for(i=0;i<scheme.nb_cols;i++)
@@ -1257,10 +1263,10 @@ gint crow, row;
        gtk_grid_set_row_spacing (GTK_GRID (group_grid), SPACING_SMALL);
        gtk_grid_set_column_spacing (GTK_GRID (group_grid), SPACING_MEDIUM);
        gtk_grid_attach (GTK_GRID (content_grid), group_grid, 0, crow++, 1, 1);
-       
+
        label = make_label_group(_("Initial filter"));
        gtk_grid_attach (GTK_GRID (group_grid), label, 0, 0, 3, 1);
-       
+
        row = 1;
        label = make_label_widget(_("Date _range:"));
        //----------------------------------------- l, r, t, b
@@ -1275,10 +1281,10 @@ gint crow, row;
        gtk_grid_set_row_spacing (GTK_GRID (group_grid), SPACING_SMALL);
        gtk_grid_set_column_spacing (GTK_GRID (group_grid), SPACING_MEDIUM);
        gtk_grid_attach (GTK_GRID (content_grid), group_grid, 0, crow++, 1, 1);
-       
+
        label = make_label_group(_("Charts options"));
        gtk_grid_attach (GTK_GRID (group_grid), label, 0, 0, 3, 1);
-       
+
        row = 1;
        label = make_label_widget(_("Color scheme:"));
        //----------------------------------------- l, r, t, b
@@ -1301,10 +1307,10 @@ gint crow, row;
        gtk_grid_set_row_spacing (GTK_GRID (group_grid), SPACING_SMALL);
        gtk_grid_set_column_spacing (GTK_GRID (group_grid), SPACING_MEDIUM);
        gtk_grid_attach (GTK_GRID (content_grid), group_grid, 0, crow++, 1, 1);
-       
+
        label = make_label_group(_("Statistics options"));
        gtk_grid_attach (GTK_GRID (group_grid), label, 0, 0, 3, 1);
-       
+
        row = 1;
        widget = gtk_check_button_new_with_mnemonic (_("Show by _amount"));
        data->CM_stat_byamount = widget;
@@ -1325,10 +1331,10 @@ gint crow, row;
        gtk_grid_set_row_spacing (GTK_GRID (group_grid), SPACING_SMALL);
        gtk_grid_set_column_spacing (GTK_GRID (group_grid), SPACING_MEDIUM);
        gtk_grid_attach (GTK_GRID (content_grid), group_grid, 0, crow++, 1, 1);
-       
+
        label = make_label_group(_("Budget options"));
        gtk_grid_attach (GTK_GRID (group_grid), label, 0, 0, 3, 1);
-       
+
        row = 1;
        widget = gtk_check_button_new_with_mnemonic (_("Show _details"));
        data->CM_budg_showdetail = widget;
@@ -1353,7 +1359,7 @@ gint crow, row;
        gtk_grid_set_row_spacing (GTK_GRID (group_grid), SPACING_SMALL);
        gtk_grid_set_column_spacing (GTK_GRID (group_grid), SPACING_MEDIUM);
        gtk_grid_attach (GTK_GRID (content_grid), group_grid, 0, crow++, 1, 1);
-       
+
        label = make_label_group(_("General"));
        gtk_grid_attach (GTK_GRID (group_grid), label, 0, 0, 3, 1);
 
@@ -1368,7 +1374,7 @@ gint crow, row;
        gtk_grid_set_row_spacing (GTK_GRID (group_grid), SPACING_SMALL);
        gtk_grid_set_column_spacing (GTK_GRID (group_grid), SPACING_MEDIUM);
        gtk_grid_attach (GTK_GRID (content_grid), group_grid, 0, crow++, 1, 1);
-       
+
        label = make_label_group(_("Currency"));
        gtk_grid_attach (GTK_GRID (group_grid), label, 0, 0, 4, 1);
 
@@ -1388,7 +1394,7 @@ gint crow, row;
        //gtk_grid_attach (GTK_GRID (group_grid), data->CY_option[FILTER_DATE], 1, 2, row, row+1);
        gtk_grid_attach (GTK_GRID (group_grid), widget, 3, row, 1, 1);
 
-       
+
        // group :: Exchange rate
     group_grid = gtk_grid_new ();
        data->GRP_rate = group_grid;
@@ -1413,7 +1419,7 @@ gint crow, row;
        gtk_grid_set_row_spacing (GTK_GRID (group_grid), SPACING_SMALL);
        gtk_grid_set_column_spacing (GTK_GRID (group_grid), SPACING_MEDIUM);
        gtk_grid_attach (GTK_GRID (content_grid), group_grid, 0, crow++, 1, 1);
-       
+
        label = make_label_group(_("Format"));
        gtk_grid_attach (GTK_GRID (group_grid), label, 0, 0, 3, 1);
 
@@ -1430,7 +1436,7 @@ gint crow, row;
        gtk_grid_set_row_spacing (GTK_GRID (group_grid), SPACING_SMALL);
        gtk_grid_set_column_spacing (GTK_GRID (group_grid), SPACING_MEDIUM);
        gtk_container_add (GTK_CONTAINER (expander), group_grid);
-       
+
        row = 0;
        label = make_label_widget(_("_Symbol:"));
        gtk_grid_attach (GTK_GRID (group_grid), label, 1, row, 1, 1);
@@ -1483,7 +1489,7 @@ gint crow, row;
        gtk_grid_set_row_spacing (GTK_GRID (group_grid), SPACING_SMALL);
        gtk_grid_set_column_spacing (GTK_GRID (group_grid), SPACING_MEDIUM);
        gtk_grid_attach (GTK_GRID (content_grid), group_grid, 0, crow++, 1, 1);
-       
+
        label = make_label_group(_("Date"));
        gtk_grid_attach (GTK_GRID (group_grid), label, 0, 0, 3, 1);
 
@@ -1513,7 +1519,7 @@ gint crow, row;
        widget = gtk_image_new_from_icon_name (ICONNAME_INFO, GTK_ICON_SIZE_BUTTON);
        gtk_grid_attach (GTK_GRID (group_grid), widget, 3, row, 1, 1);
 
-       
+
        gtk_widget_set_tooltip_text(widget,
        _("%a locale's abbreviated weekday name.\n"
 "%A locale's full weekday name. \n"
@@ -1541,7 +1547,7 @@ gint crow, row;
        gtk_grid_set_row_spacing (GTK_GRID (group_grid), SPACING_SMALL);
        gtk_grid_set_column_spacing (GTK_GRID (group_grid), SPACING_MEDIUM);
        gtk_grid_attach (GTK_GRID (content_grid), group_grid, 0, crow++, 1, 1);
-       
+
        label = make_label_group(_("Measurement units"));
        gtk_grid_attach (GTK_GRID (group_grid), label, 0, 0, 3, 1);
 
@@ -1574,7 +1580,7 @@ gint crow, row;
        gtk_grid_set_row_spacing (GTK_GRID (group_grid), SPACING_SMALL);
        gtk_grid_set_column_spacing (GTK_GRID (group_grid), SPACING_MEDIUM);
        gtk_grid_attach (GTK_GRID (content_grid), group_grid, 0, crow++, 1, 1);
-       
+
        label = make_label_group(_("Transaction window"));
        gtk_grid_attach (GTK_GRID (group_grid), label, 0, 0, 3, 1);
 
@@ -1591,7 +1597,7 @@ gint crow, row;
        //----------------------------------------- l, r, t, b
        gtk_grid_attach (GTK_GRID (group_grid), label, 1, row, 1, 1);
        widget = make_numeric(NULL, 0, 366);
-       
+
        data->ST_datefuture_nbdays = widget;
        gtk_grid_attach (GTK_GRID (group_grid), widget, 2, row, 1, 1);
 
@@ -1614,7 +1620,7 @@ gint crow, row;
        gtk_grid_set_row_spacing (GTK_GRID (group_grid), SPACING_SMALL);
        gtk_grid_set_column_spacing (GTK_GRID (group_grid), SPACING_MEDIUM);
        gtk_grid_attach (GTK_GRID (content_grid), group_grid, 0, crow++, 1, 1);
-       
+
        label = make_label_group(_("Multiple add"));
        gtk_grid_attach (GTK_GRID (group_grid), label, 0, 0, 3, 1);
 
@@ -1629,7 +1635,7 @@ gint crow, row;
        gtk_grid_set_row_spacing (GTK_GRID (group_grid), SPACING_SMALL);
        gtk_grid_set_column_spacing (GTK_GRID (group_grid), SPACING_MEDIUM);
        gtk_grid_attach (GTK_GRID (content_grid), group_grid, 0, crow++, 1, 1);
-       
+
        label = make_label_group(_("Column list"));
        gtk_grid_attach (GTK_GRID (group_grid), label, 0, 0, 3, 1);
 
@@ -1666,7 +1672,7 @@ gint crow, row;
        gtk_grid_set_row_spacing (GTK_GRID (group_grid), SPACING_SMALL);
        gtk_grid_set_column_spacing (GTK_GRID (group_grid), SPACING_MEDIUM);
        gtk_grid_attach (GTK_GRID (content_grid), group_grid, 0, crow++, 1, 1);
-       
+
        label = make_label_group(_("General"));
        gtk_grid_attach (GTK_GRID (group_grid), label, 0, 0, 3, 1);
 
@@ -1676,7 +1682,7 @@ gint crow, row;
        widget = ui_language_combobox_new(label);
        data->CY_language = widget;
        gtk_grid_attach (GTK_GRID (group_grid), widget, 2, row, 1, 1);
-       
+
        row++;
        label = make_label_widget(_("_Toolbar:"));
        gtk_grid_attach (GTK_GRID (group_grid), label, 1, row, 1, 1);
@@ -1699,7 +1705,7 @@ gint crow, row;
        gtk_grid_set_row_spacing (GTK_GRID (group_grid), SPACING_SMALL);
        gtk_grid_set_column_spacing (GTK_GRID (group_grid), SPACING_MEDIUM);
        gtk_grid_attach (GTK_GRID (content_grid), group_grid, 0, crow++, 1, 1);
-       
+
        label = make_label_group(_("Amount colors"));
        gtk_grid_attach (GTK_GRID (group_grid), label, 0, 0, 3, 1);
 
@@ -1729,11 +1735,11 @@ gint crow, row;
        gtk_grid_attach (GTK_GRID (group_grid), label, 1, row, 1, 1);
        hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, SPACING_SMALL);
        gtk_grid_attach (GTK_GRID (group_grid), hbox, 2, row, 1, 1);
-       
+
        widget = gtk_color_button_new ();
        data->CP_exp_color = widget;
        gtk_box_pack_start (GTK_BOX (hbox), widget, FALSE, FALSE, 0);
-       
+
        label = make_label_widget(_("_Income:"));
        gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0);
 
@@ -1767,7 +1773,7 @@ gint crow, row;
        gtk_grid_set_row_spacing (GTK_GRID (group_grid), SPACING_SMALL);
        gtk_grid_set_column_spacing (GTK_GRID (group_grid), SPACING_MEDIUM);
        gtk_grid_attach (GTK_GRID (content_grid), group_grid, 0, crow++, 1, 1);
-       
+
        label = make_label_group(_("Program start"));
        gtk_grid_attach (GTK_GRID (group_grid), label, 0, 0, 3, 1);
 
@@ -1819,7 +1825,7 @@ gint crow, row;
        gtk_grid_set_row_spacing (GTK_GRID (group_grid), SPACING_SMALL);
        gtk_grid_set_column_spacing (GTK_GRID (group_grid), SPACING_MEDIUM);
        gtk_grid_attach (GTK_GRID (content_grid), group_grid, 0, crow++, 1, 1);
-       
+
        label = make_label_group(_("Main window reports"));
        gtk_grid_attach (GTK_GRID (group_grid), label, 0, 0, 3, 1);
 
@@ -1835,7 +1841,7 @@ gint crow, row;
        gtk_grid_set_row_spacing (GTK_GRID (group_grid), SPACING_SMALL);
        gtk_grid_set_column_spacing (GTK_GRID (group_grid), SPACING_MEDIUM);
        gtk_grid_attach (GTK_GRID (content_grid), group_grid, 0, crow++, 1, 1);
-       
+
        label = make_label_group(_("Files folder"));
        gtk_grid_attach (GTK_GRID (group_grid), label, 0, 0, 3, 1);
 
@@ -1860,6 +1866,202 @@ gint crow, row;
        return content_grid;
 }
 
+
+void plugin_execute_action(GtkTreeView* treeview, GtkTreePath* path, GtkTreeViewColumn* col, gpointer userdata);
+
+static void
+toggle_plugin(GtkCellRendererToggle *cell, gchar* path_str, gpointer data)
+{
+       GtkTreeModel *model = (GtkTreeModel*)data;
+       GtkTreeIter  iter;
+       GtkTreePath *path = gtk_tree_path_new_from_string(path_str);
+
+       const gchar* plugin;
+
+       gtk_tree_model_get_iter(model, &iter, path);
+       gtk_tree_model_get(model, &iter, EXT_COLUMN_PLUGIN_NAME, &plugin, -1);
+
+       gboolean enabled = ext_is_plugin_loaded(plugin);
+       if (enabled) {
+               ext_unload_plugin(plugin);
+               enabled = FALSE;
+       } else {
+               enabled = (ext_load_plugin(plugin) == 0);
+               if (!enabled) {
+                       ext_run_modal(_("Plugin Error"), _("The plugin failed to load properly."), "error");
+               }
+       }
+
+       /* set new value */
+       gtk_list_store_set(GTK_LIST_STORE (model), &iter, EXT_COLUMN_ENABLED, enabled, -1);
+
+       /* clean up */
+       gtk_tree_path_free(path);
+}
+
+
+void plugin_execute_action(GtkTreeView* treeview, GtkTreePath* path, GtkTreeViewColumn* col, gpointer userdata)
+{
+       GtkTreeModel*   model = gtk_tree_view_get_model(treeview);
+       GtkTreeIter     iter;
+
+       if (gtk_tree_model_get_iter(model, &iter, path)) {
+               gchar* plugin_filename;
+               gtk_tree_model_get(model, &iter, EXT_COLUMN_PLUGIN_NAME, &plugin_filename, -1);
+               ext_execute_action(plugin_filename);
+               g_free(plugin_filename);
+       }
+}
+
+static GtkWidget *defpref_page_plugins (struct defpref_data *data)
+{
+       GtkWidget *container;
+       GtkListStore *store;
+       GtkTreeIter it;
+       GtkWidget* view;
+
+       container = gtk_vbox_new(FALSE, 0);
+
+       store = gtk_list_store_new(EXT_NUM_COLUMNS, G_TYPE_BOOLEAN, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING);
+
+       gchar** plugins = ext_list_plugins();
+       gchar** plugins_it;
+       for (plugins_it = plugins; *plugins_it; ++plugins_it) {
+
+               gboolean    enabled = ext_is_plugin_loaded(*plugins_it);
+               GHashTable* metadata = ext_read_plugin_metadata(*plugins_it);
+               if (!metadata) {
+                       metadata = g_hash_table_new(g_str_hash, g_str_equal);
+               }
+
+               gchar* tmp = NULL;
+
+               // NAME
+               gchar* name = g_hash_table_lookup(metadata, "name");
+               if (!name || *name == '\0') {
+                       name = *plugins_it;
+               }
+               name = g_markup_escape_text(name, -1);
+               gchar* label = g_strdup_printf("<b>%s</b>", name);
+               gchar* tooltip = g_strdup_printf("<span size='x-large' weight='bold'>%s</span>", name);
+               g_free(name);
+
+               // VERSION
+               gchar* version = g_hash_table_lookup(metadata, "version");
+               if (version) {
+                       version = g_markup_escape_text(version, -1);
+                       tmp = label;
+                       label = g_strdup_printf("%s %s", tmp, version);
+                       g_free(tmp);
+                       tmp = tooltip;
+                       tooltip = g_strdup_printf("%s %s", tmp, version);
+                       g_free(tmp);
+                       g_free(version);
+               }
+
+               // ABSTRACT
+               gchar* abstract = g_hash_table_lookup(metadata, "abstract");
+               if (abstract) {
+                       abstract = g_markup_escape_text(abstract, -1);
+                       tmp = label;
+                       label = g_strdup_printf("%s\n%s", tmp, abstract);
+                       g_free(tmp);
+                       g_free(abstract);
+               }
+
+               // AUTHOR
+               gchar* author = g_hash_table_lookup(metadata, "author");
+               if (author) {
+                       author = g_markup_escape_text(author, -1);
+                       tmp = tooltip;
+                       tooltip = g_strdup_printf("%s\n%s", tmp, author);
+                       g_free(tmp);
+                       g_free(author);
+               }
+
+               // WEBSITE
+               gchar* website = g_hash_table_lookup(metadata, "website");
+               if (website) {
+                       website = g_markup_escape_text(website, -1);
+                       tmp = tooltip;
+                       tooltip = g_strdup_printf("%s\n<b>%s:</b> %s", tmp, _("Website"), website);
+                       g_free(tmp);
+                       g_free(website);
+               }
+
+               // FILEPATH
+               tmp = ext_find_plugin(*plugins_it);
+               gchar* full = g_markup_escape_text(tmp, -1);
+               g_free(tmp);
+               tmp = tooltip;
+               tooltip = g_strdup_printf("%s\n<b>%s:</b> %s", tmp, _("File"), full);
+               g_free(tmp);
+               g_free(full);
+
+               g_hash_table_unref(metadata);
+
+               gtk_list_store_append(store, &it);
+               gtk_list_store_set(store, &it,
+                               EXT_COLUMN_ENABLED,     enabled,
+                               EXT_COLUMN_LABEL,       label,
+                               EXT_COLUMN_TOOLTIP,     tooltip,
+                               EXT_COLUMN_PLUGIN_NAME, *plugins_it,
+                               -1);
+
+               g_free(label);
+               g_free(tooltip);
+       }
+       g_strfreev(plugins);
+
+       view = gtk_tree_view_new_with_model(GTK_TREE_MODEL(store));
+       g_object_unref(store);
+
+       g_signal_connect(view, "row-activated", (GCallback)plugin_execute_action, NULL);
+
+       gtk_tree_view_set_rules_hint(GTK_TREE_VIEW(view), TRUE);
+       gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(view), TRUE);
+       gtk_tree_view_set_tooltip_column(GTK_TREE_VIEW(view), EXT_COLUMN_TOOLTIP);
+
+
+       GtkTreeViewColumn   *col;
+       GtkCellRenderer     *renderer;
+
+
+       col = gtk_tree_view_column_new();
+       gtk_tree_view_column_set_title(col, _("Enabled"));
+       gtk_tree_view_column_set_sort_column_id(col, EXT_COLUMN_ENABLED);
+       gtk_tree_view_append_column(GTK_TREE_VIEW(view), col);
+
+       renderer = gtk_cell_renderer_toggle_new();
+       gtk_tree_view_column_pack_start(col, renderer, TRUE);
+       gtk_tree_view_column_add_attribute(col, renderer, "active", 0);
+       g_signal_connect(renderer, "toggled", G_CALLBACK(toggle_plugin), store);
+
+       col = gtk_tree_view_column_new();
+       gtk_tree_view_column_set_title(col, _("Plugin"));
+       gtk_tree_view_column_set_sort_column_id(col, EXT_COLUMN_LABEL);
+       gtk_tree_view_column_set_expand(col, TRUE);
+       /*gtk_tree_view_column_set_sort_order(col, GTK_SORT_ASCENDING);*/
+       gtk_tree_view_append_column(GTK_TREE_VIEW(view), col);
+
+       renderer = gtk_cell_renderer_text_new();
+       g_object_set(renderer, "ellipsize", PANGO_ELLIPSIZE_END, NULL);
+       gtk_tree_view_column_pack_start(col, renderer, TRUE);
+       gtk_tree_view_column_add_attribute(col, renderer, "markup", EXT_COLUMN_LABEL);
+
+       data->PI_plugin_columns = view;
+
+       GtkWidget* sw = gtk_scrolled_window_new(NULL, NULL);
+       gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(sw), GTK_SHADOW_ETCHED_IN);
+       gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(sw), GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC);
+       gtk_container_add(GTK_CONTAINER(sw), view);
+
+       gtk_box_pack_start(GTK_BOX(container), sw, TRUE, TRUE, 0);
+
+       return(container);
+}
+
+
 static void defpref_selection(GtkTreeSelection *treeselection, gpointer user_data)
 {
 struct defpref_data *data;
@@ -1954,12 +2156,12 @@ gint result;
                homebank_pref_setdefault();
                defpref_set(data);
        }
-       
+
 }
 
 
 // the window creation
-GtkWidget *defpref_dialog_new (void)
+GtkWidget *defpref_dialog_new (gint initial_selection)
 {
 struct defpref_data data;
 GtkWidget *window, *content, *mainvbox;
@@ -1975,7 +2177,7 @@ GtkWidget *hbox, *vbox, *sw, *widget, *notebook, *page, *ebox, *image, *label;
                                NULL);
 
        data.window = window;
-       
+
        //store our window private data
        g_object_set_data(G_OBJECT(window), "inst_data", (gpointer)&data);
 
@@ -1993,7 +2195,7 @@ GtkWidget *hbox, *vbox, *sw, *widget, *notebook, *page, *ebox, *image, *label;
        //left part
        vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, SPACING_SMALL);
        gtk_box_pack_start (GTK_BOX (hbox), vbox, FALSE, FALSE, 0);
-       
+
        //list
        sw = gtk_scrolled_window_new (NULL, NULL);
        gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (sw), GTK_SHADOW_ETCHED_IN);
@@ -2007,7 +2209,7 @@ GtkWidget *hbox, *vbox, *sw, *widget, *notebook, *page, *ebox, *image, *label;
        data.BT_clear = gtk_button_new_with_mnemonic(_("_Reset"));
        gtk_box_pack_start (GTK_BOX (vbox), data.BT_clear, FALSE, TRUE, 0);
 
-       
+
        //right part : notebook
        vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, SPACING_MEDIUM);
        gtk_box_pack_start (GTK_BOX (hbox), vbox, TRUE, TRUE, 0);
@@ -2022,11 +2224,11 @@ GtkWidget *hbox, *vbox, *sw, *widget, *notebook, *page, *ebox, *image, *label;
        #else
        GtkCssProvider *provider;
                provider = gtk_css_provider_new ();
-               gtk_css_provider_load_from_data (provider, 
+               gtk_css_provider_load_from_data (provider,
                "#hbebox { color: @theme_selected_fg_color; background-color: @theme_selected_bg_color; }"
                , -1, NULL);
                gtk_style_context_add_provider (context, GTK_STYLE_PROVIDER(provider), G_MAXUINT);
-       
+
        //      gtk_style_context_set_state(context, GTK_STATE_FLAG_SELECTED);
        #endif
 
@@ -2101,6 +2303,10 @@ GtkWidget *hbox, *vbox, *sw, *widget, *notebook, *page, *ebox, *image, *label;
        page = defpref_page_euro(&data);
        gtk_notebook_append_page (GTK_NOTEBOOK (notebook), page, NULL);
 
+       //plugins
+       page = defpref_page_plugins(&data);
+       gtk_notebook_append_page (GTK_NOTEBOOK (notebook), page, NULL);
+
 
        //todo:should move this
        gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(data.CM_euro_enable), PREFS->euro_active);
@@ -2109,7 +2315,7 @@ GtkWidget *hbox, *vbox, *sw, *widget, *notebook, *page, *ebox, *image, *label;
        g_signal_connect (window, "destroy", G_CALLBACK (gtk_widget_destroyed), &window);
 
        g_signal_connect (G_OBJECT (data.BT_clear), "clicked", G_CALLBACK (defpref_clear), NULL);
-       
+
        //path selector
        g_signal_connect (data.BT_path_hbfile, "pressed", G_CALLBACK (defpref_pathselect), GINT_TO_POINTER(1));
        g_signal_connect (data.BT_path_import, "pressed", G_CALLBACK (defpref_pathselect), GINT_TO_POINTER(2));
@@ -2119,7 +2325,7 @@ GtkWidget *hbox, *vbox, *sw, *widget, *notebook, *page, *ebox, *image, *label;
     g_signal_connect (data.CY_colors, "changed", G_CALLBACK (defpref_colorpreset), NULL);
 
 
-       
+
        g_signal_connect (gtk_tree_view_get_selection(GTK_TREE_VIEW(data.LV_page)), "changed", G_CALLBACK (defpref_selection), notebook);
 
        g_signal_connect (data.CM_euro_enable, "toggled", G_CALLBACK (defpref_eurotoggle), NULL);
@@ -2156,7 +2362,8 @@ GtkWidget *hbox, *vbox, *sw, *widget, *notebook, *page, *ebox, *image, *label;
 
 
        //select first row
-       GtkTreePath *path = gtk_tree_path_new_first ();
+       GtkTreePath *path = gtk_tree_path_new_from_indices(initial_selection, -1);
+
 
        gtk_tree_selection_select_path (gtk_tree_view_get_selection(GTK_TREE_VIEW(data.LV_page)), path);
 
@@ -2165,6 +2372,7 @@ GtkWidget *hbox, *vbox, *sw, *widget, *notebook, *page, *ebox, *image, *label;
        gtk_tree_path_free(path);
 
        gtk_widget_show_all (window);
+       gtk_notebook_set_current_page(GTK_NOTEBOOK(notebook), initial_selection);
 
        gint result;
        gchar *old_lang;
@@ -2182,20 +2390,20 @@ GtkWidget *hbox, *vbox, *sw, *widget, *notebook, *page, *ebox, *image, *label;
                                ui_mainwindow_update(GLOBALS->mainwindow, GINT_TO_POINTER(UF_BALANCE+UF_VISUAL));
 
                                DB( g_print("old='%s' new='%s'\n", old_lang, PREFS->language) );
-                               
+
                                if(g_ascii_strncasecmp(old_lang == NULL ? "" : old_lang, PREFS->language == NULL ? "" : PREFS->language, -1) != 0)
                                {
                                        ui_dialog_msg_infoerror(GTK_WINDOW(window), GTK_MESSAGE_INFO,
                                                _("Info"),
                                                _("You will have to restart HomeBank\nfor the language change to take effect.")
                                        );
-                       
+
                                }
 
                                g_free(old_lang);
                                break;
                }
-       
+
 
        // cleanup and destroy
        //defhbfile_cleanup(&data, result);
@@ -2276,7 +2484,7 @@ GtkTreeIter  iter;
 GtkTreePath *path = gtk_tree_path_new_from_string (path_str);
 gboolean fixed;
 
-       // get toggled iter 
+       // get toggled iter
        gtk_tree_model_get_iter (model, &iter, path);
        gtk_tree_model_get (model, &iter, COLUMN_VISIBLE, &fixed, -1);
 
@@ -2300,7 +2508,7 @@ gboolean visible;
 gint i, id;
 
        DB( g_print("[lst_txn-colpref] store column order \n") );
-       
+
        model = gtk_tree_view_get_model(GTK_TREE_VIEW(treeview));
        valid = gtk_tree_model_get_iter_first(GTK_TREE_MODEL(model), &iter);
        i = 0;
@@ -2349,16 +2557,16 @@ gint i;
        gboolean visible;
 
                DB( g_print("eval %d, %s\n", i, list_txn_column_label[i]) );
-               
+
                if(i <= LST_DSPOPE_DATE) // status, date always displayed
                        continue;
 
                //[i-1] here because lst_ope_columns[] do not store LST_DSPOPE_DATAS
-               id = ABS(PREFS->lst_ope_columns[i-1]);  
+               id = ABS(PREFS->lst_ope_columns[i-1]);
                if(id == 0) id = i;      //if we pass here, new column or weird into pref file
                visible = (PREFS->lst_ope_columns[i-1] > 0) ? TRUE : FALSE;
 
-               
+
                DB( g_print(" - pos=%2d, id=%2d - %d '%s'\n", i, id, visible, list_txn_column_label[id]) );
 
                gtk_list_store_append (store, &iter);
@@ -2367,7 +2575,7 @@ gint i;
                        COLUMN_NAME, _(list_txn_column_label[id]),
                        COLUMN_ID  , id,
                        -1);
-               
+
        }
 
        //treeview
@@ -2386,7 +2594,7 @@ gint i;
        g_signal_connect (renderer, "toggled",
                            G_CALLBACK (list_txn_colpref_toggled_cell_data_function), store);
 
-       
+
        renderer = gtk_cell_renderer_text_new ();
        column = gtk_tree_view_column_new_with_attributes (_("Column"),
                                                             renderer,
@@ -2401,3 +2609,32 @@ gint i;
 }
 */
 
+
+static void list_ext_colpref_get(GtkTreeView *treeview, GList **columns)
+{
+       GtkTreeModel *model;
+       GtkTreeIter     iter;
+
+       g_list_free_full(*columns, g_free);
+       *columns = NULL;
+
+       model = gtk_tree_view_get_model(GTK_TREE_VIEW(treeview));
+
+       gboolean valid = gtk_tree_model_get_iter_first(GTK_TREE_MODEL(model), &iter);
+       while (valid) {
+               gboolean        enabled = FALSE;
+               const gchar*    name;
+
+               gtk_tree_model_get(GTK_TREE_MODEL(model), &iter,
+                       EXT_COLUMN_ENABLED,     &enabled,
+                       EXT_COLUMN_PLUGIN_NAME, &name,
+                       -1);
+
+               if (enabled) {
+                       *columns = g_list_append(*columns, g_strdup(name));
+               }
+
+               valid = gtk_tree_model_iter_next(GTK_TREE_MODEL(model), &iter);
+       }
+}
+
This page took 0.040508 seconds and 4 git commands to generate.