static void gplp_func_exec_action (GOPluginService *service, GnmAction const *action, WorkbookControl *wbc, GOErrorInfo **ret_error) { ServiceLoaderDataUI *loader_data; PyObject *fn, *ret; g_return_if_fail (_PyGObject_API != NULL); GO_INIT_RET_ERROR_INFO (ret_error); loader_data = g_object_get_data (G_OBJECT (service), "loader_data"); SWITCH_TO_PLUGIN (go_plugin_service_get_plugin (service)); fn = PyDict_GetItemString (loader_data->ui_actions, action->id); if (fn == NULL) { *ret_error = go_error_info_new_printf (_("Unknown action: %s"), action->id); return; } else if (!PyCallable_Check (fn)) { *ret_error = go_error_info_new_printf ( _("Not a valid function for action: %s"), action->id); return; } ret = PyObject_CallFunction (fn, (char *) "N", py_new_Gui_object (WBC_GTK (wbc))); if (ret == NULL) { *ret_error = go_error_info_new_str (py_exc_to_string ()); PyErr_Clear (); } else { Py_DECREF (ret); } }
static void gnm_stf_file_saver_save (G_GNUC_UNUSED GOFileSaver const *fs, GOIOContext *context, GoView const *view, GsfOutput *output) { WorkbookView *wbv = GNM_WORKBOOK_VIEW (view); Workbook *wb = wb_view_get_workbook (wbv); GnmStfExport *stfe = gnm_stf_get_stfe (G_OBJECT (wb)); GsfOutput *dummy_sink; /* TODO: move this GUI dependent code out of this * filesaver into gui-file.c. After this, remove includes (see above). */ if (GNM_IS_WBC_GTK (context->impl)) { gboolean cancelled = stf_export_dialog (WBC_GTK (context->impl), stfe, wb); if (cancelled) { go_io_error_unknown (context); return; } } if (!stfe->sheet_list) gnm_stf_export_options_sheet_list_add (stfe, wb_view_cur_sheet (wbv)); g_object_set (G_OBJECT (stfe), "sink", output, NULL); if (gnm_stf_export (stfe) == FALSE) go_cmd_context_error_import (GO_CMD_CONTEXT (context), _("Error while trying to export file as text")); /* We're not allowed to set a NULL sink, so use a dummy. */ dummy_sink = gsf_output_memory_new (); g_object_set (G_OBJECT (stfe), "sink", dummy_sink, NULL); g_object_unref (dummy_sink); }
/* * stf_read_workbook: * @fo: file opener * @enc: encoding of file * @context: command context * @book: workbook * @input: file to read from+convert * * Main routine, handles importing a file including all dialog mumbo-jumbo */ static void stf_read_workbook (G_GNUC_UNUSED GOFileOpener const *fo, gchar const *enc, GOIOContext *context, GoView *view, GsfInput *input) { DialogStfResult_t *dialogresult = NULL; char *name, *nameutf8 = NULL; char *data = NULL; size_t data_len; WorkbookView *wbv = GNM_WORKBOOK_VIEW (view); if (!GNM_IS_WBC_GTK (context->impl)) { go_io_error_string (context, _("This importer can only be used with a GUI.")); return; } name = g_path_get_basename (gsf_input_name (input)); nameutf8 = g_filename_to_utf8 (name, -1, NULL, NULL, NULL); g_free (name); if (!nameutf8) { g_warning ("Failed to convert filename to UTF-8. This shouldn't happen here."); goto out; } data = stf_preparse (context, input, &data_len); if (!data) goto out; dialogresult = stf_dialog (WBC_GTK (context->impl), enc, FALSE, NULL, FALSE, nameutf8, data, data_len); if (dialogresult != NULL) { Workbook *book = wb_view_get_workbook (wbv); int cols = dialogresult->colcount, rows = dialogresult->rowcount; Sheet *sheet; gnm_sheet_suggest_size (&cols, &rows); sheet = sheet_new (book, nameutf8, cols, rows); workbook_sheet_attach (book, sheet); if (stf_store_results (dialogresult, sheet, 0, 0)) { workbook_recalc_all (book); resize_columns (sheet); workbook_set_saveinfo (book, GO_FILE_FL_WRITE_ONLY, go_file_saver_for_id ("Gnumeric_stf:stf_assistant")); } else { /* the user has cancelled */ /* the caller should notice that we have no sheets */ workbook_sheet_delete (sheet); } } out: g_free (nameutf8); g_free (data); if (dialogresult != NULL) stf_dialog_result_free (dialogresult); }
static void hello_message (GnmAction const *action, WorkbookControl *wbc) { char *msg = g_strdup_printf ( _("This is message from the \"%s\" plugin."), go_plugin_get_name (uihello_plugin)); go_gtk_notice_dialog (wbcg_toplevel (WBC_GTK (wbc)), GTK_MESSAGE_INFO, "%s", msg); g_free (msg); }
static void view_data_sources (GnmAction const *action, WorkbookControl *wbc) { char *argv[2]; argv[0] = (char *) "gnome-database-properties-4.0"; argv[1] = NULL; if (!g_spawn_async (NULL, argv, NULL, G_SPAWN_SEARCH_PATH, NULL, NULL, NULL, NULL)) { char *msg = g_strdup_printf ( _("Could not run GNOME database configuration tool ('%s')"), argv[0]); go_gtk_notice_dialog (wbcg_toplevel (WBC_GTK (wbc)), GTK_MESSAGE_INFO, msg); g_free (msg); } }
static void stf_warning (GOIOContext *context, char const *msg) { /* * Using go_cmd_context_error_import will destroy the * successfully imported portion. We ought to have a * way to issue a warning. */ if (GNM_IS_WBC_GTK (context->impl)) go_gtk_notice_dialog (wbcg_toplevel (WBC_GTK (context->impl)), GTK_MESSAGE_WARNING, "%s", msg); else g_warning ("%s", msg); }
static void cb_view_ok_clicked (G_GNUC_UNUSED GtkWidget *button, ViewState *state) { WBCGtk *wbcg = state->wbcg; WorkbookControl *wbc = WORKBOOK_CONTROL (wbcg); WorkbookControl *new_wbc; gboolean shared; GdkScreen *screen; GSList *buttons = gtk_radio_button_get_group (state->location_elsewhere); shared = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (go_gtk_builder_get_widget (state->gui, "view_shared"))); while (buttons) if (gtk_toggle_button_get_active (buttons->data)) break; else buttons = buttons->next; if (!buttons) { g_assert_not_reached (); return; } else if (buttons->data == state->location_elsewhere) { const char *name = gtk_entry_get_text (state->location_display_name); GdkDisplay *display; if (!name) return; /* Just ignore */ display = gdk_display_open (name); if (!display) { char *error_str = g_strdup_printf (_("Display \"%s\" could not be opened."), name); gtk_widget_destroy (state->dialog); go_gtk_notice_dialog (wbcg_toplevel (wbcg), GTK_MESSAGE_ERROR, "%s", error_str); g_free (error_str); return; } screen = gdk_display_get_default_screen (display); } else { screen = g_object_get_data (buttons->data, "screen"); } gtk_widget_destroy (state->dialog); new_wbc = wb_control_wrapper_new (wbc, shared ? wb_control_view (wbc) : NULL, wb_control_get_workbook (wbc), screen); if (IS_WBC_GTK (new_wbc)) { /* What else would it be? */ WBCGtk *new_wbcg = WBC_GTK (new_wbc); wbcg_copy_toolbar_visibility (new_wbcg, wbcg); _gnm_app_flag_windows_changed (); } }
/** * stf_text_to_columns: * @wbc: The control making the request * @cc: * * Main routine, handles importing a file including all dialog mumbo-jumbo **/ void stf_text_to_columns (WorkbookControl *wbc, GOCmdContext *cc) { DialogStfResult_t *dialogresult = NULL; SheetView *sv; Sheet *src_sheet, *target_sheet; GnmRange const *src; GnmRange target; GsfOutput *buf; guint8 const *data; size_t data_len; sv = wb_control_cur_sheet_view (wbc); src_sheet = sv_sheet (sv); src = selection_first_range (sv, cc, _("Text to Columns")); if (src == NULL) return; if (range_width (src) > 1) { go_cmd_context_error (cc, g_error_new (go_error_invalid (), 0, _("Only one column of input data can be parsed at a time"))); return; } /* FIXME : how to do this cleanly ? */ if (!GNM_IS_WBC_GTK (wbc)) return; #warning Add UI for this target_sheet = src_sheet; target = *src; range_translate (&target, target_sheet, 1, 0); buf = gsf_output_memory_new (); sheet_foreach_cell_in_range (src_sheet, CELL_ITER_ALL, src->start.col, src->start.row, src->end.col, src->end.row, (CellIterFunc) &cb_get_content, buf); gsf_output_close (buf); data = gsf_output_memory_get_bytes (GSF_OUTPUT_MEMORY (buf)); data_len = (size_t)gsf_output_size (buf); if (data_len == 0) { go_cmd_context_error_import (GO_CMD_CONTEXT (cc), _("There is no data " "to convert")); } else { dialogresult = stf_dialog (WBC_GTK (wbc), NULL, FALSE, NULL, FALSE, _("Text to Columns"), data, data_len); } if (dialogresult != NULL) { GnmCellRegion *cr = stf_parse_region (dialogresult->parseoptions, dialogresult->text, NULL, target_sheet->workbook); if (cr != NULL) { stf_dialog_result_attach_formats_to_cr (dialogresult, cr); target.end.col = target.start.col + cr->cols - 1; target.end.row = target.start.row + cr->rows - 1; } if (cr == NULL || cmd_text_to_columns (wbc, src, src_sheet, &target, target_sheet, cr)) go_cmd_context_error_import (GO_CMD_CONTEXT (cc), _("Error while trying to " "parse data into sheet")); stf_dialog_result_free (dialogresult); } g_object_unref (buf); }