61 #define MIN_BUTT_WIDTH 20 // minimum size for a button excluding border 65 static void gnc_item_edit_destroying (GtkWidget *
this, gpointer data);
67 G_DEFINE_TYPE (
GncItemEdit, gnc_item_edit, GTK_TYPE_BOX)
69 G_DEFINE_TYPE (
GncItemEditTb, gnc_item_edit_tb, GTK_TYPE_TOGGLE_BUTTON)
74 item_edit_tb->sheet = NULL;
78 gnc_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);
97 gnc_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);
116 gnc_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;
138 gnc_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;
177 gnc_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);
191 tb_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)
207 gnc_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);
375 gnc_item_edit_cut_clipboard (
GncItemEdit *item_edit)
377 gtk_editable_cut_clipboard (GTK_EDITABLE(item_edit->editor));
381 gnc_item_edit_copy_clipboard (
GncItemEdit *item_edit)
383 gtk_editable_copy_clipboard (GTK_EDITABLE(item_edit->editor));
387 gnc_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);
430 key_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);
443 gnc_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);
513 draw_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);
539 preedit_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);
547 draw_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,
609 draw_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);
636 connect_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;
664 disconnect_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;
684 gnc_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);
703 gnc_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);
721 gnc_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;
732 gnc_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;
772 gnc_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;
794 gnc_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;
818 gnc_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;
838 button_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");
859 gnc_item_edit_new (GnucashSheet *sheet)
861 GtkStyleContext *stylectxt;
865 GncItemEdit *item_edit = g_object_new (GNC_TYPE_ITEM_EDIT,
868 "homogeneous", FALSE,
870 gtk_layout_put (GTK_LAYOUT(sheet), GTK_WIDGET(item_edit), 0, 0);
873 item_edit->editor = gtk_entry_new ();
874 sheet->entry = item_edit->editor;
875 gtk_entry_set_width_chars (GTK_ENTRY(item_edit->editor), 1);
876 gtk_box_pack_start (GTK_BOX(item_edit), item_edit->editor, TRUE, TRUE, 0);
879 stylectxt = gtk_widget_get_style_context (GTK_WIDGET(item_edit->editor));
880 gtk_style_context_add_class (stylectxt,
"gnc-class-register-foreground");
881 gtk_style_context_get_padding (stylectxt, GTK_STATE_FLAG_NORMAL, &padding);
882 gtk_style_context_get_margin (stylectxt, GTK_STATE_FLAG_NORMAL, &margin);
883 gtk_style_context_get_border (stylectxt, GTK_STATE_FLAG_NORMAL, &border);
885 item_edit->padding = padding;
886 item_edit->margin = margin;
887 item_edit->border = border;
890 gtk_widget_set_can_focus (GTK_WIDGET(item_edit->editor), FALSE);
891 gtk_entry_set_has_frame (GTK_ENTRY(item_edit->editor), FALSE);
894 g_signal_connect_after (item_edit->editor,
"draw",
895 G_CALLBACK(draw_text_cursor_cb), item_edit);
897 g_signal_connect (item_edit->editor,
"preedit-changed",
898 G_CALLBACK(preedit_changed_cb), item_edit);
901 g_signal_connect (item_edit,
"draw",
902 G_CALLBACK(draw_background_cb), item_edit);
906 g_signal_connect (item_edit->editor,
"button-press-event",
907 G_CALLBACK(button_press_cb), item_edit);
912 item_edit->popup_toggle.tbutton = gnc_item_edit_tb_new (sheet);
913 gtk_toggle_button_set_mode (GTK_TOGGLE_BUTTON(item_edit->popup_toggle.tbutton), FALSE);
917 item_edit->popup_toggle.ebox = gtk_event_box_new ();
918 g_object_ref (item_edit->popup_toggle.ebox);
919 gtk_container_add (GTK_CONTAINER(item_edit->popup_toggle.ebox),
920 item_edit->popup_toggle.tbutton);
924 g_signal_connect (item_edit->popup_toggle.ebox,
"button-press-event",
925 G_CALLBACK(tb_button_press_cb), NULL);
927 gtk_box_pack_start (GTK_BOX(item_edit), item_edit->popup_toggle.ebox, FALSE, FALSE, 0);
928 gtk_widget_show_all (GTK_WIDGET(item_edit));
929 g_signal_connect (G_OBJECT(item_edit),
"destroy",
930 G_CALLBACK(gnc_item_edit_destroying), NULL);
931 return GTK_WIDGET(item_edit);
935 gnc_item_edit_destroying (GtkWidget *item_edit, gpointer data)
937 if (GNC_ITEM_EDIT(item_edit)->popup_height_signal_id > 0)
938 g_signal_handler_disconnect (GNC_ITEM_EDIT(item_edit)->popup_item,
939 GNC_ITEM_EDIT(item_edit)->popup_height_signal_id);
941 while (g_idle_remove_by_data ((gpointer)item_edit))
946 check_popup_height_is_true (GtkWidget *widget,
947 GdkRectangle *allocation,
954 if (allocation->height != item_edit->popup_returned_height)
956 item_edit->popup_allocation_height = allocation->height;
957 gtk_container_remove (GTK_CONTAINER(item_edit->sheet), item_edit->popup_item);
959 g_idle_add_full (G_PRIORITY_HIGH_IDLE,
960 (GSourceFunc)gnc_item_edit_update, item_edit, NULL);
967 GtkToggleButton *toggle;
968 GtkAdjustment *vadj, *hadj;
971 gint x = 0, y = 0, w = 0, h = 0;
972 gint y_offset, x_offset;
973 gint popup_x, popup_y;
974 gint popup_w = -1, popup_h = -1;
975 gint popup_max_width, popup_max_height;
977 gint down_height, up_height;
980 g_return_if_fail (item_edit != NULL);
981 g_return_if_fail (GNC_IS_ITEM_EDIT(item_edit));
983 if (!item_edit->is_popup)
986 sheet = item_edit->sheet;
988 sheet_width = sheet->width;
990 gtk_widget_get_allocation (GTK_WIDGET(sheet), &alloc);
991 view_height = alloc.height;
993 vadj = gtk_scrollable_get_vadjustment (GTK_SCROLLABLE(sheet));
994 hadj = gtk_scrollable_get_hadjustment (GTK_SCROLLABLE(sheet));
996 y_offset = gtk_adjustment_get_value (vadj);
997 x_offset = gtk_adjustment_get_value (hadj);
998 gnc_item_edit_get_pixel_coords (item_edit, &x, &y, &w, &h);
1002 up_height = y - y_offset;
1003 down_height = view_height - (up_height + h);
1005 popup_max_height = MAX(up_height, down_height);
1006 popup_max_width = sheet_width - popup_x + x_offset;
1008 if (item_edit->popup_get_height)
1009 popup_h = item_edit->popup_get_height
1010 (item_edit->popup_item, popup_max_height, h,
1011 item_edit->popup_user_data);
1013 if (item_edit->popup_autosize)
1015 item_edit->popup_autosize (item_edit->popup_item,
1017 item_edit->popup_user_data);
1022 if (up_height > down_height)
1023 popup_y = y - popup_h - 1;
1027 if (!gtk_widget_get_parent (item_edit->popup_item))
1028 gtk_layout_put (GTK_LAYOUT(sheet), item_edit->popup_item, popup_x, popup_y);
1031 item_edit->popup_returned_height = popup_h;
1033 gtk_widget_get_allocation (GTK_WIDGET(item_edit), &alloc);
1036 if ((popup_w != 0) && (popup_w < alloc.width))
1037 popup_w = alloc.width;
1039 if (popup_h == popup_max_height)
1040 gtk_widget_set_size_request (item_edit->popup_item, popup_w - 1, popup_h);
1042 gtk_widget_set_size_request (item_edit->popup_item, popup_w - 1, -1);
1044 toggle = GTK_TOGGLE_BUTTON(item_edit->popup_toggle.tbutton);
1046 if (!gtk_toggle_button_get_active (toggle))
1048 block_toggle_signals (item_edit);
1049 gtk_toggle_button_set_active (toggle, TRUE);
1050 unblock_toggle_signals (item_edit);
1054 item_edit->popup_toggle.arrow_down = FALSE;
1055 item_edit->show_popup = TRUE;
1057 if (item_edit->popup_set_focus)
1058 item_edit->popup_set_focus (item_edit->popup_item,
1059 item_edit->popup_user_data);
1061 if (item_edit->popup_post_show)
1062 item_edit->popup_post_show (item_edit->popup_item,
1063 item_edit->popup_user_data);
1065 if (item_edit->popup_get_width)
1069 popup_width = item_edit->popup_get_width
1070 (item_edit->popup_item,
1071 item_edit->popup_user_data);
1073 if (popup_width > popup_w)
1074 popup_width = popup_w;
1076 if (popup_width > popup_max_width)
1078 popup_x -= popup_width - popup_max_width;
1079 popup_x = MAX(0, popup_x);
1084 gtk_layout_move (GTK_LAYOUT(sheet), item_edit->popup_item, popup_x, popup_y);
1092 g_return_if_fail (item_edit != NULL);
1093 g_return_if_fail (GNC_IS_ITEM_EDIT(item_edit));
1095 if (!item_edit->is_popup)
1098 if (gtk_widget_get_parent (GTK_WIDGET(item_edit->popup_item)) != GTK_WIDGET(item_edit->sheet))
1101 gtk_container_remove (GTK_CONTAINER(item_edit->sheet), item_edit->popup_item);
1104 item_edit->popup_toggle.arrow_down = TRUE;
1106 gtk_toggle_button_set_active
1107 (GTK_TOGGLE_BUTTON(item_edit->popup_toggle.tbutton), FALSE);
1109 item_edit->popup_allocation_height = -1;
1111 gtk_widget_grab_focus (GTK_WIDGET(item_edit->sheet));
1117 GtkWidget *popup_item,
1118 PopupGetHeight popup_get_height,
1119 PopupAutosize popup_autosize,
1120 PopupSetFocus popup_set_focus,
1121 PopupPostShow popup_post_show,
1122 PopupGetWidth popup_get_width,
1123 gpointer popup_user_data)
1125 g_return_if_fail (GNC_IS_ITEM_EDIT(item_edit));
1127 if (item_edit->is_popup)
1128 gnc_item_edit_hide_popup (item_edit);
1134 item_edit->popup_height_signal_id = g_signal_connect_after (
1135 popup_item,
"size-allocate",
1136 G_CALLBACK(check_popup_height_is_true),
1141 if (GNC_ITEM_EDIT(item_edit)->popup_height_signal_id > 0)
1143 g_signal_handler_disconnect (item_edit->popup_item, item_edit->popup_height_signal_id);
1144 item_edit->popup_height_signal_id = 0;
1148 item_edit->is_popup = popup_item != NULL;
1150 item_edit->popup_item = popup_item;
1151 item_edit->popup_get_height = popup_get_height;
1152 item_edit->popup_autosize = popup_autosize;
1153 item_edit->popup_set_focus = popup_set_focus;
1154 item_edit->popup_post_show = popup_post_show;
1155 item_edit->popup_get_width = popup_get_width;
1156 item_edit->popup_user_data = popup_user_data;
1158 if (item_edit->is_popup)
1159 connect_popup_toggle_signals (item_edit);
1162 disconnect_popup_toggle_signals (item_edit);
1164 gnc_item_edit_hide_popup (item_edit);
1165 gtk_widget_hide (item_edit->popup_toggle.ebox);
1170 gnc_item_edit_get_has_selection (
GncItemEdit *item_edit)
1172 GtkEditable *editable;
1174 g_return_val_if_fail ((item_edit != NULL), FALSE);
1175 g_return_val_if_fail (GNC_IS_ITEM_EDIT(item_edit), FALSE);
1177 editable = GTK_EDITABLE(item_edit->editor);
1178 return gtk_editable_get_selection_bounds (editable, NULL, NULL);
utility functions for the GnuCash UI
#define G_LOG_DOMAIN
Functions providing the SX List as a plugin page.
#define DEBUG(format, args...)
Print a debugging message.
Convenience wrapper around GdkRGBA for use in Register Gnome classes.
Public declarations for GnucashCursor class.
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.
Public declarations of GnucashRegister class.
Private declarations for GnucashSheet class.
char * gnc_filter_text_for_control_chars(const char *text)
Returns the incoming text removed of control characters.
Public declarations for GncItemEdit class.
Styling functions for RegisterGnome.
gint origin_y
x origin of block