static void gogo_dim_start (GsfXMLIn *xin, xmlChar const **attrs) { GogXMLReadState *state = (GogXMLReadState *)xin->user_state; xmlChar const *dim_str = NULL, *type_str = NULL; GType type; int first, last; if (NULL == state->obj) return; g_return_if_fail (GOG_IS_DATASET (state->obj)); for (; attrs != NULL && attrs[0] && attrs[1] ; attrs += 2) if (0 == strcmp (attrs[0], "id")) dim_str = attrs[1]; else if (0 == strcmp (attrs[0], "type")) type_str = attrs[1]; if (NULL == dim_str) { g_warning ("missing dimension id for class `%s'", G_OBJECT_TYPE_NAME (state->obj)); return; } state->dimension_id = strtol (dim_str, NULL, 10); gog_dataset_dims (GOG_DATASET (state->obj), &first, &last); if (state->dimension_id < first || state->dimension_id > last) { g_warning ("invalid dimension id %d for class `%s'", state->dimension_id, G_OBJECT_TYPE_NAME (state->obj)); return; } if (NULL == type_str) { g_warning ("missing type for dimension `%s' of class `%s'", dim_str, G_OBJECT_TYPE_NAME (state->obj)); return; } type = g_type_from_name (type_str); if (0 == type) { g_warning ("unknown type '%s' for dimension `%s' of class `%s'", type_str, dim_str, G_OBJECT_TYPE_NAME (state->obj)); return; } else if (!g_type_is_a (type, GO_TYPE_DATA) || G_TYPE_IS_ABSTRACT (type)) { g_warning ("type '%s' is invalid as dimension `%s' of class `%s'", type_str, dim_str, G_OBJECT_TYPE_NAME (state->obj)); return; } state->dimension = g_object_new (type, NULL); g_return_if_fail (state->dimension != NULL); }
static void gog_smoothed_curve_finalize (GObject *obj) { GogSmoothedCurve *curve = GOG_SMOOTHED_CURVE (obj); g_free (curve->x); g_free (curve->y); if (curve->name != NULL) { gog_dataset_finalize (GOG_DATASET (obj)); g_free (curve->name); /* aliased pointer */ curve->name = NULL; } (*smoothed_curve_parent_klass->finalize) (obj); }
static void graph_setup_title (GogGraph *graph, const gchar *title) { GogLabel *label; GOData *data; GOStyle *style; PangoFontDescription *desc; label = g_object_new(GOG_TYPE_LABEL, NULL); data = go_data_scalar_str_new(title, FALSE); gog_dataset_set_dim(GOG_DATASET(label), 0, data, NULL); gog_object_add_by_name(GOG_OBJECT(graph), "Title", GOG_OBJECT(label)); style = go_styled_object_get_style(GO_STYLED_OBJECT(label)); desc = pango_font_description_from_string("Sans bold 16"); go_style_set_font_desc(style, desc); }
static void distribution_changed_cb (GtkComboBox *box, DistPrefs *prefs) { GODistribution *dist = NULL; int i, j, n; GtkTreeIter iter; GODistributionType dist_type; GParamSpec **props; GtkTreeModel *model = gtk_combo_box_get_model (box); gtk_combo_box_get_active_iter (box, &iter); gtk_tree_model_get (model, &iter, 1, &dist_type, -1); dist = go_distribution_new (dist_type); g_object_set (prefs->client, "distribution", dist, NULL); props = g_object_class_list_properties (G_OBJECT_GET_CLASS (dist), &n); for (j = i = 0; j < n; j++) if (props[j]->flags & GO_PARAM_PERSISTENT) { char *lbl = g_strconcat (_(g_param_spec_get_nick (props[j])), _(":"), NULL); if (!prefs->labels[i]) { GtkWidget *w = gtk_label_new (lbl); g_free (lbl); g_object_set (w, "xalign", 0., NULL); gtk_grid_attach (prefs->grid, w, 0, i + 1, 1, 1); prefs->labels[i] = w; } else gtk_label_set_text (GTK_LABEL (prefs->labels[i]), lbl); if (!prefs->data[i]) { GtkWidget *w = GTK_WIDGET (gog_data_allocator_editor (prefs->dalloc, GOG_DATASET (prefs->client), i, GOG_DATA_SCALAR)); gtk_grid_attach (prefs->grid, w, 1, i + 1, 1, 1); prefs->data[i] = w; } gtk_widget_show (prefs->labels[i]); gtk_widget_show (prefs->data[i]); prefs->props[i++] = props[j]; } while (i < 2) { if (prefs->labels[i]) gtk_widget_hide (prefs->labels[i]); if (prefs->data[i]) gtk_widget_hide (prefs->data[i]); prefs->props[i++] = NULL; } g_free (props); g_object_unref (dist); }
static void gogo_dim_end (GsfXMLIn *xin, G_GNUC_UNUSED GsfXMLBlob *unknown) { GogXMLReadState *state = (GogXMLReadState *)xin->user_state; if (NULL == state->obj) return; g_return_if_fail (GOG_IS_DATASET (state->obj)); if (NULL != state->dimension) { if (go_data_unserialize (state->dimension, xin->content->str, state->user_unserialize)) gog_dataset_set_dim (GOG_DATASET (state->obj), state->dimension_id, state->dimension, NULL); else g_object_unref (state->dimension); state->dimension = NULL; } }
void gog_object_write_xml_sax (GogObject const *obj, GsfXMLOut *output, gpointer user) { guint n; GParamSpec **props; GSList *ptr; g_return_if_fail (GOG_IS_OBJECT (obj)); gsf_xml_out_start_element (output, "GogObject"); /* Primary details */ if (obj->role != NULL) { if (strcmp (obj->role->id, GOG_BACKPLANE_NEW_ROLE_NAME) == 0) gsf_xml_out_add_cstr (output, "role", GOG_BACKPLANE_OLD_ROLE_NAME); else gsf_xml_out_add_cstr (output, "role", obj->role->id); } if (obj->explicitly_typed_role || obj->role == NULL) gsf_xml_out_add_cstr (output, "type", G_OBJECT_TYPE_NAME (obj)); /* properties */ props = g_object_class_list_properties (G_OBJECT_GET_CLASS (obj), &n); while (n-- > 0) if (props[n]->flags & GO_PARAM_PERSISTENT) gog_object_write_property_sax (obj, props[n], output); g_free (props); if (GO_IS_PERSIST (obj)) /* anything special for this class */ go_persist_sax_save (GO_PERSIST (obj), output); if (GOG_IS_DATASET (obj)) /* convenience to save data */ gog_dataset_sax_save (GOG_DATASET (obj), output, user); /* the children */ for (ptr = obj->children; ptr != NULL ; ptr = ptr->next) gog_object_write_xml_sax (ptr->data, output, user); gsf_xml_out_end_element (output); /* </GogObject> */ }
static GogPlot * setup_page (GtkNotebook *notebook, const gchar *service_id) { GtkWidget *child, *w; GogChart *chart; GogGraph *graph; GogLabel *label; GogPlot *plot; GOData *data; GOStyle *style; PangoFontDescription *desc; child = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0); gtk_notebook_append_page (notebook, child, gtk_label_new (service_id)); /* Create a graph widget and add it to the GtkVBox */ w = go_graph_widget_new (NULL); gtk_box_pack_end (GTK_BOX (child), w, TRUE, TRUE, 0); /* Get the embedded graph */ graph = go_graph_widget_get_graph (GO_GRAPH_WIDGET (w)); /* Add a title */ label = (GogLabel *) g_object_new (GOG_TYPE_LABEL, NULL); data = go_data_scalar_str_new (service_id, FALSE); gog_dataset_set_dim (GOG_DATASET (label), 0, data, NULL); gog_object_add_by_name (GOG_OBJECT (graph), "Title", GOG_OBJECT (label)); /* Change the title font */ style = go_styled_object_get_style (GO_STYLED_OBJECT (label)); desc = pango_font_description_from_string ("Sans bold 16"); go_style_set_font_desc (style, desc); /* Get the chart created by the widget initialization */ chart = go_graph_widget_get_chart (GO_GRAPH_WIDGET (w)); /* Create a plot and add it to the chart */ plot = (GogPlot *) gog_plot_new_by_name (service_id); gog_object_add_by_name (GOG_OBJECT (chart), "Plot", GOG_OBJECT (plot)); /* Add a legend to the chart */ gog_object_add_by_name (GOG_OBJECT (chart), "Legend", NULL); return plot; }
static void gog_smoothed_curve_populate_editor (GogObject *gobj, GOEditor *editor, GogDataAllocator *dalloc, GOCmdContext *cc) { GtkWidget *w, *child; GtkGrid *grid; GogDataset *set = GOG_DATASET (gobj); w = gtk_grid_new (); grid = GTK_GRID (w); g_object_set (G_OBJECT (grid), "margin", 12, "column-spacing", 12, "orientation", GTK_ORIENTATION_VERTICAL, NULL); child = gtk_label_new (_("(Name):")); gtk_grid_attach (grid, child, 0, 0, 1, 1); child = GTK_WIDGET (gog_data_allocator_editor (dalloc, set, -1, GOG_DATA_SCALAR)); g_object_set (G_OBJECT (child), "hexpand", TRUE, NULL); gtk_grid_attach (grid, child, 1, 0, 1, 1); gtk_widget_show_all (w); go_editor_add_page (editor, w, _("Details")); (GOG_OBJECT_CLASS (smoothed_curve_parent_klass)->populate_editor) (gobj, editor, dalloc, cc); }
GtkWidget * go_distribution_pref_new (GObject *obj, GogDataAllocator *dalloc, G_GNUC_UNUSED GOCmdContext *cc) { GtkListStore *model; GtkCellRenderer *renderer; GtkTreeIter iter; GParamSpec **props; int n, i, j; DistPrefs *prefs = g_new0 (DistPrefs, 1); GtkWidget *res = gtk_grid_new (); GtkWidget *w = gtk_label_new (_("Distribution:")); GODistribution *dist = NULL; GODistributionType dist_type; prefs->dalloc = dalloc; prefs->grid = GTK_GRID (res); g_object_get (obj, "distribution", &dist, NULL); g_return_val_if_fail (GO_IS_DISTRIBUTION (dist), NULL); dist_type = go_distribution_get_distribution_type (dist); g_object_set (res, "border-width", 12, "row-spacing", 12, "column-spacing", 24, NULL); g_object_set (w, "xalign", 0., NULL); gtk_grid_attach (prefs->grid, w, 0, 0, 1, 1); g_signal_connect_swapped (res, "destroy", G_CALLBACK (destroy_cb), prefs); prefs->client = obj; /* add the list of known distributions in a combobox */ model = gtk_list_store_new (2, G_TYPE_STRING, G_TYPE_INT); w = gtk_combo_box_new_with_model (GTK_TREE_MODEL (model)); g_object_unref (model); renderer = gtk_cell_renderer_text_new (); gtk_cell_layout_pack_start (GTK_CELL_LAYOUT (w), renderer, FALSE); gtk_cell_layout_set_attributes (GTK_CELL_LAYOUT (w), renderer, "text", 0, NULL); for (i = 0; i < GO_DISTRIBUTION_MAX; i++) { gtk_list_store_append (model, &iter); gtk_list_store_set (model, &iter, 0, _(go_distribution_type_to_string (i)), 1, i, -1); if (i == dist_type) gtk_combo_box_set_active_iter (GTK_COMBO_BOX (w), &iter); } g_signal_connect (w, "changed", G_CALLBACK (distribution_changed_cb), prefs); gtk_grid_attach (prefs->grid, w, 1, 0, 1, 1); /* other persistent properties */ i = 1; props = g_object_class_list_properties (G_OBJECT_GET_CLASS (dist), &n); for (j = 0; j < n; j++) if (props[j]->flags & GO_PARAM_PERSISTENT) { char *lbl = g_strconcat (_(g_param_spec_get_nick (props[j])), _(":"), NULL); w = gtk_label_new (lbl); g_free (lbl); g_object_set (w, "xalign", 0., NULL); gtk_grid_attach (prefs->grid, w, 0, i, 1, 1); prefs->labels[i-1] = w; prefs->props[i-1] = props[n]; w = GTK_WIDGET (gog_data_allocator_editor (dalloc, GOG_DATASET (obj), i - 1, GOG_DATA_SCALAR)); gtk_grid_attach (prefs->grid, w, 1, i, 1, 1); prefs->data[i] = w; i++; } g_free (props); gtk_widget_show_all (res); return res; }
int main (int argc, char *argv[]) { GtkWidget *window, *box, *w; GogChart *chart; GogGraph *graph; GogLabel *label; GogPlot *pie; GogSeries *series; GOStyle *style; GOData *data; GError *error; PangoFontDescription *desc; char const *title = "Some statistics"; char const * const legends[] = {"first", "second", "third", "fourth"}; double values[] = {10., 20., 30., 40.}; gtk_init (&argc, &argv); /* Initialize libgoffice */ libgoffice_init (); /* Initialize plugins manager */ go_plugins_init (NULL, NULL, NULL, NULL, TRUE, GO_TYPE_PLUGIN_LOADER_MODULE); window = gtk_window_new (GTK_WINDOW_TOPLEVEL); gtk_window_resize (GTK_WINDOW (window), 300, 340); gtk_window_set_title (GTK_WINDOW (window), "pie demo"); g_signal_connect (window, "destroy", gtk_main_quit, NULL); box = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0); w = gtk_button_new_from_stock (GTK_STOCK_QUIT); g_signal_connect_swapped (w, "clicked", G_CALLBACK (on_quit), window); gtk_box_pack_end (GTK_BOX (box), w, FALSE, FALSE, 0); w = gtk_separator_new (GTK_ORIENTATION_HORIZONTAL); gtk_box_pack_end (GTK_BOX (box), w, FALSE, FALSE, 2); /* Create a graph widget and add it to the GtkVBox */ w = go_graph_widget_new (NULL); gtk_box_pack_end (GTK_BOX (box), w, TRUE, TRUE, 0); /* Get the embedded graph */ graph = go_graph_widget_get_graph (GO_GRAPH_WIDGET (w)); /* Add a title */ label = (GogLabel *) g_object_new (GOG_TYPE_LABEL, NULL); data = go_data_scalar_str_new (title, FALSE); gog_dataset_set_dim (GOG_DATASET (label), 0, data, NULL); gog_object_add_by_name (GOG_OBJECT (graph), "Title", GOG_OBJECT (label)); /* Change the title font */ style = go_styled_object_get_style (GO_STYLED_OBJECT (label)); desc = pango_font_description_from_string ("Sans bold 16"); go_style_set_font_desc (style, desc); /* Get the chart created by the widget initialization */ chart = go_graph_widget_get_chart (GO_GRAPH_WIDGET (w)); /* Create a pie plot and add it to the chart */ pie = (GogPlot *) gog_plot_new_by_name ("GogPiePlot"); gog_object_add_by_name (GOG_OBJECT (chart), "Plot", GOG_OBJECT (pie)); /* Create a series for the plot and populate it with some simple data */ series = gog_plot_new_series (pie); data = go_data_vector_str_new (legends, 4, NULL); gog_series_set_dim (series, 0, data, &error); data = go_data_vector_val_new (values, 4, NULL); gog_series_set_dim (series, 1, data, &error); /* Add a legend to the chart */ gog_object_add_by_name (GOG_OBJECT (chart), "Legend", NULL); gtk_container_add (GTK_CONTAINER (window), box); gtk_widget_show_all (GTK_WIDGET (window)); w = gtk_separator_new (GTK_ORIENTATION_HORIZONTAL); gtk_box_pack_start (GTK_BOX (box), w, FALSE, FALSE, 0); gtk_main (); /* Clean libgoffice stuff */ libgoffice_shutdown (); return 0; }
GtkWidget * gog_xyz_surface_plot_pref (GogXYZPlot *plot, GogDataAllocator *dalloc, GOCmdContext *cc) { GogDataset *set = GOG_DATASET (plot); XYZSurfPrefsState *state; GtkWidget *w, *grid; GtkBuilder *gui = go_gtk_builder_load ("res:go:plot_surface/gog-xyz-surface-prefs.ui", GETTEXT_PACKAGE, cc); if (gui == NULL) return NULL; state = g_new (XYZSurfPrefsState, 1); state->plot = plot; state->x_spin = w = go_gtk_builder_get_widget (gui, "columns_spinner"); gtk_spin_button_set_value (GTK_SPIN_BUTTON (w), plot->columns); g_signal_connect (G_OBJECT (gtk_spin_button_get_adjustment (GTK_SPIN_BUTTON (w))), "value_changed", G_CALLBACK (cb_columns_changed), plot); state->x_label = go_gtk_builder_get_widget (gui, "cols-nb-lbl"); grid = go_gtk_builder_get_widget (gui, "gog-xyz-surface-prefs"); state->x_entry = GTK_WIDGET (gog_data_allocator_editor (dalloc, set, 0, GOG_DATA_VECTOR)); gtk_widget_show_all (state->x_entry); gtk_widget_set_margin_left (state->x_entry, 12); gtk_grid_attach (GTK_GRID (grid), state->x_entry, 0, 2, 3, 1); w = go_gtk_builder_get_widget (gui, "preset-cols-btn"); if (!state->plot->auto_x) { gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (w), TRUE); gtk_widget_hide (state->x_spin); gtk_widget_hide (state->x_label); } else gtk_widget_hide (state->x_entry); w = go_gtk_builder_get_widget (gui, "calc-cols-btn"); g_signal_connect (G_OBJECT (w), "toggled", G_CALLBACK (cb_cols_toggled), state); state->y_spin = w = go_gtk_builder_get_widget (gui, "rows_spinner"); gtk_spin_button_set_value (GTK_SPIN_BUTTON (w), plot->rows); g_signal_connect (G_OBJECT (gtk_spin_button_get_adjustment (GTK_SPIN_BUTTON (w))), "value_changed", G_CALLBACK (cb_rows_changed), plot); state->y_label = go_gtk_builder_get_widget (gui, "rows-nb-lbl"); state->y_entry = GTK_WIDGET (gog_data_allocator_editor (dalloc, set, 1, GOG_DATA_VECTOR)); gtk_widget_show_all (state->y_entry); gtk_widget_set_margin_left (state->y_entry, 12); gtk_grid_attach (GTK_GRID (grid), state->y_entry, 0, 5, 3, 1); w = go_gtk_builder_get_widget (gui, "preset-rows-btn"); if (!state->plot->auto_y) { gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (w), TRUE); gtk_widget_hide (state->y_spin); gtk_widget_hide (state->y_label); } else gtk_widget_hide (state->y_entry); w = go_gtk_builder_get_widget (gui, "calc-rows-btn"); g_signal_connect (G_OBJECT (w), "toggled", G_CALLBACK (cb_rows_toggled), state); w = go_gtk_builder_get_widget (gui, "missing-as-btn"); if (GOG_PLOT (plot)->desc.series.num_dim == 2) { gboolean as_density; gtk_widget_hide (w); gtk_widget_hide (go_gtk_builder_get_widget (gui, "missing-lbl")); w = gtk_check_button_new_with_label (_("Display population density")); gtk_container_add (GTK_CONTAINER (grid), w); gtk_widget_show (w); g_object_get (plot, "as-density", &as_density, NULL); gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (w), as_density); g_signal_connect (G_OBJECT (w), "toggled", G_CALLBACK (cb_as_density_toggled), state); } else { char const *missing; g_object_get (plot, "missing-as", &missing, NULL); gtk_combo_box_set_active (GTK_COMBO_BOX (w), missing_as_value (missing)); g_signal_connect (G_OBJECT (w), "changed", G_CALLBACK (cb_missing_as_changed), state); } w = GTK_WIDGET (g_object_ref (grid)); g_object_set_data_full (G_OBJECT (w), "state", state, g_free); g_object_unref (gui); return w; }