static void dialog_sheet_order_changed (SheetManager *state) { WorkbookControl *wbc = GNM_WBC (state->wbcg); Workbook *wb = wb_control_get_workbook (wbc); WorkbookSheetState *old_state; GtkTreeIter this_iter; gint n = 0, changes = 0; workbook_signals_block (state); old_state = workbook_sheet_state_new (wb); while (gtk_tree_model_iter_nth_child (GTK_TREE_MODEL (state->model), &this_iter, NULL, n)) { Sheet *this_sheet; gtk_tree_model_get (GTK_TREE_MODEL (state->model), &this_iter, SHEET_POINTER, &this_sheet, -1); if (this_sheet->index_in_wb != n) { changes++; workbook_sheet_move (this_sheet, n - this_sheet->index_in_wb); } n++; } if (changes > 0) { cmd_reorganize_sheets (wbc, old_state, NULL); update_undo (state, wbc); } else workbook_sheet_state_free (old_state); workbook_signals_unblock (state); }
void dialog_workbook_attr (WBCGtk *wbcg) { GtkBuilder *gui; AttrState *state; g_return_if_fail (wbcg != NULL); if (gnm_dialog_raise_if_exists (wbcg, WORKBOOK_ATTRIBUTE_KEY)) return; gui = gnm_gtk_builder_load ("res:ui/workbook-attr.ui", NULL, GO_CMD_CONTEXT (wbcg)); if (gui == NULL) return; /* Initialize */ state = g_new (AttrState, 1); state->gui = gui; state->wbcg = wbcg; state->wbv = wb_control_view (GNM_WBC (wbcg)); state->wb = wb_control_get_workbook (GNM_WBC (wbcg)); attr_dialog_impl (state); /* Select the same page the last invocation used */ attr_dialog_select_page (state, attr_dialog_page); }
static void cb_append_clicked (G_GNUC_UNUSED GtkWidget *ignore, SheetManager *state) { WorkbookSheetState *old_state; WorkbookControl *wbc = GNM_WBC (state->wbcg); Workbook *wb = wb_control_get_workbook (wbc); GtkTreeIter iter; Sheet *sheet, *old_sheet; workbook_signals_block (state); old_state = workbook_sheet_state_new (wb); old_sheet = workbook_sheet_by_index (wb, 0); workbook_sheet_add (wb, -1, gnm_sheet_get_max_cols (old_sheet), gnm_sheet_get_max_rows (old_sheet)); cmd_reorganize_sheets (wbc, old_state, NULL); update_undo (state, wbc); workbook_signals_unblock (state); sheet = workbook_sheet_by_index (wb, workbook_sheet_count (wb) - 1); g_signal_handler_block (state->model, state->model_row_insertion_listener); gtk_list_store_append (state->model, &iter); g_signal_handler_unblock (state->model, state->model_row_insertion_listener); set_sheet_info_at_iter (state, &iter, sheet); cb_selection_changed (NULL, state); }
void dialog_goto_cell (WBCGtk *wbcg) { GotoState* state; GtkBuilder *gui; g_return_if_fail (wbcg != NULL); if (gnumeric_dialog_raise_if_exists (wbcg, GOTO_KEY)) return; gui = gnm_gtk_builder_new ("goto.ui", NULL, GO_CMD_CONTEXT (wbcg)); if (gui == NULL) return; state = g_new (GotoState, 1); state->wbcg = wbcg; state->wb = wb_control_get_workbook (WORKBOOK_CONTROL (wbcg)); state->gui = gui; state->dialog = go_gtk_builder_get_widget (state->gui, "goto_dialog"); if (dialog_goto_init (state)) { go_gtk_notice_dialog (wbcg_toplevel (wbcg), GTK_MESSAGE_ERROR, _("Could not create the goto dialog.")); g_free (state); return; } gnumeric_keyed_dialog (state->wbcg, GTK_WINDOW (state->dialog), GOTO_KEY); gtk_widget_show_all (state->dialog); }
/** * dialog_goal_seek: * @wbcg: * @sheet: * * Create the dialog (guru). * **/ void dialog_goal_seek (WBCGtk *wbcg, Sheet *sheet) { GoalSeekState *state; GladeXML *gui; g_return_if_fail (IS_SHEET (sheet)); /* Testing hook. */ if (wbcg == NULL) { GnmRangeRef *range = g_object_get_data (G_OBJECT (sheet), "ssconvert-goal-seek"); if (range) { Sheet *start_sheet, *end_sheet; GnmEvalPos ep; GnmRange r; gnm_rangeref_normalize (range, eval_pos_init_sheet (&ep, sheet), &start_sheet, &end_sheet, &r); g_return_if_fail (start_sheet == sheet); dialog_goal_seek_test (sheet, &r); return; } } g_return_if_fail (wbcg != NULL); /* Only pop up one copy per workbook */ if (gnumeric_dialog_raise_if_exists (wbcg, GOALSEEK_KEY)) return; gui = gnm_glade_xml_new (GO_CMD_CONTEXT (wbcg), "goalseek.glade", NULL, NULL); if (gui == NULL) return; state = g_new (GoalSeekState, 1); state->wbcg = wbcg; state->wb = wb_control_get_workbook (WORKBOOK_CONTROL (wbcg)); state->sheet = sheet; state->gui = gui; state->warning_dialog = NULL; state->cancelled = TRUE; if (dialog_init (state)) { go_gtk_notice_dialog (wbcg_toplevel (wbcg), GTK_MESSAGE_ERROR, _("Could not create the Goal-Seek dialog.")); g_free (state); return; } gnumeric_keyed_dialog (state->wbcg, GTK_WINDOW (state->dialog), GOALSEEK_KEY); gtk_widget_show (state->dialog); }
static void cb_undo_clicked (G_GNUC_UNUSED GtkWidget *ignore, SheetManager *state) { WorkbookControl *wbc = GNM_WBC (state->wbcg); Workbook *wb = wb_control_get_workbook (wbc); command_undo (wbc); gtk_widget_set_sensitive (state->undo_btn, wb->undo_commands != NULL); populate_sheet_list (state); }
static void workbook_signals_unblock (SheetManager *state) { WorkbookControl *wbc = GNM_WBC (state->wbcg); Workbook *wb = wb_control_get_workbook (wbc); g_signal_handler_unblock (G_OBJECT (wb), state->sheet_order_changed_listener); g_signal_handler_unblock (G_OBJECT (wb), state->sheet_added_listener); g_signal_handler_unblock (G_OBJECT (wb), state->sheet_deleted_listener); }
static void cb_color_changed_back (G_GNUC_UNUSED GOComboColor *go_combo_color, GOColor color, G_GNUC_UNUSED gboolean custom, G_GNUC_UNUSED gboolean by_user, G_GNUC_UNUSED gboolean is_default, SheetManager *state) { GList *selected_rows, *l; GtkTreeSelection *selection = gtk_tree_view_get_selection (state->sheet_list); WorkbookSheetState *old_state; WorkbookControl *wbc = GNM_WBC (state->wbcg); Workbook *wb = wb_control_get_workbook (wbc); GdkRGBA gdk_color; GdkRGBA *p_gdk_color; GnmColor *gnm_color; g_return_if_fail (selection != NULL); selected_rows = gtk_tree_selection_get_selected_rows (selection, NULL); p_gdk_color = (color == 0) ? NULL : go_color_to_gdk_rgba (color, &gdk_color); gnm_color = (color == 0) ? NULL : gnm_color_new_gdk (&gdk_color); old_state = workbook_sheet_state_new (wb); for (l = selected_rows; l != NULL; l = l->next) { Sheet *this_sheet; GtkTreeIter sel_iter; GtkTreePath *path = l->data; gtk_tree_model_get_iter (GTK_TREE_MODEL (state->model), &sel_iter, path); gtk_tree_model_get (GTK_TREE_MODEL (state->model), &sel_iter, SHEET_POINTER, &this_sheet, -1); if (color_equal (p_gdk_color, this_sheet->tab_color)) continue; gtk_list_store_set (state->model, &sel_iter, BACKGROUND_COLOUR, p_gdk_color, -1); g_object_set (this_sheet, "tab-background", gnm_color, NULL); } style_color_unref (gnm_color); cmd_reorganize_sheets (wbc, old_state, NULL); update_undo (state, wbc); g_list_free_full (selected_rows, (GDestroyNotify) gtk_tree_path_free); }
static void cb_toggled_lock (G_GNUC_UNUSED GtkCellRendererToggle *cell, gchar *path_string, gpointer data) { SheetManager *state = data; GtkTreeModel *model = GTK_TREE_MODEL (state->model); GtkTreeIter iter; GtkTreePath *path = gtk_tree_path_new_from_string (path_string); gboolean is_locked = TRUE; Sheet *this_sheet = NULL; WorkbookSheetState *old_state = NULL; WorkbookControl *wbc = GNM_WBC (state->wbcg); Workbook *wb = wb_control_get_workbook (wbc); if (gtk_tree_model_get_iter (model, &iter, path)) { gtk_tree_model_get (model, &iter, SHEET_LOCKED, &is_locked, SHEET_POINTER, &this_sheet, -1); if (is_locked) { gtk_list_store_set (GTK_LIST_STORE (model), &iter, SHEET_LOCKED, FALSE, SHEET_LOCK_IMAGE, state->image_padlock_no, -1); } else { gtk_list_store_set (GTK_LIST_STORE (model), &iter, SHEET_LOCKED, TRUE, SHEET_LOCK_IMAGE, state->image_padlock, -1); } } else { g_warning ("Did not get a valid iterator"); gtk_tree_path_free (path); return; } gtk_tree_path_free (path); old_state = workbook_sheet_state_new (wb); g_object_set (this_sheet, "protected", !is_locked, NULL); cmd_reorganize_sheets (wbc, old_state, this_sheet); update_undo (state, wbc); }
static void cb_delete_clicked (G_GNUC_UNUSED GtkWidget *ignore, SheetManager *state) { GtkTreeSelection *selection = gtk_tree_view_get_selection (state->sheet_list); GList *selected_rows, *l; WorkbookSheetState *old_state; WorkbookControl *wbc = GNM_WBC (state->wbcg); Workbook *wb = wb_control_get_workbook (wbc); g_return_if_fail (selection != NULL); selected_rows = gtk_tree_selection_get_selected_rows (selection, NULL); for (l = selected_rows; l != NULL; l = l->next) l->data = gtk_tree_row_reference_new (GTK_TREE_MODEL (state->model), (GtkTreePath *) l->data); workbook_signals_block (state); old_state = workbook_sheet_state_new (wb); for (l = selected_rows; l != NULL; l = l->next) { GtkTreeRowReference *ref = l->data; if (gtk_tree_row_reference_valid (ref)) { GtkTreePath *path = gtk_tree_row_reference_get_path (ref); GtkTreeIter sel_iter; Sheet *sheet; gtk_tree_model_get_iter (GTK_TREE_MODEL (state->model), &sel_iter, path); gtk_tree_path_free (path); gtk_tree_model_get (GTK_TREE_MODEL (state->model), &sel_iter, SHEET_POINTER, &sheet, -1); gtk_list_store_remove (state->model, &sel_iter); workbook_sheet_delete (sheet); } } cmd_reorganize_sheets (wbc, old_state, NULL); update_undo (state, wbc); workbook_signals_unblock (state); populate_sheet_list (state); cb_name_edited (NULL, NULL, NULL, state); g_list_free_full (selected_rows, (GDestroyNotify) gtk_tree_row_reference_free); }
static void cb_duplicate_clicked (G_GNUC_UNUSED GtkWidget *ignore, SheetManager *state) { GtkTreeIter sel_iter, iter; GtkTreeSelection *selection = gtk_tree_view_get_selection (state->sheet_list); GList *selected_rows; WorkbookSheetState *old_state; int index; WorkbookControl *wbc = GNM_WBC (state->wbcg); Workbook *wb = wb_control_get_workbook (wbc); Sheet *new_sheet, *this_sheet; g_return_if_fail (selection != NULL); g_return_if_fail (gtk_tree_selection_count_selected_rows (selection) == 1); selected_rows = gtk_tree_selection_get_selected_rows (selection, NULL); gtk_tree_model_get_iter (GTK_TREE_MODEL (state->model), &sel_iter, (GtkTreePath *) selected_rows->data); g_list_free_full (selected_rows, (GDestroyNotify) gtk_tree_path_free); gtk_tree_model_get (GTK_TREE_MODEL (state->model), &sel_iter, SHEET_POINTER, &this_sheet, -1); workbook_signals_block (state); old_state = workbook_sheet_state_new (wb); index = this_sheet->index_in_wb; new_sheet = sheet_dup (this_sheet); workbook_sheet_attach_at_pos (wb, new_sheet, index + 1); g_signal_emit_by_name (G_OBJECT (wb), "sheet_added", 0); cmd_reorganize_sheets (wbc, old_state, NULL); update_undo (state, wbc); workbook_signals_unblock (state); g_signal_handler_block (state->model, state->model_row_insertion_listener); gtk_list_store_insert_after (state->model, &iter, &sel_iter); g_signal_handler_unblock (state->model, state->model_row_insertion_listener); set_sheet_info_at_iter (state, &iter, new_sheet); g_object_unref (new_sheet); cb_selection_changed (NULL, state); }
static void sort_asc_desc (SheetManager *state, gboolean asc) { WorkbookSheetState *old_state; WorkbookControl *wbc = GNM_WBC (state->wbcg); Workbook *wb = wb_control_get_workbook (wbc); GSList *l = NULL, *l_tmp; gint n = 0; gtk_tree_model_foreach (GTK_TREE_MODEL (state->model), gtmff_asc, &l); if (!asc) l = g_slist_reverse (l); workbook_signals_block (state); old_state = workbook_sheet_state_new (wb); for (l_tmp = l; l_tmp != NULL; l_tmp = l_tmp->next) { gtmff_sort_t *ptr = l_tmp->data; GtkTreeIter iter; Sheet *sheet; gtk_tree_model_iter_nth_child (GTK_TREE_MODEL (state->model), &iter, NULL, ptr->i); g_free (ptr->key); g_free (ptr); l_tmp->data = NULL; gtk_tree_model_get (GTK_TREE_MODEL (state->model), &iter, SHEET_POINTER, &sheet, -1); workbook_sheet_move (sheet, n - sheet->index_in_wb); n++; } g_slist_free (l); /* Now we change the list store */ dialog_sheet_order_update_sheet_order (state); cmd_reorganize_sheets (wbc, old_state, NULL); update_undo (state, wbc); workbook_signals_unblock (state); }
static void cb_add_clicked (G_GNUC_UNUSED GtkWidget *ignore, SheetManager *state) { GtkTreeIter sel_iter, iter; GtkTreeSelection *selection = gtk_tree_view_get_selection (state->sheet_list); GList *selected_rows; int index = -1; WorkbookSheetState *old_state; WorkbookControl *wbc = GNM_WBC (state->wbcg); Workbook *wb = wb_control_get_workbook (wbc); Sheet *sheet, *old_sheet = NULL; g_return_if_fail (selection != NULL); g_return_if_fail (gtk_tree_selection_count_selected_rows (selection) == 1); selected_rows = gtk_tree_selection_get_selected_rows (selection, NULL); gtk_tree_model_get_iter (GTK_TREE_MODEL (state->model), &sel_iter, (GtkTreePath *) selected_rows->data); g_list_free_full (selected_rows, (GDestroyNotify) gtk_tree_path_free); gtk_tree_model_get (GTK_TREE_MODEL (state->model), &sel_iter, SHEET_POINTER, &old_sheet, -1); index = old_sheet->index_in_wb; workbook_signals_block (state); old_state = workbook_sheet_state_new (wb); workbook_sheet_add (wb, index, gnm_sheet_get_max_cols (old_sheet), gnm_sheet_get_max_rows (old_sheet)); cmd_reorganize_sheets (wbc, old_state, NULL); update_undo (state, wbc); workbook_signals_unblock (state); g_signal_handler_block (state->model, state->model_row_insertion_listener); sheet = workbook_sheet_by_index (wb, index); gtk_list_store_insert_before (state->model, &iter, &sel_iter); g_signal_handler_unblock (state->model, state->model_row_insertion_listener); set_sheet_info_at_iter (state, &iter, sheet); cb_selection_changed (NULL, state); }
/* Add all of the sheets to the sheet_list */ static void populate_sheet_list (SheetManager *state) { GtkTreeSelection *selection; GtkTreeIter iter; WorkbookControl *wbc = GNM_WBC (state->wbcg); Workbook *wb = wb_control_get_workbook (wbc); Sheet *cur_sheet = wb_control_cur_sheet (wbc); int i, n = workbook_sheet_count (wb); GtkTreePath *sel_path = NULL; selection = gtk_tree_view_get_selection (state->sheet_list); g_signal_handler_block (selection, state->model_selection_changed_listener); if (state->model_row_insertion_listener) g_signal_handler_block (state->model, state->model_row_insertion_listener); gtk_list_store_clear (state->model); gtk_label_set_text (GTK_LABEL (state->warning), ""); for (i = 0 ; i < n ; i++) { Sheet *sheet = workbook_sheet_by_index (wb, i); gtk_list_store_append (state->model, &iter); set_sheet_info_at_iter (state, &iter, sheet); if (sheet == cur_sheet) sel_path = gtk_tree_model_get_path (GTK_TREE_MODEL (state->model), &iter); } if (sel_path) { gtk_tree_selection_select_path (selection, sel_path); gtk_tree_path_free (sel_path); } if (state->model_row_insertion_listener) g_signal_handler_unblock (state->model, state->model_row_insertion_listener); g_signal_handler_unblock (selection, state->model_selection_changed_listener); /* Init the buttons & selection */ cb_selection_changed (NULL, state); }
static void cb_apply_names_clicked (G_GNUC_UNUSED GtkWidget *ignore, SheetManager *state) { WorkbookControl *wbc = GNM_WBC (state->wbcg); Workbook *wb = wb_control_get_workbook (wbc); WorkbookSheetState *old_state; GtkTreeIter this_iter; gint n = 0; /* Stop listening to changes in the sheet order. */ workbook_signals_block (state); old_state = workbook_sheet_state_new (wb); while (gtk_tree_model_iter_nth_child (GTK_TREE_MODEL (state->model), &this_iter, NULL, n)) { Sheet *this_sheet; char *new_name; gtk_tree_model_get (GTK_TREE_MODEL (state->model), &this_iter, SHEET_POINTER, &this_sheet, SHEET_NEW_NAME, &new_name, -1); if (*new_name) { g_object_set (this_sheet, "name", new_name, NULL); gtk_list_store_set (state->model, &this_iter, SHEET_NAME, new_name, SHEET_NEW_NAME, "", -1); } g_free (new_name); n++; } cmd_reorganize_sheets (wbc, old_state, NULL); gtk_label_set_text (GTK_LABEL (state->warning), ""); update_undo (state, wbc); workbook_signals_unblock (state); }
static void cb_sheet_order_destroy (SheetManager *state) { Workbook *wb = wb_control_get_workbook (GNM_WBC (state->wbcg)); /* Stop to listen to changes in the sheet order. */ if (state->sheet_order_changed_listener) g_signal_handler_disconnect (G_OBJECT (wb), state->sheet_order_changed_listener); if (state->sheet_added_listener) g_signal_handler_disconnect (G_OBJECT (wb), state->sheet_added_listener); if (state->sheet_deleted_listener) g_signal_handler_disconnect (G_OBJECT (wb), state->sheet_deleted_listener); if (state->model != NULL) { g_object_unref (state->model); state->model = NULL; } g_object_unref (state->gui); g_object_set_data (G_OBJECT (wb), SHEET_ORDER_KEY, NULL); state->gui = NULL; g_object_unref (state->image_padlock); state->image_padlock = NULL; g_object_unref (state->image_padlock_no); state->image_padlock_no = NULL; g_object_unref (state->image_visible); state->image_visible = NULL; g_object_unref (state->image_rtl); state->image_rtl = NULL; g_object_unref (state->image_ltr); state->image_ltr = NULL; g_free (state); }
/* * Main entry point for the Cell Sort dialog box */ void dialog_cell_sort (WBCGtk *wbcg) { SortFlowState *state; GtkBuilder *gui; g_return_if_fail (wbcg != NULL); if (gnumeric_dialog_raise_if_exists (wbcg, CELL_SORT_KEY)) return; gui = gnm_gtk_builder_new ("cell-sort.ui", NULL, GO_CMD_CONTEXT (wbcg)); if (gui == NULL) return; state = g_new (SortFlowState, 1); state->wbcg = wbcg; state->wb = wb_control_get_workbook (WORKBOOK_CONTROL (wbcg)); state->sv = wb_control_cur_sheet_view (WORKBOOK_CONTROL (wbcg)); state->sheet = sv_sheet (state->sv); state->warning_dialog = NULL; state->sel = NULL; state->sort_items = 0; state->gui = gui; state->dialog = go_gtk_builder_get_widget (state->gui, "CellSort"); state->image_ascending = gtk_widget_render_icon_pixbuf (state->dialog, GTK_STOCK_SORT_ASCENDING, GTK_ICON_SIZE_LARGE_TOOLBAR); state->image_descending = gtk_widget_render_icon_pixbuf (state->dialog, GTK_STOCK_SORT_DESCENDING, GTK_ICON_SIZE_LARGE_TOOLBAR); dialog_init (state); gnumeric_keyed_dialog (state->wbcg, GTK_WINDOW (state->dialog), CELL_SORT_KEY); gtk_widget_show (state->dialog); }
static void cb_toggled_direction (G_GNUC_UNUSED GtkCellRendererToggle *cell, gchar *path_string, SheetManager *state) { GtkTreeModel *model = GTK_TREE_MODEL (state->model); GtkTreePath *path = gtk_tree_path_new_from_string (path_string); GtkTreeIter iter; gboolean is_rtl = TRUE; Sheet *this_sheet = NULL; WorkbookSheetState *old_state = NULL; WorkbookControl *wbc = GNM_WBC (state->wbcg); Workbook *wb = wb_control_get_workbook (wbc); if (gtk_tree_model_get_iter (model, &iter, path)) { gtk_tree_model_get (model, &iter, SHEET_DIRECTION, &is_rtl, SHEET_POINTER, &this_sheet, -1); gtk_list_store_set (GTK_LIST_STORE (model), &iter, SHEET_DIRECTION, !is_rtl, SHEET_DIRECTION_IMAGE, is_rtl ? state->image_ltr : state->image_rtl, -1); } else { g_warning ("Did not get a valid iterator"); gtk_tree_path_free (path); return; } gtk_tree_path_free (path); old_state = workbook_sheet_state_new (wb); g_object_set (this_sheet, "text-is-rtl", !is_rtl, NULL); cmd_reorganize_sheets (wbc, old_state, this_sheet); update_undo (state, wbc); }
GODoc * wb_control_get_doc (WorkbookControl const *wbc) { return GO_DOC (wb_control_get_workbook (wbc)); }
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 (); } }
void dialog_scenarios (WBCGtk *wbcg) { ScenariosState *state; WorkbookControl *wbc; Sheet *sheet; GtkWidget *w; GtkTreeSelection *select; char const *error_str = _("Could not create the Scenarios dialog."); g_return_if_fail (wbcg != NULL); wbc = WORKBOOK_CONTROL (wbcg); sheet = wb_control_cur_sheet (wbc); state = g_new (ScenariosState, 1); state->new_report_sheets = NULL; state->current = NULL; state->undo = NULL; state->base.wb = wb_control_get_workbook (wbc); if (dialog_tool_init (&state->base, wbcg, sheet, GNUMERIC_HELP_LINK_SCENARIOS_VIEW, "scenario-manager.ui", "Scenarios", error_str, "Scenarios", G_CALLBACK (scenarios_ok_clicked_cb), G_CALLBACK (scenarios_cancel_clicked_cb), G_CALLBACK (scenarios_update_sensitivity_cb), 0)) goto error_out; if (init_scenario_buttons (state)) goto error_out; state->scenarios_treeview = go_gtk_builder_get_widget (state->base.gui, "scenarios_treeview"); if (state->scenarios_treeview == NULL) goto error_out; w = go_gtk_builder_get_widget (state->base.gui, "changing_cells_entry"); if (w == NULL) goto error_out; gtk_widget_set_sensitive (w, FALSE); w = go_gtk_builder_get_widget (state->base.gui, "comment_view"); if (w == NULL) goto error_out; gtk_widget_set_sensitive (w, FALSE); if (state->base.sheet->scenarios == NULL) gtk_widget_set_sensitive (state->summary_button, FALSE); update_scenarios_treeview (state->scenarios_treeview, sheet->scenarios); select = gtk_tree_view_get_selection (GTK_TREE_VIEW (state->scenarios_treeview)); g_signal_connect (select, "changed", G_CALLBACK (cb_selection_changed), state); scenarios_update_sensitivity_cb (NULL, state); gtk_widget_show (state->base.dialog); return; error_out: go_gtk_notice_dialog (wbcg_toplevel (wbcg), GTK_MESSAGE_ERROR, "%s", error_str); g_free (state); return; }
void dialog_autosave (WBCGtk *wbcg) { GtkBuilder *gui; autosave_t *state; int secs; gboolean prompt; g_return_if_fail (wbcg != NULL); if (gnm_dialog_raise_if_exists (wbcg, AUTOSAVE_KEY)) return; gui = gnm_gtk_builder_load ("autosave.ui", NULL, GO_CMD_CONTEXT (wbcg)); if (gui == NULL) return; g_object_get (wbcg, "autosave-time", &secs, "autosave-prompt", &prompt, NULL); state = g_new (autosave_t, 1); state->wbcg = wbcg; state->wb = wb_control_get_workbook (GNM_WBC (wbcg)); state->dialog = go_gtk_builder_get_widget (gui, "AutoSave"); state->minutes_entry = go_gtk_builder_get_widget (gui, "minutes"); state->prompt_cb = go_gtk_builder_get_widget (gui, "prompt_on_off"); state->autosave_on_off = go_gtk_builder_get_widget (gui, "autosave_on_off"); state->ok_button = go_gtk_builder_get_widget (gui, "button1"); state->cancel_button = go_gtk_builder_get_widget (gui, "button2"); if (!state->dialog || !state->minutes_entry || !state->prompt_cb || !state->autosave_on_off) { go_gtk_notice_dialog (wbcg_toplevel (wbcg), GTK_MESSAGE_ERROR, _("Could not create the autosave dialog.")); g_free (state); return; } float_to_entry (GTK_ENTRY (state->minutes_entry), secs / 60); gnm_editable_enters (GTK_WINDOW (state->dialog), state->minutes_entry); g_signal_connect (G_OBJECT (state->autosave_on_off), "toggled", G_CALLBACK (autosave_set_sensitivity), state); g_signal_connect (G_OBJECT (state->minutes_entry), "changed", G_CALLBACK (autosave_set_sensitivity), state); g_signal_connect (G_OBJECT (state->ok_button), "clicked", G_CALLBACK (cb_autosave_ok), state); g_signal_connect (G_OBJECT (state->cancel_button), "clicked", G_CALLBACK (cb_autosave_cancel), state); g_object_set_data_full (G_OBJECT (state->dialog), "state", state, (GDestroyNotify)g_free); gnm_init_help_button ( go_gtk_builder_get_widget (gui, "button3"), GNUMERIC_HELP_LINK_AUTOSAVE); gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (state->autosave_on_off), secs > 0); gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (state->prompt_cb), prompt); autosave_set_sensitivity (NULL, state); gnm_keyed_dialog (state->wbcg, GTK_WINDOW (state->dialog), AUTOSAVE_KEY); gtk_widget_show (state->dialog); g_object_unref (gui); }
void stf_dialog_format_page_init (GtkBuilder *gui, StfDialogData *pagedata) { /* GtkWidget * format_hbox; */ g_return_if_fail (gui != NULL); g_return_if_fail (pagedata != NULL); /* Create/get object and fill information struct */ pagedata->format.col_import_array = NULL; pagedata->format.col_autofit_array = NULL; pagedata->format.col_import_array_len = 0; pagedata->format.col_import_count = 0; pagedata->format.col_header = _("Column %d"); pagedata->format.format_data_container = go_gtk_builder_get_widget (gui, "format_data_container"); pagedata->format.format_trim = go_gtk_builder_get_widget (gui, "format_trim"); pagedata->format.column_selection_label = go_gtk_builder_get_widget (gui, "column_selection_label"); pagedata->format.locale_selector = GO_LOCALE_SEL (go_locale_sel_new ()); if (pagedata->locale && !go_locale_sel_set_locale (pagedata->format.locale_selector, pagedata->locale)) { g_free (pagedata->locale); pagedata->locale = go_locale_sel_get_locale (pagedata->format.locale_selector); } gtk_grid_attach ( GTK_GRID (go_gtk_builder_get_widget (gui, "locale-grid")), GTK_WIDGET (pagedata->format.locale_selector), 3, 0, 1, 1); gtk_widget_show_all (GTK_WIDGET (pagedata->format.locale_selector)); gtk_widget_set_sensitive (GTK_WIDGET (pagedata->format.locale_selector), !pagedata->fixed_locale); /* Set properties */ pagedata->format.renderdata = stf_preview_new (pagedata->format.format_data_container, workbook_date_conv (wb_control_get_workbook (WORKBOOK_CONTROL (pagedata->wbcg)))); pagedata->format.formats = g_ptr_array_new (); pagedata->format.index = -1; pagedata->format.manual_change = FALSE; /* Update widgets before connecting signals, see #333407. */ gtk_combo_box_set_active (GTK_COMBO_BOX (pagedata->format.format_trim), 0); format_page_update_column_selection (pagedata); /* Connect signals */ g_signal_connect (G_OBJECT (pagedata->format.locale_selector), "locale_changed", G_CALLBACK (locale_changed_cb), pagedata); g_signal_connect (G_OBJECT (pagedata->format.format_trim), "changed", G_CALLBACK (format_page_trim_menu_changed), pagedata); g_signal_connect (G_OBJECT (pagedata->format.renderdata->tree_view), "button_press_event", G_CALLBACK (cb_treeview_button_press), pagedata); g_signal_connect (G_OBJECT (pagedata->format.renderdata->tree_view), "key_press_event", G_CALLBACK (cb_treeview_key_press), pagedata); }
static void dialog_sheet_order_update_sheet_order (SheetManager *state) { GtkTreeIter iter; Workbook *wb = wb_control_get_workbook (GNM_WBC (state->wbcg)); int i, n_sheets, n_children; GtkTreeModel *model = GTK_TREE_MODEL (state->model); GtkTreeSelection *sel = gtk_tree_view_get_selection (state->sheet_list); n_sheets = workbook_sheet_count (wb); n_children = gtk_tree_model_iter_n_children (model, NULL); if (n_sheets != n_children) { /* This signal also occurs when sheets are added or deleted. We handle this */ /* when those signals arrive. */ return; } for (i = 0; i < n_sheets; i++) { gchar *name, *new_name; gboolean is_locked; gboolean is_visible; gboolean is_rtl; GdkRGBA *back, *fore; Sheet *sheet_wb = workbook_sheet_by_index (wb, i); Sheet *sheet_model; gboolean selected; int j, row_max, col_max; for (j = i; j < n_children; j++) { if (!gtk_tree_model_iter_nth_child (model, &iter, NULL, j)) break; gtk_tree_model_get (model, &iter, SHEET_POINTER, &sheet_model, -1); if (sheet_model == sheet_wb) break; } if (j == i) continue; if (!gtk_tree_model_iter_nth_child (model, &iter, NULL, j)) break; selected = gtk_tree_selection_iter_is_selected (sel, &iter); gtk_tree_model_get (model, &iter, SHEET_LOCKED, &is_locked, SHEET_VISIBLE, &is_visible, SHEET_ROW_MAX, &row_max, SHEET_COL_MAX, &col_max, SHEET_NAME, &name, SHEET_NEW_NAME, &new_name, SHEET_POINTER, &sheet_model, BACKGROUND_COLOUR, &back, FOREGROUND_COLOUR, &fore, SHEET_DIRECTION, &is_rtl, -1); gtk_list_store_remove (state->model, &iter); g_signal_handler_block (state->model, state->model_row_insertion_listener); gtk_list_store_insert (state->model, &iter, i); g_signal_handler_unblock (state->model, state->model_row_insertion_listener); gtk_list_store_set (state->model, &iter, SHEET_LOCKED, is_locked, SHEET_LOCK_IMAGE, is_locked ? state->image_padlock : state->image_padlock_no, SHEET_VISIBLE, is_visible, SHEET_VISIBLE_IMAGE, is_visible ? state->image_visible : NULL, SHEET_ROW_MAX, row_max, SHEET_COL_MAX, col_max, SHEET_NAME, name, SHEET_NEW_NAME, new_name, SHEET_POINTER, sheet_model, BACKGROUND_COLOUR, back, FOREGROUND_COLOUR, fore, SHEET_DIRECTION, is_rtl, SHEET_DIRECTION_IMAGE, is_rtl ? state->image_rtl : state->image_ltr, -1); if (back) gdk_rgba_free (back); if (fore) gdk_rgba_free (fore); g_free (name); g_free (new_name); if (selected) gtk_tree_selection_select_iter (sel, &iter); } cb_selection_changed (NULL, state); }
void dialog_zoom (WBCGtk *wbcg, Sheet *sheet) { ZoomState *state; GSList *l, *sheets; int i, row, cur_row; gboolean is_custom = TRUE; GtkRadioButton *radio; GtkWidget *focus_target; GladeXML *gui; GtkTreeViewColumn *column; g_return_if_fail (wbcg != NULL); g_return_if_fail (sheet != NULL); if (gnumeric_dialog_raise_if_exists (wbcg, ZOOM_DIALOG_KEY)) return; gui = gnm_glade_xml_new (GO_CMD_CONTEXT (wbcg), "dialog-zoom.glade", NULL, NULL); if (gui == NULL) return; state = g_new (ZoomState, 1); state->wbcg = wbcg; state->gui = gui; state->dialog = glade_xml_get_widget (state->gui, "Zoom"); g_return_if_fail (state->dialog != NULL); /* Get the list of sheets */ state->sheet_list_model = gtk_list_store_new (2, G_TYPE_STRING, G_TYPE_POINTER); state->sheet_list = GTK_TREE_VIEW (glade_xml_get_widget (state->gui, "sheet_list")); gtk_tree_view_set_headers_visible (state->sheet_list, FALSE); gtk_tree_view_set_model (state->sheet_list, GTK_TREE_MODEL (state->sheet_list_model)); state->sheet_list_selection = gtk_tree_view_get_selection (state->sheet_list); gtk_tree_selection_set_mode (state->sheet_list_selection, GTK_SELECTION_MULTIPLE); column = gtk_tree_view_column_new_with_attributes (_("Name"), gtk_cell_renderer_text_new (), "text", 0, NULL); gtk_tree_view_column_set_sort_column_id (column, COL_SHEET_NAME); gtk_tree_view_append_column (GTK_TREE_VIEW (state->sheet_list), column); sheets = workbook_sheets (wb_control_get_workbook (WORKBOOK_CONTROL (wbcg))); cur_row = row = 0; for (l = sheets; l; l = l->next) { GtkTreeIter iter; Sheet *this_sheet = l->data; gtk_list_store_append (state->sheet_list_model, &iter); gtk_list_store_set (state->sheet_list_model, &iter, COL_SHEET_NAME, this_sheet->name_unquoted, COL_SHEET_PTR, this_sheet, -1); if (this_sheet == sheet) cur_row = row; row++; } g_slist_free (sheets); { GtkTreePath *path = gtk_tree_path_new_from_indices (cur_row, -1); gtk_tree_view_set_cursor (state->sheet_list, path, NULL, FALSE); gtk_tree_path_free (path); } state->zoom = GTK_SPIN_BUTTON (glade_xml_get_widget (state->gui, "zoom")); g_return_if_fail (state->zoom != NULL); state->custom = GTK_RADIO_BUTTON (glade_xml_get_widget (state->gui, "radio_custom")); g_return_if_fail (state->custom != NULL); focus_target = GTK_WIDGET (state->custom); g_signal_connect (G_OBJECT (state->custom), "clicked", G_CALLBACK (focus_to_custom), (gpointer) state); g_signal_connect (G_OBJECT (state->zoom), "focus_in_event", G_CALLBACK (custom_selected), state); for (i = 0; buttons[i].name != NULL; i++) { radio = GTK_RADIO_BUTTON (glade_xml_get_widget (state->gui, buttons[i].name)); g_return_if_fail (radio != NULL); g_object_set_data (G_OBJECT (radio), ZOOM_DIALOG_FACTOR_KEY, GINT_TO_POINTER(buttons[i].factor)); g_signal_connect (G_OBJECT (radio), "toggled", G_CALLBACK (radio_toggled), state); if (((int)(sheet->last_zoom_factor_used * 100. + .5)) == buttons[i].factor) { gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (radio), TRUE); is_custom = FALSE; focus_target = GTK_WIDGET (radio); } } if (is_custom) { gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (state->custom), TRUE); gtk_spin_button_set_value (state->zoom, (int)(sheet->last_zoom_factor_used * 100. + .5)); } state->ok_button = glade_xml_get_widget (state->gui, "ok_button"); g_signal_connect (G_OBJECT (state->ok_button), "clicked", G_CALLBACK (cb_zoom_ok_clicked), state); state->cancel_button = glade_xml_get_widget (state->gui, "cancel_button"); g_signal_connect (G_OBJECT (state->cancel_button), "clicked", G_CALLBACK (cb_zoom_cancel_clicked), state); gnumeric_editable_enters (GTK_WINDOW (state->dialog), GTK_WIDGET (&state->zoom->entry)); gnumeric_init_help_button ( glade_xml_get_widget (state->gui, "help_button"), GNUMERIC_HELP_LINK_ZOOM); gnm_dialog_setup_destroy_handlers (GTK_DIALOG (state->dialog), wbcg, GNM_DIALOG_DESTROY_SHEET_REMOVED); gnumeric_keyed_dialog (wbcg, GTK_WINDOW (state->dialog), ZOOM_DIALOG_KEY); g_object_set_data_full (G_OBJECT (state->dialog), "state", state, (GDestroyNotify) cb_zoom_destroy); wbc_gtk_attach_guru (state->wbcg, state->dialog); gtk_widget_show (state->dialog); gtk_widget_grab_focus (focus_target); }
static void cb_toggled_visible (G_GNUC_UNUSED GtkCellRendererToggle *cell, gchar *path_string, gpointer data) { SheetManager *state = data; GtkTreeModel *model = GTK_TREE_MODEL (state->model); GtkTreeIter iter; GtkTreePath *path = gtk_tree_path_new_from_string (path_string); gboolean is_visible; Sheet *this_sheet; WorkbookSheetState *old_state; WorkbookControl *wbc = GNM_WBC (state->wbcg); Workbook *wb = wb_control_get_workbook (wbc); int cnt; if (!gtk_tree_model_get_iter (model, &iter, path)) { g_warning ("Did not get a valid iterator"); gtk_tree_path_free (path); return; } gtk_tree_model_get (model, &iter, SHEET_VISIBLE, &is_visible, SHEET_POINTER, &this_sheet, -1); if (is_visible) { cnt = sheet_order_cnt_visible (state); if (cnt <= 1) { go_gtk_notice_dialog (GTK_WINDOW (state->dialog), GTK_MESSAGE_ERROR, _("At least one sheet must remain visible!")); gtk_tree_path_free (path); return; } gtk_list_store_set (GTK_LIST_STORE (model), &iter, SHEET_VISIBLE, FALSE, SHEET_VISIBLE_IMAGE, NULL, -1); } else { gtk_list_store_set (GTK_LIST_STORE (model), &iter, SHEET_VISIBLE, TRUE, SHEET_VISIBLE_IMAGE, state->image_visible, -1); } gtk_tree_path_free (path); old_state = workbook_sheet_state_new (wb); g_object_set (this_sheet, "visibility", !is_visible ? GNM_SHEET_VISIBILITY_VISIBLE : GNM_SHEET_VISIBILITY_HIDDEN, NULL); cmd_reorganize_sheets (wbc, old_state, this_sheet); update_undo (state, wbc); if (is_visible) populate_sheet_list (state); }
void dialog_sheet_order (WBCGtk *wbcg) { SheetManager *state; GtkBuilder *gui; GtkGrid *grid; GOColorGroup *cg; Workbook *wb; GtkWidget *widget; GdkPixbuf *icon; g_return_if_fail (wbcg != NULL); widget = GTK_WIDGET (wbcg_toplevel (wbcg)); gui = gnm_gtk_builder_load ("res:ui/sheet-order.ui", NULL, GO_CMD_CONTEXT (wbcg)); if (gui == NULL) return; wb = wb_control_get_workbook (GNM_WBC (wbcg)); if (g_object_get_data (G_OBJECT (wb), SHEET_ORDER_KEY)) { GtkWidget *dialog = gtk_message_dialog_new (wbcg_toplevel (wbcg), GTK_DIALOG_DESTROY_WITH_PARENT, GTK_MESSAGE_WARNING, GTK_BUTTONS_CLOSE, _("Another view is already managing sheets")); go_gtk_dialog_run (GTK_DIALOG (dialog), wbcg_toplevel (wbcg)); return; } g_object_set_data (G_OBJECT (wb), SHEET_ORDER_KEY, (gpointer) gui); state = g_new0 (SheetManager, 1); state->gui = gui; state->wbcg = wbcg; state->dialog = go_gtk_builder_get_widget (gui, "sheet-order-dialog"); state->warning = go_gtk_builder_get_widget (gui, "warning"); state->up_btn = go_gtk_builder_get_widget (gui, "up_button"); state->down_btn = go_gtk_builder_get_widget (gui, "down_button"); state->add_btn = go_gtk_builder_get_widget (gui, "add_button"); state->append_btn = go_gtk_builder_get_widget (gui, "append_button"); state->duplicate_btn = go_gtk_builder_get_widget (gui, "duplicate_button"); state->delete_btn = go_gtk_builder_get_widget (gui, "delete_button"); state->apply_names_btn = go_gtk_builder_get_widget (gui, "ok_button"); state->sort_asc_btn = go_gtk_builder_get_widget (gui, "sort-asc-button"); state->sort_desc_btn = go_gtk_builder_get_widget (gui, "sort-desc-button"); state->undo_btn = go_gtk_builder_get_widget (gui, "undo-button"); state->cancel_btn = go_gtk_builder_get_widget (gui, "cancel_button"); state->advanced_check = go_gtk_builder_get_widget (gui, "advanced-check"); state->initial_colors_set = FALSE; state->image_padlock = go_gtk_widget_render_icon_pixbuf (widget, "gnumeric-protection-yes", GTK_ICON_SIZE_MENU); state->image_padlock_no = go_gtk_widget_render_icon_pixbuf (widget, "gnumeric-protection-no", GTK_ICON_SIZE_MENU); state->image_visible = go_gtk_widget_render_icon_pixbuf (widget, "gnumeric-visible", GTK_ICON_SIZE_MENU); state->image_ltr = go_gtk_widget_render_icon_pixbuf (widget, "format-text-direction-ltr", GTK_ICON_SIZE_MENU); state->image_rtl = go_gtk_widget_render_icon_pixbuf (widget, "format-text-direction-rtl", GTK_ICON_SIZE_MENU); /* Listen for changes in the sheet order. */ state->sheet_order_changed_listener = g_signal_connect (G_OBJECT (wb), "sheet_order_changed", G_CALLBACK (cb_sheet_order_changed), state); state->sheet_added_listener = g_signal_connect (G_OBJECT (wb), "sheet_added", G_CALLBACK (cb_sheet_added), state); state->sheet_deleted_listener = g_signal_connect (G_OBJECT (wb), "sheet_deleted", G_CALLBACK (cb_sheet_deleted), state); grid = GTK_GRID (go_gtk_builder_get_widget (gui,"main-grid")); cg = go_color_group_fetch ("back_color_group", wb_control_view (GNM_WBC (wbcg))); icon = go_gtk_widget_render_icon_pixbuf (widget, "gnumeric-bucket", GTK_ICON_SIZE_LARGE_TOOLBAR); state->ccombo_back = go_combo_color_new (icon, _("Default"), 0, cg); g_object_unref (icon); g_object_unref (cg); go_combo_color_set_instant_apply ( GO_COMBO_COLOR (state->ccombo_back), TRUE); gtk_grid_attach (grid, state->ccombo_back, 1, 4, 1, 1); gtk_widget_set_sensitive (state->ccombo_back, FALSE); cg = go_color_group_fetch ("fore_color_group", wb_control_view (GNM_WBC (wbcg))); icon = go_gtk_widget_render_icon_pixbuf (widget, "font", GTK_ICON_SIZE_LARGE_TOOLBAR); state->ccombo_fore = go_combo_color_new (icon, _("Default"), 0, cg); g_object_unref (icon); g_object_unref (cg); go_combo_color_set_instant_apply ( GO_COMBO_COLOR (state->ccombo_fore), TRUE); gtk_grid_attach (grid, state->ccombo_fore, 2, 4, 1, 1); gtk_widget_set_sensitive (state->ccombo_fore, FALSE); create_sheet_list (state); populate_sheet_list (state); #define CONNECT(o,s,c) g_signal_connect(G_OBJECT(o),s,G_CALLBACK(c),state) CONNECT (state->up_btn, "clicked", cb_up); CONNECT (state->down_btn, "clicked", cb_down); CONNECT (state->sort_asc_btn, "clicked", cb_asc); CONNECT (state->sort_desc_btn, "clicked", cb_desc); CONNECT (state->add_btn, "clicked", cb_add_clicked); CONNECT (state->append_btn, "clicked", cb_append_clicked); CONNECT (state->duplicate_btn, "clicked", cb_duplicate_clicked); CONNECT (state->delete_btn, "clicked", cb_delete_clicked); CONNECT (state->apply_names_btn, "clicked", cb_apply_names_clicked); CONNECT (state->cancel_btn, "clicked", cb_cancel_clicked); CONNECT (state->undo_btn, "clicked", cb_undo_clicked); CONNECT (state->advanced_check, "toggled", cb_adv_check_toggled); CONNECT (state->ccombo_back, "color_changed", cb_color_changed_back); CONNECT (state->ccombo_fore, "color_changed", cb_color_changed_fore); CONNECT (state->model, "rows-reordered", cb_dialog_order_changed); state->model_row_insertion_listener = CONNECT (state->model, "row-inserted", cb_dialog_order_changed_by_insertion); #undef CONNECT cb_adv_check_toggled (NULL, state); gnm_init_help_button ( go_gtk_builder_get_widget (state->gui, "help_button"), GNUMERIC_HELP_LINK_SHEET_MANAGER); gtk_widget_set_sensitive (state->undo_btn, wb->undo_commands != NULL); gtk_widget_set_sensitive (state->apply_names_btn, FALSE); /* a candidate for merging into attach guru */ wbc_gtk_attach_guru (state->wbcg, GTK_WIDGET (state->dialog)); g_object_set_data_full (G_OBJECT (state->dialog), "state", state, (GDestroyNotify) cb_sheet_order_destroy); g_signal_connect (G_OBJECT (state->dialog), "destroy", G_CALLBACK (destroy_cb), NULL); gnm_restore_window_geometry (GTK_WINDOW (state->dialog), SHEET_ORDER_KEY); go_gtk_nonmodal_dialog (wbcg_toplevel (state->wbcg), GTK_WINDOW (state->dialog)); gtk_widget_show_all (GTK_WIDGET (state->dialog)); }