61#define MIN_BUTT_WIDTH 20
63static QofLogModule log_module = G_LOG_DOMAIN;
65static void gnc_item_edit_destroying (GtkWidget *
this, gpointer data);
67G_DEFINE_TYPE (
GncItemEdit, gnc_item_edit, GTK_TYPE_BOX)
69G_DEFINE_TYPE (
GncItemEditTb, gnc_item_edit_tb, GTK_TYPE_TOGGLE_BUTTON)
74 item_edit_tb->sheet = NULL;
78gnc_item_edit_tb_get_property (GObject *
object,
88 g_value_take_object (value, item_edit_tb->sheet);
91 G_OBJECT_WARN_INVALID_PROPERTY_ID(
object, param_id, pspec);
97gnc_item_edit_tb_set_property (GObject *
object,
107 item_edit_tb->sheet = GNUCASH_SHEET(g_value_get_object (value));
110 G_OBJECT_WARN_INVALID_PROPERTY_ID(
object, param_id, pspec);
116gnc_item_edit_tb_get_preferred_width (GtkWidget *widget,
121 GncItemEdit *item_edit = GNC_ITEM_EDIT(tb->sheet->item_editor);
122 GtkStyleContext *context = gtk_widget_get_style_context (GTK_WIDGET(tb));
124 gint x, y, w, h = 2, width = 0;
125 gnc_item_edit_get_pixel_coords (GNC_ITEM_EDIT(item_edit), &x, &y, &w, &h);
126 width = ((h - 2)*2)/3;
128 gtk_style_context_get_border (context, GTK_STATE_FLAG_NORMAL, &border);
130 if (width < MIN_BUTT_WIDTH + border.left + border.right)
131 width = MIN_BUTT_WIDTH + border.left + border.right;
133 *minimal_width = *natural_width = width;
134 item_edit->button_width = width;
138gnc_item_edit_tb_get_preferred_height (GtkWidget *widget,
143 GncItemEdit *item_edit = GNC_ITEM_EDIT(tb->sheet->item_editor);
145 gnc_item_edit_get_pixel_coords (GNC_ITEM_EDIT(item_edit), &x, &y, &w, &h);
146 *minimal_width = *natural_width = (h - 2);
152 GObjectClass *object_class;
153 GtkWidgetClass *widget_class;
155 gtk_widget_class_set_css_name (GTK_WIDGET_CLASS(gnc_item_edit_tb_class),
"button");
157 object_class = G_OBJECT_CLASS(gnc_item_edit_tb_class);
158 widget_class = GTK_WIDGET_CLASS(gnc_item_edit_tb_class);
160 object_class->get_property = gnc_item_edit_tb_get_property;
161 object_class->set_property = gnc_item_edit_tb_set_property;
163 g_object_class_install_property (object_class,
165 g_param_spec_object (
"sheet",
172 widget_class->get_preferred_width = gnc_item_edit_tb_get_preferred_width;
173 widget_class->get_preferred_height = gnc_item_edit_tb_get_preferred_height;
177gnc_item_edit_tb_new (GnucashSheet *sheet)
179 GtkStyleContext *context;
180 GncItemEditTb *item_edit_tb = g_object_new (GNC_TYPE_ITEM_EDIT_TB,
184 context = gtk_widget_get_style_context (GTK_WIDGET(item_edit_tb));
185 gtk_style_context_add_class (context, GTK_STYLE_CLASS_BUTTON);
187 return GTK_WIDGET(item_edit_tb);
191tb_button_press_cb (G_GNUC_UNUSED GtkWidget *widget, GdkEventButton *event,
192 G_GNUC_UNUSED gpointer *user_data)
195 if (event->button == 3 && event->type == GDK_BUTTON_PRESS)
207gnc_item_edit_get_pixel_coords (
GncItemEdit *item_edit,
211 GnucashSheet *sheet = item_edit->sheet;
218 block = gnucash_sheet_get_block (sheet, item_edit->virt_loc.vcell_loc);
222 xd = block->origin_x;
225 gnucash_sheet_style_get_cell_pixel_rel_coords (item_edit->style,
226 item_edit->virt_loc.phys_row_offset,
227 item_edit->virt_loc.phys_col_offset,
231 if (item_edit->virt_loc.phys_col_offset == 0)
243 gint x = 0, y = 0, w, h;
245 if (item_edit == NULL || item_edit->sheet == NULL)
247 gnc_item_edit_get_pixel_coords (item_edit, &x, &y, &w, &h);
248 gtk_layout_move (GTK_LAYOUT(item_edit->sheet),
249 GTK_WIDGET(item_edit), x, y);
251 if (item_edit->is_popup)
253 gtk_widget_show (item_edit->popup_toggle.ebox);
254 if (item_edit->show_popup)
255 gnc_item_edit_show_popup (item_edit);
265 g_return_if_fail (item_edit != NULL);
266 g_return_if_fail (GNC_IS_ITEM_EDIT(item_edit));
268 ev.type = GDK_FOCUS_CHANGE;
269 ev.window = gtk_widget_get_window (GTK_WIDGET(item_edit->sheet));
271 gtk_widget_event (item_edit->editor, (GdkEvent*) &ev);
279 g_return_if_fail (item_edit != NULL);
280 g_return_if_fail (GNC_IS_ITEM_EDIT(item_edit));
282 if (item_edit->show_popup)
285 ev.type = GDK_FOCUS_CHANGE;
286 ev.window = gtk_widget_get_window (GTK_WIDGET(item_edit->sheet));
288 gtk_widget_event (item_edit->editor, (GdkEvent*) &ev);
299 gtk_orientable_set_orientation (GTK_ORIENTABLE(item_edit),
300 GTK_ORIENTATION_HORIZONTAL);
302 item_edit->sheet = NULL;
303 item_edit->editor = NULL;
304 item_edit->preedit_length = 0;
306 item_edit->is_popup = FALSE;
307 item_edit->show_popup = FALSE;
309 item_edit->popup_toggle.ebox = NULL;
310 item_edit->popup_toggle.tbutton = NULL;
311 item_edit->popup_toggle.arrow_down = TRUE;
312 item_edit->popup_toggle.signals_connected = FALSE;
314 item_edit->popup_item = NULL;
315 item_edit->popup_get_height = NULL;
316 item_edit->popup_autosize = NULL;
317 item_edit->popup_set_focus = NULL;
318 item_edit->popup_post_show = NULL;
319 item_edit->popup_user_data = NULL;
320 item_edit->popup_returned_height = 0;
321 item_edit->popup_height_signal_id = 0;
322 item_edit->popup_allocation_height = -1;
324 item_edit->style = NULL;
325 item_edit->button_width = MIN_BUTT_WIDTH;
327 gnc_virtual_location_init (&item_edit->virt_loc);
333 GnucashSheet *sheet = item_edit->sheet;
337 cursor = GNUCASH_CURSOR(sheet->cursor);
339 item_edit->virt_loc.vcell_loc.virt_row = cursor->row;
340 item_edit->virt_loc.vcell_loc.virt_col = cursor->col;
342 item_edit->style = gnucash_sheet_get_style (sheet,
343 item_edit->virt_loc.vcell_loc);
345 item_edit->virt_loc.phys_row_offset = cursor->cell.row;
346 item_edit->virt_loc.phys_col_offset = cursor->cell.col;
348 switch (gnc_table_get_align (sheet->table, item_edit->virt_loc))
351 case CELL_ALIGN_LEFT:
355 case CELL_ALIGN_RIGHT:
359 case CELL_ALIGN_CENTER:
363 gtk_entry_set_alignment (GTK_ENTRY(item_edit->editor), xalign);
365 if (!gnc_table_is_popup (sheet->table, item_edit->virt_loc))
366 gnc_item_edit_set_popup (item_edit, NULL, NULL, NULL,
367 NULL, NULL, NULL, NULL);
369 g_idle_add_full (G_PRIORITY_HIGH_IDLE,
370 (GSourceFunc)gnc_item_edit_update, item_edit, NULL);
375gnc_item_edit_cut_clipboard (
GncItemEdit *item_edit)
377 gtk_editable_cut_clipboard (GTK_EDITABLE(item_edit->editor));
381gnc_item_edit_copy_clipboard (
GncItemEdit *item_edit)
383 gtk_editable_copy_clipboard (GTK_EDITABLE(item_edit->editor));
387gnc_item_edit_paste_clipboard (
GncItemEdit *item_edit)
389 GtkClipboard *clipboard = gtk_widget_get_clipboard (GTK_WIDGET(item_edit->editor),
390 GDK_SELECTION_CLIPBOARD);
391 gchar *text = gtk_clipboard_wait_for_text (clipboard);
392 gchar *filtered_text;
393 gint start_pos, end_pos;
407 position = gtk_editable_get_position (GTK_EDITABLE(item_edit->editor));
409 if (gtk_editable_get_selection_bounds (GTK_EDITABLE(item_edit->editor),
410 &start_pos, &end_pos))
412 position = start_pos;
414 gtk_editable_delete_selection (GTK_EDITABLE(item_edit->editor));
415 gtk_editable_insert_text (GTK_EDITABLE(item_edit->editor),
416 filtered_text, -1, &position);
419 gtk_editable_insert_text (GTK_EDITABLE(item_edit->editor),
420 filtered_text, -1, &position);
422 gtk_editable_set_position (GTK_EDITABLE(item_edit->editor), position);
425 g_free (filtered_text);
430key_press_popup_cb (GtkWidget *widget, GdkEventKey *event, gpointer data)
434 g_signal_stop_emission_by_name (widget,
"key_press_event");
436 gtk_widget_event (GTK_WIDGET(item_edit->sheet), (GdkEvent *) event);
443gnc_item_edit_popup_toggled (GtkToggleButton *button, gpointer data)
448 show_popup = gtk_toggle_button_get_active (button);
452 VirtualLocation virt_loc;
454 table = item_edit->sheet->table;
455 virt_loc =
table->current_cursor_loc;
457 if (!gnc_table_confirm_change (
table, virt_loc))
459 g_signal_handlers_block_matched
460 (button, G_SIGNAL_MATCH_DATA,
461 0, 0, NULL, NULL, data);
463 gtk_toggle_button_set_active (button, FALSE);
465 g_signal_handlers_unblock_matched
466 (button, G_SIGNAL_MATCH_DATA,
467 0, 0, NULL, NULL, data);
473 item_edit->show_popup = show_popup;
475 if (!item_edit->show_popup)
476 gnc_item_edit_hide_popup (item_edit);
478 gnc_item_edit_configure (item_edit);
487 if (!item_edit->popup_toggle.signals_connected)
490 obj = G_OBJECT(item_edit->popup_toggle.tbutton);
492 g_signal_handlers_block_matched (obj, G_SIGNAL_MATCH_DATA,
493 0, 0, NULL, NULL, item_edit);
502 if (!item_edit->popup_toggle.signals_connected)
505 obj = G_OBJECT(item_edit->popup_toggle.tbutton);
507 g_signal_handlers_unblock_matched (obj, G_SIGNAL_MATCH_DATA,
508 0, 0, NULL, NULL, item_edit);
513draw_background_cb (GtkWidget *widget, cairo_t *cr, gpointer user_data)
515 GtkStyleContext *stylectxt = gtk_widget_get_style_context (widget);
517 gint width = gtk_widget_get_allocated_width (widget);
518 gint height = gtk_widget_get_allocated_height (widget);
521 gtk_style_context_save (stylectxt);
524 color_type = gnc_table_get_color (item_edit->sheet->table, item_edit->virt_loc, NULL);
527 gtk_render_background (stylectxt, cr, 0, 1, width, height - 2);
529 gtk_style_context_restore (stylectxt);
539preedit_changed_cb (GtkEntry* entry, gchar *preedit,
GncItemEdit* item_edit)
541 item_edit->preedit_length = g_utf8_strlen (preedit, -1);
542 DEBUG(
"%s %lu", preedit, item_edit->preedit_length);
547draw_text_cursor_cb (GtkWidget *widget, cairo_t *cr, gpointer user_data)
550 GtkEditable *editable = GTK_EDITABLE(widget);
551 GtkStyleContext *stylectxt = gtk_widget_get_style_context (GTK_WIDGET(widget));
552 GtkStateFlags flags = gtk_widget_get_state_flags (GTK_WIDGET(widget));
553 gint height = gtk_widget_get_allocated_height (widget);
554 PangoLayout *layout = gtk_entry_get_layout (GTK_ENTRY(widget));
555 const char *pango_text = pango_layout_get_text (layout);
562 gtk_entry_get_layout_offsets (GTK_ENTRY(widget), &x_offset, NULL);
565 gdk_rgba_parse (&color,
"black");
566 gtk_style_context_get_color (stylectxt, flags, &color);
570 if (pango_text && *pango_text)
572 PangoRectangle strong_pos;
573 glong text_len = g_utf8_strlen (pango_text, -1);
575 gtk_editable_get_position (editable) + item_edit->preedit_length;
576 gint cursor_byte_pos = cursor_pos < text_len ?
577 g_utf8_offset_to_pointer (pango_text, cursor_pos) - pango_text :
579 DEBUG(
"Cursor: %d, byte offset %d, text byte len %zu", cursor_pos,
580 cursor_byte_pos, strlen (pango_text));
581 pango_layout_get_cursor_pos (layout, cursor_byte_pos,
583 cursor_x = x_offset + PANGO_PIXELS (strong_pos.x);
587 DEBUG(
"No text, cursor at %d.", x_offset);
591 cairo_set_source_rgb (cr, fg_color->red, fg_color->green, fg_color->blue);
592 cairo_set_line_width (cr, 1.0);
594 cairo_move_to (cr, cursor_x + 0.5,
595 gnc_item_edit_get_margin (item_edit, top) +
596 gnc_item_edit_get_padding_border (item_edit, top));
597 cairo_rel_line_to (cr, 0,
598 height - gnc_item_edit_get_margin (item_edit, top_bottom)
599 - gnc_item_edit_get_padding_border (item_edit,
609draw_arrow_cb (GtkWidget *widget, cairo_t *cr, gpointer data)
612 GtkStyleContext *context = gtk_widget_get_style_context (widget);
613 gint width = gtk_widget_get_allocated_width (widget);
614 gint height = gtk_widget_get_allocated_height (widget);
618 gtk_render_background (context, cr, 2, 2, width - 4, height - 4);
620 gtk_style_context_add_class (context, GTK_STYLE_CLASS_ARROW);
622 size = MIN(width / 2, height / 2);
624 if (item_edit->popup_toggle.arrow_down == 0)
625 gtk_render_arrow (context, cr, 0,
626 (width - size)/2, (height - size)/2, size);
628 gtk_render_arrow (context, cr, G_PI,
629 (width - size)/2, (height - size)/2, size);
636connect_popup_toggle_signals (
GncItemEdit *item_edit)
640 g_return_if_fail (GNC_IS_ITEM_EDIT(item_edit));
642 if (item_edit->popup_toggle.signals_connected)
645 object = G_OBJECT(item_edit->popup_toggle.tbutton);
647 g_signal_connect (
object,
"toggled",
648 G_CALLBACK(gnc_item_edit_popup_toggled),
651 g_signal_connect (
object,
"key_press_event",
652 G_CALLBACK(key_press_popup_cb),
655 g_signal_connect_after (
object,
"draw",
656 G_CALLBACK(draw_arrow_cb),
659 item_edit->popup_toggle.signals_connected = TRUE;
664disconnect_popup_toggle_signals (
GncItemEdit *item_edit)
666 g_return_if_fail (GNC_IS_ITEM_EDIT(item_edit));
668 if (!item_edit->popup_toggle.signals_connected)
671 g_signal_handlers_disconnect_matched (item_edit->popup_toggle.tbutton,
672 G_SIGNAL_MATCH_DATA, 0, 0, NULL, NULL, item_edit);
674 item_edit->popup_toggle.signals_connected = FALSE;
684gnc_item_edit_get_property (GObject *
object,
694 g_value_take_object (value, item_edit->sheet);
697 G_OBJECT_WARN_INVALID_PROPERTY_ID(
object, param_id, pspec);
703gnc_item_edit_set_property (GObject *
object,
712 item_edit->sheet = GNUCASH_SHEET(g_value_get_object (value));
715 G_OBJECT_WARN_INVALID_PROPERTY_ID(
object, param_id, pspec);
721gnc_item_edit_get_preferred_width (GtkWidget *widget,
726 gnc_item_edit_get_pixel_coords (GNC_ITEM_EDIT(widget), &x, &y, &w, &h);
727 *minimal_width = *natural_width = w - 1;
732gnc_item_edit_get_preferred_height (GtkWidget *widget,
737 gnc_item_edit_get_pixel_coords (GNC_ITEM_EDIT(widget), &x, &y, &w, &h);
738 *minimal_width = *natural_width = h - 1;
747 GObjectClass *object_class;
748 GtkWidgetClass *widget_class;
750 gtk_widget_class_set_css_name (GTK_WIDGET_CLASS(gnc_item_edit_class),
"gnc-id-cursor");
752 object_class = G_OBJECT_CLASS(gnc_item_edit_class);
753 widget_class = GTK_WIDGET_CLASS(gnc_item_edit_class);
755 object_class->get_property = gnc_item_edit_get_property;
756 object_class->set_property = gnc_item_edit_set_property;
758 g_object_class_install_property (object_class,
760 g_param_spec_object (
"sheet",
767 widget_class->get_preferred_width = gnc_item_edit_get_preferred_width;
768 widget_class->get_preferred_height = gnc_item_edit_get_preferred_height;
772gnc_item_edit_get_margin (
GncItemEdit *item_edit, Sides side)
777 return item_edit->margin.left;
779 return item_edit->margin.right;
781 return item_edit->margin.top;
783 return item_edit->margin.bottom;
785 return item_edit->margin.left + item_edit->margin.right;
787 return item_edit->margin.top + item_edit->margin.bottom;
794gnc_item_edit_get_padding_border (
GncItemEdit *item_edit, Sides side)
799 return item_edit->padding.left + item_edit->border.left;
801 return item_edit->padding.right + item_edit->border.right;
803 return item_edit->padding.top + item_edit->border.top;
805 return item_edit->padding.bottom + item_edit->border.bottom;
807 return item_edit->padding.left + item_edit->border.left +
808 item_edit->padding.right + item_edit->border.right;
810 return item_edit->padding.top + item_edit->border.top +
811 item_edit->padding.bottom + item_edit->border.bottom;
818gnc_item_edit_get_button_width (
GncItemEdit *item_edit)
822 if (gtk_widget_is_visible (GTK_WIDGET(item_edit->popup_toggle.tbutton)))
823 return item_edit->button_width;
826 GtkStyleContext *context = gtk_widget_get_style_context (
827 GTK_WIDGET(item_edit->popup_toggle.tbutton));
830 gtk_style_context_get_border (context, GTK_STATE_FLAG_NORMAL, &border);
831 return MIN_BUTT_WIDTH + border.left + border.right;
834 return MIN_BUTT_WIDTH + 2;
838button_press_cb (GtkWidget *widget, GdkEventButton *event, gpointer *pointer)
841 GnucashSheet *sheet = item_edit->sheet;
844 if (event->button == 3 && event->type == GDK_BUTTON_PRESS)
846 if (!item_edit->show_popup)
851 g_signal_emit_by_name (sheet->reg,
"show_popup_menu");
856 if (!gtk_widget_has_focus (GTK_WIDGET(sheet)))
857 gtk_widget_grab_focus (GTK_WIDGET(sheet));
863gnc_item_edit_new (GnucashSheet *sheet)
865 GtkStyleContext *stylectxt;
869 GncItemEdit *item_edit = g_object_new (GNC_TYPE_ITEM_EDIT,
872 "homogeneous", FALSE,
874 gtk_layout_put (GTK_LAYOUT(sheet), GTK_WIDGET(item_edit), 0, 0);
877 item_edit->editor = gtk_entry_new ();
878 sheet->entry = item_edit->editor;
879 gtk_entry_set_width_chars (GTK_ENTRY(item_edit->editor), 1);
880 gtk_box_pack_start (GTK_BOX(item_edit), item_edit->editor, TRUE, TRUE, 0);
883 stylectxt = gtk_widget_get_style_context (GTK_WIDGET(item_edit->editor));
884 gtk_style_context_add_class (stylectxt,
"gnc-class-register-foreground");
885 gtk_style_context_get_padding (stylectxt, GTK_STATE_FLAG_NORMAL, &padding);
886 gtk_style_context_get_margin (stylectxt, GTK_STATE_FLAG_NORMAL, &margin);
887 gtk_style_context_get_border (stylectxt, GTK_STATE_FLAG_NORMAL, &border);
889 item_edit->padding = padding;
890 item_edit->margin = margin;
891 item_edit->border = border;
894 gtk_widget_set_can_focus (GTK_WIDGET(item_edit->editor), FALSE);
895 gtk_entry_set_has_frame (GTK_ENTRY(item_edit->editor), FALSE);
898 g_signal_connect_after (item_edit->editor,
"draw",
899 G_CALLBACK(draw_text_cursor_cb), item_edit);
901 g_signal_connect (item_edit->editor,
"preedit-changed",
902 G_CALLBACK(preedit_changed_cb), item_edit);
905 g_signal_connect (item_edit,
"draw",
906 G_CALLBACK(draw_background_cb), item_edit);
910 g_signal_connect (item_edit->editor,
"button-press-event",
911 G_CALLBACK(button_press_cb), item_edit);
916 item_edit->popup_toggle.tbutton = gnc_item_edit_tb_new (sheet);
917 gtk_toggle_button_set_mode (GTK_TOGGLE_BUTTON(item_edit->popup_toggle.tbutton), FALSE);
921 item_edit->popup_toggle.ebox = gtk_event_box_new ();
922 g_object_ref (item_edit->popup_toggle.ebox);
923 gtk_container_add (GTK_CONTAINER(item_edit->popup_toggle.ebox),
924 item_edit->popup_toggle.tbutton);
928 g_signal_connect (item_edit->popup_toggle.ebox,
"button-press-event",
929 G_CALLBACK(tb_button_press_cb), NULL);
931 gtk_box_pack_start (GTK_BOX(item_edit), item_edit->popup_toggle.ebox, FALSE, FALSE, 0);
932 gtk_widget_show_all (GTK_WIDGET(item_edit));
933 g_signal_connect (G_OBJECT(item_edit),
"destroy",
934 G_CALLBACK(gnc_item_edit_destroying), NULL);
935 return GTK_WIDGET(item_edit);
939gnc_item_edit_destroying (GtkWidget *item_edit, gpointer data)
941 if (GNC_ITEM_EDIT(item_edit)->popup_height_signal_id > 0)
942 g_signal_handler_disconnect (GNC_ITEM_EDIT(item_edit)->popup_item,
943 GNC_ITEM_EDIT(item_edit)->popup_height_signal_id);
945 while (g_idle_remove_by_data ((gpointer)item_edit))
950check_popup_height_is_true (GtkWidget *widget,
951 GdkRectangle *allocation,
958 if (allocation->height != item_edit->popup_returned_height)
960 item_edit->popup_allocation_height = allocation->height;
961 gtk_container_remove (GTK_CONTAINER(item_edit->sheet), item_edit->popup_item);
963 g_idle_add_full (G_PRIORITY_HIGH_IDLE,
964 (GSourceFunc)gnc_item_edit_update, item_edit, NULL);
971 GtkToggleButton *toggle;
972 GtkAdjustment *vadj, *hadj;
975 gint x = 0, y = 0, w = 0, h = 0;
976 gint y_offset, x_offset;
977 gint popup_x, popup_y;
978 gint popup_w = -1, popup_h = -1;
979 gint popup_max_width, popup_max_height;
981 gint down_height, up_height;
984 g_return_if_fail (item_edit != NULL);
985 g_return_if_fail (GNC_IS_ITEM_EDIT(item_edit));
987 if (!item_edit->is_popup)
990 sheet = item_edit->sheet;
992 sheet_width = sheet->width;
994 gtk_widget_get_allocation (GTK_WIDGET(sheet), &alloc);
995 view_height = alloc.height;
997 vadj = gtk_scrollable_get_vadjustment (GTK_SCROLLABLE(sheet));
998 hadj = gtk_scrollable_get_hadjustment (GTK_SCROLLABLE(sheet));
1000 y_offset = gtk_adjustment_get_value (vadj);
1001 x_offset = gtk_adjustment_get_value (hadj);
1002 gnc_item_edit_get_pixel_coords (item_edit, &x, &y, &w, &h);
1006 up_height = y - y_offset;
1007 down_height = view_height - (up_height + h);
1009 popup_max_height = MAX(up_height, down_height);
1010 popup_max_width = sheet_width - popup_x + x_offset;
1012 if (item_edit->popup_get_height)
1013 popup_h = item_edit->popup_get_height
1014 (item_edit->popup_item, popup_max_height, h,
1015 item_edit->popup_user_data);
1017 if (item_edit->popup_autosize)
1019 item_edit->popup_autosize (item_edit->popup_item,
1021 item_edit->popup_user_data);
1026 if (up_height > down_height)
1027 popup_y = y - popup_h - 1;
1031 if (!gtk_widget_get_parent (item_edit->popup_item))
1032 gtk_layout_put (GTK_LAYOUT(sheet), item_edit->popup_item, popup_x, popup_y);
1035 item_edit->popup_returned_height = popup_h;
1037 gtk_widget_get_allocation (GTK_WIDGET(item_edit), &alloc);
1040 if ((popup_w != 0) && (popup_w < alloc.width))
1041 popup_w = alloc.width;
1043 if (popup_h == popup_max_height)
1044 gtk_widget_set_size_request (item_edit->popup_item, popup_w - 1, popup_h);
1046 gtk_widget_set_size_request (item_edit->popup_item, popup_w - 1, -1);
1048 toggle = GTK_TOGGLE_BUTTON(item_edit->popup_toggle.tbutton);
1050 if (!gtk_toggle_button_get_active (toggle))
1052 block_toggle_signals (item_edit);
1053 gtk_toggle_button_set_active (toggle, TRUE);
1054 unblock_toggle_signals (item_edit);
1058 item_edit->popup_toggle.arrow_down = FALSE;
1059 item_edit->show_popup = TRUE;
1061 if (item_edit->popup_set_focus)
1062 item_edit->popup_set_focus (item_edit->popup_item,
1063 item_edit->popup_user_data);
1065 if (item_edit->popup_post_show)
1066 item_edit->popup_post_show (item_edit->popup_item,
1067 item_edit->popup_user_data);
1069 if (item_edit->popup_get_width)
1073 popup_width = item_edit->popup_get_width
1074 (item_edit->popup_item,
1075 item_edit->popup_user_data);
1077 if (popup_width > popup_w)
1078 popup_width = popup_w;
1080 if (popup_width > popup_max_width)
1082 popup_x -= popup_width - popup_max_width;
1083 popup_x = MAX(0, popup_x);
1088 gtk_layout_move (GTK_LAYOUT(sheet), item_edit->popup_item, popup_x, popup_y);
1096 g_return_if_fail (item_edit != NULL);
1097 g_return_if_fail (GNC_IS_ITEM_EDIT(item_edit));
1099 if (!item_edit->is_popup)
1102 if (gtk_widget_get_parent (GTK_WIDGET(item_edit->popup_item)) != GTK_WIDGET(item_edit->sheet))
1105 gtk_container_remove (GTK_CONTAINER(item_edit->sheet), item_edit->popup_item);
1108 item_edit->popup_toggle.arrow_down = TRUE;
1110 gtk_toggle_button_set_active
1111 (GTK_TOGGLE_BUTTON(item_edit->popup_toggle.tbutton), FALSE);
1113 item_edit->popup_allocation_height = -1;
1115 gtk_widget_grab_focus (GTK_WIDGET(item_edit->sheet));
1121 GtkWidget *popup_item,
1122 PopupGetHeight popup_get_height,
1123 PopupAutosize popup_autosize,
1124 PopupSetFocus popup_set_focus,
1125 PopupPostShow popup_post_show,
1126 PopupGetWidth popup_get_width,
1127 gpointer popup_user_data)
1129 g_return_if_fail (GNC_IS_ITEM_EDIT(item_edit));
1131 if (item_edit->is_popup)
1132 gnc_item_edit_hide_popup (item_edit);
1138 item_edit->popup_height_signal_id = g_signal_connect_after (
1139 popup_item,
"size-allocate",
1140 G_CALLBACK(check_popup_height_is_true),
1145 if (GNC_ITEM_EDIT(item_edit)->popup_height_signal_id > 0)
1147 g_signal_handler_disconnect (item_edit->popup_item, item_edit->popup_height_signal_id);
1148 item_edit->popup_height_signal_id = 0;
1152 item_edit->is_popup = popup_item != NULL;
1154 item_edit->popup_item = popup_item;
1155 item_edit->popup_get_height = popup_get_height;
1156 item_edit->popup_autosize = popup_autosize;
1157 item_edit->popup_set_focus = popup_set_focus;
1158 item_edit->popup_post_show = popup_post_show;
1159 item_edit->popup_get_width = popup_get_width;
1160 item_edit->popup_user_data = popup_user_data;
1162 if (item_edit->is_popup)
1163 connect_popup_toggle_signals (item_edit);
1166 disconnect_popup_toggle_signals (item_edit);
1168 gnc_item_edit_hide_popup (item_edit);
1169 gtk_widget_hide (item_edit->popup_toggle.ebox);
1174gnc_item_edit_get_has_selection (
GncItemEdit *item_edit)
1176 GtkEditable *editable;
1178 g_return_val_if_fail ((item_edit != NULL), FALSE);
1179 g_return_val_if_fail (GNC_IS_ITEM_EDIT(item_edit), FALSE);
1181 editable = GTK_EDITABLE(item_edit->editor);
1182 return gtk_editable_get_selection_bounds (editable, NULL, NULL);
utility functions for the GnuCash UI
Convenience wrapper around GdkRGBA for use in Register Gnome classes.
Public declarations for GnucashCursor class.
Public declarations for GncItemEdit class.
Private declarations for GnucashSheet class.
Public declarations of GnucashRegister class.
Styling functions for RegisterGnome.
void gnucash_get_style_classes(GnucashSheet *sheet, GtkStyleContext *stylectxt, RegisterColor field_type, gboolean use_neg_class)
Map a cell color type to a css style class.
char * gnc_filter_text_for_control_chars(const char *text)
Returns the incoming text removed of control characters.
#define DEBUG(format, args...)
Print a debugging message.
gint origin_y
x origin of block