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