void gnucash_register_goto_next_virt_row (GnucashRegister *reg) { GnucashSheet *sheet; VirtualLocation virt_loc; int start_virt_row; g_return_if_fail (reg != NULL); g_return_if_fail (GNUCASH_IS_REGISTER(reg)); sheet = GNUCASH_SHEET(reg->sheet); gnucash_cursor_get_virt (GNUCASH_CURSOR(sheet->cursor), &virt_loc); /* Move down one physical row at a time until we * reach the next visible virtual cell. */ start_virt_row = virt_loc.vcell_loc.virt_row; do { if (!gnc_table_move_vertical_position (sheet->table, &virt_loc, 1)) return; } while (start_virt_row == virt_loc.vcell_loc.virt_row); if (virt_loc.vcell_loc.virt_row >= sheet->num_virt_rows) return; virt_loc.phys_row_offset = 0; virt_loc.phys_col_offset = 0; gnucash_sheet_goto_virt_loc (sheet, virt_loc); }
GnucashCursor * gnucash_cursor_new (GnucashSheet *sheet) { return GNUCASH_CURSOR( g_object_new (gnucash_cursor_get_type(), "sheet", sheet, NULL)); }
static void gnucash_cursor_realize (GnomeCanvasItem *item) { GnucashCursor *cursor = GNUCASH_CURSOR (item); GdkWindow *window; if (GNOME_CANVAS_ITEM_CLASS (gnucash_cursor_parent_class)->realize) (*GNOME_CANVAS_ITEM_CLASS (gnucash_cursor_parent_class)->realize)(item); window = GTK_WIDGET (item->canvas)->window; cursor->gc = gdk_gc_new (window); }
static void gnucash_cursor_unrealize (GnomeCanvasItem *item) { GnucashCursor *cursor = GNUCASH_CURSOR (item); if (cursor->gc != NULL) { g_object_unref (cursor->gc); cursor->gc = NULL; } if (GNOME_CANVAS_ITEM_CLASS (gnucash_cursor_parent_class)->unrealize) (*GNOME_CANVAS_ITEM_CLASS (gnucash_cursor_parent_class)->unrealize)(item); }
static void gnc_header_resize_column (GncHeader *header, gint col, gint width) { GnucashSheet *sheet = header->sheet; gnucash_sheet_set_col_width (sheet, col, width); gnucash_cursor_configure (GNUCASH_CURSOR(sheet->cursor)); gnc_item_edit_configure (GNC_ITEM_EDIT(sheet->item_editor)); gnc_header_reconfigure (header); gnucash_sheet_set_scroll_region (sheet); gnucash_sheet_update_adjustments (sheet); gnc_header_request_redraw (header); gnucash_sheet_redraw_all (sheet); }
static void gnucash_item_cursor_draw (GnomeCanvasItem *item, GdkDrawable *drawable, int x, int y, int width, int height) { GnucashItemCursor *item_cursor = GNUCASH_ITEM_CURSOR (item); GnucashCursor *cursor = GNUCASH_CURSOR(item->parent); gint dx, dy, dw, dh; switch (item_cursor->type) { case GNUCASH_CURSOR_BLOCK: dx = item_cursor->x - x; dy = item_cursor->y - y; dw = item_cursor->w; dh = item_cursor->h; /* draw the rectangle around the entire active virtual row */ gdk_gc_set_line_attributes (cursor->gc, 1, GDK_LINE_SOLID, GDK_CAP_NOT_LAST, GDK_JOIN_MITER); gdk_gc_set_foreground (cursor->gc, &gn_black); gdk_draw_rectangle (drawable, cursor->gc, FALSE, dx, dy, dw, dh - 1); gdk_draw_line (drawable, cursor->gc, dx, dy + dh, dx + dw, dy + dh); break; case GNUCASH_CURSOR_CELL: dx = item_cursor->x - x; dy = item_cursor->y - y; dw = item_cursor->w; dh = item_cursor->h; gdk_gc_set_line_attributes (cursor->gc, 1, GDK_LINE_SOLID, GDK_CAP_NOT_LAST, GDK_JOIN_MITER); gdk_gc_set_foreground (cursor->gc, &gn_black); gdk_draw_rectangle (drawable, cursor->gc, FALSE, dx, dy, dw, dh); break; } }
/* Note that g_value_set_object() refs the object, as does * g_object_get(). But g_object_get() only unrefs once when it disgorges * the object, leaving an unbalanced ref, which leaks. So instead of * using g_value_set_object(), use g_value_take_object() which doesn't * ref the object when used in get_property(). */ static void gnucash_cursor_get_property (GObject *object, guint prop_id, GValue *value, GParamSpec *pspec) { GnucashCursor *cursor = GNUCASH_CURSOR (object); switch (prop_id) { case PROP_SHEET: g_value_take_object (value, cursor->sheet); break; default: break; } }
void gnc_item_edit_configure (GncItemEdit *item_edit) { GnucashSheet *sheet = item_edit->sheet; GnucashCursor *cursor; gfloat xalign; cursor = GNUCASH_CURSOR(sheet->cursor); item_edit->virt_loc.vcell_loc.virt_row = cursor->row; item_edit->virt_loc.vcell_loc.virt_col = cursor->col; item_edit->style = gnucash_sheet_get_style (sheet, item_edit->virt_loc.vcell_loc); item_edit->virt_loc.phys_row_offset = cursor->cell.row; item_edit->virt_loc.phys_col_offset = cursor->cell.col; switch (gnc_table_get_align (sheet->table, item_edit->virt_loc)) { default: case CELL_ALIGN_LEFT: xalign = 0; break; case CELL_ALIGN_RIGHT: xalign = 1; break; case CELL_ALIGN_CENTER: xalign = 0.5; break; } gtk_entry_set_alignment(GTK_ENTRY(item_edit->editor), xalign); if (!gnc_table_is_popup (sheet->table, item_edit->virt_loc)) gnc_item_edit_set_popup (item_edit, NULL, NULL, NULL, NULL, NULL, NULL, NULL); g_idle_add_full (G_PRIORITY_HIGH_IDLE, (GSourceFunc) gnc_item_edit_update, item_edit, NULL); }
void gnucash_register_goto_next_matching_row (GnucashRegister *reg, VirtualLocationMatchFunc match, gpointer user_data) { GnucashSheet *sheet; SheetBlockStyle *style; VirtualLocation virt_loc; g_return_if_fail (reg != NULL); g_return_if_fail (GNUCASH_IS_REGISTER(reg)); g_return_if_fail (match != NULL); sheet = GNUCASH_SHEET (reg->sheet); gnucash_cursor_get_virt (GNUCASH_CURSOR(sheet->cursor), &virt_loc); do { if (!gnc_table_move_vertical_position (sheet->table, &virt_loc, 1)) return; if (virt_loc.vcell_loc.virt_row >= sheet->num_virt_rows) return; style = gnucash_sheet_get_style (sheet, virt_loc.vcell_loc); if (!style || !style->cursor) return; } while (!match (virt_loc, user_data)); virt_loc.phys_row_offset = 0; virt_loc.phys_col_offset = 0; gnucash_sheet_goto_virt_loc (sheet, virt_loc); }
GnomeCanvasItem * gnucash_cursor_new (GnomeCanvasGroup *parent) { GnomeCanvasItem *item; GnomeCanvasItem *cursor_item; GnucashCursor *cursor; GnucashItemCursor *item_cursor; g_return_val_if_fail (parent != NULL, NULL); g_return_val_if_fail (GNOME_IS_CANVAS_GROUP(parent), NULL); item = gnome_canvas_item_new (parent, gnucash_cursor_get_type(), NULL); cursor = GNUCASH_CURSOR(item); cursor_item = gnome_canvas_item_new (GNOME_CANVAS_GROUP(item), gnucash_item_cursor_get_type(), NULL); item_cursor = GNUCASH_ITEM_CURSOR (cursor_item); item_cursor->type = GNUCASH_CURSOR_CELL; cursor->cursor[GNUCASH_CURSOR_CELL] = cursor_item; cursor_item = gnome_canvas_item_new (GNOME_CANVAS_GROUP(item), gnucash_item_cursor_get_type(), NULL); item_cursor = GNUCASH_ITEM_CURSOR (cursor_item); item_cursor->type = GNUCASH_CURSOR_BLOCK; cursor->cursor[GNUCASH_CURSOR_BLOCK] = cursor_item; return item; }
static void gnucash_cursor_set_property (GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec) { GnucashCursor *cursor; cursor = GNUCASH_CURSOR (object); switch (prop_id) { case PROP_SHEET: cursor->sheet = GNUCASH_SHEET (g_value_get_object (value)); break; case PROP_GRID: cursor->grid = GNUCASH_GRID (g_value_get_object (value)); break; default: break; } }