32 #include <libgnomecanvas/libgnomecanvas.h>
34 #include "gnucash-color.h"
35 #include "gnucash-cursor.h"
36 #include "gnucash-grid.h"
37 #include "gnucash-sheet.h"
38 #include "gnucash-sheetP.h"
39 #include "gnucash-style.h"
41 static GnomeCanvasItem *gnucash_cursor_parent_class;
42 static GnomeCanvasItem *gnucash_item_cursor_parent_class;
66 GNUCASH_ITEM_CURSOR(cursor->cursor[GNUCASH_CURSOR_BLOCK]);
68 vcell_loc.virt_row = item_cursor->row;
69 vcell_loc.virt_col = item_cursor->col;
71 block = gnucash_sheet_get_block (sheet, vcell_loc);
75 vcell = gnc_table_get_virtual_cell (sheet->table, vcell_loc);
79 for (col = 0; col < vcell->cellblock->num_cols; col++)
83 cell = gnc_cellblock_get_cell (vcell->cellblock, 0, col);
84 if (cell && cell->cell_name)
90 cd = gnucash_style_get_cell_dimensions (block->style, 0, col);
96 for (col = vcell->cellblock->num_cols - 1; col >= 0; col--)
100 cell = gnc_cellblock_get_cell (vcell->cellblock, 0, col);
101 if (cell && cell->cell_name)
105 *h = block->style->dimensions->height;
107 cd = gnucash_style_get_cell_dimensions (block->style, 0, col);
109 *w = cd->origin_x + cd->pixel_width - *x;
111 *w = block->style->dimensions->width - *x;
118 GnomeCanvas *canvas = GNOME_CANVAS_ITEM(cursor)->canvas;
126 gnome_canvas_request_redraw (canvas, x, y, x + w + 1, y + h + 1);
133 g_return_if_fail (cursor != NULL);
134 g_return_if_fail (GNUCASH_IS_CURSOR(cursor));
136 cursor->style = style;
143 g_return_if_fail (cursor != NULL);
144 g_return_if_fail (GNUCASH_IS_CURSOR (cursor));
146 virt_loc->vcell_loc.virt_row =
147 GNUCASH_ITEM_CURSOR(cursor->cursor[GNUCASH_CURSOR_BLOCK])->row;
148 virt_loc->vcell_loc.virt_col =
149 GNUCASH_ITEM_CURSOR(cursor->cursor[GNUCASH_CURSOR_BLOCK])->col;
151 virt_loc->phys_row_offset =
152 GNUCASH_ITEM_CURSOR(cursor->cursor[GNUCASH_CURSOR_CELL])->row;
153 virt_loc->phys_col_offset =
154 GNUCASH_ITEM_CURSOR(cursor->cursor[GNUCASH_CURSOR_CELL])->col;
161 GnomeCanvasItem *item;
168 g_return_if_fail (cursor != NULL);
169 g_return_if_fail (GNUCASH_IS_CURSOR (cursor));
171 canvas = GNOME_CANVAS(GNOME_CANVAS_ITEM(cursor)->canvas);
173 item = GNOME_CANVAS_ITEM (cursor);
175 gnucash_cursor_get_pixel_coords (cursor, &x, &y, &w, &h);
176 gnome_canvas_item_set (GNOME_CANVAS_ITEM(cursor),
177 "GnomeCanvasGroup::x", (
double)x,
178 "GnomeCanvasGroup::y", (
double)y,
184 item->x1 = cursor->x = x;
185 item->y1 = cursor->y = y;
187 item->y2 = y + h + 1;
189 item = cursor->cursor[GNUCASH_CURSOR_BLOCK];
190 block_cursor = GNUCASH_ITEM_CURSOR (item);
195 gnome_canvas_item_i2w (item, &wx, &wy);
196 gnome_canvas_w2c (canvas, wx, wy, &block_cursor->x, &block_cursor->y);
198 block_cursor->h = h + 1;
200 item->x1 = block_cursor->x;
201 item->y1 = block_cursor->y;
202 item->x2 = block_cursor->x + w;
203 item->y2 = block_cursor->y + h + 1;
205 item = cursor->cursor[GNUCASH_CURSOR_CELL];
206 cell_cursor = GNUCASH_ITEM_CURSOR(item);
208 gnucash_sheet_style_get_cell_pixel_rel_coords (cursor->style,
212 wx = x - block_cursor->x;
215 gnome_canvas_item_i2w (item, &wx, &wy);
216 gnome_canvas_w2c (canvas, wx, wy, &cell_cursor->x, &cell_cursor->y);
220 item->x1 = cell_cursor->x;
221 item->y1 = cell_cursor->y;
222 item->x2 = cell_cursor->x + w;
223 item->y2 = cell_cursor->y + h;
228 gnucash_item_cursor_draw (GnomeCanvasItem *item, GdkDrawable *drawable,
229 int x,
int y,
int width,
int height)
235 switch (item_cursor->type)
237 case GNUCASH_CURSOR_BLOCK:
238 dx = item_cursor->x - x;
239 dy = item_cursor->y - y;
245 gdk_gc_set_line_attributes (cursor->gc, 1,
246 GDK_LINE_SOLID, GDK_CAP_NOT_LAST, GDK_JOIN_MITER);
248 gdk_gc_set_foreground (cursor->gc, &gn_black);
250 gdk_draw_rectangle (drawable, cursor->gc, FALSE,
252 gdk_draw_line (drawable, cursor->gc,
253 dx, dy + dh, dx + dw, dy + dh);
257 case GNUCASH_CURSOR_CELL:
258 dx = item_cursor->x - x;
259 dy = item_cursor->y - y;
263 gdk_gc_set_line_attributes (cursor->gc, 1,
264 GDK_LINE_SOLID, GDK_CAP_NOT_LAST, GDK_JOIN_MITER);
266 gdk_gc_set_foreground (cursor->gc, &gn_black);
268 gdk_draw_rectangle (drawable, cursor->gc, FALSE,
281 g_return_if_fail (cursor != NULL);
282 g_return_if_fail (GNUCASH_IS_CURSOR (cursor));
284 sheet = cursor->sheet;
286 GNUCASH_ITEM_CURSOR(cursor->cursor[GNUCASH_CURSOR_BLOCK]);
288 if (vcell_loc.virt_row < 0 ||
289 vcell_loc.virt_row >= sheet->num_virt_rows ||
290 vcell_loc.virt_col < 0 ||
291 vcell_loc.virt_col >= sheet->num_virt_cols)
294 cursor->style = gnucash_sheet_get_style (sheet, vcell_loc);
296 item_cursor->row = vcell_loc.virt_row;
297 item_cursor->col = vcell_loc.virt_col;
302 gnucash_cursor_set_cell (
GnucashCursor *cursor, gint cell_row, gint cell_col)
307 g_return_if_fail (cursor != NULL);
308 g_return_if_fail (GNUCASH_IS_CURSOR (cursor));
310 item_cursor = GNUCASH_ITEM_CURSOR(cursor->cursor[GNUCASH_CURSOR_CELL]);
311 style = cursor->style;
313 if (cell_row < 0 || cell_row >= style->nrows ||
314 cell_col < 0 || cell_col >= style->ncols)
317 item_cursor->row = cell_row;
318 item_cursor->col = cell_col;
327 g_return_if_fail (cursor != NULL);
328 g_return_if_fail (GNUCASH_IS_CURSOR (cursor));
330 sheet = cursor->sheet;
332 gnucash_cursor_request_redraw (cursor);
334 gnucash_cursor_set_block (cursor, virt_loc.vcell_loc);
335 gnucash_cursor_set_cell (cursor,
336 virt_loc.phys_row_offset,
337 virt_loc.phys_col_offset);
339 gnucash_cursor_configure (cursor);
341 gnome_canvas_item_set (GNOME_CANVAS_ITEM(sheet->header_item),
343 cursor->style->cursor->cursor_name,
346 gnucash_cursor_request_redraw (cursor);
353 GnomeCanvasItem *item = GNOME_CANVAS_ITEM (cursor);
366 gnucash_cursor_realize (GnomeCanvasItem *item)
371 if (GNOME_CANVAS_ITEM_CLASS (gnucash_cursor_parent_class)->realize)
372 (*GNOME_CANVAS_ITEM_CLASS
373 (gnucash_cursor_parent_class)->realize)(item);
375 window = GTK_WIDGET (item->canvas)->window;
377 cursor->gc = gdk_gc_new (window);
382 gnucash_cursor_unrealize (GnomeCanvasItem *item)
386 if (cursor->gc != NULL)
388 g_object_unref (cursor->gc);
392 if (GNOME_CANVAS_ITEM_CLASS (gnucash_cursor_parent_class)->unrealize)
393 (*GNOME_CANVAS_ITEM_CLASS
394 (gnucash_cursor_parent_class)->unrealize)(item);
401 GnomeCanvasItemClass *item_class;
403 item_class = GNOME_CANVAS_ITEM_CLASS (klass);
405 gnucash_item_cursor_parent_class = g_type_class_peek_parent (klass);
408 item_class->draw = gnucash_item_cursor_draw;
413 gnucash_item_cursor_get_type (
void)
415 static GType gnucash_item_cursor_type = 0;
417 if (!gnucash_item_cursor_type)
419 static const GTypeInfo gnucash_item_cursor_info =
424 (GClassInitFunc) gnucash_item_cursor_class_init,
429 (GInstanceInitFunc) gnucash_item_cursor_init
432 gnucash_item_cursor_type =
433 g_type_register_static (gnome_canvas_item_get_type (),
435 &gnucash_item_cursor_info, 0);
438 return gnucash_item_cursor_type;
443 gnucash_cursor_set_property (GObject *
object,
450 cursor = GNUCASH_CURSOR (
object);
456 GNUCASH_SHEET (g_value_get_object (value));
460 GNUCASH_GRID (g_value_get_object (value));
475 gnucash_cursor_get_property (GObject *
object,
485 g_value_take_object (value, cursor->sheet);
488 g_value_take_object (value, cursor->grid);
499 GnomeCanvasItem *item = GNOME_CANVAS_ITEM (cursor);
511 GObjectClass *object_class;
512 GnomeCanvasItemClass *item_class;
514 object_class = G_OBJECT_CLASS (klass);
515 item_class = GNOME_CANVAS_ITEM_CLASS (klass);
517 gnucash_cursor_parent_class = g_type_class_peek_parent (klass);
520 object_class->set_property = gnucash_cursor_set_property;
521 object_class->get_property = gnucash_cursor_get_property;
524 item_class->realize = gnucash_cursor_realize;
525 item_class->unrealize = gnucash_cursor_unrealize;
528 g_object_class_install_property
531 g_param_spec_object (
"sheet",
536 g_object_class_install_property
539 g_param_spec_object (
"grid",
548 gnucash_cursor_get_type (
void)
550 static GType gnucash_cursor_type = 0;
552 if (!gnucash_cursor_type)
554 static const GTypeInfo gnucash_cursor_info =
559 (GClassInitFunc) gnucash_cursor_class_init,
564 (GInstanceInitFunc) gnucash_cursor_init
567 gnucash_cursor_type =
568 g_type_register_static (gnome_canvas_group_get_type (),
570 &gnucash_cursor_info, 0);
573 return gnucash_cursor_type;
578 gnucash_cursor_new (GnomeCanvasGroup *parent)
580 GnomeCanvasItem *item;
581 GnomeCanvasItem *cursor_item;
585 g_return_val_if_fail (parent != NULL, NULL);
586 g_return_val_if_fail (GNOME_IS_CANVAS_GROUP(parent), NULL);
588 item = gnome_canvas_item_new (parent,
589 gnucash_cursor_get_type(),
592 cursor = GNUCASH_CURSOR(item);
594 cursor_item = gnome_canvas_item_new (GNOME_CANVAS_GROUP(item),
595 gnucash_item_cursor_get_type(),
598 item_cursor = GNUCASH_ITEM_CURSOR (cursor_item);
599 item_cursor->type = GNUCASH_CURSOR_CELL;
601 cursor->cursor[GNUCASH_CURSOR_CELL] = cursor_item;
603 cursor_item = gnome_canvas_item_new (GNOME_CANVAS_GROUP(item),
604 gnucash_item_cursor_get_type(),
607 item_cursor = GNUCASH_ITEM_CURSOR (cursor_item);
608 item_cursor->type = GNUCASH_CURSOR_BLOCK;
610 cursor->cursor[GNUCASH_CURSOR_BLOCK] = cursor_item;