1 
2 
3 /* gtkplotcanvas - gtkplot canvas widget for gtk+
4  * Copyright 1999-2001  Adrian E. Feiguin <feiguin@ifir.edu.ar>
5  *
6  * This library is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU Library General Public
8  * License as published by the Free Software Foundation; either
9  * version 2 of the License, or (at your option) any later version.
10  *
11  * This library is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14  * Library General Public License for more details.
15  *
16  * You should have received a copy of the GNU Library General Public
17  * License along with this library; if not, write to the
18  * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
19  * Boston, MA 02111-1307, USA.
20  */
21 
22 #ifndef __GTK_PLOT_CANVAS_H__
23 #define __GTK_PLOT_CANVAS_H__
24 
25 
26 #include <gdk/gdk.h>
27 #include "gtkplot.h"
28 #include "gtkplotpc.h"
29 
30 #ifdef __cplusplus
31 extern "C" {
32 #endif /* __cplusplus */
33 
34 /* canvas flags */
35 enum
36 {
37       GTK_PLOT_CANVAS_CAN_SELECT	=	1 << 0, /* Select region */
38       GTK_PLOT_CANVAS_CAN_SELECT_ITEM	=	1 << 1, /* Select item */
39       GTK_PLOT_CANVAS_CAN_DND		=	1 << 2, /* DnD item */
40 };
41 
42 
43 /* canvas actions */
44 typedef enum
45 {
46       GTK_PLOT_CANVAS_ACTION_INACTIVE,
47       GTK_PLOT_CANVAS_ACTION_SELECTION,
48       GTK_PLOT_CANVAS_ACTION_DRAG,
49       GTK_PLOT_CANVAS_ACTION_RESIZE,
50 } GtkPlotCanvasAction;
51 
52 typedef enum
53 {
54       GTK_PLOT_CANVAS_FROZEN            = 0,
55       GTK_PLOT_CANVAS_CAN_MOVE          = 1 << 0,
56       GTK_PLOT_CANVAS_CAN_RESIZE	= 1 << 1,
57 } GtkPlotCanvasFlag;
58 
59 typedef enum
60 {
61       GTK_PLOT_CANVAS_SELECT_NONE,
62       GTK_PLOT_CANVAS_SELECT_MARKERS,
63       GTK_PLOT_CANVAS_SELECT_TARGET,
64 } GtkPlotCanvasSelection;
65 
66 typedef enum
67 {
68       GTK_PLOT_CANVAS_SELECT_CLICK_1,
69       GTK_PLOT_CANVAS_SELECT_CLICK_2,
70 } GtkPlotCanvasSelectionMode;
71 
72 typedef enum
73 {
74       GTK_PLOT_CANVAS_OUT,
75       GTK_PLOT_CANVAS_IN,
76       GTK_PLOT_CANVAS_LEFT,
77       GTK_PLOT_CANVAS_RIGHT,
78       GTK_PLOT_CANVAS_TOP,
79       GTK_PLOT_CANVAS_BOTTOM,
80       GTK_PLOT_CANVAS_TOP_LEFT,
81       GTK_PLOT_CANVAS_TOP_RIGHT,
82       GTK_PLOT_CANVAS_BOTTOM_LEFT,
83       GTK_PLOT_CANVAS_BOTTOM_RIGHT,
84 } GtkPlotCanvasPos;
85 
86 #define GTK_PLOT_CANVAS_DND_FLAGS      (GTK_PLOT_CANVAS_CAN_SELECT_ITEM |  \
87                                         GTK_PLOT_CANVAS_CAN_DND )
88 
89 #define GTK_PLOT_CANVAS(obj)        GTK_CHECK_CAST (obj, gtk_plot_canvas_get_type (), GtkPlotCanvas)
90 #define GTK_PLOT_CANVAS_CLASS(klass) GTK_CHECK_CLASS_CAST (klass, gtk_plot_canvas_get_type(), GtkPlotCanvasClass)
91 #define GTK_IS_PLOT_CANVAS(obj)     GTK_CHECK_TYPE (obj, gtk_plot_canvas_get_type ())
92 #define GTK_TYPE_PLOT_CANVAS (gtk_plot_canvas_get_type ())
93 
94 #define GTK_PLOT_CANVAS_FLAGS(canvas)	  (GTK_PLOT_CANVAS(canvas)->flags)
95 #define GTK_PLOT_CANVAS_SET_FLAGS(canvas, flags)  (GTK_PLOT_CANVAS_FLAGS(canvas) |= (flags))
96 #define GTK_PLOT_CANVAS_UNSET_FLAGS(canvas, flags)  (GTK_PLOT_CANVAS_FLAGS(canvas) &= ~(flags))
97 #define GTK_PLOT_CANVAS_CAN_DND_POINT(canvas)  (GTK_PLOT_CANVAS_FLAGS(canvas) & GTK_PLOT_CANVAS_CAN_DND_POINT)
98 #define GTK_PLOT_CANVAS_CAN_DND(canvas)  (GTK_PLOT_CANVAS_FLAGS(canvas) & GTK_PLOT_CANVAS_CAN_DND)
99 #define GTK_PLOT_CANVAS_CAN_SELECT_POINT(canvas)  (GTK_PLOT_CANVAS_FLAGS(canvas) & GTK_PLOT_CANVAS_CAN_SELECT_POINT)
100 #define GTK_PLOT_CANVAS_CAN_SELECT_ITEM(canvas)  (GTK_PLOT_CANVAS_FLAGS(canvas) & GTK_PLOT_CANVAS_CAN_SELECT_ITEM)
101 #define GTK_PLOT_CANVAS_CAN_SELECT(canvas)  (GTK_PLOT_CANVAS_FLAGS(canvas) & GTK_PLOT_CANVAS_CAN_SELECT)
102 
103 #define GTK_PLOT_CANVAS_CHILD(obj)        GTK_CHECK_CAST (obj, gtk_plot_canvas_child_get_type (), GtkPlotCanvasChild)
104 #define GTK_PLOT_CANVAS_CHILD_CLASS(klass) GTK_CHECK_CLASS_CAST (klass, gtk_plot_canvas_child_get_type(), GtkPlotCanvasChildClass)
105 #define GTK_IS_PLOT_CANVAS_CHILD(obj)     GTK_CHECK_TYPE (obj, gtk_plot_canvas_child_get_type ())
106 #define GTK_TYPE_PLOT_CANVAS_CHILD (gtk_plot_canvas_child_get_type ())
107 
108 
109 typedef struct _GtkPlotCanvas	GtkPlotCanvas;
110 typedef struct _GtkPlotCanvasClass	GtkPlotCanvasClass;
111 typedef struct _GtkPlotCanvasChild	GtkPlotCanvasChild;
112 typedef struct _GtkPlotCanvasChildClass	GtkPlotCanvasChildClass;
113 
114 struct _GtkPlotCanvasChild
115 {
116   GtkObject object;
117 
118   GtkPlotCanvas *parent;
119 
120   gdouble rx1, rx2, ry1, ry2;
121   gint min_width, min_height;
122 
123   GtkAllocation allocation;
124   GtkAllocation drag_area;
125 
126   guint state;
127 
128   GtkPlotCanvasFlag flags;
129   GtkPlotCanvasSelection selection;
130   GtkPlotCanvasSelectionMode mode;
131 };
132 
133 struct _GtkPlotCanvasChildClass
134 {
135   GtkObjectClass parent_class;
136 
137   void (*draw) (GtkPlotCanvas *canvas, GtkPlotCanvasChild *child);
138   void (*draw_selection) (GtkPlotCanvas *canvas, GtkPlotCanvasChild *child, GtkAllocation allocation);
139   void (*size_allocate) (GtkPlotCanvas *canvas, GtkPlotCanvasChild *child);
140   void (*move) (GtkPlotCanvas *canvas, GtkPlotCanvasChild *child,
141 	        gdouble x, gdouble y);
142   void (*move_resize) (GtkPlotCanvas *canvas, GtkPlotCanvasChild *child,
143 	          gdouble x1, gdouble y1, gdouble x2, gdouble y2);
144   GtkPlotCanvasPos (*button_press) 	(GtkPlotCanvas *canvas,
145 					 GtkPlotCanvasChild *child,
146 					 gint x, gint y);
147   void (*button_release) 		(GtkPlotCanvas *canvas,
148 					 GtkPlotCanvasChild *child);
149   void (*unselect) (GtkPlotCanvas *canvas, GtkPlotCanvasChild *child);
150   void (*set_magnification) (GtkPlotCanvas *canvas, GtkPlotCanvasChild *child, gdouble m);
151 };
152 
153 struct _GtkPlotCanvas
154 {
155   GtkFixed fixed;
156 
157   guint16 flags;
158   guint state;
159 
160   guint freeze_count;
161 
162   gint pixmap_width, pixmap_height;
163   gint width, height;
164 
165   gdouble magnification;
166 
167   gboolean show_grid;
168   gdouble grid_step;
169   GtkPlotLine grid;
170 
171   GtkPlotCanvasAction action;
172 
173   GdkPixmap *pixmap;
174 
175   GdkColor background;
176   gboolean transparent;
177 
178   gdouble active_x, active_y;
179 
180   GtkPlotCanvasChild *active_item;
181 
182   GtkPlotCanvasPos drag_point;
183   gint drag_x, drag_y;
184   gint pointer_x, pointer_y;
185   GtkAllocation drag_area;
186 
187   GList *childs;
188 
189   GdkCursor *cursor;
190   GtkPlotPC *pc;
191 };
192 
193 struct _GtkPlotCanvasClass
194 {
195   GtkLayoutClass parent_class;
196 
197   gboolean (*select_item)	(GtkPlotCanvas *canvas,
198 				 GdkEventButton *event,
199                                  GtkPlotCanvasChild *item);
200 
201   gboolean (*move_item)		(GtkPlotCanvas *canvas,
202                                  GtkPlotCanvasChild *item,
203 				 gdouble new_x, gdouble new_y);
204 
205   gboolean (*resize_item)	(GtkPlotCanvas *canvas,
206                                  GtkPlotCanvasChild *item,
207 				 gdouble new_width, gdouble new_height);
208 
209   void (*add_item)		(GtkPlotCanvas *canvas,
210                                  GtkPlotCanvasChild *item);
211 
212   gboolean (*delete_item)	(GtkPlotCanvas *canvas,
213                                  GtkPlotCanvasChild *item);
214 
215   void (*select_region)		(GtkPlotCanvas *canvas,
216 				 gdouble xmin, gdouble ymin,
217 				 gdouble xmax, gdouble ymax);
218 
219   void (*changed)		(GtkPlotCanvas *canvas);
220 };
221 
222 
223 GtkType		gtk_plot_canvas_get_type	(void);
224 GtkType		gtk_plot_canvas_child_get_type	(void);
225 GtkWidget*	gtk_plot_canvas_new		(gint width, gint height,
226                                                  gdouble magnification);
227 void		gtk_plot_canvas_construct       (GtkPlotCanvas *canvas,
228 						 gint width, gint height,
229                                                  gdouble magnification);
230 void		gtk_plot_canvas_set_pc          (GtkPlotCanvas *canvas,
231 						 GtkPlotPC *pc);
232 void		gtk_plot_canvas_paint           (GtkPlotCanvas *canvas);
233 void		gtk_plot_canvas_refresh         (GtkPlotCanvas *canvas);
234 void 		gtk_plot_canvas_freeze		(GtkPlotCanvas *canvas);
235 void 		gtk_plot_canvas_thaw		(GtkPlotCanvas *canvas);
236 void		gtk_plot_canvas_grid_set_visible(GtkPlotCanvas *canvas,
237 						 gboolean visible);
238 void		gtk_plot_canvas_grid_set_step	(GtkPlotCanvas *canvas,
239 						 gdouble step);
240 void		gtk_plot_canvas_grid_set_attributes(GtkPlotCanvas *canvas,
241                          			 GtkPlotLineStyle style,
242                          			 gint width,
243                          			 const GdkColor *color);
244 void		gtk_plot_canvas_cancel_action	(GtkPlotCanvas *plot_canvas);
245 void		gtk_plot_canvas_unselect	(GtkPlotCanvas *plot_canvas);
246 
247 GtkPlotCanvasChild *
248 		gtk_plot_canvas_get_active_item (GtkPlotCanvas *canvas);
249 void            gtk_plot_canvas_set_size        (GtkPlotCanvas *canvas,
250                                                  gint width, gint height);
251 void            gtk_plot_canvas_set_magnification (GtkPlotCanvas *canvas,
252                                                  gdouble magnification);
253 void 		gtk_plot_canvas_set_transparent (GtkPlotCanvas *canvas,
254 						 gboolean transparent);
255 gboolean 	gtk_plot_canvas_transparent 	(GtkPlotCanvas *canvas);
256 void		gtk_plot_canvas_set_background  (GtkPlotCanvas *canvas,
257 						 const GdkColor *background);
258 void            gtk_plot_canvas_get_pixel       (GtkPlotCanvas *plot_canvas,
259                                                  gdouble px, gdouble py,
260                                                  gint *x, gint *y);
261 void            gtk_plot_canvas_get_position    (GtkPlotCanvas *plot_canvas,
262                                                  gint x, gint y,
263                                                  gdouble *px, gdouble *py);
264 void 		gtk_plot_canvas_put_child	(GtkPlotCanvas *canvas,
265                           			 GtkPlotCanvasChild *child,
266                           			 gdouble x1, gdouble y1,
267                           			 gdouble x2, gdouble y2);
268 void 		gtk_plot_canvas_remove_child	(GtkPlotCanvas *canvas,
269                           			 GtkPlotCanvasChild *child);
270 void 		gtk_plot_canvas_child_move	(GtkPlotCanvas *canvas,
271                           			 GtkPlotCanvasChild *child,
272                           			 gdouble x1, gdouble y1);
273 void 		gtk_plot_canvas_child_move_resize
274 						(GtkPlotCanvas *canvas,
275                                  		 GtkPlotCanvasChild *child,
276                                  		 gdouble x1, gdouble y1,
277                                   		 gdouble x2, gdouble y2);
278 
279 void 		gtk_plot_canvas_child_set_selection
280 						(GtkPlotCanvasChild *child,
281 						 GtkPlotCanvasSelection selection);
282 void 		gtk_plot_canvas_child_set_selection_mode
283 						(GtkPlotCanvasChild *child,
284 						 GtkPlotCanvasSelectionMode mode);
285 
286 gboolean	gtk_plot_canvas_child_get_position
287 					       	(GtkPlotCanvas *canvas,
288 						 GtkPlotCanvasChild *child,
289 						 double *x1, double *y1,
290 						 double *x2, double *y2);
291 void 		gtk_plot_canvas_set_line_attributes
292 						(GtkPlotCanvas *canvas,
293 						 GtkPlotLine line);
294 
295 #ifdef __cplusplus
296 }
297 #endif /* __cplusplus */
298 
299 
300 #endif /* __GTK_PLOT_CANVAS_H__ */
301