26 #include <glib/gi18n.h>
29 #include "swig-runtime.h"
31 #include "dialog-report-column-view.h"
32 #include "dialog-options.h"
33 #include "dialog-utils.h"
34 #include "option-util.h"
35 #include "window-report.h"
36 #include "guile-mappings.h"
37 #include "gnc-guile-utils.h"
38 #include "gnc-report.h"
42 AVAILABLE_COL_NAME = 0,
49 CONTENTS_COL_NAME = 0,
51 CONTENTS_COL_REPORT_ROWS,
52 CONTENTS_COL_REPORT_COLS,
59 GtkTreeView * available;
60 GtkTreeView * contents;
67 int available_selected;
70 int contents_selected;
73 void gnc_column_view_edit_add_cb(GtkButton * button, gpointer user_data);
74 void gnc_column_view_edit_remove_cb(GtkButton * button, gpointer user_data);
75 void gnc_edit_column_view_move_up_cb(GtkButton * button, gpointer user_data);
76 void gnc_edit_column_view_move_down_cb(GtkButton * button, gpointer user_data);
77 void gnc_column_view_edit_size_cb(GtkButton * button, gpointer user_data);
80 gnc_column_view_set_option(
GNCOptionDB * odb,
char * section,
char * name,
84 gnc_option_db_get_option_by_name(odb, section, name);
88 gnc_option_db_set_option(odb, section, name, new_value);
91 gnc_option_set_changed (option, TRUE);
98 gnc_options_dialog_destroy(view->optwin);
99 scm_gc_unprotect_object(view->options);
100 scm_gc_unprotect_object(view->view);
101 gnc_option_db_destroy(view->odb);
108 SCM get_rpt_guids = scm_c_eval_string(
"gnc:all-report-template-guids");
109 SCM template_menu_name = scm_c_eval_string(
"gnc:report-template-menu-name/report-guid");
110 SCM report_menu_name = scm_c_eval_string(
"gnc:report-menu-name");
111 SCM rpt_guids = scm_call_0(get_rpt_guids);
113 gnc_option_db_lookup_option(view->odb,
"__general",
"report-list",
122 GtkTreeSelection *tree_selection;
126 row = view->available_selected;
128 if (scm_is_list(view->available_list) && !scm_is_null (view->available_list))
130 row = MIN (row, scm_ilength (view->available_list) - 1);
131 selection = scm_list_ref (view->available_list, scm_from_int (row));
135 selection = SCM_UNDEFINED;
138 scm_gc_unprotect_object(view->available_list);
139 view->available_list = rpt_guids;
140 scm_gc_protect_object(view->available_list);
142 store = GTK_LIST_STORE(gtk_tree_view_get_model(view->available));
143 gtk_list_store_clear(store);
145 if (scm_is_list(rpt_guids))
147 for (i = 0; !scm_is_null(rpt_guids); rpt_guids = SCM_CDR(rpt_guids), i++)
149 if (scm_is_equal (SCM_CAR(rpt_guids), selection))
151 name = gnc_scm_to_utf8_string (scm_call_2(template_menu_name, SCM_CAR(rpt_guids),
154 gtk_list_store_append(store, &iter);
155 gtk_list_store_set(store, &iter,
156 AVAILABLE_COL_NAME, _(name),
157 AVAILABLE_COL_ROW, i,
164 tree_selection = gtk_tree_view_get_selection(view->available);
165 path = gtk_tree_path_new_from_indices(row, -1);
166 gtk_tree_selection_select_path(tree_selection, path);
167 gtk_tree_path_free(path);
171 row = view->contents_selected;
173 if (scm_is_list(view->contents_list) && !scm_is_null (view->contents_list))
175 row = MIN (row, scm_ilength (view->contents_list) - 1);
176 selection = scm_list_ref (view->contents_list, scm_from_int (row));
180 selection = SCM_UNDEFINED;
183 scm_gc_unprotect_object(view->contents_list);
184 view->contents_list = contents;
185 scm_gc_protect_object(view->contents_list);
187 store = GTK_LIST_STORE(gtk_tree_view_get_model(view->contents));
188 gtk_list_store_clear(store);
189 if (scm_is_list(contents))
191 for (i = 0; !scm_is_null(contents); contents = SCM_CDR(contents), i++)
193 if (scm_is_equal (SCM_CAR(contents), selection))
196 id = scm_to_int(SCM_CAAR(contents));
197 this_report = gnc_report_find(
id);
198 name = gnc_scm_to_utf8_string (scm_call_1(report_menu_name, this_report));
200 gtk_list_store_append(store, &iter);
203 CONTENTS_COL_NAME, _(name),
205 CONTENTS_COL_REPORT_COLS, scm_to_int(SCM_CADR(SCM_CAR(contents))),
206 CONTENTS_COL_REPORT_ROWS, scm_to_int(SCM_CADDR(SCM_CAR(contents))),
212 tree_selection = gtk_tree_view_get_selection(view->contents);
213 path = gtk_tree_path_new_from_indices(row, -1);
214 gtk_tree_selection_select_path(tree_selection, path);
216 gtk_tree_path_free(path);
220 gnc_column_view_select_avail_cb(GtkTreeSelection *selection,
226 if (gtk_tree_selection_get_selected(selection, &model, &iter))
227 gtk_tree_model_get(model, &iter,
228 AVAILABLE_COL_ROW, &r->available_selected,
233 gnc_column_view_select_contents_cb(GtkTreeSelection *selection,
239 if (gtk_tree_selection_get_selected(selection, &model, &iter))
240 gtk_tree_model_get(model, &iter,
241 AVAILABLE_COL_ROW, &r->contents_selected,
246 gnc_column_view_edit_apply_cb(
GNCOptionWin * w, gpointer user_data)
248 SCM dirty_report = scm_c_eval_string(
"gnc:report-set-dirty?!");
252 gnc_option_db_commit(win->odb);
253 scm_call_2(dirty_report, win->view, SCM_BOOL_T);
257 gnc_column_view_edit_close_cb(
GNCOptionWin * win, gpointer user_data)
260 SCM set_editor = scm_c_eval_string(
"gnc:report-set-editor-widget!");
262 scm_call_2(set_editor, r->view, SCM_BOOL_F);
263 gnc_column_view_edit_destroy(r);
273 gnc_column_view_edit_options(SCM options, SCM view)
275 SCM get_editor = scm_c_eval_string(
"gnc:report-editor-widget");
279 GtkCellRenderer *renderer;
280 GtkTreeViewColumn *column;
281 GtkTreeSelection *selection;
283 ptr = scm_call_1(get_editor, view);
284 if (ptr != SCM_BOOL_F)
286 #define FUNC_NAME "gtk_window_present"
287 GtkWindow * w = SWIG_MustGetPtr(ptr, SWIG_TypeQuery(
"_p_GtkWidget"), 1, 0);
288 gtk_window_present(w);
297 r->optwin = gnc_options_dialog_new(NULL);
300 gtk_widget_hide(gnc_options_page_list(r->optwin));
302 builder = gtk_builder_new();
303 gnc_builder_add_from_file (builder,
"dialog-report.glade",
"view_contents_table");
305 editor = GTK_WIDGET(gtk_builder_get_object (builder,
"view_contents_table"));
306 r->available = GTK_TREE_VIEW (gtk_builder_get_object (builder,
"available_view"));
307 r->contents = GTK_TREE_VIEW (gtk_builder_get_object (builder,
"contents_view"));
308 r->options = options;
310 r->available_selected = 0;
311 r->available_list = SCM_EOL;
312 r->contents_selected = 0;
313 r->contents_list = SCM_EOL;
314 r->odb = gnc_option_db_new(r->options);
316 gnc_options_dialog_build_contents(r->optwin, r->odb);
318 gtk_notebook_append_page(GTK_NOTEBOOK(gnc_options_dialog_notebook
321 gtk_label_new(_(
"Contents")));
323 scm_gc_protect_object(r->options);
324 scm_gc_protect_object(r->view);
325 scm_gc_protect_object(r->available_list);
326 scm_gc_protect_object(r->contents_list);
329 store = gtk_list_store_new (NUM_AVAILABLE_COLS, G_TYPE_STRING, G_TYPE_INT);
330 gtk_tree_view_set_model(r->available, GTK_TREE_MODEL(store));
331 gtk_tree_sortable_set_sort_column_id(GTK_TREE_SORTABLE(store), AVAILABLE_COL_NAME, GTK_SORT_ASCENDING);
332 g_object_unref(store);
334 renderer = gtk_cell_renderer_text_new();
335 column = gtk_tree_view_column_new_with_attributes(
"", renderer,
336 "text", AVAILABLE_COL_NAME,
338 gtk_tree_view_append_column(r->available, column);
340 selection = gtk_tree_view_get_selection(r->available);
341 g_signal_connect(selection,
"changed",
342 G_CALLBACK(gnc_column_view_select_avail_cb), r);
345 store = gtk_list_store_new (NUM_CONTENTS_COLS, G_TYPE_STRING, G_TYPE_INT,
346 G_TYPE_INT, G_TYPE_INT);
347 gtk_tree_view_set_model(r->contents, GTK_TREE_MODEL(store));
348 g_object_unref(store);
350 renderer = gtk_cell_renderer_text_new();
351 column = gtk_tree_view_column_new_with_attributes(_(
"Report"), renderer,
352 "text", CONTENTS_COL_NAME,
354 gtk_tree_view_append_column(r->contents, column);
356 renderer = gtk_cell_renderer_text_new();
357 column = gtk_tree_view_column_new_with_attributes(_(
"Rows"), renderer,
358 "text", CONTENTS_COL_REPORT_ROWS,
360 gtk_tree_view_append_column(r->contents, column);
362 renderer = gtk_cell_renderer_text_new();
363 column = gtk_tree_view_column_new_with_attributes(_(
"Cols"), renderer,
364 "text", CONTENTS_COL_REPORT_COLS,
366 gtk_tree_view_append_column(r->contents, column);
368 selection = gtk_tree_view_get_selection(r->contents);
369 g_signal_connect(selection,
"changed",
370 G_CALLBACK(gnc_column_view_select_contents_cb), r);
372 update_display_lists(r);
374 gnc_options_dialog_set_apply_cb(r->optwin,
375 gnc_column_view_edit_apply_cb, r);
376 gnc_options_dialog_set_close_cb(r->optwin,
377 gnc_column_view_edit_close_cb, r);
379 gtk_widget_show(gnc_options_dialog_widget(r->optwin));
381 gtk_builder_connect_signals_full (builder, gnc_builder_connect_full_func, r);
383 g_object_unref(G_OBJECT(builder));
385 return gnc_options_dialog_widget(r->optwin);
390 gnc_column_view_edit_add_cb(GtkButton * button, gpointer user_data)
393 SCM make_report = scm_c_eval_string(
"gnc:make-report");
394 SCM mark_report = scm_c_eval_string(
"gnc:report-set-needs-save?!");
397 SCM newlist = SCM_EOL;
398 SCM oldlist = r->contents_list;
402 if (scm_is_list(r->available_list) &&
403 (scm_ilength(r->available_list) > r->available_selected))
405 template_name = scm_list_ref(r->available_list,
406 scm_from_int (r->available_selected));
407 new_report = scm_call_1(make_report, template_name);
408 id = scm_to_int(new_report);
409 scm_call_2(mark_report, gnc_report_find(
id), SCM_BOOL_T);
410 oldlength = scm_ilength(r->contents_list);
412 if (oldlength > r->contents_selected)
414 for (count = 0; count < r->contents_selected; count++)
416 newlist = scm_cons(SCM_CAR(oldlist), newlist);
417 oldlist = SCM_CDR(oldlist);
420 (scm_listify(scm_reverse(scm_cons(SCM_LIST4(new_report,
431 (scm_listify(oldlist,
432 SCM_LIST1(SCM_LIST4(new_report,
437 r->contents_selected = oldlength;
440 scm_gc_unprotect_object(r->contents_list);
441 r->contents_list = newlist;
442 scm_gc_protect_object(r->contents_list);
444 gnc_column_view_set_option(r->odb,
"__general",
"report-list",
446 gnc_options_dialog_changed (r->optwin);
449 update_display_lists(r);
453 gnc_column_view_edit_remove_cb(GtkButton * button, gpointer user_data)
456 SCM newlist = SCM_EOL;
457 SCM oldlist = r->contents_list;
461 if (scm_is_list(r->contents_list))
463 oldlength = scm_ilength(r->contents_list);
464 if (oldlength > r->contents_selected)
466 for (count = 0; count < r->contents_selected; count++)
468 newlist = scm_cons(SCM_CAR(oldlist), newlist);
469 oldlist = SCM_CDR(oldlist);
471 if (count <= oldlength)
473 newlist = scm_append(scm_listify(scm_reverse(newlist), SCM_CDR(oldlist), SCM_UNDEFINED));
477 if (r->contents_selected > 0 && oldlength == r->contents_selected + 1)
479 r->contents_selected --;
482 scm_gc_unprotect_object(r->contents_list);
483 r->contents_list = newlist;
484 scm_gc_protect_object(r->contents_list);
486 gnc_column_view_set_option(r->odb,
"__general",
"report-list",
489 gnc_options_dialog_changed (r->optwin);
492 update_display_lists(r);
496 gnc_edit_column_view_move_up_cb(GtkButton * button, gpointer user_data)
499 SCM oldlist = r->contents_list;
500 SCM newlist = SCM_EOL;
505 oldlength = scm_ilength(r->contents_list);
506 if ((r->contents_selected > 0) && (oldlength > r->contents_selected))
508 for (count = 1; count < r->contents_selected; count++)
510 newlist = scm_cons(SCM_CAR(oldlist), newlist);
511 oldlist = SCM_CDR(oldlist);
513 temp = SCM_CAR(oldlist);
514 oldlist = SCM_CDR(oldlist);
515 newlist = scm_cons(temp, scm_cons(SCM_CAR(oldlist), newlist));
516 newlist = scm_append(scm_listify(scm_reverse(newlist), SCM_CDR(oldlist), SCM_UNDEFINED));
518 scm_gc_unprotect_object(r->contents_list);
519 r->contents_list = newlist;
520 scm_gc_protect_object(r->contents_list);
522 r->contents_selected = r->contents_selected - 1;
524 gnc_column_view_set_option(r->odb,
"__general",
"report-list",
527 gnc_options_dialog_changed (r->optwin);
529 update_display_lists(r);
534 gnc_edit_column_view_move_down_cb(GtkButton * button, gpointer user_data)
537 SCM oldlist = r->contents_list;
538 SCM newlist = SCM_EOL;
543 oldlength = scm_ilength(r->contents_list);
544 if (oldlength > (r->contents_selected + 1))
546 for (count = 0; count < r->contents_selected; count++)
548 newlist = scm_cons(SCM_CAR(oldlist), newlist);
549 oldlist = SCM_CDR(oldlist);
551 temp = SCM_CAR(oldlist);
552 oldlist = SCM_CDR(oldlist);
553 newlist = scm_cons(temp, scm_cons(SCM_CAR(oldlist), newlist));
554 newlist = scm_append(scm_listify(scm_reverse(newlist), SCM_CDR(oldlist), SCM_UNDEFINED));
556 scm_gc_unprotect_object(r->contents_list);
557 r->contents_list = newlist;
558 scm_gc_protect_object(r->contents_list);
560 r->contents_selected = r->contents_selected + 1;
562 gnc_column_view_set_option(r->odb,
"__general",
"report-list",
565 gnc_options_dialog_changed (r->optwin);
567 update_display_lists(r);
572 gnc_column_view_edit_size_cb(GtkButton * button, gpointer user_data)
583 builder = gtk_builder_new();
584 gnc_builder_add_from_file (builder,
"dialog-report.glade",
"col_adjustment");
585 gnc_builder_add_from_file (builder,
"dialog-report.glade",
"row_adjustment");
586 gnc_builder_add_from_file (builder,
"dialog-report.glade",
"Edit Report Size");
587 dlg = GTK_WIDGET(gtk_builder_get_object (builder,
"Edit Report Size"));
590 rowspin = GTK_WIDGET(gtk_builder_get_object (builder,
"row_spin"));
591 colspin = GTK_WIDGET(gtk_builder_get_object (builder,
"col_spin"));
593 length = scm_ilength(r->contents_list);
594 if (length > r->contents_selected)
596 current = scm_list_ref(r->contents_list,
597 scm_from_int (r->contents_selected));
598 gtk_spin_button_set_value(GTK_SPIN_BUTTON(colspin),
599 (
float)scm_to_int(SCM_CADR(current)));
600 gtk_spin_button_set_value(GTK_SPIN_BUTTON(rowspin),
601 (
float)scm_to_int(SCM_CADDR(current)));
603 dlg_ret = gtk_dialog_run(GTK_DIALOG(dlg));
604 gtk_widget_hide(dlg);
606 if (dlg_ret == GTK_RESPONSE_OK)
608 current = SCM_LIST4(SCM_CAR(current),
609 scm_from_int (gtk_spin_button_get_value_as_int
610 (GTK_SPIN_BUTTON(colspin))),
611 scm_from_int (gtk_spin_button_get_value_as_int
612 (GTK_SPIN_BUTTON(rowspin))),
614 scm_gc_unprotect_object(r->contents_list);
615 r->contents_list = scm_list_set_x(r->contents_list,
616 scm_from_int (r->contents_selected),
618 scm_gc_protect_object(r->contents_list);
619 gnc_options_dialog_changed (r->optwin);
620 update_display_lists(r);
623 g_object_unref(G_OBJECT(builder));
625 gtk_widget_destroy(dlg);