1 #ifndef _GNM_SHEET_OBJECT_H_
2 # define _GNM_SHEET_OBJECT_H_
3 
4 #include <gnumeric.h>
5 #include <gsf/gsf-output.h>
6 #include <goffice/goffice.h>
7 
8 G_BEGIN_DECLS
9 
10 /***********************************************************/
11 
12 typedef enum {
13 	GNM_SO_RESIZE_MANUAL,   /* can be manually resized */
14 	GNM_SO_RESIZE_AUTO, /* automatically resized like cell bounded widgets */
15 	GNM_SO_RESIZE_NONE /* can't be resized like some sheet components */
16 } GnmSOResizeMode;
17 
18 typedef enum {
19 	GNM_SO_ANCHOR_TWO_CELLS,	/* move and size (if sizeable) with cells) */
20 	GNM_SO_ANCHOR_ONE_CELL,		/* move with cells */
21 	GNM_SO_ANCHOR_ABSOLUTE		/* anchored to the sheet */
22 } GnmSOAnchorMode;
23 GType gnm_sheet_object_anchor_mode_get_type (void);
24 #define GNM_SHEET_OBJECT_ANCHOR_MODE_TYPE (gnm_sheet_object_anchor_mode_get_type ())
25 
26 struct _SheetObjectAnchor {
27 	GODrawingAnchor	base;
28 
29 	GnmRange cell_bound; /* cellpos containing corners */
30 	double	 offset[4];  /* offsets from the top left (in LTR of cell_bound) */
31 	GnmSOAnchorMode mode;
32 };
33 GType sheet_object_anchor_get_type (void); /* Boxed type */
34 
35 #define GNM_SO_TYPE     (sheet_object_get_type ())
36 #define GNM_SO(obj)     (G_TYPE_CHECK_INSTANCE_CAST((obj), GNM_SO_TYPE, SheetObject))
37 #define GNM_IS_SO(o)    (G_TYPE_CHECK_INSTANCE_TYPE((o), GNM_SO_TYPE))
38 GType sheet_object_get_type (void);
39 
40 #define GNM_SO_IMAGEABLE_TYPE  (sheet_object_imageable_get_type ())
41 #define GNM_SO_IMAGEABLE(o)     (G_TYPE_CHECK_INSTANCE_CAST ((o), GNM_SO_IMAGEABLE_TYPE, SheetObjectImageableIface))
42 #define GNM_IS_SO_IMAGEABLE(o)  (G_TYPE_CHECK_INSTANCE_TYPE ((o), GNM_SO_IMAGEABLE_TYPE))
43 
44 GType sheet_object_imageable_get_type (void);
45 
46 #define GNM_SO_EXPORTABLE_TYPE  (sheet_object_exportable_get_type ())
47 #define GNM_SO_EXPORTABLE(o)     (G_TYPE_CHECK_INSTANCE_CAST ((o), GNM_SO_EXPORTABLE_TYPE, SheetObjectExportableIface))
48 #define GNM_IS_SO_EXPORTABLE(o)  (G_TYPE_CHECK_INSTANCE_TYPE ((o), GNM_SO_EXPORTABLE_TYPE))
49 
50 GType sheet_object_exportable_get_type (void);
51 
52 void          sheet_object_set_sheet	 (SheetObject *so, Sheet *sheet);
53 Sheet	     *sheet_object_get_sheet	 (SheetObject const *so);
54 void	      sheet_object_clear_sheet	 (SheetObject *so);
55 
56 void          sheet_object_set_name      (SheetObject *so, const char *name);
57 void          sheet_object_set_print_flag (SheetObject *so, gboolean *print);
58 gboolean      sheet_object_get_print_flag (SheetObject *so);
59 
60 SheetObject  *sheet_object_dup		 (SheetObject const *so);
61 gboolean      sheet_object_can_print	 (SheetObject const *so);
62 gboolean      sheet_object_can_resize	 (SheetObject const *so);
63 gboolean      sheet_object_can_edit	 (SheetObject const *so);
64 
65 void	     sheet_object_get_editor	 (SheetObject *so, SheetControl *sc);
66 void	     sheet_object_populate_menu  (SheetObject *so, GPtrArray *actions);
67 GtkWidget *  sheet_object_build_menu     (SheetObjectView *view,
68 					  GPtrArray const *actions,
69 					  unsigned *i);
70 void	     sheet_object_update_bounds  (SheetObject *so, GnmCellPos const *p);
71 void	     sheet_object_default_size	 (SheetObject *so, double *w, double *h);
72 gint	     sheet_object_adjust_stacking(SheetObject *so, gint positions);
73 gint         sheet_object_get_stacking   (SheetObject *so);
74 SheetObjectView *sheet_object_new_view	 (SheetObject *so,
75 					  SheetObjectViewContainer *container);
76 SheetObjectView	*sheet_object_get_view	 (SheetObject const *so,
77 					  SheetObjectViewContainer *container);
78 GnmRange const	*sheet_object_get_range	 (SheetObject const *so);
79 void		 sheet_object_set_anchor (SheetObject *so,
80 					  SheetObjectAnchor const *anchor);
81 
82 SheetObjectAnchor const *sheet_object_get_anchor (SheetObject const *so);
83 void sheet_object_position_pts_get (SheetObject const *so, double *coords);
84 
85 void sheet_object_invalidate_sheet       (SheetObject *so,
86 					  Sheet const *sheet);
87 
88 typedef void (*SheetObjectForeachDepFunc) (GnmDependent *dep,
89 					   SheetObject *so,
90 					   gpointer user);
91 void sheet_object_foreach_dep            (SheetObject *so,
92 					  SheetObjectForeachDepFunc func,
93 					  gpointer user);
94 
95 
96 /* Object Management */
97 void	sheet_objects_relocate   (GnmExprRelocateInfo const *rinfo,
98 				  gboolean update, GOUndo **pundo);
99 void    sheet_objects_clear      (Sheet const *sheet, GnmRange const *r,
100 				  GType t, GOUndo **pundo);
101 GOUndo *sheet_object_move_undo   (GSList *objects, gboolean objects_created);
102 GOUndo *sheet_object_move_do     (GSList *objects, GSList *anchors,
103 				  gboolean objects_created);
104 GSList *sheet_objects_get        (Sheet const *sheet, GnmRange const *r,
105 				  GType t);
106 void    sheet_objects_dup	 (Sheet const *src, Sheet *dst, GnmRange *range);
107 
108 void     sheet_object_direction_set (SheetObject *so, gdouble const *coords);
109 gboolean sheet_object_rubber_band_directly (SheetObject const *so);
110 void	 sheet_object_set_anchor_mode (SheetObject *so, GnmSOAnchorMode const *mode);
111 
112 /* Anchor utilities */
113 void sheet_object_anchor_to_pts	(SheetObjectAnchor const *anchor,
114 				 Sheet const *sheet, double *res_pts);
115 void sheet_object_anchor_to_offset_pts	(SheetObjectAnchor const *anchor,
116 					 Sheet const *sheet, double *res_pts);
117 void sheet_object_anchor_init	(SheetObjectAnchor *anchor,
118 				 GnmRange const *r,
119 				 const double *offsets,
120 				 GODrawingAnchorDir direction,
121 				 GnmSOAnchorMode mode);
122 void sheet_object_pts_to_anchor (SheetObjectAnchor *anchor,
123 			     Sheet const *sheet, double const *res_pts);
124 SheetObjectAnchor *
125      sheet_object_anchor_dup	(SheetObjectAnchor const *src);
126 
127 /* Image rendering */
128 GtkTargetList *sheet_object_get_target_list (SheetObject const *so);
129 void sheet_object_write_image	(SheetObject const *so,
130 				 char const *format,
131 				 double resolution,
132 				 GsfOutput *output,
133 				 GError **err);
134 void sheet_object_save_as_image	(SheetObject const *so,
135 				 char const *format,
136 				 double resolution,
137 				 const char *url,
138 				 GError **err);
139 
140 /* Object export */
141 GtkTargetList *sheet_object_exportable_get_target_list (SheetObject const *so);
142 void sheet_object_write_object	(SheetObject const *so,
143 				 char const *format,
144 				 GsfOutput *output, GError **err,
145 				 GnmConventions const *convs);
146 
147 /* cairo rendering */
148 void sheet_object_draw_cairo (SheetObject const *so, cairo_t *cr, gboolean rtl);
149 void sheet_object_draw_cairo_sized (SheetObject const *so, cairo_t *cr, double width, double height);
150 
151 /* management routine to register all the builtin object types */
152 void sheet_objects_init (void);
153 void sheet_objects_shutdown (void);
154 G_END_DECLS
155 
156 #endif /* _GNM_SHEET_OBJECT_H_ */
157