33 #include <glib/gprintf.h>
34 #include <gdk/gdkkeysyms.h>
35 #include <libgnomecanvas/libgnomecanvas.h>
37 #include "gnucash-sheet.h"
38 #include "gnucash-sheetP.h"
40 #include "dialog-utils.h"
42 #include "gnucash-color.h"
43 #include "gnucash-grid.h"
44 #include "gnucash-cursor.h"
45 #include "gnucash-style.h"
46 #include "gnucash-header.h"
47 #include "gnucash-item-edit.h"
52 # include <gdk/gdkwin32.h>
55 #define DEFAULT_REGISTER_HEIGHT 400
56 #define DEFAULT_REGISTER_WIDTH 400
58 #define DEFAULT_REGISTER_INITIAL_ROWS 10
75 static GnomeCanvasClass *sheet_parent_class;
76 static GtkTableClass *register_parent_class;
77 static guint register_signals[LAST_SIGNAL];
82 static void gnucash_sheet_start_editing_at_cursor (
GnucashSheet *sheet);
84 static gboolean gnucash_sheet_cursor_move (
GnucashSheet *sheet,
87 static void gnucash_sheet_deactivate_cursor_cell (
GnucashSheet *sheet);
88 static void gnucash_sheet_activate_cursor_cell (
GnucashSheet *sheet,
89 gboolean changed_cells);
90 static void gnucash_sheet_stop_editing (
GnucashSheet *sheet);
91 static void gnucash_sheet_im_context_reset (
GnucashSheet *sheet);
92 static void gnucash_sheet_commit_cb (GtkIMContext *context,
const gchar *str,
94 static void gnucash_sheet_preedit_changed_cb (GtkIMContext *context,
96 static gboolean gnucash_sheet_retrieve_surrounding_cb (GtkIMContext *context,
98 static gboolean gnucash_sheet_delete_surrounding_cb (GtkIMContext *context,
102 static gboolean gnucash_sheet_check_direct_update_cell(
GnucashSheet *sheet,
107 G_INLINE_FUNC gboolean
108 gnucash_sheet_virt_cell_out_of_bounds (
GnucashSheet *sheet,
111 gnucash_sheet_virt_cell_out_of_bounds (
GnucashSheet *sheet,
114 return (vcell_loc.virt_row < 1 ||
115 vcell_loc.virt_row >= sheet->num_virt_rows ||
116 vcell_loc.virt_col < 0 ||
117 vcell_loc.virt_col >= sheet->num_virt_cols);
126 valid = !gnucash_sheet_virt_cell_out_of_bounds (sheet,
131 style = gnucash_sheet_get_style (sheet, virt_loc.vcell_loc);
133 valid = (virt_loc.phys_row_offset >= 0 &&
134 virt_loc.phys_row_offset < style->nrows &&
135 virt_loc.phys_col_offset >= 0 &&
136 virt_loc.phys_col_offset < style->ncols);
146 g_return_if_fail (sheet != NULL);
147 g_return_if_fail (GNUCASH_IS_SHEET (sheet));
149 g_return_if_fail (virt_loc.vcell_loc.virt_row >= 0 ||
150 virt_loc.vcell_loc.virt_row <= sheet->num_virt_rows);
151 g_return_if_fail (virt_loc.vcell_loc.virt_col >= 0 ||
152 virt_loc.vcell_loc.virt_col <= sheet->num_virt_cols);
154 gnucash_cursor_set (GNUCASH_CURSOR(sheet->cursor), virt_loc);
158 gnucash_sheet_cursor_set_from_table (
GnucashSheet *sheet, gboolean do_scroll)
163 g_return_if_fail (sheet != NULL);
164 g_return_if_fail (GNUCASH_IS_SHEET(sheet));
166 table = sheet->table;
167 v_loc = table->current_cursor_loc;
169 g_return_if_fail (gnucash_sheet_cell_valid (sheet, v_loc));
171 gnucash_sheet_cursor_set (sheet, v_loc);
174 gnucash_sheet_make_cell_visible (sheet, v_loc);
179 gnucash_sheet_set_popup (
GnucashSheet *sheet, GtkWidget *popup, gpointer data)
182 g_object_ref (popup);
185 g_object_unref (sheet->popup);
187 sheet->popup = popup;
188 sheet->popup_data = data;
195 if (sheet->item_editor == NULL)
198 gnome_canvas_item_hide (GNOME_CANVAS_ITEM (sheet->item_editor));
199 gnc_item_edit_hide_popup (GNC_ITEM_EDIT(sheet->item_editor));
207 gnucash_sheet_im_context_reset(sheet);
209 if (sheet->insert_signal != 0)
210 g_signal_handler_disconnect (G_OBJECT(sheet->entry),
211 sheet->insert_signal);
212 if (sheet->delete_signal != 0)
213 g_signal_handler_disconnect (G_OBJECT(sheet->entry),
214 sheet->delete_signal);
215 if (sheet->commit_signal != 0)
216 g_signal_handler_disconnect (G_OBJECT(sheet->im_context),
217 sheet->commit_signal);
218 if (sheet->preedit_changed_signal != 0)
219 g_signal_handler_disconnect (G_OBJECT(sheet->im_context),
220 sheet->preedit_changed_signal);
221 if (sheet->retrieve_surrounding_signal != 0)
222 g_signal_handler_disconnect (G_OBJECT(sheet->im_context),
223 sheet->retrieve_surrounding_signal);
224 if (sheet->delete_surrounding_signal != 0)
225 g_signal_handler_disconnect (G_OBJECT(sheet->im_context),
226 sheet->delete_surrounding_signal);
227 sheet->insert_signal = 0;
228 sheet->delete_signal = 0;
229 sheet->commit_signal = 0;
230 sheet->preedit_changed_signal = 0;
231 sheet->retrieve_surrounding_signal = 0;
232 sheet->delete_surrounding_signal = 0;
233 sheet->direct_update_cell = FALSE;
235 gnucash_sheet_hide_editing_cursor (sheet);
237 sheet->editing = FALSE;
238 sheet->input_cancelled = FALSE;
243 gnucash_sheet_deactivate_cursor_cell (
GnucashSheet *sheet)
247 gnucash_cursor_get_virt (GNUCASH_CURSOR(sheet->cursor), &virt_loc);
249 gnucash_sheet_stop_editing (sheet);
251 if (!gnc_table_model_read_only (sheet->table->model))
252 gnc_table_leave_update (sheet->table, virt_loc);
254 gnucash_sheet_redraw_block (sheet, virt_loc.vcell_loc);
259 gnucash_sheet_activate_cursor_cell (
GnucashSheet *sheet,
260 gboolean changed_cells)
262 Table *table = sheet->table;
265 GtkEditable *editable;
266 int cursor_pos, start_sel, end_sel;
267 gboolean allow_edits;
271 gnucash_sheet_deactivate_cursor_cell (sheet);
273 gnucash_cursor_get_virt (GNUCASH_CURSOR(sheet->cursor), &virt_loc);
276 gnc_table_wrap_verify_cursor_position (table, virt_loc);
278 gnucash_cursor_get_virt (GNUCASH_CURSOR(sheet->cursor), &virt_loc);
280 if (!gnc_table_virtual_loc_valid (table, virt_loc, TRUE))
283 style = gnucash_sheet_get_style (sheet, virt_loc.vcell_loc);
284 if (strcmp (style->cursor->cursor_name, CURSOR_HEADER) == 0)
287 editable = GTK_EDITABLE(sheet->entry);
293 if (gnc_table_model_read_only (table->model))
296 allow_edits = gnc_table_enter_update (table, virt_loc,
298 &start_sel, &end_sel);
301 gnucash_sheet_redraw_block (sheet, virt_loc.vcell_loc);
304 gnucash_sheet_im_context_reset(sheet);
305 gnucash_sheet_start_editing_at_cursor (sheet);
306 gtk_editable_set_position (editable, cursor_pos);
307 gtk_editable_select_region (editable, start_sel, end_sel);
308 sheet->direct_update_cell =
309 gnucash_sheet_check_direct_update_cell (sheet, virt_loc);
312 gtk_widget_grab_focus (GTK_WIDGET(sheet));
320 gboolean changed_cells;
323 table = sheet->table;
326 gnucash_cursor_get_virt (GNUCASH_CURSOR(sheet->cursor), &old_virt_loc);
329 gnucash_sheet_deactivate_cursor_cell (sheet);
333 gnc_table_wrap_verify_cursor_position (table, virt_loc);
337 gnucash_sheet_deactivate_cursor_cell (sheet);
342 gnucash_cursor_get_virt (GNUCASH_CURSOR(sheet->cursor), &virt_loc);
344 gnucash_sheet_cursor_set (sheet, virt_loc);
348 gnucash_sheet_make_cell_visible (sheet, virt_loc);
350 changed_cells = !virt_loc_equal (virt_loc, old_virt_loc);
354 gnc_header_request_redraw (GNC_HEADER(sheet->header_item));
357 gnucash_sheet_activate_cursor_cell (sheet, changed_cells);
360 (sheet->moved_cb)(sheet, sheet->moved_cb_data);
361 return changed_cells;
366 gnucash_sheet_y_pixel_to_block (
GnucashSheet *sheet,
int y)
371 vcell_loc.virt_row < sheet->num_virt_rows;
372 vcell_loc.virt_row++)
376 block = gnucash_sheet_get_block (sheet, vcell_loc);
377 if (!block || !block->visible)
380 if (block->origin_y + block->style->dimensions->height > y)
384 return vcell_loc.virt_row;
389 gnucash_sheet_compute_visible_range (
GnucashSheet *sheet)
394 gint old_visible_blocks, old_visible_rows;
396 g_return_if_fail (sheet != NULL);
397 g_return_if_fail (GNUCASH_IS_SHEET (sheet));
399 height = GTK_WIDGET(sheet)->allocation.height;
401 gnome_canvas_get_scroll_offsets (GNOME_CANVAS(sheet), NULL, &cy);
403 sheet->top_block = gnucash_sheet_y_pixel_to_block (sheet, cy);
405 old_visible_blocks = sheet->num_visible_blocks;
406 old_visible_rows = sheet->num_visible_phys_rows;
407 sheet->num_visible_blocks = 0;
408 sheet->num_visible_phys_rows = 0;
410 for ( vcell_loc.virt_row = sheet->top_block, vcell_loc.virt_col = 0;
411 vcell_loc.virt_row < sheet->num_virt_rows;
412 vcell_loc.virt_row++ )
416 block = gnucash_sheet_get_block (sheet, vcell_loc);
420 sheet->num_visible_blocks++;
421 sheet->num_visible_phys_rows += block->style->nrows;
423 if (block->origin_y - cy + block->style->dimensions->height
428 sheet->bottom_block = vcell_loc.virt_row;
431 sheet->left_block = 0;
432 sheet->right_block = 0;
434 if ((old_visible_blocks > sheet->num_visible_blocks) ||
435 (old_visible_rows > sheet->num_visible_phys_rows))
442 gtk_widget_queue_draw(gtk_widget_get_parent(GTK_WIDGET(sheet)));
448 gnucash_sheet_show_row (
GnucashSheet *sheet, gint virt_row)
457 g_return_if_fail (virt_row >= 0);
458 g_return_if_fail (sheet != NULL);
459 g_return_if_fail (GNUCASH_IS_SHEET(sheet));
461 vcell_loc.virt_row = MAX (vcell_loc.virt_row, 1);
462 vcell_loc.virt_row = MIN (vcell_loc.virt_row,
463 sheet->num_virt_rows - 1);
465 gnome_canvas_get_scroll_offsets (GNOME_CANVAS(sheet), &cx, &cy);
468 height = GTK_WIDGET(sheet)->allocation.height;
470 block = gnucash_sheet_get_block (sheet, vcell_loc);
473 block_height = block->style->dimensions->height;
475 if ((cy <= y) && (cy + height >= y + block_height))
477 gnucash_sheet_compute_visible_range (sheet);
482 y -= height - MIN (block_height, height);
484 if ((sheet->height - y) < height)
485 y = sheet->height - height;
491 gtk_adjustment_set_value (sheet->vadj, y);
493 gtk_adjustment_set_value (sheet->hadj, x);
495 gnucash_sheet_compute_visible_range (sheet);
496 gnucash_sheet_update_adjustments (sheet);
503 g_return_if_fail (sheet != NULL);
504 g_return_if_fail (GNUCASH_IS_SHEET (sheet));
506 if (!gnucash_sheet_cell_valid (sheet, virt_loc))
509 gnucash_sheet_show_row (sheet, virt_loc.vcell_loc.virt_row);
511 gnucash_sheet_update_adjustments (sheet);
527 g_return_if_fail (sheet != NULL);
528 g_return_if_fail (GNUCASH_IS_SHEET(sheet));
530 start_loc.virt_row = MAX (start_loc.virt_row, 1);
531 start_loc.virt_row = MIN (start_loc.virt_row,
532 sheet->num_virt_rows - 1);
534 end_loc.virt_row = MAX (end_loc.virt_row, 1);
535 end_loc.virt_row = MIN (end_loc.virt_row,
536 sheet->num_virt_rows - 1);
538 gnome_canvas_get_scroll_offsets (GNOME_CANVAS(sheet), &cx, &cy);
541 height = GTK_WIDGET(sheet)->allocation.height;
543 start_block = gnucash_sheet_get_block (sheet, start_loc);
544 end_block = gnucash_sheet_get_block (sheet, end_loc);
546 y = start_block->origin_y;
547 block_height = (end_block->origin_y +
548 end_block->style->dimensions->height) - y;
550 if ((cy <= y) && (cy + height >= y + block_height))
552 gnucash_sheet_compute_visible_range (sheet);
557 y -= height - MIN (block_height, height);
559 if ((sheet->height - y) < height)
560 y = sheet->height - height;
566 gtk_adjustment_set_value (sheet->vadj, y);
568 gtk_adjustment_set_value (sheet->hadj, x);
570 gnucash_sheet_compute_visible_range (sheet);
571 gnucash_sheet_update_adjustments (sheet);
580 g_return_if_fail (sheet != NULL);
581 g_return_if_fail (GNUCASH_IS_SHEET (sheet));
582 g_return_if_fail (sheet->vadj != NULL);
586 if (sheet->num_visible_blocks > 0)
587 vadj->step_increment =
588 vadj->page_size / sheet->num_visible_blocks;
590 vadj->step_increment = 0;
592 gtk_adjustment_changed(vadj);
597 gnucash_sheet_vadjustment_value_changed (GtkAdjustment *adj,
600 gnucash_sheet_compute_visible_range (sheet);
605 gnucash_sheet_hadjustment_changed (GtkAdjustment *adj,
610 g_return_if_fail (sheet != NULL);
611 g_return_if_fail (GNUCASH_IS_SHEET(sheet));
612 reg = GNUCASH_REGISTER(sheet->reg);
613 g_return_if_fail (reg != NULL);
615 if (adj->upper - adj->lower > adj->page_size)
617 if (!reg->hscrollbar_visible)
619 gtk_widget_show(reg->hscrollbar);
620 reg->hscrollbar_visible = TRUE;
625 if (reg->hscrollbar_visible)
627 gtk_widget_hide(reg->hscrollbar);
628 reg->hscrollbar_visible = FALSE;
637 g_return_if_fail (sheet != NULL);
638 g_return_if_fail (GNUCASH_IS_SHEET(sheet));
640 gnome_canvas_request_redraw (GNOME_CANVAS (sheet), 0, 0,
641 sheet->width + 1, sheet->height + 1);
643 g_signal_emit_by_name (sheet->reg,
"redraw_all");
649 g_return_if_fail (sheet != NULL);
650 g_return_if_fail (GNUCASH_IS_SHEET(sheet));
652 g_signal_emit_by_name (sheet->reg,
"redraw_help");
662 g_return_if_fail (sheet != NULL);
663 g_return_if_fail (GNUCASH_IS_SHEET(sheet));
665 canvas = GNOME_CANVAS(sheet);
667 block = gnucash_sheet_get_block (sheet, vcell_loc);
668 if (!block || !block->style)
674 h = block->style->dimensions->height;
675 w = MIN(block->style->dimensions->width,
676 GTK_WIDGET(sheet)->allocation.width);
678 gnome_canvas_request_redraw (canvas, x, y, x + w + 1, y + h + 1);
682 gnucash_sheet_finalize (GObject *
object)
686 sheet = GNUCASH_SHEET (
object);
688 g_table_destroy (sheet->blocks);
689 sheet->blocks = NULL;
691 gnucash_sheet_clear_styles (sheet);
693 g_hash_table_destroy (sheet->cursor_styles);
694 g_hash_table_destroy (sheet->dimensions_hash_table);
696 if (G_OBJECT_CLASS (sheet_parent_class)->finalize)
697 (*G_OBJECT_CLASS (sheet_parent_class)->finalize)(
object);
700 gnucash_sheet_im_context_reset(sheet);
701 g_object_unref (sheet->im_context);
705 g_object_unref (sheet->entry);
710 gnucash_sheet_realize (GtkWidget *widget)
714 if (GTK_WIDGET_CLASS (sheet_parent_class)->realize)
715 (*GTK_WIDGET_CLASS (sheet_parent_class)->realize)(widget);
717 window = widget->window;
718 gdk_window_set_back_pixmap (GTK_LAYOUT (widget)->bin_window,
720 gtk_im_context_set_client_window( GNUCASH_SHEET (widget)->im_context,
726 gnucash_sheet_create (
Table *table)
731 ENTER(
"table=%p", table);
733 sheet = g_object_new (GNUCASH_TYPE_SHEET, NULL);
734 canvas = GNOME_CANVAS (sheet);
736 sheet->table = table;
739 sheet->vadj = gtk_layout_get_vadjustment (GTK_LAYOUT(canvas));
740 sheet->hadj = gtk_layout_get_hadjustment (GTK_LAYOUT(canvas));
742 g_signal_connect (G_OBJECT (sheet->vadj),
"value_changed",
743 G_CALLBACK (gnucash_sheet_vadjustment_value_changed), sheet);
744 g_signal_connect (G_OBJECT (sheet->hadj),
"changed",
745 G_CALLBACK (gnucash_sheet_hadjustment_changed), sheet);
754 return DEFAULT_REGISTER_WIDTH;
767 return DEFAULT_REGISTER_HEIGHT;
769 style = gnucash_sheet_get_style_from_cursor (sheet, CURSOR_HEADER);
771 return DEFAULT_REGISTER_HEIGHT;
773 cd = gnucash_style_get_cell_dimensions (style, 0, 0);
775 return DEFAULT_REGISTER_HEIGHT;
777 row_height = cd->pixel_height;
779 return row_height * DEFAULT_REGISTER_INITIAL_ROWS;
784 gnucash_sheet_size_request (GtkWidget *widget, GtkRequisition *requisition)
788 requisition->width = compute_optimal_width (sheet);
789 requisition->height = compute_optimal_height (sheet);
793 gnucash_sheet_modify_current_cell (
GnucashSheet *sheet,
const gchar *new_text)
795 GtkEditable *editable;
796 Table *table = sheet->table;
802 int cursor_position, start_sel, end_sel;
804 gnucash_cursor_get_virt(GNUCASH_CURSOR(sheet->cursor), &virt_loc);
806 if (!gnc_table_virtual_loc_valid (table, virt_loc, TRUE))
809 if (gnc_table_model_read_only (table->model))
812 editable = GTK_EDITABLE(sheet->entry);
814 cursor_position = gtk_editable_get_position (editable);
815 gtk_editable_get_selection_bounds (editable, &start_sel, &end_sel);
817 new_text_len = strlen (new_text);
819 retval = gnc_table_modify_update (table, virt_loc,
820 new_text, new_text_len,
821 new_text, new_text_len,
823 &start_sel, &end_sel,
829 gnc_item_edit_reset_offset (GNC_ITEM_EDIT(sheet->item_editor));
831 g_signal_handler_block (G_OBJECT (sheet->entry),
832 sheet->insert_signal);
833 g_signal_handler_block (G_OBJECT (sheet->entry),
834 sheet->delete_signal);
836 gtk_entry_set_text (GTK_ENTRY (sheet->entry), retval);
838 g_signal_handler_unblock (G_OBJECT (sheet->entry),
839 sheet->delete_signal);
840 g_signal_handler_unblock (G_OBJECT (sheet->entry),
841 sheet->insert_signal);
844 gtk_editable_set_position (editable, cursor_position);
845 gtk_editable_select_region(editable, start_sel, end_sel);
852 GtkEditable *editable;
859 gnucash_sheet_insert_cb (GtkWidget *widget,
860 const gchar *insert_text,
861 const gint insert_text_len,
865 GtkEditable *editable;
866 Table *table = sheet->table;
870 GString *change_text_gs;
875 const char *old_text;
878 GString *new_text_gs;
880 int start_sel, end_sel;
886 if (sheet->input_cancelled)
888 g_signal_stop_emission_by_name (G_OBJECT (sheet->entry),
893 if (insert_text_len <= 0)
896 gnucash_cursor_get_virt (GNUCASH_CURSOR(sheet->cursor), &virt_loc);
898 if (!gnc_table_virtual_loc_valid (table, virt_loc, FALSE))
901 if (gnc_table_model_read_only (table->model))
904 change_text_gs = g_string_new_len (insert_text, insert_text_len);
906 old_text = gtk_entry_get_text (GTK_ENTRY(sheet->entry));
907 if (old_text == NULL)
910 old_position = *position;
914 new_text_gs = g_string_new (
"");
919 while (*c && (i < old_position))
921 uc = g_utf8_get_char (c);
922 g_string_append_unichar (new_text_gs, uc);
923 c = g_utf8_next_char (c);
928 g_string_append (new_text_gs, change_text_gs->str);
933 uc = g_utf8_get_char (c);
934 g_string_append_unichar (new_text_gs, uc);
935 c = g_utf8_next_char (c);
938 new_text = new_text_gs->str;
939 new_text_len = new_text_gs->len;
941 change_text = change_text_gs->str;
942 change_text_len = change_text_gs->len;
944 editable = GTK_EDITABLE (sheet->entry);
946 gtk_editable_get_selection_bounds (editable, &start_sel, &end_sel);
948 retval = gnc_table_modify_update (table, virt_loc,
949 change_text, change_text_len,
950 new_text, new_text_len,
951 position, &start_sel, &end_sel,
952 &sheet->input_cancelled);
955 ((strcmp (retval, new_text) != 0) ||
956 (*position != old_position)))
958 g_signal_handler_block (G_OBJECT (sheet->entry),
959 sheet->insert_signal);
960 g_signal_handler_block (G_OBJECT (sheet->entry),
961 sheet->delete_signal);
963 gtk_entry_set_text (GTK_ENTRY (sheet->entry), retval);
965 g_signal_handler_unblock (G_OBJECT (sheet->entry),
966 sheet->delete_signal);
967 g_signal_handler_unblock (G_OBJECT (sheet->entry),
968 sheet->insert_signal);
970 g_signal_stop_emission_by_name (G_OBJECT(sheet->entry),
973 else if (retval == NULL)
978 gnucash_sheet_im_context_reset(sheet);
980 g_signal_stop_emission_by_name (G_OBJECT (sheet->entry),
985 if (sheet->preedit_length)
987 gtk_editable_set_position (editable,
988 sheet->preedit_start_position
989 + sheet->preedit_cursor_position);
991 else if (*position < 0)
992 *position = g_utf8_strlen(retval, -1);
994 if (start_sel != end_sel)
995 gtk_editable_select_region(editable, start_sel, end_sel);
997 g_string_free (new_text_gs, TRUE);
998 g_string_free (change_text_gs, TRUE);
1003 gnucash_sheet_delete_cb (GtkWidget *widget,
1004 const gint start_pos,
1008 GtkEditable *editable;
1009 Table *table = sheet->table;
1014 const char *old_text;
1017 GString *new_text_gs;
1019 int cursor_position = start_pos;
1020 int start_sel, end_sel;
1025 if (end_pos <= start_pos)
1028 gnucash_cursor_get_virt (GNUCASH_CURSOR (sheet->cursor), &virt_loc);
1030 if (!gnc_table_virtual_loc_valid (table, virt_loc, FALSE))
1033 if (gnc_table_model_read_only (table->model))
1036 old_text = gtk_entry_get_text (GTK_ENTRY(sheet->entry));
1040 new_text_gs = g_string_new (
"");
1043 while (*c && (i < start_pos))
1045 uc = g_utf8_get_char (c);
1046 g_string_append_unichar (new_text_gs, uc);
1047 c = g_utf8_next_char (c);
1051 c = g_utf8_offset_to_pointer (old_text, end_pos);
1054 uc = g_utf8_get_char (c);
1055 g_string_append_unichar (new_text_gs, uc);
1056 c = g_utf8_next_char (c);
1059 new_text = new_text_gs->str;
1060 new_text_len = new_text_gs->len;
1062 editable = GTK_EDITABLE (sheet->entry);
1064 gtk_editable_get_selection_bounds (editable, &start_sel, &end_sel);
1066 retval = gnc_table_modify_update (table, virt_loc,
1068 new_text, new_text_len,
1070 &start_sel, &end_sel,
1071 &sheet->input_cancelled);
1073 if (retval && (strcmp (retval, new_text) != 0))
1075 g_signal_handler_block (G_OBJECT (sheet->entry),
1076 sheet->insert_signal);
1077 g_signal_handler_block (G_OBJECT (sheet->entry),
1078 sheet->delete_signal);
1080 gtk_entry_set_text (GTK_ENTRY (sheet->entry), retval);
1082 g_signal_handler_unblock (G_OBJECT (sheet->entry),
1083 sheet->delete_signal);
1084 g_signal_handler_unblock (G_OBJECT (sheet->entry),
1085 sheet->insert_signal);
1087 g_signal_stop_emission_by_name (G_OBJECT(sheet->entry),
1090 else if (retval == NULL)
1093 g_signal_stop_emission_by_name (G_OBJECT(sheet->entry),
1097 gtk_editable_set_position (editable, cursor_position);
1099 if (start_sel != end_sel)
1100 gtk_editable_select_region (editable, start_sel, end_sel);
1102 g_string_free (new_text_gs, TRUE);
1107 gnucash_sheet_size_allocate (GtkWidget *widget, GtkAllocation *allocation)
1111 ENTER(
"widget=%p, allocation=%p", widget, allocation);
1113 if (GTK_WIDGET_CLASS(sheet_parent_class)->size_allocate)
1114 (*GTK_WIDGET_CLASS (sheet_parent_class)->size_allocate)
1115 (widget, allocation);
1117 if (allocation->height == sheet->window_height &&
1118 allocation->width == sheet->window_width)
1120 LEAVE(
"size unchanged");
1124 if (allocation->width != sheet->window_width)
1126 gnucash_sheet_styles_set_dimensions (sheet, allocation->width);
1127 gnucash_sheet_recompute_block_offsets (sheet);
1130 sheet->window_height = allocation->height;
1131 sheet->window_width = allocation->width;
1133 gnucash_cursor_configure (GNUCASH_CURSOR (sheet->cursor));
1134 gnc_header_reconfigure (GNC_HEADER(sheet->header_item));
1135 gnucash_sheet_set_scroll_region (sheet);
1137 gnc_item_edit_configure (GNC_ITEM_EDIT(sheet->item_editor));
1138 gnucash_sheet_update_adjustments (sheet);
1144 virt_loc = sheet->table->current_cursor_loc;
1146 if (gnucash_sheet_cell_valid (sheet, virt_loc))
1147 gnucash_sheet_show_row (sheet,
1148 virt_loc.vcell_loc.virt_row);
1155 gnucash_sheet_focus_in_event (GtkWidget *widget, GdkEventFocus *event)
1159 if (GTK_WIDGET_CLASS(sheet_parent_class)->focus_in_event)
1160 (*GTK_WIDGET_CLASS (sheet_parent_class)->focus_in_event)
1163 gnc_item_edit_focus_in (GNC_ITEM_EDIT(sheet->item_editor));
1164 gtk_im_context_focus_in(sheet->im_context);
1167 gnucash_sheet_im_context_reset(sheet);
1174 gnucash_sheet_focus_out_event (GtkWidget *widget, GdkEventFocus *event)
1178 if (GTK_WIDGET_CLASS(sheet_parent_class)->focus_out_event)
1179 (*GTK_WIDGET_CLASS (sheet_parent_class)->focus_out_event)
1183 gnucash_sheet_im_context_reset(sheet);
1186 gtk_im_context_focus_out (sheet->im_context);
1187 gnc_item_edit_focus_out (GNC_ITEM_EDIT(sheet->item_editor));
1192 gnucash_sheet_check_direct_update_cell(
GnucashSheet *sheet,
1195 const gchar *type_name;
1197 type_name = gnc_table_get_cell_type_name (sheet->table, virt_loc);
1199 if ( (g_strcmp0 (type_name, DATE_CELL_TYPE_NAME) == 0)
1200 || (g_strcmp0 (type_name, COMBO_CELL_TYPE_NAME) == 0)
1201 || (g_strcmp0 (type_name, NUM_CELL_TYPE_NAME) == 0)
1202 || (g_strcmp0 (type_name, PRICE_CELL_TYPE_NAME) == 0)
1203 || (g_strcmp0 (type_name, FORMULA_CELL_TYPE_NAME) == 0))
return TRUE;
1209 gnucash_sheet_start_editing_at_cursor (
GnucashSheet *sheet)
1214 g_return_if_fail (sheet != NULL);
1215 g_return_if_fail (GNUCASH_IS_SHEET (sheet));
1217 gnucash_cursor_get_virt (GNUCASH_CURSOR(sheet->cursor), &virt_loc);
1219 text = gnc_table_get_entry (sheet->table, virt_loc);
1221 gnc_item_edit_configure (GNC_ITEM_EDIT(sheet->item_editor));
1222 gnome_canvas_item_show (GNOME_CANVAS_ITEM (sheet->item_editor));
1224 gtk_entry_set_text (GTK_ENTRY(sheet->entry), text);
1226 sheet->editing = TRUE;
1229 sheet->insert_signal =
1230 g_signal_connect(G_OBJECT(sheet->entry),
"insert_text",
1231 G_CALLBACK(gnucash_sheet_insert_cb), sheet);
1232 sheet->delete_signal =
1233 g_signal_connect(G_OBJECT(sheet->entry),
"delete_text",
1234 G_CALLBACK(gnucash_sheet_delete_cb), sheet);
1236 sheet->commit_signal =
1237 g_signal_connect (G_OBJECT (sheet->im_context),
"commit",
1238 G_CALLBACK (gnucash_sheet_commit_cb), sheet);
1239 sheet->preedit_changed_signal =
1240 g_signal_connect (G_OBJECT (sheet->im_context),
"preedit_changed",
1241 G_CALLBACK (gnucash_sheet_preedit_changed_cb),
1243 sheet->retrieve_surrounding_signal =
1244 g_signal_connect (G_OBJECT (sheet->im_context),
1245 "retrieve_surrounding",
1246 G_CALLBACK (gnucash_sheet_retrieve_surrounding_cb),
1248 sheet->delete_surrounding_signal =
1249 g_signal_connect (G_OBJECT (sheet->im_context),
"delete_surrounding",
1250 G_CALLBACK (gnucash_sheet_delete_surrounding_cb),
1256 gnucash_motion_event (GtkWidget *widget, GdkEventMotion *event)
1261 g_return_val_if_fail(widget != NULL, TRUE);
1262 g_return_val_if_fail(GNUCASH_IS_SHEET(widget), TRUE);
1263 g_return_val_if_fail(event != NULL, TRUE);
1265 sheet = GNUCASH_SHEET(widget);
1267 if (!(event->state & GDK_BUTTON1_MASK) && sheet->grabbed)
1269 gtk_grab_remove (widget);
1270 sheet->grabbed = FALSE;
1273 if (sheet->button != 1)
1276 if (!sheet->editing || event->type != GDK_MOTION_NOTIFY)
1279 if (!(event->state & GDK_BUTTON1_MASK))
1282 gnucash_cursor_get_virt (GNUCASH_CURSOR(sheet->cursor), &virt_loc);
1284 gnc_item_edit_set_cursor_pos (GNC_ITEM_EDIT(sheet->item_editor),
1285 virt_loc, event->x, FALSE, TRUE);
1291 gnucash_button_release_event (GtkWidget *widget, GdkEventButton *event)
1295 g_return_val_if_fail(widget != NULL, TRUE);
1296 g_return_val_if_fail(GNUCASH_IS_SHEET(widget), TRUE);
1297 g_return_val_if_fail(event != NULL, TRUE);
1299 sheet = GNUCASH_SHEET (widget);
1301 if (sheet->button != event->button)
1306 if (event->button != 1)
1309 gtk_grab_remove (widget);
1310 sheet->grabbed = FALSE;
1312 gnc_item_edit_set_has_selection(GNC_ITEM_EDIT(sheet->item_editor), FALSE);
1317 gnucash_scroll_event (GtkWidget *widget, GdkEventScroll *event)
1320 GtkAdjustment *vadj;
1323 g_return_val_if_fail(widget != NULL, TRUE);
1324 g_return_val_if_fail(GNUCASH_IS_SHEET(widget), TRUE);
1325 g_return_val_if_fail(event != NULL, TRUE);
1327 sheet = GNUCASH_SHEET (widget);
1329 v_value = vadj->value;
1331 switch (event->direction)
1334 v_value -= vadj->step_increment;
1336 case GDK_SCROLL_DOWN:
1337 v_value += vadj->step_increment;
1343 v_value = CLAMP(v_value, vadj->lower, vadj->upper - vadj->page_size);
1345 gtk_adjustment_set_value(vadj, v_value);
1353 GdkModifierType mods;
1356 if (!sheet->grabbed)
1359 device = gdk_device_get_core_pointer ();
1361 gdk_device_get_state (device, GTK_WIDGET(sheet)->window,
1364 if (!(mods & GDK_BUTTON1_MASK))
1366 gtk_grab_remove (GTK_WIDGET(sheet));
1367 sheet->grabbed = FALSE;
1372 gnucash_button_press_event (GtkWidget *widget, GdkEventButton *event)
1375 GtkEditable *editable;
1377 gboolean changed_cells;
1383 gboolean abort_move;
1387 g_return_val_if_fail(widget != NULL, TRUE);
1388 g_return_val_if_fail(GNUCASH_IS_SHEET(widget), TRUE);
1389 g_return_val_if_fail(event != NULL, TRUE);
1391 sheet = GNUCASH_SHEET (widget);
1392 table = sheet->table;
1394 if (sheet->button && (sheet->button != event->button))
1397 sheet->button =
event->button;
1398 if (sheet->button == 3)
1401 if (!gtk_widget_has_focus(widget))
1402 gtk_widget_grab_focus(widget);
1407 switch (event->button)
1413 if (event->type != GDK_BUTTON_PRESS)
1415 gnc_item_edit_paste_selection (GNC_ITEM_EDIT(sheet->item_editor),
1416 GDK_SELECTION_PRIMARY,
1420 do_popup = (sheet->popup != NULL);
1426 gnucash_cursor_get_virt (GNUCASH_CURSOR(sheet->cursor), &cur_virt_loc);
1428 if (!gnucash_grid_find_loc_by_pixel(GNUCASH_GRID(sheet->grid),
1429 event->x, event->y, &new_virt_loc))
1432 vcell = gnc_table_get_virtual_cell (table, new_virt_loc.vcell_loc);
1436 if (virt_loc_equal (new_virt_loc, cur_virt_loc) && button_1 &&
1437 (event->type == GDK_2BUTTON_PRESS))
1439 gnc_item_edit_set_cursor_pos (GNC_ITEM_EDIT(sheet->item_editor),
1440 cur_virt_loc, event->x, FALSE, FALSE);
1442 editable = GTK_EDITABLE(sheet->entry);
1443 gtk_editable_set_position(editable, -1);
1444 gtk_editable_select_region(editable, 0, -1);
1448 if (event->type != GDK_BUTTON_PRESS)
1453 gtk_grab_add(widget);
1454 sheet->grabbed = TRUE;
1455 gnc_item_edit_set_has_selection (GNC_ITEM_EDIT(sheet->item_editor),
1459 if (virt_loc_equal (new_virt_loc, cur_virt_loc) && sheet->editing)
1461 gboolean extend_selection =
event->state & GDK_SHIFT_MASK;
1463 gnc_item_edit_set_cursor_pos (GNC_ITEM_EDIT(sheet->item_editor),
1464 cur_virt_loc, event->x, FALSE,
1468 gtk_menu_popup(GTK_MENU(sheet->popup), NULL, NULL, NULL,
1469 sheet->popup_data, event->button, event->time);
1471 return button_1 || do_popup;
1475 abort_move = gnc_table_traverse_update (table,
1477 GNC_TABLE_TRAVERSE_POINTER,
1481 gnucash_sheet_check_grab (sheet);
1486 changed_cells = gnucash_sheet_cursor_move (sheet, new_virt_loc);
1489 gnucash_sheet_check_grab (sheet);
1491 gnucash_cursor_get_virt (GNUCASH_CURSOR(sheet->cursor), &new_virt_loc);
1493 gnc_item_edit_set_cursor_pos (GNC_ITEM_EDIT(sheet->item_editor),
1494 new_virt_loc, event->x, changed_cells, FALSE);
1497 gtk_menu_popup(GTK_MENU(sheet->popup), NULL, NULL, NULL,
1498 sheet->popup_data, event->button, event->time);
1499 return button_1 || do_popup;
1508 g_return_val_if_fail((reg != NULL), FALSE);
1509 g_return_val_if_fail(GNUCASH_IS_REGISTER(reg), FALSE);
1511 sheet = GNUCASH_SHEET(reg->sheet);
1512 item_edit = GNC_ITEM_EDIT(sheet->item_editor);
1514 return gnc_item_edit_get_has_selection(item_edit);
1523 g_return_if_fail(reg != NULL);
1524 g_return_if_fail(GNUCASH_IS_REGISTER(reg));
1526 sheet = GNUCASH_SHEET(reg->sheet);
1527 item_edit = GNC_ITEM_EDIT(sheet->item_editor);
1529 gnc_item_edit_cut_clipboard(item_edit, GDK_CURRENT_TIME);
1538 g_return_if_fail(reg != NULL);
1539 g_return_if_fail(GNUCASH_IS_REGISTER(reg));
1541 sheet = GNUCASH_SHEET(reg->sheet);
1542 item_edit = GNC_ITEM_EDIT(sheet->item_editor);
1544 gnc_item_edit_copy_clipboard(item_edit, GDK_CURRENT_TIME);
1553 g_return_if_fail(reg != NULL);
1554 g_return_if_fail(GNUCASH_IS_REGISTER(reg));
1556 sheet = GNUCASH_SHEET(reg->sheet);
1557 item_edit = GNC_ITEM_EDIT(sheet->item_editor);
1559 gnc_item_edit_paste_selection (item_edit, GDK_SELECTION_CLIPBOARD,
1566 g_return_if_fail(sheet != NULL);
1567 g_return_if_fail(GNUCASH_IS_SHEET(sheet));
1570 GNC_PREF_USE_THEME_COLORS);
1572 GNC_PREF_DRAW_HOR_LINES);
1574 GNC_PREF_DRAW_VERT_LINES);
1582 g_return_if_fail(reg != NULL);
1583 g_return_if_fail(GNUCASH_IS_REGISTER(reg));
1585 sheet = GNUCASH_SHEET(reg->sheet);
1586 gnucash_sheet_refresh_from_prefs(sheet);
1590 gnucash_sheet_clipboard_event (
GnucashSheet *sheet, GdkEventKey *event)
1593 gboolean handled = FALSE;
1596 item_edit = GNC_ITEM_EDIT(sheet->item_editor);
1599 switch (event->keyval)
1603 if (event->state & GDK_CONTROL_MASK)
1605 gnc_item_edit_copy_clipboard(item_edit, time);
1611 if (event->state & GDK_CONTROL_MASK)
1613 gnc_item_edit_cut_clipboard(item_edit, time);
1619 if (event->state & GDK_CONTROL_MASK)
1621 gnc_item_edit_paste_selection (item_edit, GDK_SELECTION_CLIPBOARD,
1626 case GDK_KEY_Insert:
1627 if (event->state & GDK_SHIFT_MASK)
1629 gnc_item_edit_paste_selection (item_edit, GDK_SELECTION_CLIPBOARD,
1633 else if (event->state & GDK_CONTROL_MASK)
1635 gnc_item_edit_copy_clipboard(item_edit, time);
1645 gnucash_sheet_direct_event(
GnucashSheet *sheet, GdkEvent *event)
1647 GtkEditable *editable;
1648 Table *table = sheet->table;
1653 char *new_text = NULL;
1655 int cursor_position, start_sel, end_sel;
1656 int new_position, new_start, new_end;
1658 gnucash_cursor_get_virt(GNUCASH_CURSOR(sheet->cursor), &virt_loc);
1660 if (!gnc_table_virtual_loc_valid (table, virt_loc, TRUE))
1663 if (gnc_table_model_read_only (table->model))
1666 editable = GTK_EDITABLE(sheet->entry);
1668 cursor_position = gtk_editable_get_position (editable);
1669 gtk_editable_get_selection_bounds (editable, &start_sel, &end_sel);
1671 new_position = cursor_position;
1672 new_start = start_sel;
1675 result = gnc_table_direct_update (table, virt_loc,
1678 &new_start, &new_end,
1683 if (new_text != NULL)
1685 g_signal_handler_block (G_OBJECT (sheet->entry),
1686 sheet->insert_signal);
1687 g_signal_handler_block (G_OBJECT (sheet->entry),
1688 sheet->delete_signal);
1690 gtk_entry_set_text (GTK_ENTRY (sheet->entry), new_text);
1692 g_signal_handler_unblock (G_OBJECT (sheet->entry),
1693 sheet->delete_signal);
1694 g_signal_handler_unblock (G_OBJECT (sheet->entry),
1695 sheet->insert_signal);
1700 if (new_position != cursor_position)
1702 gtk_editable_set_position (editable, new_position);
1706 if ((new_start != start_sel) || (new_end != end_sel))
1708 gtk_editable_select_region(editable, new_start, new_end);
1713 gnc_item_edit_redraw(GNC_ITEM_EDIT(sheet->item_editor));
1719 gnucash_sheet_key_press_event_internal (GtkWidget *widget, GdkEventKey *event)
1723 gboolean pass_on = FALSE;
1724 gboolean abort_move;
1727 gncTableTraversalDir direction = 0;
1730 g_return_val_if_fail(widget != NULL, TRUE);
1731 g_return_val_if_fail(GNUCASH_IS_SHEET(widget), TRUE);
1732 g_return_val_if_fail(event != NULL, TRUE);
1734 sheet = GNUCASH_SHEET (widget);
1735 table = sheet->table;
1737 if (gnucash_sheet_direct_event(sheet, (GdkEvent *) event))
1740 gnucash_cursor_get_virt (GNUCASH_CURSOR(sheet->cursor), &cur_virt_loc);
1741 new_virt_loc = cur_virt_loc;
1746 if (event->state & (GDK_MOD1_MASK | GDK_MOD3_MASK |
1747 GDK_MOD4_MASK | GDK_MOD5_MASK))
1753 switch (event->keyval)
1755 case GDK_KEY_Return:
1756 case GDK_KEY_KP_Enter:
1757 g_signal_emit_by_name(sheet->reg,
"activate_cursor");
1761 case GDK_KEY_ISO_Left_Tab:
1762 if (event->state & GDK_SHIFT_MASK)
1764 direction = GNC_TABLE_TRAVERSE_LEFT;
1765 gnc_table_move_tab (table, &new_virt_loc,
1770 direction = GNC_TABLE_TRAVERSE_RIGHT;
1771 gnc_table_move_tab (table, &new_virt_loc,
1775 case GDK_KEY_KP_Page_Up:
1776 case GDK_KEY_Page_Up:
1777 direction = GNC_TABLE_TRAVERSE_UP;
1778 new_virt_loc.phys_col_offset = 0;
1779 if (event->state & GDK_SHIFT_MASK)
1780 new_virt_loc.vcell_loc.virt_row = 1;
1783 distance = sheet->num_visible_phys_rows - 1;
1785 (table, &new_virt_loc, -distance);
1788 case GDK_KEY_KP_Page_Down:
1789 case GDK_KEY_Page_Down:
1790 direction = GNC_TABLE_TRAVERSE_DOWN;
1791 new_virt_loc.phys_col_offset = 0;
1792 if (event->state & GDK_SHIFT_MASK)
1793 new_virt_loc.vcell_loc.virt_row =
1794 sheet->num_virt_rows - 1;
1797 distance = sheet->num_visible_phys_rows - 1;
1799 (table, &new_virt_loc, distance);
1804 direction = GNC_TABLE_TRAVERSE_UP;
1808 case GDK_KEY_KP_Down:
1811 if (event->keyval == GDK_Menu ||
1812 (event->state & GDK_CONTROL_MASK))
1816 item_edit = GNC_ITEM_EDIT (sheet->item_editor);
1818 if (gnc_table_confirm_change (table,
1820 gnc_item_edit_show_popup (item_edit);
1825 direction = GNC_TABLE_TRAVERSE_DOWN;
1829 case GDK_KEY_Control_L:
1830 case GDK_KEY_Control_R:
1831 case GDK_KEY_Shift_L:
1832 case GDK_KEY_Shift_R:
1838 if (gnucash_sheet_clipboard_event(sheet, event))
1851 g_value_init (&gval, G_TYPE_BOOLEAN);
1852 g_value_set_boolean (&gval, TRUE);
1853 g_object_set_property (G_OBJECT (sheet->entry),
"editable", &gval);
1854 result = gtk_widget_event (sheet->entry, (GdkEvent *) event);
1855 g_value_set_boolean (&gval, FALSE);
1856 g_object_set_property (G_OBJECT (sheet->entry),
"editable", &gval);
1860 abort_move = gnc_table_traverse_update (table, cur_virt_loc,
1861 direction, &new_virt_loc);
1867 gnucash_sheet_cursor_move (sheet, new_virt_loc);
1874 gnucash_sheet_key_press_event (GtkWidget *widget, GdkEventKey *event)
1878 g_return_val_if_fail(widget != NULL, TRUE);
1879 g_return_val_if_fail(GNUCASH_IS_SHEET(widget), TRUE);
1880 g_return_val_if_fail(event != NULL, TRUE);
1882 sheet = GNUCASH_SHEET (widget);
1891 if (event->hardware_keycode == VK_DECIMAL)
1892 event->keyval = GDK_KP_Decimal;
1894 if (sheet->preedit_length)
1896 sheet->shift_state = 0;
1897 sheet->keyval_state = 0;
1901 sheet->shift_state =
event->state & GDK_SHIFT_MASK;
1902 sheet->keyval_state = (
event->keyval == GDK_KEY_KP_Decimal) ? GDK_KEY_KP_Decimal : 0;
1904 if (gtk_im_context_filter_keypress (sheet->im_context, event))
1906 sheet->need_im_reset = TRUE;
1910 return gnucash_sheet_key_press_event_internal (widget, event);
1914 gnucash_sheet_key_release_event(GtkWidget *widget, GdkEventKey *event)
1918 g_return_val_if_fail(widget != NULL, TRUE);
1919 g_return_val_if_fail(GNUCASH_IS_SHEET(widget), TRUE);
1920 g_return_val_if_fail(event != NULL, TRUE);
1922 sheet = GNUCASH_SHEET (widget);
1924 if (gtk_im_context_filter_keypress (sheet->im_context, event))
1926 sheet->need_im_reset = TRUE;
1934 gnucash_sheet_im_context_reset_flags(
GnucashSheet *sheet)
1936 sheet->preedit_length = 0;
1937 sheet->preedit_char_length = 0;
1938 sheet->preedit_start_position = -1;
1939 sheet->preedit_cursor_position = 0;
1940 sheet->preedit_selection_length = 0;
1946 if (sheet->need_im_reset)
1948 if (sheet->preedit_attrs)
1950 pango_attr_list_unref (sheet->preedit_attrs);
1951 sheet->preedit_attrs = NULL;
1953 gtk_im_context_reset (sheet->im_context);
1954 sheet->need_im_reset = FALSE;
1956 gnucash_sheet_im_context_reset_flags(sheet);
1960 gnucash_sheet_commit_cb (GtkIMContext *context,
const gchar *str,
1963 GtkEditable *editable;
1964 gint tmp_pos, sel_start, sel_end;
1966 g_return_if_fail(strlen(str) > 0);
1967 g_return_if_fail(sheet->editing == TRUE);
1969 editable = GTK_EDITABLE (sheet->entry);
1971 if (strlen(str) == 1 && sheet->direct_update_cell)
1975 GdkEventKey *keyevent;
1978 event = gdk_event_new (GDK_KEY_PRESS);
1979 keyevent = (GdkEventKey *) event;
1981 sheet->keyval_state ? sheet->keyval_state
1982 : gdk_unicode_to_keyval(str[0]);
1983 keyevent->state |= sheet->shift_state;
1984 result = gnucash_sheet_direct_event(sheet, event);
1985 gdk_event_free(event);
1989 gnucash_sheet_im_context_reset_flags(sheet);
1995 if (sheet->preedit_length)
1997 g_signal_handler_block (G_OBJECT (sheet->entry),
1998 sheet->delete_signal);
1999 gtk_editable_delete_text (editable, sheet->preedit_start_position,
2000 sheet->preedit_start_position
2001 + sheet->preedit_char_length);
2002 g_signal_handler_unblock (G_OBJECT (sheet->entry),
2003 sheet->delete_signal);
2006 if (gtk_editable_get_selection_bounds (editable, &sel_start, &sel_end))
2008 if (sel_start != sel_end)
2010 sheet->preedit_selection_length = 0;
2011 gtk_editable_delete_selection (editable);
2015 tmp_pos = (sheet->preedit_start_position == -1) ?
2016 gtk_editable_get_position (editable)
2017 : sheet->preedit_start_position;
2018 gtk_editable_insert_text (editable, str, strlen (str), &tmp_pos);
2022 gtk_editable_get_selection_bounds (editable, &sel_start, &sel_end);
2023 gtk_editable_set_position (editable, tmp_pos);
2024 if (sel_start != sel_end)
2025 gtk_editable_select_region (editable, sel_start, sel_end);
2027 gnucash_sheet_im_context_reset_flags(sheet);
2031 gnucash_sheet_preedit_changed_cb (GtkIMContext *context,
GnucashSheet *sheet)
2033 gchar *preedit_string;
2034 GtkEditable *editable;
2036 g_return_if_fail(context != NULL);
2037 g_return_if_fail(sheet->editing == TRUE);
2039 editable = GTK_EDITABLE (sheet->entry);
2042 if (sheet->preedit_length == 0)
2044 int start_pos, end_pos;
2045 if ( gtk_editable_get_selection_bounds (editable, &start_pos, &end_pos))
2047 sheet->preedit_start_position = start_pos;
2048 sheet->preedit_selection_length = end_pos - start_pos;
2052 sheet->preedit_start_position =
2053 gtk_editable_get_position (editable);
2062 sheet->need_im_reset = TRUE;
2066 if (sheet->preedit_attrs)
2067 pango_attr_list_unref (sheet->preedit_attrs);
2069 gtk_im_context_get_preedit_string (sheet->im_context, &preedit_string,
2070 &sheet->preedit_attrs, &(sheet->preedit_cursor_position));
2072 if (sheet->preedit_length)
2074 g_signal_handler_block (G_OBJECT (sheet->entry),
2075 sheet->delete_signal);
2076 gtk_editable_delete_text (editable, sheet->preedit_start_position,
2077 sheet->preedit_start_position
2078 + sheet->preedit_char_length);
2079 g_signal_handler_unblock (G_OBJECT (sheet->entry),
2080 sheet->delete_signal);
2083 sheet->preedit_length = strlen (preedit_string);
2084 sheet->preedit_char_length = g_utf8_strlen(preedit_string, -1);
2086 if (sheet->preedit_length)
2088 int tmp_pos = sheet->preedit_start_position;
2089 g_signal_handler_block (G_OBJECT (sheet->entry),
2090 sheet->insert_signal);
2091 gtk_editable_insert_text (editable, preedit_string, sheet->preedit_length,
2093 g_signal_handler_unblock (G_OBJECT (sheet->entry),
2094 sheet->insert_signal);
2096 gtk_editable_set_position (editable, sheet->preedit_start_position
2097 + sheet->preedit_cursor_position);
2099 if ( sheet->preedit_selection_length != 0)
2101 gtk_editable_select_region (editable,
2102 sheet->preedit_start_position
2103 + sheet->preedit_char_length,
2104 sheet->preedit_start_position
2105 + sheet->preedit_char_length
2106 + sheet->preedit_selection_length);
2111 gnucash_sheet_im_context_reset_flags(sheet);
2114 g_free (preedit_string);
2118 gnucash_sheet_retrieve_surrounding_cb (GtkIMContext *context,
GnucashSheet *sheet)
2120 GtkEditable *editable;
2124 editable = GTK_EDITABLE (sheet->entry);
2125 surrounding = gtk_editable_get_chars (editable, 0, -1);
2126 cur_pos = gtk_editable_get_position (editable);
2128 gtk_im_context_set_surrounding (context,
2129 surrounding, strlen (surrounding),
2130 g_utf8_offset_to_pointer (surrounding, cur_pos) - surrounding);
2131 g_free (surrounding);
2136 gnucash_sheet_delete_surrounding_cb (GtkIMContext *context, gint offset,
2139 GtkEditable *editable;
2142 editable = GTK_EDITABLE (sheet->entry);
2143 cur_pos = gtk_editable_get_position (editable);
2145 gtk_editable_delete_text (editable,
2147 cur_pos + offset + n_chars);
2156 gboolean abort_move;
2159 g_return_if_fail(GNUCASH_IS_SHEET(sheet));
2161 table = sheet->table;
2163 gnucash_cursor_get_virt (GNUCASH_CURSOR(sheet->cursor), &cur_virt_loc);
2167 abort_move = gnc_table_traverse_update (table, cur_virt_loc,
2168 GNC_TABLE_TRAVERSE_POINTER,
2174 gnucash_sheet_cursor_move (sheet, virt_loc);
2185 g_return_if_fail(reg != NULL);
2186 g_return_if_fail(GNUCASH_IS_REGISTER(reg));
2188 sheet = GNUCASH_SHEET(reg->sheet);
2190 virt_loc.vcell_loc = vcell_loc;
2191 virt_loc.phys_row_offset = 0;
2192 virt_loc.phys_col_offset = 0;
2194 gnucash_sheet_goto_virt_loc(sheet, virt_loc);
2203 g_return_if_fail(reg != NULL);
2204 g_return_if_fail(GNUCASH_IS_REGISTER(reg));
2206 sheet = GNUCASH_SHEET(reg->sheet);
2208 gnucash_sheet_goto_virt_loc(sheet, virt_loc);
2218 g_return_if_fail (reg != NULL);
2219 g_return_if_fail (GNUCASH_IS_REGISTER(reg));
2221 sheet = GNUCASH_SHEET(reg->sheet);
2223 gnucash_cursor_get_virt (GNUCASH_CURSOR(sheet->cursor), &virt_loc);
2227 start_virt_row = virt_loc.vcell_loc.virt_row;
2233 while (start_virt_row == virt_loc.vcell_loc.virt_row);
2235 if (virt_loc.vcell_loc.virt_row >= sheet->num_virt_rows)
2238 virt_loc.phys_row_offset = 0;
2239 virt_loc.phys_col_offset = 0;
2241 gnucash_sheet_goto_virt_loc (sheet, virt_loc);
2246 VirtualLocationMatchFunc match,
2253 g_return_if_fail (reg != NULL);
2254 g_return_if_fail (GNUCASH_IS_REGISTER(reg));
2255 g_return_if_fail (match != NULL);
2257 sheet = GNUCASH_SHEET (reg->sheet);
2259 gnucash_cursor_get_virt (GNUCASH_CURSOR(sheet->cursor), &virt_loc);
2267 if (virt_loc.vcell_loc.virt_row >= sheet->num_virt_rows)
2270 style = gnucash_sheet_get_style (sheet, virt_loc.vcell_loc);
2271 if (!style || !style->cursor)
2274 while (!match (virt_loc, user_data));
2276 virt_loc.phys_row_offset = 0;
2277 virt_loc.phys_col_offset = 0;
2279 gnucash_sheet_goto_virt_loc (sheet, virt_loc);
2285 g_return_val_if_fail (sheet != NULL, NULL);
2286 g_return_val_if_fail (GNUCASH_IS_SHEET(sheet), NULL);
2288 return g_table_index (sheet->blocks,
2290 vcell_loc.virt_col);
2295 g_return_val_if_fail (sheet != NULL, NULL);
2296 g_return_val_if_fail (GNUCASH_IS_SHEET(sheet), NULL);
2298 if (sheet->item_editor == NULL)
2301 return GNC_ITEM_EDIT (sheet->item_editor);
2305 void gnucash_sheet_set_window (
GnucashSheet *sheet, GtkWidget *window)
2307 g_return_if_fail (sheet != NULL);
2308 g_return_if_fail (GNUCASH_IS_SHEET(sheet));
2311 g_return_if_fail (GTK_IS_WIDGET(window));
2313 sheet->window = window;
2320 gnucash_sheet_block_set_from_table (
GnucashSheet *sheet,
2328 block = gnucash_sheet_get_block (sheet, vcell_loc);
2329 style = gnucash_sheet_get_style_from_table (sheet, vcell_loc);
2334 table = sheet->table;
2336 vcell = gnc_table_get_virtual_cell (table, vcell_loc);
2338 if (block->style && (block->style != style))
2340 gnucash_style_unref (block->style);
2341 block->style = NULL;
2344 block->visible = (vcell) ? vcell->visible : TRUE;
2346 if (block->style == NULL)
2348 block->style = style;
2349 gnucash_style_ref(block->style);
2358 gnucash_sheet_col_max_width (
GnucashSheet *sheet, gint virt_col, gint cell_col)
2366 PangoLayout *layout = gtk_widget_create_pango_layout (GTK_WIDGET (sheet),
"");
2368 g_return_val_if_fail (virt_col >= 0, 0);
2369 g_return_val_if_fail (virt_col < sheet->num_virt_cols, 0);
2370 g_return_val_if_fail (cell_col >= 0, 0);
2372 for (virt_row = 0; virt_row < sheet->num_virt_rows ; virt_row++)
2376 block = gnucash_sheet_get_block (sheet, vcell_loc);
2377 style = block->style;
2382 if (cell_col < style->ncols)
2383 for (cell_row = 0; cell_row < style->nrows; cell_row++)
2388 virt_loc.vcell_loc = vcell_loc;
2389 virt_loc.phys_row_offset = cell_row;
2390 virt_loc.phys_col_offset = cell_col;
2394 text = gnc_table_get_label
2395 (sheet->table, virt_loc);
2399 text = gnc_table_get_entry
2400 (sheet->table, virt_loc);
2403 pango_layout_set_text (layout, text, strlen (text));
2404 pango_layout_get_pixel_size (layout, &width, NULL);
2406 width += 2 * CELL_HPADDING;
2408 max = MAX (max, width);
2412 g_object_unref (layout);
2427 widget = GTK_WIDGET(sheet);
2429 if (!sheet->header_item || !GNC_HEADER(sheet->header_item)->style)
2432 gnome_canvas_get_scroll_region (GNOME_CANVAS(sheet),
2433 NULL, NULL, &x, &y);
2435 height = MAX (sheet->height, widget->allocation.height);
2436 width = MAX (sheet->width, widget->allocation.width);
2438 if (width != (
int)x || height != (
int)y)
2439 gnome_canvas_set_scroll_region (GNOME_CANVAS(sheet),
2440 0, 0, width, height);
2444 gnucash_sheet_block_destroy (gpointer _block, gpointer user_data)
2453 gnucash_style_unref (block->style);
2454 block->style = NULL;
2459 gnucash_sheet_block_construct (gpointer _block, gpointer user_data)
2463 block->style = NULL;
2464 block->visible = TRUE;
2470 g_return_if_fail (sheet != NULL);
2471 g_return_if_fail (GNUCASH_IS_SHEET(sheet));
2473 if (sheet->table->num_virt_cols > 1)
2474 g_warning (
"num_virt_cols > 1");
2476 sheet->num_virt_cols = 1;
2478 g_table_resize (sheet->blocks, sheet->table->num_virt_rows, 1);
2480 sheet->num_virt_rows = sheet->table->num_virt_rows;
2484 gnucash_sheet_recompute_block_offsets (
GnucashSheet *sheet)
2492 g_return_if_fail (sheet != NULL);
2493 g_return_if_fail (GNUCASH_IS_SHEET(sheet));
2494 g_return_if_fail (sheet->table != NULL);
2496 table = sheet->table;
2500 for (i = 0; i < table->num_virt_rows; i++)
2504 for (j = 0; j < table->num_virt_cols; j++)
2508 block = gnucash_sheet_get_block (sheet, vcell_loc);
2510 block->origin_x = width;
2511 block->origin_y = height;
2514 width += block->style->dimensions->width;
2517 if (i > 0 && block->visible)
2518 height += block->style->dimensions->height;
2521 sheet->height = height;
2525 gnucash_sheet_table_load (
GnucashSheet *sheet, gboolean do_scroll)
2528 gint num_header_phys_rows;
2531 g_return_if_fail (sheet != NULL);
2532 g_return_if_fail (GNUCASH_IS_SHEET(sheet));
2533 g_return_if_fail (sheet->table != NULL);
2535 table = sheet->table;
2537 gnucash_sheet_stop_editing (sheet);
2539 gnucash_sheet_resize (sheet);
2541 num_header_phys_rows = 0;
2544 for (i = 0; i < table->num_virt_rows; i++)
2545 for (j = 0; j < table->num_virt_cols; j++)
2550 gnucash_sheet_block_set_from_table (sheet, vcell_loc);
2552 vcell = gnc_table_get_virtual_cell (table, vcell_loc);
2554 num_header_phys_rows =
2555 MAX (num_header_phys_rows,
2556 vcell->cellblock->num_rows);
2559 gnc_header_set_header_rows (GNC_HEADER (sheet->header_item),
2560 num_header_phys_rows);
2561 gnc_header_reconfigure (GNC_HEADER(sheet->header_item));
2563 gnucash_sheet_recompute_block_offsets (sheet);
2565 gnucash_sheet_set_scroll_region (sheet);
2571 virt_loc = table->current_cursor_loc;
2573 if (gnucash_sheet_cell_valid (sheet, virt_loc))
2574 gnucash_sheet_show_row (sheet,
2575 virt_loc.vcell_loc.virt_row);
2578 gnucash_sheet_cursor_set_from_table (sheet, do_scroll);
2579 gnucash_sheet_activate_cursor_cell (sheet, TRUE);
2583 gnucash_sheet_realize_entry (
GnucashSheet *sheet, GtkWidget *entry)
2586 g_value_init (&gval, G_TYPE_BOOLEAN);
2587 g_value_set_boolean (&gval, FALSE);
2588 g_object_set_property (G_OBJECT (entry),
"editable", &gval);
2590 gtk_widget_realize (entry);
2610 GtkWidget *widget = NULL;
2612 GdkColor *white, *black, *red;
2613 GdkColor *color = NULL;
2615 white = gnucash_color_argb_to_gdk (0xFFFFFF);
2616 black = gnucash_color_argb_to_gdk (0x000000);
2617 red = gnucash_color_argb_to_gdk (0xFF0000);
2623 case COLOR_UNKNOWN_BG:
2626 case COLOR_UNKNOWN_FG:
2629 case COLOR_NEGATIVE:
2632 case COLOR_HEADER_BG:
2633 case COLOR_HEADER_FG:
2634 widget = sheet->header_color;
2637 case COLOR_PRIMARY_BG:
2638 case COLOR_PRIMARY_BG_ACTIVE:
2639 case COLOR_PRIMARY_FG:
2640 case COLOR_PRIMARY_FG_ACTIVE:
2641 widget = sheet->primary_color;
2644 case COLOR_SECONDARY_BG:
2645 case COLOR_SECONDARY_BG_ACTIVE:
2646 case COLOR_SECONDARY_FG:
2647 case COLOR_SECONDARY_FG_ACTIVE:
2648 widget = sheet->secondary_color;
2651 case COLOR_SPLIT_BG:
2652 case COLOR_SPLIT_BG_ACTIVE:
2653 case COLOR_SPLIT_FG:
2654 case COLOR_SPLIT_FG_ACTIVE:
2655 widget = sheet->split_color;
2659 style = gtk_widget_get_style(widget);
2668 case COLOR_HEADER_BG:
2669 case COLOR_PRIMARY_BG:
2670 case COLOR_SECONDARY_BG:
2671 case COLOR_SPLIT_BG:
2672 color = &style->base[GTK_STATE_NORMAL];
2675 case COLOR_PRIMARY_BG_ACTIVE:
2676 case COLOR_SECONDARY_BG_ACTIVE:
2677 case COLOR_SPLIT_BG_ACTIVE:
2678 color = &style->base[GTK_STATE_SELECTED];
2681 case COLOR_HEADER_FG:
2682 case COLOR_PRIMARY_FG:
2683 case COLOR_SECONDARY_FG:
2684 case COLOR_SPLIT_FG:
2685 color = &style->text[GTK_STATE_NORMAL];
2688 case COLOR_PRIMARY_FG_ACTIVE:
2689 case COLOR_SECONDARY_FG_ACTIVE:
2690 case COLOR_SPLIT_FG_ACTIVE:
2691 color = &style->text[GTK_STATE_SELECTED];
2695 gnucash_color_alloc_gdk(color);
2703 sheet->header_color = gtk_entry_new();
2704 sheet->primary_color = gtk_entry_new();
2705 sheet->secondary_color = gtk_entry_new();
2706 sheet->split_color = gtk_entry_new();
2708 gtk_widget_set_name(sheet->header_color,
"header_color");
2709 gtk_widget_set_name(sheet->primary_color,
"primary_color");
2710 gtk_widget_set_name(sheet->secondary_color,
"secondary_color");
2711 gtk_widget_set_name(sheet->split_color,
"split_color");
2713 g_signal_connect_after(sheet,
"realize",
2714 G_CALLBACK(gnucash_sheet_realize_entry),
2715 sheet->header_color);
2716 g_signal_connect_after(sheet,
"realize",
2717 G_CALLBACK(gnucash_sheet_realize_entry),
2718 sheet->primary_color);
2719 g_signal_connect_after(sheet,
"realize",
2720 G_CALLBACK(gnucash_sheet_realize_entry),
2721 sheet->secondary_color);
2722 g_signal_connect_after(sheet,
"realize",
2723 G_CALLBACK(gnucash_sheet_realize_entry),
2724 sheet->split_color);
2732 GObjectClass *gobject_class;
2733 GtkWidgetClass *widget_class;
2735 gobject_class = G_OBJECT_CLASS (klass);
2736 widget_class = GTK_WIDGET_CLASS (klass);
2738 sheet_parent_class = g_type_class_peek_parent (klass);
2741 gobject_class->finalize = gnucash_sheet_finalize;
2743 widget_class->realize = gnucash_sheet_realize;
2745 widget_class->size_request = gnucash_sheet_size_request;
2746 widget_class->size_allocate = gnucash_sheet_size_allocate;
2748 widget_class->focus_in_event = gnucash_sheet_focus_in_event;
2749 widget_class->focus_out_event = gnucash_sheet_focus_out_event;
2751 widget_class->key_press_event = gnucash_sheet_key_press_event;
2752 widget_class->key_release_event = gnucash_sheet_key_release_event;
2753 widget_class->button_press_event = gnucash_button_press_event;
2754 widget_class->button_release_event = gnucash_button_release_event;
2755 widget_class->motion_notify_event = gnucash_motion_event;
2756 widget_class->scroll_event = gnucash_scroll_event;
2764 GnomeCanvas *canvas = GNOME_CANVAS (sheet);
2766 gtk_widget_set_can_focus (GTK_WIDGET(canvas), TRUE);
2767 gtk_widget_set_can_default (GTK_WIDGET(canvas), TRUE);
2769 sheet->top_block = 1;
2770 sheet->bottom_block = 1;
2771 sheet->num_visible_blocks = 1;
2772 sheet->num_visible_phys_rows = 1;
2774 sheet->input_cancelled = FALSE;
2776 sheet->popup = NULL;
2777 sheet->num_virt_rows = 0;
2778 sheet->num_virt_cols = 0;
2779 sheet->item_editor = NULL;
2780 sheet->entry = NULL;
2781 sheet->editing = FALSE;
2783 sheet->grabbed = FALSE;
2784 sheet->window_width = -1;
2785 sheet->window_height = -1;
2789 sheet->cursor_styles = g_hash_table_new (g_str_hash, g_str_equal);
2791 sheet->blocks = g_table_new (
sizeof (
SheetBlock),
2792 gnucash_sheet_block_construct,
2793 gnucash_sheet_block_destroy, NULL);
2796 sheet->im_context = gtk_im_multicontext_new ();
2797 sheet->preedit_length = 0;
2798 sheet->preedit_char_length = 0;
2799 sheet->preedit_start_position = -1;
2800 sheet->preedit_cursor_position = 0;
2801 sheet->preedit_selection_length = 0;
2802 sheet->preedit_attrs = NULL;
2803 sheet->direct_update_cell = FALSE;
2804 sheet->need_im_reset = FALSE;
2805 sheet->commit_signal = 0;
2806 sheet->preedit_changed_signal = 0;
2807 sheet->retrieve_surrounding_signal = 0;
2808 sheet->delete_surrounding_signal = 0;
2809 sheet->shift_state = 0;
2810 sheet->keyval_state = 0;
2815 gnucash_sheet_get_type (
void)
2817 static GType gnucash_sheet_type = 0;
2819 if (!gnucash_sheet_type)
2821 static const GTypeInfo gnucash_sheet_info =
2826 (GClassInitFunc) gnucash_sheet_class_init,
2831 (GInstanceInitFunc) gnucash_sheet_init
2834 gnucash_sheet_type =
2835 g_type_register_static (gnome_canvas_get_type (),
2837 &gnucash_sheet_info, 0);
2840 return gnucash_sheet_type;
2844 gnucash_sheet_new (
Table *table)
2847 GnomeCanvasItem *item;
2848 GnomeCanvasGroup *sheet_group;
2850 g_return_val_if_fail (table != NULL, NULL);
2852 sheet = gnucash_sheet_create (table);
2855 sheet_group = gnome_canvas_root (GNOME_CANVAS(sheet));
2858 item = gnome_canvas_item_new (sheet_group,
2859 gnucash_grid_get_type (),
2865 sheet->dimensions_hash_table = g_hash_table_new_full (g_int_hash,
2870 sheet->cursor = gnucash_cursor_new (sheet_group);
2871 gnome_canvas_item_set (sheet->cursor,
2873 "grid", sheet->grid,
2877 sheet->entry = gtk_entry_new ();
2878 g_object_ref_sink(sheet->entry);
2883 sheet->item_editor = gnc_item_edit_new(sheet_group, sheet, sheet->entry);
2885 gnome_canvas_item_hide (GNOME_CANVAS_ITEM(sheet->item_editor));
2891 g_signal_connect_after(sheet,
"realize",
2892 G_CALLBACK(gnucash_sheet_realize_entry),
2895 gnucash_sheet_refresh_from_prefs(sheet);
2896 gnucash_sheet_create_color_hack(sheet);
2898 return GTK_WIDGET(sheet);
2905 GObjectClass *gobject_class;
2907 gobject_class = G_OBJECT_CLASS (klass);
2909 register_parent_class = g_type_class_peek_parent (klass);
2911 register_signals[ACTIVATE_CURSOR] =
2912 g_signal_new(
"activate_cursor",
2913 G_TYPE_FROM_CLASS(gobject_class),
2918 g_cclosure_marshal_VOID__VOID,
2921 register_signals[REDRAW_ALL] =
2922 g_signal_new(
"redraw_all",
2923 G_TYPE_FROM_CLASS(gobject_class),
2928 g_cclosure_marshal_VOID__VOID,
2931 register_signals[REDRAW_HELP] =
2932 g_signal_new(
"redraw_help",
2933 G_TYPE_FROM_CLASS(gobject_class),
2938 g_cclosure_marshal_VOID__VOID,
2941 klass->activate_cursor = NULL;
2942 klass->redraw_all = NULL;
2943 klass->redraw_help = NULL;
2950 GtkTable *table = GTK_TABLE(g_reg);
2952 gtk_widget_set_can_focus (GTK_WIDGET(table), FALSE);
2953 gtk_widget_set_can_default (GTK_WIDGET(table), FALSE);
2955 gtk_table_set_homogeneous (table, FALSE);
2956 gtk_table_resize (table, 3, 2);
2961 gnucash_register_get_type (
void)
2963 static GType gnucash_register_type = 0;
2965 if (!gnucash_register_type)
2967 static const GTypeInfo gnucash_register_info =
2972 (GClassInitFunc) gnucash_register_class_init,
2977 (GInstanceInitFunc) gnucash_register_init,
2980 gnucash_register_type = g_type_register_static
2981 (gtk_table_get_type (),
2983 &gnucash_register_info, 0);
2986 return gnucash_register_type;
2995 g_return_if_fail (GNUCASH_IS_REGISTER(reg));
2996 g_return_if_fail (reg->sheet != NULL);
2998 g_return_if_fail (GTK_IS_WIDGET(popup));
3000 gnucash_sheet_set_popup (GNUCASH_SHEET (reg->sheet), popup, data);
3005 gnucash_register_new (
Table *table)
3008 GtkWidget *header_canvas;
3011 GtkWidget *scrollbar;
3014 reg = g_object_new (GNUCASH_TYPE_REGISTER, NULL);
3015 widget = GTK_WIDGET(reg);
3017 sheet = gnucash_sheet_new (table);
3019 GNUCASH_SHEET(sheet)->reg = widget;
3021 header_canvas = gnc_header_new (GNUCASH_SHEET(sheet));
3022 reg->header_canvas = header_canvas;
3024 gtk_table_attach (GTK_TABLE(widget), header_canvas,
3026 GTK_FILL | GTK_EXPAND | GTK_SHRINK,
3029 gtk_widget_show(header_canvas);
3031 gtk_table_attach (GTK_TABLE(widget), sheet,
3033 GTK_FILL | GTK_EXPAND | GTK_SHRINK,
3034 GTK_FILL | GTK_EXPAND | GTK_SHRINK,
3036 gtk_widget_show(sheet);
3038 gtk_table_attach (GTK_TABLE(widget), GNUCASH_SHEET(sheet)->entry,
3040 GTK_FILL | GTK_EXPAND | GTK_SHRINK,
3041 GTK_FILL | GTK_EXPAND | GTK_SHRINK,
3043 gtk_widget_hide(GNUCASH_SHEET(sheet)->entry);
3044 gtk_widget_set_no_show_all(GNUCASH_SHEET(sheet)->entry, TRUE);
3046 scrollbar = gtk_vscrollbar_new(GNUCASH_SHEET(sheet)->vadj);
3047 gtk_table_attach (GTK_TABLE(widget), GTK_WIDGET(scrollbar),
3050 GTK_EXPAND | GTK_SHRINK | GTK_FILL,
3052 reg->vscrollbar = scrollbar;
3053 gtk_widget_show(scrollbar);
3055 scrollbar = gtk_hscrollbar_new(GNUCASH_SHEET(sheet)->hadj);
3056 gtk_table_attach (GTK_TABLE(widget), GTK_WIDGET(scrollbar),
3058 GTK_EXPAND | GTK_SHRINK | GTK_FILL,
3061 reg->hscrollbar = scrollbar;
3062 gtk_widget_show(scrollbar);
3063 reg->hscrollbar_visible = TRUE;
3069 box = gtk_hbox_new(FALSE, 0);
3070 gtk_widget_set_no_show_all(GTK_WIDGET(box), TRUE);
3071 gtk_box_pack_start(GTK_BOX(box),
3072 GNUCASH_SHEET(sheet)->header_color, TRUE, TRUE, 0);
3073 gtk_box_pack_start(GTK_BOX(box),
3074 GNUCASH_SHEET(sheet)->primary_color, TRUE, TRUE, 0);
3075 gtk_box_pack_start(GTK_BOX(box),
3076 GNUCASH_SHEET(sheet)->secondary_color, TRUE, TRUE, 0);
3077 gtk_box_pack_start(GTK_BOX(box),
3078 GNUCASH_SHEET(sheet)->split_color, TRUE, TRUE, 0);
3080 gtk_table_attach (GTK_TABLE(widget), box,
3082 GTK_FILL | GTK_EXPAND | GTK_SHRINK,
3083 GTK_FILL | GTK_EXPAND | GTK_SHRINK,
3091 GFunc cb, gpointer cb_data)
3095 if (!reg || !reg->sheet)
3097 sheet = GNUCASH_SHEET(reg->sheet);
3098 sheet->moved_cb = cb;
3099 sheet->moved_cb_data = cb_data;
3105 g_return_val_if_fail (reg != NULL, NULL);
3106 g_return_val_if_fail (GNUCASH_IS_REGISTER(reg), NULL);
3108 return GNUCASH_SHEET(reg->sheet);
gboolean gnc_table_move_vertical_position(Table *table, VirtualLocation *virt_loc, int phys_row_offset)
#define ENTER(format, args...)
All type declarations for the whole Gnucash engine.
API for checkbook register display area.
Generic api to store and retrieve preferences.
gboolean gnc_prefs_get_bool(const gchar *group, const gchar *pref_name)
#define LEAVE(format, args...)
const gchar * QofLogModule