33 #include <glib/gprintf.h> 34 #include <gdk/gdkkeysyms.h> 36 #include "gnucash-register.h" 52 #include "pricecell-gnome.h" 53 #include "quickfillcell-gnome.h" 54 #include "table-gnome.h" 71 static QofLogModule log_module = GNC_MOD_REGISTER;
72 static GtkGrid *register_parent_class;
73 static guint register_signals[LAST_SIGNAL];
80 GtkWidget *hscrollbar;
82 gboolean hscrollbar_visible;
88 GtkGridClass parent_class;
90 void (*activate_cursor) (GnucashRegister *reg);
91 void (*redraw_all) (GnucashRegister *reg);
92 void (*redraw_help) (GnucashRegister *reg);
93 void (*show_popup_menu) (GnucashRegister *reg);
101 gnc_register_add_cell_type (COMBO_CELL_TYPE_NAME, gnc_combo_cell_new);
103 gnc_register_add_cell_type (PRICE_CELL_TYPE_NAME,
104 gnc_price_cell_gnome_new);
105 gnc_register_add_cell_type (QUICKFILL_CELL_TYPE_NAME,
106 gnc_quickfill_cell_gnome_new);
107 gnc_register_add_cell_type( FORMULA_CELL_TYPE_NAME,
108 gnc_formula_cell_gnome_new );
109 gnc_table_gnome_init ();
113 gnucash_register_has_selection (GnucashRegister *reg)
118 g_return_val_if_fail((reg != NULL), FALSE);
119 g_return_val_if_fail(GNUCASH_IS_REGISTER(reg), FALSE);
121 sheet = GNUCASH_SHEET(reg->sheet);
122 item_edit = GNC_ITEM_EDIT(sheet->item_editor);
124 return gnc_item_edit_get_has_selection(item_edit);
128 gnucash_register_cut_clipboard (GnucashRegister *reg)
133 g_return_if_fail(reg != NULL);
134 g_return_if_fail(GNUCASH_IS_REGISTER(reg));
136 sheet = GNUCASH_SHEET(reg->sheet);
137 item_edit = GNC_ITEM_EDIT(sheet->item_editor);
139 gnc_item_edit_cut_clipboard(item_edit);
143 gnucash_register_copy_clipboard (GnucashRegister *reg)
148 g_return_if_fail(reg != NULL);
149 g_return_if_fail(GNUCASH_IS_REGISTER(reg));
151 sheet = GNUCASH_SHEET(reg->sheet);
152 item_edit = GNC_ITEM_EDIT(sheet->item_editor);
154 gnc_item_edit_copy_clipboard(item_edit);
158 gnucash_register_paste_clipboard (GnucashRegister *reg)
163 g_return_if_fail(reg != NULL);
164 g_return_if_fail(GNUCASH_IS_REGISTER(reg));
166 sheet = GNUCASH_SHEET(reg->sheet);
167 item_edit = GNC_ITEM_EDIT(sheet->item_editor);
169 gnc_item_edit_paste_clipboard (item_edit);
173 gnucash_register_refresh_from_prefs (GnucashRegister *reg)
177 g_return_if_fail(reg != NULL);
178 g_return_if_fail(GNUCASH_IS_REGISTER(reg));
180 sheet = GNUCASH_SHEET(reg->sheet);
181 gnucash_sheet_refresh_from_prefs(sheet);
182 gnc_header_request_redraw (GNC_HEADER(sheet->header_item));
186 gnucash_register_reset_sheet_layout (GnucashRegister *reg)
188 GNCHeaderWidths widths;
192 g_return_if_fail (reg != NULL);
194 sheet = GNUCASH_SHEET(reg->sheet);
196 g_return_if_fail (sheet != NULL);
197 g_return_if_fail (GNUCASH_IS_SHEET (sheet));
199 current_width = sheet->window_width - 1;
201 widths = gnc_header_widths_new ();
202 gnucash_sheet_set_header_widths (sheet, widths);
204 gnucash_sheet_styles_set_dimensions (sheet, current_width);
206 gnucash_sheet_compile_styles (sheet);
207 gnucash_sheet_table_load (sheet, TRUE);
208 gnucash_sheet_cursor_set_from_table (sheet, TRUE);
209 gnucash_sheet_redraw_all (sheet);
210 gnc_header_widths_destroy (widths);
214 gnucash_register_goto_virt_cell (GnucashRegister *reg,
215 VirtualCellLocation vcell_loc)
218 VirtualLocation virt_loc;
220 g_return_if_fail(reg != NULL);
221 g_return_if_fail(GNUCASH_IS_REGISTER(reg));
223 sheet = GNUCASH_SHEET(reg->sheet);
225 virt_loc.vcell_loc = vcell_loc;
226 virt_loc.phys_row_offset = 0;
227 virt_loc.phys_col_offset = 0;
229 gnucash_sheet_goto_virt_loc(sheet, virt_loc);
233 gnucash_register_goto_virt_loc (GnucashRegister *reg,
234 VirtualLocation virt_loc)
238 g_return_if_fail(reg != NULL);
239 g_return_if_fail(GNUCASH_IS_REGISTER(reg));
241 sheet = GNUCASH_SHEET(reg->sheet);
243 gnucash_sheet_goto_virt_loc(sheet, virt_loc);
247 gnucash_register_goto_next_virt_row (GnucashRegister *reg)
250 VirtualLocation virt_loc;
253 g_return_if_fail (reg != NULL);
254 g_return_if_fail (GNUCASH_IS_REGISTER(reg));
256 sheet = GNUCASH_SHEET(reg->sheet);
258 gnucash_cursor_get_virt (GNUCASH_CURSOR(sheet->cursor), &virt_loc);
262 start_virt_row = virt_loc.vcell_loc.virt_row;
268 while (start_virt_row == virt_loc.vcell_loc.virt_row);
270 if (virt_loc.vcell_loc.virt_row >= sheet->num_virt_rows)
273 virt_loc.phys_row_offset = 0;
274 virt_loc.phys_col_offset = 0;
276 gnucash_sheet_goto_virt_loc (sheet, virt_loc);
280 gnucash_register_goto_next_matching_row (GnucashRegister *reg,
281 VirtualLocationMatchFunc match,
285 SheetBlockStyle *style;
286 VirtualLocation virt_loc;
288 g_return_if_fail (reg != NULL);
289 g_return_if_fail (GNUCASH_IS_REGISTER(reg));
290 g_return_if_fail (match != NULL);
292 sheet = GNUCASH_SHEET (reg->sheet);
294 gnucash_cursor_get_virt (GNUCASH_CURSOR(sheet->cursor), &virt_loc);
302 if (virt_loc.vcell_loc.virt_row >= sheet->num_virt_rows)
305 style = gnucash_sheet_get_style (sheet, virt_loc.vcell_loc);
306 if (!style || !style->cursor)
309 while (!match (virt_loc, user_data));
311 virt_loc.phys_row_offset = 0;
312 virt_loc.phys_col_offset = 0;
314 gnucash_sheet_goto_virt_loc (sheet, virt_loc);
318 gnucash_register_sheet_resize (GnucashRegister *reg)
322 if (!reg->hscrollbar_visible)
323 gtk_widget_queue_resize (GTK_WIDGET (reg->sheet));
329 gnucash_register_update_hadjustment (GtkAdjustment *adj,
330 GnucashRegister *reg)
332 g_return_if_fail (reg != NULL);
333 g_return_if_fail (GNUCASH_IS_REGISTER(reg));
335 if (gtk_adjustment_get_upper (adj) - gtk_adjustment_get_lower (adj)
336 > gtk_adjustment_get_page_size (adj))
338 if (!reg->hscrollbar_visible)
340 gtk_widget_show(reg->hscrollbar);
341 reg->hscrollbar_visible = TRUE;
346 if (reg->hscrollbar_visible)
348 gtk_widget_hide(reg->hscrollbar);
349 reg->hscrollbar_visible = FALSE;
353 g_idle_add ((GSourceFunc) gnucash_register_sheet_resize, reg);
362 gnucash_register_class_init (GnucashRegisterClass *klass)
364 GObjectClass *gobject_class;
366 gobject_class = G_OBJECT_CLASS (klass);
368 gtk_widget_class_set_css_name (GTK_WIDGET_CLASS(klass),
"gnc-id-register");
370 register_parent_class = g_type_class_peek_parent (klass);
372 register_signals[ACTIVATE_CURSOR] =
373 g_signal_new(
"activate_cursor",
374 G_TYPE_FROM_CLASS(gobject_class),
376 G_STRUCT_OFFSET(GnucashRegisterClass,
379 g_cclosure_marshal_VOID__VOID,
382 register_signals[REDRAW_ALL] =
383 g_signal_new(
"redraw_all",
384 G_TYPE_FROM_CLASS(gobject_class),
386 G_STRUCT_OFFSET(GnucashRegisterClass,
389 g_cclosure_marshal_VOID__VOID,
392 register_signals[REDRAW_HELP] =
393 g_signal_new(
"redraw_help",
394 G_TYPE_FROM_CLASS(gobject_class),
396 G_STRUCT_OFFSET(GnucashRegisterClass,
399 g_cclosure_marshal_VOID__VOID,
402 register_signals[SHOW_POPUP_MENU] =
403 g_signal_new(
"show_popup_menu",
404 G_TYPE_FROM_CLASS(gobject_class),
406 G_STRUCT_OFFSET(GnucashRegisterClass,
409 g_cclosure_marshal_VOID__VOID,
412 klass->activate_cursor = NULL;
413 klass->redraw_all = NULL;
414 klass->redraw_help = NULL;
415 klass->show_popup_menu = NULL;
420 gnucash_register_init (GnucashRegister *g_reg)
422 GtkGrid *
table = GTK_GRID(g_reg);
424 gtk_widget_set_can_focus (GTK_WIDGET(
table), FALSE);
425 gtk_widget_set_can_default (GTK_WIDGET(
table), FALSE);
427 gtk_grid_set_row_homogeneous (GTK_GRID(
table), FALSE);
428 gtk_grid_set_column_homogeneous (GTK_GRID(
table), FALSE);
433 gnucash_register_get_type (
void)
435 static GType gnucash_register_type = 0;
437 if (!gnucash_register_type)
439 static const GTypeInfo gnucash_register_info =
441 sizeof (GnucashRegisterClass),
444 (GClassInitFunc) gnucash_register_class_init,
447 sizeof (GnucashRegister),
449 (GInstanceInitFunc) gnucash_register_init,
452 gnucash_register_type = g_type_register_static
453 (gtk_grid_get_type (),
455 &gnucash_register_info, 0);
458 return gnucash_register_type;
463 gnucash_register_attach_popup (GnucashRegister *reg,
467 g_return_if_fail (GNUCASH_IS_REGISTER(reg));
468 g_return_if_fail (reg->sheet != NULL);
470 g_return_if_fail (GTK_IS_WIDGET(popup));
472 gnucash_sheet_set_popup (GNUCASH_SHEET (reg->sheet), popup, data);
485 gnucash_register_configure (GnucashSheet *sheet,
const gchar * state_section)
487 GNCHeaderWidths widths;
495 g_return_if_fail (sheet != NULL);
496 g_return_if_fail (GNUCASH_IS_SHEET (sheet));
498 PINFO(
"state_section=%s",state_section);
500 ENTER(
"sheet=%p, data=%p", sheet,
"");
502 table = sheet->table;
504 table->ui_data = sheet;
506 g_object_ref (sheet);
510 widths = gnc_header_widths_new ();
512 if (state_section &&
gnc_prefs_get_bool(GNC_PREFS_GROUP_GENERAL, GNC_PREF_SAVE_GEOMETRY))
514 node = gnc_table_layout_get_cells (
table->layout);
515 for (; node; node = node->next)
517 BasicCell *cell = node->data;
519 if (cell->expandable)
523 key = g_strdup_printf(
"%s_width", cell->cell_name);
524 value = g_key_file_get_integer (state_file, state_section, key, NULL);
526 gnc_header_widths_set_width (widths, cell->cell_name, value);
531 gnucash_sheet_create_styles (sheet);
533 gnucash_sheet_set_header_widths (sheet, widths);
535 gnucash_sheet_compile_styles (sheet);
537 gnucash_sheet_table_load (sheet, TRUE);
538 gnucash_sheet_cursor_set_from_table (sheet, TRUE);
539 gnucash_sheet_redraw_all (sheet);
541 gnc_header_widths_destroy (widths);
548 gnucash_register_create_widget (Table *
table)
550 GnucashRegister *reg;
554 GtkWidget *scrollbar;
557 reg = g_object_new (GNUCASH_TYPE_REGISTER, NULL);
558 widget = GTK_WIDGET(reg);
560 sheet = gnucash_sheet_new (
table);
562 GNUCASH_SHEET(sheet)->reg = widget;
564 header = gnc_header_new (GNUCASH_SHEET(sheet));
566 gtk_grid_attach (GTK_GRID(widget), header, 0, 0, 1, 1);
567 gtk_widget_set_hexpand (header, TRUE);
568 gtk_widget_set_halign (header, GTK_ALIGN_FILL);
569 gtk_widget_set_vexpand (header, FALSE);
570 gtk_widget_set_valign (header, GTK_ALIGN_FILL);
571 g_object_set (header,
"margin", 0, NULL);
572 gtk_widget_show (header);
574 gtk_grid_attach (GTK_GRID(widget), sheet, 0, 1, 1, 1);
575 gtk_widget_set_hexpand (sheet, TRUE);
576 gtk_widget_set_halign (sheet, GTK_ALIGN_FILL);
577 gtk_widget_set_vexpand (sheet, TRUE);
578 gtk_widget_set_valign (sheet, GTK_ALIGN_FILL);
579 g_object_set (sheet,
"margin", 0, NULL);
580 gtk_widget_show (sheet);
582 scrollbar = gtk_scrollbar_new (GTK_ORIENTATION_VERTICAL, GNUCASH_SHEET(sheet)->vadj);
583 gtk_grid_attach (GTK_GRID(widget), GTK_WIDGET(scrollbar), 1, 0, 1, 2);
584 gtk_widget_set_hexpand (GTK_WIDGET(scrollbar), FALSE);
585 gtk_widget_set_halign (GTK_WIDGET(scrollbar), GTK_ALIGN_FILL);
586 gtk_widget_set_vexpand (GTK_WIDGET(scrollbar), TRUE);
587 gtk_widget_set_valign (GTK_WIDGET(scrollbar), GTK_ALIGN_FILL);
588 g_object_set (GTK_WIDGET(scrollbar),
"margin", 0, NULL);
589 gtk_widget_show (scrollbar);
590 GNUCASH_SHEET(sheet)->vscrollbar = scrollbar;
592 scrollbar = gtk_scrollbar_new (GTK_ORIENTATION_HORIZONTAL, GNUCASH_SHEET(sheet)->hadj);
593 gtk_grid_attach (GTK_GRID(widget), GTK_WIDGET(scrollbar), 0, 2, 1, 1);
594 gtk_widget_set_hexpand (GTK_WIDGET(scrollbar), TRUE);
595 gtk_widget_set_halign (GTK_WIDGET(scrollbar), GTK_ALIGN_FILL);
596 gtk_widget_set_vexpand (GTK_WIDGET(scrollbar), FALSE);
597 gtk_widget_set_valign (GTK_WIDGET(scrollbar), GTK_ALIGN_FILL);
598 g_object_set (GTK_WIDGET(scrollbar),
"margin", 0, NULL);
599 reg->hscrollbar = scrollbar;
600 gtk_widget_show (reg->hscrollbar);
601 reg->hscrollbar_visible = TRUE;
602 GNUCASH_SHEET(sheet)->hscrollbar = scrollbar;
604 g_signal_connect (GNUCASH_SHEET(sheet)->hadj,
"changed",
605 G_CALLBACK (gnucash_register_update_hadjustment), reg);
614 GnucashRegister *reg;
617 widget = gnucash_register_create_widget(
table);
618 reg = GNUCASH_REGISTER(widget);
620 gnucash_register_configure (GNUCASH_SHEET(reg->sheet), state_section);
626 void gnucash_register_set_moved_cb (GnucashRegister *reg,
627 GFunc cb, gpointer cb_data)
631 if (!reg || !reg->sheet)
633 sheet = GNUCASH_SHEET(reg->sheet);
634 sheet->moved_cb = cb;
635 sheet->moved_cb_data = cb_data;
639 GnucashSheet *gnucash_register_get_sheet (GnucashRegister *reg)
641 g_return_val_if_fail (reg != NULL, NULL);
642 g_return_val_if_fail (GNUCASH_IS_REGISTER(reg), NULL);
644 return GNUCASH_SHEET(reg->sheet);
649 gnucash_register_set_open_doclink_cb (GnucashRegister *reg,
650 GFunc cb, gpointer cb_data)
654 if (!reg || !reg->sheet)
656 sheet = GNUCASH_SHEET(reg->sheet);
657 sheet->open_doclink_cb = cb;
658 sheet->open_doclink_cb_data = cb_data;
Functions to load, save and get gui state.
#define PINFO(format, args...)
Print an informational note.
GtkWidget * gnucash_register_new(Table *table, const gchar *state_section)
this already has scrollbars attached
#define ENTER(format, args...)
Print a function entry debugging message.
GKeyFile * gnc_state_get_current(void)
Returns a pointer to the most recently loaded state.
void gnc_table_init_gui(Table *table)
UI-specific functions.
Public declarations for GnucashCursor class.
BasicCell * gnc_date_cell_new(void)
installs a callback to handle date recording
Public declarations of GnucashRegister class.
Private declarations for GnucashSheet class.
gboolean gnc_table_move_vertical_position(Table *table, VirtualLocation *virt_loc, int phys_row_offset)
Moves away from virtual location virt_loc by phys_row_offset physical rows.
All type declarations for the whole Gnucash engine.
API for checkbook register display area.
Generic api to store and retrieve preferences.
Public declarations for GncItemEdit class.
gboolean gnc_prefs_get_bool(const gchar *group, const gchar *pref_name)
Get a boolean value from the preferences backend.
#define LEAVE(format, args...)
Print a function exit debugging message.
Styling functions for RegisterGnome.
void gnucash_register_add_cell_types(void)
Implementation.